blob: 2a4f2ed61b878ab40a0b145cbf42267c68866d6f [file] [log] [blame]
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001/*
yeshwanth sriram guntuka310b3ac2016-11-15 23:25:26 +05302 * Copyright (c) 2012-2017 The Linux Foundation. All rights reserved.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003 *
4 * Previously licensed under the ISC license by Qualcomm Atheros, Inc.
5 *
6 *
7 * Permission to use, copy, modify, and/or distribute this software for
8 * any purpose with or without fee is hereby granted, provided that the
9 * above copyright notice and this permission notice appear in all
10 * copies.
11 *
12 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
13 * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
14 * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
15 * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
16 * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
17 * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
18 * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
19 * PERFORMANCE OF THIS SOFTWARE.
20 */
21
22/*
23 * This file was originally distributed by Qualcomm Atheros, Inc.
24 * under proprietary terms before Copyright ownership was assigned
25 * to the Linux Foundation.
26 */
27
28/**=========================================================================
29
30 \file smeApi.c
31
32 \brief Definitions for SME APIs
33
34 ========================================================================*/
35
36/*--------------------------------------------------------------------------
37 Include Files
38 ------------------------------------------------------------------------*/
39
Srinivas Girigowda2c263352017-03-17 17:49:53 -070040#include <sir_common.h>
41#include <ani_global.h>
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080042#include "sme_api.h"
43#include "csr_inside_api.h"
44#include "sme_inside.h"
45#include "csr_internal.h"
46#include "wma_types.h"
47#include "wma_if.h"
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053048#include "qdf_trace.h"
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080049#include "sme_trace.h"
Anurag Chouhan6d760662016-02-20 16:05:43 +053050#include "qdf_types.h"
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053051#include "qdf_trace.h"
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080052#include "cds_utils.h"
53#include "sap_api.h"
54#include "mac_trace.h"
55#ifdef WLAN_FEATURE_NAN
56#include "nan_api.h"
57#endif
Naveen Rawat3b6068c2016-04-14 19:01:06 -070058#include "cds_regdomain.h"
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080059#include "cfg_api.h"
60#include "sme_power_save_api.h"
61#include "wma.h"
Naveen Rawatb4d37622015-11-13 16:15:25 -080062#include "sch_api.h"
Deepak Dhamdhere0f076bd2016-06-02 11:29:21 -070063#include "sme_nan_datapath.h"
Agrawal Ashish21ba2572016-09-03 16:40:10 +053064#include "csr_api.h"
Kiran Kumar Lokerea3de2262017-04-12 12:15:04 -070065#include "wlan_reg_services_api.h"
Abhishek Singh158fe252017-03-23 11:09:34 +053066#include <wlan_scan_ucfg_api.h>
Kiran Kumar Lokereb1d412e2017-04-23 17:19:43 -070067#include "wlan_reg_ucfg_api.h"
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080068
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080069static tSelfRecoveryStats g_self_recovery_stats;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080070
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053071static QDF_STATUS init_sme_cmd_list(tpAniSirGlobal pMac);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080072eCsrPhyMode sme_get_phy_mode(tHalHandle hHal);
73
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053074QDF_STATUS sme_handle_change_country_code(tpAniSirGlobal pMac, void *pMsgBuf);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080075
76void sme_disconnect_connected_sessions(tpAniSirGlobal pMac);
77
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053078QDF_STATUS sme_handle_generic_change_country_code(tpAniSirGlobal pMac,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080079 void *pMsgBuf);
80
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053081QDF_STATUS sme_process_nss_update_resp(tpAniSirGlobal mac, uint8_t *msg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080082
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080083#ifdef WLAN_FEATURE_11W
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053084QDF_STATUS sme_unprotected_mgmt_frm_ind(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080085 tpSirSmeUnprotMgmtFrameInd pSmeMgmtFrm);
86#endif
87
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080088/* Channel Change Response Indication Handler */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053089QDF_STATUS sme_process_channel_change_resp(tpAniSirGlobal pMac,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080090 uint16_t msg_type, void *pMsgBuf);
91
92/* Internal SME APIs */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053093QDF_STATUS sme_acquire_global_lock(tSmeStruct *psSme)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080094{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053095 QDF_STATUS status = QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080096
97 if (psSme) {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053098 if (QDF_IS_STATUS_SUCCESS
Anurag Chouhana37b5b72016-02-21 14:53:42 +053099 (qdf_mutex_acquire(&psSme->lkSmeGlobalLock))) {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530100 status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800101 }
102 }
103
104 return status;
105}
106
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530107QDF_STATUS sme_release_global_lock(tSmeStruct *psSme)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800108{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530109 QDF_STATUS status = QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800110
111 if (psSme) {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530112 if (QDF_IS_STATUS_SUCCESS
Anurag Chouhana37b5b72016-02-21 14:53:42 +0530113 (qdf_mutex_release(&psSme->lkSmeGlobalLock))) {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530114 status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800115 }
116 }
117
118 return status;
119}
120
Archana Ramachandran2eb7a612017-03-23 22:58:42 -0700121static tpAniSirGlobal sme_get_mac_context(void)
122{
123 tpAniSirGlobal mac_ctx;
124 tHalHandle h_hal;
125
126 h_hal = cds_get_context(QDF_MODULE_ID_SME);
127 if (NULL == h_hal) {
128 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_FATAL,
129 FL("invalid h_hal"));
130 return NULL;
131 }
132
133 mac_ctx = PMAC_STRUCT(h_hal);
134 if (NULL == mac_ctx) {
135 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
136 FL("Invalid MAC context"));
137 return NULL;
138 }
139
140 return mac_ctx;
141}
142
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800143/**
144 * sme_process_set_hw_mode_resp() - Process set HW mode response
145 * @mac: Global MAC pointer
146 * @msg: HW mode response
147 *
148 * Processes the HW mode response and invokes the HDD callback
149 * to process further
150 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530151static QDF_STATUS sme_process_set_hw_mode_resp(tpAniSirGlobal mac, uint8_t *msg)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800152{
Krunal Sonia8270f52017-02-23 19:51:25 -0800153 tListElem *entry;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800154 tSmeCmd *command = NULL;
155 bool found;
156 hw_mode_cb callback = NULL;
157 struct sir_set_hw_mode_resp *param;
Chandrasekaran, Manishekarce2172e2016-02-18 16:12:43 +0530158 enum sir_conn_update_reason reason;
Sandeep Puligillaa330c8c2017-03-09 18:03:21 -0800159 tCsrRoamSession *session;
160 uint32_t session_id;
161#ifndef NAPIER_SCAN
Chandrasekaran, Manishekaref70c0d2015-10-20 19:54:55 +0530162 tSmeCmd *saved_cmd;
Sandeep Puligillaa330c8c2017-03-09 18:03:21 -0800163#endif
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800164 param = (struct sir_set_hw_mode_resp *)msg;
165 if (!param) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -0700166 sme_err("HW mode resp param is NULL");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800167 /* Not returning. Need to check if active command list
168 * needs to be freed
169 */
170 }
171
Krunal Sonia8270f52017-02-23 19:51:25 -0800172 entry = csr_nonscan_active_ll_peek_head(mac, LL_ACCESS_LOCK);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800173 if (!entry) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -0700174 sme_err("No cmd found in active list");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530175 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800176 }
177
178 command = GET_BASE_ADDR(entry, tSmeCmd, Link);
179 if (!command) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -0700180 sme_err("Base address is NULL");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530181 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800182 }
183
184 if (e_sme_command_set_hw_mode != command->command) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -0700185 sme_err("Command mismatch!");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530186 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800187 }
188
189 callback = command->u.set_hw_mode_cmd.set_hw_mode_cb;
Chandrasekaran, Manishekaref70c0d2015-10-20 19:54:55 +0530190 reason = command->u.set_hw_mode_cmd.reason;
Sandeep Puligillaa330c8c2017-03-09 18:03:21 -0800191 session_id = command->u.set_hw_mode_cmd.session_id;
Chandrasekaran, Manishekarce2172e2016-02-18 16:12:43 +0530192
Srinivas Girigowda2da81e22017-03-16 21:22:19 -0700193 sme_debug("reason: %d session: %d",
Chandrasekaran, Manishekarce2172e2016-02-18 16:12:43 +0530194 command->u.set_hw_mode_cmd.reason,
195 command->u.set_hw_mode_cmd.session_id);
196
Chandrasekaran, Manishekar4dd215e2016-04-16 18:48:34 -0700197 if (!callback) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -0700198 sme_err("Callback does not exist");
Chandrasekaran, Manishekar4dd215e2016-04-16 18:48:34 -0700199 goto end;
200 }
201
202 if (!param) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -0700203 sme_err("Callback failed since HW mode params is NULL");
Chandrasekaran, Manishekar4dd215e2016-04-16 18:48:34 -0700204 goto end;
205 }
206
207 /* Irrespective of the reason for which the hw mode change request
208 * was issued, the policy manager connection table needs to be updated
209 * with the new vdev-mac id mapping, tx/rx spatial streams etc., if the
210 * set hw mode was successful.
211 */
212 callback(param->status,
213 param->cfgd_hw_mode_index,
214 param->num_vdev_mac_entries,
Tushnim Bhattacharyya0c4ad2d2017-03-09 15:59:03 -0800215 param->vdev_mac_map,
216 command->u.set_hw_mode_cmd.context);
Sandeep Puligillaa330c8c2017-03-09 18:03:21 -0800217 session = CSR_GET_SESSION(mac, session_id);
Chandrasekaran, Manishekar4dd215e2016-04-16 18:48:34 -0700218 if (reason == SIR_UPDATE_REASON_HIDDEN_STA) {
219 /* In the case of hidden SSID, connection update
220 * (set hw mode) is done after the scan with reason
221 * code eCsrScanForSsid completes. The connect/failure
222 * needs to be handled after the response of set hw
223 * mode
224 */
Sandeep Puligillaa330c8c2017-03-09 18:03:21 -0800225#ifndef NAPIER_SCAN
Chandrasekaran, Manishekar4dd215e2016-04-16 18:48:34 -0700226 saved_cmd = (tSmeCmd *)mac->sme.saved_scan_cmd;
227 if (!saved_cmd) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -0700228 sme_err("saved cmd is NULL, Check this");
Chandrasekaran, Manishekar4dd215e2016-04-16 18:48:34 -0700229 goto end;
230 }
231 if (param->status == SET_HW_MODE_STATUS_OK) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -0700232 sme_err("search for ssid success");
Chandrasekaran, Manishekar4dd215e2016-04-16 18:48:34 -0700233 csr_scan_handle_search_for_ssid(mac,
234 saved_cmd);
235 } else {
Srinivas Girigowda2c263352017-03-17 17:49:53 -0700236 sme_debug("search for ssid failure");
Chandrasekaran, Manishekar4dd215e2016-04-16 18:48:34 -0700237 csr_scan_handle_search_for_ssid_failure(mac,
238 saved_cmd);
239 }
240 if (saved_cmd->u.roamCmd.pRoamBssEntry)
241 qdf_mem_free(
242 saved_cmd->u.roamCmd.pRoamBssEntry);
243 if (saved_cmd->u.scanCmd.u.scanRequest.SSIDs.SSIDList)
244 qdf_mem_free(saved_cmd->u.scanCmd.u.
245 scanRequest.SSIDs.SSIDList);
Naveen Rawat20969542017-01-27 18:01:17 -0800246 if (saved_cmd->u.scanCmd.pToRoamProfile) {
247 csr_release_profile(mac, saved_cmd->
248 u.scanCmd.pToRoamProfile);
249 qdf_mem_free(saved_cmd->u.scanCmd.pToRoamProfile);
250 saved_cmd->u.scanCmd.pToRoamProfile = NULL;
251 }
Chandrasekaran, Manishekar4dd215e2016-04-16 18:48:34 -0700252 if (saved_cmd) {
253 qdf_mem_free(saved_cmd);
254 saved_cmd = NULL;
255 mac->sme.saved_scan_cmd = NULL;
256 }
Sandeep Puligillaa330c8c2017-03-09 18:03:21 -0800257#else
258 if (param->status == SET_HW_MODE_STATUS_OK) {
Srinivas Girigowda2c263352017-03-17 17:49:53 -0700259 sme_debug("search for ssid success");
Sandeep Puligillaa330c8c2017-03-09 18:03:21 -0800260 csr_scan_handle_search_for_ssid(mac,
261 session_id);
262 } else {
Srinivas Girigowda2c263352017-03-17 17:49:53 -0700263 sme_debug("search for ssid failure");
Sandeep Puligillaa330c8c2017-03-09 18:03:21 -0800264 csr_scan_handle_search_for_ssid_failure(mac,
265 session_id);
266 }
267 if (session->scan_info.roambssentry)
268 qdf_mem_free(session->scan_info.roambssentry);
269 if (session->scan_info.profile) {
270 csr_release_profile(mac, session->scan_info.profile);
271 qdf_mem_free(session->scan_info.profile);
272 session->scan_info.profile = NULL;
273 }
274#endif
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800275 }
276
Chandrasekaran, Manishekaref70c0d2015-10-20 19:54:55 +0530277end:
Krunal Soni72dba662017-02-15 20:13:17 -0800278 found = csr_nonscan_active_ll_remove_entry(mac, entry,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800279 LL_ACCESS_LOCK);
280 if (found) {
281 /* Now put this command back on the avilable command list */
Krunal Soni78618d92017-02-14 21:46:31 -0800282 csr_release_command(mac, command);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800283 }
Krunal Sonia8270f52017-02-23 19:51:25 -0800284
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530285 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800286}
287
288/**
289 * sme_process_hw_mode_trans_ind() - Process HW mode transition indication
290 * @mac: Global MAC pointer
291 * @msg: HW mode transition response
292 *
293 * Processes the HW mode transition indication and invoke the HDD callback
294 * to process further
295 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530296static QDF_STATUS sme_process_hw_mode_trans_ind(tpAniSirGlobal mac,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800297 uint8_t *msg)
298{
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800299 struct sir_hw_mode_trans_ind *param;
300
301 param = (struct sir_hw_mode_trans_ind *)msg;
302 if (!param) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -0700303 sme_err("HW mode trans ind param is NULL");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530304 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800305 }
306
Tushnim Bhattacharyya0c4ad2d2017-03-09 15:59:03 -0800307 policy_mgr_hw_mode_transition_cb(param->old_hw_mode_index,
Tushnim Bhattacharyya9e81b4c2017-02-15 17:11:14 -0800308 param->new_hw_mode_index,
309 param->num_vdev_mac_entries,
Tushnim Bhattacharyya0c4ad2d2017-03-09 15:59:03 -0800310 param->vdev_mac_map, mac->psoc);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800311
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530312 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800313}
314
Naveen Rawate7d86052015-11-13 12:01:43 -0800315/**
316 * free_sme_cmds() - This function frees memory allocated for SME commands
317 * @mac_ctx: Pointer to Global MAC structure
318 *
319 * This function frees memory allocated for SME commands
320 *
321 * @Return: void
322 */
323static void free_sme_cmds(tpAniSirGlobal mac_ctx)
324{
325 uint32_t idx;
326 if (NULL == mac_ctx->sme.pSmeCmdBufAddr)
327 return;
328
329 for (idx = 0; idx < mac_ctx->sme.totalSmeCmd; idx++)
Anurag Chouhan600c3a02016-03-01 10:33:54 +0530330 qdf_mem_free(mac_ctx->sme.pSmeCmdBufAddr[idx]);
Naveen Rawate7d86052015-11-13 12:01:43 -0800331
Anurag Chouhan600c3a02016-03-01 10:33:54 +0530332 qdf_mem_free(mac_ctx->sme.pSmeCmdBufAddr);
Naveen Rawate7d86052015-11-13 12:01:43 -0800333 mac_ctx->sme.pSmeCmdBufAddr = NULL;
334}
335
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530336static QDF_STATUS init_sme_cmd_list(tpAniSirGlobal pMac)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800337{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530338 QDF_STATUS status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800339 tSmeCmd *pCmd;
340 uint32_t cmd_idx;
Naveen Rawate7d86052015-11-13 12:01:43 -0800341 uint32_t sme_cmd_ptr_ary_sz;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800342
343 pMac->sme.totalSmeCmd = SME_TOTAL_COMMAND;
344
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800345
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800346 status = csr_ll_open(pMac->hHdd, &pMac->sme.smeCmdFreeList);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530347 if (!QDF_IS_STATUS_SUCCESS(status))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800348 goto end;
349
Naveen Rawate7d86052015-11-13 12:01:43 -0800350 /* following pointer contains array of pointers for tSmeCmd* */
351 sme_cmd_ptr_ary_sz = sizeof(void *) * pMac->sme.totalSmeCmd;
Anurag Chouhan600c3a02016-03-01 10:33:54 +0530352 pMac->sme.pSmeCmdBufAddr = qdf_mem_malloc(sme_cmd_ptr_ary_sz);
Naveen Rawate7d86052015-11-13 12:01:43 -0800353 if (NULL == pMac->sme.pSmeCmdBufAddr) {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530354 status = QDF_STATUS_E_NOMEM;
Naveen Rawate7d86052015-11-13 12:01:43 -0800355 goto end;
356 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800357
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530358 status = QDF_STATUS_SUCCESS;
Naveen Rawate7d86052015-11-13 12:01:43 -0800359 for (cmd_idx = 0; cmd_idx < pMac->sme.totalSmeCmd; cmd_idx++) {
360 /*
361 * Since total size of all commands together can be huge chunk
362 * of memory, allocate SME cmd individually. These SME CMDs are
363 * moved between pending and active queues. And these freeing of
364 * these queues just manipulates the list but does not actually
365 * frees SME CMD pointers. Hence store each SME CMD address in
366 * the array, sme.pSmeCmdBufAddr. This will later facilitate
367 * freeing up of all SME CMDs with just a for loop.
368 */
369 pMac->sme.pSmeCmdBufAddr[cmd_idx] =
Anurag Chouhan600c3a02016-03-01 10:33:54 +0530370 qdf_mem_malloc(sizeof(tSmeCmd));
Naveen Rawate7d86052015-11-13 12:01:43 -0800371 if (NULL == pMac->sme.pSmeCmdBufAddr[cmd_idx]) {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530372 status = QDF_STATUS_E_NOMEM;
Naveen Rawate7d86052015-11-13 12:01:43 -0800373 free_sme_cmds(pMac);
374 goto end;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800375 }
Naveen Rawate7d86052015-11-13 12:01:43 -0800376 pCmd = (tSmeCmd *)pMac->sme.pSmeCmdBufAddr[cmd_idx];
377 csr_ll_insert_tail(&pMac->sme.smeCmdFreeList,
378 &pCmd->Link, LL_ACCESS_LOCK);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800379 }
380
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800381
382end:
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530383 if (!QDF_IS_STATUS_SUCCESS(status))
Srinivas Girigowda2da81e22017-03-16 21:22:19 -0700384 sme_err("Failed to initialize sme command list: %d", status);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800385
386 return status;
387}
388
Krunal Sonia8270f52017-02-23 19:51:25 -0800389void sme_release_command(tpAniSirGlobal mac_ctx, tSmeCmd *sme_cmd)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800390{
Krunal Sonia8270f52017-02-23 19:51:25 -0800391 sme_cmd->command = eSmeNoCommand;
392 csr_ll_insert_tail(&mac_ctx->sme.smeCmdFreeList, &sme_cmd->Link,
393 LL_ACCESS_LOCK);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800394}
395
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800396static void purge_sme_cmd_list(tpAniSirGlobal pMac)
397{
Krunal Soni81f068c2017-02-23 19:51:55 -0800398 /* purge all command lists */
Srinivas Girigowda2da81e22017-03-16 21:22:19 -0700399 sme_debug("Purging all queues");
Krunal Sonia8270f52017-02-23 19:51:25 -0800400 wlan_serialization_purge_cmd_list(pMac->psoc, NULL,
Krunal Soni81f068c2017-02-23 19:51:55 -0800401 false, false, false, false, true);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800402}
403
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530404static QDF_STATUS free_sme_cmd_list(tpAniSirGlobal pMac)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800405{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530406 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800407
408 purge_sme_cmd_list(pMac);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800409 csr_ll_close(&pMac->sme.smeCmdFreeList);
410
Anurag Chouhana37b5b72016-02-21 14:53:42 +0530411 status = qdf_mutex_acquire(&pMac->sme.lkSmeGlobalLock);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530412 if (status != QDF_STATUS_SUCCESS) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -0700413 sme_err("Failed to acquire the lock status: %d", status);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800414 goto done;
415 }
416
Naveen Rawate7d86052015-11-13 12:01:43 -0800417 free_sme_cmds(pMac);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800418
Anurag Chouhana37b5b72016-02-21 14:53:42 +0530419 status = qdf_mutex_release(&pMac->sme.lkSmeGlobalLock);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530420 if (status != QDF_STATUS_SUCCESS) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -0700421 sme_err("Failed to release the lock status: %d", status);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800422 }
423done:
424 return status;
425}
426
Jeff Johnson49c02f92016-10-07 10:29:09 -0700427static void dump_csr_command_info(tpAniSirGlobal pMac, tSmeCmd *pCmd)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800428{
429 switch (pCmd->command) {
430 case eSmeCommandScan:
Srinivas Girigowda2da81e22017-03-16 21:22:19 -0700431 sme_debug("scan command reason is %d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800432 pCmd->u.scanCmd.reason);
433 break;
434
435 case eSmeCommandRoam:
Srinivas Girigowda2da81e22017-03-16 21:22:19 -0700436 sme_debug("roam command reason is %d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800437 pCmd->u.roamCmd.roamReason);
438 break;
439
440 case eSmeCommandWmStatusChange:
Srinivas Girigowda2da81e22017-03-16 21:22:19 -0700441 sme_debug("WMStatusChange command type is %d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800442 pCmd->u.wmStatusChangeCmd.Type);
443 break;
444
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800445 default:
Srinivas Girigowda2da81e22017-03-16 21:22:19 -0700446 sme_debug("default: Unhandled command %d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800447 pCmd->command);
448 break;
449 }
450}
451
452tSmeCmd *sme_get_command_buffer(tpAniSirGlobal pMac)
453{
454 tSmeCmd *pRetCmd = NULL, *pTempCmd = NULL;
455 tListElem *pEntry;
456 static int sme_command_queue_full;
457
458 pEntry = csr_ll_remove_head(&pMac->sme.smeCmdFreeList, LL_ACCESS_LOCK);
459
460 /* If we can get another MS Msg buffer, then we are ok. Just link */
461 /* the entry onto the linked list. (We are using the linked list */
462 /* to keep track of tfhe message buffers). */
463 if (pEntry) {
464 pRetCmd = GET_BASE_ADDR(pEntry, tSmeCmd, Link);
465 /* reset when free list is available */
466 sme_command_queue_full = 0;
467 } else {
468 int idx = 1;
469
470 /* Cannot change pRetCmd here since it needs to return later. */
Krunal Sonia8270f52017-02-23 19:51:25 -0800471 pEntry = csr_nonscan_active_ll_peek_head(pMac, LL_ACCESS_LOCK);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800472 if (pEntry) {
473 pTempCmd = GET_BASE_ADDR(pEntry, tSmeCmd, Link);
474 }
Srinivas Girigowda2da81e22017-03-16 21:22:19 -0700475 sme_err(
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800476 "Out of command buffer.... command (0x%X) stuck",
477 (pTempCmd) ? pTempCmd->command : eSmeNoCommand);
478 if (pTempCmd) {
479 if (eSmeCsrCommandMask & pTempCmd->command) {
480 /* CSR command is stuck. See what the reason code is for that command */
481 dump_csr_command_info(pMac, pTempCmd);
482 }
483 } /* if(pTempCmd) */
484
485 /* dump what is in the pending queue */
Krunal Soni20126cb2017-02-15 16:26:57 -0800486 csr_nonscan_pending_ll_lock(pMac);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800487 pEntry =
Krunal Sonia8270f52017-02-23 19:51:25 -0800488 csr_nonscan_pending_ll_peek_head(pMac,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800489 LL_ACCESS_NOLOCK);
490 while (pEntry && !sme_command_queue_full) {
491 pTempCmd = GET_BASE_ADDR(pEntry, tSmeCmd, Link);
492 /* Print only 1st five commands from pending queue. */
493 if (idx <= 5)
Srinivas Girigowda2da81e22017-03-16 21:22:19 -0700494 sme_err(
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800495 "Out of command buffer.... SME pending command #%d (0x%X)",
496 idx, pTempCmd->command);
497 idx++;
498 if (eSmeCsrCommandMask & pTempCmd->command) {
499 /* CSR command is stuck. See what the reason code is for that command */
500 dump_csr_command_info(pMac, pTempCmd);
501 }
Krunal Soni72dba662017-02-15 20:13:17 -0800502 pEntry = csr_nonscan_pending_ll_next(pMac, pEntry,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800503 LL_ACCESS_NOLOCK);
504 }
Krunal Soni20126cb2017-02-15 16:26:57 -0800505 csr_nonscan_pending_ll_unlock(pMac);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800506
Abhishek Singh5ea86532016-04-27 14:10:53 +0530507 if (pMac->roam.configParam.enable_fatal_event)
508 cds_flush_logs(WLAN_LOG_TYPE_FATAL,
509 WLAN_LOG_INDICATOR_HOST_DRIVER,
510 WLAN_LOG_REASON_SME_OUT_OF_CMD_BUF,
511 false,
512 pMac->sme.enableSelfRecovery ? true : false);
513 else if (pMac->sme.enableSelfRecovery)
Mukul Sharmab7b575b2016-10-02 23:37:07 +0530514 cds_trigger_recovery(false);
Abhishek Singh5ea86532016-04-27 14:10:53 +0530515 else
516 QDF_BUG(0);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800517 }
518
519 /* memset to zero */
520 if (pRetCmd) {
Anurag Chouhan600c3a02016-03-01 10:33:54 +0530521 qdf_mem_set((uint8_t *)&pRetCmd->command,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800522 sizeof(pRetCmd->command), 0);
Anurag Chouhan600c3a02016-03-01 10:33:54 +0530523 qdf_mem_set((uint8_t *)&pRetCmd->sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800524 sizeof(pRetCmd->sessionId), 0);
Anurag Chouhan600c3a02016-03-01 10:33:54 +0530525 qdf_mem_set((uint8_t *)&pRetCmd->u, sizeof(pRetCmd->u), 0);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800526 }
527
528 return pRetCmd;
529}
530
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800531/**
Krunal Sonia8270f52017-02-23 19:51:25 -0800532 * sme_ser_handle_active_cmd() - handle command activation callback from
533 * new serialization module
534 * @cmd: pointer to new serialization command
535 *
536 * This API is to handle command activation callback from new serialization
537 * callback
538 *
539 * Return: QDF_STATUS_SUCCESS
540 */
541static
542QDF_STATUS sme_ser_handle_active_cmd(struct wlan_serialization_command *cmd)
543{
544 tSmeCmd *sme_cmd;
545 tHalHandle hal;
546 tpAniSirGlobal mac_ctx;
547 QDF_STATUS status = QDF_STATUS_SUCCESS;
548 bool do_continue;
549
550 if (!cmd) {
Srinivas Girigowda2c263352017-03-17 17:49:53 -0700551 sme_err("No serialization command found");
Krunal Sonia8270f52017-02-23 19:51:25 -0800552 return QDF_STATUS_E_FAILURE;
553 }
554
555 hal = cds_get_context(QDF_MODULE_ID_SME);
556 mac_ctx = PMAC_STRUCT(hal);
557 if (!mac_ctx) {
Srinivas Girigowda2c263352017-03-17 17:49:53 -0700558 sme_err("No mac_ctx found");
Krunal Sonia8270f52017-02-23 19:51:25 -0800559 return QDF_STATUS_E_FAILURE;
560 }
561 sme_cmd = cmd->umac_cmd;
562 if (!sme_cmd) {
Srinivas Girigowda2c263352017-03-17 17:49:53 -0700563 sme_err("No SME command found");
Krunal Sonia8270f52017-02-23 19:51:25 -0800564 return QDF_STATUS_E_FAILURE;
565 }
566
567 switch (sme_cmd->command) {
568 case eSmeCommandRoam:
569 status = csr_roam_process_command(mac_ctx, sme_cmd);
570 break;
571 case eSmeCommandWmStatusChange:
572 csr_roam_process_wm_status_change_command(mac_ctx,
573 sme_cmd);
574 break;
Krunal Sonia8270f52017-02-23 19:51:25 -0800575 case eSmeCommandNdpInitiatorRequest:
576 status = csr_process_ndp_initiator_request(mac_ctx, sme_cmd);
577 break;
578 case eSmeCommandNdpResponderRequest:
579 status = csr_process_ndp_responder_request(mac_ctx, sme_cmd);
580 break;
581 case eSmeCommandNdpDataEndInitiatorRequest:
582 status = csr_process_ndp_data_end_request(mac_ctx, sme_cmd);
583 break;
Krunal Soni81f068c2017-02-23 19:51:55 -0800584 case eSmeCommandScan:
Srinivas Girigowda2c263352017-03-17 17:49:53 -0700585 sme_debug("Processing scan offload cmd");
Krunal Soni81f068c2017-02-23 19:51:55 -0800586 qdf_mc_timer_start(&sme_cmd->u.scanCmd.csr_scan_timer,
587 CSR_ACTIVE_SCAN_LIST_CMD_TIMEOUT);
588 status = csr_process_scan_command(mac_ctx, sme_cmd);
589 break;
Krunal Sonia8270f52017-02-23 19:51:25 -0800590 case eSmeCommandRemainOnChannel:
591 status = p2p_process_remain_on_channel_cmd(mac_ctx, sme_cmd);
592 break;
593 /*
594 * Treat standby differently here because caller may not be able
595 * to handle the failure so we do our best here
596 */
597 case eSmeCommandEnterStandby:
598 break;
599 case eSmeCommandAddTs:
600 case eSmeCommandDelTs:
601#ifndef WLAN_MDM_CODE_REDUCTION_OPT
602 do_continue = qos_process_command(mac_ctx, sme_cmd);
603 if (do_continue)
604 status = QDF_STATUS_E_FAILURE;
605#endif
606 break;
607#ifdef FEATURE_WLAN_TDLS
608 case eSmeCommandTdlsSendMgmt:
609 case eSmeCommandTdlsAddPeer:
610 case eSmeCommandTdlsDelPeer:
611 case eSmeCommandTdlsLinkEstablish:
612 status = csr_tdls_process_cmd(mac_ctx, sme_cmd);
613 break;
614#endif
615 case e_sme_command_set_hw_mode:
616 csr_process_set_hw_mode(mac_ctx, sme_cmd);
617 break;
618 case e_sme_command_nss_update:
619 csr_process_nss_update_req(mac_ctx, sme_cmd);
620 break;
621 case e_sme_command_set_dual_mac_config:
622 csr_process_set_dual_mac_config(mac_ctx, sme_cmd);
623 break;
624 case e_sme_command_set_antenna_mode:
625 csr_process_set_antenna_mode(mac_ctx, sme_cmd);
626 break;
627 default:
628 /* something is wrong */
629 /* remove it from the active list */
Srinivas Girigowda2da81e22017-03-16 21:22:19 -0700630 sme_err("unknown command %d", sme_cmd->command);
Krunal Sonia8270f52017-02-23 19:51:25 -0800631 status = QDF_STATUS_E_FAILURE;
632 break;
633 }
634 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda2c263352017-03-17 17:49:53 -0700635 sme_err("Releasing memory for %d",
Krunal Sonia8270f52017-02-23 19:51:25 -0800636 sme_cmd->command);
637 csr_release_command(mac_ctx, sme_cmd);
638 }
639 return status;
640}
641
642QDF_STATUS sme_ser_cmd_callback(void *buf,
643 enum wlan_serialization_cb_reason reason)
644{
645 struct wlan_serialization_command *cmd = buf;
646 tHalHandle hal;
647 tpAniSirGlobal mac_ctx;
648 QDF_STATUS status = QDF_STATUS_SUCCESS;
649 tSmeCmd *sme_cmd;
650
651 hal = cds_get_context(QDF_MODULE_ID_SME);
652 mac_ctx = PMAC_STRUCT(hal);
653 if (!mac_ctx) {
Srinivas Girigowda2c263352017-03-17 17:49:53 -0700654 sme_err("mac_ctx is null");
Krunal Sonia8270f52017-02-23 19:51:25 -0800655 return QDF_STATUS_E_FAILURE;
656 }
657 /*
658 * Do not acquire lock here as sme global lock is already acquired in
659 * caller or MC thread context
660 */
661 if (!cmd) {
Srinivas Girigowda2c263352017-03-17 17:49:53 -0700662 sme_err("serialization command is null");
Krunal Sonia8270f52017-02-23 19:51:25 -0800663 return QDF_STATUS_E_FAILURE;
664 }
665
666 switch (reason) {
667 case WLAN_SER_CB_ACTIVATE_CMD:
Srinivas Girigowda2c263352017-03-17 17:49:53 -0700668 sme_debug("WLAN_SER_CB_ACTIVATE_CMD callback");
Krunal Sonia8270f52017-02-23 19:51:25 -0800669 status = sme_ser_handle_active_cmd(cmd);
670 break;
671 case WLAN_SER_CB_CANCEL_CMD:
Srinivas Girigowda2c263352017-03-17 17:49:53 -0700672 sme_debug("WLAN_SER_CB_CANCEL_CMD callback");
Krunal Sonia8270f52017-02-23 19:51:25 -0800673 sme_cmd = cmd->umac_cmd;
674 csr_cancel_command(mac_ctx, sme_cmd);
Krunal Sonia8270f52017-02-23 19:51:25 -0800675 break;
676 case WLAN_SER_CB_RELEASE_MEM_CMD:
Srinivas Girigowda2c263352017-03-17 17:49:53 -0700677 sme_debug("WLAN_SER_CB_RELEASE_MEM_CMD callback");
Krunal Sonia8270f52017-02-23 19:51:25 -0800678 sme_cmd = cmd->umac_cmd;
679 csr_release_command_buffer(mac_ctx, sme_cmd);
680 break;
681 case WLAN_SER_CB_ACTIVE_CMD_TIMEOUT:
Srinivas Girigowda2c263352017-03-17 17:49:53 -0700682 sme_debug("WLAN_SER_CB_ACTIVE_CMD_TIMEOUT callback");
Krunal Sonia8270f52017-02-23 19:51:25 -0800683 break;
684 default:
Srinivas Girigowda2c263352017-03-17 17:49:53 -0700685 sme_debug("STOP: unknown reason code");
Krunal Sonia8270f52017-02-23 19:51:25 -0800686 return QDF_STATUS_E_FAILURE;
687 }
688 return status;
689}
690
691/**
Padma, Santhosh Kumar9aba02f2016-08-11 16:30:25 +0530692 * sme_get_sessionid_from_activelist() - gets session id
693 * @mac: mac context
694 *
695 * This function is used to get session id from sme command
696 * active list
697 *
698 * Return: returns session id
699 */
Jeff Johnson49c02f92016-10-07 10:29:09 -0700700static uint32_t sme_get_sessionid_from_activelist(tpAniSirGlobal mac)
Padma, Santhosh Kumar9aba02f2016-08-11 16:30:25 +0530701{
702 tListElem *entry;
703 tSmeCmd *command;
704 uint32_t session_id = CSR_SESSION_ID_INVALID;
705
Krunal Sonia8270f52017-02-23 19:51:25 -0800706 entry = csr_nonscan_active_ll_peek_head(mac, LL_ACCESS_LOCK);
Padma, Santhosh Kumar9aba02f2016-08-11 16:30:25 +0530707 if (entry) {
708 command = GET_BASE_ADDR(entry, tSmeCmd, Link);
709 session_id = command->sessionId;
710 }
711
712 return session_id;
713}
714
715/**
716 * sme_state_info_dump() - prints state information of sme layer
717 * @buf: buffer pointer
718 * @size: size of buffer to be filled
719 *
720 * This function is used to dump state information of sme layer
721 *
722 * Return: None
723 */
724static void sme_state_info_dump(char **buf_ptr, uint16_t *size)
725{
726 uint32_t session_id, active_session_id;
727 tHalHandle hal;
728 tpAniSirGlobal mac;
729 uint16_t len = 0;
730 char *buf = *buf_ptr;
731 eCsrConnectState connect_state;
732
733 hal = cds_get_context(QDF_MODULE_ID_SME);
734 if (hal == NULL) {
735 QDF_ASSERT(0);
736 return;
737 }
738
739 mac = PMAC_STRUCT(hal);
Padma, Santhosh Kumar9aba02f2016-08-11 16:30:25 +0530740
741 active_session_id = sme_get_sessionid_from_activelist(mac);
742 if (active_session_id != CSR_SESSION_ID_INVALID) {
743 len += qdf_scnprintf(buf + len, *size - len,
744 "\n active command sessionid %d", active_session_id);
745 }
746
747 for (session_id = 0; session_id < CSR_ROAM_SESSION_MAX; session_id++) {
748 if (CSR_IS_SESSION_VALID(mac, session_id)) {
749 connect_state =
750 mac->roam.roamSession[session_id].connectState;
751 if ((eCSR_ASSOC_STATE_TYPE_INFRA_ASSOCIATED ==
752 connect_state)
753 || (eCSR_ASSOC_STATE_TYPE_INFRA_CONNECTED ==
754 connect_state)) {
755 len += qdf_scnprintf(buf + len, *size - len,
756 "\n NeighborRoamState: %d",
757 mac->roam.neighborRoamInfo[session_id].
758 neighborRoamState);
759 len += qdf_scnprintf(buf + len, *size - len,
760 "\n RoamState: %d", mac->roam.
761 curState[session_id]);
762 len += qdf_scnprintf(buf + len, *size - len,
763 "\n RoamSubState: %d", mac->roam.
764 curSubState[session_id]);
765 len += qdf_scnprintf(buf + len, *size - len,
766 "\n ConnectState: %d",
767 connect_state);
768 }
769 }
770 }
771
772 *size -= len;
773 *buf_ptr += len;
774}
775
776/**
777 * sme_register_debug_callback() - registration function sme layer
778 * to print sme state information
779 *
780 * Return: None
781 */
782static void sme_register_debug_callback(void)
783{
784 qdf_register_debug_callback(QDF_MODULE_ID_SME, &sme_state_info_dump);
785}
786
787
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800788/* Global APIs */
789
790/**
791 * sme_open() - Initialze all SME modules and put them at idle state
792 * @hHal: The handle returned by mac_open
793 *
794 * The function initializes each module inside SME, PMC, CSR, etc. Upon
795 * successfully return, all modules are at idle state ready to start.
796 * smeOpen must be called before any other SME APIs can be involved.
797 * smeOpen must be called after mac_open.
798 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530799 * Return: QDF_STATUS_SUCCESS - SME is successfully initialized.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800800 * Other status means SME is failed to be initialized
801 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530802QDF_STATUS sme_open(tHalHandle hHal)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800803{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530804 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800805 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800806
807 pMac->sme.state = SME_STATE_STOP;
Anurag Chouhan6d760662016-02-20 16:05:43 +0530808 pMac->sme.currDeviceMode = QDF_STA_MODE;
Anurag Chouhana37b5b72016-02-21 14:53:42 +0530809 if (!QDF_IS_STATUS_SUCCESS(qdf_mutex_create(
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800810 &pMac->sme.lkSmeGlobalLock))) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -0700811 sme_err("sme_open failed init lock");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530812 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800813 }
814 status = csr_open(pMac);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530815 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -0700816 sme_err("csr_open failed, status: %d", status);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800817 return status;
818 }
819
820 status = sme_ps_open(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530821 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -0700822 sme_err("sme_ps_open failed with status: %d", status);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800823 return status;
824 }
825#ifdef FEATURE_WLAN_TDLS
826 pMac->is_tdls_power_save_prohibited = 0;
827#endif
828
829#ifndef WLAN_MDM_CODE_REDUCTION_OPT
830 status = sme_qos_open(pMac);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530831 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -0700832 sme_err("Qos open, status: %d", status);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800833 return status;
834 }
835#endif
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800836 status = init_sme_cmd_list(pMac);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530837 if (!QDF_IS_STATUS_SUCCESS(status))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800838 return status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800839
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800840 status = rrm_open(pMac);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530841 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -0700842 sme_err("rrm_open failed, status: %d", status);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800843 return status;
844 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800845 sme_p2p_open(pMac);
846 sme_trace_init(pMac);
Padma, Santhosh Kumar9aba02f2016-08-11 16:30:25 +0530847 sme_register_debug_callback();
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800848 return status;
849}
850
851/*
852 * sme_init_chan_list, triggers channel setup based on country code.
853 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530854QDF_STATUS sme_init_chan_list(tHalHandle hal, uint8_t *alpha2,
Amar Singhala297bfa2015-10-15 15:07:29 -0700855 enum country_src cc_src)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800856{
857 tpAniSirGlobal pmac = PMAC_STRUCT(hal);
858
Amar Singhala297bfa2015-10-15 15:07:29 -0700859 if ((cc_src == SOURCE_USERSPACE) &&
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800860 (pmac->roam.configParam.fSupplicantCountryCodeHasPriority)) {
861 pmac->roam.configParam.Is11dSupportEnabled = false;
862 }
863
864 return csr_init_chan_list(pmac, alpha2);
865}
866
867/*--------------------------------------------------------------------------
868
869 \brief sme_set11dinfo() - Set the 11d information about valid channels
870 and there power using information from nvRAM
871 This function is called only for AP.
872
873 This is a synchronous call
874
875 \param hHal - The handle returned by mac_open.
876 \Param pSmeConfigParams - a pointer to a caller allocated object of
877 typedef struct _smeConfigParams.
878
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530879 \return QDF_STATUS_SUCCESS - SME update the config parameters successfully.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800880
881 Other status means SME is failed to update the config parameters.
882 \sa
883 --------------------------------------------------------------------------*/
884
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530885QDF_STATUS sme_set11dinfo(tHalHandle hHal, tpSmeConfigParams pSmeConfigParams)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800886{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530887 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800888
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +0530889 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800890 TRACE_CODE_SME_RX_HDD_MSG_SET_11DINFO, NO_SESSION, 0));
891 if (NULL == pSmeConfigParams) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -0700892 sme_err("SME config params empty");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800893 return status;
894 }
895
896 status = csr_set_channels(hHal, &pSmeConfigParams->csrConfig);
Srinivas Girigowda2da81e22017-03-16 21:22:19 -0700897 if (!QDF_IS_STATUS_SUCCESS(status))
898 sme_err("csr_set_channels failed with status: %d", status);
899
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800900 return status;
901}
902
903/**
904 * sme_set_scan_disable() - Dynamically enable/disable scan
905 * @h_hal: Handle to HAL
906 *
907 * This command gives the user an option to dynamically
908 * enable or disable scans.
909 *
910 * Return: None
911 */
912void sme_set_scan_disable(tHalHandle h_hal, int value)
913{
914 tpAniSirGlobal mac_ctx = PMAC_STRUCT(h_hal);
915 mac_ctx->lim.scan_disabled = value;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800916}
917/*--------------------------------------------------------------------------
918
919 \brief sme_get_soft_ap_domain() - Get the current regulatory domain of softAp.
920
921 This is a synchronous call
922
923 \param hHal - The handle returned by HostapdAdapter.
924 \Param v_REGDOMAIN_t - The current Regulatory Domain requested for SoftAp.
925
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530926 \return QDF_STATUS_SUCCESS - SME successfully completed the request.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800927
928 Other status means, failed to get the current regulatory domain.
929 \sa
930 --------------------------------------------------------------------------*/
931
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530932QDF_STATUS sme_get_soft_ap_domain(tHalHandle hHal, v_REGDOMAIN_t *domainIdSoftAp)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800933{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530934 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800935 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
936
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +0530937 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800938 TRACE_CODE_SME_RX_HDD_MSG_GET_SOFTAP_DOMAIN,
939 NO_SESSION, 0));
940 if (NULL == domainIdSoftAp) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -0700941 sme_err("Uninitialized domain Id");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800942 return status;
943 }
944
945 *domainIdSoftAp = pMac->scan.domainIdCurrent;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530946 status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800947
948 return status;
949}
950
Krunal Sonie3531942016-04-12 17:43:53 -0700951/**
952 * sme_update_fine_time_measurement_capab() - Update the FTM capabitlies from
953 * incoming val
954 * @hal: Handle for Hal layer
955 * @val: New FTM capability value
956 *
957 * Return: None
958 */
Selvaraj, Sridhar57bb4d02016-08-31 16:14:15 +0530959void sme_update_fine_time_measurement_capab(tHalHandle hal, uint8_t session_id,
960 uint32_t val)
Krunal Sonie3531942016-04-12 17:43:53 -0700961{
962 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
963 mac_ctx->fine_time_meas_cap = val;
964
Selvaraj, Sridhar57bb4d02016-08-31 16:14:15 +0530965 if (!val) {
Krunal Sonie3531942016-04-12 17:43:53 -0700966 mac_ctx->rrm.rrmPEContext.rrmEnabledCaps.fine_time_meas_rpt = 0;
967 ((tpRRMCaps)mac_ctx->rrm.rrmSmeContext.
968 rrmConfig.rm_capability)->fine_time_meas_rpt = 0;
969 } else {
970 mac_ctx->rrm.rrmPEContext.rrmEnabledCaps.fine_time_meas_rpt = 1;
971 ((tpRRMCaps)mac_ctx->rrm.rrmSmeContext.
972 rrmConfig.rm_capability)->fine_time_meas_rpt = 1;
973 }
Selvaraj, Sridhar57bb4d02016-08-31 16:14:15 +0530974
975 /* Inform this RRM IE change to FW */
976 csr_roam_offload_scan(mac_ctx, session_id,
977 ROAM_SCAN_OFFLOAD_UPDATE_CFG,
978 REASON_CONNECT_IES_CHANGED);
Krunal Sonie3531942016-04-12 17:43:53 -0700979}
980
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800981/*--------------------------------------------------------------------------
982
983 \brief sme_update_config() - Change configurations for all SME moduels
984
985 The function updates some configuration for modules in SME, CSR, etc
986 during SMEs close open sequence.
987
988 Modules inside SME apply the new configuration at the next transaction.
989
990 This is a synchronous call
991
992 \param hHal - The handle returned by mac_open.
993 \Param pSmeConfigParams - a pointer to a caller allocated object of
994 typedef struct _smeConfigParams.
995
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530996 \return QDF_STATUS_SUCCESS - SME update the config parameters successfully.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800997
998 Other status means SME is failed to update the config parameters.
999 \sa
1000
1001 --------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301002QDF_STATUS sme_update_config(tHalHandle hHal, tpSmeConfigParams pSmeConfigParams)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001003{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301004 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001005 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
1006
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301007 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001008 TRACE_CODE_SME_RX_HDD_MSG_UPDATE_CONFIG, NO_SESSION,
1009 0));
1010 if (NULL == pSmeConfigParams) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07001011 sme_err("SME config params empty");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001012 return status;
1013 }
1014
1015 status =
1016 csr_change_default_config_param(pMac, &pSmeConfigParams->csrConfig);
1017
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301018 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07001019 sme_err("csr_change_default_config_param failed status: %d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001020 status);
1021 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001022 status =
1023 rrm_change_default_config_param(hHal, &pSmeConfigParams->rrmConfig);
1024
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301025 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07001026 sme_err("rrm_change_default_config_param failed status: %d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001027 status);
1028 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001029 /* For SOC, CFG is set before start */
1030 /* We don't want to apply global CFG in connect state because that may cause some side affect */
1031 if (csr_is_all_session_disconnected(pMac)) {
1032 csr_set_global_cfgs(pMac);
1033 }
1034
1035 /*
1036 * If scan offload is enabled then lim has allow the sending of
1037 * scan request to firmware even in powersave mode. The firmware has
1038 * to take care of exiting from power save mode
1039 */
1040 status = sme_cfg_set_int(hHal, WNI_CFG_SCAN_IN_POWERSAVE, true);
1041
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301042 if (QDF_STATUS_SUCCESS != status) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301043 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001044 "Could not pass on WNI_CFG_SCAN_IN_POWERSAVE to CFG");
1045 }
Kapil Gupta4f0c0c12017-02-07 15:21:15 +05301046
1047 pMac->snr_monitor_enabled = pSmeConfigParams->snr_monitor_enabled;
1048
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001049 return status;
1050}
1051
1052/**
Abhishek Singh158fe252017-03-23 11:09:34 +05301053 * sme_update_scan_roam_params() - Update the scan roaming params
1054 * @mac_ctx: mac ctx
1055 *
1056 * Return: void.
1057 */
1058static void sme_update_scan_roam_params(tpAniSirGlobal mac_ctx)
1059{
1060 struct roam_filter_params scan_params = {0};
1061 struct roam_ext_params *roam_params_src;
1062 uint8_t i;
1063 QDF_STATUS status;
1064
1065 roam_params_src = &mac_ctx->roam.configParam.roam_params;
1066
1067 scan_params.num_bssid_avoid_list =
1068 roam_params_src->num_bssid_avoid_list;
1069 scan_params.num_bssid_favored =
1070 roam_params_src->num_bssid_favored;
1071 scan_params.raise_rssi_thresh_5g =
1072 roam_params_src->raise_rssi_thresh_5g;
1073 scan_params.drop_rssi_thresh_5g =
1074 roam_params_src->drop_rssi_thresh_5g;
1075 scan_params.raise_factor_5g =
1076 roam_params_src->raise_factor_5g;
1077 scan_params.drop_factor_5g =
1078 roam_params_src->drop_factor_5g;
1079 scan_params.max_raise_rssi_5g =
1080 roam_params_src->max_raise_rssi_5g;
1081 scan_params.max_drop_rssi_5g =
1082 roam_params_src->max_drop_rssi_5g;
1083 scan_params.is_5g_pref_enabled =
1084 roam_params_src->is_5g_pref_enabled;
1085
1086 if (scan_params.num_bssid_favored > MAX_FAVORED_BSSID)
1087 scan_params.num_bssid_favored = MAX_FAVORED_BSSID;
1088
1089 for (i = 0; i < scan_params.num_bssid_favored; i++) {
1090 qdf_copy_macaddr(&scan_params.bssid_favored[i],
1091 &roam_params_src->bssid_favored[i]);
1092 scan_params.bssid_favored_factor[i] =
1093 roam_params_src->bssid_favored_factor[i];
1094 }
1095
1096 if (scan_params.num_bssid_avoid_list >
1097 MAX_AVOID_LIST_BSSID)
1098 scan_params.num_bssid_avoid_list =
1099 MAX_AVOID_LIST_BSSID;
1100
1101 for (i = 0; i < scan_params.num_bssid_avoid_list; i++) {
1102 qdf_copy_macaddr(&scan_params.bssid_avoid_list[i],
1103 &roam_params_src->bssid_avoid_list[i]);
1104 }
1105
1106 status = ucfg_scan_update_roam_params(mac_ctx->psoc, &scan_params);
1107 if (QDF_IS_STATUS_ERROR(status))
Srinivas Girigowda2c263352017-03-17 17:49:53 -07001108 sme_err("ailed to update scan roam params with status=%d",
Abhishek Singh158fe252017-03-23 11:09:34 +05301109 status);
1110}
1111
1112/**
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001113 * sme_update_roam_params() - Store/Update the roaming params
1114 * @hal: Handle for Hal layer
1115 * @session_id: SME Session ID
1116 * @roam_params_src: The source buffer to copy
1117 * @update_param: Type of parameter to be updated
1118 *
1119 * Return: Return the status of the updation.
1120 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301121QDF_STATUS sme_update_roam_params(tHalHandle hal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001122 uint8_t session_id, struct roam_ext_params roam_params_src,
1123 int update_param)
1124{
1125 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
1126 struct roam_ext_params *roam_params_dst;
1127 uint8_t i;
1128
1129 roam_params_dst = &mac_ctx->roam.configParam.roam_params;
1130 switch (update_param) {
1131 case REASON_ROAM_EXT_SCAN_PARAMS_CHANGED:
1132 roam_params_dst->raise_rssi_thresh_5g =
1133 roam_params_src.raise_rssi_thresh_5g;
1134 roam_params_dst->drop_rssi_thresh_5g =
1135 roam_params_src.drop_rssi_thresh_5g;
1136 roam_params_dst->raise_factor_5g =
1137 roam_params_src.raise_factor_5g;
1138 roam_params_dst->drop_factor_5g =
1139 roam_params_src.drop_factor_5g;
1140 roam_params_dst->max_raise_rssi_5g =
1141 roam_params_src.max_raise_rssi_5g;
1142 roam_params_dst->max_drop_rssi_5g =
1143 roam_params_src.max_drop_rssi_5g;
1144 roam_params_dst->alert_rssi_threshold =
1145 roam_params_src.alert_rssi_threshold;
1146 roam_params_dst->is_5g_pref_enabled = true;
1147 break;
1148 case REASON_ROAM_SET_SSID_ALLOWED:
Anurag Chouhan600c3a02016-03-01 10:33:54 +05301149 qdf_mem_set(&roam_params_dst->ssid_allowed_list, 0,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001150 sizeof(tSirMacSSid) * MAX_SSID_ALLOWED_LIST);
1151 roam_params_dst->num_ssid_allowed_list =
1152 roam_params_src.num_ssid_allowed_list;
1153 for (i = 0; i < roam_params_dst->num_ssid_allowed_list; i++) {
1154 roam_params_dst->ssid_allowed_list[i].length =
1155 roam_params_src.ssid_allowed_list[i].length;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05301156 qdf_mem_copy(roam_params_dst->ssid_allowed_list[i].ssId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001157 roam_params_src.ssid_allowed_list[i].ssId,
1158 roam_params_dst->ssid_allowed_list[i].length);
1159 }
1160 break;
1161 case REASON_ROAM_SET_FAVORED_BSSID:
Anurag Chouhan600c3a02016-03-01 10:33:54 +05301162 qdf_mem_set(&roam_params_dst->bssid_favored, 0,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001163 sizeof(tSirMacAddr) * MAX_BSSID_FAVORED);
1164 roam_params_dst->num_bssid_favored =
1165 roam_params_src.num_bssid_favored;
1166 for (i = 0; i < roam_params_dst->num_bssid_favored; i++) {
Anurag Chouhan600c3a02016-03-01 10:33:54 +05301167 qdf_mem_copy(&roam_params_dst->bssid_favored[i],
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001168 &roam_params_src.bssid_favored[i],
1169 sizeof(tSirMacAddr));
1170 roam_params_dst->bssid_favored_factor[i] =
1171 roam_params_src.bssid_favored_factor[i];
1172 }
1173 break;
1174 case REASON_ROAM_SET_BLACKLIST_BSSID:
Anurag Chouhan600c3a02016-03-01 10:33:54 +05301175 qdf_mem_set(&roam_params_dst->bssid_avoid_list, 0,
Anurag Chouhan6d760662016-02-20 16:05:43 +05301176 QDF_MAC_ADDR_SIZE * MAX_BSSID_AVOID_LIST);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001177 roam_params_dst->num_bssid_avoid_list =
1178 roam_params_src.num_bssid_avoid_list;
1179 for (i = 0; i < roam_params_dst->num_bssid_avoid_list; i++) {
Anurag Chouhanc5548422016-02-24 18:33:27 +05301180 qdf_copy_macaddr(&roam_params_dst->bssid_avoid_list[i],
Srinivas Girigowdab0532392015-11-24 11:50:16 -08001181 &roam_params_src.bssid_avoid_list[i]);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001182 }
1183 break;
1184 case REASON_ROAM_GOOD_RSSI_CHANGED:
1185 roam_params_dst->good_rssi_roam =
1186 roam_params_src.good_rssi_roam;
1187 break;
1188 default:
1189 break;
1190 }
1191 csr_roam_offload_scan(mac_ctx, session_id, ROAM_SCAN_OFFLOAD_UPDATE_CFG,
1192 update_param);
Abhishek Singh158fe252017-03-23 11:09:34 +05301193
1194 sme_update_scan_roam_params(mac_ctx);
1195
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001196 return 0;
1197}
1198
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001199/*--------------------------------------------------------------------------
1200
1201 \fn - sme_process_ready_to_suspend
1202 \brief - On getting ready to suspend indication, this function calls
1203 callback registered (HDD callbacks) with SME to inform
1204 ready to suspend indication.
1205
1206 \param hHal - Handle returned by mac_open.
1207 pReadyToSuspend - Parameter received along with ready to suspend
1208 indication from WMA.
1209
1210 \return None
1211
1212 \sa
1213
1214 --------------------------------------------------------------------------*/
Jeff Johnson49c02f92016-10-07 10:29:09 -07001215static void sme_process_ready_to_suspend(tHalHandle hHal,
1216 tpSirReadyToSuspendInd pReadyToSuspend)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001217{
1218 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
1219
1220 if (NULL == pMac) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301221 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_FATAL,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001222 "%s: pMac is null", __func__);
1223 return;
1224 }
1225
1226 if (NULL != pMac->readyToSuspendCallback) {
1227 pMac->readyToSuspendCallback(pMac->readyToSuspendContext,
1228 pReadyToSuspend->suspended);
1229 pMac->readyToSuspendCallback = NULL;
1230 }
1231}
1232
1233#ifdef WLAN_FEATURE_EXTWOW_SUPPORT
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001234
Krishna Kumaar Natarajand9131902015-10-19 11:52:47 -07001235/**
1236 * sme_process_ready_to_ext_wow() - inform ready to ExtWoW indication.
1237 * @hHal - Handle returned by mac_open.
1238 * @pReadyToExtWoW - Parameter received along with ready to Ext WoW
1239 * indication from WMA.
1240 *
1241 * On getting ready to Ext WoW indication, this function calls callback
1242 * registered (HDD callback)with SME to inform ready to ExtWoW indication.
1243 *
1244 * Return: None
1245 */
Jeff Johnson49c02f92016-10-07 10:29:09 -07001246static void sme_process_ready_to_ext_wow(tHalHandle hHal,
1247 tpSirReadyToExtWoWInd pReadyToExtWoW)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001248{
1249 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
1250
1251 if (NULL == pMac) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301252 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_FATAL,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001253 "%s: pMac is null", __func__);
1254 return;
1255 }
1256
1257 if (NULL != pMac->readyToExtWoWCallback) {
1258 pMac->readyToExtWoWCallback(pMac->readyToExtWoWContext,
1259 pReadyToExtWoW->status);
1260 pMac->readyToExtWoWCallback = NULL;
1261 pMac->readyToExtWoWContext = NULL;
1262 }
1263
1264}
1265#endif
1266
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001267/*--------------------------------------------------------------------------
1268
1269 \brief sme_hdd_ready_ind() - SME sends eWNI_SME_SYS_READY_IND to PE to inform
1270 that the NIC is ready tio run.
1271
1272 The function is called by HDD at the end of initialization stage so PE/HAL can
1273 enable the NIC to running state.
1274
1275 This is a synchronous call
1276 \param hHal - The handle returned by mac_open.
1277
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301278 \return QDF_STATUS_SUCCESS - eWNI_SME_SYS_READY_IND is sent to PE
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001279 successfully.
1280
1281 Other status means SME failed to send the message to PE.
1282 \sa
1283
1284 --------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301285QDF_STATUS sme_hdd_ready_ind(tHalHandle hHal)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001286{
Abhishek Singhde410b72017-05-22 15:25:39 +05301287 tSirSmeReadyReq *msg;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301288 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001289 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
1290
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301291 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001292 TRACE_CODE_SME_RX_HDD_MSG_HDDREADYIND, NO_SESSION, 0));
1293 do {
1294
Abhishek Singhde410b72017-05-22 15:25:39 +05301295 msg = qdf_mem_malloc(sizeof(*msg));
1296 if (!msg) {
1297 sme_err("Memory allocation failed! for msg");
1298 return QDF_STATUS_E_NOMEM;
1299 }
1300 msg->messageType = eWNI_SME_SYS_READY_IND;
1301 msg->length = sizeof(*msg);
1302 msg->add_bssdescr_cb = csr_scan_process_single_bssdescr;
1303 msg->csr_roam_synch_cb = csr_roam_synch_callback;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001304
Abhishek Singhde410b72017-05-22 15:25:39 +05301305 if (eSIR_FAILURE != u_mac_post_ctrl_msg(hHal, (tSirMbMsg *) msg)) {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301306 status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001307 } else {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07001308 sme_err("u_mac_post_ctrl_msg failed to send eWNI_SME_SYS_READY_IND");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001309 break;
1310 }
1311
1312 status = csr_ready(pMac);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301313 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07001314 sme_err("csr_ready failed with status: %d", status);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001315 break;
1316 }
1317
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001318 pMac->sme.state = SME_STATE_READY;
1319 } while (0);
1320
1321 return status;
1322}
1323
1324/*--------------------------------------------------------------------------
1325
1326 \brief sme_start() - Put all SME modules at ready state.
1327
1328 The function starts each module in SME, PMC, CSR, etc. . Upon
1329 successfully return, all modules are ready to run.
1330 This is a synchronous call
1331 \param hHal - The handle returned by mac_open.
1332
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301333 \return QDF_STATUS_SUCCESS - SME is ready.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001334
1335 Other status means SME is failed to start
1336 \sa
1337
1338 --------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301339QDF_STATUS sme_start(tHalHandle hHal)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001340{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301341 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001342 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Tushnim Bhattacharyya91049632017-03-17 17:31:27 -07001343 struct policy_mgr_sme_cbacks sme_cbacks;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001344
1345 do {
1346 status = csr_start(pMac);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301347 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07001348 sme_err("csr_start failed status: %d", status);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001349 break;
1350 }
Tushnim Bhattacharyya91049632017-03-17 17:31:27 -07001351 sme_cbacks.sme_get_nss_for_vdev = sme_get_vdev_type_nss;
1352 sme_cbacks.sme_get_valid_channels = sme_get_cfg_valid_channels;
1353 sme_cbacks.sme_nss_update_request = sme_nss_update_request;
1354 sme_cbacks.sme_pdev_set_hw_mode = sme_pdev_set_hw_mode;
1355 sme_cbacks.sme_pdev_set_pcl = sme_pdev_set_pcl;
1356 sme_cbacks.sme_soc_set_dual_mac_config =
1357 sme_soc_set_dual_mac_config;
Archana Ramachandran2eb7a612017-03-23 22:58:42 -07001358 sme_cbacks.sme_change_mcc_beacon_interval =
1359 sme_change_mcc_beacon_interval;
1360 sme_cbacks.sme_get_ap_channel_from_scan =
1361 sme_get_ap_channel_from_scan;
1362 sme_cbacks.sme_scan_result_purge = sme_scan_result_purge;
Tushnim Bhattacharyya91049632017-03-17 17:31:27 -07001363 status = policy_mgr_register_sme_cb(pMac->psoc, &sme_cbacks);
1364 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda2c263352017-03-17 17:49:53 -07001365 sme_err("Failed to register sme cb with Policy Manager: %d",
Tushnim Bhattacharyya91049632017-03-17 17:31:27 -07001366 status);
1367 break;
1368 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001369 pMac->sme.state = SME_STATE_START;
1370 } while (0);
1371
1372 return status;
1373}
1374
1375/**
1376 * sme_handle_scan_req() - Scan request handler
1377 * @mac_ctx: MAC global context
1378 * @msg: message buffer
1379 *
1380 * Scan request message from upper layer is handled as
1381 * part of this API
1382 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301383 * Return: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001384 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301385static QDF_STATUS sme_handle_scan_req(tpAniSirGlobal mac_ctx,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001386 void *msg)
1387{
1388 struct ani_scan_req *scan_msg;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301389 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001390 uint16_t session_id;
1391 csr_scan_completeCallback callback;
1392
1393 scan_msg = msg;
1394 session_id = scan_msg->session_id;
1395 callback = scan_msg->callback;
1396 status = csr_scan_request(mac_ctx, session_id,
1397 scan_msg->scan_param,
1398 callback, scan_msg->ctx);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301399 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07001400 sme_err("Scan request failed. session_id: %d", session_id);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001401 }
1402 csr_scan_free_request(mac_ctx, scan_msg->scan_param);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05301403 qdf_mem_free(scan_msg->scan_param);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001404 return status;
1405}
1406
1407/**
1408 * sme_handle_roc_req() - Roc request handler
1409 * @mac_ctx: MAC global context
1410 * @msg: message buffer
1411 *
1412 * Roc request message from upper layer is handled as
1413 * part of this API
1414 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301415 * Return: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001416 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301417static QDF_STATUS sme_handle_roc_req(tHalHandle hal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001418 void *msg)
1419{
1420 struct ani_roc_req *roc_msg;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301421 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001422 remainOnChanCallback callback;
1423
1424 if (msg == NULL) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07001425 sme_err("ROC request is NULL");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001426 return status;
1427 }
1428
1429 roc_msg = msg;
1430 callback = roc_msg->callback;
1431 status = p2p_remain_on_channel(hal, roc_msg->session_id,
1432 roc_msg->channel, roc_msg->duration, callback,
1433 roc_msg->ctx, roc_msg->is_p2pprobe_allowed,
1434 roc_msg->scan_id);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301435 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07001436 sme_err("Scan request failed. session_id: %d scan_id: %d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001437 roc_msg->session_id, roc_msg->scan_id);
1438 }
1439 return status;
1440}
1441
Arif Hussaincd151632017-02-11 16:57:19 -08001442static QDF_STATUS dfs_msg_processor(tpAniSirGlobal mac,
1443 struct scheduler_msg *msg)
1444{
1445 QDF_STATUS status = QDF_STATUS_SUCCESS;
1446 tCsrRoamInfo roam_info = { 0 };
1447 tSirSmeCSAIeTxCompleteRsp *csa_ie_tx_complete_rsp;
1448 uint32_t session_id = 0;
1449 eRoamCmdStatus roam_status;
1450 eCsrRoamResult roam_result;
1451
1452 switch (msg->type) {
1453 case eWNI_SME_DFS_RADAR_FOUND:
1454 {
1455 session_id = msg->bodyval;
1456 roam_status = eCSR_ROAM_DFS_RADAR_IND;
1457 roam_result = eCSR_ROAM_RESULT_DFS_RADAR_FOUND_IND;
1458 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO_MED,
1459 "sapdfs: Radar indication event occurred");
1460 break;
1461 }
1462 case eWNI_SME_DFS_CSAIE_TX_COMPLETE_IND:
1463 {
1464 csa_ie_tx_complete_rsp =
1465 (tSirSmeCSAIeTxCompleteRsp *) msg->bodyptr;
1466 if (!csa_ie_tx_complete_rsp) {
1467 sme_err("eWNI_SME_DFS_CSAIE_TX_COMPLETE_IND null msg");
1468 return QDF_STATUS_E_FAILURE;
1469 }
1470 session_id = csa_ie_tx_complete_rsp->sessionId;
1471 roam_status = eCSR_ROAM_DFS_CHAN_SW_NOTIFY;
1472 roam_result = eCSR_ROAM_RESULT_DFS_CHANSW_UPDATE_SUCCESS;
1473 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO_MED,
1474 "eWNI_SME_DFS_CSAIE_TX_COMPLETE_IND session=%d",
1475 session_id);
1476 break;
1477 }
1478 case eWNI_SME_DFS_CAC_COMPLETE:
1479 {
1480 session_id = msg->bodyval;
1481 roam_status = eCSR_ROAM_CAC_COMPLETE_IND;
1482 roam_result = eCSR_ROAM_RESULT_CAC_END_IND;
1483 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO_MED,
1484 "sapdfs: Received eWNI_SME_DFS_CAC_COMPLETE vdevid%d",
1485 session_id);
1486 break;
1487 }
1488 default:
1489 {
1490 sme_err("Invalid DFS message: 0x%x", msg->type);
1491 status = QDF_STATUS_E_FAILURE;
1492 return status;
1493 }
1494 }
1495
1496 /* Indicate Radar Event to SAP */
1497 csr_roam_call_callback(mac, session_id, &roam_info, 0,
1498 roam_status, roam_result);
1499 return status;
1500}
1501
1502
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001503#ifdef WLAN_FEATURE_11W
1504/*------------------------------------------------------------------
1505 *
1506 * Handle the unprotected management frame indication from LIM and
1507 * forward it to HDD.
1508 *
1509 *------------------------------------------------------------------*/
1510
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301511QDF_STATUS sme_unprotected_mgmt_frm_ind(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001512 tpSirSmeUnprotMgmtFrameInd pSmeMgmtFrm)
1513{
1514 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301515 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001516 tCsrRoamInfo pRoamInfo = { 0 };
1517 uint32_t SessionId = pSmeMgmtFrm->sessionId;
1518
1519 pRoamInfo.nFrameLength = pSmeMgmtFrm->frameLen;
1520 pRoamInfo.pbFrames = pSmeMgmtFrm->frameBuf;
1521 pRoamInfo.frameType = pSmeMgmtFrm->frameType;
1522
1523 /* forward the mgmt frame to HDD */
1524 csr_roam_call_callback(pMac, SessionId, &pRoamInfo, 0,
1525 eCSR_ROAM_UNPROT_MGMT_FRAME_IND, 0);
1526
1527 return status;
1528}
1529#endif
1530
Kapil Gupta8878ad92017-02-13 11:56:04 +05301531QDF_STATUS sme_update_new_channel_event(tHalHandle hal, uint8_t session_id)
1532{
1533 QDF_STATUS status = QDF_STATUS_SUCCESS;
1534 tpAniSirGlobal mac = PMAC_STRUCT(hal);
1535 tCsrRoamInfo *roamInfo;
1536 eRoamCmdStatus roamStatus;
1537 eCsrRoamResult roamResult;
1538
1539 roamInfo = qdf_mem_malloc(sizeof(*roamInfo));
1540 roamInfo->dfs_event.sessionId = session_id;
1541
1542 roamStatus = eCSR_ROAM_CHANNEL_COMPLETE_IND;
1543 roamResult = eCSR_ROAM_RESULT_DFS_RADAR_FOUND_IND;
1544 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO_MED,
1545 "sapdfs: Updated new channel event");
1546
1547 /* Indicate channel Event to SAP */
1548 csr_roam_call_callback(mac, session_id, roamInfo, 0,
1549 roamStatus, roamResult);
1550
1551 qdf_mem_free(roamInfo);
1552 return status;
1553}
1554
1555
Abhishek Singh518323d2015-10-19 17:42:01 +05301556/**
1557 * sme_extended_change_channel_ind()- function to indicate ECSA
1558 * action frame is received in lim to SAP
1559 * @mac_ctx: pointer to global mac structure
1560 * @msg_buf: contain new channel and session id.
1561 *
1562 * This function is called to post ECSA action frame
1563 * receive event to SAP.
1564 *
1565 * Return: success if msg indicated to SAP else return failure
1566 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301567static QDF_STATUS sme_extended_change_channel_ind(tpAniSirGlobal mac_ctx,
Abhishek Singh518323d2015-10-19 17:42:01 +05301568 void *msg_buf)
1569{
1570 struct sir_sme_ext_cng_chan_ind *ext_chan_ind;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301571 QDF_STATUS status = QDF_STATUS_SUCCESS;
Abhishek Singh518323d2015-10-19 17:42:01 +05301572 uint32_t session_id = 0;
1573 tCsrRoamInfo roamInfo = {0};
1574 eRoamCmdStatus roam_status;
1575 eCsrRoamResult roam_result;
1576
Abhishek Singh518323d2015-10-19 17:42:01 +05301577 ext_chan_ind = msg_buf;
1578 if (NULL == ext_chan_ind) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07001579 sme_err("ext_chan_ind is NULL");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301580 return QDF_STATUS_E_FAILURE;
Abhishek Singh518323d2015-10-19 17:42:01 +05301581 }
1582 session_id = ext_chan_ind->session_id;
1583 roamInfo.target_channel = ext_chan_ind->new_channel;
1584 roam_status = eCSR_ROAM_EXT_CHG_CHNL_IND;
1585 roam_result = eCSR_ROAM_EXT_CHG_CHNL_UPDATE_IND;
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07001586 sme_debug("sapdfs: Received eWNI_SME_EXT_CHANGE_CHANNEL_IND for session id [%d]",
1587 session_id);
Abhishek Singh518323d2015-10-19 17:42:01 +05301588
1589 /* Indicate Ext Channel Change event to SAP */
1590 csr_roam_call_callback(mac_ctx, session_id, &roamInfo, 0,
1591 roam_status, roam_result);
1592 return status;
1593}
1594
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001595/**
1596 * sme_process_fw_mem_dump_rsp - process fw memory dump response from WMA
1597 *
1598 * @mac_ctx: pointer to MAC handle.
1599 * @msg: pointer to received SME msg.
1600 *
1601 * This function process the received SME message and calls the corresponding
1602 * callback which was already registered with SME.
1603 *
1604 * Return: None
1605 */
1606#ifdef WLAN_FEATURE_MEMDUMP
Rajeev Kumar8eaedf62017-01-21 11:03:13 -08001607static void sme_process_fw_mem_dump_rsp(tpAniSirGlobal mac_ctx,
1608 struct scheduler_msg *msg)
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001609{
1610 if (msg->bodyptr) {
1611 if (mac_ctx->sme.fw_dump_callback)
1612 mac_ctx->sme.fw_dump_callback(mac_ctx->hHdd,
1613 (struct fw_dump_rsp *) msg->bodyptr);
1614 qdf_mem_free(msg->bodyptr);
1615 }
1616}
1617#else
Rajeev Kumar8eaedf62017-01-21 11:03:13 -08001618static void sme_process_fw_mem_dump_rsp(tpAniSirGlobal mac_ctx,
1619 struct scheduler_msg *msg)
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001620{
1621}
1622#endif
1623
1624#ifdef FEATURE_WLAN_ESE
1625/**
1626 * sme_update_is_ese_feature_enabled() - enable/disable ESE support at runtime
1627 * @hHal: HAL handle
1628 * @sessionId: session id
1629 * @isEseIniFeatureEnabled: ese ini enabled
1630 *
1631 * It is used at in the REG_DYNAMIC_VARIABLE macro definition of
1632 * isEseIniFeatureEnabled. This is a synchronous call
1633 *
1634 * Return: QDF_STATUS enumeration
1635 */
1636QDF_STATUS sme_update_is_ese_feature_enabled(tHalHandle hHal,
1637 uint8_t sessionId, const bool isEseIniFeatureEnabled)
1638{
1639 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
1640
1641 if (pMac->roam.configParam.isEseIniFeatureEnabled ==
1642 isEseIniFeatureEnabled) {
1643 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO,
1644 "%s: ESE Mode is already enabled or disabled, nothing to do (returning) old(%d) new(%d)",
1645 __func__,
1646 pMac->roam.configParam.isEseIniFeatureEnabled,
1647 isEseIniFeatureEnabled);
1648 return QDF_STATUS_SUCCESS;
1649 }
1650
1651 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO,
1652 "%s: EseEnabled is changed from %d to %d", __func__,
1653 pMac->roam.configParam.isEseIniFeatureEnabled,
1654 isEseIniFeatureEnabled);
1655 pMac->roam.configParam.isEseIniFeatureEnabled = isEseIniFeatureEnabled;
Varun Reddy Yeturuff4feb02016-04-20 12:26:11 -07001656 csr_neighbor_roam_update_fast_roaming_enabled(
1657 pMac, sessionId, isEseIniFeatureEnabled);
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001658
1659 if (true == isEseIniFeatureEnabled)
1660 sme_update_fast_transition_enabled(hHal, true);
1661
1662 if (pMac->roam.configParam.isRoamOffloadScanEnabled)
1663 csr_roam_offload_scan(pMac, sessionId,
1664 ROAM_SCAN_OFFLOAD_UPDATE_CFG,
1665 REASON_ESE_INI_CFG_CHANGED);
1666
1667 return QDF_STATUS_SUCCESS;
1668}
1669
1670/**
1671 * sme_set_plm_request() - set plm request
1672 * @hHal: HAL handle
1673 * @pPlmReq: Pointer to input plm request
1674 *
1675 * Return: QDF_STATUS enumeration
1676 */
1677QDF_STATUS sme_set_plm_request(tHalHandle hHal, tpSirPlmReq pPlmReq)
1678{
1679 QDF_STATUS status;
1680 bool ret = false;
1681 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
1682 uint8_t ch_list[WNI_CFG_VALID_CHANNEL_LIST] = { 0 };
1683 uint8_t count, valid_count = 0;
Rajeev Kumar37d478b2017-04-17 16:59:28 -07001684 struct scheduler_msg msg = {0};
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001685 tCsrRoamSession *pSession = CSR_GET_SESSION(pMac, pPlmReq->sessionId);
1686
1687 status = sme_acquire_global_lock(&pMac->sme);
1688 if (!QDF_IS_STATUS_SUCCESS(status))
1689 return status;
1690
1691 if (!pSession) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07001692 sme_err("session %d not found", pPlmReq->sessionId);
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001693 sme_release_global_lock(&pMac->sme);
1694 return QDF_STATUS_E_FAILURE;
1695 }
1696
1697 if (!pSession->sessionActive) {
1698 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
1699 FL("Invalid Sessionid"));
1700 sme_release_global_lock(&pMac->sme);
1701 return QDF_STATUS_E_FAILURE;
1702 }
1703
1704 if (!pPlmReq->enable)
1705 goto send_plm_start;
1706 /* validating channel numbers */
1707 for (count = 0; count < pPlmReq->plmNumCh; count++) {
1708 ret = csr_is_supported_channel(pMac, pPlmReq->plmChList[count]);
1709 if (ret && pPlmReq->plmChList[count] > 14) {
Kiran Kumar Lokerea3de2262017-04-12 12:15:04 -07001710 if (CHANNEL_STATE_DFS == wlan_reg_get_channel_state(
1711 pMac->pdev,
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001712 pPlmReq->plmChList[count])) {
1713 /* DFS channel is provided, no PLM bursts can be
1714 * transmitted. Ignoring these channels.
1715 */
1716 QDF_TRACE(QDF_MODULE_ID_SME,
1717 QDF_TRACE_LEVEL_INFO,
1718 FL("DFS channel %d ignored for PLM"),
1719 pPlmReq->plmChList[count]);
1720 continue;
1721 }
1722 } else if (!ret) {
1723 /* Not supported, ignore the channel */
1724 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO,
1725 FL("Unsupported channel %d ignored for PLM"),
1726 pPlmReq->plmChList[count]);
1727 continue;
1728 }
1729 ch_list[valid_count] = pPlmReq->plmChList[count];
1730 valid_count++;
1731 } /* End of for () */
1732
1733 /* Copying back the valid channel list to plm struct */
1734 qdf_mem_set((void *)pPlmReq->plmChList,
1735 pPlmReq->plmNumCh, 0);
1736 if (valid_count)
1737 qdf_mem_copy(pPlmReq->plmChList, ch_list,
1738 valid_count);
1739 /* All are invalid channels, FW need to send the PLM
1740 * report with "incapable" bit set.
1741 */
1742 pPlmReq->plmNumCh = valid_count;
1743
1744send_plm_start:
1745 /* PLM START */
1746 msg.type = WMA_SET_PLM_REQ;
1747 msg.reserved = 0;
1748 msg.bodyptr = pPlmReq;
1749
Rajeev Kumar8eaedf62017-01-21 11:03:13 -08001750 if (!QDF_IS_STATUS_SUCCESS(scheduler_post_msg(QDF_MODULE_ID_WMA,
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001751 &msg))) {
1752 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
1753 FL("Not able to post WMA_SET_PLM_REQ to WMA"));
1754 sme_release_global_lock(&pMac->sme);
1755 return QDF_STATUS_E_FAILURE;
1756 }
1757
1758 sme_release_global_lock(&pMac->sme);
1759 return status;
1760}
1761
1762/**
1763 * sme_tsm_ie_ind() - sme tsm ie indication
1764 * @hHal: HAL handle
1765 * @pSmeTsmIeInd: Pointer to tsm ie indication
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001766 *
1767 * Handle the tsm ie indication from LIM and forward it to HDD.
1768 *
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001769 * Return: QDF_STATUS enumeration
1770 */
1771static QDF_STATUS sme_tsm_ie_ind(tHalHandle hHal, tSirSmeTsmIEInd *pSmeTsmIeInd)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001772{
1773 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301774 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001775 tCsrRoamInfo pRoamInfo = { 0 };
1776 uint32_t SessionId = pSmeTsmIeInd->sessionId;
1777 pRoamInfo.tsmIe.tsid = pSmeTsmIeInd->tsmIe.tsid;
1778 pRoamInfo.tsmIe.state = pSmeTsmIeInd->tsmIe.state;
1779 pRoamInfo.tsmIe.msmt_interval = pSmeTsmIeInd->tsmIe.msmt_interval;
1780 /* forward the tsm ie information to HDD */
1781 csr_roam_call_callback(pMac,
1782 SessionId, &pRoamInfo, 0, eCSR_ROAM_TSM_IE_IND, 0);
1783 return status;
1784}
1785
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001786/**
1787 * sme_set_cckm_ie() - set cckm ie
1788 * @hHal: HAL handle
1789 * @sessionId: session id
1790 * @pCckmIe: Pointer to CCKM Ie
1791 * @cckmIeLen: Length of @pCckmIe
1792 *
1793 * Function to store the CCKM IE passed from supplicant and use
1794 * it while packing reassociation request.
1795 *
1796 * Return: QDF_STATUS enumeration
1797 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301798QDF_STATUS sme_set_cckm_ie(tHalHandle hHal, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001799 uint8_t *pCckmIe, uint8_t cckmIeLen)
1800{
1801 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301802 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001803 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301804 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001805 csr_set_cckm_ie(pMac, sessionId, pCckmIe, cckmIeLen);
1806 sme_release_global_lock(&pMac->sme);
1807 }
1808 return status;
1809}
1810
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001811/**
1812 * sme_set_ese_beacon_request() - set ese beacon request
1813 * @hHal: HAL handle
1814 * @sessionId: session id
1815 * @pEseBcnReq: Ese beacon report
1816 *
1817 * function to set ESE beacon request parameters
1818 *
1819 * Return: QDF_STATUS enumeration
1820 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301821QDF_STATUS sme_set_ese_beacon_request(tHalHandle hHal, const uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001822 const tCsrEseBeaconReq *pEseBcnReq)
1823{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301824 QDF_STATUS status = eSIR_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001825 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
1826 tpSirBeaconReportReqInd pSmeBcnReportReq = NULL;
1827 tCsrEseBeaconReqParams *pBeaconReq = NULL;
1828 uint8_t counter = 0;
1829 tCsrRoamSession *pSession = CSR_GET_SESSION(pMac, sessionId);
1830 tpRrmSMEContext pSmeRrmContext = &pMac->rrm.rrmSmeContext;
1831
1832 if (pSmeRrmContext->eseBcnReqInProgress == true) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07001833 sme_err("A Beacon Report Req is already in progress");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301834 return QDF_STATUS_E_RESOURCES;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001835 }
1836
1837 /* Store the info in RRM context */
Anurag Chouhan600c3a02016-03-01 10:33:54 +05301838 qdf_mem_copy(&pSmeRrmContext->eseBcnReqInfo, pEseBcnReq,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001839 sizeof(tCsrEseBeaconReq));
1840
1841 /* Prepare the request to send to SME. */
Anurag Chouhan600c3a02016-03-01 10:33:54 +05301842 pSmeBcnReportReq = qdf_mem_malloc(sizeof(tSirBeaconReportReqInd));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001843 if (NULL == pSmeBcnReportReq) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07001844 sme_err("Memory Allocation Failure!!! ESE BcnReq Ind to SME");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301845 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001846 }
1847
1848 pSmeRrmContext->eseBcnReqInProgress = true;
1849
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07001850 sme_debug("Sending Beacon Report Req to SME");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001851
1852 pSmeBcnReportReq->messageType = eWNI_SME_BEACON_REPORT_REQ_IND;
1853 pSmeBcnReportReq->length = sizeof(tSirBeaconReportReqInd);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05301854 qdf_mem_copy(pSmeBcnReportReq->bssId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001855 pSession->connectedProfile.bssid.bytes,
1856 sizeof(tSirMacAddr));
1857 pSmeBcnReportReq->channelInfo.channelNum = 255;
1858 pSmeBcnReportReq->channelList.numChannels = pEseBcnReq->numBcnReqIe;
1859 pSmeBcnReportReq->msgSource = eRRM_MSG_SOURCE_ESE_UPLOAD;
1860
1861 for (counter = 0; counter < pEseBcnReq->numBcnReqIe; counter++) {
1862 pBeaconReq =
1863 (tCsrEseBeaconReqParams *) &pEseBcnReq->bcnReq[counter];
1864 pSmeBcnReportReq->fMeasurementtype[counter] =
1865 pBeaconReq->scanMode;
1866 pSmeBcnReportReq->measurementDuration[counter] =
1867 SYS_TU_TO_MS(pBeaconReq->measurementDuration);
1868 pSmeBcnReportReq->channelList.channelNumber[counter] =
1869 pBeaconReq->channel;
1870 }
1871
1872 status = sme_rrm_process_beacon_report_req_ind(pMac, pSmeBcnReportReq);
1873
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301874 if (status != QDF_STATUS_SUCCESS)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001875 pSmeRrmContext->eseBcnReqInProgress = false;
1876
Hanumanth Reddy Pothula7f7a2712016-09-07 18:44:47 +05301877 qdf_mem_free(pSmeBcnReportReq);
1878
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001879 return status;
1880}
1881
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001882/**
1883 * sme_get_tsm_stats() - SME get tsm stats
1884 * @hHal: HAL handle
1885 * @callback: SME sends back the requested stats using the callback
1886 * @staId: The station ID for which the stats is requested for
1887 * @bssId: bssid
1888 * @pContext: user context to be passed back along with the callback
1889 * @p_cds_context: CDS context
1890 * @tid: Traffic id
1891 *
1892 * API register a callback to get TSM Stats.
1893 *
1894 * Return: QDF_STATUS enumeration
1895 */
1896QDF_STATUS sme_get_tsm_stats(tHalHandle hHal,
1897 tCsrTsmStatsCallback callback,
1898 uint8_t staId, struct qdf_mac_addr bssId,
1899 void *pContext, void *p_cds_context, uint8_t tid)
1900{
1901 QDF_STATUS status = QDF_STATUS_E_FAILURE;
1902 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
1903
1904 status = sme_acquire_global_lock(&pMac->sme);
1905 if (QDF_IS_STATUS_SUCCESS(status)) {
1906 status = csr_get_tsm_stats(pMac, callback,
1907 staId, bssId, pContext,
1908 p_cds_context, tid);
1909 sme_release_global_lock(&pMac->sme);
1910 }
1911 return status;
1912}
1913
1914/**
1915 * sme_set_ese_roam_scan_channel_list() - To set ese roam scan channel list
1916 * @hHal: pointer HAL handle returned by mac_open
1917 * @sessionId: sme session id
1918 * @pChannelList: Output channel list
1919 * @numChannels: Output number of channels
1920 *
1921 * This routine is called to set ese roam scan channel list.
1922 * This is a synchronous call
1923 *
1924 * Return: QDF_STATUS
1925 */
1926QDF_STATUS sme_set_ese_roam_scan_channel_list(tHalHandle hHal,
1927 uint8_t sessionId,
1928 uint8_t *pChannelList,
1929 uint8_t numChannels)
1930{
1931 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
1932 QDF_STATUS status = QDF_STATUS_SUCCESS;
Naveen Rawatc36f7eb2016-11-10 20:01:03 -08001933 tpCsrNeighborRoamControlInfo pNeighborRoamInfo = NULL;
1934 tpCsrChannelInfo curchnl_list_info = NULL;
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001935 uint8_t oldChannelList[WNI_CFG_VALID_CHANNEL_LIST_LEN * 2] = { 0 };
1936 uint8_t newChannelList[128] = { 0 };
1937 uint8_t i = 0, j = 0;
1938
Naveen Rawatc36f7eb2016-11-10 20:01:03 -08001939 if (sessionId >= CSR_ROAM_SESSION_MAX) {
1940 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
1941 FL("Invalid sme session id: %d"), sessionId);
1942 return QDF_STATUS_E_INVAL;
1943 }
1944
1945 pNeighborRoamInfo = &pMac->roam.neighborRoamInfo[sessionId];
1946 curchnl_list_info =
1947 &pNeighborRoamInfo->roamChannelInfo.currentChannelListInfo;
1948
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001949 status = sme_acquire_global_lock(&pMac->sme);
1950 if (!QDF_IS_STATUS_SUCCESS(status)) {
1951 if (pMac->roam.configParam.isRoamOffloadScanEnabled)
1952 csr_roam_offload_scan(pMac, sessionId,
1953 ROAM_SCAN_OFFLOAD_UPDATE_CFG,
1954 REASON_CHANNEL_LIST_CHANGED);
1955 return status;
1956 }
1957 if (NULL != curchnl_list_info->ChannelList) {
1958 for (i = 0; i < curchnl_list_info->numOfChannels; i++) {
1959 j += snprintf(oldChannelList + j,
1960 sizeof(oldChannelList) - j, "%d",
1961 curchnl_list_info->ChannelList[i]);
1962 }
1963 }
1964 status = csr_create_roam_scan_channel_list(pMac, sessionId,
1965 pChannelList, numChannels,
1966 csr_get_current_band(hHal));
1967 if (QDF_IS_STATUS_SUCCESS(status)) {
1968 if (NULL != curchnl_list_info->ChannelList) {
1969 j = 0;
1970 for (i = 0; i < curchnl_list_info->numOfChannels; i++) {
1971 j += snprintf(newChannelList + j,
1972 sizeof(newChannelList) - j, "%d",
1973 curchnl_list_info->ChannelList[i]);
1974 }
1975 }
1976 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
1977 "ESE roam scan chnl list successfully set to %s-old value is %s-roam state is %d",
1978 newChannelList, oldChannelList,
1979 pNeighborRoamInfo->neighborRoamState);
1980 }
1981 sme_release_global_lock(&pMac->sme);
1982 if (pMac->roam.configParam.isRoamOffloadScanEnabled)
1983 csr_roam_offload_scan(pMac, sessionId,
1984 ROAM_SCAN_OFFLOAD_UPDATE_CFG,
1985 REASON_CHANNEL_LIST_CHANGED);
1986 return status;
1987}
1988
1989#endif /* FEATURE_WLAN_ESE */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001990
Jeff Johnson49c02f92016-10-07 10:29:09 -07001991static
1992QDF_STATUS sme_ibss_peer_info_response_handler(tHalHandle hHal,
1993 tpSirIbssGetPeerInfoRspParams
1994 pIbssPeerInfoParams)
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08001995{
1996 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
1997
1998 if (NULL == pMac) {
1999 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_FATAL,
2000 "%s: pMac is null", __func__);
2001 return QDF_STATUS_E_FAILURE;
2002 }
2003 if (pMac->sme.peerInfoParams.peerInfoCbk == NULL) {
2004 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
2005 "%s: HDD callback is null", __func__);
2006 return QDF_STATUS_E_FAILURE;
2007 }
2008 pMac->sme.peerInfoParams.peerInfoCbk(pMac->sme.peerInfoParams.pUserData,
2009 &pIbssPeerInfoParams->
2010 ibssPeerInfoRspParams);
2011 return QDF_STATUS_SUCCESS;
2012}
2013
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002014/**
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002015 * sme_process_dual_mac_config_resp() - Process set Dual mac config response
2016 * @mac: Global MAC pointer
2017 * @msg: Dual mac config response
2018 *
2019 * Processes the dual mac configuration response and invokes the HDD callback
2020 * to process further
2021 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302022static QDF_STATUS sme_process_dual_mac_config_resp(tpAniSirGlobal mac,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002023 uint8_t *msg)
2024{
2025 tListElem *entry = NULL;
2026 tSmeCmd *command = NULL;
2027 bool found;
2028 dual_mac_cb callback = NULL;
2029 struct sir_dual_mac_config_resp *param;
2030
2031 param = (struct sir_dual_mac_config_resp *)msg;
2032 if (!param) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002033 sme_err("Dual mac config resp param is NULL");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002034 /* Not returning. Need to check if active command list
2035 * needs to be freed
2036 */
2037 }
2038
Krunal Sonia8270f52017-02-23 19:51:25 -08002039 entry = csr_nonscan_active_ll_peek_head(mac, LL_ACCESS_LOCK);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002040 if (!entry) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002041 sme_err("No cmd found in active list");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302042 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002043 }
2044
2045 command = GET_BASE_ADDR(entry, tSmeCmd, Link);
2046 if (!command) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002047 sme_err("Base address is NULL");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302048 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002049 }
2050
2051 if (e_sme_command_set_dual_mac_config != command->command) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002052 sme_err("Command mismatch!");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302053 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002054 }
2055
2056 callback = command->u.set_dual_mac_cmd.set_dual_mac_cb;
2057 if (callback) {
2058 if (!param) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002059 sme_err("Callback failed-Dual mac config is NULL");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002060 } else {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002061 sme_debug("Calling HDD callback for Dual mac config");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002062 callback(param->status,
2063 command->u.set_dual_mac_cmd.scan_config,
2064 command->u.set_dual_mac_cmd.fw_mode_config);
2065 }
2066 } else {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002067 sme_err("Callback does not exist");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002068 }
2069
Krunal Soni72dba662017-02-15 20:13:17 -08002070 found = csr_nonscan_active_ll_remove_entry(mac, entry, LL_ACCESS_LOCK);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002071 if (found)
2072 /* Now put this command back on the available command list */
Krunal Soni78618d92017-02-14 21:46:31 -08002073 csr_release_command(mac, command);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002074
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302075 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002076}
2077
Archana Ramachandrana20ef812015-11-13 16:12:13 -08002078/**
2079 * sme_process_antenna_mode_resp() - Process set antenna mode
2080 * response
2081 * @mac: Global MAC pointer
2082 * @msg: antenna mode response
2083 *
2084 * Processes the antenna mode response and invokes the HDD
2085 * callback to process further
2086 */
2087static QDF_STATUS sme_process_antenna_mode_resp(tpAniSirGlobal mac,
2088 uint8_t *msg)
2089{
2090 tListElem *entry;
2091 tSmeCmd *command;
2092 bool found;
2093 antenna_mode_cb callback;
2094 struct sir_antenna_mode_resp *param;
2095
2096 param = (struct sir_antenna_mode_resp *)msg;
2097 if (!param) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002098 sme_err("set antenna mode resp is NULL");
Archana Ramachandrana20ef812015-11-13 16:12:13 -08002099 /* Not returning. Need to check if active command list
2100 * needs to be freed
2101 */
2102 }
2103
Krunal Sonia8270f52017-02-23 19:51:25 -08002104 entry = csr_nonscan_active_ll_peek_head(mac, LL_ACCESS_LOCK);
Archana Ramachandrana20ef812015-11-13 16:12:13 -08002105 if (!entry) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002106 sme_err("No cmd found in active list");
Archana Ramachandrana20ef812015-11-13 16:12:13 -08002107 return QDF_STATUS_E_FAILURE;
2108 }
2109
2110 command = GET_BASE_ADDR(entry, tSmeCmd, Link);
2111 if (!command) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002112 sme_err("Base address is NULL");
Archana Ramachandrana20ef812015-11-13 16:12:13 -08002113 return QDF_STATUS_E_FAILURE;
2114 }
2115
2116 if (e_sme_command_set_antenna_mode != command->command) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002117 sme_err("Command mismatch!");
Archana Ramachandrana20ef812015-11-13 16:12:13 -08002118 return QDF_STATUS_E_FAILURE;
2119 }
2120
2121 callback =
2122 command->u.set_antenna_mode_cmd.set_antenna_mode_resp;
2123 if (callback) {
2124 if (!param) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002125 sme_err("Set antenna mode call back is NULL");
Archana Ramachandrana20ef812015-11-13 16:12:13 -08002126 } else {
Archana Ramachandrana20ef812015-11-13 16:12:13 -08002127 callback(param->status);
2128 }
2129 } else {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002130 sme_err("Callback does not exist");
Archana Ramachandrana20ef812015-11-13 16:12:13 -08002131 }
2132
Krunal Soni72dba662017-02-15 20:13:17 -08002133 found = csr_nonscan_active_ll_remove_entry(mac, entry, LL_ACCESS_LOCK);
Archana Ramachandrana20ef812015-11-13 16:12:13 -08002134 if (found)
2135 /* Now put this command back on the available command list */
Krunal Soni78618d92017-02-14 21:46:31 -08002136 csr_release_command(mac, command);
Archana Ramachandrana20ef812015-11-13 16:12:13 -08002137
Archana Ramachandrana20ef812015-11-13 16:12:13 -08002138 return QDF_STATUS_SUCCESS;
2139}
2140
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002141/*--------------------------------------------------------------------------
2142
2143 \brief sme_process_msg() - The main message processor for SME.
2144
2145 The function is called by a message dispatcher when to process a message
2146 targeted for SME.
2147
2148 This is a synchronous call
2149 \param hHal - The handle returned by mac_open.
Rajeev Kumar416b73f2017-01-21 16:45:21 -08002150 \param pMsg - A pointer to a caller allocated object of struct scheduler_msg.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002151
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302152 \return QDF_STATUS_SUCCESS - SME successfully process the message.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002153
2154 Other status means SME failed to process the message to HAL.
2155 \sa
2156
2157 --------------------------------------------------------------------------*/
Rajeev Kumar8eaedf62017-01-21 11:03:13 -08002158QDF_STATUS sme_process_msg(tHalHandle hHal, struct scheduler_msg *pMsg)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002159{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302160 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002161 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
2162
2163 if (pMsg == NULL) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002164 sme_err("Empty message for SME");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002165 return status;
2166 }
2167 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302168 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002169 sme_warn("Locking failed, bailing out");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002170 if (pMsg->bodyptr)
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302171 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002172 return status;
2173 }
2174 if (!SME_IS_START(pMac)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002175 sme_warn("message type %d in stop state ignored", pMsg->type);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002176 if (pMsg->bodyptr)
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302177 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002178 goto release_lock;
2179 }
2180 switch (pMsg->type) {
2181#ifdef WLAN_FEATURE_ROAM_OFFLOAD
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002182 case eWNI_SME_HO_FAIL_IND:
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302183 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002184 FL("LFR3: Rcvd eWNI_SME_HO_FAIL_IND"));
2185 csr_process_ho_fail_ind(pMac, pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302186 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002187 break;
2188#endif
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002189 case WNI_CFG_SET_CNF:
2190 case WNI_CFG_DNLD_CNF:
2191 case WNI_CFG_GET_RSP:
2192 case WNI_CFG_ADD_GRP_ADDR_CNF:
2193 case WNI_CFG_DEL_GRP_ADDR_CNF:
2194 break;
2195 case eWNI_SME_ADDTS_RSP:
2196 case eWNI_SME_DELTS_RSP:
2197 case eWNI_SME_DELTS_IND:
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002198 case eWNI_SME_FT_AGGR_QOS_RSP:
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002199 /* QoS */
2200 if (pMsg->bodyptr) {
2201#ifndef WLAN_MDM_CODE_REDUCTION_OPT
2202 status = sme_qos_msg_processor(pMac, pMsg->type,
2203 pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302204 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002205#endif
2206 } else {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002207 sme_err("Empty message for: %d", pMsg->type);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002208 }
2209 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002210 case eWNI_SME_NEIGHBOR_REPORT_IND:
2211 case eWNI_SME_BEACON_REPORT_REQ_IND:
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002212 if (pMsg->bodyptr) {
2213 status = sme_rrm_msg_processor(pMac, pMsg->type,
2214 pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302215 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002216 } else {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002217 sme_err("Empty message for: %d", pMsg->type);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002218 }
2219 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002220 case eWNI_SME_ADD_STA_SELF_RSP:
2221 if (pMsg->bodyptr) {
2222 status = csr_process_add_sta_session_rsp(pMac,
2223 pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302224 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002225 } else {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002226 sme_err("Empty message for: %d", pMsg->type);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002227 }
2228 break;
2229 case eWNI_SME_DEL_STA_SELF_RSP:
2230 if (pMsg->bodyptr) {
2231 status = csr_process_del_sta_session_rsp(pMac,
2232 pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302233 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002234 } else {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002235 sme_err("Empty message for: %d", pMsg->type);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002236 }
2237 break;
2238 case eWNI_SME_REMAIN_ON_CHN_RSP:
2239 if (pMsg->bodyptr) {
2240 status = sme_remain_on_chn_rsp(pMac, pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302241 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002242 } else {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002243 sme_err("Empty message for: %d", pMsg->type);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002244 }
2245 break;
2246 case eWNI_SME_REMAIN_ON_CHN_RDY_IND:
2247 if (pMsg->bodyptr) {
2248 status = sme_remain_on_chn_ready(pMac, pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302249 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002250 } else {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002251 sme_err("Empty message for: %d", pMsg->type);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002252 }
2253 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002254 case eWNI_SME_CHANGE_COUNTRY_CODE:
2255 if (pMsg->bodyptr) {
2256 status = sme_handle_change_country_code((void *)pMac,
2257 pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302258 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002259 } else {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002260 sme_err("Empty message for: %d", pMsg->type);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002261 }
2262 break;
2263 case eWNI_SME_GENERIC_CHANGE_COUNTRY_CODE:
2264 if (pMsg->bodyptr) {
2265 status = sme_handle_generic_change_country_code(
2266 (void *)pMac, pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302267 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002268 } else {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002269 sme_err("Empty message for: %d", pMsg->type);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002270 }
2271 break;
2272 case eWNI_SME_SCAN_CMD:
2273 if (pMsg->bodyptr) {
2274 status = sme_handle_scan_req(pMac, pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302275 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002276 } else {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002277 sme_err("Empty message for: %d", pMsg->type);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002278 }
2279 break;
2280 case eWNI_SME_ROC_CMD:
2281 if (pMsg->bodyptr) {
2282 status = sme_handle_roc_req(hHal, pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302283 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002284 } else {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002285 sme_err("Empty message for: %d", pMsg->type);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002286 }
2287 break;
2288#ifdef FEATURE_WLAN_TDLS
2289 /*
2290 * command rescived from PE, SME tdls msg processor shall be called
2291 * to process commands recieved from PE
2292 */
2293 case eWNI_SME_TDLS_SEND_MGMT_RSP:
2294 case eWNI_SME_TDLS_ADD_STA_RSP:
2295 case eWNI_SME_TDLS_DEL_STA_RSP:
2296 case eWNI_SME_TDLS_DEL_STA_IND:
2297 case eWNI_SME_TDLS_DEL_ALL_PEER_IND:
2298 case eWNI_SME_MGMT_FRM_TX_COMPLETION_IND:
2299 case eWNI_SME_TDLS_LINK_ESTABLISH_RSP:
2300 case eWNI_SME_TDLS_SHOULD_DISCOVER:
2301 case eWNI_SME_TDLS_SHOULD_TEARDOWN:
2302 case eWNI_SME_TDLS_PEER_DISCONNECTED:
2303 if (pMsg->bodyptr) {
2304 status = tdls_msg_processor(pMac, pMsg->type,
2305 pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302306 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002307 } else {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002308 sme_err("Empty message for: %d", pMsg->type);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002309 }
2310 break;
2311#endif
2312#ifdef WLAN_FEATURE_11W
2313 case eWNI_SME_UNPROT_MGMT_FRM_IND:
2314 if (pMsg->bodyptr) {
2315 sme_unprotected_mgmt_frm_ind(pMac, pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302316 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002317 } else {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002318 sme_err("Empty message for: %d", pMsg->type);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002319 }
2320 break;
2321#endif
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08002322#ifdef FEATURE_WLAN_ESE
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002323 case eWNI_SME_TSM_IE_IND:
2324 if (pMsg->bodyptr) {
2325 sme_tsm_ie_ind(pMac, pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302326 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002327 } else {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002328 sme_err("Empty message for: %d", pMsg->type);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002329 }
2330 break;
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08002331#endif /* FEATURE_WLAN_ESE */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002332 case eWNI_SME_ROAM_SCAN_OFFLOAD_RSP:
2333 status = csr_roam_offload_scan_rsp_hdlr((void *)pMac,
2334 pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302335 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002336 break;
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08002337 case eWNI_SME_IBSS_PEER_INFO_RSP:
2338 if (pMsg->bodyptr) {
Jeff Johnson49c02f92016-10-07 10:29:09 -07002339 sme_ibss_peer_info_response_handler(pMac,
2340 pMsg->bodyptr);
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08002341 qdf_mem_free(pMsg->bodyptr);
2342 } else {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002343 sme_err("Empty message for: %d", pMsg->type);
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08002344 }
2345 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002346 case eWNI_SME_READY_TO_SUSPEND_IND:
2347 if (pMsg->bodyptr) {
2348 sme_process_ready_to_suspend(pMac, pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302349 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002350 } else {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002351 sme_err("Empty message for: %d", pMsg->type);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002352 }
2353 break;
2354#ifdef WLAN_FEATURE_EXTWOW_SUPPORT
2355 case eWNI_SME_READY_TO_EXTWOW_IND:
2356 if (pMsg->bodyptr) {
Krishna Kumaar Natarajand9131902015-10-19 11:52:47 -07002357 sme_process_ready_to_ext_wow(pMac, pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302358 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002359 } else {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002360 sme_err("Empty message for: %d", pMsg->type);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002361 }
2362 break;
2363#endif
2364#ifdef FEATURE_WLAN_CH_AVOID
2365 /* channel avoid message arrived, send IND to client */
2366 case eWNI_SME_CH_AVOID_IND:
Sreelakshmi Konamki6a065362016-05-31 16:05:01 +05302367 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_RX_WMA_MSG,
2368 NO_SESSION, pMsg->type));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002369 if (pMac->sme.pChAvoidNotificationCb) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302370 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002371 FL("CH avoid notification"));
2372 pMac->sme.pChAvoidNotificationCb(pMac->hHdd,
2373 pMsg->bodyptr);
2374 }
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302375 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002376 break;
2377#endif /* FEATURE_WLAN_CH_AVOID */
2378#ifdef FEATURE_WLAN_AUTO_SHUTDOWN
2379 case eWNI_SME_AUTO_SHUTDOWN_IND:
2380 if (pMac->sme.pAutoShutdownNotificationCb) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302381 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002382 FL("Auto shutdown notification"));
2383 pMac->sme.pAutoShutdownNotificationCb();
2384 }
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302385 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002386 break;
2387#endif
2388 case eWNI_SME_DFS_RADAR_FOUND:
Arif Hussaincd151632017-02-11 16:57:19 -08002389 case eWNI_SME_DFS_CAC_COMPLETE:
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002390 case eWNI_SME_DFS_CSAIE_TX_COMPLETE_IND:
Arif Hussaincd151632017-02-11 16:57:19 -08002391 status = dfs_msg_processor(pMac, pMsg);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302392 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002393 break;
2394 case eWNI_SME_CHANNEL_CHANGE_RSP:
2395 if (pMsg->bodyptr) {
2396 status = sme_process_channel_change_resp(pMac,
2397 pMsg->type,
2398 pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302399 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002400 } else {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002401 sme_err("Empty message for: %d", pMsg->type);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002402 }
2403 break;
2404#ifdef WLAN_FEATURE_STATS_EXT
2405 case eWNI_SME_STATS_EXT_EVENT:
2406 if (pMsg->bodyptr) {
2407 status = sme_stats_ext_event(hHal, pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302408 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002409 } else {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002410 sme_err("Empty message for: %d", pMsg->type);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002411 }
2412 break;
2413#endif
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002414 case eWNI_SME_CSA_OFFLOAD_EVENT:
2415 if (pMsg->bodyptr) {
2416 csr_scan_flush_bss_entry(pMac, pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302417 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002418 }
2419 break;
Manikandan Mohandcc21ba2016-03-15 14:31:56 -07002420 case eWNI_SME_TSF_EVENT:
2421 if (pMac->sme.get_tsf_cb) {
2422 pMac->sme.get_tsf_cb(pMac->sme.get_tsf_cxt,
2423 (struct stsf *)pMsg->bodyptr);
2424 }
2425 if (pMsg->bodyptr)
2426 qdf_mem_free(pMsg->bodyptr);
2427 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002428#ifdef WLAN_FEATURE_NAN
2429 case eWNI_SME_NAN_EVENT:
Sreelakshmi Konamki6a065362016-05-31 16:05:01 +05302430 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_RX_WMA_MSG,
2431 NO_SESSION, pMsg->type));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002432 if (pMsg->bodyptr) {
2433 sme_nan_event(hHal, pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302434 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002435 }
2436 break;
2437#endif /* WLAN_FEATURE_NAN */
2438 case eWNI_SME_LINK_STATUS_IND:
2439 {
2440 tAniGetLinkStatus *pLinkStatus =
2441 (tAniGetLinkStatus *) pMsg->bodyptr;
2442 if (pLinkStatus) {
2443 if (pMac->sme.linkStatusCallback) {
2444 pMac->sme.linkStatusCallback(
2445 pLinkStatus->linkStatus,
2446 pMac->sme.linkStatusContext);
2447 }
2448 pMac->sme.linkStatusCallback = NULL;
2449 pMac->sme.linkStatusContext = NULL;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302450 qdf_mem_free(pLinkStatus);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002451 }
2452 break;
2453 }
2454 case eWNI_SME_MSG_GET_TEMPERATURE_IND:
2455 if (pMac->sme.pGetTemperatureCb) {
2456 pMac->sme.pGetTemperatureCb(pMsg->bodyval,
2457 pMac->sme.pTemperatureCbContext);
2458 }
2459 break;
2460 case eWNI_SME_SNR_IND:
2461 {
2462 tAniGetSnrReq *pSnrReq = (tAniGetSnrReq *) pMsg->bodyptr;
2463 if (pSnrReq) {
2464 if (pSnrReq->snrCallback) {
2465 ((tCsrSnrCallback)
2466 (pSnrReq->snrCallback))
2467 (pSnrReq->snr, pSnrReq->staId,
2468 pSnrReq->pDevContext);
2469 }
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302470 qdf_mem_free(pSnrReq);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002471 }
2472 break;
2473 }
2474#ifdef FEATURE_WLAN_EXTSCAN
2475 case eWNI_SME_EXTSCAN_FULL_SCAN_RESULT_IND:
2476 if (pMac->sme.pExtScanIndCb)
2477 pMac->sme.pExtScanIndCb(pMac->hHdd,
2478 eSIR_EXTSCAN_FULL_SCAN_RESULT_IND,
2479 pMsg->bodyptr);
2480 else
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002481 sme_err("callback not registered to process: %d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002482 pMsg->type);
2483
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302484 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002485 break;
2486 case eWNI_SME_EPNO_NETWORK_FOUND_IND:
2487 if (pMac->sme.pExtScanIndCb)
2488 pMac->sme.pExtScanIndCb(pMac->hHdd,
2489 eSIR_EPNO_NETWORK_FOUND_IND,
2490 pMsg->bodyptr);
2491 else
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002492 sme_err("callback not registered to process: %d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002493 pMsg->type);
2494
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302495 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002496 break;
2497#endif
2498 case eWNI_SME_FW_DUMP_IND:
2499 sme_process_fw_mem_dump_rsp(pMac, pMsg);
2500 break;
2501 case eWNI_SME_SET_HW_MODE_RESP:
2502 if (pMsg->bodyptr) {
2503 status = sme_process_set_hw_mode_resp(pMac,
2504 pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302505 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002506 } else {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002507 sme_err("Empty message for: %d", pMsg->type);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002508 }
2509 break;
2510 case eWNI_SME_HW_MODE_TRANS_IND:
2511 if (pMsg->bodyptr) {
2512 status = sme_process_hw_mode_trans_ind(pMac,
2513 pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302514 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002515 } else {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002516 sme_err("Empty message for: %d", pMsg->type);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002517 }
2518 break;
2519 case eWNI_SME_NSS_UPDATE_RSP:
2520 if (pMsg->bodyptr) {
2521 status = sme_process_nss_update_resp(pMac,
2522 pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302523 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002524 } else {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002525 sme_err("Empty message for: %d", pMsg->type);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002526 }
2527 break;
2528 case eWNI_SME_OCB_SET_CONFIG_RSP:
2529 if (pMac->sme.ocb_set_config_callback) {
2530 pMac->sme.ocb_set_config_callback(
2531 pMac->sme.ocb_set_config_context,
2532 pMsg->bodyptr);
2533 } else {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002534 sme_err("No callback for Msg type: %d", pMsg->type);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002535 }
2536 pMac->sme.ocb_set_config_callback = NULL;
2537 pMac->sme.ocb_set_config_context = NULL;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302538 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002539 break;
2540 case eWNI_SME_OCB_GET_TSF_TIMER_RSP:
2541 if (pMac->sme.ocb_get_tsf_timer_callback) {
2542 pMac->sme.ocb_get_tsf_timer_callback(
2543 pMac->sme.ocb_get_tsf_timer_context,
2544 pMsg->bodyptr);
2545 } else {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002546 sme_err("No callback for Msg type: %d", pMsg->type);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002547 }
2548 pMac->sme.ocb_get_tsf_timer_callback = NULL;
2549 pMac->sme.ocb_get_tsf_timer_context = NULL;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302550 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002551 break;
2552 case eWNI_SME_DCC_GET_STATS_RSP:
2553 if (pMac->sme.dcc_get_stats_callback) {
2554 pMac->sme.dcc_get_stats_callback(
2555 pMac->sme.dcc_get_stats_context,
2556 pMsg->bodyptr);
2557 } else {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002558 sme_err("No callback for Msg type: %d", pMsg->type);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002559 }
2560 pMac->sme.dcc_get_stats_callback = NULL;
2561 pMac->sme.dcc_get_stats_context = NULL;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302562 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002563 break;
2564 case eWNI_SME_DCC_UPDATE_NDL_RSP:
2565 if (pMac->sme.dcc_update_ndl_callback) {
2566 pMac->sme.dcc_update_ndl_callback(
2567 pMac->sme.dcc_update_ndl_context,
2568 pMsg->bodyptr);
2569 } else {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002570 sme_err("No callback for Msg type: %d", pMsg->type);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002571 }
2572 pMac->sme.dcc_update_ndl_callback = NULL;
2573 pMac->sme.dcc_update_ndl_context = NULL;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302574 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002575 break;
2576 case eWNI_SME_DCC_STATS_EVENT:
2577 if (pMac->sme.dcc_stats_event_callback) {
2578 pMac->sme.dcc_stats_event_callback(
2579 pMac->sme.dcc_stats_event_context,
2580 pMsg->bodyptr);
2581 } else {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002582 sme_err("No callback for Msg type: %d", pMsg->type);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002583 }
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302584 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002585 break;
2586 case eWNI_SME_SET_DUAL_MAC_CFG_RESP:
2587 if (pMsg->bodyptr) {
2588 status = sme_process_dual_mac_config_resp(pMac,
2589 pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302590 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002591 } else {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002592 sme_err("Empty message for: %d", pMsg->type);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002593 }
2594 case eWNI_SME_SET_THERMAL_LEVEL_IND:
2595 if (pMac->sme.set_thermal_level_cb)
2596 pMac->sme.set_thermal_level_cb(pMac->hHdd,
2597 pMsg->bodyval);
2598 break;
Abhishek Singh518323d2015-10-19 17:42:01 +05302599 case eWNI_SME_EXT_CHANGE_CHANNEL_IND:
2600 status = sme_extended_change_channel_ind(pMac, pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302601 qdf_mem_free(pMsg->bodyptr);
Abhishek Singh518323d2015-10-19 17:42:01 +05302602 break;
Archana Ramachandrana20ef812015-11-13 16:12:13 -08002603 case eWNI_SME_SET_ANTENNA_MODE_RESP:
2604 if (pMsg->bodyptr) {
2605 status = sme_process_antenna_mode_resp(pMac,
2606 pMsg->bodyptr);
2607 qdf_mem_free(pMsg->bodyptr);
2608 } else {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002609 sme_err("Empty message for: %d", pMsg->type);
Archana Ramachandrana20ef812015-11-13 16:12:13 -08002610 }
2611 break;
Deepak Dhamdhere0f076bd2016-06-02 11:29:21 -07002612 case eWNI_SME_NDP_CONFIRM_IND:
2613 case eWNI_SME_NDP_NEW_PEER_IND:
2614 case eWNI_SME_NDP_INITIATOR_RSP:
Abhishek Singh4fef7472016-06-06 11:36:03 -07002615 case eWNI_SME_NDP_INDICATION:
2616 case eWNI_SME_NDP_RESPONDER_RSP:
Naveen Rawatf28315c2016-06-29 18:06:02 -07002617 case eWNI_SME_NDP_END_RSP:
Deepak Dhamdherea6d2f4c2016-06-04 00:24:52 -07002618 case eWNI_SME_NDP_END_IND:
2619 case eWNI_SME_NDP_PEER_DEPARTED_IND:
Deepak Dhamdhere0f076bd2016-06-02 11:29:21 -07002620 sme_ndp_msg_processor(pMac, pMsg);
2621 break;
Sreelakshmi Konamki58c72432016-11-09 17:06:44 +05302622 case eWNI_SME_LOST_LINK_INFO_IND:
2623 if (pMac->sme.lost_link_info_cb)
2624 pMac->sme.lost_link_info_cb(pMac->hHdd,
2625 (struct sir_lost_link_info *)pMsg->bodyptr);
2626 qdf_mem_free(pMsg->bodyptr);
2627 break;
Sreelakshmi Konamki88a2a412017-04-14 15:11:55 +05302628 case eWNI_SME_RSO_CMD_STATUS_IND:
2629 if (pMac->sme.rso_cmd_status_cb)
2630 pMac->sme.rso_cmd_status_cb(pMac->hHdd, pMsg->bodyptr);
Zhang Qiana6e9c102016-12-22 16:47:24 +08002631 case eWMI_SME_LL_STATS_IND:
2632 if (pMac->sme.link_layer_stats_ext_cb)
2633 pMac->sme.link_layer_stats_ext_cb(pMac->hHdd,
2634 pMsg->bodyptr);
Sreelakshmi Konamki88a2a412017-04-14 15:11:55 +05302635 qdf_mem_free(pMsg->bodyptr);
2636 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002637 default:
2638
2639 if ((pMsg->type >= eWNI_SME_MSG_TYPES_BEGIN)
2640 && (pMsg->type <= eWNI_SME_MSG_TYPES_END)) {
2641 /* CSR */
2642 if (pMsg->bodyptr) {
2643 status = csr_msg_processor(hHal, pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302644 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002645 } else {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002646 sme_err("Empty message for: %d", pMsg->type);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002647 }
2648 } else {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002649 sme_warn("Unknown message type: %d", pMsg->type);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002650 if (pMsg->bodyptr)
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302651 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002652 }
2653 } /* switch */
2654release_lock:
2655 sme_release_global_lock(&pMac->sme);
2656 return status;
2657}
2658
Krunal Sonid32c6bc2016-10-18 18:00:21 -07002659QDF_STATUS sme_mc_process_handler(struct scheduler_msg *msg)
2660{
2661 tpAniSirGlobal mac_ctx = cds_get_context(QDF_MODULE_ID_SME);
2662
2663 if (mac_ctx == NULL) {
2664 QDF_ASSERT(0);
2665 return QDF_STATUS_E_FAILURE;
2666 }
2667
Rajeev Kumar8eaedf62017-01-21 11:03:13 -08002668 return sme_process_msg((tHalHandle)mac_ctx, msg);
Krunal Sonid32c6bc2016-10-18 18:00:21 -07002669}
Krunal Sonid32c6bc2016-10-18 18:00:21 -07002670
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002671/**
2672 * sme_process_nss_update_resp() - Process nss update response
2673 * @mac: Global MAC pointer
2674 * @msg: nss update response
2675 *
2676 * Processes the nss update response and invokes the HDD
2677 * callback to process further
2678 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302679QDF_STATUS sme_process_nss_update_resp(tpAniSirGlobal mac, uint8_t *msg)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002680{
2681 tListElem *entry = NULL;
2682 tSmeCmd *command = NULL;
2683 bool found;
2684 nss_update_cb callback = NULL;
2685 struct sir_beacon_tx_complete_rsp *param;
2686
2687 param = (struct sir_beacon_tx_complete_rsp *)msg;
2688 if (!param) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002689 sme_err("nss update resp param is NULL");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002690 /* Not returning. Need to check if active command list
2691 * needs to be freed
2692 */
2693 }
2694
Krunal Sonia8270f52017-02-23 19:51:25 -08002695 entry = csr_nonscan_active_ll_peek_head(mac, LL_ACCESS_LOCK);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002696 if (!entry) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002697 sme_err("No cmd found in active list");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302698 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002699 }
2700
2701 command = GET_BASE_ADDR(entry, tSmeCmd, Link);
2702 if (!command) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002703 sme_err("Base address is NULL");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302704 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002705 }
2706
2707 if (e_sme_command_nss_update != command->command) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002708 sme_err("Command mismatch!");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302709 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002710 }
2711
2712 callback = command->u.nss_update_cmd.nss_update_cb;
2713 if (callback) {
2714 if (!param) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002715 sme_err("Callback failed since nss update params is NULL");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002716 } else {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002717 callback(command->u.nss_update_cmd.context,
2718 param->tx_status,
2719 param->session_id,
Chandrasekaran, Manishekarce2172e2016-02-18 16:12:43 +05302720 command->u.nss_update_cmd.next_action,
2721 command->u.nss_update_cmd.reason);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002722 }
2723 } else {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002724 sme_err("Callback does not exisit");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002725 }
2726
Krunal Soni72dba662017-02-15 20:13:17 -08002727 found = csr_nonscan_active_ll_remove_entry(mac, entry, LL_ACCESS_LOCK);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002728 if (found) {
2729 /* Now put this command back on the avilable command list */
Krunal Soni78618d92017-02-14 21:46:31 -08002730 csr_release_command(mac, command);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002731 }
Krunal Sonia8270f52017-02-23 19:51:25 -08002732
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302733 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002734}
2735
2736/* No need to hold the global lock here because this function can only be called */
2737/* after sme_stop. */
Rajeev Kumar8eaedf62017-01-21 11:03:13 -08002738void sme_free_msg(tHalHandle hHal, struct scheduler_msg *pMsg)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002739{
2740 if (pMsg) {
2741 if (pMsg->bodyptr) {
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302742 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002743 }
2744 }
2745
2746}
2747
2748/*--------------------------------------------------------------------------
2749
2750 \brief sme_stop() - Stop all SME modules and put them at idle state
2751
2752 The function stops each module in SME, PMC, CSR, etc. . Upon
2753 return, all modules are at idle state ready to start.
2754
2755 This is a synchronous call
2756 \param hHal - The handle returned by mac_open
2757 \param tHalStopType - reason for stopping
2758
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302759 \return QDF_STATUS_SUCCESS - SME is stopped.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002760
2761 Other status means SME is failed to stop but caller should still
2762 consider SME is stopped.
2763 \sa
2764
2765 --------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302766QDF_STATUS sme_stop(tHalHandle hHal, tHalStopType stopType)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002767{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302768 QDF_STATUS status = QDF_STATUS_E_FAILURE;
2769 QDF_STATUS fail_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002770 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
2771
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002772 p2p_stop(hHal);
2773
2774 status = csr_stop(pMac, stopType);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302775 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002776 sme_err("csr_stop failed with status: %d", status);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002777 fail_status = status;
2778 }
2779
2780 purge_sme_cmd_list(pMac);
2781
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302782 if (!QDF_IS_STATUS_SUCCESS(fail_status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002783 status = fail_status;
2784 }
2785
2786 pMac->sme.state = SME_STATE_STOP;
2787
2788 return status;
2789}
2790
2791/*--------------------------------------------------------------------------
2792
2793 \brief sme_close() - Release all SME modules and their resources.
2794
2795 The function release each module in SME, PMC, CSR, etc. . Upon
2796 return, all modules are at closed state.
2797
2798 No SME APIs can be involved after smeClose except smeOpen.
2799 smeClose must be called before mac_close.
2800 This is a synchronous call
2801 \param hHal - The handle returned by mac_open
2802
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302803 \return QDF_STATUS_SUCCESS - SME is successfully close.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002804
2805 Other status means SME is failed to be closed but caller still cannot
2806 call any other SME functions except smeOpen.
2807 \sa
2808
2809 --------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302810QDF_STATUS sme_close(tHalHandle hHal)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002811{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302812 QDF_STATUS status = QDF_STATUS_E_FAILURE;
2813 QDF_STATUS fail_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002814 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
2815
2816 if (!pMac)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302817 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002818
2819 /* Note: pSession will be invalid from here on, do not access */
2820 status = csr_close(pMac);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302821 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002822 sme_err("csr_close failed with status: %d", status);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002823 fail_status = status;
2824 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002825#ifndef WLAN_MDM_CODE_REDUCTION_OPT
2826 status = sme_qos_close(pMac);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302827 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002828 sme_err("Qos close failed with status: %d", status);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002829 fail_status = status;
2830 }
2831#endif
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002832 status = sme_ps_close(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302833 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002834 sme_err("sme_ps_close failed status: %d", status);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002835 fail_status = status;
2836 }
2837
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002838 status = rrm_close(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302839 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002840 sme_err("RRM close failed with status: %d", status);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002841 fail_status = status;
2842 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002843
2844 sme_p2p_close(hHal);
2845
2846 free_sme_cmd_list(pMac);
2847
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302848 if (!QDF_IS_STATUS_SUCCESS
Anurag Chouhana37b5b72016-02-21 14:53:42 +05302849 (qdf_mutex_destroy(&pMac->sme.lkSmeGlobalLock))) {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302850 fail_status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002851 }
2852
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302853 if (!QDF_IS_STATUS_SUCCESS(fail_status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002854 status = fail_status;
2855 }
2856
2857 pMac->sme.state = SME_STATE_STOP;
2858
2859 return status;
2860}
2861
2862/**
Abhishek Singhc9941602016-08-09 16:06:22 +05302863 * sme_remove_bssid_from_scan_list() - wrapper to remove the bssid from
2864 * scan list
2865 * @hal: hal context.
2866 * @bssid: bssid to be removed
2867 *
2868 * This function remove the given bssid from scan list.
2869 *
2870 * Return: QDF status.
2871 */
2872QDF_STATUS sme_remove_bssid_from_scan_list(tHalHandle hal,
2873 tSirMacAddr bssid)
2874{
2875 QDF_STATUS status = QDF_STATUS_E_FAILURE;
2876 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
2877
2878 status = sme_acquire_global_lock(&mac_ctx->sme);
2879 if (QDF_IS_STATUS_SUCCESS(status)) {
2880 csr_remove_bssid_from_scan_list(mac_ctx, bssid);
2881 sme_release_global_lock(&mac_ctx->sme);
2882 }
2883
2884 return status;
2885}
2886
Sandeep Puligilla0806e0f2017-03-06 19:25:47 -08002887#ifndef NAPIER_SCAN
Abhishek Singhc9941602016-08-09 16:06:22 +05302888/**
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002889 * sme_scan_request() - wrapper function to Request a 11d or full scan from CSR.
2890 * @hal: hal global context
2891 * @session_id: session id
2892 * @scan_req: scan req
2893 * @callback: a callback function that scan calls upon finish, will not
2894 * be called if csr_scan_request returns error
2895 * @ctx: a pointer passed in for the callback
2896 *
2897 * This is a wrapper function to Request a 11d or full scan from CSR. This is
2898 * an asynchronous call
2899 *
2900 * Return: Status of operation
2901 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302902QDF_STATUS sme_scan_request(tHalHandle hal, uint8_t session_id,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002903 tCsrScanRequest *scan_req,
2904 csr_scan_completeCallback callback, void *ctx)
2905{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302906 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002907 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
2908 struct ani_scan_req *scan_msg;
Rajeev Kumar37d478b2017-04-17 16:59:28 -07002909 struct scheduler_msg msg = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002910 uint32_t scan_req_id, scan_count;
2911
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302912 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002913 TRACE_CODE_SME_RX_HDD_MSG_SCAN_REQ, session_id,
2914 scan_req->scanType));
Chandrasekaran, Manishekar2859de42016-02-11 16:17:38 +05302915
2916 if (!CSR_IS_SESSION_VALID(mac_ctx, session_id)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002917 sme_err("Invalid session id: %d", session_id);
Chandrasekaran, Manishekar2859de42016-02-11 16:17:38 +05302918 return status;
2919 }
2920
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002921 if (!mac_ctx->scan.fScanEnable) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002922 sme_err("fScanEnable false");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002923 return status;
2924 }
2925
Krunal Soni81f068c2017-02-23 19:51:55 -08002926 scan_count = csr_scan_active_ll_count(mac_ctx);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002927 if (scan_count >= mac_ctx->scan.max_scan_count) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002928 sme_err("Max scan reached");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302929 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002930 }
2931 wma_get_scan_id(&scan_req_id);
2932 scan_req->scan_id = scan_req_id;
2933
2934 status = sme_acquire_global_lock(&mac_ctx->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302935 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002936 sme_err("Unable to acquire lock");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002937 return status;
2938 }
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302939 scan_msg = qdf_mem_malloc(sizeof(struct ani_scan_req));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002940 if (NULL == scan_msg) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002941 sme_err("Failed to allocate memory for scan_msg");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002942 sme_release_global_lock(&mac_ctx->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302943 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002944 }
2945 scan_msg->msg_type = eWNI_SME_SCAN_CMD;
2946 scan_msg->msg_len = (uint16_t) sizeof(struct ani_scan_req);
2947 scan_msg->session_id = session_id;
2948 scan_msg->callback = callback;
2949 scan_msg->ctx = ctx;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302950 scan_msg->scan_param = qdf_mem_malloc(sizeof(tCsrScanRequest));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002951 if (NULL == scan_msg->scan_param) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002952 sme_err("Failed to allocate memory for scan_param");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002953 sme_release_global_lock(&mac_ctx->sme);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302954 qdf_mem_free(scan_msg);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302955 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002956 }
2957 csr_scan_copy_request(mac_ctx, scan_msg->scan_param, scan_req);
2958 msg.type = eWNI_SME_SCAN_CMD;
2959 msg.bodyptr = scan_msg;
2960 msg.reserved = 0;
2961 msg.bodyval = 0;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302962 if (QDF_STATUS_SUCCESS !=
Rajeev Kumar8eaedf62017-01-21 11:03:13 -08002963 scheduler_post_msg(QDF_MODULE_ID_SME, &msg)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002964 sme_err("sme_scan_req failed to post msg");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002965 csr_scan_free_request(mac_ctx, scan_msg->scan_param);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302966 qdf_mem_free(scan_msg->scan_param);
2967 qdf_mem_free(scan_msg);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302968 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002969 }
2970 sme_release_global_lock(&mac_ctx->sme);
2971 return status;
2972}
Sandeep Puligilla0806e0f2017-03-06 19:25:47 -08002973#else
2974QDF_STATUS sme_scan_request(tHalHandle hal, uint8_t session_id,
2975 tCsrScanRequest *scan_req,
2976 csr_scan_completeCallback callback, void *ctx)
2977{
2978 return QDF_STATUS_SUCCESS;
2979}
2980#endif
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002981
2982/* ---------------------------------------------------------------------------
2983 \fn sme_scan_get_result
2984 \brief a wrapper function to request scan results from CSR.
2985 This is a synchronous call
2986 \param pFilter - If pFilter is NULL, all cached results are returned
2987 \param phResult - an object for the result.
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302988 \return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002989 ---------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302990QDF_STATUS sme_scan_get_result(tHalHandle hHal, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002991 tCsrScanResultFilter *pFilter,
2992 tScanResultHandle *phResult)
2993{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302994 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002995 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
2996
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302997 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002998 TRACE_CODE_SME_RX_HDD_MSG_SCAN_GET_RESULTS, sessionId,
2999 0));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003000 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303001 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003002 status = csr_scan_get_result(hHal, pFilter, phResult);
3003 sme_release_global_lock(&pMac->sme);
3004 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003005
3006 return status;
3007}
3008
3009/**
Archana Ramachandran2eb7a612017-03-23 22:58:42 -07003010 * sme_get_ap_channel_from_scan() - a wrapper function to get
3011 * AP's channel id from
3012 * CSR by filtering the
3013 * result which matches
3014 * our roam profile.
3015 * @profile: SAP profile
3016 * @ap_chnl_id: pointer to channel id of SAP. Fill the value after finding the
3017 * best ap from scan cache.
3018 *
3019 * This function is written to get AP's channel id from CSR by filtering
3020 * the result which matches our roam profile. This is a synchronous call.
3021 *
3022 * Return: QDF_STATUS.
3023 */
3024QDF_STATUS sme_get_ap_channel_from_scan(void *profile,
3025 tScanResultHandle *scan_cache,
3026 uint8_t *ap_chnl_id)
3027{
3028 return sme_get_ap_channel_from_scan_cache((tCsrRoamProfile *)
3029 profile,
3030 scan_cache,
3031 ap_chnl_id);
3032}
3033
3034/**
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003035 * sme_get_ap_channel_from_scan_cache() - a wrapper function to get AP's
3036 * channel id from CSR by filtering the
3037 * result which matches our roam profile.
3038 * @profile: SAP adapter
3039 * @ap_chnl_id: pointer to channel id of SAP. Fill the value after finding the
3040 * best ap from scan cache.
3041 *
3042 * This function is written to get AP's channel id from CSR by filtering
3043 * the result which matches our roam profile. This is a synchronous call.
3044 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303045 * Return: QDF_STATUS.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003046 */
Archana Ramachandran2eb7a612017-03-23 22:58:42 -07003047QDF_STATUS sme_get_ap_channel_from_scan_cache(
3048 tCsrRoamProfile *profile, tScanResultHandle *scan_cache,
3049 uint8_t *ap_chnl_id)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003050{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303051 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Archana Ramachandran2eb7a612017-03-23 22:58:42 -07003052 tpAniSirGlobal mac_ctx = sme_get_mac_context();
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003053 tCsrScanResultFilter *scan_filter = NULL;
3054 tScanResultHandle filtered_scan_result = NULL;
3055 tSirBssDescription first_ap_profile;
3056
3057 if (NULL == mac_ctx) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303058 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003059 FL("mac_ctx is NULL"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303060 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003061 }
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303062 scan_filter = qdf_mem_malloc(sizeof(tCsrScanResultFilter));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003063 if (NULL == scan_filter) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303064 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003065 FL("scan_filter mem alloc failed"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303066 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003067 } else {
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303068 qdf_mem_set(&first_ap_profile, sizeof(tSirBssDescription), 0);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003069
3070 if (NULL == profile) {
3071 scan_filter->EncryptionType.numEntries = 1;
3072 scan_filter->EncryptionType.encryptionType[0]
3073 = eCSR_ENCRYPT_TYPE_NONE;
3074 } else {
3075 /* Here is the profile we need to connect to */
3076 status = csr_roam_prepare_filter_from_profile(mac_ctx,
3077 profile,
3078 scan_filter);
3079 }
3080
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303081 if (QDF_STATUS_SUCCESS == status) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003082 /* Save the WPS info */
3083 if (NULL != profile) {
3084 scan_filter->bWPSAssociation =
3085 profile->bWPSAssociation;
3086 scan_filter->bOSENAssociation =
3087 profile->bOSENAssociation;
3088 } else {
3089 scan_filter->bWPSAssociation = 0;
3090 scan_filter->bOSENAssociation = 0;
3091 }
3092 } else {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303093 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003094 FL("Preparing the profile filter failed"));
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303095 qdf_mem_free(scan_filter);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303096 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003097 }
3098 }
3099 status = sme_acquire_global_lock(&mac_ctx->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303100 if (QDF_STATUS_SUCCESS == status) {
Archana Ramachandran2eb7a612017-03-23 22:58:42 -07003101 status = csr_scan_get_result(mac_ctx, scan_filter,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003102 &filtered_scan_result);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303103 if (QDF_STATUS_SUCCESS == status) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003104 csr_get_bssdescr_from_scan_handle(filtered_scan_result,
3105 &first_ap_profile);
3106 *scan_cache = filtered_scan_result;
3107 if (0 != first_ap_profile.channelId) {
3108 *ap_chnl_id = first_ap_profile.channelId;
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303109 QDF_TRACE(QDF_MODULE_ID_SME,
3110 QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003111 FL("Found best AP & its on chnl[%d]"),
3112 first_ap_profile.channelId);
3113 } else {
3114 /*
3115 * This means scan result is empty
3116 * so set the channel to zero, caller should
3117 * take of zero channel id case.
3118 */
3119 *ap_chnl_id = 0;
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303120 QDF_TRACE(QDF_MODULE_ID_SME,
3121 QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003122 FL("Scan is empty, set chnl to 0"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303123 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003124 }
3125 } else {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303126 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003127 FL("Failed to get scan get result"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303128 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003129 }
3130 csr_free_scan_filter(mac_ctx, scan_filter);
3131 sme_release_global_lock(&mac_ctx->sme);
3132 } else {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303133 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003134 FL("Aquiring lock failed"));
Krunal Sonif9882222016-01-22 17:16:50 -08003135 csr_free_scan_filter(mac_ctx, scan_filter);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303136 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003137 }
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303138 qdf_mem_free(scan_filter);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003139 return status;
3140}
3141
3142/**
3143 * sme_store_joinreq_param() - This function will pass station's join
3144 * request to store to csr.
3145 * @hal_handle: pointer to hal context.
3146 * @profile: pointer to station's roam profile.
3147 * @scan_cache: pointer to station's scan cache.
3148 * @roam_id: reference to roam_id variable being passed.
3149 * @session_id: station's session id.
3150 *
3151 * This function will pass station's join request further down to csr
3152 * to store it. this stored parameter will be used later.
3153 *
3154 * Return: true or false based on function's overall success.
3155 **/
3156bool sme_store_joinreq_param(tHalHandle hal_handle,
3157 tCsrRoamProfile *profile,
3158 tScanResultHandle scan_cache,
3159 uint32_t *roam_id,
3160 uint32_t session_id)
3161{
3162 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal_handle);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303163 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003164 bool ret_status = true;
3165
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303166 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003167 TRACE_CODE_SME_RX_HDD_STORE_JOIN_REQ,
3168 session_id, 0));
3169 status = sme_acquire_global_lock(&mac_ctx->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303170 if (QDF_STATUS_SUCCESS == status) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003171 if (false == csr_store_joinreq_param(mac_ctx, profile,
3172 scan_cache, roam_id, session_id)) {
3173 ret_status = false;
3174 }
3175 sme_release_global_lock(&mac_ctx->sme);
3176 } else {
3177 ret_status = false;
3178 }
3179
3180 return ret_status;
3181}
3182
3183/**
3184 * sme_clear_joinreq_param() - This function will pass station's clear
3185 * the join request to csr.
3186 * @hal_handle: pointer to hal context.
3187 * @session_id: station's session id.
3188 *
3189 * This function will pass station's clear join request further down to csr
3190 * to cleanup.
3191 *
3192 * Return: true or false based on function's overall success.
3193 **/
3194bool sme_clear_joinreq_param(tHalHandle hal_handle,
3195 uint32_t session_id)
3196{
3197 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal_handle);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303198 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003199 bool ret_status = true;
3200
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303201 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003202 TRACE_CODE_SME_RX_HDD_CLEAR_JOIN_REQ,
3203 session_id, 0));
3204 status = sme_acquire_global_lock(&mac_ctx->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303205 if (QDF_STATUS_SUCCESS == status) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003206 if (false == csr_clear_joinreq_param(mac_ctx,
3207 session_id)) {
3208 ret_status = false;
3209 }
3210 sme_release_global_lock(&mac_ctx->sme);
3211 } else {
3212 ret_status = false;
3213 }
3214
3215 return ret_status;
3216}
3217
3218/**
3219 * sme_issue_stored_joinreq() - This function will issues station's stored
3220 * the join request to csr.
3221 * @hal_handle: pointer to hal context.
3222 * @roam_id: reference to roam_id variable being passed.
3223 * @session_id: station's session id.
3224 *
3225 * This function will issue station's stored join request further down to csr
3226 * to proceed forward.
3227 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303228 * Return: QDF_STATUS_SUCCESS or QDF_STATUS_E_FAILURE.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003229 **/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303230QDF_STATUS sme_issue_stored_joinreq(tHalHandle hal_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003231 uint32_t *roam_id,
3232 uint32_t session_id)
3233{
3234 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal_handle);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303235 QDF_STATUS status = QDF_STATUS_E_FAILURE;
3236 QDF_STATUS ret_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003237
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303238 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003239 TRACE_CODE_SME_RX_HDD_ISSUE_JOIN_REQ,
3240 session_id, 0));
3241 status = sme_acquire_global_lock(&mac_ctx->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303242 if (QDF_STATUS_SUCCESS == status) {
3243 if (QDF_STATUS_SUCCESS != csr_issue_stored_joinreq(mac_ctx,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003244 roam_id,
3245 session_id)) {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303246 ret_status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003247 }
3248 sme_release_global_lock(&mac_ctx->sme);
3249 } else {
3250 csr_clear_joinreq_param(mac_ctx, session_id);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303251 ret_status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003252 }
3253 return ret_status;
3254}
3255
3256/* ---------------------------------------------------------------------------
3257 \fn sme_scan_flush_result
3258 \brief a wrapper function to request CSR to clear scan results.
3259 This is a synchronous call
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303260 \return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003261 ---------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303262QDF_STATUS sme_scan_flush_result(tHalHandle hHal)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003263{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303264 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003265 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
3266
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303267 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003268 TRACE_CODE_SME_RX_HDD_MSG_SCAN_FLUSH_RESULTS,
3269 0, 0));
3270 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303271 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003272 status = csr_scan_flush_result(hHal);
3273 sme_release_global_lock(&pMac->sme);
3274 }
3275
3276 return status;
3277}
3278
3279/* ---------------------------------------------------------------------------
3280 \fn sme_filter_scan_results
3281 \brief a wrapper function to request CSR to clear scan results.
3282 This is a synchronous call
3283 \param tHalHandle - HAL context handle
3284 \param sessionId - session id
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303285 \return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003286 ---------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303287QDF_STATUS sme_filter_scan_results(tHalHandle hHal, uint8_t sessionId)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003288{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303289 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003290 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
3291
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303292 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003293 TRACE_CODE_SME_RX_HDD_MSG_SCAN_FLUSH_RESULTS,
3294 sessionId, 0));
3295 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303296 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003297 csr_scan_filter_results(pMac);
3298 sme_release_global_lock(&pMac->sme);
3299 }
3300
3301 return status;
3302}
3303
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303304QDF_STATUS sme_scan_flush_p2p_result(tHalHandle hHal, uint8_t sessionId)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003305{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303306 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003307 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
3308
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303309 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003310 TRACE_CODE_SME_RX_HDD_MSG_SCAN_FLUSH_P2PRESULTS,
3311 sessionId, 0));
3312 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303313 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003314 status = csr_scan_flush_selective_result(hHal, true);
3315 sme_release_global_lock(&pMac->sme);
3316 }
3317
3318 return status;
3319}
3320
3321/* ---------------------------------------------------------------------------
3322 \fn sme_scan_result_get_first
3323 \brief a wrapper function to request CSR to returns the first element of
3324 scan result.
3325 This is a synchronous call
3326 \param hScanResult - returned from csr_scan_get_result
3327 \return tCsrScanResultInfo * - NULL if no result
3328 ---------------------------------------------------------------------------*/
3329tCsrScanResultInfo *sme_scan_result_get_first(tHalHandle hHal,
3330 tScanResultHandle hScanResult)
3331{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303332 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003333 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
3334 tCsrScanResultInfo *pRet = NULL;
3335
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303336 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003337 TRACE_CODE_SME_RX_HDD_MSG_SCAN_RESULT_GETFIRST,
3338 NO_SESSION, 0));
3339 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303340 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003341 pRet = csr_scan_result_get_first(pMac, hScanResult);
3342 sme_release_global_lock(&pMac->sme);
3343 }
3344
3345 return pRet;
3346}
3347
3348/* ---------------------------------------------------------------------------
3349 \fn sme_scan_result_get_next
3350 \brief a wrapper function to request CSR to returns the next element of
3351 scan result. It can be called without calling csr_scan_result_get_first
3352 first
3353 This is a synchronous call
3354 \param hScanResult - returned from csr_scan_get_result
3355 \return Null if no result or reach the end
3356 ---------------------------------------------------------------------------*/
3357tCsrScanResultInfo *sme_scan_result_get_next(tHalHandle hHal,
3358 tScanResultHandle hScanResult)
3359{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303360 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003361 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
3362 tCsrScanResultInfo *pRet = NULL;
3363
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003364 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303365 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003366 pRet = csr_scan_result_get_next(pMac, hScanResult);
3367 sme_release_global_lock(&pMac->sme);
3368 }
3369
3370 return pRet;
3371}
3372
3373/* ---------------------------------------------------------------------------
3374 \fn sme_scan_result_purge
3375 \brief a wrapper function to request CSR to remove all items(tCsrScanResult)
3376 in the list and free memory for each item
3377 This is a synchronous call
3378 \param hScanResult - returned from csr_scan_get_result. hScanResult is
3379 considered gone by
3380 calling this function and even before this function reutrns.
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303381 \return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003382 ---------------------------------------------------------------------------*/
Archana Ramachandran2eb7a612017-03-23 22:58:42 -07003383QDF_STATUS sme_scan_result_purge(tScanResultHandle hScanResult)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003384{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303385 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Archana Ramachandran2eb7a612017-03-23 22:58:42 -07003386 tpAniSirGlobal mac_ctx = sme_get_mac_context();
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003387
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303388 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003389 TRACE_CODE_SME_RX_HDD_MSG_SCAN_RESULT_PURGE,
3390 NO_SESSION, 0));
Archana Ramachandran2eb7a612017-03-23 22:58:42 -07003391 status = sme_acquire_global_lock(&mac_ctx->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303392 if (QDF_IS_STATUS_SUCCESS(status)) {
Archana Ramachandran2eb7a612017-03-23 22:58:42 -07003393 status = csr_scan_result_purge(mac_ctx, hScanResult);
3394 sme_release_global_lock(&mac_ctx->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003395 }
3396
3397 return status;
3398}
3399
3400/* ---------------------------------------------------------------------------
3401 \fn sme_scan_get_pmkid_candidate_list
3402 \brief a wrapper function to return the PMKID candidate list
3403 This is a synchronous call
3404 \param pPmkidList - caller allocated buffer point to an array of
3405 tPmkidCandidateInfo
3406 \param pNumItems - pointer to a variable that has the number of
3407 tPmkidCandidateInfo allocated when retruning, this is
3408 either the number needed or number of items put into
3409 pPmkidList
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303410 \return QDF_STATUS - when fail, it usually means the buffer allocated is not
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003411 big enough and pNumItems
3412 has the number of tPmkidCandidateInfo.
3413 \Note: pNumItems is a number of tPmkidCandidateInfo,
3414 not sizeof(tPmkidCandidateInfo) * something
3415 ---------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303416QDF_STATUS sme_scan_get_pmkid_candidate_list(tHalHandle hHal, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003417 tPmkidCandidateInfo *pPmkidList,
3418 uint32_t *pNumItems)
3419{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303420 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003421 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
3422
3423 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303424 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003425 status =
3426 csr_scan_get_pmkid_candidate_list(pMac, sessionId,
3427 pPmkidList,
3428 pNumItems);
3429 sme_release_global_lock(&pMac->sme);
3430 }
3431
3432 return status;
3433}
3434
3435eCsrPhyMode sme_get_phy_mode(tHalHandle hHal)
3436{
3437 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
3438 return pMac->roam.configParam.phyMode;
3439}
3440
3441/* ---------------------------------------------------------------------------
3442 \fn sme_get_channel_bonding_mode5_g
3443 \brief get the channel bonding mode for 5G band
3444 \param hHal - HAL handle
3445 \return channel bonding mode for 5G
3446 ---------------------------------------------------------------------------*/
3447uint32_t sme_get_channel_bonding_mode5_g(tHalHandle hHal)
3448{
3449 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
3450 tSmeConfigParams smeConfig;
3451
3452 sme_get_config_param(pMac, &smeConfig);
3453
3454 return smeConfig.csrConfig.channelBondingMode5GHz;
3455}
3456
3457/* ---------------------------------------------------------------------------
3458 \fn sme_get_channel_bonding_mode24_g
3459 \brief get the channel bonding mode for 2.4G band
3460 \param hHal - HAL handle
3461 \return channel bonding mode for 2.4G
3462 ---------------------------------------------------------------------------*/
3463uint32_t sme_get_channel_bonding_mode24_g(tHalHandle hHal)
3464{
3465 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
3466 tSmeConfigParams smeConfig;
3467
3468 sme_get_config_param(pMac, &smeConfig);
3469
3470 return smeConfig.csrConfig.channelBondingMode24GHz;
3471}
3472
3473/* ---------------------------------------------------------------------------
3474 \fn sme_roam_connect
3475 \brief a wrapper function to request CSR to inititiate an association
3476 This is an asynchronous call.
3477 \param sessionId - the sessionId returned by sme_open_session.
3478 \param pProfile - description of the network to which to connect
3479 \param hBssListIn - a list of BSS descriptor to roam to. It is returned
3480 from csr_scan_get_result
3481 \param pRoamId - to get back the request ID
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303482 \return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003483 ---------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303484QDF_STATUS sme_roam_connect(tHalHandle hHal, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003485 tCsrRoamProfile *pProfile, uint32_t *pRoamId)
3486{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303487 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003488 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
3489
3490 if (!pMac) {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303491 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003492 }
3493
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303494 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003495 TRACE_CODE_SME_RX_HDD_MSG_CONNECT, sessionId, 0));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003496 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303497 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003498 if (CSR_IS_SESSION_VALID(pMac, sessionId)) {
3499 status =
3500 csr_roam_connect(pMac, sessionId, pProfile,
3501 pRoamId);
3502 } else {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07003503 sme_err("Invalid sessionID: %d", sessionId);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303504 status = QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003505 }
3506 sme_release_global_lock(&pMac->sme);
3507 } else {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07003508 sme_err("sme_acquire_global_lock failed");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003509 }
3510
3511 return status;
3512}
3513
3514/* ---------------------------------------------------------------------------
3515
3516 \fn sme_set_phy_mode
3517
3518 \brief Changes the PhyMode.
3519
3520 \param hHal - The handle returned by mac_open.
3521
3522 \param phyMode new phyMode which is to set
3523
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303524 \return QDF_STATUS SUCCESS.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003525
3526 -------------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303527QDF_STATUS sme_set_phy_mode(tHalHandle hHal, eCsrPhyMode phyMode)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003528{
3529 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
3530
3531 if (NULL == pMac) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303532 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003533 "%s: invalid context", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303534 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003535 }
3536
3537 pMac->roam.configParam.phyMode = phyMode;
3538 pMac->roam.configParam.uCfgDot11Mode =
3539 csr_get_cfg_dot11_mode_from_csr_phy_mode(NULL,
3540 pMac->roam.configParam.phyMode,
3541 pMac->roam.configParam.
3542 ProprietaryRatesEnabled);
3543
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303544 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003545}
3546
3547/* ---------------------------------------------------------------------------
3548 \fn sme_roam_reassoc
3549 \brief a wrapper function to request CSR to inititiate a re-association
3550 \param pProfile - can be NULL to join the currently connected AP. In that
3551 case modProfileFields should carry the modified field(s) which could trigger
3552 reassoc
3553 \param modProfileFields - fields which are part of tCsrRoamConnectedProfile
3554 that might need modification dynamically once STA is up & running and this
3555 could trigger a reassoc
3556 \param pRoamId - to get back the request ID
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303557 \return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003558 -------------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303559QDF_STATUS sme_roam_reassoc(tHalHandle hHal, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003560 tCsrRoamProfile *pProfile,
3561 tCsrRoamModifyProfileFields modProfileFields,
3562 uint32_t *pRoamId, bool fForce)
3563{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303564 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003565 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
3566
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303567 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003568 TRACE_CODE_SME_RX_HDD_ROAM_REASSOC, sessionId, 0));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003569 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303570 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003571 if (CSR_IS_SESSION_VALID(pMac, sessionId)) {
3572 if ((NULL == pProfile) && (fForce == 1)) {
3573 status =
3574 csr_reassoc(pMac, sessionId,
3575 &modProfileFields, pRoamId,
3576 fForce);
3577 } else {
3578 status =
3579 csr_roam_reassoc(pMac, sessionId, pProfile,
3580 modProfileFields, pRoamId);
3581 }
3582 } else {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303583 status = QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003584 }
3585 sme_release_global_lock(&pMac->sme);
3586 }
3587
3588 return status;
3589}
3590
3591/* ---------------------------------------------------------------------------
3592 \fn sme_roam_connect_to_last_profile
3593 \brief a wrapper function to request CSR to disconnect and reconnect with
3594 the same profile
3595 This is an asynchronous call.
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303596 \return QDF_STATUS. It returns fail if currently connected
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003597 ---------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303598QDF_STATUS sme_roam_connect_to_last_profile(tHalHandle hHal, uint8_t sessionId)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003599{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303600 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003601 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
3602
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303603 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003604 TRACE_CODE_SME_RX_HDD_ROAM_GET_CONNECTPROFILE,
3605 sessionId, 0));
3606 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303607 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003608 if (CSR_IS_SESSION_VALID(pMac, sessionId)) {
3609 status = csr_roam_connect_to_last_profile(pMac, sessionId);
3610 } else {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303611 status = QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003612 }
3613 sme_release_global_lock(&pMac->sme);
3614 }
3615
3616 return status;
3617}
3618
3619/* ---------------------------------------------------------------------------
3620 \fn sme_roam_disconnect
3621 \brief a wrapper function to request CSR to disconnect from a network
3622 This is an asynchronous call.
3623 \param reason -- To indicate the reason for disconnecting. Currently, only
3624 eCSR_DISCONNECT_REASON_MIC_ERROR is meanful.
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303625 \return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003626 ---------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303627QDF_STATUS sme_roam_disconnect(tHalHandle hHal, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003628 eCsrRoamDisconnectReason reason)
3629{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303630 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003631 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
3632
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303633 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003634 TRACE_CODE_SME_RX_HDD_ROAM_DISCONNECT, sessionId,
3635 reason));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003636 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303637 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003638 if (CSR_IS_SESSION_VALID(pMac, sessionId)) {
3639 status = csr_roam_disconnect(pMac, sessionId, reason);
3640 } else {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303641 status = QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003642 }
3643 sme_release_global_lock(&pMac->sme);
3644 }
3645
3646 return status;
3647}
3648
Abhishek Singhca408032016-09-13 15:26:12 +05303649/* sme_dhcp_done_ind() - send dhcp done ind
3650 * @hal: hal context
3651 * @session_id: session id
3652 *
3653 * Return: void.
3654 */
3655void sme_dhcp_done_ind(tHalHandle hal, uint8_t session_id)
3656{
3657 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
3658 tCsrRoamSession *session;
3659
3660 if (!mac_ctx)
3661 return;
3662
3663 session = CSR_GET_SESSION(mac_ctx, session_id);
3664 if (!session) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07003665 sme_err("Session: %d not found", session_id);
Abhishek Singhca408032016-09-13 15:26:12 +05303666 return;
3667 }
3668 session->dhcp_done = true;
3669}
3670
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003671/* ---------------------------------------------------------------------------
3672 \fn sme_roam_stop_bss
3673 \brief To stop BSS for Soft AP. This is an asynchronous API.
3674 \param hHal - Global structure
3675 \param sessionId - sessionId of SoftAP
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303676 \return QDF_STATUS SUCCESS Roam callback will be called to indicate actual results
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003677 -------------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303678QDF_STATUS sme_roam_stop_bss(tHalHandle hHal, uint8_t sessionId)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003679{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303680 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003681 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
3682
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003683 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303684 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003685 if (CSR_IS_SESSION_VALID(pMac, sessionId)) {
3686 status = csr_roam_issue_stop_bss_cmd(pMac, sessionId, true);
3687 } else {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303688 status = QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003689 }
3690 sme_release_global_lock(&pMac->sme);
3691 }
3692
3693 return status;
3694}
3695
Deepthi Gowrib3bfefd2016-09-13 15:14:34 +05303696/**
3697 * sme_roam_disconnect_sta() - disassociate a station
3698 * @hHal: Global structure
3699 * @sessionId: SessionId of SoftAP
3700 * @p_del_sta_params: Pointer to parameters of the station to disassoc
3701 *
3702 * To disassociate a station. This is an asynchronous API.
3703 *
3704 * Return: QDF_STATUS_SUCCESS on success.Roam callback will
3705 * be called to indicate actual result.
3706 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303707QDF_STATUS sme_roam_disconnect_sta(tHalHandle hHal, uint8_t sessionId,
Deepthi Gowrib3bfefd2016-09-13 15:14:34 +05303708 struct tagCsrDelStaParams *p_del_sta_params)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003709{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303710 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003711 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
3712
3713 if (NULL == pMac) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303714 QDF_ASSERT(0);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003715 return status;
3716 }
3717
3718 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303719 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003720 if (CSR_IS_SESSION_VALID(pMac, sessionId)) {
3721 status = csr_roam_issue_disassociate_sta_cmd(pMac,
Deepthi Gowrib3bfefd2016-09-13 15:14:34 +05303722 sessionId, p_del_sta_params);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003723 } else {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303724 status = QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003725 }
3726 sme_release_global_lock(&pMac->sme);
3727 }
3728
3729 return status;
3730}
3731
3732/**
3733 * sme_roam_deauth_sta() - deauthenticate a station
3734 * @hHal: Global structure
3735 * @sessionId: SessionId of SoftAP
3736 * @pDelStaParams: Pointer to parameters of the station to deauthenticate
3737 *
3738 * To disassociate a station. This is an asynchronous API.
3739 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303740 * Return: QDF_STATUS_SUCCESS on success or another QDF_STATUS error
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003741 * code on error. Roam callback will be called to indicate actual
3742 * result
3743 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303744QDF_STATUS sme_roam_deauth_sta(tHalHandle hHal, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003745 struct tagCsrDelStaParams *pDelStaParams)
3746{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303747 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003748 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
3749
3750 if (NULL == pMac) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303751 QDF_ASSERT(0);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003752 return status;
3753 }
3754
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303755 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Sreelakshmi Konamki6744cff2015-09-07 12:10:39 +05303756 TRACE_CODE_SME_RX_HDD_MSG_DEAUTH_STA,
3757 sessionId, pDelStaParams->reason_code));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003758 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303759 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003760 if (CSR_IS_SESSION_VALID(pMac, sessionId)) {
3761 status =
3762 csr_roam_issue_deauth_sta_cmd(pMac, sessionId,
3763 pDelStaParams);
3764 } else {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303765 status = QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003766 }
3767 sme_release_global_lock(&pMac->sme);
3768 }
3769
3770 return status;
3771}
3772
3773/* ---------------------------------------------------------------------------
3774 \fn sme_roam_tkip_counter_measures
3775 \brief To start or stop TKIP counter measures. This is an asynchronous API.
3776 \param sessionId - sessionId of SoftAP
3777 \param pPeerMacAddr - Caller allocated memory filled with peer MAC address (6 bytes)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303778 \return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003779 -------------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303780QDF_STATUS sme_roam_tkip_counter_measures(tHalHandle hHal, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003781 bool bEnable)
3782{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303783 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003784 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
3785
3786 if (NULL == pMac) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303787 QDF_ASSERT(0);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003788 return status;
3789 }
3790
3791 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303792 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003793 if (CSR_IS_SESSION_VALID(pMac, sessionId)) {
3794 status =
3795 csr_roam_issue_tkip_counter_measures(pMac, sessionId,
3796 bEnable);
3797 } else {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303798 status = QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003799 }
3800 sme_release_global_lock(&pMac->sme);
3801 }
3802
3803 return status;
3804}
3805
3806/* ---------------------------------------------------------------------------
3807 \fn sme_roam_get_associated_stas
3808 \brief To probe the list of associated stations from various modules
3809 of CORE stack.
3810 \This is an asynchronous API.
3811 \param sessionId - sessionId of SoftAP
3812 \param modId - Module from whom list of associtated stations is
3813 to be probed. If an invalid module is passed then
Anurag Chouhan6d760662016-02-20 16:05:43 +05303814 by default QDF_MODULE_ID_PE will be probed.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003815 \param pUsrContext - Opaque HDD context
3816 \param pfnSapEventCallback - Sap event callback in HDD
3817 \param pAssocBuf - Caller allocated memory to be filled with associatd
3818 stations info
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303819 \return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003820 -------------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303821QDF_STATUS sme_roam_get_associated_stas(tHalHandle hHal, uint8_t sessionId,
Anurag Chouhan6d760662016-02-20 16:05:43 +05303822 QDF_MODULE_ID modId, void *pUsrContext,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003823 void *pfnSapEventCallback,
3824 uint8_t *pAssocStasBuf)
3825{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303826 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003827 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
3828
3829 if (NULL == pMac) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303830 QDF_ASSERT(0);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003831 return status;
3832 }
3833
3834 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303835 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003836 if (CSR_IS_SESSION_VALID(pMac, sessionId)) {
3837 status =
3838 csr_roam_get_associated_stas(pMac, sessionId, modId,
3839 pUsrContext,
3840 pfnSapEventCallback,
3841 pAssocStasBuf);
3842 } else {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303843 status = QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003844 }
3845 sme_release_global_lock(&pMac->sme);
3846 }
3847
3848 return status;
3849}
3850
3851/* ---------------------------------------------------------------------------
3852 \fn sme_roam_get_wps_session_overlap
3853 \brief To get the WPS PBC session overlap information.
3854 \This is an asynchronous API.
3855 \param sessionId - sessionId of SoftAP
3856 \param pUsrContext - Opaque HDD context
3857 \param pfnSapEventCallback - Sap event callback in HDD
3858 \pRemoveMac - pointer to Mac address which needs to be removed from session
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303859 \return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003860 -------------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303861QDF_STATUS sme_roam_get_wps_session_overlap(tHalHandle hHal, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003862 void *pUsrContext, void
3863 *pfnSapEventCallback,
Anurag Chouhan6d760662016-02-20 16:05:43 +05303864 struct qdf_mac_addr pRemoveMac)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003865{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303866 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003867 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
3868
3869 if (NULL == pMac) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303870 QDF_ASSERT(0);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003871 return status;
3872 }
3873
3874 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303875 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003876 if (CSR_IS_SESSION_VALID(pMac, sessionId)) {
3877 status =
3878 csr_roam_get_wps_session_overlap(pMac, sessionId,
3879 pUsrContext,
3880 pfnSapEventCallback,
3881 pRemoveMac);
3882 } else {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303883 status = QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003884 }
3885 sme_release_global_lock(&pMac->sme);
3886 }
3887
3888 return status;
3889}
3890
3891/* ---------------------------------------------------------------------------
3892 \fn sme_roam_get_connect_state
3893 \brief a wrapper function to request CSR to return the current connect state
3894 of Roaming
3895 This is a synchronous call.
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303896 \return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003897 ---------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303898QDF_STATUS sme_roam_get_connect_state(tHalHandle hHal, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003899 eCsrConnectState *pState)
3900{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303901 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003902 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
3903
3904 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303905 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003906 if (CSR_IS_SESSION_VALID(pMac, sessionId)) {
3907 status =
3908 csr_roam_get_connect_state(pMac, sessionId, pState);
3909 } else {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303910 status = QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003911 }
3912 sme_release_global_lock(&pMac->sme);
3913 }
3914
3915 return status;
3916}
3917
3918/* ---------------------------------------------------------------------------
3919 \fn sme_roam_get_connect_profile
3920 \brief a wrapper function to request CSR to return the current connect
3921 profile. Caller must call csr_roam_free_connect_profile after it is done
3922 and before reuse for another csr_roam_get_connect_profile call.
3923 This is a synchronous call.
3924 \param pProfile - pointer to a caller allocated structure
3925 tCsrRoamConnectedProfile
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303926 \return QDF_STATUS. Failure if not connected
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003927 ---------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303928QDF_STATUS sme_roam_get_connect_profile(tHalHandle hHal, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003929 tCsrRoamConnectedProfile *pProfile)
3930{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303931 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003932 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
3933
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303934 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003935 TRACE_CODE_SME_RX_HDD_ROAM_GET_CONNECTPROFILE,
3936 sessionId, 0));
3937 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303938 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003939 if (CSR_IS_SESSION_VALID(pMac, sessionId)) {
3940 status =
3941 csr_roam_get_connect_profile(pMac, sessionId, pProfile);
3942 } else {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303943 status = QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003944 }
3945 sme_release_global_lock(&pMac->sme);
3946 }
3947
3948 return status;
3949}
3950
Naveen Rawatdf0a7e72016-01-06 18:35:53 -08003951/**
3952 * sme_roam_free_connect_profile - a wrapper function to request CSR to free and
3953 * reinitialize the profile returned previously by csr_roam_get_connect_profile.
3954 *
3955 * @profile - pointer to a caller allocated structure tCsrRoamConnectedProfile
3956 *
3957 * Return: none
3958 */
3959void sme_roam_free_connect_profile(tCsrRoamConnectedProfile *profile)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003960{
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303961 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003962 TRACE_CODE_SME_RX_HDD_ROAM_FREE_CONNECTPROFILE,
3963 NO_SESSION, 0));
Naveen Rawatdf0a7e72016-01-06 18:35:53 -08003964 csr_roam_free_connect_profile(profile);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003965}
3966
3967/* ---------------------------------------------------------------------------
3968 \fn sme_roam_set_pmkid_cache
3969 \brief a wrapper function to request CSR to return the PMKID candidate list
3970 This is a synchronous call.
3971 \param pPMKIDCache - caller allocated buffer point to an array of
3972 tPmkidCacheInfo
3973 \param numItems - a variable that has the number of tPmkidCacheInfo
3974 allocated when retruning, this is either the number needed
3975 or number of items put into pPMKIDCache
3976 \param update_entire_cache - this bool value specifies if the entire pmkid
3977 cache should be overwritten or should it be
3978 updated entry by entry.
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303979 \return QDF_STATUS - when fail, it usually means the buffer allocated is not
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003980 big enough and pNumItems has the number of
3981 tPmkidCacheInfo.
3982 \Note: pNumItems is a number of tPmkidCacheInfo,
3983 not sizeof(tPmkidCacheInfo) * something
3984 ---------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303985QDF_STATUS sme_roam_set_pmkid_cache(tHalHandle hHal, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003986 tPmkidCacheInfo *pPMKIDCache,
3987 uint32_t numItems, bool update_entire_cache)
3988{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303989 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003990 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
3991
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303992 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003993 TRACE_CODE_SME_RX_HDD_ROAM_SET_PMKIDCACHE, sessionId,
3994 numItems));
3995 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303996 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003997 if (CSR_IS_SESSION_VALID(pMac, sessionId)) {
3998 status =
3999 csr_roam_set_pmkid_cache(pMac, sessionId, pPMKIDCache,
4000 numItems, update_entire_cache);
4001 } else {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304002 status = QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004003 }
4004 sme_release_global_lock(&pMac->sme);
4005 }
4006
4007 return status;
4008}
4009
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304010QDF_STATUS sme_roam_del_pmkid_from_cache(tHalHandle hHal, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004011 const uint8_t *pBSSId, bool flush_cache)
4012{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304013 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004014 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Sreelakshmi Konamki6744cff2015-09-07 12:10:39 +05304015
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05304016 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Sreelakshmi Konamki6744cff2015-09-07 12:10:39 +05304017 TRACE_CODE_SME_RX_HDD_ROAM_DEL_PMKIDCACHE,
4018 sessionId, flush_cache));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004019 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304020 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004021 if (CSR_IS_SESSION_VALID(pMac, sessionId)) {
4022 status = csr_roam_del_pmkid_from_cache(pMac, sessionId,
4023 pBSSId, flush_cache);
4024 } else {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304025 status = QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004026 }
4027 sme_release_global_lock(&pMac->sme);
4028 }
4029 return status;
4030}
4031
4032#ifdef WLAN_FEATURE_ROAM_OFFLOAD
4033/* ---------------------------------------------------------------------------
4034 * \fn sme_roam_set_psk_pmk
4035 * \brief a wrapper function to request CSR to save PSK/PMK
4036 * This is a synchronous call.
4037 * \param hHal - Global structure
4038 * \param sessionId - SME sessionId
4039 * \param pPSK_PMK - pointer to an array of Psk[]/Pmk
4040 * \param pmk_len - Length could be only 16 bytes in case if LEAP
4041 * connections. Need to pass this information to
4042 * firmware.
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304043 * \return QDF_STATUS -status whether PSK/PMK is set or not
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004044 *---------------------------------------------------------------------------
4045 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304046QDF_STATUS sme_roam_set_psk_pmk(tHalHandle hHal, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004047 uint8_t *pPSK_PMK, size_t pmk_len)
4048{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304049 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004050 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
4051 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304052 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004053 if (CSR_IS_SESSION_VALID(pMac, sessionId)) {
4054 status =
4055 csr_roam_set_psk_pmk(pMac, sessionId, pPSK_PMK,
4056 pmk_len);
4057 } else {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304058 status = QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004059 }
4060 sme_release_global_lock(&pMac->sme);
4061 }
4062 return status;
4063}
4064#endif
4065/* ---------------------------------------------------------------------------
4066 \fn sme_roam_get_security_req_ie
4067 \brief a wrapper function to request CSR to return the WPA or RSN or WAPI IE CSR
4068 passes to PE to JOIN request or START_BSS request
4069 This is a synchronous call.
4070 \param pLen - caller allocated memory that has the length of pBuf as input.
4071 Upon returned, *pLen has the needed or IE length in pBuf.
4072 \param pBuf - Caller allocated memory that contain the IE field, if any,
4073 upon return
4074 \param secType - Specifies whether looking for WPA/WPA2/WAPI IE
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304075 \return QDF_STATUS - when fail, it usually means the buffer allocated is not
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004076 big enough
4077 ---------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304078QDF_STATUS sme_roam_get_security_req_ie(tHalHandle hHal, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004079 uint32_t *pLen, uint8_t *pBuf,
4080 eCsrSecurityType secType)
4081{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304082 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004083 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
4084
4085 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304086 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004087 if (CSR_IS_SESSION_VALID(pMac, sessionId)) {
4088 status =
4089 csr_roam_get_wpa_rsn_req_ie(hHal, sessionId, pLen, pBuf);
4090 } else {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304091 status = QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004092 }
4093 sme_release_global_lock(&pMac->sme);
4094 }
4095
4096 return status;
4097}
4098
4099/* ---------------------------------------------------------------------------
4100 \fn sme_roam_get_security_rsp_ie
4101 \brief a wrapper function to request CSR to return the WPA or RSN or
4102 WAPI IE from the beacon or probe rsp if connected
4103 This is a synchronous call.
4104 \param pLen - caller allocated memory that has the length of pBuf as input.
4105 Upon returned, *pLen has the needed or IE length in pBuf.
4106 \param pBuf - Caller allocated memory that contain the IE field, if any,
4107 upon return
4108 \param secType - Specifies whether looking for WPA/WPA2/WAPI IE
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304109 \return QDF_STATUS - when fail, it usually means the buffer allocated is not
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004110 big enough
4111 ---------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304112QDF_STATUS sme_roam_get_security_rsp_ie(tHalHandle hHal, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004113 uint32_t *pLen, uint8_t *pBuf,
4114 eCsrSecurityType secType)
4115{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304116 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004117 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
4118
4119 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304120 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004121 if (CSR_IS_SESSION_VALID(pMac, sessionId)) {
4122 status =
4123 csr_roam_get_wpa_rsn_rsp_ie(pMac, sessionId, pLen, pBuf);
4124 } else {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304125 status = QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004126 }
4127 sme_release_global_lock(&pMac->sme);
4128 }
4129
4130 return status;
4131
4132}
4133
4134/* ---------------------------------------------------------------------------
4135 \fn sme_roam_get_num_pmkid_cache
4136 \brief a wrapper function to request CSR to return number of PMKID cache
4137 entries
4138 This is a synchronous call.
4139 \return uint32_t - the number of PMKID cache entries
4140 ---------------------------------------------------------------------------*/
4141uint32_t sme_roam_get_num_pmkid_cache(tHalHandle hHal, uint8_t sessionId)
4142{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304143 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004144 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
4145 uint32_t numPmkidCache = 0;
4146
4147 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304148 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004149 if (CSR_IS_SESSION_VALID(pMac, sessionId)) {
4150 numPmkidCache =
4151 csr_roam_get_num_pmkid_cache(pMac, sessionId);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304152 status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004153 } else {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304154 status = QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004155 }
4156 sme_release_global_lock(&pMac->sme);
4157 }
4158
4159 return numPmkidCache;
4160}
4161
4162/* ---------------------------------------------------------------------------
4163 \fn sme_roam_get_pmkid_cache
4164 \brief a wrapper function to request CSR to return PMKID cache from CSR
4165 This is a synchronous call.
4166 \param pNum - caller allocated memory that has the space of the number of
4167 pBuf tPmkidCacheInfo as input. Upon returned, *pNum has the
4168 needed or actually number in tPmkidCacheInfo.
4169 \param pPmkidCache - Caller allocated memory that contains PMKID cache, if
4170 any, upon return
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304171 \return QDF_STATUS - when fail, it usually means the buffer allocated is not
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004172 big enough
4173 ---------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304174QDF_STATUS sme_roam_get_pmkid_cache(tHalHandle hHal, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004175 uint32_t *pNum, tPmkidCacheInfo *pPmkidCache)
4176{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304177 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004178 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
4179
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05304180 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004181 TRACE_CODE_SME_RX_HDD_ROAM_GET_PMKIDCACHE, sessionId,
4182 0));
4183 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304184 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004185 if (CSR_IS_SESSION_VALID(pMac, sessionId)) {
4186 status =
4187 csr_roam_get_pmkid_cache(pMac, sessionId, pNum,
4188 pPmkidCache);
4189 } else {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304190 status = QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004191 }
4192 sme_release_global_lock(&pMac->sme);
4193 }
4194
4195 return status;
4196}
4197
4198/* ---------------------------------------------------------------------------
4199 \fn sme_get_config_param
4200 \brief a wrapper function that HDD calls to get the global settings
4201 currently maintained by CSR.
4202 This is a synchronous call.
4203 \param pParam - caller allocated memory
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304204 \return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004205 ---------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304206QDF_STATUS sme_get_config_param(tHalHandle hHal, tSmeConfigParams *pParam)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004207{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304208 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004209 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
4210
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05304211 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004212 TRACE_CODE_SME_RX_HDD_GET_CONFIGPARAM, NO_SESSION, 0));
4213 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304214 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004215 status = csr_get_config_param(pMac, &pParam->csrConfig);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304216 if (status != QDF_STATUS_SUCCESS) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07004217 sme_err("csr_get_config_param failed");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004218 sme_release_global_lock(&pMac->sme);
4219 return status;
4220 }
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304221 qdf_mem_copy(&pParam->rrmConfig,
Krunal Soni1878d3a2016-01-14 13:00:44 -08004222 &pMac->rrm.rrmSmeContext.rrmConfig,
4223 sizeof(pMac->rrm.rrmSmeContext.rrmConfig));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004224 sme_release_global_lock(&pMac->sme);
4225 }
4226
4227 return status;
4228}
4229
4230/**
4231 * sme_cfg_set_int() - Sets the cfg parameter value.
4232 * @hal: Handle to hal.
4233 * @cfg_id: Configuration parameter ID.
Jeff Johnson560dc562017-03-17 15:19:31 -07004234 * @value: value to be saved in the cfg parameter.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004235 *
4236 * This function sets the string value in cfg parameter.
4237 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304238 * Return: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004239 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304240QDF_STATUS sme_cfg_set_int(tHalHandle hal, uint16_t cfg_id, uint32_t value)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004241{
4242 tpAniSirGlobal pmac = PMAC_STRUCT(hal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304243 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004244
4245 if (eSIR_SUCCESS != cfg_set_int(pmac, cfg_id, value))
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304246 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004247
4248 return status;
4249}
4250
4251/**
4252 * sme_cfg_set_str() - Sets the cfg parameter string.
4253 * @hal: Handle to hal.
4254 * @cfg_id: Configuration parameter ID.
4255 * @str: Pointer to the string buffer.
4256 * @length: Length of the string.
4257 *
4258 * This function sets the string value in cfg parameter.
4259 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304260 * Return: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004261 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304262QDF_STATUS sme_cfg_set_str(tHalHandle hal, uint16_t cfg_id, uint8_t *str,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004263 uint32_t length)
4264{
4265 tpAniSirGlobal pmac = PMAC_STRUCT(hal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304266 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004267
4268 if (eSIR_SUCCESS != cfg_set_str(pmac, cfg_id, str, length))
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304269 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004270
4271 return status;
4272}
4273
4274/**
4275 * sme_cfg_get_int() - Gets the cfg parameter value.
4276 * @hal: Handle to hal.
4277 * @cfg_id: Configuration parameter ID.
4278 * @cfg_value: Pointer to variable in which cfg value
Jeff Johnson560dc562017-03-17 15:19:31 -07004279 * will be saved.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004280 *
4281 * This function gets the value of the cfg parameter.
4282 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304283 * Return: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004284 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304285QDF_STATUS sme_cfg_get_int(tHalHandle hal, uint16_t cfg_id, uint32_t *cfg_value)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004286{
4287 tpAniSirGlobal pmac = PMAC_STRUCT(hal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304288 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004289
4290 if (eSIR_SUCCESS != wlan_cfg_get_int(pmac, cfg_id, cfg_value))
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304291 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004292
4293 return status;
4294}
4295
4296/**
4297 * sme_cfg_get_str() - Gets the cfg parameter string.
4298 * @hal: Handle to hal.
4299 * @cfg_id: Configuration parameter ID.
4300 * @str: Pointer to the string buffer.
4301 * @length: Pointer to length of the string.
4302 *
4303 * This function gets the string value of the cfg parameter.
4304 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304305 * Return: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004306 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304307QDF_STATUS sme_cfg_get_str(tHalHandle hal, uint16_t cfg_id, uint8_t *str,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004308 uint32_t *length)
4309{
4310 tpAniSirGlobal pmac = PMAC_STRUCT(hal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304311 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004312
4313 if (eSIR_SUCCESS != wlan_cfg_get_str(pmac, cfg_id, str, length))
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304314 status = QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004315
4316 return status;
4317}
4318
4319/* ---------------------------------------------------------------------------
4320 \fn sme_get_modify_profile_fields
4321 \brief HDD or SME - QOS calls this function to get the current values of
4322 connected profile fields, changing which can cause reassoc.
4323 This function must be called after CFG is downloaded and STA is in connected
4324 state. Also, make sure to call this function to get the current profile
4325 fields before calling the reassoc. So that pModifyProfileFields will have
4326 all the latest values plus the one(s) has been updated as part of reassoc
4327 request.
4328 \param pModifyProfileFields - pointer to the connected profile fields
4329 changing which can cause reassoc
4330
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304331 \return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004332 -------------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304333QDF_STATUS sme_get_modify_profile_fields(tHalHandle hHal, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004334 tCsrRoamModifyProfileFields *
4335 pModifyProfileFields)
4336{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304337 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004338 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
4339
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05304340 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004341 TRACE_CODE_SME_RX_HDD_GET_MODPROFFIELDS, sessionId,
4342 0));
4343 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304344 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004345 if (CSR_IS_SESSION_VALID(pMac, sessionId)) {
4346 status =
4347 csr_get_modify_profile_fields(pMac, sessionId,
4348 pModifyProfileFields);
4349 } else {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304350 status = QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004351 }
4352 sme_release_global_lock(&pMac->sme);
4353 }
4354
4355 return status;
4356}
4357
4358/* ---------------------------------------------------------------------------
4359 \fn sme_set_dhcp_till_power_active_flag
4360 \brief Sets/Clears DHCP related flag to disable/enable auto PS
4361 \param hal - The handle returned by mac_open.
4362 ---------------------------------------------------------------------------*/
4363void sme_set_dhcp_till_power_active_flag(tHalHandle hal, uint8_t flag)
4364{
4365 tpAniSirGlobal mac = PMAC_STRUCT(hal);
4366 struct ps_global_info *ps_global_info = &mac->sme.ps_global_info;
4367
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05304368 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004369 TRACE_CODE_SME_RX_HDD_SET_DHCP_FLAG, NO_SESSION,
4370 flag));
4371 /* Set/Clear the DHCP flag which will disable/enable auto PS */
4372 ps_global_info->remain_in_power_active_till_dhcp = flag;
4373}
4374
4375/* ---------------------------------------------------------------------------
4376 \fn sme_register11d_scan_done_callback
4377 \brief Register a routine of type csr_scan_completeCallback which is
4378 called whenever an 11d scan is done
4379 \param hHal - The handle returned by mac_open.
4380 \param callback - 11d scan complete routine to be registered
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304381 \return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004382 ---------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304383QDF_STATUS sme_register11d_scan_done_callback(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004384 csr_scan_completeCallback callback)
4385{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304386 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004387 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
4388
4389 pMac->scan.callback11dScanDone = callback;
4390
4391 return status;
4392}
4393
Arun Khandavalli4b55da72016-07-19 19:55:01 +05304394/**
4395 * sme_deregister11d_scan_done_callback() - De-register scandone callback
4396 * @h_hal: Handler return by mac_open
4397 *
4398 * This function De-registers the scandone callback to SME
4399 *
4400 * Return: None
4401 */
4402void sme_deregister11d_scan_done_callback(tHalHandle h_hal)
4403{
4404 tpAniSirGlobal pmac;
4405
4406 if (!h_hal) {
4407 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
4408 FL("hHal is not valid"));
4409 return;
4410 }
4411
4412 pmac = PMAC_STRUCT(h_hal);
4413 pmac->scan.callback11dScanDone = NULL;
4414}
4415
4416
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004417#ifdef FEATURE_OEM_DATA_SUPPORT
4418/**
4419 * sme_register_oem_data_rsp_callback() - Register a routine of
4420 * type send_oem_data_rsp_msg
4421 * @h_hal: Handle returned by mac_open.
4422 * @callback: Callback to send response
4423 * to oem application.
4424 *
4425 * sme_oem_data_rsp_callback is used to register sme_send_oem_data_rsp_msg
4426 * callback function.
4427 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304428 * Return: QDF_STATUS.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004429 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304430QDF_STATUS sme_register_oem_data_rsp_callback(tHalHandle h_hal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004431 sme_send_oem_data_rsp_msg callback)
4432{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304433 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004434 tpAniSirGlobal pmac = PMAC_STRUCT(h_hal);
4435
Krishna Kumaar Natarajanbbbf2ef2016-08-03 14:06:26 -07004436 pmac->sme.oem_data_rsp_callback = callback;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004437
4438 return status;
4439
4440}
Arun Khandavalli4b55da72016-07-19 19:55:01 +05304441
4442/**
4443 * sme_deregister_oem_data_rsp_callback() - De-register OEM datarsp callback
4444 * @h_hal: Handler return by mac_open
4445 * This function De-registers the OEM data response callback to SME
4446 *
4447 * Return: None
4448 */
4449void sme_deregister_oem_data_rsp_callback(tHalHandle h_hal)
4450{
4451 tpAniSirGlobal pmac;
4452
4453 if (!h_hal) {
4454 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
4455 FL("hHal is not valid"));
4456 return;
4457 }
4458 pmac = PMAC_STRUCT(h_hal);
4459
Krishna Kumaar Natarajanbbbf2ef2016-08-03 14:06:26 -07004460 pmac->sme.oem_data_rsp_callback = NULL;
Arun Khandavalli4b55da72016-07-19 19:55:01 +05304461}
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004462
4463/**
Krishna Kumaar Natarajan53ca2902015-12-04 14:01:46 -08004464 * sme_oem_update_capability() - update UMAC's oem related capability.
4465 * @hal: Handle returned by mac_open
4466 * @oem_cap: pointer to oem_capability
4467 *
4468 * This function updates OEM capability to UMAC. Currently RTT
4469 * related capabilities are updated. More capabilities can be
4470 * added in future.
4471 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304472 * Return: QDF_STATUS
Krishna Kumaar Natarajan53ca2902015-12-04 14:01:46 -08004473 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304474QDF_STATUS sme_oem_update_capability(tHalHandle hal,
Krishna Kumaar Natarajan53ca2902015-12-04 14:01:46 -08004475 struct sme_oem_capability *cap)
4476{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304477 QDF_STATUS status = QDF_STATUS_SUCCESS;
Krishna Kumaar Natarajan53ca2902015-12-04 14:01:46 -08004478 tpAniSirGlobal pmac = PMAC_STRUCT(hal);
4479 uint8_t *bytes;
4480
4481 bytes = pmac->rrm.rrmSmeContext.rrmConfig.rm_capability;
4482
4483 if (cap->ftm_rr)
4484 bytes[4] |= RM_CAP_FTM_RANGE_REPORT;
4485 if (cap->lci_capability)
4486 bytes[4] |= RM_CAP_CIVIC_LOC_MEASUREMENT;
4487
4488 return status;
4489}
4490
4491/**
4492 * sme_oem_get_capability() - get oem capability
4493 * @hal: Handle returned by mac_open
4494 * @oem_cap: pointer to oem_capability
4495 *
4496 * This function is used to get the OEM capability from UMAC.
4497 * Currently RTT related capabilities are received. More
4498 * capabilities can be added in future.
4499 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304500 * Return: QDF_STATUS
Krishna Kumaar Natarajan53ca2902015-12-04 14:01:46 -08004501 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304502QDF_STATUS sme_oem_get_capability(tHalHandle hal,
Krishna Kumaar Natarajan53ca2902015-12-04 14:01:46 -08004503 struct sme_oem_capability *cap)
4504{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304505 QDF_STATUS status = QDF_STATUS_SUCCESS;
Krishna Kumaar Natarajan53ca2902015-12-04 14:01:46 -08004506 tpAniSirGlobal pmac = PMAC_STRUCT(hal);
4507 uint8_t *bytes;
4508
4509 bytes = pmac->rrm.rrmSmeContext.rrmConfig.rm_capability;
4510
4511 cap->ftm_rr = bytes[4] & RM_CAP_FTM_RANGE_REPORT;
4512 cap->lci_capability = bytes[4] & RM_CAP_CIVIC_LOC_MEASUREMENT;
4513
4514 return status;
4515}
Naveen Rawat910726a2017-03-06 11:42:51 -08004516#endif
Krishna Kumaar Natarajan53ca2902015-12-04 14:01:46 -08004517
4518/**
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004519 * sme_register_ftm_msg_processor() - registers hdd ftm message processor
4520 * function to MAC/SYS
4521 *
4522 * @hal: hal handle
4523 * @callback: hdd function that has to be registered
4524 *
4525 * Return: void
4526 */
4527void sme_register_ftm_msg_processor(tHalHandle hal,
4528 hdd_ftm_msg_processor callback)
4529{
4530 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
4531
4532 if (mac_ctx == NULL) {
Naveen Rawatcf684762016-06-27 15:30:24 -07004533 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
4534 FL("mac ctx is NULL"));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004535 return;
4536 }
Naveen Rawatcf684762016-06-27 15:30:24 -07004537
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004538 mac_ctx->ftm_msg_processor_callback = callback;
4539 return;
4540}
4541
4542/**
4543 * sme_wow_add_pattern() - add a wow pattern in fw
4544 * @hHal: handle returned by mac_open
4545 * @pattern: pointer to input pattern
4546 *
4547 * Add a pattern for Pattern Byte Matching in WoW mode. Firmware will
4548 * do a pattern match on these patterns when WoW is enabled during system
4549 * suspend.
4550 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304551 * Return: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004552 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304553QDF_STATUS sme_wow_add_pattern(tHalHandle hal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004554 struct wow_add_pattern *pattern,
4555 uint8_t session_id)
4556{
4557 tpAniSirGlobal pMac = PMAC_STRUCT(hal);
4558 struct wow_add_pattern *ptrn;
4559 tSirRetStatus ret_code = eSIR_SUCCESS;
Rajeev Kumar37d478b2017-04-17 16:59:28 -07004560 struct scheduler_msg msg_q = {0};
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05304561 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004562 TRACE_CODE_SME_RX_HDD_WOWL_ADDBCAST_PATTERN, session_id,
4563 0));
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304564 ptrn = qdf_mem_malloc(sizeof(*ptrn));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004565 if (NULL == ptrn) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07004566 sme_err("Fail to allocate memory for WoWLAN Add Bcast Pattern");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304567 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004568 }
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304569 (void)qdf_mem_copy(ptrn, pattern, sizeof(*ptrn));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004570
4571 msg_q.type = WMA_WOW_ADD_PTRN;
4572 msg_q.reserved = 0;
4573 msg_q.bodyptr = ptrn;
4574 msg_q.bodyval = 0;
4575
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07004576 sme_debug("Sending WMA_WOWL_ADD_BCAST_PTRN to HAL");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004577 ret_code = wma_post_ctrl_msg(pMac, &msg_q);
4578 if (eSIR_SUCCESS != ret_code) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07004579 sme_err("Posting WMA_WOWL_ADD_BCAST_PTRN failed, reason: %X",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004580 ret_code);
4581 }
4582 return ret_code;
4583}
4584
4585/**
4586 * sme_wow_delete_pattern() - delete user configured wow pattern in target
4587 * @hHal: handle returned by mac_open.
4588 * @pattern: pointer to delete pattern parameter
4589 * @sessionId: session id
4590 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304591 * Return: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004592 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304593QDF_STATUS sme_wow_delete_pattern(tHalHandle hal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004594 struct wow_delete_pattern *pattern, uint8_t sessionId)
4595{
4596 tpAniSirGlobal pMac = PMAC_STRUCT(hal);
4597 struct wow_delete_pattern *delete_ptrn;
4598 tSirRetStatus ret_code = eSIR_SUCCESS;
Rajeev Kumar37d478b2017-04-17 16:59:28 -07004599 struct scheduler_msg msg_q = {0};
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05304600 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004601 TRACE_CODE_SME_RX_HDD_WOWL_DELBCAST_PATTERN, sessionId,
4602 0));
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304603 delete_ptrn = qdf_mem_malloc(sizeof(*delete_ptrn));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004604 if (NULL == delete_ptrn) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07004605 sme_err("Allocation failed for WoWLAN Delete Bcast Pattern");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304606 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004607 }
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304608 (void)qdf_mem_copy(delete_ptrn, pattern, sizeof(*delete_ptrn));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004609 msg_q.type = WMA_WOW_DEL_PTRN;
4610 msg_q.reserved = 0;
4611 msg_q.bodyptr = delete_ptrn;
4612 msg_q.bodyval = 0;
4613
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07004614 sme_debug("Sending WMA_WOWL_DEL_BCAST_PTRN");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004615
4616 ret_code = wma_post_ctrl_msg(pMac, &msg_q);
4617 if (eSIR_SUCCESS != ret_code) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07004618 sme_err("Posting WMA_WOWL_DEL_BCAST_PTRN failed, reason: %X",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004619 ret_code);
4620 }
4621 return ret_code;
4622}
4623
4624/**
4625 * sme_enter_wowl(): SME API exposed to HDD to request enabling of WOWL mode.
4626 * @hal_ctx - The handle returned by mac_open.
4627 * @enter_wowl_callback_routine - Callback routine provided by HDD.
4628 * Used for success/failure notification by SME
4629 * @enter_wowl_callback_context - A cookie passed by HDD, that is passed
4630 * back to HDD at the time of callback.
4631 * @wake_reason_ind_cb - Callback routine provided by HDD.
4632 * Used for Wake Reason Indication by SME
4633 * @wake_reason_ind_cb_ctx - A cookie passed by HDD, that is passed
4634 * back to HDD at the time of callback.
4635 *
4636 * WoWLAN works on top of BMPS mode.
4637 * If the device is not in BMPS mode,
4638 * SME will will cache the information that
4639 * WOWL has been enabled and attempt to put the device
4640 * in BMPS. On entry into BMPS, SME will enable the
4641 * WOWL mode.
4642 * Note 1: If we exit BMPS mode (someone requests full power),
4643 * we will NOT resume WOWL when we go back to BMPS again.
4644 * Request for full power (while in WOWL mode) means disable
4645 * WOWL and go to full power.
4646 * Note 2: Both UAPSD and WOWL work on top of BMPS.
4647 * On entry into BMPS, SME will give priority to UAPSD and
4648 * enable only UAPSD if both UAPSD and WOWL are required.
4649 * Currently there is no requirement or use case to support
4650 * UAPSD and WOWL at the same time.
4651 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304652 * Return: QDF_STATUS
4653 * QDF_STATUS_SUCCESS Device is already in WoWLAN mode
4654 * QDF_STATUS_E_FAILURE Device cannot enter WoWLAN mode.
4655 * QDF_STATUS_PMC_PENDING Request accepted. SME will enable
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004656 * WOWL after BMPS mode is entered.
4657 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304658QDF_STATUS sme_enter_wowl(tHalHandle hal_ctx,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004659 void (*enter_wowl_callback_routine)(void
4660 *callback_context,
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304661 QDF_STATUS status),
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004662 void *enter_wowl_callback_context,
4663#ifdef WLAN_WAKEUP_EVENTS
4664 void (*wakeIndicationCB)(void *callback_context,
4665 tpSirWakeReasonInd
4666 wake_reason_ind),
4667 void *wakeIndicationCBContext,
4668#endif /* WLAN_WAKEUP_EVENTS */
4669 tpSirSmeWowlEnterParams wowl_enter_params,
4670 uint8_t session_id)
4671{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304672 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004673 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal_ctx);
4674 struct ps_global_info *ps_global_info = &mac_ctx->sme.ps_global_info;
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05304675 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004676 TRACE_CODE_SME_RX_HDD_ENTER_WOWL, session_id, 0));
4677
4678 /* cache the WOWL information */
4679 ps_global_info->ps_params[session_id].wowl_enter_params =
4680 *wowl_enter_params;
4681 ps_global_info->ps_params[session_id].enter_wowl_callback_routine =
4682 enter_wowl_callback_routine;
4683 ps_global_info->ps_params[session_id].enter_wowl_callback_context =
4684 enter_wowl_callback_context;
4685#ifdef WLAN_WAKEUP_EVENTS
4686 /* Cache the Wake Reason Indication callback information */
4687 ps_global_info->ps_params[session_id].wake_reason_ind_cb =
4688 wakeIndicationCB;
4689 ps_global_info->ps_params[session_id].wake_reason_ind_cb_ctx =
4690 wakeIndicationCBContext;
4691#endif /* WLAN_WAKEUP_EVENTS */
4692
4693 status = sme_ps_process_command(mac_ctx, session_id, SME_PS_WOWL_ENTER);
4694 return status;
4695}
4696/**
4697 *sme_exit_wowl(): SME API exposed to HDD to request exit from WoWLAN mode.
4698 * @hal_ctx - The handle returned by mac_open.
4699 * @wowl_exit_params - Carries info on which smesession
4700 * wowl exit is requested.
4701 *
4702 * SME will initiate exit from WoWLAN mode and device will be
4703 * put in BMPS mode.
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304704 * Return QDF_STATUS
4705 * QDF_STATUS_E_FAILURE Device cannot exit WoWLAN mode.
4706 * QDF_STATUS_SUCCESS Request accepted to exit WoWLAN mode.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004707 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304708QDF_STATUS sme_exit_wowl(tHalHandle hal_ctx,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004709 tpSirSmeWowlExitParams wowl_exit_params)
4710{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304711 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004712 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal_ctx);
4713 uint8_t session_id;
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05304714 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004715 TRACE_CODE_SME_RX_HDD_EXIT_WOWL, NO_SESSION, 0));
4716 session_id = wowl_exit_params->sessionId;
4717 status = sme_ps_process_command(mac_ctx, session_id, SME_PS_WOWL_EXIT);
4718 return status;
4719}
4720
4721/**
4722 * sme_roam_set_key() - To set encryption key.
4723 * @hal: hal global context
4724 * @session_id: session id
4725 * @set_key: pointer to a caller allocated object of tCsrSetContextInfo
4726 * @ptr_roam_id: Upon success return, this is the id caller can use to
4727 * identify the request in roamcallback
4728 *
4729 * This function should be called only when connected. This is an asynchronous
4730 * API.
4731 *
4732 * Return: Status of operation
4733 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304734QDF_STATUS sme_roam_set_key(tHalHandle hal, uint8_t session_id,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004735 tCsrRoamSetKey *set_key, uint32_t *ptr_roam_id)
4736{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304737 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004738 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
4739 uint32_t roam_id;
4740 uint32_t i;
4741 tCsrRoamSession *session = NULL;
4742 struct ps_global_info *ps_global_info = &mac_ctx->sme.ps_global_info;
4743
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05304744 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_RX_HDD_SET_KEY,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004745 session_id, 0));
4746 if (set_key->keyLength > CSR_MAX_KEY_LEN) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07004747 sme_err("Invalid key length: %d", set_key->keyLength);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304748 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004749 }
4750 /*Once Setkey is done, we can go in BMPS */
4751 if (set_key->keyLength)
4752 ps_global_info->remain_in_power_active_till_dhcp = false;
4753
4754 status = sme_acquire_global_lock(&mac_ctx->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304755 if (!QDF_IS_STATUS_SUCCESS(status))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004756 return status;
4757
4758 roam_id = GET_NEXT_ROAM_ID(&mac_ctx->roam);
4759 if (ptr_roam_id)
4760 *ptr_roam_id = roam_id;
4761
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07004762 sme_debug("keyLength: %d", set_key->keyLength);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004763 for (i = 0; i < set_key->keyLength; i++)
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07004764 sme_debug("%02x", set_key->Key[i]);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004765
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07004766 sme_debug("Session_id: %d roam_id: %d", session_id, roam_id);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004767 session = CSR_GET_SESSION(mac_ctx, session_id);
4768 if (!session) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07004769 sme_err("session %d not found", session_id);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004770 sme_release_global_lock(&mac_ctx->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304771 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004772 }
4773 if (CSR_IS_INFRA_AP(&session->connectedProfile)
4774 && set_key->keyDirection == eSIR_TX_DEFAULT) {
4775 if ((eCSR_ENCRYPT_TYPE_WEP40 == set_key->encType)
4776 || (eCSR_ENCRYPT_TYPE_WEP40_STATICKEY ==
4777 set_key->encType)) {
4778 session->pCurRoamProfile->negotiatedUCEncryptionType =
4779 eCSR_ENCRYPT_TYPE_WEP40_STATICKEY;
4780 }
4781 if ((eCSR_ENCRYPT_TYPE_WEP104 == set_key->encType)
4782 || (eCSR_ENCRYPT_TYPE_WEP104_STATICKEY ==
4783 set_key->encType)) {
4784 session->pCurRoamProfile->negotiatedUCEncryptionType =
4785 eCSR_ENCRYPT_TYPE_WEP104_STATICKEY;
4786 }
4787 }
4788 status = csr_roam_set_key(mac_ctx, session_id, set_key, roam_id);
4789 sme_release_global_lock(&mac_ctx->sme);
4790 return status;
4791}
4792
Masti, Narayanraddiab712a72016-08-04 11:59:11 +05304793/**
4794 * sme_roam_set_default_key_index - To set default wep key idx
4795 * @hal: pointer to hal handler
4796 * @session_id: session id
4797 * @default_idx: default wep key index
4798 *
4799 * This function prepares a message and post to WMA to set wep default
4800 * key index
4801 *
4802 * Return: Success:QDF_STATUS_SUCCESS Failure: Error value
4803 */
4804QDF_STATUS sme_roam_set_default_key_index(tHalHandle hal, uint8_t session_id,
4805 uint8_t default_idx)
4806{
Rajeev Kumar37d478b2017-04-17 16:59:28 -07004807 struct scheduler_msg msg = {0};
Masti, Narayanraddiab712a72016-08-04 11:59:11 +05304808 struct wep_update_default_key_idx *update_key;
4809
4810 update_key = qdf_mem_malloc(sizeof(*update_key));
4811 if (!update_key) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07004812 sme_err("Failed to allocate memory for update key");
Masti, Narayanraddiab712a72016-08-04 11:59:11 +05304813 return QDF_STATUS_E_NOMEM;
4814 }
4815
4816 update_key->session_id = session_id;
4817 update_key->default_idx = default_idx;
4818
4819 msg.type = WMA_UPDATE_WEP_DEFAULT_KEY;
4820 msg.reserved = 0;
4821 msg.bodyptr = (void *)update_key;
4822
4823 if (QDF_STATUS_SUCCESS !=
Rajeev Kumar8eaedf62017-01-21 11:03:13 -08004824 scheduler_post_msg(QDF_MODULE_ID_WMA, &msg)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07004825 sme_err("Failed to post WMA_UPDATE_WEP_DEFAULT_KEY to WMA");
Masti, Narayanraddiab712a72016-08-04 11:59:11 +05304826 qdf_mem_free(update_key);
4827 return QDF_STATUS_E_FAILURE;
4828 }
4829
4830 return QDF_STATUS_SUCCESS;
4831}
4832
4833
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004834/* ---------------------------------------------------------------------------
4835 \fn sme_get_rssi
4836 \brief a wrapper function that client calls to register a callback to get
4837 RSSI
4838
4839 \param hHal - HAL handle for device
4840 \param callback - SME sends back the requested stats using the callback
4841 \param staId - The station ID for which the stats is requested for
4842 \param bssid - The bssid of the connected session
4843 \param lastRSSI - RSSI value at time of request. In case fw cannot provide
4844 RSSI, do not hold up but return this value.
4845 \param pContext - user context to be passed back along with the callback
4846 \param p_cds_context - cds context
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304847 \return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004848 ---------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304849QDF_STATUS sme_get_rssi(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004850 tCsrRssiCallback callback,
Anurag Chouhan6d760662016-02-20 16:05:43 +05304851 uint8_t staId, struct qdf_mac_addr bssId, int8_t lastRSSI,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004852 void *pContext, void *p_cds_context)
4853{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304854 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004855 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
4856
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05304857 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004858 TRACE_CODE_SME_RX_HDD_GET_RSSI, NO_SESSION, 0));
4859 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304860 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004861 status = csr_get_rssi(pMac, callback,
4862 staId, bssId, lastRSSI,
4863 pContext, p_cds_context);
4864 sme_release_global_lock(&pMac->sme);
4865 }
4866 return status;
4867}
4868
4869/* ---------------------------------------------------------------------------
4870 \fn sme_get_snr
4871 \brief a wrapper function that client calls to register a callback to
4872 get SNR
4873
4874 \param callback - SME sends back the requested stats using the callback
4875 \param staId - The station ID for which the stats is requested for
4876 \param pContext - user context to be passed back along with the callback
4877 \param p_cds_context - cds context
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304878 \return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004879 ---------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304880QDF_STATUS sme_get_snr(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004881 tCsrSnrCallback callback,
Anurag Chouhan6d760662016-02-20 16:05:43 +05304882 uint8_t staId, struct qdf_mac_addr bssId, void *pContext)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004883{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304884 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004885 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
4886
4887 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304888 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004889 status = csr_get_snr(pMac, callback, staId, bssId, pContext);
4890 sme_release_global_lock(&pMac->sme);
4891 }
4892 return status;
4893}
4894
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004895/* ---------------------------------------------------------------------------
4896 \fn sme_get_statistics
4897 \brief a wrapper function that client calls to register a callback to get
4898 different PHY level statistics from CSR.
4899
4900 \param requesterId - different client requesting for statistics,
4901 HDD, UMA/GAN etc
4902 \param statsMask - The different category/categories of stats requester
4903 is looking for
4904 \param callback - SME sends back the requested stats using the callback
4905 \param periodicity - If requester needs periodic update in millisec, 0 means
4906 it's an one time request
4907 \param cache - If requester is happy with cached stats
4908 \param staId - The station ID for which the stats is requested for
4909 \param pContext - user context to be passed back along with the callback
4910 \param sessionId - sme session interface
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304911 \return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004912 ---------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304913QDF_STATUS sme_get_statistics(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004914 eCsrStatsRequesterType requesterId,
4915 uint32_t statsMask, tCsrStatsCallback callback,
4916 uint32_t periodicity, bool cache, uint8_t staId,
4917 void *pContext, uint8_t sessionId)
4918{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304919 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004920 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
4921
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05304922 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004923 TRACE_CODE_SME_RX_HDD_GET_STATS, NO_SESSION,
4924 periodicity));
4925 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304926 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004927 status =
4928 csr_get_statistics(pMac, requesterId, statsMask, callback,
4929 periodicity, cache, staId, pContext,
4930 sessionId);
4931 sme_release_global_lock(&pMac->sme);
4932 }
4933
4934 return status;
4935
4936}
4937
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304938QDF_STATUS sme_get_link_status(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004939 tCsrLinkStatusCallback callback,
4940 void *pContext, uint8_t sessionId)
4941{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304942 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004943 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
4944 tAniGetLinkStatus *pMsg;
Rajeev Kumar37d478b2017-04-17 16:59:28 -07004945 struct scheduler_msg message = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004946
4947 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304948 if (QDF_IS_STATUS_SUCCESS(status)) {
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304949 pMsg = qdf_mem_malloc(sizeof(tAniGetLinkStatus));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004950 if (NULL == pMsg) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05304951 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004952 "%s: Not able to allocate memory for link status",
4953 __func__);
4954 sme_release_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304955 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004956 }
4957
4958 pMsg->msgType = WMA_LINK_STATUS_GET_REQ;
4959 pMsg->msgLen = (uint16_t) sizeof(tAniGetLinkStatus);
4960 pMsg->sessionId = sessionId;
4961 pMac->sme.linkStatusContext = pContext;
4962 pMac->sme.linkStatusCallback = callback;
4963
Rajeev Kumar8eaedf62017-01-21 11:03:13 -08004964 message.type = WMA_LINK_STATUS_GET_REQ;
4965 message.bodyptr = pMsg;
4966 message.reserved = 0;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004967
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304968 if (!QDF_IS_STATUS_SUCCESS
Rajeev Kumar8eaedf62017-01-21 11:03:13 -08004969 (scheduler_post_msg(QDF_MODULE_ID_WMA,
4970 &message))) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05304971 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004972 "%s: Post LINK STATUS MSG fail", __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304973 qdf_mem_free(pMsg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004974 pMac->sme.linkStatusContext = NULL;
4975 pMac->sme.linkStatusCallback = NULL;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304976 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004977 }
4978
4979 sme_release_global_lock(&pMac->sme);
4980 }
4981
4982 return status;
4983}
4984
4985/* ---------------------------------------------------------------------------
4986
4987 \fn sme_get_country_code
4988
4989 \brief To return the current country code. If no country code is applied,
4990 default country code is used to fill the buffer.
4991 If 11d supported is turned off, an error is return and the last
4992 applied/default country code is used.
4993 This is a synchronous API.
4994
4995 \param pBuf - pointer to a caller allocated buffer for returned country code.
4996
4997 \param pbLen For input, this parameter indicates how big is the buffer.
4998 Upon return, this parameter has the number of bytes for
4999 country. If pBuf doesn't have enough space, this function
5000 returns fail status and this parameter contains the number
5001 that is needed.
5002
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305003 \return QDF_STATUS SUCCESS.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005004
5005 FAILURE or RESOURCES The API finished and failed.
5006
5007 -------------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305008QDF_STATUS sme_get_country_code(tHalHandle hHal, uint8_t *pBuf, uint8_t *pbLen)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005009{
5010 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
5011
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05305012 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005013 TRACE_CODE_SME_RX_HDD_GET_CNTRYCODE, NO_SESSION, 0));
5014
5015 return csr_get_country_code(pMac, pBuf, pbLen);
5016}
5017
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005018/* some support functions */
5019bool sme_is11d_supported(tHalHandle hHal)
5020{
5021 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
5022
5023 return csr_is11d_supported(pMac);
5024}
5025
5026bool sme_is11h_supported(tHalHandle hHal)
5027{
5028 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
5029
5030 return csr_is11h_supported(pMac);
5031}
5032
5033bool sme_is_wmm_supported(tHalHandle hHal)
5034{
5035 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
5036
5037 return csr_is_wmm_supported(pMac);
5038}
5039
5040/* ---------------------------------------------------------------------------
5041
5042 \fn sme_change_country_code
5043
5044 \brief Change Country code from upperlayer during WLAN driver operation.
5045 This is a synchronous API.
5046
5047 \param hHal - The handle returned by mac_open.
5048
5049 \param pCountry New Country Code String
5050
5051 \param sendRegHint If we want to send reg hint to nl80211
5052
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305053 \return QDF_STATUS SUCCESS.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005054
5055 FAILURE or RESOURCES The API finished and failed.
5056
5057 -------------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305058QDF_STATUS sme_change_country_code(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005059 tSmeChangeCountryCallback callback,
5060 uint8_t *pCountry,
5061 void *pContext,
5062 void *p_cds_context,
5063 tAniBool countryFromUserSpace,
5064 tAniBool sendRegHint)
5065{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305066 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005067 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Rajeev Kumar37d478b2017-04-17 16:59:28 -07005068 struct scheduler_msg msg = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005069 tAniChangeCountryCodeReq *pMsg;
5070
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05305071 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005072 TRACE_CODE_SME_RX_HDD_CHANGE_CNTRYCODE, NO_SESSION,
5073 0));
5074 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305075 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005076 if ((pMac->roam.configParam.Is11dSupportEnabledOriginal == true)
5077 && (!pMac->roam.configParam.
5078 fSupplicantCountryCodeHasPriority)) {
5079
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07005080 sme_warn("Set Country Code Fail since the STA is associated and userspace does not have priority");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005081
5082 sme_release_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305083 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005084 return status;
5085 }
5086
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305087 pMsg = qdf_mem_malloc(sizeof(tAniChangeCountryCodeReq));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005088 if (NULL == pMsg) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07005089 sme_err("csrChangeCountryCode: failed to allocate mem for req");
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_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005092 }
5093
5094 pMsg->msgType = eWNI_SME_CHANGE_COUNTRY_CODE;
5095 pMsg->msgLen = (uint16_t) sizeof(tAniChangeCountryCodeReq);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305096 qdf_mem_copy(pMsg->countryCode, pCountry, 3);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005097 pMsg->countryFromUserSpace = countryFromUserSpace;
5098 pMsg->sendRegHint = sendRegHint;
5099 pMsg->changeCCCallback = callback;
5100 pMsg->pDevContext = pContext;
5101 pMsg->p_cds_context = p_cds_context;
5102
5103 msg.type = eWNI_SME_CHANGE_COUNTRY_CODE;
5104 msg.bodyptr = pMsg;
5105 msg.reserved = 0;
5106
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305107 if (QDF_STATUS_SUCCESS !=
Rajeev Kumar8eaedf62017-01-21 11:03:13 -08005108 scheduler_post_msg(QDF_MODULE_ID_SME, &msg)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07005109 sme_err("sme_change_country_code failed to post msg to self");
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305110 qdf_mem_free((void *)pMsg);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305111 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005112 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005113 sme_release_global_lock(&pMac->sme);
5114 }
5115
5116 return status;
5117}
5118
5119/*--------------------------------------------------------------------------
5120
5121 \fn sme_generic_change_country_code
5122
5123 \brief Change Country code from upperlayer during WLAN driver operation.
5124 This is a synchronous API.
5125
5126 \param hHal - The handle returned by mac_open.
5127
5128 \param pCountry New Country Code String
5129
5130 \param reg_domain regulatory domain
5131
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305132 \return QDF_STATUS SUCCESS.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005133
5134 FAILURE or RESOURCES The API finished and failed.
5135
5136 -----------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305137QDF_STATUS sme_generic_change_country_code(tHalHandle hHal,
Amar Singhal7f1f3ec2015-10-13 17:14:08 -07005138 uint8_t *pCountry)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005139{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305140 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005141 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Rajeev Kumar37d478b2017-04-17 16:59:28 -07005142 struct scheduler_msg msg = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005143 tAniGenericChangeCountryCodeReq *pMsg;
5144
5145 if (NULL == pMac) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05305146 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_FATAL,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005147 "%s: pMac is null", __func__);
5148 return status;
5149 }
5150
5151 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305152 if (QDF_IS_STATUS_SUCCESS(status)) {
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305153 pMsg = qdf_mem_malloc(sizeof(tAniGenericChangeCountryCodeReq));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005154
5155 if (NULL == pMsg) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07005156 sme_err("sme_generic_change_country_code: failed to allocate mem for req");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005157 sme_release_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305158 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005159 }
5160
5161 pMsg->msgType = eWNI_SME_GENERIC_CHANGE_COUNTRY_CODE;
5162 pMsg->msgLen =
5163 (uint16_t) sizeof(tAniGenericChangeCountryCodeReq);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305164 qdf_mem_copy(pMsg->countryCode, pCountry, 2);
Amar Singhal7f1f3ec2015-10-13 17:14:08 -07005165 pMsg->countryCode[2] = ' ';
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005166
5167 msg.type = eWNI_SME_GENERIC_CHANGE_COUNTRY_CODE;
5168 msg.bodyptr = pMsg;
5169 msg.reserved = 0;
5170
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305171 if (QDF_STATUS_SUCCESS !=
Rajeev Kumar8eaedf62017-01-21 11:03:13 -08005172 scheduler_post_msg(QDF_MODULE_ID_SME, &msg)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07005173 sme_err("sme_generic_change_country_code failed to post msg to self");
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305174 qdf_mem_free(pMsg);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305175 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005176 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005177 sme_release_global_lock(&pMac->sme);
5178 }
5179
5180 return status;
5181}
5182
5183/* ---------------------------------------------------------------------------
5184
5185 \fn sme_dhcp_start_ind
5186
5187 \brief API to signal the FW about the DHCP Start event.
5188
5189 \param hHal - HAL handle for device.
5190
5191 \param device_mode - mode(AP,SAP etc) of the device.
5192
5193 \param macAddr - MAC address of the adapter.
5194
5195 \param sessionId - session ID.
5196
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305197 \return QDF_STATUS SUCCESS.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005198
5199 FAILURE or RESOURCES The API finished and failed.
5200 --------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305201QDF_STATUS sme_dhcp_start_ind(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005202 uint8_t device_mode,
5203 uint8_t *macAddr, uint8_t sessionId)
5204{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305205 QDF_STATUS status;
5206 QDF_STATUS qdf_status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005207 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Rajeev Kumar37d478b2017-04-17 16:59:28 -07005208 struct scheduler_msg message = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005209 tAniDHCPInd *pMsg;
5210 tCsrRoamSession *pSession;
5211
5212 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305213 if (QDF_STATUS_SUCCESS == status) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005214 pSession = CSR_GET_SESSION(pMac, sessionId);
5215
5216 if (!pSession) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07005217 sme_err("Session: %d not found", sessionId);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005218 sme_release_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305219 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005220 }
Arif Hussain3316f402016-11-10 13:08:03 -08005221 pSession->dhcp_done = false;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005222
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305223 pMsg = (tAniDHCPInd *) qdf_mem_malloc(sizeof(tAniDHCPInd));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005224 if (NULL == pMsg) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05305225 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005226 "%s: Not able to allocate memory for dhcp start",
5227 __func__);
5228 sme_release_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305229 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005230 }
5231 pMsg->msgType = WMA_DHCP_START_IND;
5232 pMsg->msgLen = (uint16_t) sizeof(tAniDHCPInd);
5233 pMsg->device_mode = device_mode;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305234 qdf_mem_copy(pMsg->adapterMacAddr.bytes, macAddr,
Anurag Chouhan6d760662016-02-20 16:05:43 +05305235 QDF_MAC_ADDR_SIZE);
Anurag Chouhanc5548422016-02-24 18:33:27 +05305236 qdf_copy_macaddr(&pMsg->peerMacAddr,
Srinivas Girigowda296105a2015-09-24 16:31:16 -07005237 &pSession->connectedProfile.bssid);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005238
Rajeev Kumar8eaedf62017-01-21 11:03:13 -08005239 message.type = WMA_DHCP_START_IND;
5240 message.bodyptr = pMsg;
5241 message.reserved = 0;
Sreelakshmi Konamki6a065362016-05-31 16:05:01 +05305242 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
Rajeev Kumar8eaedf62017-01-21 11:03:13 -08005243 sessionId, message.type));
5244 qdf_status = scheduler_post_msg(QDF_MODULE_ID_WMA,
5245 &message);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305246 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05305247 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005248 "%s: Post DHCP Start MSG fail", __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305249 qdf_mem_free(pMsg);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305250 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005251 }
5252 sme_release_global_lock(&pMac->sme);
5253 }
5254 return status;
5255}
5256
5257/* ---------------------------------------------------------------------------
5258 \fn sme_dhcp_stop_ind
5259
5260 \brief API to signal the FW about the DHCP complete event.
5261
5262 \param hHal - HAL handle for device.
5263
5264 \param device_mode - mode(AP, SAP etc) of the device.
5265
5266 \param macAddr - MAC address of the adapter.
5267
5268 \param sessionId - session ID.
5269
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305270 \return QDF_STATUS SUCCESS.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005271 FAILURE or RESOURCES The API finished and failed.
5272 --------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305273QDF_STATUS sme_dhcp_stop_ind(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005274 uint8_t device_mode,
5275 uint8_t *macAddr, uint8_t sessionId)
5276{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305277 QDF_STATUS status;
5278 QDF_STATUS qdf_status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005279 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Rajeev Kumar37d478b2017-04-17 16:59:28 -07005280 struct scheduler_msg message = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005281 tAniDHCPInd *pMsg;
5282 tCsrRoamSession *pSession;
5283
5284 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305285 if (QDF_STATUS_SUCCESS == status) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005286 pSession = CSR_GET_SESSION(pMac, sessionId);
5287
5288 if (!pSession) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07005289 sme_err("Session: %d not found", sessionId);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005290 sme_release_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305291 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005292 }
Arif Hussain3316f402016-11-10 13:08:03 -08005293 pSession->dhcp_done = true;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005294
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305295 pMsg = (tAniDHCPInd *) qdf_mem_malloc(sizeof(tAniDHCPInd));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005296 if (NULL == pMsg) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05305297 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005298 "%s: Not able to allocate memory for dhcp stop",
5299 __func__);
5300 sme_release_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305301 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005302 }
5303
5304 pMsg->msgType = WMA_DHCP_STOP_IND;
5305 pMsg->msgLen = (uint16_t) sizeof(tAniDHCPInd);
5306 pMsg->device_mode = device_mode;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305307 qdf_mem_copy(pMsg->adapterMacAddr.bytes, macAddr,
Anurag Chouhan6d760662016-02-20 16:05:43 +05305308 QDF_MAC_ADDR_SIZE);
Anurag Chouhanc5548422016-02-24 18:33:27 +05305309 qdf_copy_macaddr(&pMsg->peerMacAddr,
Srinivas Girigowda296105a2015-09-24 16:31:16 -07005310 &pSession->connectedProfile.bssid);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005311
Rajeev Kumar8eaedf62017-01-21 11:03:13 -08005312 message.type = WMA_DHCP_STOP_IND;
5313 message.bodyptr = pMsg;
5314 message.reserved = 0;
Sreelakshmi Konamki6a065362016-05-31 16:05:01 +05305315 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
Rajeev Kumar8eaedf62017-01-21 11:03:13 -08005316 sessionId, message.type));
5317 qdf_status = scheduler_post_msg(QDF_MODULE_ID_WMA,
5318 &message);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305319 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05305320 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005321 "%s: Post DHCP Stop MSG fail", __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305322 qdf_mem_free(pMsg);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305323 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005324 }
5325
5326 sme_release_global_lock(&pMac->sme);
5327 }
5328 return status;
5329}
5330
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08005331/*---------------------------------------------------------------------------
5332
5333 \fn sme_TXFailMonitorStopInd
5334
5335 \brief API to signal the FW to start monitoring TX failures
5336
5337 \return QDF_STATUS SUCCESS.
5338
5339 FAILURE or RESOURCES The API finished and failed.
5340 --------------------------------------------------------------------------*/
5341QDF_STATUS sme_tx_fail_monitor_start_stop_ind(tHalHandle hHal, uint8_t tx_fail_count,
5342 void *txFailIndCallback)
5343{
5344 QDF_STATUS status;
5345 QDF_STATUS qdf_status;
5346 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Rajeev Kumar37d478b2017-04-17 16:59:28 -07005347 struct scheduler_msg message = {0};
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08005348 tAniTXFailMonitorInd *pMsg;
5349
5350 status = sme_acquire_global_lock(&pMac->sme);
5351 if (QDF_STATUS_SUCCESS == status) {
5352 pMsg = (tAniTXFailMonitorInd *)
5353 qdf_mem_malloc(sizeof(tAniTXFailMonitorInd));
5354 if (NULL == pMsg) {
5355 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
5356 "%s: Failed to allocate memory", __func__);
5357 sme_release_global_lock(&pMac->sme);
5358 return QDF_STATUS_E_NOMEM;
5359 }
5360
5361 pMsg->msgType = WMA_TX_FAIL_MONITOR_IND;
5362 pMsg->msgLen = (uint16_t) sizeof(tAniTXFailMonitorInd);
5363
5364 /* tx_fail_count = 0 should disable the Monitoring in FW */
5365 pMsg->tx_fail_count = tx_fail_count;
5366 pMsg->txFailIndCallback = txFailIndCallback;
5367
Rajeev Kumar8eaedf62017-01-21 11:03:13 -08005368 message.type = WMA_TX_FAIL_MONITOR_IND;
5369 message.bodyptr = pMsg;
5370 message.reserved = 0;
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08005371
Rajeev Kumar8eaedf62017-01-21 11:03:13 -08005372 qdf_status = scheduler_post_msg(QDF_MODULE_ID_WMA,
5373 &message);
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08005374 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
5375 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
5376 "%s: Post TX Fail monitor Start MSG fail",
5377 __func__);
5378 qdf_mem_free(pMsg);
5379 status = QDF_STATUS_E_FAILURE;
5380 }
5381 sme_release_global_lock(&pMac->sme);
5382 }
5383 return status;
5384}
5385
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005386/* ---------------------------------------------------------------------------
5387 \fn sme_set_cfg_privacy
5388 \brief API to set configure privacy parameters
5389 \param hHal - The handle returned by mac_open.
5390 \param pProfile - Pointer CSR Roam profile.
5391 \param fPrivacy - This parameter indicates status of privacy
5392
5393 \return void
5394 ---------------------------------------------------------------------------*/
5395void sme_set_cfg_privacy(tHalHandle hHal,
5396 tCsrRoamProfile *pProfile, bool fPrivacy)
5397{
5398 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05305399 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005400 TRACE_CODE_SME_RX_HDD_SET_CFGPRIVACY, NO_SESSION, 0));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305401 if (QDF_STATUS_SUCCESS == sme_acquire_global_lock(&pMac->sme)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005402 csr_set_cfg_privacy(pMac, pProfile, fPrivacy);
5403 sme_release_global_lock(&pMac->sme);
5404 }
5405}
5406
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005407/* ---------------------------------------------------------------------------
5408 \fn sme_neighbor_report_request
5409 \brief API to request neighbor report.
5410 \param hHal - The handle returned by mac_open.
5411 \param pRrmNeighborReq - Pointer to a caller allocated object of type
5412 tRrmNeighborReq. Caller owns the memory and is
5413 responsible for freeing it.
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305414 \return QDF_STATUS
5415 QDF_STATUS_E_FAILURE - failure
5416 QDF_STATUS_SUCCESS success
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005417 ---------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305418QDF_STATUS sme_neighbor_report_request(tHalHandle hHal, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005419 tpRrmNeighborReq pRrmNeighborReq,
5420 tpRrmNeighborRspCallbackInfo callbackInfo)
5421{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305422 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005423 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05305424 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005425 TRACE_CODE_SME_RX_HDD_NEIGHBOR_REPORTREQ, NO_SESSION,
5426 0));
5427
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305428 if (QDF_STATUS_SUCCESS == sme_acquire_global_lock(&pMac->sme)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005429 status =
5430 sme_rrm_neighbor_report_request(hHal, sessionId,
5431 pRrmNeighborReq, callbackInfo);
5432 sme_release_global_lock(&pMac->sme);
5433 }
5434
5435 return status;
5436}
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005437
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005438/* ---------------------------------------------------------------------------
5439 \fn sme_get_wcnss_wlan_compiled_version
5440 \brief This API returns the version of the WCNSS WLAN API with
5441 which the HOST driver was built
5442 \param hHal - The handle returned by mac_open.
5443 \param pVersion - Points to the Version structure to be filled
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305444 \return QDF_STATUS
5445 QDF_STATUS_E_INVAL - failure
5446 QDF_STATUS_SUCCESS success
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005447 ---------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305448QDF_STATUS sme_get_wcnss_wlan_compiled_version(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005449 tSirVersionType *pVersion)
5450{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305451 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005452 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
5453
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305454 if (QDF_STATUS_SUCCESS == sme_acquire_global_lock(&pMac->sme)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005455 if (pVersion != NULL)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305456 status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005457 else
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305458 status = QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005459
5460 sme_release_global_lock(&pMac->sme);
5461 }
5462
5463 return status;
5464}
5465
5466/* ---------------------------------------------------------------------------
5467 \fn sme_get_wcnss_wlan_reported_version
5468 \brief This API returns the version of the WCNSS WLAN API with
5469 which the WCNSS driver reports it was built
5470 \param hHal - The handle returned by mac_open.
5471 \param pVersion - Points to the Version structure to be filled
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305472 \return QDF_STATUS
5473 QDF_STATUS_E_INVAL - failure
5474 QDF_STATUS_SUCCESS success
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005475 ---------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305476QDF_STATUS sme_get_wcnss_wlan_reported_version(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005477 tSirVersionType *pVersion)
5478{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305479 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005480 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
5481
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305482 if (QDF_STATUS_SUCCESS == sme_acquire_global_lock(&pMac->sme)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005483 if (pVersion != NULL)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305484 status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005485 else
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305486 status = QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005487
5488 sme_release_global_lock(&pMac->sme);
5489 }
5490
5491 return status;
5492}
5493
5494/* ---------------------------------------------------------------------------
5495 \fn sme_get_wcnss_software_version
5496 \brief This API returns the version string of the WCNSS driver
5497 \param hHal - The handle returned by mac_open.
5498 \param pVersion - Points to the Version string buffer to be filled
5499 \param versionBufferSize - THe size of the Version string buffer
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305500 \return QDF_STATUS
5501 QDF_STATUS_E_INVAL - failure
5502 QDF_STATUS_SUCCESS success
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005503 ---------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305504QDF_STATUS sme_get_wcnss_software_version(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005505 uint8_t *pVersion,
5506 uint32_t versionBufferSize)
5507{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305508 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005509 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
5510 v_CONTEXT_t cds_context = cds_get_global_context();
5511
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305512 if (QDF_STATUS_SUCCESS == sme_acquire_global_lock(&pMac->sme)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005513 if (pVersion != NULL) {
5514 status =
5515 wma_get_wcnss_software_version(cds_context,
5516 pVersion,
5517 versionBufferSize);
5518 } else {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305519 status = QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005520 }
5521 sme_release_global_lock(&pMac->sme);
5522 }
5523
5524 return status;
5525}
5526
5527/* ---------------------------------------------------------------------------
5528 \fn sme_get_wcnss_hardware_version
5529 \brief This API returns the version string of the WCNSS hardware
5530 \param hHal - The handle returned by mac_open.
5531 \param pVersion - Points to the Version string buffer to be filled
5532 \param versionBufferSize - THe size of the Version string buffer
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305533 \return QDF_STATUS
5534 QDF_STATUS_E_INVAL - failure
5535 QDF_STATUS_SUCCESS success
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005536 ---------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305537QDF_STATUS sme_get_wcnss_hardware_version(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005538 uint8_t *pVersion,
5539 uint32_t versionBufferSize)
5540{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305541 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005542 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
5543
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305544 if (QDF_STATUS_SUCCESS == sme_acquire_global_lock(&pMac->sme)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005545 if (pVersion != NULL)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305546 status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005547 else
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305548 status = QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005549
5550 sme_release_global_lock(&pMac->sme);
5551 }
5552
5553 return status;
5554}
5555
5556#ifdef FEATURE_WLAN_WAPI
5557
5558/* ---------------------------------------------------------------------------
5559 \fn sme_scan_get_bkid_candidate_list
5560 \brief a wrapper function to return the BKID candidate list
5561 \param pBkidList - caller allocated buffer point to an array of
5562 tBkidCandidateInfo
5563 \param pNumItems - pointer to a variable that has the number of
5564 tBkidCandidateInfo allocated when retruning, this is
5565 either the number needed or number of items put into
5566 pPmkidList
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305567 \return QDF_STATUS - when fail, it usually means the buffer allocated is not
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005568 big enough and pNumItems
5569 has the number of tBkidCandidateInfo.
5570 \Note: pNumItems is a number of tBkidCandidateInfo,
5571 not sizeof(tBkidCandidateInfo) * something
5572 ---------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305573QDF_STATUS sme_scan_get_bkid_candidate_list(tHalHandle hHal, uint32_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005574 tBkidCandidateInfo *pBkidList,
5575 uint32_t *pNumItems)
5576{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305577 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005578 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
5579
5580 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305581 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005582 status =
5583 csr_scan_get_bkid_candidate_list(pMac, sessionId, pBkidList,
5584 pNumItems);
5585 sme_release_global_lock(&pMac->sme);
5586 }
5587
5588 return status;
5589}
5590#endif /* FEATURE_WLAN_WAPI */
5591
5592#ifdef FEATURE_OEM_DATA_SUPPORT
Krishna Kumaar Natarajanc5e06ac2016-06-30 16:49:19 -07005593/**
5594 * sme_oem_data_req() - send oem data request to WMA
5595 * @hal: HAL handle
5596 * @hdd_oem_req: OEM data request from HDD
5597 *
5598 * Return: QDF_STATUS
5599 */
Krishna Kumaar Natarajanc1fa17d2016-08-03 14:19:20 -07005600QDF_STATUS sme_oem_data_req(tHalHandle hal, struct oem_data_req *hdd_oem_req)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005601{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305602 QDF_STATUS status = QDF_STATUS_SUCCESS;
Krishna Kumaar Natarajanc1fa17d2016-08-03 14:19:20 -07005603 struct oem_data_req *oem_data_req;
Krishna Kumaar Natarajanc5e06ac2016-06-30 16:49:19 -07005604 void *wma_handle;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005605
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07005606 SME_ENTER();
Krishna Kumaar Natarajanc5e06ac2016-06-30 16:49:19 -07005607 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
5608 if (!wma_handle) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07005609 sme_err("wma_handle is NULL");
Krishna Kumaar Natarajanc5e06ac2016-06-30 16:49:19 -07005610 return QDF_STATUS_E_FAILURE;
5611 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005612
Krishna Kumaar Natarajanc5e06ac2016-06-30 16:49:19 -07005613 oem_data_req = qdf_mem_malloc(sizeof(*oem_data_req));
5614 if (!oem_data_req) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07005615 sme_err("mem alloc failed");
Krishna Kumaar Natarajanc5e06ac2016-06-30 16:49:19 -07005616 return QDF_STATUS_E_NOMEM;
5617 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005618
Krishna Kumaar Natarajanc5e06ac2016-06-30 16:49:19 -07005619 oem_data_req->data_len = hdd_oem_req->data_len;
5620 oem_data_req->data = qdf_mem_malloc(oem_data_req->data_len);
5621 if (!oem_data_req->data) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07005622 sme_err("mem alloc failed");
Krishna Kumaar Natarajanc5e06ac2016-06-30 16:49:19 -07005623 return QDF_STATUS_E_NOMEM;
5624 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005625
Krishna Kumaar Natarajanc5e06ac2016-06-30 16:49:19 -07005626 qdf_mem_copy(oem_data_req->data, hdd_oem_req->data,
5627 oem_data_req->data_len);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005628
Krishna Kumaar Natarajanc5e06ac2016-06-30 16:49:19 -07005629 status = wma_start_oem_data_req(wma_handle, oem_data_req);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005630
Krishna Kumaar Natarajanc5e06ac2016-06-30 16:49:19 -07005631 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07005632 sme_err("Post oem data request msg fail");
Krishna Kumaar Natarajanc5e06ac2016-06-30 16:49:19 -07005633 } else {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07005634 sme_debug("OEM request(length: %d) sent to WMA",
5635 oem_data_req->data_len);
Krishna Kumaar Natarajanc5e06ac2016-06-30 16:49:19 -07005636 }
5637
5638 if (oem_data_req->data_len)
5639 qdf_mem_free(oem_data_req->data);
5640 qdf_mem_free(oem_data_req);
5641
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07005642 SME_EXIT();
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005643 return status;
5644}
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005645#endif /*FEATURE_OEM_DATA_SUPPORT */
5646
5647/*--------------------------------------------------------------------------
5648
5649 \brief sme_open_session() - Open a session for scan/roam operation.
5650
5651 This is a synchronous API.
5652
5653 \param hHal - The handle returned by mac_open.
5654 \param callback - A pointer to the function caller specifies for
5655 roam/connect status indication
5656 \param pContext - The context passed with callback
5657 \param pSelfMacAddr - Caller allocated memory filled with self MAC address
5658 (6 bytes)
Dustin Brownd28772b2017-03-17 14:16:07 -07005659 \param session_id - the Id to use for the newly opened session
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005660
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305661 \return QDF_STATUS_SUCCESS - session is opened. sessionId returned.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005662
5663 Other status means SME is failed to open the session.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005664 \sa
5665
5666 --------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305667QDF_STATUS sme_open_session(tHalHandle hHal, csr_roam_completeCallback callback,
Dustin Brownd28772b2017-03-17 14:16:07 -07005668 void *pContext, uint8_t *pSelfMacAddr,
5669 uint8_t session_id, uint32_t type, uint32_t subType)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005670{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305671 QDF_STATUS status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005672 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
5673
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05305674 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_HIGH,
Rajeev Kumar7414c8c2017-04-06 15:42:52 -07005675 "%s: type=%d, session_id %d subType=%d addr:%pM",
5676 __func__, type, session_id, subType, pSelfMacAddr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005677
Dustin Brownd28772b2017-03-17 14:16:07 -07005678 status = sme_acquire_global_lock(&pMac->sme);
5679 if (QDF_IS_STATUS_ERROR(status))
5680 return status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005681
Dustin Brownd28772b2017-03-17 14:16:07 -07005682 status = csr_roam_open_session(pMac, callback, pContext, pSelfMacAddr,
5683 session_id, type, subType);
5684 sme_release_global_lock(&pMac->sme);
5685
5686 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_RX_HDD_OPEN_SESSION,
5687 session_id, 0));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005688
5689 return status;
5690}
5691
5692/*--------------------------------------------------------------------------
5693
5694 \brief sme_close_session() - Open a session for scan/roam operation.
5695
5696 This is a synchronous API.
5697
5698 \param hHal - The handle returned by mac_open.
5699
5700 \param sessionId - A previous opened session's ID.
5701
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305702 \return QDF_STATUS_SUCCESS - session is closed.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005703
5704 Other status means SME is failed to open the session.
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305705 QDF_STATUS_E_INVAL - session is not opened.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005706 \sa
5707
5708 --------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305709QDF_STATUS sme_close_session(tHalHandle hHal, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005710 csr_roamSessionCloseCallback callback,
5711 void *pContext)
5712{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305713 QDF_STATUS status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005714 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
5715
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05305716 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005717 TRACE_CODE_SME_RX_HDD_CLOSE_SESSION, sessionId, 0));
5718 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305719 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005720 status = csr_roam_close_session(pMac, sessionId, false,
5721 callback, pContext);
5722
5723 sme_release_global_lock(&pMac->sme);
5724 }
5725
5726 return status;
5727}
5728
5729/* ---------------------------------------------------------------------------
5730
5731 \fn sme_roam_update_apwpsie
5732
5733 \brief To update AP's WPS IE. This function should be called after SME AP session is created
5734 This is an asynchronous API.
5735
5736 \param pAPWPSIES - pointer to a caller allocated object of tSirAPWPSIEs
5737
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305738 \return QDF_STATUS – SUCCESS –
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005739
5740 FAILURE or RESOURCES – The API finished and failed.
5741
5742 -------------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305743QDF_STATUS sme_roam_update_apwpsie(tHalHandle hHal, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005744 tSirAPWPSIEs *pAPWPSIES)
5745{
5746
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305747 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005748 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
5749
5750 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305751 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005752
5753 status = csr_roam_update_apwpsie(pMac, sessionId, pAPWPSIES);
5754
5755 sme_release_global_lock(&pMac->sme);
5756 }
5757
5758 return status;
5759}
5760
5761/* ---------------------------------------------------------------------------
5762
5763 \fn sme_roam_update_apwparsni_es
5764
5765 \brief To update AP's WPA/RSN IEs. This function should be called after SME AP session is created
5766 This is an asynchronous API.
5767
5768 \param pAPSirRSNie - pointer to a caller allocated object of tSirRSNie with WPS/RSN IEs
5769
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305770 \return QDF_STATUS – SUCCESS –
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005771
5772 FAILURE or RESOURCES – The API finished and failed.
5773
5774 -------------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305775QDF_STATUS sme_roam_update_apwparsni_es(tHalHandle hHal, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005776 tSirRSNie *pAPSirRSNie)
5777{
5778
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305779 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005780 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
5781
5782 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305783 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005784
5785 status = csr_roam_update_wparsni_es(pMac, sessionId, pAPSirRSNie);
5786
5787 sme_release_global_lock(&pMac->sme);
5788 }
5789
5790 return status;
5791}
5792
5793/* ---------------------------------------------------------------------------
5794
5795 \fn sme_change_mcc_beacon_interval
5796
5797 \brief To update P2P-GO beaconInterval. This function should be called after
5798 disassociating all the station is done
5799 This is an asynchronous API.
5800
5801 \param
5802
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305803 \return QDF_STATUS SUCCESS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005804 FAILURE or RESOURCES
5805 The API finished and failed.
5806
5807 -------------------------------------------------------------------------------*/
Archana Ramachandran2eb7a612017-03-23 22:58:42 -07005808QDF_STATUS sme_change_mcc_beacon_interval(uint8_t sessionId)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005809{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305810 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Archana Ramachandran2eb7a612017-03-23 22:58:42 -07005811 tpAniSirGlobal mac_ctx = sme_get_mac_context();
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005812
Archana Ramachandran2eb7a612017-03-23 22:58:42 -07005813 status = sme_acquire_global_lock(&mac_ctx->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305814 if (QDF_IS_STATUS_SUCCESS(status)) {
Archana Ramachandran2eb7a612017-03-23 22:58:42 -07005815 status = csr_send_chng_mcc_beacon_interval(mac_ctx,
5816 sessionId);
5817 sme_release_global_lock(&mac_ctx->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005818 }
5819 return status;
5820}
5821
5822/**
5823 * sme_set_host_offload(): API to set the host offload feature.
5824 * @hHal: The handle returned by mac_open.
5825 * @sessionId: Session Identifier
5826 * @request: Pointer to the offload request.
5827 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305828 * Return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005829 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305830QDF_STATUS sme_set_host_offload(tHalHandle hHal, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005831 tpSirHostOffloadReq request)
5832{
5833 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305834 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005835
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05305836 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005837 TRACE_CODE_SME_RX_HDD_SET_HOSTOFFLOAD, sessionId, 0));
5838 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305839 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005840#ifdef WLAN_NS_OFFLOAD
5841 if (SIR_IPV6_NS_OFFLOAD == request->offloadType) {
5842 status = sme_set_ps_ns_offload(hHal, request,
5843 sessionId);
5844 } else
5845#endif /* WLAN_NS_OFFLOAD */
5846 {
5847 status = sme_set_ps_host_offload(hHal, request,
5848 sessionId);
5849 }
5850 sme_release_global_lock(&pMac->sme);
5851 }
5852
5853 return status;
5854}
5855
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005856/* ---------------------------------------------------------------------------
5857 \fn sme_set_keep_alive
5858 \brief API to set the Keep Alive feature.
5859 \param hHal - The handle returned by mac_open.
5860 \param request - Pointer to the Keep Alive request.
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305861 \return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005862 ---------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305863QDF_STATUS sme_set_keep_alive(tHalHandle hHal, uint8_t session_id,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005864 tpSirKeepAliveReq request)
5865{
5866 tpSirKeepAliveReq request_buf;
Rajeev Kumar37d478b2017-04-17 16:59:28 -07005867 struct scheduler_msg msg = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005868 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
5869 tCsrRoamSession *pSession = CSR_GET_SESSION(pMac, session_id);
5870
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05305871 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO_LOW,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005872 FL("WMA_SET_KEEP_ALIVE message"));
5873
5874 if (pSession == NULL) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05305875 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005876 FL("Session not Found"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305877 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005878 }
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305879 request_buf = qdf_mem_malloc(sizeof(tSirKeepAliveReq));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005880 if (NULL == request_buf) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05305881 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005882 FL("Not able to allocate memory for keep alive request"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305883 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005884 }
5885
Anurag Chouhanc5548422016-02-24 18:33:27 +05305886 qdf_copy_macaddr(&request->bssid, &pSession->connectedProfile.bssid);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305887 qdf_mem_copy(request_buf, request, sizeof(tSirKeepAliveReq));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005888
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05305889 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO_LOW,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005890 "buff TP %d input TP %d ", request_buf->timePeriod,
5891 request->timePeriod);
5892 request_buf->sessionId = session_id;
5893
5894 msg.type = WMA_SET_KEEP_ALIVE;
5895 msg.reserved = 0;
5896 msg.bodyptr = request_buf;
Sreelakshmi Konamki6a065362016-05-31 16:05:01 +05305897 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
5898 session_id, msg.type));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305899 if (QDF_STATUS_SUCCESS !=
Rajeev Kumar8eaedf62017-01-21 11:03:13 -08005900 scheduler_post_msg(QDF_MODULE_ID_WMA, &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 FL("Not able to post WMA_SET_KEEP_ALIVE message to WMA"));
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305903 qdf_mem_free(request_buf);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305904 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005905 }
5906
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305907 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005908}
5909
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305910QDF_STATUS sme_abort_mac_scan(tHalHandle hHal, uint8_t sessionId,
yeshwanth sriram guntuka310b3ac2016-11-15 23:25:26 +05305911 uint32_t scan_id, eCsrAbortReason reason)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005912{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305913 QDF_STATUS status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005914 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
5915
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05305916 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005917 TRACE_CODE_SME_RX_HDD_ABORT_MACSCAN, NO_SESSION, 0));
5918 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305919 if (QDF_IS_STATUS_SUCCESS(status)) {
yeshwanth sriram guntuka310b3ac2016-11-15 23:25:26 +05305920 status = csr_scan_abort_mac_scan(pMac, sessionId,
5921 scan_id, reason);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005922
5923 sme_release_global_lock(&pMac->sme);
5924 }
5925
5926 return status;
5927}
5928
5929/* ----------------------------------------------------------------------------
5930 \fn sme_get_operation_channel
5931 \brief API to get current channel on which STA is parked
5932 this function gives channel information only of infra station or IBSS station
5933 \param hHal, pointer to memory location and sessionId
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305934 \returns QDF_STATUS_SUCCESS
5935 QDF_STATUS_E_FAILURE
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005936 -------------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305937QDF_STATUS sme_get_operation_channel(tHalHandle hHal, uint32_t *pChannel,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005938 uint8_t sessionId)
5939{
5940 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
5941 tCsrRoamSession *pSession;
5942
5943 if (CSR_IS_SESSION_VALID(pMac, sessionId)) {
5944 pSession = CSR_GET_SESSION(pMac, sessionId);
5945
5946 if ((pSession->connectedProfile.BSSType ==
5947 eCSR_BSS_TYPE_INFRASTRUCTURE)
5948 || (pSession->connectedProfile.BSSType ==
5949 eCSR_BSS_TYPE_IBSS)
5950 || (pSession->connectedProfile.BSSType ==
5951 eCSR_BSS_TYPE_INFRA_AP)
5952 || (pSession->connectedProfile.BSSType ==
5953 eCSR_BSS_TYPE_START_IBSS)) {
5954 *pChannel = pSession->connectedProfile.operationChannel;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305955 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005956 }
5957 }
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305958 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005959} /* sme_get_operation_channel ends here */
5960
Abhishek Singh7996eb72015-12-30 17:24:02 +05305961/**
Selvaraj, Sridhar4577a9b2016-09-04 15:17:07 +05305962 * sme_register_p2p_ack_ind_callback() - p2p ack indication callback
5963 * @hal: hal pointer
5964 * @callback: callback pointer to be registered
5965 *
5966 * This function is used to register a callback to PE for p2p ack
5967 * indication
5968 *
5969 * Return: Success if msg is posted to PE else Failure.
5970 */
5971QDF_STATUS sme_register_p2p_ack_ind_callback(tHalHandle hal,
5972 sir_p2p_ack_ind_callback callback)
5973{
5974 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
5975 struct sir_sme_p2p_ack_ind_cb_req *msg;
5976 QDF_STATUS status = QDF_STATUS_SUCCESS;
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07005977
Selvaraj, Sridhar4577a9b2016-09-04 15:17:07 +05305978 status = sme_acquire_global_lock(&mac_ctx->sme);
5979 if (QDF_IS_STATUS_SUCCESS(status)) {
5980 msg = qdf_mem_malloc(sizeof(*msg));
5981 if (NULL == msg) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07005982 sme_err("Failed to allocate memory");
5983 sme_release_global_lock(&mac_ctx->sme);
5984 return QDF_STATUS_E_NOMEM;
Selvaraj, Sridhar4577a9b2016-09-04 15:17:07 +05305985 }
Selvaraj, Sridhar4577a9b2016-09-04 15:17:07 +05305986 msg->message_type = eWNI_SME_REGISTER_P2P_ACK_CB;
5987 msg->length = sizeof(*msg);
5988
5989 msg->callback = callback;
Rajeev Kumard138ac52017-01-30 18:38:37 -08005990 status = umac_send_mb_message_to_mac(msg);
Selvaraj, Sridhar4577a9b2016-09-04 15:17:07 +05305991 sme_release_global_lock(&mac_ctx->sme);
5992 return status;
5993 }
5994 return status;
5995}
5996
5997/**
Abhishek Singh7996eb72015-12-30 17:24:02 +05305998 * sme_register_mgmt_frame_ind_callback() - Register a callback for
5999 * management frame indication to PE.
6000 *
6001 * @hal: hal pointer
6002 * @callback: callback pointer to be registered
6003 *
6004 * This function is used to register a callback for management
6005 * frame indication to PE.
6006 *
6007 * Return: Success if msg is posted to PE else Failure.
6008 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306009QDF_STATUS sme_register_mgmt_frame_ind_callback(tHalHandle hal,
Abhishek Singh7996eb72015-12-30 17:24:02 +05306010 sir_mgmt_frame_ind_callback callback)
6011{
6012 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
6013 struct sir_sme_mgmt_frame_cb_req *msg;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306014 QDF_STATUS status = QDF_STATUS_SUCCESS;
Abhishek Singh7996eb72015-12-30 17:24:02 +05306015
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306016 if (QDF_STATUS_SUCCESS ==
Abhishek Singh7996eb72015-12-30 17:24:02 +05306017 sme_acquire_global_lock(&mac_ctx->sme)) {
Anurag Chouhan600c3a02016-03-01 10:33:54 +05306018 msg = qdf_mem_malloc(sizeof(*msg));
Abhishek Singh7996eb72015-12-30 17:24:02 +05306019 if (NULL == msg) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07006020 sme_err("Not able to allocate memory");
Abhishek Singh7996eb72015-12-30 17:24:02 +05306021 sme_release_global_lock(&mac_ctx->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306022 return QDF_STATUS_E_NOMEM;
Abhishek Singh7996eb72015-12-30 17:24:02 +05306023 }
Abhishek Singh7996eb72015-12-30 17:24:02 +05306024 msg->message_type = eWNI_SME_REGISTER_MGMT_FRAME_CB;
6025 msg->length = sizeof(*msg);
6026
6027 msg->callback = callback;
Rajeev Kumard138ac52017-01-30 18:38:37 -08006028 status = umac_send_mb_message_to_mac(msg);
Abhishek Singh7996eb72015-12-30 17:24:02 +05306029 sme_release_global_lock(&mac_ctx->sme);
6030 return status;
6031 }
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306032 return QDF_STATUS_E_FAILURE;
Abhishek Singh7996eb72015-12-30 17:24:02 +05306033}
6034
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006035/* ---------------------------------------------------------------------------
6036
6037 \fn sme_RegisterMgtFrame
6038
6039 \brief To register managment frame of specified type and subtype.
6040 \param frameType - type of the frame that needs to be passed to HDD.
6041 \param matchData - data which needs to be matched before passing frame
6042 to HDD.
6043 \param matchDataLen - Length of matched data.
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306044 \return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006045 -------------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306046QDF_STATUS sme_register_mgmt_frame(tHalHandle hHal, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006047 uint16_t frameType, uint8_t *matchData,
6048 uint16_t matchLen)
6049{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306050 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006051 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
6052
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006053 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306054 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006055 tSirRegisterMgmtFrame *pMsg;
6056 uint16_t len;
6057 tCsrRoamSession *pSession = CSR_GET_SESSION(pMac, sessionId);
6058
6059 if (!CSR_IS_SESSION_ANY(sessionId) && !pSession) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07006060 sme_err("Session %d not found", sessionId);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006061 sme_release_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306062 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006063 }
6064
6065 if (!CSR_IS_SESSION_ANY(sessionId) && !pSession->sessionActive) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05306066 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006067 "%s Invalid Sessionid", __func__);
6068 sme_release_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306069 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006070 }
6071
6072 len = sizeof(tSirRegisterMgmtFrame) + matchLen;
6073
Anurag Chouhan600c3a02016-03-01 10:33:54 +05306074 pMsg = qdf_mem_malloc(len);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006075 if (NULL == pMsg)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306076 status = QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006077 else {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006078 pMsg->messageType = eWNI_SME_REGISTER_MGMT_FRAME_REQ;
6079 pMsg->length = len;
6080 pMsg->sessionId = sessionId;
6081 pMsg->registerFrame = true;
6082 pMsg->frameType = frameType;
6083 pMsg->matchLen = matchLen;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05306084 qdf_mem_copy(pMsg->matchData, matchData, matchLen);
Rajeev Kumard138ac52017-01-30 18:38:37 -08006085 status = umac_send_mb_message_to_mac(pMsg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006086 }
6087 sme_release_global_lock(&pMac->sme);
6088 }
6089 return status;
6090}
6091
6092/* ---------------------------------------------------------------------------
6093
6094 \fn sme_DeregisterMgtFrame
6095
6096 \brief To De-register managment frame of specified type and subtype.
6097 \param frameType - type of the frame that needs to be passed to HDD.
6098 \param matchData - data which needs to be matched before passing frame
6099 to HDD.
6100 \param matchDataLen - Length of matched data.
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306101 \return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006102 -------------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306103QDF_STATUS sme_deregister_mgmt_frame(tHalHandle hHal, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006104 uint16_t frameType, uint8_t *matchData,
6105 uint16_t matchLen)
6106{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306107 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006108 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
6109
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05306110 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006111 TRACE_CODE_SME_RX_HDD_DEREGISTER_MGMTFR, sessionId,
6112 0));
6113 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306114 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006115 tSirRegisterMgmtFrame *pMsg;
6116 uint16_t len;
6117 tCsrRoamSession *pSession = CSR_GET_SESSION(pMac, sessionId);
6118
6119 if (!CSR_IS_SESSION_ANY(sessionId) && !pSession) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07006120 sme_err("Session %d not found", sessionId);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006121 sme_release_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306122 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006123 }
6124
6125 if (!CSR_IS_SESSION_ANY(sessionId) && !pSession->sessionActive) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05306126 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006127 "%s Invalid Sessionid", __func__);
6128 sme_release_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306129 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006130 }
6131
6132 len = sizeof(tSirRegisterMgmtFrame) + matchLen;
6133
Anurag Chouhan600c3a02016-03-01 10:33:54 +05306134 pMsg = qdf_mem_malloc(len);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006135 if (NULL == pMsg)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306136 status = QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006137 else {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006138 pMsg->messageType = eWNI_SME_REGISTER_MGMT_FRAME_REQ;
6139 pMsg->length = len;
6140 pMsg->registerFrame = false;
6141 pMsg->frameType = frameType;
6142 pMsg->matchLen = matchLen;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05306143 qdf_mem_copy(pMsg->matchData, matchData, matchLen);
Rajeev Kumard138ac52017-01-30 18:38:37 -08006144 status = umac_send_mb_message_to_mac(pMsg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006145 }
6146 sme_release_global_lock(&pMac->sme);
6147 }
6148 return status;
6149}
6150
6151/**
6152 * sme_remain_on_channel - API to request remain on channel for 'x' duration
6153 *
6154 * @hHal: pointer to MAC handle
6155 * @session_id: Session identifier
6156 * @channel: channel information
6157 * @duration: duration in ms
6158 * @callback: HDD registered callback to process reaminOnChannelRsp
6159 * @context: HDD Callback param
6160 * @scan_id: scan identifier
6161 *
6162 * This function process the roc request and generates scan identifier.s
6163 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306164 * Return: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006165 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306166QDF_STATUS sme_remain_on_channel(tHalHandle hHal, uint8_t session_id,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006167 uint8_t channel, uint32_t duration,
6168 remainOnChanCallback callback,
6169 void *pContext, uint8_t isP2PProbeReqAllowed,
6170 uint32_t *scan_id)
6171{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306172 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006173 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hHal);
6174 uint32_t san_req_id, scan_count;
6175 struct ani_roc_req *roc_msg;
Rajeev Kumar37d478b2017-04-17 16:59:28 -07006176 struct scheduler_msg msg = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006177
6178
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05306179 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006180 TRACE_CODE_SME_RX_HDD_REMAIN_ONCHAN, session_id, 0));
6181
Krunal Soni81f068c2017-02-23 19:51:55 -08006182 scan_count = csr_scan_active_ll_count(mac_ctx);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006183 if (scan_count >= mac_ctx->scan.max_scan_count) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07006184 sme_err("Max scan reached");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306185 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006186 }
6187
6188 wma_get_scan_id(&san_req_id);
6189 *scan_id = san_req_id;
6190 status = sme_acquire_global_lock(&mac_ctx->sme);
6191
Anurag Chouhan600c3a02016-03-01 10:33:54 +05306192 roc_msg = qdf_mem_malloc(sizeof(struct ani_roc_req));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006193 if (NULL == roc_msg) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07006194 sme_err("scan_req: failed to allocate mem for msg");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006195 sme_release_global_lock(&mac_ctx->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306196 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006197 }
6198 roc_msg->msg_type = eWNI_SME_ROC_CMD;
6199 roc_msg->msg_len = (uint16_t) sizeof(struct ani_roc_req);
6200 roc_msg->session_id = session_id;
6201 roc_msg->callback = callback;
6202 roc_msg->duration = duration;
6203 roc_msg->channel = channel;
6204 roc_msg->is_p2pprobe_allowed = isP2PProbeReqAllowed;
6205 roc_msg->ctx = pContext;
6206 roc_msg->scan_id = *scan_id;
6207 msg.type = eWNI_SME_ROC_CMD;
6208 msg.bodyptr = roc_msg;
6209 msg.reserved = 0;
6210 msg.bodyval = 0;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306211 if (QDF_STATUS_SUCCESS !=
Rajeev Kumar8eaedf62017-01-21 11:03:13 -08006212 scheduler_post_msg(QDF_MODULE_ID_SME, &msg)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07006213 sme_err("sme_scan_req failed to post msg");
Anurag Chouhan600c3a02016-03-01 10:33:54 +05306214 qdf_mem_free(roc_msg);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306215 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006216 }
6217 sme_release_global_lock(&mac_ctx->sme);
6218 return status;
6219}
6220
6221/* ---------------------------------------------------------------------------
6222 \fn sme_report_probe_req
6223 \brief API to enable/disable forwarding of probeReq to apps in p2p.
6224 \param hHal - The handle returned by mac_open.
6225 \param falg: to set the Probe request forarding to wpa_supplicant in listen state in p2p
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306226 \return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006227 ---------------------------------------------------------------------------*/
6228
6229#ifndef WLAN_FEATURE_CONCURRENT_P2P
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306230QDF_STATUS sme_report_probe_req(tHalHandle hHal, uint8_t flag)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006231{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306232 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006233 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
6234
6235 do {
6236 /* acquire the lock for the sme object */
6237 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306238 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006239 /* call set in context */
6240 pMac->p2pContext.probeReqForwarding = flag;
6241 /* release the lock for the sme object */
6242 sme_release_global_lock(&pMac->sme);
6243 }
6244 } while (0);
6245
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006246 return status;
6247}
6248
6249/* ---------------------------------------------------------------------------
6250 \fn sme_update_p2p_ie
6251 \brief API to set the P2p Ie in p2p context
6252 \param hHal - The handle returned by mac_open.
6253 \param p2pIe - Ptr to p2pIe from HDD.
6254 \param p2pIeLength: length of p2pIe
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306255 \return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006256 ---------------------------------------------------------------------------*/
6257
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306258QDF_STATUS sme_update_p2p_ie(tHalHandle hHal, void *p2pIe, uint32_t p2pIeLength)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006259{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306260 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006261 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
6262
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05306263 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006264 TRACE_CODE_SME_RX_HDD_UPDATE_P2P_IE, NO_SESSION, 0));
6265 /* acquire the lock for the sme object */
6266 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306267 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006268 if (NULL != pMac->p2pContext.probeRspIe) {
Anurag Chouhan600c3a02016-03-01 10:33:54 +05306269 qdf_mem_free(pMac->p2pContext.probeRspIe);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006270 pMac->p2pContext.probeRspIeLength = 0;
6271 }
6272
Anurag Chouhan600c3a02016-03-01 10:33:54 +05306273 pMac->p2pContext.probeRspIe = qdf_mem_malloc(p2pIeLength);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006274 if (NULL == pMac->p2pContext.probeRspIe) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07006275 sme_err("Unable to allocate P2P IE");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006276 pMac->p2pContext.probeRspIeLength = 0;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306277 status = QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006278 } else {
6279 pMac->p2pContext.probeRspIeLength = p2pIeLength;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05306280 qdf_mem_copy((uint8_t *) pMac->p2pContext.probeRspIe,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006281 p2pIe, p2pIeLength);
6282 }
6283
6284 /* release the lock for the sme object */
6285 sme_release_global_lock(&pMac->sme);
6286 }
6287
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006288 return status;
6289}
6290#endif
6291
6292/* ---------------------------------------------------------------------------
6293 \fn sme_send_action
6294 \brief API to send action frame from supplicant.
6295 \param hHal - The handle returned by mac_open.
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306296 \return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006297 ---------------------------------------------------------------------------*/
6298
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306299QDF_STATUS sme_send_action(tHalHandle hHal, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006300 const uint8_t *pBuf, uint32_t len,
6301 uint16_t wait, bool noack,
6302 uint16_t channel_freq)
6303{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306304 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006305 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
6306
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05306307 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006308 TRACE_CODE_SME_RX_HDD_SEND_ACTION, sessionId, 0));
6309 /* acquire the lock for the sme object */
6310 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306311 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006312 p2p_send_action(hHal, sessionId, pBuf, len, wait, noack,
6313 channel_freq);
6314 /* release the lock for the sme object */
6315 sme_release_global_lock(&pMac->sme);
6316 }
6317
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006318 return status;
6319}
6320
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306321QDF_STATUS sme_cancel_remain_on_channel(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006322 uint8_t sessionId, uint32_t scan_id)
6323{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306324 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006325 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
6326
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05306327 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006328 TRACE_CODE_SME_RX_HDD_CANCEL_REMAIN_ONCHAN, sessionId,
6329 0));
6330 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306331 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006332 status = p2p_cancel_remain_on_channel(hHal, sessionId, scan_id);
6333 sme_release_global_lock(&pMac->sme);
6334 }
6335 return status;
6336}
6337
6338/* Power Save Related */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306339QDF_STATUS sme_p2p_set_ps(tHalHandle hHal, tP2pPsConfig *data)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006340{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306341 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006342 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
6343
6344 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306345 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006346 status = p2p_set_ps(hHal, data);
6347 sme_release_global_lock(&pMac->sme);
6348 }
6349 return status;
6350}
6351
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006352#ifdef WLAN_FEATURE_EXTWOW_SUPPORT
Krishna Kumaar Natarajand9131902015-10-19 11:52:47 -07006353/**
6354 * sme_configure_ext_wow() - configure Extr WoW
6355 * @hHal - The handle returned by mac_open.
6356 * @wlanExtParams - Depicts the wlan Ext params.
6357 * @callback - ext_wow callback to be registered.
6358 * @callback_context - ext_wow callback context
6359 *
6360 * SME will pass this request to lower mac to configure Extr WoW
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306361 * Return: QDF_STATUS
Krishna Kumaar Natarajand9131902015-10-19 11:52:47 -07006362 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306363QDF_STATUS sme_configure_ext_wow(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006364 tpSirExtWoWParams wlanExtParams,
6365 csr_readyToExtWoWCallback callback,
6366 void *callback_context)
6367{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306368 QDF_STATUS status = QDF_STATUS_SUCCESS;
6369 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006370 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Rajeev Kumar37d478b2017-04-17 16:59:28 -07006371 struct scheduler_msg message = {0};
Anurag Chouhan600c3a02016-03-01 10:33:54 +05306372 tpSirExtWoWParams MsgPtr = qdf_mem_malloc(sizeof(*MsgPtr));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006373
6374 if (!MsgPtr)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306375 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006376
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05306377 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006378 TRACE_CODE_SME_RX_HDD_CONFIG_EXTWOW, NO_SESSION, 0));
6379
6380 pMac->readyToExtWoWCallback = callback;
6381 pMac->readyToExtWoWContext = callback_context;
6382
6383 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306384 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006385
6386 /* serialize the req through MC thread */
Anurag Chouhan600c3a02016-03-01 10:33:54 +05306387 qdf_mem_copy(MsgPtr, wlanExtParams, sizeof(*MsgPtr));
Rajeev Kumar8eaedf62017-01-21 11:03:13 -08006388 message.bodyptr = MsgPtr;
6389 message.type = WMA_WLAN_EXT_WOW;
6390 qdf_status = scheduler_post_msg(QDF_MODULE_ID_WMA,
6391 &message);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306392 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006393 pMac->readyToExtWoWCallback = NULL;
6394 pMac->readyToExtWoWContext = NULL;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05306395 qdf_mem_free(MsgPtr);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306396 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006397 }
6398 sme_release_global_lock(&pMac->sme);
6399 } else {
6400 pMac->readyToExtWoWCallback = NULL;
6401 pMac->readyToExtWoWContext = NULL;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05306402 qdf_mem_free(MsgPtr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006403 }
6404
6405 return status;
6406}
6407
6408/* ---------------------------------------------------------------------------
6409
6410 \fn sme_configure_app_type1_params
6411
6412 \brief
6413 SME will pass this request to lower mac to configure Indoor WoW parameters.
6414
6415 \param
6416
6417 hHal - The handle returned by mac_open.
6418
6419 wlanAppType1Params- Depicts the wlan App Type 1(Indoor) params
6420
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306421 \return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006422
6423 --------------------------------------------------------------------------- */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306424QDF_STATUS sme_configure_app_type1_params(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006425 tpSirAppType1Params wlanAppType1Params)
6426{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306427 QDF_STATUS status = QDF_STATUS_SUCCESS;
6428 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006429 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Rajeev Kumar37d478b2017-04-17 16:59:28 -07006430 struct scheduler_msg message = {0};
Anurag Chouhan600c3a02016-03-01 10:33:54 +05306431 tpSirAppType1Params MsgPtr = qdf_mem_malloc(sizeof(*MsgPtr));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006432
6433 if (!MsgPtr)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306434 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006435
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05306436 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006437 TRACE_CODE_SME_RX_HDD_CONFIG_APP_TYPE1, NO_SESSION,
6438 0));
6439
6440 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306441 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006442 /* serialize the req through MC thread */
Anurag Chouhan600c3a02016-03-01 10:33:54 +05306443 qdf_mem_copy(MsgPtr, wlanAppType1Params, sizeof(*MsgPtr));
Rajeev Kumar8eaedf62017-01-21 11:03:13 -08006444 message.bodyptr = MsgPtr;
6445 message.type = WMA_WLAN_SET_APP_TYPE1_PARAMS;
6446 qdf_status = scheduler_post_msg(QDF_MODULE_ID_WMA,
6447 &message);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306448 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
Anurag Chouhan600c3a02016-03-01 10:33:54 +05306449 qdf_mem_free(MsgPtr);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306450 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006451 }
6452 sme_release_global_lock(&pMac->sme);
6453 } else {
Anurag Chouhan600c3a02016-03-01 10:33:54 +05306454 qdf_mem_free(MsgPtr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006455 }
6456
6457 return status;
6458}
6459
6460/* ---------------------------------------------------------------------------
6461
6462 \fn sme_configure_app_type2_params
6463
6464 \brief
6465 SME will pass this request to lower mac to configure Indoor WoW parameters.
6466
6467 \param
6468
6469 hHal - The handle returned by mac_open.
6470
6471 wlanAppType2Params- Depicts the wlan App Type 2 (Outdoor) params
6472
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306473 \return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006474
6475 --------------------------------------------------------------------------- */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306476QDF_STATUS sme_configure_app_type2_params(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006477 tpSirAppType2Params wlanAppType2Params)
6478{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306479 QDF_STATUS status = QDF_STATUS_SUCCESS;
6480 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006481 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Rajeev Kumar37d478b2017-04-17 16:59:28 -07006482 struct scheduler_msg message = {0};
Anurag Chouhan600c3a02016-03-01 10:33:54 +05306483 tpSirAppType2Params MsgPtr = qdf_mem_malloc(sizeof(*MsgPtr));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006484
6485 if (!MsgPtr)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306486 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006487
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05306488 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006489 TRACE_CODE_SME_RX_HDD_CONFIG_APP_TYPE2, NO_SESSION,
6490 0));
6491
6492 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306493 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006494 /* serialize the req through MC thread */
Anurag Chouhan600c3a02016-03-01 10:33:54 +05306495 qdf_mem_copy(MsgPtr, wlanAppType2Params, sizeof(*MsgPtr));
Rajeev Kumar8eaedf62017-01-21 11:03:13 -08006496 message.bodyptr = MsgPtr;
6497 message.type = WMA_WLAN_SET_APP_TYPE2_PARAMS;
6498 qdf_status = scheduler_post_msg(QDF_MODULE_ID_WMA,
6499 &message);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306500 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
Anurag Chouhan600c3a02016-03-01 10:33:54 +05306501 qdf_mem_free(MsgPtr);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306502 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006503 }
6504 sme_release_global_lock(&pMac->sme);
6505 } else {
Anurag Chouhan600c3a02016-03-01 10:33:54 +05306506 qdf_mem_free(MsgPtr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006507 }
6508
6509 return status;
6510}
6511#endif
6512
6513/* ---------------------------------------------------------------------------
6514
6515 \fn sme_get_infra_session_id
6516
6517 \brief To get the session ID for infra session, if connected
6518 This is a synchronous API.
6519
6520 \param hHal - The handle returned by mac_open.
6521
6522 \return sessionid, -1 if infra session is not connected
6523
6524 -------------------------------------------------------------------------------*/
6525int8_t sme_get_infra_session_id(tHalHandle hHal)
6526{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306527 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006528 int8_t sessionid = -1;
6529 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
6530
6531 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306532 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006533
6534 sessionid = csr_get_infra_session_id(pMac);
6535
6536 sme_release_global_lock(&pMac->sme);
6537 }
6538
6539 return sessionid;
6540}
6541
6542/* ---------------------------------------------------------------------------
6543
6544 \fn sme_get_infra_operation_channel
6545
6546 \brief To get the operating channel for infra session, if connected
6547 This is a synchronous API.
6548
6549 \param hHal - The handle returned by mac_open.
6550 \param sessionId - the sessionId returned by sme_open_session.
6551
6552 \return operating channel, 0 if infra session is not connected
6553
6554 -------------------------------------------------------------------------------*/
6555uint8_t sme_get_infra_operation_channel(tHalHandle hHal, uint8_t sessionId)
6556{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306557 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006558 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
6559 uint8_t channel = 0;
6560 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306561 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006562
6563 channel = csr_get_infra_operation_channel(pMac, sessionId);
6564
6565 sme_release_global_lock(&pMac->sme);
6566 }
6567
6568 return channel;
6569}
6570
6571/* This routine will return poerating channel on which other BSS is operating to be used for concurrency mode. */
6572/* If other BSS is not up or not connected it will return 0 */
6573uint8_t sme_get_concurrent_operation_channel(tHalHandle hHal)
6574{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306575 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006576 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
6577 uint8_t channel = 0;
6578 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306579 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006580
6581 channel = csr_get_concurrent_operation_channel(pMac);
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05306582 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO_HIGH, "%s: "
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006583 " Other Concurrent Channel = %d", __func__, channel);
6584 sme_release_global_lock(&pMac->sme);
6585 }
6586
6587 return channel;
6588}
6589
6590#ifdef FEATURE_WLAN_MCC_TO_SCC_SWITCH
6591uint16_t sme_check_concurrent_channel_overlap(tHalHandle hHal, uint16_t sap_ch,
6592 eCsrPhyMode sapPhyMode,
6593 uint8_t cc_switch_mode)
6594{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306595 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006596 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
6597 uint16_t channel = 0;
6598
6599 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306600 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006601 channel =
6602 csr_check_concurrent_channel_overlap(pMac, sap_ch, sapPhyMode,
6603 cc_switch_mode);
6604 sme_release_global_lock(&pMac->sme);
6605 }
6606
6607 return channel;
6608}
6609#endif
6610
Arun Khandavalli4b55da72016-07-19 19:55:01 +05306611/**
Manikandan Mohandcc21ba2016-03-15 14:31:56 -07006612 * sme_set_tsfcb() - Set callback for TSF capture
Manikandan Mohan976e7562016-03-15 16:33:31 -07006613 * @h_hal: Handler return by mac_open
Manikandan Mohandcc21ba2016-03-15 14:31:56 -07006614 * @cb_fn: Callback function pointer
6615 * @db_ctx: Callback data
6616 *
6617 * Return: QDF_STATUS
6618 */
Manikandan Mohan976e7562016-03-15 16:33:31 -07006619QDF_STATUS sme_set_tsfcb(tHalHandle h_hal,
Manikandan Mohandcc21ba2016-03-15 14:31:56 -07006620 int (*cb_fn)(void *cb_ctx, struct stsf *ptsf), void *cb_ctx)
6621{
Manikandan Mohan976e7562016-03-15 16:33:31 -07006622 tpAniSirGlobal mac = PMAC_STRUCT(h_hal);
Manikandan Mohandcc21ba2016-03-15 14:31:56 -07006623 QDF_STATUS status;
6624
Manikandan Mohan976e7562016-03-15 16:33:31 -07006625 status = sme_acquire_global_lock(&mac->sme);
Manikandan Mohandcc21ba2016-03-15 14:31:56 -07006626 if (QDF_IS_STATUS_SUCCESS(status)) {
Manikandan Mohan976e7562016-03-15 16:33:31 -07006627 mac->sme.get_tsf_cb = cb_fn;
6628 mac->sme.get_tsf_cxt = cb_ctx;
6629 sme_release_global_lock(&mac->sme);
Manikandan Mohandcc21ba2016-03-15 14:31:56 -07006630 }
6631 return status;
6632}
6633
Arun Khandavalli4b55da72016-07-19 19:55:01 +05306634/**
6635 * sme_reset_tsfcb() - Reset callback for TSF capture
6636 * @h_hal: Handler return by mac_open
6637 *
6638 * This function reset the tsf capture callback to SME
6639 *
6640 * Return: QDF_STATUS
6641 */
6642QDF_STATUS sme_reset_tsfcb(tHalHandle h_hal)
6643{
6644 tpAniSirGlobal mac;
6645 QDF_STATUS status;
6646
6647 if (!h_hal) {
6648 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
6649 FL("h_hal is not valid"));
6650 return QDF_STATUS_E_INVAL;
6651 }
6652 mac = PMAC_STRUCT(h_hal);
6653
6654 status = sme_acquire_global_lock(&mac->sme);
6655 if (QDF_IS_STATUS_SUCCESS(status)) {
6656 mac->sme.get_tsf_cb = NULL;
6657 mac->sme.get_tsf_cxt = NULL;
6658 sme_release_global_lock(&mac->sme);
6659 }
6660 return status;
6661}
6662
Manikandan Mohan976e7562016-03-15 16:33:31 -07006663#ifdef WLAN_FEATURE_TSF
6664/*
6665 * sme_set_tsf_gpio() - set gpio pin that be toggled when capture tef
6666 * @h_hal: Handler return by mac_open
6667 * @pinvalue: gpio pin id
6668 *
6669 * Return: QDF_STATUS
6670 */
6671QDF_STATUS sme_set_tsf_gpio(tHalHandle h_hal, uint32_t pinvalue)
6672{
6673 QDF_STATUS status;
Rajeev Kumar8eaedf62017-01-21 11:03:13 -08006674 struct scheduler_msg tsf_msg = {0};
Manikandan Mohan976e7562016-03-15 16:33:31 -07006675 tpAniSirGlobal mac = PMAC_STRUCT(h_hal);
6676
6677 status = sme_acquire_global_lock(&mac->sme);
6678 if (QDF_IS_STATUS_SUCCESS(status)) {
6679 tsf_msg.type = WMA_TSF_GPIO_PIN;
6680 tsf_msg.reserved = 0;
6681 tsf_msg.bodyval = pinvalue;
6682
Rajeev Kumar8eaedf62017-01-21 11:03:13 -08006683 status = scheduler_post_msg(QDF_MODULE_ID_WMA, &tsf_msg);
Manikandan Mohan976e7562016-03-15 16:33:31 -07006684 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07006685 sme_err("Unable to post WMA_TSF_GPIO_PIN");
Manikandan Mohan976e7562016-03-15 16:33:31 -07006686 status = QDF_STATUS_E_FAILURE;
6687 }
6688 sme_release_global_lock(&mac->sme);
6689 }
6690 return status;
6691}
6692#endif
6693
Tushnim Bhattacharyya0c4ad2d2017-03-09 15:59:03 -08006694QDF_STATUS sme_get_cfg_valid_channels(uint8_t *aValidChannels,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006695 uint32_t *len)
6696{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306697 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Tushnim Bhattacharyya0c4ad2d2017-03-09 15:59:03 -08006698 tpAniSirGlobal mac_ctx = sme_get_mac_context();
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006699
Tushnim Bhattacharyya0c4ad2d2017-03-09 15:59:03 -08006700 if (NULL == mac_ctx) {
6701 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
6702 FL("Invalid MAC context"));
6703 return QDF_STATUS_E_FAILURE;
6704 }
6705
6706 status = sme_acquire_global_lock(&mac_ctx->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306707 if (QDF_IS_STATUS_SUCCESS(status)) {
Tushnim Bhattacharyya0c4ad2d2017-03-09 15:59:03 -08006708 status = csr_get_cfg_valid_channels(mac_ctx,
6709 aValidChannels, len);
6710 sme_release_global_lock(&mac_ctx->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006711 }
6712
6713 return status;
6714}
6715
Amar Singhal6edf9732016-11-20 21:43:40 -08006716void sme_set_cc_src(tHalHandle hHal, enum country_src cc_src)
6717{
6718 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hHal);
6719
6720 mac_ctx->reg_hint_src = cc_src;
6721}
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006722/* ---------------------------------------------------------------------------
6723
6724 \fn sme_handle_change_country_code
6725
6726 \brief Change Country code, Reg Domain and channel list
6727
6728 \details Country Code Priority
6729 If Supplicant country code is priority than 11d is disabled.
6730 If 11D is enabled, we update the country code after every scan.
6731 Hence when Supplicant country code is priority, we don't need 11D info.
6732 Country code from Supplicant is set as current courtry code.
6733 User can send reset command XX (instead of country code) to reset the
6734 country code to default values.
6735 If 11D is priority,
6736 Than Supplicant country code code is set to default code. But 11D code is set as current country code
6737
6738 \param pMac - The handle returned by mac_open.
6739 \param pMsgBuf - MSG Buffer
6740
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306741 \return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006742
6743 -------------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306744QDF_STATUS sme_handle_change_country_code(tpAniSirGlobal pMac, void *pMsgBuf)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006745{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306746 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006747 tAniChangeCountryCodeReq *pMsg;
6748 v_REGDOMAIN_t domainIdIoctl;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306749 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Amar Singhala297bfa2015-10-15 15:07:29 -07006750 static uint8_t default_country[CDS_COUNTRY_CODE_LEN + 1];
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006751 pMsg = (tAniChangeCountryCodeReq *) pMsgBuf;
6752
6753 /*
6754 * if the reset Supplicant country code command is triggered,
6755 * enable 11D, reset the country code and return
6756 */
Ankit Guptaa5076012016-09-14 11:32:19 -07006757 if (!qdf_mem_cmp(pMsg->countryCode, SME_INVALID_COUNTRY_CODE, 2)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006758 pMac->roam.configParam.Is11dSupportEnabled =
6759 pMac->roam.configParam.Is11dSupportEnabledOriginal;
6760
Kiran Kumar Lokereb1d412e2017-04-23 17:19:43 -07006761 qdf_status = ucfg_reg_get_default_country(pMac->psoc,
6762 default_country);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006763
6764 /* read the country code and use it */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306765 if (QDF_IS_STATUS_SUCCESS(qdf_status)) {
Anurag Chouhan600c3a02016-03-01 10:33:54 +05306766 qdf_mem_copy(pMsg->countryCode,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006767 default_country,
6768 WNI_CFG_COUNTRY_CODE_LEN);
6769 } else {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306770 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006771 return status;
6772 }
6773 /*
6774 * Update the 11d country to default country so that when
6775 * callback is received for this default country, driver will
6776 * not disable the 11d taking it as valid country by user.
6777 */
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07006778 sme_debug(
6779 "Set default country code (%c%c) as invalid country received",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006780 pMsg->countryCode[0], pMsg->countryCode[1]);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05306781 qdf_mem_copy(pMac->scan.countryCode11d,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006782 pMsg->countryCode,
6783 WNI_CFG_COUNTRY_CODE_LEN);
6784 } else {
6785 /* if Supplicant country code has priority, disable 11d */
6786 if (pMac->roam.configParam.fSupplicantCountryCodeHasPriority &&
6787 pMsg->countryFromUserSpace) {
6788 pMac->roam.configParam.Is11dSupportEnabled = false;
6789 }
6790 }
6791
6792 if (pMac->roam.configParam.Is11dSupportEnabled)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306793 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006794
6795 /* Set Current Country code and Current Regulatory domain */
6796 status = csr_set_country_code(pMac, pMsg->countryCode);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306797 if (QDF_STATUS_SUCCESS != status) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006798 /* Supplicant country code failed. So give 11D priority */
6799 pMac->roam.configParam.Is11dSupportEnabled =
6800 pMac->roam.configParam.Is11dSupportEnabledOriginal;
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07006801 sme_err("Set Country Code Fail %d", status);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006802 return status;
6803 }
6804
6805 /* overwrite the defualt country code */
Anurag Chouhan600c3a02016-03-01 10:33:54 +05306806 qdf_mem_copy(pMac->scan.countryCodeDefault,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006807 pMac->scan.countryCodeCurrent, WNI_CFG_COUNTRY_CODE_LEN);
6808
6809 /* Get Domain ID from country code */
6810 status = csr_get_regulatory_domain_for_country(pMac,
6811 pMac->scan.countryCodeCurrent,
6812 (v_REGDOMAIN_t *) &
Amar Singhala297bfa2015-10-15 15:07:29 -07006813 domainIdIoctl,
6814 SOURCE_QUERY);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306815 if (status != QDF_STATUS_SUCCESS) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07006816 sme_err("Fail to get regId %d", domainIdIoctl);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006817 return status;
6818 } else if (REGDOMAIN_WORLD == domainIdIoctl) {
6819 /* Supplicant country code is invalid, so we are on world mode now. So
6820 give 11D chance to update */
6821 pMac->roam.configParam.Is11dSupportEnabled =
6822 pMac->roam.configParam.Is11dSupportEnabledOriginal;
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07006823 sme_warn("Country Code unrecognized by driver");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006824 }
6825
Kiran Kumar Lokerea3de2262017-04-12 12:15:04 -07006826 if (domainIdIoctl >= REGDOMAIN_COUNT) {
6827 sme_err("Invalid regId %d", domainIdIoctl);
6828 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006829 } else {
6830 /* if 11d has priority, clear currentCountryBssid & countryCode11d to get */
6831 /* set again if we find AP with 11d info during scan */
6832 if (!pMac->roam.configParam.fSupplicantCountryCodeHasPriority) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07006833 sme_warn("Clearing currentCountryBssid, countryCode11d");
Anurag Chouhan600c3a02016-03-01 10:33:54 +05306834 qdf_mem_zero(&pMac->scan.currentCountryBssid,
Anurag Chouhan6d760662016-02-20 16:05:43 +05306835 sizeof(struct qdf_mac_addr));
Anurag Chouhan600c3a02016-03-01 10:33:54 +05306836 qdf_mem_zero(pMac->scan.countryCode11d,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006837 sizeof(pMac->scan.countryCode11d));
6838 }
6839 }
6840
6841 if (pMsg->changeCCCallback) {
6842 ((tSmeChangeCountryCallback) (pMsg->changeCCCallback))((void *)
6843 pMsg->
6844 pDevContext);
6845 }
6846
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306847 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006848}
6849
6850/**
Amar Singhal7f1f3ec2015-10-13 17:14:08 -07006851 * sme_handle_generic_change_country_code() - handles country ch req
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006852 * @mac_ctx: mac global context
6853 * @msg: request msg packet
6854 *
6855 * If Supplicant country code is priority than 11d is disabled.
6856 * If 11D is enabled, we update the country code after every scan.
6857 * Hence when Supplicant country code is priority, we don't need 11D info.
6858 * Country code from Supplicant is set as current country code.
6859 *
6860 * Return: status of operation
6861 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306862QDF_STATUS
Amar Singhal7f1f3ec2015-10-13 17:14:08 -07006863sme_handle_generic_change_country_code(tpAniSirGlobal mac_ctx,
6864 void *pMsgBuf)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006865{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306866 QDF_STATUS status = QDF_STATUS_SUCCESS;
Amar Singhal7f1f3ec2015-10-13 17:14:08 -07006867 v_REGDOMAIN_t reg_domain_id = 0;
Amar Singhalb6d0dc42016-10-19 09:45:05 -07006868 bool user_ctry_priority =
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006869 mac_ctx->roam.configParam.fSupplicantCountryCodeHasPriority;
Amar Singhal7f1f3ec2015-10-13 17:14:08 -07006870 tAniGenericChangeCountryCodeReq *msg = pMsgBuf;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006871
Amar Singhal6edf9732016-11-20 21:43:40 -08006872 if (SOURCE_11D != mac_ctx->reg_hint_src) {
6873 if (SOURCE_DRIVER != mac_ctx->reg_hint_src) {
6874 if (user_ctry_priority)
6875 mac_ctx->roam.configParam.Is11dSupportEnabled =
6876 false;
6877 else {
6878 if (mac_ctx->roam.configParam.Is11dSupportEnabled &&
6879 mac_ctx->scan.countryCode11d[0] != 0) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006880
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07006881 sme_debug("restore 11d");
Amar Singhalb6d0dc42016-10-19 09:45:05 -07006882
Amar Singhal6edf9732016-11-20 21:43:40 -08006883 status = csr_get_regulatory_domain_for_country(
6884 mac_ctx,
6885 mac_ctx->scan.countryCode11d,
6886 &reg_domain_id,
6887 SOURCE_11D);
6888 return QDF_STATUS_E_FAILURE;
6889 }
Amar Singhalb6d0dc42016-10-19 09:45:05 -07006890 }
6891 }
6892 } else {
6893 /* if kernel gets invalid country code; it
6894 * resets the country code to world
6895 */
6896 if (('0' != msg->countryCode[0]) ||
6897 ('0' != msg->countryCode[1]))
6898 qdf_mem_copy(mac_ctx->scan.countryCode11d,
6899 msg->countryCode,
6900 WNI_CFG_COUNTRY_CODE_LEN);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006901 }
Amar Singhal7f1f3ec2015-10-13 17:14:08 -07006902
Amar Singhalb6d0dc42016-10-19 09:45:05 -07006903 qdf_mem_copy(mac_ctx->scan.countryCodeCurrent,
6904 msg->countryCode,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006905 WNI_CFG_COUNTRY_CODE_LEN);
Amar Singhal9d5b1fe2016-10-16 20:16:05 -07006906
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006907 /* get the channels based on new cc */
6908 status = csr_get_channel_and_power_list(mac_ctx);
6909
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306910 if (status != QDF_STATUS_SUCCESS) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07006911 sme_err("fail to get Channels");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006912 return status;
6913 }
Amar Singhalb6d0dc42016-10-19 09:45:05 -07006914
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006915 /* reset info based on new cc, and we are done */
6916 csr_apply_channel_power_info_wrapper(mac_ctx);
6917
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006918 csr_scan_filter_results(mac_ctx);
Amar Singhalb6d0dc42016-10-19 09:45:05 -07006919
6920 /* scans after the country is set by User hints or
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006921 * Country IE
6922 */
6923 mac_ctx->scan.curScanType = eSIR_ACTIVE_SCAN;
Amar Singhal9d5b1fe2016-10-16 20:16:05 -07006924
Amar Singhal6edf9732016-11-20 21:43:40 -08006925 mac_ctx->reg_hint_src = SOURCE_UNKNOWN;
6926
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006927 sme_disconnect_connected_sessions(mac_ctx);
Amar Singhalb6d0dc42016-10-19 09:45:05 -07006928
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306929 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006930}
6931
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006932static bool
6933sme_search_in_base_ch_lst(tpAniSirGlobal mac_ctx, uint8_t curr_ch)
6934{
6935 uint8_t i;
6936 tCsrChannel *ch_lst_info;
6937 ch_lst_info = &mac_ctx->scan.base_channels;
6938 for (i = 0; i < ch_lst_info->numChannels; i++) {
6939 if (ch_lst_info->channelList[i] == curr_ch)
6940 return true;
6941 }
6942
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006943 return false;
6944}
6945/**
6946 * sme_disconnect_connected_sessions() - Disconnect STA and P2P client session
6947 * if channel is not supported
6948 * @mac_ctx: mac global context
6949 *
6950 * If new country code does not support the channel on which STA/P2P client
6951 * is connetced, it sends the disconnect to the AP/P2P GO
6952 *
6953 * Return: void
6954 */
6955void sme_disconnect_connected_sessions(tpAniSirGlobal mac_ctx)
6956{
6957 uint8_t session_id, found = false;
6958 uint8_t curr_ch;
6959
6960 for (session_id = 0; session_id < CSR_ROAM_SESSION_MAX; session_id++) {
6961 if (!csr_is_session_client_and_connected(mac_ctx, session_id))
6962 continue;
6963 found = false;
6964 /* Session is connected.Check the channel */
6965 curr_ch = csr_get_infra_operation_channel(mac_ctx,
6966 session_id);
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07006967 sme_debug("Current Operating channel : %d, session :%d",
6968 curr_ch, session_id);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006969 found = sme_search_in_base_ch_lst(mac_ctx, curr_ch);
6970 if (!found) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07006971 sme_debug("Disconnect Session: %d", session_id);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006972 csr_roam_disconnect(mac_ctx, session_id,
6973 eCSR_DISCONNECT_REASON_UNSPECIFIED);
6974 }
6975 }
6976}
6977
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006978#ifdef WLAN_FEATURE_PACKET_FILTERING
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306979QDF_STATUS sme_8023_multicast_list(tHalHandle hHal, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006980 tpSirRcvFltMcAddrList pMulticastAddrs)
6981{
6982 tpSirRcvFltMcAddrList request_buf;
Rajeev Kumar37d478b2017-04-17 16:59:28 -07006983 struct scheduler_msg msg = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006984 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
6985 tCsrRoamSession *pSession = NULL;
6986
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05306987 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO, "%s: "
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006988 "ulMulticastAddrCnt=%d, multicastAddr[0]=%p", __func__,
6989 pMulticastAddrs->ulMulticastAddrCnt,
Srinivas Girigowda98530492015-11-20 17:39:24 -08006990 pMulticastAddrs->multicastAddr[0].bytes);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006991
Ravi Joshi4f447cb2016-07-19 13:42:01 -07006992 /* Find the connected Infra / P2P_client connected session */
Krunal Sonifea06802017-04-13 14:44:48 -07006993 pSession = CSR_GET_SESSION(pMac, sessionId);
6994 if (!CSR_IS_SESSION_VALID(pMac, sessionId) ||
6995 (!csr_is_conn_state_infra(pMac, sessionId) &&
6996 !csr_is_ndi_started(pMac, sessionId))) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05306997 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_WARN,
Srinivas Girigowdaf2599dd2015-11-16 18:20:46 -08006998 "%s: Unable to find the session Id: %d", __func__,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006999 sessionId);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307000 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007001 }
7002
Anurag Chouhan600c3a02016-03-01 10:33:54 +05307003 request_buf = qdf_mem_malloc(sizeof(tSirRcvFltMcAddrList));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007004 if (NULL == request_buf) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05307005 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007006 "%s: Not able to "
7007 "allocate memory for 8023 Multicast List request",
7008 __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307009 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007010 }
7011
Ravi Joshi4f447cb2016-07-19 13:42:01 -07007012 if (!csr_is_conn_state_connected_infra(pMac, sessionId) &&
7013 !csr_is_ndi_started(pMac, sessionId)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05307014 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Ravi Joshi4f447cb2016-07-19 13:42:01 -07007015 "%s: Request ignored, session %d is not connected or started",
7016 __func__, sessionId);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05307017 qdf_mem_free(request_buf);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307018 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007019 }
7020
Anurag Chouhan600c3a02016-03-01 10:33:54 +05307021 qdf_mem_copy(request_buf, pMulticastAddrs,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007022 sizeof(tSirRcvFltMcAddrList));
7023
Anurag Chouhanc5548422016-02-24 18:33:27 +05307024 qdf_copy_macaddr(&request_buf->self_macaddr, &pSession->selfMacAddr);
7025 qdf_copy_macaddr(&request_buf->bssid,
Srinivas Girigowda98530492015-11-20 17:39:24 -08007026 &pSession->connectedProfile.bssid);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007027
7028 msg.type = WMA_8023_MULTICAST_LIST_REQ;
7029 msg.reserved = 0;
7030 msg.bodyptr = request_buf;
Sreelakshmi Konamki6a065362016-05-31 16:05:01 +05307031 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
7032 sessionId, msg.type));
Rajeev Kumar8eaedf62017-01-21 11:03:13 -08007033 if (QDF_STATUS_SUCCESS != scheduler_post_msg(QDF_MODULE_ID_WMA,
Krunal Soni66c113f2016-12-21 16:46:47 -08007034 &msg)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05307035 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007036 "%s: Not able to "
7037 "post WMA_8023_MULTICAST_LIST message to WMA",
7038 __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05307039 qdf_mem_free(request_buf);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307040 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007041 }
7042
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307043 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007044}
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007045#endif /* WLAN_FEATURE_PACKET_FILTERING */
7046
7047/* ---------------------------------------------------------------------------
7048
7049 \fn sme_is_channel_valid
7050
7051 \brief To check if the channel is valid for currently established domain
7052 This is a synchronous API.
7053
7054 \param hHal - The handle returned by mac_open.
7055 \param channel - channel to verify
7056
7057 \return true/false, true if channel is valid
7058
7059 -------------------------------------------------------------------------------*/
7060bool sme_is_channel_valid(tHalHandle hHal, uint8_t channel)
7061{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307062 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007063 bool valid = false;
7064 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
7065
7066 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307067 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007068
7069 valid = csr_roam_is_channel_valid(pMac, channel);
7070
7071 sme_release_global_lock(&pMac->sme);
7072 }
7073
7074 return valid;
7075}
7076
7077/* ---------------------------------------------------------------------------
7078 \fn sme_set_freq_band
7079 \brief Used to set frequency band.
7080 \param hHal
7081 \param sessionId - Session Identifier
7082 \eBand band value to be configured
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307083 \- return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007084 -------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307085QDF_STATUS sme_set_freq_band(tHalHandle hHal, uint8_t sessionId, eCsrBand eBand)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007086{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307087 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007088 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
7089
7090 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307091 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007092 status = csr_set_band(hHal, sessionId, eBand);
7093 sme_release_global_lock(&pMac->sme);
7094 }
7095 return status;
7096}
7097
7098/* ---------------------------------------------------------------------------
7099 \fn sme_get_freq_band
7100 \brief Used to get the current band settings.
7101 \param hHal
7102 \pBand pointer to hold band value
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307103 \- return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007104 -------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307105QDF_STATUS sme_get_freq_band(tHalHandle hHal, eCsrBand *pBand)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007106{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307107 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007108 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
7109
7110 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307111 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007112 *pBand = csr_get_current_band(hHal);
7113 sme_release_global_lock(&pMac->sme);
7114 }
7115 return status;
7116}
7117
7118/* ---------------------------------------------------------------------------
7119 \fn sme_set_max_tx_power_per_band
7120
7121 \brief Set the Maximum Transmit Power specific to band dynamically.
7122 Note: this setting will not persist over reboots.
7123
7124 \param band
7125 \param power to set in dB
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307126 \- return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007127
7128 ----------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307129QDF_STATUS sme_set_max_tx_power_per_band(eCsrBand band, int8_t dB)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007130{
Rajeev Kumar37d478b2017-04-17 16:59:28 -07007131 struct scheduler_msg msg = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007132 tpMaxTxPowerPerBandParams pMaxTxPowerPerBandParams = NULL;
7133
7134 pMaxTxPowerPerBandParams =
Anurag Chouhan600c3a02016-03-01 10:33:54 +05307135 qdf_mem_malloc(sizeof(tMaxTxPowerPerBandParams));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007136 if (NULL == pMaxTxPowerPerBandParams) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05307137 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007138 "%s:Not able to allocate memory for pMaxTxPowerPerBandParams",
7139 __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307140 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007141 }
7142
7143 pMaxTxPowerPerBandParams->power = dB;
7144 pMaxTxPowerPerBandParams->bandInfo = band;
7145
7146 msg.type = WMA_SET_MAX_TX_POWER_PER_BAND_REQ;
7147 msg.reserved = 0;
7148 msg.bodyptr = pMaxTxPowerPerBandParams;
Sreelakshmi Konamki6a065362016-05-31 16:05:01 +05307149 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
7150 NO_SESSION, msg.type));
Rajeev Kumar8eaedf62017-01-21 11:03:13 -08007151 if (QDF_STATUS_SUCCESS != scheduler_post_msg(QDF_MODULE_ID_WMA,
Krunal Soni66c113f2016-12-21 16:46:47 -08007152 &msg)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05307153 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007154 "%s:Not able to post WMA_SET_MAX_TX_POWER_PER_BAND_REQ",
7155 __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05307156 qdf_mem_free(pMaxTxPowerPerBandParams);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307157 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007158 }
7159
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307160 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007161}
7162
7163/* ---------------------------------------------------------------------------
7164
7165 \fn sme_set_max_tx_power
7166
7167 \brief Set the Maximum Transmit Power dynamically. Note: this setting will
7168 not persist over reboots.
7169
7170 \param hHal
7171 \param pBssid BSSID to set the power cap for
7172 \param pBssid pSelfMacAddress self MAC Address
7173 \param pBssid power to set in dB
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307174 \- return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007175
7176 -------------------------------------------------------------------------------*/
Anurag Chouhan6d760662016-02-20 16:05:43 +05307177QDF_STATUS sme_set_max_tx_power(tHalHandle hHal, struct qdf_mac_addr pBssid,
7178 struct qdf_mac_addr pSelfMacAddress, int8_t dB)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007179{
Rajeev Kumar37d478b2017-04-17 16:59:28 -07007180 struct scheduler_msg msg = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007181 tpMaxTxPowerParams pMaxTxParams = NULL;
7182
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05307183 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007184 TRACE_CODE_SME_RX_HDD_SET_MAXTXPOW, NO_SESSION, 0));
Anurag Chouhan600c3a02016-03-01 10:33:54 +05307185 pMaxTxParams = qdf_mem_malloc(sizeof(tMaxTxPowerParams));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007186 if (NULL == pMaxTxParams) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05307187 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007188 "%s: Not able to allocate memory for pMaxTxParams",
7189 __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307190 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007191 }
7192
Anurag Chouhanc5548422016-02-24 18:33:27 +05307193 qdf_copy_macaddr(&pMaxTxParams->bssId, &pBssid);
7194 qdf_copy_macaddr(&pMaxTxParams->selfStaMacAddr, &pSelfMacAddress);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007195 pMaxTxParams->power = dB;
7196
7197 msg.type = WMA_SET_MAX_TX_POWER_REQ;
7198 msg.reserved = 0;
7199 msg.bodyptr = pMaxTxParams;
7200
Rajeev Kumar8eaedf62017-01-21 11:03:13 -08007201 if (QDF_STATUS_SUCCESS != scheduler_post_msg(QDF_MODULE_ID_WMA,
Krunal Soni66c113f2016-12-21 16:46:47 -08007202 &msg)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05307203 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007204 "%s: Not able to post WMA_SET_MAX_TX_POWER_REQ message to WMA",
7205 __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05307206 qdf_mem_free(pMaxTxParams);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307207 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007208 }
7209
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307210 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007211}
7212
7213/* ---------------------------------------------------------------------------
7214
7215 \fn sme_set_custom_mac_addr
7216
7217 \brief Set the customer Mac Address.
7218
7219 \param customMacAddr customer MAC Address
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307220 \- return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007221
7222 ---------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307223QDF_STATUS sme_set_custom_mac_addr(tSirMacAddr customMacAddr)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007224{
Rajeev Kumar37d478b2017-04-17 16:59:28 -07007225 struct scheduler_msg msg = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007226 tSirMacAddr *pBaseMacAddr;
7227
Anurag Chouhan600c3a02016-03-01 10:33:54 +05307228 pBaseMacAddr = qdf_mem_malloc(sizeof(tSirMacAddr));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007229 if (NULL == pBaseMacAddr) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05307230 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007231 FL("Not able to allocate memory for pBaseMacAddr"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307232 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007233 }
7234
Anurag Chouhan600c3a02016-03-01 10:33:54 +05307235 qdf_mem_copy(*pBaseMacAddr, customMacAddr, sizeof(tSirMacAddr));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007236
7237 msg.type = SIR_HAL_SET_BASE_MACADDR_IND;
7238 msg.reserved = 0;
7239 msg.bodyptr = pBaseMacAddr;
7240
Rajeev Kumar8eaedf62017-01-21 11:03:13 -08007241 if (QDF_STATUS_SUCCESS != scheduler_post_msg(QDF_MODULE_ID_WMA,
Krunal Soni66c113f2016-12-21 16:46:47 -08007242 &msg)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05307243 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007244 FL
7245 ("Not able to post SIR_HAL_SET_BASE_MACADDR_IND message to WMA"));
Anurag Chouhan600c3a02016-03-01 10:33:54 +05307246 qdf_mem_free(pBaseMacAddr);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307247 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007248 }
7249
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307250 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007251}
7252
7253/* ----------------------------------------------------------------------------
7254 \fn sme_set_tx_power
7255 \brief Set Transmit Power dynamically.
7256 \param hHal
7257 \param sessionId Target Session ID
7258 \pBSSId BSSID
7259 \dev_mode dev_mode such as station, P2PGO, SAP
7260 \param dBm power to set
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307261 \- return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007262 ---------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307263QDF_STATUS sme_set_tx_power(tHalHandle hHal, uint8_t sessionId,
Anurag Chouhan6d760662016-02-20 16:05:43 +05307264 struct qdf_mac_addr pBSSId,
7265 enum tQDF_ADAPTER_MODE dev_mode, int dBm)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007266{
Rajeev Kumar37d478b2017-04-17 16:59:28 -07007267 struct scheduler_msg msg = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007268 tpMaxTxPowerParams pTxParams = NULL;
7269 int8_t power = (int8_t) dBm;
7270
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05307271 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007272 TRACE_CODE_SME_RX_HDD_SET_TXPOW, sessionId, 0));
7273
7274 /* make sure there is no overflow */
7275 if ((int)power != dBm) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05307276 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007277 "%s: error, invalid power = %d", __func__, dBm);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307278 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007279 }
7280
Anurag Chouhan600c3a02016-03-01 10:33:54 +05307281 pTxParams = qdf_mem_malloc(sizeof(tMaxTxPowerParams));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007282 if (NULL == pTxParams) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05307283 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007284 "%s: Not able to allocate memory for pTxParams",
7285 __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307286 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007287 }
7288
Anurag Chouhanc5548422016-02-24 18:33:27 +05307289 qdf_copy_macaddr(&pTxParams->bssId, &pBSSId);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007290 pTxParams->power = power; /* unit is dBm */
7291 pTxParams->dev_mode = dev_mode;
7292 msg.type = WMA_SET_TX_POWER_REQ;
7293 msg.reserved = 0;
7294 msg.bodyptr = pTxParams;
7295
Rajeev Kumar8eaedf62017-01-21 11:03:13 -08007296 if (QDF_STATUS_SUCCESS != scheduler_post_msg(QDF_MODULE_ID_WMA,
Krunal Soni66c113f2016-12-21 16:46:47 -08007297 &msg)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05307298 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007299 "%s: failed to post WMA_SET_TX_POWER_REQ to WMA",
7300 __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05307301 qdf_mem_free(pTxParams);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307302 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007303 }
7304
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307305 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007306}
7307
Selvaraj, Sridhar7231c5f2016-09-28 12:42:33 +05307308QDF_STATUS sme_update_session_param(tHalHandle hal, uint8_t session_id,
7309 uint32_t param_type, uint32_t param_val)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007310{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307311 QDF_STATUS status = QDF_STATUS_SUCCESS;
Selvaraj, Sridhar7231c5f2016-09-28 12:42:33 +05307312 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007313 uint16_t len;
7314
Selvaraj, Sridhar7231c5f2016-09-28 12:42:33 +05307315 status = sme_acquire_global_lock(&mac_ctx->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307316 if (QDF_IS_STATUS_SUCCESS(status)) {
Selvaraj, Sridhar7231c5f2016-09-28 12:42:33 +05307317 struct sir_update_session_param *msg;
7318 tCsrRoamSession *session = CSR_GET_SESSION(mac_ctx, session_id);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007319
Selvaraj, Sridhar7231c5f2016-09-28 12:42:33 +05307320 if (!session) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07007321 sme_err("Session: %d not found", session_id);
Selvaraj, Sridhar7231c5f2016-09-28 12:42:33 +05307322 sme_release_global_lock(&mac_ctx->sme);
7323 return status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007324 }
7325
Selvaraj, Sridhar5b5a0652017-05-04 11:23:07 +05307326 if (param_type == SIR_PARAM_IGNORE_ASSOC_DISALLOWED)
7327 mac_ctx->ignore_assoc_disallowed = param_val;
7328
Selvaraj, Sridhar7231c5f2016-09-28 12:42:33 +05307329 if (!session->sessionActive)
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05307330 QDF_ASSERT(0);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007331
Selvaraj, Sridhar7231c5f2016-09-28 12:42:33 +05307332 len = sizeof(*msg);
7333 msg = qdf_mem_malloc(len);
7334 if (!msg)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307335 status = QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007336 else {
Selvaraj, Sridhar7231c5f2016-09-28 12:42:33 +05307337 msg->message_type = eWNI_SME_SESSION_UPDATE_PARAM;
7338 msg->length = len;
7339 msg->session_id = session_id;
7340 msg->param_type = param_type;
7341 msg->param_val = param_val;
Rajeev Kumard138ac52017-01-30 18:38:37 -08007342 status = umac_send_mb_message_to_mac(msg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007343 }
Selvaraj, Sridhar7231c5f2016-09-28 12:42:33 +05307344 sme_release_global_lock(&mac_ctx->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007345 }
7346 return status;
7347}
7348
7349/* ---------------------------------------------------------------------------
7350
7351 \fn sme_set_tm_level
7352 \brief Set Thermal Mitigation Level to RIVA
7353 \param hHal - The handle returned by mac_open.
7354 \param newTMLevel - new Thermal Mitigation Level
7355 \param tmMode - Thermal Mitigation handle mode, default 0
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307356 \return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007357 ---------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307358QDF_STATUS sme_set_tm_level(tHalHandle hHal, uint16_t newTMLevel, uint16_t tmMode)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007359{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307360 QDF_STATUS status = QDF_STATUS_SUCCESS;
7361 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007362 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Rajeev Kumar37d478b2017-04-17 16:59:28 -07007363 struct scheduler_msg message = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007364 tAniSetTmLevelReq *setTmLevelReq = NULL;
7365
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05307366 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007367 TRACE_CODE_SME_RX_HDD_SET_TMLEVEL, NO_SESSION, 0));
7368 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307369 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007370 setTmLevelReq =
7371 (tAniSetTmLevelReq *)
Anurag Chouhan600c3a02016-03-01 10:33:54 +05307372 qdf_mem_malloc(sizeof(tAniSetTmLevelReq));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007373 if (NULL == setTmLevelReq) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05307374 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007375 "%s: Not able to allocate memory for sme_set_tm_level",
7376 __func__);
7377 sme_release_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307378 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007379 }
7380
7381 setTmLevelReq->tmMode = tmMode;
7382 setTmLevelReq->newTmLevel = newTMLevel;
7383
7384 /* serialize the req through MC thread */
Rajeev Kumar8eaedf62017-01-21 11:03:13 -08007385 message.bodyptr = setTmLevelReq;
7386 message.type = WMA_SET_TM_LEVEL_REQ;
Sreelakshmi Konamki6a065362016-05-31 16:05:01 +05307387 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
Rajeev Kumar8eaedf62017-01-21 11:03:13 -08007388 NO_SESSION, message.type));
7389 qdf_status = scheduler_post_msg(QDF_MODULE_ID_WMA,
7390 &message);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307391 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05307392 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007393 "%s: Post Set TM Level MSG fail", __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05307394 qdf_mem_free(setTmLevelReq);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307395 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007396 }
7397 sme_release_global_lock(&pMac->sme);
7398 }
7399 return status;
7400}
7401
7402/*---------------------------------------------------------------------------
7403
7404 \brief sme_feature_caps_exchange() - SME interface to exchange capabilities between
7405 Host and FW.
7406
7407 \param hHal - HAL handle for device
7408
7409 \return NONE
7410
7411 ---------------------------------------------------------------------------*/
7412void sme_feature_caps_exchange(tHalHandle hHal)
7413{
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05307414 MTRACE(qdf_trace
Anurag Chouhan6d760662016-02-20 16:05:43 +05307415 (QDF_MODULE_ID_SME, TRACE_CODE_SME_RX_HDD_CAPS_EXCH, NO_SESSION,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007416 0));
7417}
7418
7419/*---------------------------------------------------------------------------
7420
7421 \brief sme_disable_feature_capablity() - SME interface to disable Active mode offload capablity
7422 in Host.
7423
7424 \param hHal - HAL handle for device
7425
7426 \return NONE
7427
7428 ---------------------------------------------------------------------------*/
7429void sme_disable_feature_capablity(uint8_t feature_index)
7430{
7431}
7432
7433/* ---------------------------------------------------------------------------
7434 \fn sme_reset_power_values_for5_g
7435 \brief Reset the power values for 5G band with default power values.
7436 \param hHal - HAL handle for device
7437 \- return NONE
7438 -------------------------------------------------------------------------*/
7439void sme_reset_power_values_for5_g(tHalHandle hHal)
7440{
7441 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05307442 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007443 TRACE_CODE_SME_RX_HDD_RESET_PW5G, NO_SESSION, 0));
7444 csr_save_channel_power_for_band(pMac, true);
7445 csr_apply_power2_current(pMac); /* Store the channel+power info in the global place: Cfg */
7446}
7447
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007448/* ---------------------------------------------------------------------------
7449 \fn sme_update_roam_prefer5_g_hz
7450 \brief enable/disable Roam prefer 5G runtime option
7451 This function is called through dynamic setConfig callback function
7452 to configure the Roam prefer 5G runtime option
7453 \param hHal - HAL handle for device
7454 \param nRoamPrefer5GHz Enable/Disable Roam prefer 5G runtime option
7455 \- return Success or failure
7456 -------------------------------------------------------------------------*/
7457
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307458QDF_STATUS sme_update_roam_prefer5_g_hz(tHalHandle hHal, bool nRoamPrefer5GHz)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007459{
7460 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307461 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007462
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05307463 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007464 TRACE_CODE_SME_RX_HDD_UPDATE_RP5G, NO_SESSION, 0));
7465 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307466 if (QDF_IS_STATUS_SUCCESS(status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05307467 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007468 "%s: gRoamPrefer5GHz is changed from %d to %d",
7469 __func__, pMac->roam.configParam.nRoamPrefer5GHz,
7470 nRoamPrefer5GHz);
7471 pMac->roam.configParam.nRoamPrefer5GHz = nRoamPrefer5GHz;
7472 sme_release_global_lock(&pMac->sme);
7473 }
7474
7475 return status;
7476}
7477
7478/* ---------------------------------------------------------------------------
7479 \fn sme_set_roam_intra_band
7480 \brief enable/disable Intra band roaming
7481 This function is called through dynamic setConfig callback function
7482 to configure the intra band roaming
7483 \param hHal - HAL handle for device
7484 \param nRoamIntraBand Enable/Disable Intra band roaming
7485 \- return Success or failure
7486 -------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307487QDF_STATUS sme_set_roam_intra_band(tHalHandle hHal, const bool nRoamIntraBand)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007488{
7489 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307490 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007491
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05307492 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007493 TRACE_CODE_SME_RX_HDD_SET_ROAMIBAND, NO_SESSION, 0));
7494 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307495 if (QDF_IS_STATUS_SUCCESS(status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05307496 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007497 "%s: gRoamIntraBand is changed from %d to %d",
7498 __func__, pMac->roam.configParam.nRoamIntraBand,
7499 nRoamIntraBand);
7500 pMac->roam.configParam.nRoamIntraBand = nRoamIntraBand;
7501 sme_release_global_lock(&pMac->sme);
7502 }
7503
7504 return status;
7505}
7506
7507/* ---------------------------------------------------------------------------
7508 \fn sme_update_roam_scan_n_probes
7509 \brief function to update roam scan N probes
7510 This function is called through dynamic setConfig callback function
7511 to update roam scan N probes
7512 \param hHal - HAL handle for device
7513 \param sessionId - Session Identifier
7514 \param nProbes number of probe requests to be sent out
7515 \- return Success or failure
7516 -------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307517QDF_STATUS sme_update_roam_scan_n_probes(tHalHandle hHal, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007518 const uint8_t nProbes)
7519{
7520 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307521 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007522
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05307523 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007524 TRACE_CODE_SME_RX_HDD_UPDATE_ROAM_SCAN_N_PROBES,
7525 NO_SESSION, 0));
7526 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307527 if (QDF_IS_STATUS_SUCCESS(status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05307528 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007529 "%s: gRoamScanNProbes is changed from %d to %d",
7530 __func__, pMac->roam.configParam.nProbes, nProbes);
7531 pMac->roam.configParam.nProbes = nProbes;
7532 sme_release_global_lock(&pMac->sme);
7533 }
7534 if (pMac->roam.configParam.isRoamOffloadScanEnabled) {
7535 csr_roam_offload_scan(pMac, sessionId,
7536 ROAM_SCAN_OFFLOAD_UPDATE_CFG,
7537 REASON_NPROBES_CHANGED);
7538 }
7539 return status;
7540}
7541
7542/* ---------------------------------------------------------------------------
7543 \fn sme_update_roam_scan_home_away_time
7544 \brief function to update roam scan Home away time
7545 This function is called through dynamic setConfig callback function
7546 to update roam scan home away time
7547 \param hHal - HAL handle for device
7548 \param sessionId - Session Identifier
7549 \param nRoamScanAwayTime Scan home away time
7550 \param bSendOffloadCmd If true then send offload command to firmware
7551 If false then command is not sent to firmware
7552 \- return Success or failure
7553 -------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307554QDF_STATUS sme_update_roam_scan_home_away_time(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007555 uint8_t sessionId,
7556 const uint16_t nRoamScanHomeAwayTime,
7557 const bool bSendOffloadCmd)
7558{
7559 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307560 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007561
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05307562 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007563 TRACE_CODE_SME_RX_HDD_UPDATE_ROAM_SCAN_HOME_AWAY_TIME,
7564 NO_SESSION, 0));
7565 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307566 if (QDF_IS_STATUS_SUCCESS(status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05307567 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007568 "%s: gRoamScanHomeAwayTime is changed from %d to %d",
7569 __func__,
7570 pMac->roam.configParam.nRoamScanHomeAwayTime,
7571 nRoamScanHomeAwayTime);
7572 pMac->roam.configParam.nRoamScanHomeAwayTime =
7573 nRoamScanHomeAwayTime;
7574 sme_release_global_lock(&pMac->sme);
7575 }
7576 if (pMac->roam.configParam.isRoamOffloadScanEnabled && bSendOffloadCmd) {
7577 csr_roam_offload_scan(pMac, sessionId,
7578 ROAM_SCAN_OFFLOAD_UPDATE_CFG,
7579 REASON_HOME_AWAY_TIME_CHANGED);
7580 }
7581 return status;
7582}
7583
Abhishek Singh518323d2015-10-19 17:42:01 +05307584/**
7585 * sme_ext_change_channel()- function to post send ECSA
7586 * action frame to csr.
7587 * @hHal: Hal context
7588 * @channel: new channel to switch
7589 * @session_id: senssion it should be sent on.
7590 *
7591 * This function is called to post ECSA frame to csr.
7592 *
7593 * Return: success if msg is sent else return failure
7594 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307595QDF_STATUS sme_ext_change_channel(tHalHandle h_hal, uint32_t channel,
Abhishek Singh518323d2015-10-19 17:42:01 +05307596 uint8_t session_id)
7597{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307598 QDF_STATUS status = QDF_STATUS_SUCCESS;
Abhishek Singh518323d2015-10-19 17:42:01 +05307599 tpAniSirGlobal mac_ctx = PMAC_STRUCT(h_hal);
7600 uint8_t channel_state;
7601
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07007602 sme_err("Set Channel: %d", channel);
Abhishek Singh518323d2015-10-19 17:42:01 +05307603 channel_state =
Kiran Kumar Lokerea3de2262017-04-12 12:15:04 -07007604 wlan_reg_get_channel_state(mac_ctx->pdev, channel);
Abhishek Singh518323d2015-10-19 17:42:01 +05307605
7606 if (CHANNEL_STATE_DISABLE == channel_state) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07007607 sme_err("Invalid channel: %d", channel);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307608 return QDF_STATUS_E_INVAL;
Abhishek Singh518323d2015-10-19 17:42:01 +05307609 }
7610
7611 status = sme_acquire_global_lock(&mac_ctx->sme);
7612
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307613 if (QDF_STATUS_SUCCESS == status) {
Abhishek Singh518323d2015-10-19 17:42:01 +05307614 /* update the channel list to the firmware */
7615 status = csr_send_ext_change_channel(mac_ctx,
7616 channel, session_id);
7617 sme_release_global_lock(&mac_ctx->sme);
7618 }
7619
7620 return status;
7621}
7622
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007623/* ---------------------------------------------------------------------------
7624 \fn sme_get_roam_intra_band
7625 \brief get Intra band roaming
7626 \param hHal - HAL handle for device
7627 \- return Success or failure
7628 -------------------------------------------------------------------------*/
7629bool sme_get_roam_intra_band(tHalHandle hHal)
7630{
7631 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05307632 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007633 TRACE_CODE_SME_RX_HDD_GET_ROAMIBAND, NO_SESSION, 0));
7634 return pMac->roam.configParam.nRoamIntraBand;
7635}
7636
7637/* ---------------------------------------------------------------------------
7638 \fn sme_get_roam_scan_n_probes
7639 \brief get N Probes
7640 \param hHal - HAL handle for device
7641 \- return Success or failure
7642 -------------------------------------------------------------------------*/
7643uint8_t sme_get_roam_scan_n_probes(tHalHandle hHal)
7644{
7645 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
7646 return pMac->roam.configParam.nProbes;
7647}
7648
7649/* ---------------------------------------------------------------------------
7650 \fn sme_get_roam_scan_home_away_time
7651 \brief get Roam scan home away time
7652 \param hHal - HAL handle for device
7653 \- return Success or failure
7654 -------------------------------------------------------------------------*/
7655uint16_t sme_get_roam_scan_home_away_time(tHalHandle hHal)
7656{
7657 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
7658 return pMac->roam.configParam.nRoamScanHomeAwayTime;
7659}
7660
7661/* ---------------------------------------------------------------------------
7662 \fn sme_update_roam_rssi_diff
7663 \brief Update RoamRssiDiff
7664 This function is called through dynamic setConfig callback function
7665 to configure RoamRssiDiff
7666 Usage: adb shell iwpriv wlan0 setConfig RoamRssiDiff=[0 .. 125]
7667 \param hHal - HAL handle for device
7668 \param sessionId - Session Identifier
7669 \param RoamRssiDiff - minimum rssi difference between potential
7670 candidate and current AP.
7671 \- return Success or failure
7672 -------------------------------------------------------------------------*/
7673
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307674QDF_STATUS sme_update_roam_rssi_diff(tHalHandle hHal, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007675 uint8_t RoamRssiDiff)
7676{
7677 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307678 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007679
Naveen Rawatc36f7eb2016-11-10 20:01:03 -08007680 if (sessionId >= CSR_ROAM_SESSION_MAX) {
7681 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
7682 FL("Invalid sme session id: %d"), sessionId);
7683 return QDF_STATUS_E_INVAL;
7684 }
7685
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007686 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307687 if (QDF_IS_STATUS_SUCCESS(status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05307688 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007689 "LFR runtime successfully set roam rssi diff to %d - old value is %d - roam state is %s",
7690 RoamRssiDiff,
7691 pMac->roam.configParam.RoamRssiDiff,
7692 mac_trace_get_neighbour_roam_state(pMac->roam.
7693 neighborRoamInfo
7694 [sessionId].
7695 neighborRoamState));
7696 pMac->roam.configParam.RoamRssiDiff = RoamRssiDiff;
7697 sme_release_global_lock(&pMac->sme);
7698 }
Naveen Rawatc36f7eb2016-11-10 20:01:03 -08007699
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007700 if (pMac->roam.configParam.isRoamOffloadScanEnabled) {
7701 csr_roam_offload_scan(pMac, sessionId,
7702 ROAM_SCAN_OFFLOAD_UPDATE_CFG,
7703 REASON_RSSI_DIFF_CHANGED);
7704 }
7705 return status;
7706}
7707
7708/*--------------------------------------------------------------------------
7709 \brief sme_update_fast_transition_enabled() - enable/disable Fast Transition
7710 support at runtime
7711 It is used at in the REG_DYNAMIC_VARIABLE macro definition of
7712 isFastTransitionEnabled.
7713 This is a synchronous call
7714 \param hHal - The handle returned by mac_open.
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307715 \return QDF_STATUS_SUCCESS - SME update isFastTransitionEnabled config
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007716 successfully.
7717 Other status means SME is failed to update isFastTransitionEnabled.
7718 \sa
7719 --------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307720QDF_STATUS sme_update_fast_transition_enabled(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007721 bool isFastTransitionEnabled)
7722{
7723 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307724 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007725
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05307726 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007727 TRACE_CODE_SME_RX_HDD_UPDATE_FTENABLED, NO_SESSION,
7728 0));
7729 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307730 if (QDF_IS_STATUS_SUCCESS(status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05307731 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007732 "%s: FastTransitionEnabled is changed from %d to %d",
7733 __func__,
7734 pMac->roam.configParam.isFastTransitionEnabled,
7735 isFastTransitionEnabled);
7736 pMac->roam.configParam.isFastTransitionEnabled =
7737 isFastTransitionEnabled;
7738 sme_release_global_lock(&pMac->sme);
7739 }
7740
7741 return status;
7742}
7743
7744/* ---------------------------------------------------------------------------
7745 \fn sme_update_wes_mode
7746 \brief Update WES Mode
7747 This function is called through dynamic setConfig callback function
7748 to configure isWESModeEnabled
7749 \param hHal - HAL handle for device
7750 \param isWESModeEnabled - WES mode
7751 \param sessionId - Session Identifier
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307752 \return QDF_STATUS_SUCCESS - SME update isWESModeEnabled config successfully.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007753 Other status means SME is failed to update isWESModeEnabled.
7754 -------------------------------------------------------------------------*/
7755
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307756QDF_STATUS sme_update_wes_mode(tHalHandle hHal, bool isWESModeEnabled,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007757 uint8_t sessionId)
7758{
7759 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307760 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007761
Naveen Rawatc36f7eb2016-11-10 20:01:03 -08007762 if (sessionId >= CSR_ROAM_SESSION_MAX) {
7763 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
7764 FL("Invalid sme session id: %d"), sessionId);
7765 return QDF_STATUS_E_INVAL;
7766 }
7767
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007768 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307769 if (QDF_IS_STATUS_SUCCESS(status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05307770 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007771 "LFR runtime successfully set WES Mode to %d - old value is %d - roam state is %s",
7772 isWESModeEnabled,
7773 pMac->roam.configParam.isWESModeEnabled,
7774 mac_trace_get_neighbour_roam_state(pMac->roam.
7775 neighborRoamInfo
7776 [sessionId].
7777 neighborRoamState));
7778 pMac->roam.configParam.isWESModeEnabled = isWESModeEnabled;
7779 sme_release_global_lock(&pMac->sme);
7780 }
7781
7782 return status;
7783}
7784
7785/* ---------------------------------------------------------------------------
7786 \fn sme_set_roam_scan_control
7787 \brief Set roam scan control
7788 This function is called to set roam scan control
7789 if roam scan control is set to 0, roaming scan cache is cleared
7790 any value other than 0 is treated as invalid value
7791 \param hHal - HAL handle for device
7792 \param sessionId - Session Identifier
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307793 \return QDF_STATUS_SUCCESS - SME update config successfully.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007794 Other status means SME failure to update
7795 -------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307796QDF_STATUS sme_set_roam_scan_control(tHalHandle hHal, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007797 bool roamScanControl)
7798{
7799 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307800 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007801
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05307802 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007803 TRACE_CODE_SME_RX_HDD_SET_SCANCTRL, NO_SESSION, 0));
Naveen Rawatc36f7eb2016-11-10 20:01:03 -08007804
7805 if (sessionId >= CSR_ROAM_SESSION_MAX) {
7806 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
7807 FL("Invalid sme session id: %d"), sessionId);
7808 return QDF_STATUS_E_INVAL;
7809 }
7810
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007811 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307812 if (QDF_IS_STATUS_SUCCESS(status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05307813 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007814 "LFR runtime successfully set roam scan control to %d - old value is %d - roam state is %s",
7815 roamScanControl,
7816 pMac->roam.configParam.nRoamScanControl,
7817 mac_trace_get_neighbour_roam_state(pMac->roam.
7818 neighborRoamInfo
7819 [sessionId].
7820 neighborRoamState));
7821 pMac->roam.configParam.nRoamScanControl = roamScanControl;
7822 if (0 == roamScanControl) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05307823 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007824 "LFR runtime successfully cleared roam scan cache");
7825 csr_flush_cfg_bg_scan_roam_channel_list(pMac, sessionId);
7826 if (pMac->roam.configParam.isRoamOffloadScanEnabled) {
7827 csr_roam_offload_scan(pMac, sessionId,
7828 ROAM_SCAN_OFFLOAD_UPDATE_CFG,
7829 REASON_FLUSH_CHANNEL_LIST);
7830 }
7831 }
7832 sme_release_global_lock(&pMac->sme);
7833 }
7834 return status;
7835}
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007836
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007837/*--------------------------------------------------------------------------
7838 \brief sme_update_is_fast_roam_ini_feature_enabled() - enable/disable LFR
7839 support at runtime
7840 It is used at in the REG_DYNAMIC_VARIABLE macro definition of
7841 isFastRoamIniFeatureEnabled.
7842 This is a synchronous call
7843 \param hHal - The handle returned by mac_open.
7844 \param sessionId - Session Identifier
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307845 \return QDF_STATUS_SUCCESS - SME update isFastRoamIniFeatureEnabled config
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007846 successfully.
7847 Other status means SME is failed to update isFastRoamIniFeatureEnabled.
7848 \sa
7849 --------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307850QDF_STATUS sme_update_is_fast_roam_ini_feature_enabled
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007851 (tHalHandle hHal,
7852 uint8_t sessionId, const bool isFastRoamIniFeatureEnabled) {
7853 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
7854
7855 if (pMac->roam.configParam.isFastRoamIniFeatureEnabled ==
7856 isFastRoamIniFeatureEnabled) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05307857 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007858 "%s: FastRoam is already enabled or disabled, nothing to do (returning) old(%d) new(%d)",
7859 __func__,
7860 pMac->roam.configParam.isFastRoamIniFeatureEnabled,
7861 isFastRoamIniFeatureEnabled);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307862 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007863 }
7864
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05307865 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007866 "%s: FastRoamEnabled is changed from %d to %d", __func__,
7867 pMac->roam.configParam.isFastRoamIniFeatureEnabled,
7868 isFastRoamIniFeatureEnabled);
7869 pMac->roam.configParam.isFastRoamIniFeatureEnabled =
7870 isFastRoamIniFeatureEnabled;
7871 csr_neighbor_roam_update_fast_roaming_enabled(pMac, sessionId,
7872 isFastRoamIniFeatureEnabled);
7873
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307874 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007875}
7876
Mukul Sharma69c44cd2016-09-12 18:33:57 +05307877/**
7878 * sme_config_fast_roaming() - enable/disable LFR support at runtime
7879 * @hal - The handle returned by macOpen.
7880 * @session_id - Session Identifier
7881 * @is_fast_roam_enabled - flag to enable/disable roaming
7882 *
7883 * When Supplicant issues enabled/disable fast roaming on the basis
7884 * of the Bssid modification in network block (e.g. AutoJoin mode N/W block)
7885 *
7886 * Return: QDF_STATUS
7887 */
7888
7889QDF_STATUS sme_config_fast_roaming(tHalHandle hal, uint8_t session_id,
7890 const bool is_fast_roam_enabled)
7891{
7892 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
Sreelakshmi Konamkibda5bbf2016-09-12 18:38:10 +05307893 tCsrRoamSession *session = CSR_GET_SESSION(mac_ctx, session_id);
Mukul Sharma69c44cd2016-09-12 18:33:57 +05307894 QDF_STATUS status;
7895
Arif Hussaina48a9c02017-01-31 14:37:45 -08007896 /* do_not_roam flag is set in wlan_hdd_cfg80211_connect_start
7897 * when supplicant initiate connect request with BSSID.
7898 * This flag reset when supplicant sends vendor command to enable
7899 * roaming after association.
7900 *
7901 * This request from wpa_supplicant will be skipped in this function
7902 * if roaming is disabled using driver command or INI and do_not_roam
7903 * flag remains set. So make sure to set do_not_roam flag as per
7904 * wpa_supplicant even if roam request from wpa_supplicant ignored.
7905 */
7906 if (session && session->pCurRoamProfile)
7907 session->pCurRoamProfile->do_not_roam = !is_fast_roam_enabled;
7908
Mukul Sharma69c44cd2016-09-12 18:33:57 +05307909 if (!mac_ctx->roam.configParam.isFastRoamIniFeatureEnabled) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07007910 sme_debug("Fast roam is disabled through ini");
Mukul Sharma69c44cd2016-09-12 18:33:57 +05307911 if (!is_fast_roam_enabled)
7912 return QDF_STATUS_SUCCESS;
7913 return QDF_STATUS_E_FAILURE;
7914 }
Sreelakshmi Konamkibda5bbf2016-09-12 18:38:10 +05307915
Mukul Sharma69c44cd2016-09-12 18:33:57 +05307916 status = csr_neighbor_roam_update_fast_roaming_enabled(mac_ctx,
7917 session_id, is_fast_roam_enabled);
7918 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07007919 sme_err("update fast roaming failed. status: %d", status);
Mukul Sharma69c44cd2016-09-12 18:33:57 +05307920 return QDF_STATUS_E_FAILURE;
7921 }
7922
7923 return QDF_STATUS_SUCCESS;
7924}
7925
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007926/*--------------------------------------------------------------------------
7927 \brief sme_update_is_mawc_ini_feature_enabled() -
7928 Enable/disable LFR MAWC support at runtime
7929 It is used at in the REG_DYNAMIC_VARIABLE macro definition of
7930 isMAWCIniFeatureEnabled.
7931 This is a synchronous call
7932 \param hHal - The handle returned by mac_open.
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307933 \return QDF_STATUS_SUCCESS - SME update MAWCEnabled config successfully.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007934 Other status means SME is failed to update MAWCEnabled.
7935 \sa
7936 --------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307937QDF_STATUS sme_update_is_mawc_ini_feature_enabled(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007938 const bool MAWCEnabled)
7939{
7940 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307941 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007942
7943 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307944 if (QDF_IS_STATUS_SUCCESS(status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05307945 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007946 "%s: MAWCEnabled is changed from %d to %d", __func__,
7947 pMac->roam.configParam.MAWCEnabled, MAWCEnabled);
7948 pMac->roam.configParam.MAWCEnabled = MAWCEnabled;
7949 sme_release_global_lock(&pMac->sme);
7950 }
7951
7952 return status;
7953
7954}
7955
7956/*--------------------------------------------------------------------------
7957 \brief sme_stop_roaming() - Stop roaming for a given sessionId
7958 This is a synchronous call
7959 \param hHal - The handle returned by mac_open
7960 \param sessionId - Session Identifier
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307961 \return QDF_STATUS_SUCCESS on success
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007962 Other status on failure
7963 \sa
7964 --------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307965QDF_STATUS sme_stop_roaming(tHalHandle hHal, uint8_t sessionId, uint8_t reason)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007966{
7967 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307968 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007969
7970 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307971 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007972 csr_roam_offload_scan(pMac, sessionId, ROAM_SCAN_OFFLOAD_STOP,
7973 reason);
7974 sme_release_global_lock(&pMac->sme);
7975 }
7976
7977 return status;
7978}
7979
7980/*--------------------------------------------------------------------------
7981 \brief sme_start_roaming() - Start roaming for a given sessionId
7982 This is a synchronous call
7983 \param hHal - The handle returned by mac_open
7984 \param sessionId - Session Identifier
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307985 \return QDF_STATUS_SUCCESS on success
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007986 Other status on failure
7987 \sa
7988 --------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307989QDF_STATUS sme_start_roaming(tHalHandle hHal, uint8_t sessionId, uint8_t reason)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007990{
7991 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307992 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007993
7994 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307995 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007996 csr_roam_offload_scan(pMac, sessionId, ROAM_SCAN_OFFLOAD_START,
7997 reason);
7998 sme_release_global_lock(&pMac->sme);
7999 }
8000
8001 return status;
8002}
8003
8004/*--------------------------------------------------------------------------
8005 \brief sme_update_enable_fast_roam_in_concurrency() - enable/disable LFR if
8006 Concurrent session exists
8007 This is a synchronuous call
8008 \param hHal - The handle returned by mac_open.
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308009 \return QDF_STATUS_SUCCESS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008010 Other status means SME is failed
8011 \sa
8012 --------------------------------------------------------------------------*/
8013
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308014QDF_STATUS sme_update_enable_fast_roam_in_concurrency(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008015 bool
8016 bFastRoamInConIniFeatureEnabled)
8017{
8018
8019 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308020 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008021
8022 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308023 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008024 pMac->roam.configParam.bFastRoamInConIniFeatureEnabled =
8025 bFastRoamInConIniFeatureEnabled;
8026 if (0 == pMac->roam.configParam.isRoamOffloadScanEnabled) {
8027 pMac->roam.configParam.bFastRoamInConIniFeatureEnabled =
8028 0;
8029 }
8030 sme_release_global_lock(&pMac->sme);
8031 }
8032
8033 return status;
8034}
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008035
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008036/*--------------------------------------------------------------------------
8037 \brief sme_update_config_fw_rssi_monitoring() - enable/disable firmware RSSI
8038 Monitoring at runtime
8039 It is used at in the REG_DYNAMIC_VARIABLE macro definition of
8040 fEnableFwRssiMonitoring.
8041 This is a synchronous call
8042 \param hHal - The handle returned by mac_open.
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308043 \return QDF_STATUS_SUCCESS - SME update fEnableFwRssiMonitoring.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008044 config successfully.
8045 Other status means SME is failed to update fEnableFwRssiMonitoring.
8046 \sa
8047 --------------------------------------------------------------------------*/
8048
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308049QDF_STATUS sme_update_config_fw_rssi_monitoring(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008050 bool fEnableFwRssiMonitoring)
8051{
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05308052 QDF_STATUS qdf_ret_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008053
8054 if (sme_cfg_set_int (hHal, WNI_CFG_PS_ENABLE_RSSI_MONITOR,
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308055 fEnableFwRssiMonitoring) == QDF_STATUS_E_FAILURE) {
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05308056 qdf_ret_status = QDF_STATUS_E_FAILURE;
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308057 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008058 "Could not pass on WNI_CFG_PS_RSSI_MONITOR to CFG");
8059 }
8060
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05308061 return qdf_ret_status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008062}
8063
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008064/* ---------------------------------------------------------------------------
8065 \fn sme_set_roam_opportunistic_scan_threshold_diff
8066 \brief Update Opportunistic Scan threshold diff
8067 This function is called through dynamic setConfig callback function
8068 to configure nOpportunisticThresholdDiff
8069 \param hHal - HAL handle for device
8070 \param sessionId - Session Identifier
8071 \param nOpportunisticThresholdDiff - Opportunistic Scan threshold diff
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308072 \return QDF_STATUS_SUCCESS - SME update nOpportunisticThresholdDiff config
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008073 successfully.
8074 else SME is failed to update nOpportunisticThresholdDiff.
8075 -------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308076QDF_STATUS sme_set_roam_opportunistic_scan_threshold_diff(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008077 uint8_t sessionId,
8078 const uint8_t
8079 nOpportunisticThresholdDiff)
8080{
8081 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308082 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008083
8084 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308085 if (QDF_IS_STATUS_SUCCESS(status)) {
Varun Reddy Yeturuff4feb02016-04-20 12:26:11 -07008086 status = csr_neighbor_roam_update_config(pMac, sessionId,
8087 nOpportunisticThresholdDiff,
8088 REASON_OPPORTUNISTIC_THRESH_DIFF_CHANGED);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308089 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008090 pMac->roam.configParam.neighborRoamConfig.
8091 nOpportunisticThresholdDiff =
8092 nOpportunisticThresholdDiff;
8093 }
8094 sme_release_global_lock(&pMac->sme);
8095 }
8096 return status;
8097}
8098
8099/*--------------------------------------------------------------------------
8100 \fn sme_get_roam_opportunistic_scan_threshold_diff()
8101 \brief gets Opportunistic Scan threshold diff
8102 This is a synchronous call
8103 \param hHal - The handle returned by mac_open
8104 \return uint8_t - nOpportunisticThresholdDiff
8105 \sa
8106 --------------------------------------------------------------------------*/
8107uint8_t sme_get_roam_opportunistic_scan_threshold_diff(tHalHandle hHal)
8108{
8109 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
8110 return pMac->roam.configParam.neighborRoamConfig.
8111 nOpportunisticThresholdDiff;
8112}
8113
8114/* ---------------------------------------------------------------------------
8115 \fn sme_set_roam_rescan_rssi_diff
8116 \brief Update roam rescan rssi diff
8117 This function is called through dynamic setConfig callback function
8118 to configure nRoamRescanRssiDiff
8119 \param hHal - HAL handle for device
8120 \param sessionId - Session Identifier
8121 \param nRoamRescanRssiDiff - roam rescan rssi diff
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308122 \return QDF_STATUS_SUCCESS - SME update nRoamRescanRssiDiff config
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008123 successfully.
8124 else SME is failed to update nRoamRescanRssiDiff.
8125 -------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308126QDF_STATUS sme_set_roam_rescan_rssi_diff(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008127 uint8_t sessionId,
8128 const uint8_t nRoamRescanRssiDiff)
8129{
8130 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308131 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008132
8133 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308134 if (QDF_IS_STATUS_SUCCESS(status)) {
Varun Reddy Yeturuff4feb02016-04-20 12:26:11 -07008135 status = csr_neighbor_roam_update_config(pMac, sessionId,
8136 nRoamRescanRssiDiff,
8137 REASON_ROAM_RESCAN_RSSI_DIFF_CHANGED);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308138 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008139 pMac->roam.configParam.neighborRoamConfig.
8140 nRoamRescanRssiDiff = nRoamRescanRssiDiff;
8141 }
8142 sme_release_global_lock(&pMac->sme);
8143 }
8144 return status;
8145}
8146
8147/*--------------------------------------------------------------------------
8148 \fn sme_get_roam_rescan_rssi_diff
8149 \brief gets roam rescan rssi diff
8150 This is a synchronous call
8151 \param hHal - The handle returned by mac_open
8152 \return int8_t - nRoamRescanRssiDiff
8153 \sa
8154 --------------------------------------------------------------------------*/
8155uint8_t sme_get_roam_rescan_rssi_diff(tHalHandle hHal)
8156{
8157 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
8158 return pMac->roam.configParam.neighborRoamConfig.nRoamRescanRssiDiff;
8159}
8160
8161/* ---------------------------------------------------------------------------
8162 \fn sme_set_roam_bmiss_first_bcnt
8163 \brief Update Roam count for first beacon miss
8164 This function is called through dynamic setConfig callback function
8165 to configure nRoamBmissFirstBcnt
8166 \param hHal - HAL handle for device
8167 \param sessionId - Session Identifier
8168 \param nRoamBmissFirstBcnt - Roam first bmiss count
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308169 \return QDF_STATUS_SUCCESS - SME update nRoamBmissFirstBcnt
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008170 successfully.
8171 else SME is failed to update nRoamBmissFirstBcnt
8172 -------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308173QDF_STATUS sme_set_roam_bmiss_first_bcnt(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008174 uint8_t sessionId,
8175 const uint8_t nRoamBmissFirstBcnt)
8176{
8177 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308178 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008179
8180 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308181 if (QDF_IS_STATUS_SUCCESS(status)) {
Varun Reddy Yeturuff4feb02016-04-20 12:26:11 -07008182 status = csr_neighbor_roam_update_config(pMac, sessionId,
8183 nRoamBmissFirstBcnt,
8184 REASON_ROAM_BMISS_FIRST_BCNT_CHANGED);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308185 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008186 pMac->roam.configParam.neighborRoamConfig.
8187 nRoamBmissFirstBcnt = nRoamBmissFirstBcnt;
8188 }
8189 sme_release_global_lock(&pMac->sme);
8190 }
8191 return status;
8192}
8193
8194/* ---------------------------------------------------------------------------
8195 \fn sme_get_roam_bmiss_first_bcnt
8196 \brief get neighbor roam beacon miss first count
8197 \param hHal - The handle returned by mac_open.
8198 \return uint8_t - neighbor roam beacon miss first count
8199 -------------------------------------------------------------------------*/
8200uint8_t sme_get_roam_bmiss_first_bcnt(tHalHandle hHal)
8201{
8202 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
8203 return pMac->roam.configParam.neighborRoamConfig.nRoamBmissFirstBcnt;
8204}
8205
8206/* ---------------------------------------------------------------------------
8207 \fn sme_set_roam_bmiss_final_bcnt
8208 \brief Update Roam count for final beacon miss
8209 This function is called through dynamic setConfig callback function
8210 to configure nRoamBmissFinalBcnt
8211 \param hHal - HAL handle for device
8212 \param sessionId - Session Identifier
8213 \param nRoamBmissFinalBcnt - Roam final bmiss count
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308214 \return QDF_STATUS_SUCCESS - SME update nRoamBmissFinalBcnt
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008215 successfully.
8216 else SME is failed to update nRoamBmissFinalBcnt
8217 -------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308218QDF_STATUS sme_set_roam_bmiss_final_bcnt(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008219 uint8_t sessionId,
8220 const uint8_t nRoamBmissFinalBcnt)
8221{
8222 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308223 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008224
8225 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308226 if (QDF_IS_STATUS_SUCCESS(status)) {
Varun Reddy Yeturuff4feb02016-04-20 12:26:11 -07008227 status = csr_neighbor_roam_update_config(pMac, sessionId,
8228 nRoamBmissFinalBcnt,
8229 REASON_ROAM_BMISS_FINAL_BCNT_CHANGED);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308230 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008231 pMac->roam.configParam.neighborRoamConfig.
8232 nRoamBmissFinalBcnt = nRoamBmissFinalBcnt;
8233 }
8234 sme_release_global_lock(&pMac->sme);
8235 }
8236 return status;
8237}
8238
8239/*--------------------------------------------------------------------------
8240 \fn sme_get_roam_bmiss_final_bcnt
8241 \brief gets Roam count for final beacon miss
8242 This is a synchronous call
8243 \param hHal - The handle returned by mac_open
8244 \return uint8_t - nRoamBmissFinalBcnt
8245 \sa
8246 --------------------------------------------------------------------------*/
8247uint8_t sme_get_roam_bmiss_final_bcnt(tHalHandle hHal)
8248{
8249 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
8250 return pMac->roam.configParam.neighborRoamConfig.nRoamBmissFinalBcnt;
8251}
8252
8253/* ---------------------------------------------------------------------------
8254 \fn sme_set_roam_beacon_rssi_weight
8255 \brief Update Roam beacon rssi weight
8256 This function is called through dynamic setConfig callback function
8257 to configure nRoamBeaconRssiWeight
8258 \param hHal - HAL handle for device
8259 \param sessionId - Session Identifier
8260 \param nRoamBeaconRssiWeight - Roam beacon rssi weight
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308261 \return QDF_STATUS_SUCCESS - SME update nRoamBeaconRssiWeight config
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008262 successfully.
8263 else SME is failed to update nRoamBeaconRssiWeight
8264 -------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308265QDF_STATUS sme_set_roam_beacon_rssi_weight(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008266 uint8_t sessionId,
8267 const uint8_t nRoamBeaconRssiWeight)
8268{
8269 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308270 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008271
8272 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308273 if (QDF_IS_STATUS_SUCCESS(status)) {
Varun Reddy Yeturuff4feb02016-04-20 12:26:11 -07008274 status = csr_neighbor_roam_update_config(pMac, sessionId,
8275 nRoamBeaconRssiWeight,
8276 REASON_ROAM_BEACON_RSSI_WEIGHT_CHANGED);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308277 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008278 pMac->roam.configParam.neighborRoamConfig.
8279 nRoamBeaconRssiWeight = nRoamBeaconRssiWeight;
8280 }
8281 sme_release_global_lock(&pMac->sme);
8282 }
8283 return status;
8284}
8285
8286/*--------------------------------------------------------------------------
8287 \fn sme_get_roam_beacon_rssi_weight
8288 \brief gets Roam beacon rssi weight
8289 This is a synchronous call
8290 \param hHal - The handle returned by mac_open
8291 \return uint8_t - nRoamBeaconRssiWeight
8292 \sa
8293 --------------------------------------------------------------------------*/
8294uint8_t sme_get_roam_beacon_rssi_weight(tHalHandle hHal)
8295{
8296 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
8297 return pMac->roam.configParam.neighborRoamConfig.nRoamBeaconRssiWeight;
8298}
8299
8300/*--------------------------------------------------------------------------
8301 \brief sme_set_neighbor_lookup_rssi_threshold() - update neighbor lookup
8302 rssi threshold
8303 This is a synchronous call
8304 \param hHal - The handle returned by mac_open.
8305 \param sessionId - Session Identifier
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308306 \return QDF_STATUS_SUCCESS - SME update config successful.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008307 Other status means SME is failed to update
8308 \sa
8309 --------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308310QDF_STATUS sme_set_neighbor_lookup_rssi_threshold
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008311 (tHalHandle hHal, uint8_t sessionId, uint8_t neighborLookupRssiThreshold) {
8312 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308313 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008314
8315 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308316 if (QDF_IS_STATUS_SUCCESS(status)) {
Varun Reddy Yeturuff4feb02016-04-20 12:26:11 -07008317 status = csr_neighbor_roam_update_config(pMac,
8318 sessionId, neighborLookupRssiThreshold,
8319 REASON_LOOKUP_THRESH_CHANGED);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308320 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008321 pMac->roam.configParam.neighborRoamConfig.
8322 nNeighborLookupRssiThreshold =
8323 neighborLookupRssiThreshold;
8324 }
8325 sme_release_global_lock(&pMac->sme);
8326 }
8327 return status;
8328}
8329
8330/*--------------------------------------------------------------------------
8331 \brief sme_set_delay_before_vdev_stop() - update delay before VDEV_STOP
8332 This is a synchronous call
8333 \param hal - The handle returned by macOpen.
8334 \param session_id - Session Identifier
8335 \param delay_before_vdev_stop - value to be set
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308336 \return QDF_STATUS_SUCCESS - SME update config successful.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008337 Other status means SME is failed to update
8338 \sa
8339 --------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308340QDF_STATUS sme_set_delay_before_vdev_stop(tHalHandle hal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008341 uint8_t session_id,
8342 uint8_t delay_before_vdev_stop)
8343{
8344 tpAniSirGlobal pMac = PMAC_STRUCT(hal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308345 QDF_STATUS status = QDF_STATUS_SUCCESS;
Naveen Rawatc36f7eb2016-11-10 20:01:03 -08008346
8347 if (session_id >= CSR_ROAM_SESSION_MAX) {
8348 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
8349 FL("Invalid sme session id: %d"), session_id);
8350 return QDF_STATUS_E_INVAL;
8351 }
8352
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008353 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308354 if (QDF_IS_STATUS_SUCCESS(status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308355 QDF_TRACE(QDF_MODULE_ID_SME,
8356 QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008357 FL("LFR param delay_before_vdev_stop changed from %d to %d"),
8358 pMac->roam.configParam.neighborRoamConfig.
8359 delay_before_vdev_stop,
8360 delay_before_vdev_stop);
8361 pMac->roam.neighborRoamInfo[session_id].cfgParams.
8362 delay_before_vdev_stop = delay_before_vdev_stop;
8363 pMac->roam.configParam.neighborRoamConfig.
8364 delay_before_vdev_stop = delay_before_vdev_stop;
8365 sme_release_global_lock(&pMac->sme);
8366 }
8367 return status;
8368}
8369
8370/*--------------------------------------------------------------------------
8371 \brief sme_get_neighbor_lookup_rssi_threshold() - get neighbor lookup
8372 rssi threshold
8373 This is a synchronous call
8374 \param hHal - The handle returned by mac_open.
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308375 \return QDF_STATUS_SUCCESS - SME update config successful.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008376 Other status means SME is failed to update
8377 \sa
8378 --------------------------------------------------------------------------*/
8379uint8_t sme_get_neighbor_lookup_rssi_threshold(tHalHandle hHal)
8380{
8381 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
8382 return pMac->roam.configParam.neighborRoamConfig.
8383 nNeighborLookupRssiThreshold;
8384}
8385
8386/*--------------------------------------------------------------------------
8387 \brief sme_set_neighbor_scan_refresh_period() - set neighbor scan results
8388 refresh period
8389 This is a synchronous call
8390 \param hHal - The handle returned by mac_open.
8391 \param sessionId - Session Identifier
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308392 \return QDF_STATUS_SUCCESS - SME update config successful.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008393 Other status means SME is failed to update
8394 \sa
8395 --------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308396QDF_STATUS sme_set_neighbor_scan_refresh_period
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008397 (tHalHandle hHal,
8398 uint8_t sessionId, uint16_t neighborScanResultsRefreshPeriod) {
8399 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308400 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008401 tCsrNeighborRoamConfig *pNeighborRoamConfig = NULL;
8402 tpCsrNeighborRoamControlInfo pNeighborRoamInfo = NULL;
8403
Naveen Rawatc36f7eb2016-11-10 20:01:03 -08008404 if (sessionId >= CSR_ROAM_SESSION_MAX) {
8405 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
8406 FL("Invalid sme session id: %d"), sessionId);
8407 return QDF_STATUS_E_INVAL;
8408 }
8409
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008410 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308411 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008412 pNeighborRoamConfig =
8413 &pMac->roam.configParam.neighborRoamConfig;
8414 pNeighborRoamInfo = &pMac->roam.neighborRoamInfo[sessionId];
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308415 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008416 "LFR runtime successfully set roam scan refresh period to %d- old value is %d - roam state is %s",
8417 neighborScanResultsRefreshPeriod,
8418 pMac->roam.configParam.neighborRoamConfig.
8419 nNeighborResultsRefreshPeriod,
8420 mac_trace_get_neighbour_roam_state(pMac->roam.
8421 neighborRoamInfo
8422 [sessionId].
8423 neighborRoamState));
8424 pNeighborRoamConfig->nNeighborResultsRefreshPeriod =
8425 neighborScanResultsRefreshPeriod;
8426 pNeighborRoamInfo->cfgParams.neighborResultsRefreshPeriod =
8427 neighborScanResultsRefreshPeriod;
8428
8429 sme_release_global_lock(&pMac->sme);
8430 }
8431 if (pMac->roam.configParam.isRoamOffloadScanEnabled) {
8432 csr_roam_offload_scan(pMac, sessionId,
8433 ROAM_SCAN_OFFLOAD_UPDATE_CFG,
8434 REASON_NEIGHBOR_SCAN_REFRESH_PERIOD_CHANGED);
8435 }
8436 return status;
8437}
8438
8439/*--------------------------------------------------------------------------
8440 \brief sme_update_roam_scan_offload_enabled() - enable/disable roam scan
8441 offload feaure
8442 It is used at in the REG_DYNAMIC_VARIABLE macro definition of
8443 gRoamScanOffloadEnabled.
8444 This is a synchronous call
8445 \param hHal - The handle returned by mac_open.
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308446 \return QDF_STATUS_SUCCESS - SME update config successfully.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008447 Other status means SME is failed to update.
8448 \sa
8449 --------------------------------------------------------------------------*/
8450
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308451QDF_STATUS sme_update_roam_scan_offload_enabled(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008452 bool nRoamScanOffloadEnabled)
8453{
8454 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308455 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008456
8457 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308458 if (QDF_IS_STATUS_SUCCESS(status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308459 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008460 FL
8461 ("gRoamScanOffloadEnabled is changed from %d to %d"),
8462 pMac->roam.configParam.isRoamOffloadScanEnabled,
8463 nRoamScanOffloadEnabled);
8464 pMac->roam.configParam.isRoamOffloadScanEnabled =
8465 nRoamScanOffloadEnabled;
8466 sme_release_global_lock(&pMac->sme);
8467 }
8468
8469 return status;
8470}
8471
8472/*--------------------------------------------------------------------------
8473 \brief sme_get_neighbor_scan_refresh_period() - get neighbor scan results
8474 refresh period
8475 This is a synchronous call
8476 \param hHal - The handle returned by mac_open.
8477 \return uint16_t - Neighbor scan results refresh period value
8478 \sa
8479 --------------------------------------------------------------------------*/
8480uint16_t sme_get_neighbor_scan_refresh_period(tHalHandle hHal)
8481{
8482 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
8483 return pMac->roam.configParam.neighborRoamConfig.
8484 nNeighborResultsRefreshPeriod;
8485}
8486
8487/*--------------------------------------------------------------------------
8488 \brief sme_get_empty_scan_refresh_period() - get empty scan refresh period
8489 This is a synchronuous call
8490 \param hHal - The handle returned by mac_open.
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308491 \return QDF_STATUS_SUCCESS - SME update config successful.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008492 Other status means SME is failed to update
8493 \sa
8494 --------------------------------------------------------------------------*/
8495uint16_t sme_get_empty_scan_refresh_period(tHalHandle hHal)
8496{
8497 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
8498 return pMac->roam.configParam.neighborRoamConfig.
8499 nEmptyScanRefreshPeriod;
8500}
8501
8502/* ---------------------------------------------------------------------------
8503 \fn sme_update_empty_scan_refresh_period
8504 \brief Update nEmptyScanRefreshPeriod
8505 This function is called through dynamic setConfig callback function
8506 to configure nEmptyScanRefreshPeriod
8507 Usage: adb shell iwpriv wlan0 setConfig
8508 nEmptyScanRefreshPeriod=[0 .. 60]
8509 \param hHal - HAL handle for device
8510 \param sessionId - Session Identifier
8511 \param nEmptyScanRefreshPeriod - scan period following empty scan results.
8512 \- return Success or failure
8513 -------------------------------------------------------------------------*/
8514
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308515QDF_STATUS sme_update_empty_scan_refresh_period(tHalHandle hHal, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008516 uint16_t nEmptyScanRefreshPeriod)
8517{
8518 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308519 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008520 tCsrNeighborRoamConfig *pNeighborRoamConfig = NULL;
8521 tpCsrNeighborRoamControlInfo pNeighborRoamInfo = NULL;
8522
Naveen Rawatc36f7eb2016-11-10 20:01:03 -08008523 if (sessionId >= CSR_ROAM_SESSION_MAX) {
8524 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
8525 FL("Invalid sme session id: %d"), sessionId);
8526 return QDF_STATUS_E_INVAL;
8527 }
8528
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008529 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308530 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008531 pNeighborRoamConfig =
8532 &pMac->roam.configParam.neighborRoamConfig;
8533 pNeighborRoamInfo = &pMac->roam.neighborRoamInfo[sessionId];
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308534 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008535 "LFR runtime successfully set roam scan period to %d -old value is %d - roam state is %s",
8536 nEmptyScanRefreshPeriod,
8537 pMac->roam.configParam.neighborRoamConfig.
8538 nEmptyScanRefreshPeriod,
8539 mac_trace_get_neighbour_roam_state(pMac->roam.
8540 neighborRoamInfo
8541 [sessionId].
8542 neighborRoamState));
8543 pNeighborRoamConfig->nEmptyScanRefreshPeriod =
8544 nEmptyScanRefreshPeriod;
8545 pNeighborRoamInfo->cfgParams.emptyScanRefreshPeriod =
8546 nEmptyScanRefreshPeriod;
8547 sme_release_global_lock(&pMac->sme);
8548 }
8549 if (pMac->roam.configParam.isRoamOffloadScanEnabled) {
8550 csr_roam_offload_scan(pMac, sessionId,
8551 ROAM_SCAN_OFFLOAD_UPDATE_CFG,
8552 REASON_EMPTY_SCAN_REF_PERIOD_CHANGED);
8553 }
8554 return status;
8555}
8556
8557/* ---------------------------------------------------------------------------
8558 \fn sme_set_neighbor_scan_min_chan_time
8559 \brief Update nNeighborScanMinChanTime
8560 This function is called through dynamic setConfig callback function
8561 to configure gNeighborScanChannelMinTime
8562 Usage: adb shell iwpriv wlan0 setConfig
8563 gNeighborScanChannelMinTime=[0 .. 60]
8564 \param hHal - HAL handle for device
8565 \param nNeighborScanMinChanTime - Channel minimum dwell time
8566 \param sessionId - Session Identifier
8567 \- return Success or failure
8568 -------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308569QDF_STATUS sme_set_neighbor_scan_min_chan_time(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008570 const uint16_t
8571 nNeighborScanMinChanTime,
8572 uint8_t sessionId)
8573{
8574 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308575 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008576
Naveen Rawatc36f7eb2016-11-10 20:01:03 -08008577 if (sessionId >= CSR_ROAM_SESSION_MAX) {
8578 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
8579 FL("Invalid sme session id: %d"), sessionId);
8580 return QDF_STATUS_E_INVAL;
8581 }
8582
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008583 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308584 if (QDF_IS_STATUS_SUCCESS(status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308585 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008586 "LFR runtime successfully set channel min dwell time to %d - old value is %d - roam state is %s",
8587 nNeighborScanMinChanTime,
8588 pMac->roam.configParam.neighborRoamConfig.
8589 nNeighborScanMinChanTime,
8590 mac_trace_get_neighbour_roam_state(pMac->roam.
8591 neighborRoamInfo
8592 [sessionId].
8593 neighborRoamState));
8594
8595 pMac->roam.configParam.neighborRoamConfig.
8596 nNeighborScanMinChanTime = nNeighborScanMinChanTime;
8597 pMac->roam.neighborRoamInfo[sessionId].cfgParams.
8598 minChannelScanTime = nNeighborScanMinChanTime;
8599 sme_release_global_lock(&pMac->sme);
8600 }
8601
8602 return status;
8603}
8604
8605/* ---------------------------------------------------------------------------
8606 \fn sme_set_neighbor_scan_max_chan_time
8607 \brief Update nNeighborScanMaxChanTime
8608 This function is called through dynamic setConfig callback function
8609 to configure gNeighborScanChannelMaxTime
8610 Usage: adb shell iwpriv wlan0 setConfig
8611 gNeighborScanChannelMaxTime=[0 .. 60]
8612 \param hHal - HAL handle for device
8613 \param sessionId - Session Identifier
8614 \param nNeighborScanMinChanTime - Channel maximum dwell time
8615 \- return Success or failure
8616 -------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308617QDF_STATUS sme_set_neighbor_scan_max_chan_time(tHalHandle hHal, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008618 const uint16_t
8619 nNeighborScanMaxChanTime)
8620{
8621 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308622 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008623 tCsrNeighborRoamConfig *pNeighborRoamConfig = NULL;
8624 tpCsrNeighborRoamControlInfo pNeighborRoamInfo = NULL;
8625
Naveen Rawatc36f7eb2016-11-10 20:01:03 -08008626 if (sessionId >= CSR_ROAM_SESSION_MAX) {
8627 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
8628 FL("Invalid sme session id: %d"), sessionId);
8629 return QDF_STATUS_E_INVAL;
8630 }
8631
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008632 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308633 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008634 pNeighborRoamConfig =
8635 &pMac->roam.configParam.neighborRoamConfig;
8636 pNeighborRoamInfo = &pMac->roam.neighborRoamInfo[sessionId];
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308637 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008638 "LFR runtime successfully set channel max dwell time to %d - old value is %d - roam state is %s",
8639 nNeighborScanMaxChanTime,
8640 pMac->roam.configParam.neighborRoamConfig.
8641 nNeighborScanMaxChanTime,
8642 mac_trace_get_neighbour_roam_state(pMac->roam.
8643 neighborRoamInfo
8644 [sessionId].
8645 neighborRoamState));
8646 pNeighborRoamConfig->nNeighborScanMaxChanTime =
8647 nNeighborScanMaxChanTime;
8648 pNeighborRoamInfo->cfgParams.maxChannelScanTime =
8649 nNeighborScanMaxChanTime;
8650 sme_release_global_lock(&pMac->sme);
8651 }
8652 if (pMac->roam.configParam.isRoamOffloadScanEnabled) {
8653 csr_roam_offload_scan(pMac, sessionId,
8654 ROAM_SCAN_OFFLOAD_UPDATE_CFG,
8655 REASON_SCAN_CH_TIME_CHANGED);
8656 }
8657
8658 return status;
8659}
8660
8661/* ---------------------------------------------------------------------------
8662 \fn sme_get_neighbor_scan_min_chan_time
8663 \brief get neighbor scan min channel time
8664 \param hHal - The handle returned by mac_open.
8665 \param sessionId - Session Identifier
8666 \return uint16_t - channel min time value
8667 -------------------------------------------------------------------------*/
8668uint16_t sme_get_neighbor_scan_min_chan_time(tHalHandle hHal, uint8_t sessionId)
8669{
8670 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Naveen Rawatc36f7eb2016-11-10 20:01:03 -08008671
8672 if (sessionId >= CSR_ROAM_SESSION_MAX) {
8673 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
8674 FL("Invalid sme session id: %d"), sessionId);
8675 return 0;
8676 }
8677
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008678 return pMac->roam.neighborRoamInfo[sessionId].cfgParams.
8679 minChannelScanTime;
8680}
8681
8682/* ---------------------------------------------------------------------------
8683 \fn sme_get_neighbor_roam_state
8684 \brief get neighbor roam state
8685 \param hHal - The handle returned by mac_open.
8686 \param sessionId - Session Identifier
8687 \return uint32_t - neighbor roam state
8688 -------------------------------------------------------------------------*/
8689uint32_t sme_get_neighbor_roam_state(tHalHandle hHal, uint8_t sessionId)
8690{
8691 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Naveen Rawatc36f7eb2016-11-10 20:01:03 -08008692
8693 if (sessionId >= CSR_ROAM_SESSION_MAX) {
8694 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
8695 FL("Invalid sme session id: %d"), sessionId);
8696 return 0;
8697 }
8698
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008699 return pMac->roam.neighborRoamInfo[sessionId].neighborRoamState;
8700}
8701
8702/* ---------------------------------------------------------------------------
8703 \fn sme_get_current_roam_state
8704 \brief get current roam state
8705 \param hHal - The handle returned by mac_open.
8706 \param sessionId - Session Identifier
8707 \return uint32_t - current roam state
8708 -------------------------------------------------------------------------*/
8709uint32_t sme_get_current_roam_state(tHalHandle hHal, uint8_t sessionId)
8710{
8711 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
8712 return pMac->roam.curState[sessionId];
8713}
8714
8715/* ---------------------------------------------------------------------------
8716 \fn sme_get_current_roam_sub_state
8717 \brief get neighbor roam sub state
8718 \param hHal - The handle returned by mac_open.
8719 \param sessionId - Session Identifier
8720 \return uint32_t - current roam sub state
8721 -------------------------------------------------------------------------*/
8722uint32_t sme_get_current_roam_sub_state(tHalHandle hHal, uint8_t sessionId)
8723{
8724 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
8725 return pMac->roam.curSubState[sessionId];
8726}
8727
8728/* ---------------------------------------------------------------------------
8729 \fn sme_get_lim_sme_state
8730 \brief get Lim Sme state
8731 \param hHal - The handle returned by mac_open.
8732 \return uint32_t - Lim Sme state
8733 -------------------------------------------------------------------------*/
8734uint32_t sme_get_lim_sme_state(tHalHandle hHal)
8735{
8736 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
8737 return pMac->lim.gLimSmeState;
8738}
8739
8740/* ---------------------------------------------------------------------------
8741 \fn sme_get_lim_mlm_state
8742 \brief get Lim Mlm state
8743 \param hHal - The handle returned by mac_open.
8744 \return uint32_t - Lim Mlm state
8745 -------------------------------------------------------------------------*/
8746uint32_t sme_get_lim_mlm_state(tHalHandle hHal)
8747{
8748 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
8749 return pMac->lim.gLimMlmState;
8750}
8751
8752/* ---------------------------------------------------------------------------
8753 \fn sme_is_lim_session_valid
8754 \brief is Lim session valid
8755 \param hHal - The handle returned by mac_open.
8756 \param sessionId - Session Identifier
8757 \return bool - true or false
8758 -------------------------------------------------------------------------*/
8759bool sme_is_lim_session_valid(tHalHandle hHal, uint8_t sessionId)
8760{
8761 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Hanumantha Reddy Pothula589fd702015-11-17 15:25:16 +05308762
8763 if (sessionId > pMac->lim.maxBssId)
8764 return false;
8765
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008766 return pMac->lim.gpSession[sessionId].valid;
8767}
8768
8769/* ---------------------------------------------------------------------------
8770 \fn sme_get_lim_sme_session_state
8771 \brief get Lim Sme session state
8772 \param hHal - The handle returned by mac_open.
8773 \param sessionId - Session Identifier
8774 \return uint32_t - Lim Sme session state
8775 -------------------------------------------------------------------------*/
8776uint32_t sme_get_lim_sme_session_state(tHalHandle hHal, uint8_t sessionId)
8777{
8778 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
8779 return pMac->lim.gpSession[sessionId].limSmeState;
8780}
8781
8782/* ---------------------------------------------------------------------------
8783 \fn sme_get_lim_mlm_session_state
8784 \brief get Lim Mlm session state
8785 \param hHal - The handle returned by mac_open.
8786 \param sessionId - Session Identifier
8787 \return uint32_t - Lim Mlm session state
8788 -------------------------------------------------------------------------*/
8789uint32_t sme_get_lim_mlm_session_state(tHalHandle hHal, uint8_t sessionId)
8790{
8791 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
8792 return pMac->lim.gpSession[sessionId].limMlmState;
8793}
8794
8795/* ---------------------------------------------------------------------------
8796 \fn sme_get_neighbor_scan_max_chan_time
8797 \brief get neighbor scan max channel time
8798 \param hHal - The handle returned by mac_open.
8799 \param sessionId - Session Identifier
8800 \return uint16_t - channel max time value
8801 -------------------------------------------------------------------------*/
8802uint16_t sme_get_neighbor_scan_max_chan_time(tHalHandle hHal, uint8_t sessionId)
8803{
8804 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Naveen Rawatc36f7eb2016-11-10 20:01:03 -08008805
8806 if (sessionId >= CSR_ROAM_SESSION_MAX) {
8807 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
8808 FL("Invalid sme session id: %d"), sessionId);
8809 return 0;
8810 }
8811
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008812 return pMac->roam.neighborRoamInfo[sessionId].cfgParams.
8813 maxChannelScanTime;
8814}
8815
8816/* ---------------------------------------------------------------------------
8817 \fn sme_set_neighbor_scan_period
8818 \brief Update nNeighborScanPeriod
8819 This function is called through dynamic setConfig callback function
8820 to configure nNeighborScanPeriod
8821 Usage: adb shell iwpriv wlan0 setConfig
8822 nNeighborScanPeriod=[0 .. 1000]
8823 \param hHal - HAL handle for device
8824 \param sessionId - Session Identifier
8825 \param nNeighborScanPeriod - neighbor scan period
8826 \- return Success or failure
8827 -------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308828QDF_STATUS sme_set_neighbor_scan_period(tHalHandle hHal, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008829 const uint16_t nNeighborScanPeriod)
8830{
8831 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308832 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008833 tCsrNeighborRoamConfig *pNeighborRoamConfig = NULL;
8834 tpCsrNeighborRoamControlInfo pNeighborRoamInfo = NULL;
8835
Naveen Rawatc36f7eb2016-11-10 20:01:03 -08008836 if (sessionId >= CSR_ROAM_SESSION_MAX) {
8837 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
8838 FL("Invalid sme session id: %d"), sessionId);
8839 return QDF_STATUS_E_INVAL;
8840 }
8841
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008842 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308843 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008844 pNeighborRoamConfig =
8845 &pMac->roam.configParam.neighborRoamConfig;
8846 pNeighborRoamInfo = &pMac->roam.neighborRoamInfo[sessionId];
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308847 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008848 "LFR runtime successfully set neighbor scan period to %d"
8849 " - old value is %d - roam state is %s",
8850 nNeighborScanPeriod,
8851 pMac->roam.configParam.neighborRoamConfig.
8852 nNeighborScanTimerPeriod,
8853 mac_trace_get_neighbour_roam_state(pMac->roam.
8854 neighborRoamInfo
8855 [sessionId].
8856 neighborRoamState));
8857 pNeighborRoamConfig->nNeighborScanTimerPeriod =
8858 nNeighborScanPeriod;
8859 pNeighborRoamInfo->cfgParams.neighborScanPeriod =
8860 nNeighborScanPeriod;
8861 sme_release_global_lock(&pMac->sme);
8862 }
8863 if (pMac->roam.configParam.isRoamOffloadScanEnabled) {
8864 csr_roam_offload_scan(pMac, sessionId,
8865 ROAM_SCAN_OFFLOAD_UPDATE_CFG,
8866 REASON_SCAN_HOME_TIME_CHANGED);
8867 }
8868
8869 return status;
8870}
8871
8872/* ---------------------------------------------------------------------------
8873 \fn sme_get_neighbor_scan_period
8874 \brief get neighbor scan period
8875 \param hHal - The handle returned by mac_open.
8876 \param sessionId - Session Identifier
8877 \return uint16_t - neighbor scan period
8878 -------------------------------------------------------------------------*/
8879uint16_t sme_get_neighbor_scan_period(tHalHandle hHal, uint8_t sessionId)
8880{
8881 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Naveen Rawatc36f7eb2016-11-10 20:01:03 -08008882
8883 if (sessionId >= CSR_ROAM_SESSION_MAX) {
8884 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
8885 FL("Invalid sme session id: %d"), sessionId);
8886 return 0;
8887 }
8888
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008889 return pMac->roam.neighborRoamInfo[sessionId].cfgParams.
8890 neighborScanPeriod;
8891}
8892
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008893
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008894
8895/*--------------------------------------------------------------------------
8896 \brief sme_get_roam_rssi_diff() - get Roam rssi diff
8897 This is a synchronous call
8898 \param hHal - The handle returned by mac_open.
8899 \return uint16_t - Rssi diff value
8900 \sa
8901 --------------------------------------------------------------------------*/
8902uint8_t sme_get_roam_rssi_diff(tHalHandle hHal)
8903{
8904 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
8905 return pMac->roam.configParam.RoamRssiDiff;
8906}
8907
8908/**
8909 * sme_change_roam_scan_channel_list() - to change scan channel list
8910 * @hHal: pointer HAL handle returned by mac_open
8911 * @sessionId: sme session id
8912 * @pChannelList: Output channel list
8913 * @numChannels: Output number of channels
8914 *
8915 * This routine is called to Change roam scan channel list.
8916 * This is a synchronous call
8917 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308918 * Return: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008919 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308920QDF_STATUS sme_change_roam_scan_channel_list(tHalHandle hHal, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008921 uint8_t *pChannelList,
8922 uint8_t numChannels)
8923{
8924 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308925 QDF_STATUS status = QDF_STATUS_SUCCESS;
Naveen Rawatc36f7eb2016-11-10 20:01:03 -08008926 tpCsrNeighborRoamControlInfo pNeighborRoamInfo = NULL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008927 uint8_t oldChannelList[WNI_CFG_VALID_CHANNEL_LIST_LEN * 2] = { 0 };
8928 uint8_t newChannelList[WNI_CFG_VALID_CHANNEL_LIST_LEN * 2] = { 0 };
8929 uint8_t i = 0, j = 0;
8930 tCsrChannelInfo *chan_info;
8931
Naveen Rawatc36f7eb2016-11-10 20:01:03 -08008932 if (sessionId >= CSR_ROAM_SESSION_MAX) {
8933 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
8934 FL("Invalid sme session id: %d"), sessionId);
8935 return QDF_STATUS_E_INVAL;
8936 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008937
Naveen Rawatc36f7eb2016-11-10 20:01:03 -08008938 pNeighborRoamInfo = &pMac->roam.neighborRoamInfo[sessionId];
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008939 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308940 if (!QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008941 if (pMac->roam.configParam.isRoamOffloadScanEnabled)
8942 csr_roam_offload_scan(pMac, sessionId,
8943 ROAM_SCAN_OFFLOAD_UPDATE_CFG,
8944 REASON_CHANNEL_LIST_CHANGED);
8945 return status;
8946 }
8947 chan_info = &pNeighborRoamInfo->cfgParams.channelInfo;
8948
8949 if (NULL != chan_info->ChannelList) {
8950 for (i = 0; i < chan_info->numOfChannels; i++) {
8951 if (j < sizeof(oldChannelList))
8952 j += snprintf(oldChannelList + j,
8953 sizeof(oldChannelList) -
8954 j, "%d",
8955 chan_info->ChannelList[i]);
8956 else
8957 break;
8958 }
8959 }
8960 csr_flush_cfg_bg_scan_roam_channel_list(pMac, sessionId);
8961 csr_create_bg_scan_roam_channel_list(pMac, sessionId, pChannelList,
8962 numChannels);
8963 sme_set_roam_scan_control(hHal, sessionId, 1);
8964 if (NULL != chan_info->ChannelList) {
8965 j = 0;
8966 for (i = 0; i < chan_info->numOfChannels; i++) {
8967 if (j < sizeof(newChannelList))
8968 j += snprintf(newChannelList + j,
8969 sizeof(newChannelList) -
8970 j, " %d",
8971 chan_info->ChannelList[i]);
8972 else
8973 break;
8974 }
8975 }
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308976 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008977 FL("LFR runtime successfully set roam scan channels to %s - old value is %s - roam state is %d"),
8978 newChannelList, oldChannelList,
8979 pMac->roam.neighborRoamInfo[sessionId].neighborRoamState);
8980 sme_release_global_lock(&pMac->sme);
8981
8982 if (pMac->roam.configParam.isRoamOffloadScanEnabled)
8983 csr_roam_offload_scan(pMac, sessionId,
8984 ROAM_SCAN_OFFLOAD_UPDATE_CFG,
8985 REASON_CHANNEL_LIST_CHANGED);
8986 return status;
8987}
8988
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008989/**
8990 * sme_get_roam_scan_channel_list() - To get roam scan channel list
8991 * @hHal: HAL pointer
8992 * @pChannelList: Output channel list
8993 * @pNumChannels: Output number of channels
8994 * @sessionId: Session Identifier
8995 *
8996 * To get roam scan channel list This is a synchronous call
8997 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308998 * Return: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008999 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309000QDF_STATUS sme_get_roam_scan_channel_list(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009001 uint8_t *pChannelList, uint8_t *pNumChannels,
9002 uint8_t sessionId)
9003{
9004 int i = 0;
9005 uint8_t *pOutPtr = pChannelList;
9006 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Naveen Rawatc36f7eb2016-11-10 20:01:03 -08009007 tpCsrNeighborRoamControlInfo pNeighborRoamInfo = NULL;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309008 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009009
Naveen Rawatc36f7eb2016-11-10 20:01:03 -08009010 if (sessionId >= CSR_ROAM_SESSION_MAX) {
9011 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
9012 FL("Invalid sme session id: %d"), sessionId);
9013 return QDF_STATUS_E_INVAL;
9014 }
9015
9016 pNeighborRoamInfo = &pMac->roam.neighborRoamInfo[sessionId];
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009017 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309018 if (!QDF_IS_STATUS_SUCCESS(status))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009019 return status;
9020 if (NULL == pNeighborRoamInfo->cfgParams.channelInfo.ChannelList) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05309021 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_WARN,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009022 FL("Roam Scan channel list is NOT yet initialized"));
9023 *pNumChannels = 0;
9024 sme_release_global_lock(&pMac->sme);
9025 return status;
9026 }
9027
9028 *pNumChannels = pNeighborRoamInfo->cfgParams.channelInfo.numOfChannels;
9029 for (i = 0; i < (*pNumChannels); i++) {
9030 pOutPtr[i] =
9031 pNeighborRoamInfo->cfgParams.channelInfo.ChannelList[i];
9032 }
9033 pOutPtr[i] = '\0';
9034 sme_release_global_lock(&pMac->sme);
9035 return status;
9036}
9037
9038/*--------------------------------------------------------------------------
9039 \brief sme_get_is_ese_feature_enabled() - get ESE feature enabled or not
9040 This is a synchronuous call
9041 \param hHal - The handle returned by mac_open.
9042 \return true (1) - if the ESE feature is enabled
9043 false (0) - if feature is disabled (compile or runtime)
9044 \sa
9045 --------------------------------------------------------------------------*/
9046bool sme_get_is_ese_feature_enabled(tHalHandle hHal)
9047{
9048#ifdef FEATURE_WLAN_ESE
9049 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
9050 return csr_roam_is_ese_ini_feature_enabled(pMac);
9051#else
9052 return false;
9053#endif
9054}
9055
9056/*--------------------------------------------------------------------------
9057 \brief sme_get_wes_mode() - get WES Mode
9058 This is a synchronous call
9059 \param hHal - The handle returned by mac_open
9060 \return uint8_t - WES Mode Enabled(1)/Disabled(0)
9061 \sa
9062 --------------------------------------------------------------------------*/
9063bool sme_get_wes_mode(tHalHandle hHal)
9064{
9065 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
9066 return pMac->roam.configParam.isWESModeEnabled;
9067}
9068
9069/*--------------------------------------------------------------------------
9070 \brief sme_get_roam_scan_control() - get scan control
9071 This is a synchronous call
9072 \param hHal - The handle returned by mac_open.
9073 \return bool - Enabled(1)/Disabled(0)
9074 \sa
9075 --------------------------------------------------------------------------*/
9076bool sme_get_roam_scan_control(tHalHandle hHal)
9077{
9078 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
9079 return pMac->roam.configParam.nRoamScanControl;
9080}
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009081
9082/*--------------------------------------------------------------------------
9083 \brief sme_get_is_lfr_feature_enabled() - get LFR feature enabled or not
9084 This is a synchronuous call
9085 \param hHal - The handle returned by mac_open.
9086 \return true (1) - if the feature is enabled
9087 false (0) - if feature is disabled (compile or runtime)
9088 \sa
9089 --------------------------------------------------------------------------*/
9090bool sme_get_is_lfr_feature_enabled(tHalHandle hHal)
9091{
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009092 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
9093 return pMac->roam.configParam.isFastRoamIniFeatureEnabled;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009094}
9095
9096/*--------------------------------------------------------------------------
9097 \brief sme_get_is_ft_feature_enabled() - get FT feature enabled or not
9098 This is a synchronuous call
9099 \param hHal - The handle returned by mac_open.
9100 \return true (1) - if the feature is enabled
9101 false (0) - if feature is disabled (compile or runtime)
9102 \sa
9103 --------------------------------------------------------------------------*/
9104bool sme_get_is_ft_feature_enabled(tHalHandle hHal)
9105{
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009106 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
9107 return pMac->roam.configParam.isFastTransitionEnabled;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009108}
9109
Krishna Kumaar Natarajand0bbb3c2017-03-13 17:04:58 -07009110/**
9111 * sme_is_feature_supported_by_fw() - check if feature is supported by FW
9112 * @feature: enum value of requested feature.
9113 *
9114 * Retrun: 1 if supported; 0 otherwise
9115 */
9116bool sme_is_feature_supported_by_fw(enum cap_bitmap feature)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009117{
Krishna Kumaar Natarajand0bbb3c2017-03-13 17:04:58 -07009118 return IS_FEATURE_SUPPORTED_BY_FW(feature);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009119}
9120
9121#ifdef FEATURE_WLAN_TDLS
9122
9123/* ---------------------------------------------------------------------------
9124 \fn sme_send_tdls_link_establish_params
9125 \brief API to send TDLS Peer Link Establishment Parameters.
9126
9127 \param peerMac - peer's Mac Adress.
9128 \param tdlsLinkEstablishParams - TDLS Peer Link Establishment Parameters
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05309129 \- return QDF_STATUS_SUCCES
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009130 -------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309131QDF_STATUS sme_send_tdls_link_establish_params(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009132 uint8_t sessionId,
9133 const tSirMacAddr peerMac,
9134 tCsrTdlsLinkEstablishParams *
9135 tdlsLinkEstablishParams)
9136{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309137 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009138 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
9139
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05309140 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Sreelakshmi Konamki6744cff2015-09-07 12:10:39 +05309141 TRACE_CODE_SME_RX_HDD_TDLS_LINK_ESTABLISH_PARAM,
9142 sessionId,
9143 tdlsLinkEstablishParams->isOffChannelSupported));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009144 status = sme_acquire_global_lock(&pMac->sme);
9145
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309146 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009147 status = csr_tdls_send_link_establish_params(hHal, sessionId,
9148 peerMac, tdlsLinkEstablishParams);
9149 sme_release_global_lock(&pMac->sme);
9150 }
9151 return status;
9152}
9153
9154/* ---------------------------------------------------------------------------
9155 \fn sme_send_tdls_mgmt_frame
9156 \brief API to send TDLS management frames.
9157
9158 \param peerMac - peer's Mac Adress.
9159 \param frame_type - Type of TDLS mgmt frame to be sent.
9160 \param dialog - dialog token used in the frame.
9161 \param status - status to be incuded in the frame.
9162 \param peerCapability - peer cpabilities
9163 \param buf - additional IEs to be included
9164 \param len - lenght of additional Ies
9165 \param responder - Tdls request type
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05309166 \- return QDF_STATUS_SUCCES
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009167 -------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309168QDF_STATUS sme_send_tdls_mgmt_frame(tHalHandle hHal, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009169 const tSirMacAddr peerMac,
9170 uint8_t frame_type,
9171 uint8_t dialog, uint16_t statusCode,
9172 uint32_t peerCapability, uint8_t *buf,
9173 uint8_t len, uint8_t responder)
9174{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309175 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009176 tCsrTdlsSendMgmt sendTdlsReq = { {0} };
9177 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
9178
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05309179 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Sreelakshmi Konamki6744cff2015-09-07 12:10:39 +05309180 TRACE_CODE_SME_RX_HDD_TDLS_SEND_MGMT_FRAME,
9181 sessionId, statusCode));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009182 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309183 if (QDF_IS_STATUS_SUCCESS(status)) {
Anurag Chouhan600c3a02016-03-01 10:33:54 +05309184 qdf_mem_copy(sendTdlsReq.peerMac, peerMac, sizeof(tSirMacAddr));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009185 sendTdlsReq.frameType = frame_type;
9186 sendTdlsReq.buf = buf;
9187 sendTdlsReq.len = len;
9188 sendTdlsReq.dialog = dialog;
9189 sendTdlsReq.statusCode = statusCode;
9190 sendTdlsReq.responder = responder;
9191 sendTdlsReq.peerCapability = peerCapability;
9192
9193 status = csr_tdls_send_mgmt_req(hHal, sessionId, &sendTdlsReq);
9194
9195 sme_release_global_lock(&pMac->sme);
9196 }
9197
9198 return status;
9199
9200}
9201
9202/* ---------------------------------------------------------------------------
9203 \fn sme_change_tdls_peer_sta
9204 \brief API to Update TDLS peer sta parameters.
9205
9206 \param peerMac - peer's Mac Adress.
9207 \param staParams - Peer Station Parameters
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05309208 \- return QDF_STATUS_SUCCES
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009209 -------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309210QDF_STATUS sme_change_tdls_peer_sta(tHalHandle hHal, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009211 const tSirMacAddr peerMac,
9212 tCsrStaParams *pstaParams)
9213{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309214 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009215 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
9216
9217 if (NULL == pstaParams) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05309218 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009219 "%s :pstaParams is NULL", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309220 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009221 }
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05309222 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Sreelakshmi Konamki6744cff2015-09-07 12:10:39 +05309223 TRACE_CODE_SME_RX_HDD_TDLS_CHANGE_PEER_STA,
9224 sessionId, pstaParams->capability));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009225 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309226 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009227 status = csr_tdls_change_peer_sta(hHal, sessionId, peerMac,
9228 pstaParams);
9229
9230 sme_release_global_lock(&pMac->sme);
9231 }
9232
9233 return status;
9234
9235}
9236
9237/* ---------------------------------------------------------------------------
9238 \fn sme_add_tdls_peer_sta
9239 \brief API to Add TDLS peer sta entry.
9240
9241 \param peerMac - peer's Mac Adress.
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05309242 \- return QDF_STATUS_SUCCES
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009243 -------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309244QDF_STATUS sme_add_tdls_peer_sta(tHalHandle hHal, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009245 const tSirMacAddr peerMac)
9246{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309247 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009248 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
9249
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05309250 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Sreelakshmi Konamki6744cff2015-09-07 12:10:39 +05309251 TRACE_CODE_SME_RX_HDD_TDLS_ADD_PEER_STA,
9252 sessionId, 0));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009253 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309254 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009255 status = csr_tdls_add_peer_sta(hHal, sessionId, peerMac);
9256
9257 sme_release_global_lock(&pMac->sme);
9258 }
9259
9260 return status;
9261
9262}
9263
9264/* ---------------------------------------------------------------------------
9265 \fn sme_delete_tdls_peer_sta
9266 \brief API to Delete TDLS peer sta entry.
9267
9268 \param peerMac - peer's Mac Adress.
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05309269 \- return QDF_STATUS_SUCCES
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009270 -------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309271QDF_STATUS sme_delete_tdls_peer_sta(tHalHandle hHal, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009272 const tSirMacAddr peerMac)
9273{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309274 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009275 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
9276
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05309277 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Sreelakshmi Konamki6744cff2015-09-07 12:10:39 +05309278 TRACE_CODE_SME_RX_HDD_TDLS_DEL_PEER_STA,
9279 sessionId, 0));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009280 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309281 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009282 status = csr_tdls_del_peer_sta(hHal, sessionId, peerMac);
9283
9284 sme_release_global_lock(&pMac->sme);
9285 }
9286
9287 return status;
9288
9289}
9290
9291/* ---------------------------------------------------------------------------
9292 \fn sme_set_tdls_power_save_prohibited
9293 \API to set/reset the is_tdls_power_save_prohibited.
9294
9295 \- return void
9296 -------------------------------------------------------------------------*/
9297void sme_set_tdls_power_save_prohibited(tHalHandle hHal, uint32_t sessionId,
9298 bool val)
9299{
9300 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
9301 struct ps_global_info *ps_global_info = &pMac->sme.ps_global_info;
9302 struct ps_params *ps_param = &ps_global_info->ps_params[sessionId];
9303 ps_param->is_tdls_power_save_prohibited = val;
9304 return;
9305}
9306
9307/* ---------------------------------------------------------------------------
9308 \fn sme_update_fw_tdls_state
9309
9310 \brief
9311 SME will send message to WMA to set TDLS state in f/w
9312
9313 \param
9314
9315 hHal - The handle returned by mac_open
9316
9317 psmeTdlsParams - TDLS state info to update in f/w
9318
9319 useSmeLock - Need to acquire SME Global Lock before state update or not
9320
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309321 \return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009322 --------------------------------------------------------------------------- */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309323QDF_STATUS sme_update_fw_tdls_state(tHalHandle hHal, void *psmeTdlsParams,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009324 bool useSmeLock)
9325{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309326 QDF_STATUS status = QDF_STATUS_SUCCESS;
9327 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009328 tpAniSirGlobal pMac = NULL;
Rajeev Kumar37d478b2017-04-17 16:59:28 -07009329 struct scheduler_msg message = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009330
Mukul Sharmaeae172c2016-09-03 13:40:46 +05309331 pMac = PMAC_STRUCT(hHal);
9332 if (NULL == pMac) {
9333 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
9334 FL("pMac is Null"));
9335 return QDF_STATUS_E_FAILURE;
9336 }
9337
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009338 /* only acquire sme global lock before state update if asked to */
9339 if (useSmeLock) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009340 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309341 if (QDF_STATUS_SUCCESS != status)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009342 return status;
9343 }
9344
9345 /* serialize the req through MC thread */
Rajeev Kumar8eaedf62017-01-21 11:03:13 -08009346 message.bodyptr = psmeTdlsParams;
9347 message.type = WMA_UPDATE_FW_TDLS_STATE;
9348 qdf_status = scheduler_post_msg(QDF_MODULE_ID_WMA, &message);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309349 if (!QDF_IS_STATUS_SUCCESS(qdf_status))
9350 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009351
9352 /* release the lock if it was acquired */
9353 if (useSmeLock)
9354 sme_release_global_lock(&pMac->sme);
9355
9356 return status;
9357}
9358
9359/**
9360 * sme_update_tdls_peer_state() - to update the state of TDLS peer
9361 * @hHal: The handle returned by mac_open
9362 * @peerStateParams: TDLS Peer state info to update in f/w
9363 *
9364 * SME will send message to WMA to set TDLS Peer state in f/w
9365 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309366 * Return: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009367 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309368QDF_STATUS sme_update_tdls_peer_state(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009369 tSmeTdlsPeerStateParams *peerStateParams)
9370{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309371 QDF_STATUS status = QDF_STATUS_SUCCESS;
9372 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009373 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
9374 tTdlsPeerStateParams *pTdlsPeerStateParams = NULL;
9375 tTdlsPeerCapParams *peer_cap = NULL;
Rajeev Kumar37d478b2017-04-17 16:59:28 -07009376 struct scheduler_msg message = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009377 uint8_t num;
Kabilan Kannan44f65862016-06-28 23:46:51 -07009378 uint8_t peer_chan_len;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009379 uint8_t chanId;
9380 uint8_t i;
9381
9382 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309383 if (!QDF_IS_STATUS_SUCCESS(status))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009384 return status;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05309385 pTdlsPeerStateParams = qdf_mem_malloc(sizeof(*pTdlsPeerStateParams));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009386 if (NULL == pTdlsPeerStateParams) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05309387 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009388 FL("failed to allocate mem for tdls peer state param"));
9389 sme_release_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309390 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009391 }
9392
Anurag Chouhan600c3a02016-03-01 10:33:54 +05309393 qdf_mem_copy(&pTdlsPeerStateParams->peerMacAddr,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009394 &peerStateParams->peerMacAddr, sizeof(tSirMacAddr));
9395 pTdlsPeerStateParams->vdevId = peerStateParams->vdevId;
9396 pTdlsPeerStateParams->peerState = peerStateParams->peerState;
9397
9398 switch (peerStateParams->peerState) {
9399 case eSME_TDLS_PEER_STATE_PEERING:
9400 pTdlsPeerStateParams->peerState =
9401 WMA_TDLS_PEER_STATE_PEERING;
9402 break;
9403
9404 case eSME_TDLS_PEER_STATE_CONNECTED:
9405 pTdlsPeerStateParams->peerState =
9406 WMA_TDLS_PEER_STATE_CONNECTED;
9407 break;
9408
9409 case eSME_TDLS_PEER_STATE_TEARDOWN:
9410 pTdlsPeerStateParams->peerState =
9411 WMA_TDLS_PEER_STATE_TEARDOWN;
Padma, Santhosh Kumar4eb79082017-02-24 16:00:20 +05309412 pTdlsPeerStateParams->resp_reqd = false;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009413 break;
9414
Kabilan Kannan421714b2015-11-23 04:44:59 -08009415 case eSME_TDLS_PEER_ADD_MAC_ADDR:
9416 pTdlsPeerStateParams->peerState = WMA_TDLS_PEER_ADD_MAC_ADDR;
9417 break;
9418
9419 case eSME_TDLS_PEER_REMOVE_MAC_ADDR:
9420 pTdlsPeerStateParams->peerState = WMA_TDLS_PEER_REMOVE_MAC_ADDR;
9421 break;
9422
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009423 default:
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05309424 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009425 FL("invalid peer state param (%d)"),
9426 peerStateParams->peerState);
Kabilan Kannan44f65862016-06-28 23:46:51 -07009427 goto error_return;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009428 }
9429 peer_cap = &(pTdlsPeerStateParams->peerCap);
9430 peer_cap->isPeerResponder =
9431 peerStateParams->peerCap.isPeerResponder;
9432 peer_cap->peerUapsdQueue =
9433 peerStateParams->peerCap.peerUapsdQueue;
9434 peer_cap->peerMaxSp =
9435 peerStateParams->peerCap.peerMaxSp;
9436 peer_cap->peerBuffStaSupport =
9437 peerStateParams->peerCap.peerBuffStaSupport;
9438 peer_cap->peerOffChanSupport =
9439 peerStateParams->peerCap.peerOffChanSupport;
9440 peer_cap->peerCurrOperClass =
9441 peerStateParams->peerCap.peerCurrOperClass;
9442 peer_cap->selfCurrOperClass =
9443 peerStateParams->peerCap.selfCurrOperClass;
9444
9445 num = 0;
Kabilan Kannan44f65862016-06-28 23:46:51 -07009446 peer_chan_len = peerStateParams->peerCap.peerChanLen;
9447
Sreelakshmi Konamki0d17c6a2017-06-08 12:58:54 +05309448 if (peer_chan_len <= SME_TDLS_MAX_SUPP_CHANNELS) {
Kabilan Kannan44f65862016-06-28 23:46:51 -07009449 for (i = 0; i < peerStateParams->peerCap.peerChanLen; i++) {
9450 chanId = peerStateParams->peerCap.peerChan[i];
9451 if (csr_roam_is_channel_valid(pMac, chanId) &&
Kiran Kumar Lokerea3de2262017-04-12 12:15:04 -07009452 !(wlan_reg_get_channel_state(pMac->pdev, chanId) ==
Kabilan Kannan44f65862016-06-28 23:46:51 -07009453 CHANNEL_STATE_DFS) &&
Kiran Kumar Lokerea3de2262017-04-12 12:15:04 -07009454 !WLAN_REG_IS_11P_CH(chanId)) {
Kabilan Kannan44f65862016-06-28 23:46:51 -07009455 peer_cap->peerChan[num].chanId = chanId;
9456 peer_cap->peerChan[num].pwr =
9457 csr_get_cfg_max_tx_power(pMac, chanId);
9458 peer_cap->peerChan[num].dfsSet = false;
Kiran Kumar Lokerea3de2262017-04-12 12:15:04 -07009459 num++;
Kabilan Kannan44f65862016-06-28 23:46:51 -07009460 }
Archana Ramachandran63f64dd2016-04-28 15:13:35 -07009461 }
Kabilan Kannan44f65862016-06-28 23:46:51 -07009462 } else {
9463 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
9464 FL("invalid peer channel len (%d)"),
9465 peer_chan_len);
9466 goto error_return;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009467 }
Kabilan Kannan44f65862016-06-28 23:46:51 -07009468
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009469 peer_cap->peerChanLen = num;
9470 peer_cap->peerOperClassLen =
9471 peerStateParams->peerCap.peerOperClassLen;
9472 for (i = 0; i < HAL_TDLS_MAX_SUPP_OPER_CLASSES; i++) {
9473 peer_cap->peerOperClass[i] =
9474 peerStateParams->peerCap.peerOperClass[i];
9475 }
9476
9477 peer_cap->prefOffChanNum =
9478 peerStateParams->peerCap.prefOffChanNum;
9479 peer_cap->prefOffChanBandwidth =
9480 peerStateParams->peerCap.prefOffChanBandwidth;
Masti, Narayanraddic4a7ab82015-11-25 15:41:10 +05309481 peer_cap->opClassForPrefOffChan =
9482 peerStateParams->peerCap.opClassForPrefOffChan;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009483
Rajeev Kumar8eaedf62017-01-21 11:03:13 -08009484 message.type = WMA_UPDATE_TDLS_PEER_STATE;
9485 message.reserved = 0;
9486 message.bodyptr = pTdlsPeerStateParams;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009487
Rajeev Kumar8eaedf62017-01-21 11:03:13 -08009488 qdf_status = scheduler_post_msg(QDF_MODULE_ID_WMA, &message);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309489 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
Kabilan Kannan44f65862016-06-28 23:46:51 -07009490 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Rajeev Kumar8eaedf62017-01-21 11:03:13 -08009491 FL("scheduler_post_msg failed "));
Kabilan Kannan44f65862016-06-28 23:46:51 -07009492 goto error_return;
9493 } else {
9494 goto success_return;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009495 }
Kabilan Kannan44f65862016-06-28 23:46:51 -07009496
9497error_return:
9498 status = QDF_STATUS_E_FAILURE;
9499 qdf_mem_free(pTdlsPeerStateParams);
9500success_return:
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009501 sme_release_global_lock(&pMac->sme);
9502 return status;
9503}
9504
9505/**
9506 * sme_send_tdls_chan_switch_req() - send tdls channel switch request
9507 * @hal: UMAC handler
9508 * @ch_switch_params: Pointer to the chan switch parameter structure
9509 *
9510 * API to set tdls channel switch parameters.
9511 *
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05309512 * Return: QDF_STATUS_SUCCESS on success; another QDF_STATUS_** code otherwise
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009513 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309514QDF_STATUS sme_send_tdls_chan_switch_req(tHalHandle hal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009515 sme_tdls_chan_switch_params *ch_switch_params)
9516{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309517 QDF_STATUS status = QDF_STATUS_SUCCESS;
9518 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009519 tpAniSirGlobal mac = PMAC_STRUCT(hal);
9520 tdls_chan_switch_params *chan_switch_params = NULL;
Rajeev Kumar37d478b2017-04-17 16:59:28 -07009521 struct scheduler_msg message = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009522
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05309523 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Sreelakshmi Konamki6744cff2015-09-07 12:10:39 +05309524 TRACE_CODE_SME_RX_HDD_TDLS_CHAN_SWITCH_REQ,
9525 NO_SESSION, ch_switch_params->tdls_off_channel));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009526 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309527 if (QDF_STATUS_SUCCESS != status)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009528 return status;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05309529 chan_switch_params = qdf_mem_malloc(sizeof(*chan_switch_params));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009530 if (NULL == chan_switch_params) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05309531 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009532 FL("fail to alloc mem for tdls chan switch param"));
9533 sme_release_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309534 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009535 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009536
9537 switch (ch_switch_params->tdls_off_ch_mode) {
9538 case ENABLE_CHANSWITCH:
9539 chan_switch_params->tdls_sw_mode = WMA_TDLS_ENABLE_OFFCHANNEL;
9540 break;
9541
9542 case DISABLE_CHANSWITCH:
9543 chan_switch_params->tdls_sw_mode = WMA_TDLS_DISABLE_OFFCHANNEL;
9544 break;
9545
9546 default:
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05309547 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009548 FL("invalid off channel command (%d)"),
9549 ch_switch_params->tdls_off_ch_mode);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05309550 qdf_mem_free(chan_switch_params);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009551 sme_release_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309552 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009553 }
9554
Anurag Chouhan600c3a02016-03-01 10:33:54 +05309555 qdf_mem_copy(&chan_switch_params->peer_mac_addr,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009556 &ch_switch_params->peer_mac_addr, sizeof(tSirMacAddr));
9557 chan_switch_params->vdev_id = ch_switch_params->vdev_id;
9558 chan_switch_params->tdls_off_ch = ch_switch_params->tdls_off_channel;
9559 chan_switch_params->tdls_off_ch_bw_offset =
9560 ch_switch_params->tdls_off_ch_bw_offset;
9561 chan_switch_params->is_responder = ch_switch_params->is_responder;
Masti, Narayanraddic4a7ab82015-11-25 15:41:10 +05309562 chan_switch_params->oper_class = ch_switch_params->opclass;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009563
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05309564 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009565 FL("Country Code=%s, Req offset=%d, Selected Operate Class=%d"),
9566 mac->scan.countryCodeCurrent,
9567 chan_switch_params->tdls_off_ch_bw_offset,
9568 chan_switch_params->oper_class);
9569
Rajeev Kumar8eaedf62017-01-21 11:03:13 -08009570 message.type = WMA_TDLS_SET_OFFCHAN_MODE;
9571 message.reserved = 0;
9572 message.bodyptr = chan_switch_params;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009573
Rajeev Kumar8eaedf62017-01-21 11:03:13 -08009574 qdf_status = scheduler_post_msg(QDF_MODULE_ID_WMA, &message);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309575 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05309576 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009577 FL("Message Post failed status=%d"),
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309578 qdf_status);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05309579 qdf_mem_free(chan_switch_params);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309580 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009581 }
9582 sme_release_global_lock(&mac->sme);
9583 return status;
9584}
9585#endif /* FEATURE_WLAN_TDLS */
9586
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309587QDF_STATUS sme_get_link_speed(tHalHandle hHal, tSirLinkSpeedInfo *lsReq,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009588 void *plsContext,
9589 void (*pCallbackfn)(tSirLinkSpeedInfo *indParam,
9590 void *pContext))
9591{
9592
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309593 QDF_STATUS status = QDF_STATUS_SUCCESS;
Jeff Johnsona5317a62017-01-26 08:51:25 -08009594 tpAniSirGlobal pMac;
9595 tSirLinkSpeedInfo *req;
Mukul Sharmac3886aa2017-05-04 17:53:22 +05309596 void *wma_handle;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009597
Jeff Johnsona5317a62017-01-26 08:51:25 -08009598 if (!hHal || !pCallbackfn || !lsReq) {
9599 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
9600 FL("Invalid parameter"));
9601 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009602 }
Jeff Johnsona5317a62017-01-26 08:51:25 -08009603
Mukul Sharmac3886aa2017-05-04 17:53:22 +05309604 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
9605 if (!wma_handle) {
9606 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
9607 "wma handle is NULL");
9608 return QDF_STATUS_E_FAILURE;
9609 }
9610
Jeff Johnsona5317a62017-01-26 08:51:25 -08009611 pMac = PMAC_STRUCT(hHal);
9612 req = qdf_mem_malloc(sizeof(*req));
9613 if (!req) {
Srinivas Girigowda2c263352017-03-17 17:49:53 -07009614 sme_err("Failed to allocate memory");
Jeff Johnsona5317a62017-01-26 08:51:25 -08009615 return QDF_STATUS_E_NOMEM;
9616 }
9617 *req = *lsReq;
9618
9619 status = sme_acquire_global_lock(&pMac->sme);
9620 if (QDF_STATUS_SUCCESS != status) {
Srinivas Girigowda2c263352017-03-17 17:49:53 -07009621 sme_err("Failed to acquire global lock");
Jeff Johnsona5317a62017-01-26 08:51:25 -08009622 qdf_mem_free(req);
9623 return QDF_STATUS_E_FAILURE;
9624 }
9625
9626 pMac->sme.pLinkSpeedCbContext = plsContext;
9627 pMac->sme.pLinkSpeedIndCb = pCallbackfn;
Mukul Sharmac3886aa2017-05-04 17:53:22 +05309628 status = wma_get_link_speed(wma_handle, req);
Jeff Johnsona5317a62017-01-26 08:51:25 -08009629 sme_release_global_lock(&pMac->sme);
Jeff Johnsona5317a62017-01-26 08:51:25 -08009630
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009631 return status;
9632}
9633
9634
9635/*
9636 * SME API to enable/disable WLAN driver initiated SSR
9637 */
9638void sme_update_enable_ssr(tHalHandle hHal, bool enableSSR)
9639{
9640 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309641 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009642
9643 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309644 if (QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda2c263352017-03-17 17:49:53 -07009645 sme_debug("SSR level is changed %d", enableSSR);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009646 /* not serializing this messsage, as this is only going
9647 * to set a variable in WMA/WDI
9648 */
9649 WMA_SetEnableSSR(enableSSR);
9650 sme_release_global_lock(&pMac->sme);
9651 }
9652 return;
9653}
9654
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309655QDF_STATUS sme_check_ch_in_band(tpAniSirGlobal mac_ctx, uint8_t start_ch,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009656 uint8_t ch_cnt)
9657{
9658 uint8_t i;
9659 for (i = 0; i < ch_cnt; i++) {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309660 if (QDF_STATUS_SUCCESS != csr_is_valid_channel(mac_ctx,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009661 (start_ch + i*4)))
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309662 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009663 }
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309664 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009665}
9666
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009667/*convert the ini value to the ENUM used in csr and MAC for CB state*/
9668ePhyChanBondState sme_get_cb_phy_state_from_cb_ini_value(uint32_t cb_ini_value)
9669{
9670 return csr_convert_cb_ini_value_to_phy_cb_state(cb_ini_value);
9671}
9672
9673/*--------------------------------------------------------------------------
9674
9675 \brief sme_set_curr_device_mode() - Sets the current operating device mode.
9676 \param hHal - The handle returned by mac_open.
9677 \param currDeviceMode - Current operating device mode.
9678 --------------------------------------------------------------------------*/
9679
Peng Xuf5d60c82015-10-02 17:17:03 -07009680void sme_set_curr_device_mode(tHalHandle hHal,
Anurag Chouhan6d760662016-02-20 16:05:43 +05309681 enum tQDF_ADAPTER_MODE currDeviceMode)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009682{
9683 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
9684 pMac->sme.currDeviceMode = currDeviceMode;
9685 return;
9686}
9687
9688/*--------------------------------------------------------------------------
9689 \brief sme_handoff_request() - a wrapper function to Request a handoff
9690 from CSR.
9691 This is a synchronous call
9692 \param hHal - The handle returned by mac_open
9693 \param sessionId - Session Identifier
9694 \param pHandoffInfo - info provided by HDD with the handoff request (namely:
9695 BSSID, channel etc.)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309696 \return QDF_STATUS_SUCCESS - SME passed the request to CSR successfully.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009697 Other status means SME is failed to send the request.
9698 \sa
9699 --------------------------------------------------------------------------*/
9700
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309701QDF_STATUS sme_handoff_request(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009702 uint8_t sessionId,
9703 tCsrHandoffRequest *pHandoffInfo)
9704{
9705 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309706 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009707
9708 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309709 if (QDF_IS_STATUS_SUCCESS(status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05309710 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009711 "%s: invoked", __func__);
9712 status = csr_handoff_request(pMac, sessionId, pHandoffInfo);
9713 sme_release_global_lock(&pMac->sme);
9714 }
9715
9716 return status;
9717}
9718
9719#ifdef IPA_OFFLOAD
9720/* ---------------------------------------------------------------------------
9721 \fn sme_ipa_offload_enable_disable
9722 \brief API to enable/disable IPA offload
9723 \param hal - The handle returned by macOpen.
9724 \param session_id - Session Identifier
9725 \param request - Pointer to the offload request.
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309726 \return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009727 ---------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309728QDF_STATUS sme_ipa_offload_enable_disable(tHalHandle hal, uint8_t session_id,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009729 struct sir_ipa_offload_enable_disable *request)
9730{
9731 tpAniSirGlobal pMac = PMAC_STRUCT(hal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309732 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009733 struct sir_ipa_offload_enable_disable *request_buf;
Rajeev Kumar37d478b2017-04-17 16:59:28 -07009734 struct scheduler_msg msg = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009735
9736 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309737 if (QDF_STATUS_SUCCESS == status) {
Anurag Chouhan600c3a02016-03-01 10:33:54 +05309738 request_buf = qdf_mem_malloc(sizeof(*request_buf));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009739 if (NULL == request_buf) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05309740 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Jeff Johnson4fa74ce2016-11-08 11:06:02 -08009741 FL("Not able to allocate memory for IPA_OFFLOAD_ENABLE_DISABLE"));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009742 sme_release_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309743 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009744 }
9745
9746 request_buf->offload_type = request->offload_type;
9747 request_buf->vdev_id = request->vdev_id;
9748 request_buf->enable = request->enable;
9749
9750 msg.type = WMA_IPA_OFFLOAD_ENABLE_DISABLE;
9751 msg.reserved = 0;
9752 msg.bodyptr = request_buf;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309753 if (!QDF_IS_STATUS_SUCCESS(
Rajeev Kumar8eaedf62017-01-21 11:03:13 -08009754 scheduler_post_msg(QDF_MODULE_ID_WMA, &msg))) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05309755 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Jeff Johnson4fa74ce2016-11-08 11:06:02 -08009756 FL("Not able to post WMA_IPA_OFFLOAD_ENABLE_DISABLE message to WMA"));
Anurag Chouhan600c3a02016-03-01 10:33:54 +05309757 qdf_mem_free(request_buf);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009758 sme_release_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309759 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009760 }
9761
9762 sme_release_global_lock(&pMac->sme);
9763 }
9764
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309765 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009766}
9767#endif /* IPA_OFFLOAD */
9768
9769/*
9770 * SME API to check if there is any infra station or
9771 * P2P client is connected
9772 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309773QDF_STATUS sme_is_sta_p2p_client_connected(tHalHandle hHal)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009774{
9775 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
9776 if (csr_is_infra_connected(pMac)) {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309777 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009778 }
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309779 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009780}
9781
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009782/**
9783 * sme_add_periodic_tx_ptrn() - Add Periodic TX Pattern
9784 * @hal: global hal handle
9785 * @addPeriodicTxPtrnParams: request message
9786 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309787 * Return: QDF_STATUS enumeration
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009788 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309789QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009790sme_add_periodic_tx_ptrn(tHalHandle hal,
9791 struct sSirAddPeriodicTxPtrn *addPeriodicTxPtrnParams)
9792{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309793 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009794 tpAniSirGlobal mac = PMAC_STRUCT(hal);
9795 struct sSirAddPeriodicTxPtrn *req_msg;
Rajeev Kumar37d478b2017-04-17 16:59:28 -07009796 struct scheduler_msg msg = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009797
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07009798 SME_ENTER();
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009799
Anurag Chouhan600c3a02016-03-01 10:33:54 +05309800 req_msg = qdf_mem_malloc(sizeof(*req_msg));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009801 if (!req_msg) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07009802 sme_err("memory allocation failed");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309803 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009804 }
9805
9806 *req_msg = *addPeriodicTxPtrnParams;
9807
9808 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309809 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07009810 sme_err("sme_acquire_global_lock failed!(status=%d)",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009811 status);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05309812 qdf_mem_free(req_msg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009813 return status;
9814 }
9815
9816 /* Serialize the req through MC thread */
9817 msg.bodyptr = req_msg;
9818 msg.type = WMA_ADD_PERIODIC_TX_PTRN_IND;
Sreelakshmi Konamki6a065362016-05-31 16:05:01 +05309819 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
9820 NO_SESSION, msg.type));
Rajeev Kumar8eaedf62017-01-21 11:03:13 -08009821 status = scheduler_post_msg(QDF_MODULE_ID_WMA, &msg);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309822 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07009823 sme_err("scheduler_post_msg failed!(err=%d)",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009824 status);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05309825 qdf_mem_free(req_msg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009826 }
9827 sme_release_global_lock(&mac->sme);
9828 return status;
9829}
9830
9831/**
9832 * sme_del_periodic_tx_ptrn() - Delete Periodic TX Pattern
9833 * @hal: global hal handle
9834 * @delPeriodicTxPtrnParams: request message
9835 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309836 * Return: QDF_STATUS enumeration
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009837 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309838QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009839sme_del_periodic_tx_ptrn(tHalHandle hal,
9840 struct sSirDelPeriodicTxPtrn *delPeriodicTxPtrnParams)
9841{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309842 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009843 tpAniSirGlobal mac = PMAC_STRUCT(hal);
9844 struct sSirDelPeriodicTxPtrn *req_msg;
Rajeev Kumar37d478b2017-04-17 16:59:28 -07009845 struct scheduler_msg msg = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009846
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07009847 SME_ENTER();
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009848
Anurag Chouhan600c3a02016-03-01 10:33:54 +05309849 req_msg = qdf_mem_malloc(sizeof(*req_msg));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009850 if (!req_msg) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07009851 sme_err("memory allocation failed");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309852 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009853 }
9854
9855 *req_msg = *delPeriodicTxPtrnParams;
9856
9857 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309858 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07009859 sme_err("sme_acquire_global_lock failed!(status=%d)",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009860 status);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05309861 qdf_mem_free(req_msg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009862 return status;
9863 }
9864
9865 /* Serialize the req through MC thread */
9866 msg.bodyptr = req_msg;
9867 msg.type = WMA_DEL_PERIODIC_TX_PTRN_IND;
Sreelakshmi Konamki6a065362016-05-31 16:05:01 +05309868 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
9869 NO_SESSION, msg.type));
Rajeev Kumar8eaedf62017-01-21 11:03:13 -08009870 status = scheduler_post_msg(QDF_MODULE_ID_WMA, &msg);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309871 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07009872 sme_err("scheduler_post_msg failed!(err=%d)",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009873 status);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05309874 qdf_mem_free(req_msg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009875 }
9876 sme_release_global_lock(&mac->sme);
9877 return status;
9878}
9879
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08009880/**
9881 * sme_enable_rmc() - enables RMC
9882 * @hHal : Pointer to global HAL handle
9883 * @sessionId : Session ID
9884 *
9885 * Return: QDF_STATUS
9886 */
9887QDF_STATUS sme_enable_rmc(tHalHandle hHal, uint32_t sessionId)
9888{
9889 QDF_STATUS status = QDF_STATUS_E_FAILURE;
9890 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Rajeev Kumar37d478b2017-04-17 16:59:28 -07009891 struct scheduler_msg message = {0};
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08009892 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
9893
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07009894 SME_ENTER();
9895
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08009896 status = sme_acquire_global_lock(&pMac->sme);
9897 if (QDF_IS_STATUS_SUCCESS(status)) {
Rajeev Kumar8eaedf62017-01-21 11:03:13 -08009898 message.bodyptr = NULL;
9899 message.type = WMA_RMC_ENABLE_IND;
9900 qdf_status = scheduler_post_msg(QDF_MODULE_ID_WMA,
9901 &message);
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08009902 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
9903 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
9904 "%s: failed to post message to WMA",
9905 __func__);
9906 status = QDF_STATUS_E_FAILURE;
9907 }
9908 sme_release_global_lock(&pMac->sme);
9909 }
9910 return status;
9911}
9912
9913/**
9914 * sme_disable_rmc() - disables RMC
9915 * @hHal : Pointer to global HAL handle
9916 * @sessionId : Session ID
9917 *
9918 * Return: QDF_STATUS
9919 */
9920QDF_STATUS sme_disable_rmc(tHalHandle hHal, uint32_t sessionId)
9921{
9922 QDF_STATUS status = QDF_STATUS_E_FAILURE;
9923 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Rajeev Kumar37d478b2017-04-17 16:59:28 -07009924 struct scheduler_msg message = {0};
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08009925 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
9926
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07009927 SME_ENTER();
9928
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08009929 status = sme_acquire_global_lock(&pMac->sme);
9930 if (QDF_IS_STATUS_SUCCESS(status)) {
Rajeev Kumar8eaedf62017-01-21 11:03:13 -08009931 message.bodyptr = NULL;
9932 message.type = WMA_RMC_DISABLE_IND;
9933 qdf_status = scheduler_post_msg(QDF_MODULE_ID_WMA,
9934 &message);
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08009935 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
9936 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
9937 "%s: failed to post message to WMA",
9938 __func__);
9939 status = QDF_STATUS_E_FAILURE;
9940 }
9941 sme_release_global_lock(&pMac->sme);
9942 }
9943 return status;
9944}
9945
9946/**
9947 * sme_send_rmc_action_period() - sends RMC action period param to target
9948 * @hHal : Pointer to global HAL handle
9949 * @sessionId : Session ID
9950 *
9951 * Return: QDF_STATUS
9952 */
9953QDF_STATUS sme_send_rmc_action_period(tHalHandle hHal, uint32_t sessionId)
9954{
9955 QDF_STATUS status = QDF_STATUS_SUCCESS;
9956 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
9957 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Rajeev Kumar37d478b2017-04-17 16:59:28 -07009958 struct scheduler_msg message = {0};
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08009959
9960 status = sme_acquire_global_lock(&pMac->sme);
9961 if (QDF_STATUS_SUCCESS == status) {
Rajeev Kumar8eaedf62017-01-21 11:03:13 -08009962 message.bodyptr = NULL;
9963 message.type = WMA_RMC_ACTION_PERIOD_IND;
9964 qdf_status = scheduler_post_msg(QDF_MODULE_ID_WMA,
9965 &message);
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08009966 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
9967 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
9968 "%s: failed to post message to WMA",
9969 __func__);
9970 status = QDF_STATUS_E_FAILURE;
9971 }
9972 sme_release_global_lock(&pMac->sme);
9973 }
9974
9975 return status;
9976}
9977
9978/**
9979 * sme_request_ibss_peer_info() - request ibss peer info
9980 * @hHal : Pointer to global HAL handle
9981 * @pUserData : Pointer to user data
9982 * @peerInfoCbk : Peer info callback
9983 * @allPeerInfoReqd : All peer info required or not
9984 * @staIdx : sta index
9985 *
9986 * Return: QDF_STATUS
9987 */
9988QDF_STATUS sme_request_ibss_peer_info(tHalHandle hHal, void *pUserData,
9989 pIbssPeerInfoCb peerInfoCbk,
9990 bool allPeerInfoReqd, uint8_t staIdx)
9991{
9992 QDF_STATUS status = QDF_STATUS_E_FAILURE;
9993 QDF_STATUS qdf_status = QDF_STATUS_E_FAILURE;
9994 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Rajeev Kumar37d478b2017-04-17 16:59:28 -07009995 struct scheduler_msg message = {0};
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08009996 tSirIbssGetPeerInfoReqParams *pIbssInfoReqParams;
9997
9998 status = sme_acquire_global_lock(&pMac->sme);
9999 if (QDF_STATUS_SUCCESS == status) {
10000 pMac->sme.peerInfoParams.peerInfoCbk = peerInfoCbk;
10001 pMac->sme.peerInfoParams.pUserData = pUserData;
10002
10003 pIbssInfoReqParams = (tSirIbssGetPeerInfoReqParams *)
10004 qdf_mem_malloc(sizeof(tSirIbssGetPeerInfoReqParams));
10005 if (NULL == pIbssInfoReqParams) {
10006 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
10007 "%s: Not able to allocate memory for dhcp start",
10008 __func__);
10009 sme_release_global_lock(&pMac->sme);
10010 return QDF_STATUS_E_NOMEM;
10011 }
10012 pIbssInfoReqParams->allPeerInfoReqd = allPeerInfoReqd;
10013 pIbssInfoReqParams->staIdx = staIdx;
10014
Rajeev Kumar8eaedf62017-01-21 11:03:13 -080010015 message.type = WMA_GET_IBSS_PEER_INFO_REQ;
10016 message.bodyptr = pIbssInfoReqParams;
10017 message.reserved = 0;
Rajeev Kumar8e3e2832015-11-06 16:02:54 -080010018
Rajeev Kumar8eaedf62017-01-21 11:03:13 -080010019 qdf_status = scheduler_post_msg(QDF_MODULE_ID_WMA,
10020 &message);
Rajeev Kumar8e3e2832015-11-06 16:02:54 -080010021 if (QDF_STATUS_SUCCESS != qdf_status) {
10022 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
10023 "%s: Post WMA_GET_IBSS_PEER_INFO_REQ MSG failed",
10024 __func__);
10025 qdf_mem_free(pIbssInfoReqParams);
10026 qdf_status = QDF_STATUS_E_FAILURE;
10027 }
10028 sme_release_global_lock(&pMac->sme);
10029 }
10030
10031 return qdf_status;
10032}
10033
10034/* ---------------------------------------------------------------------------
10035 \fn sme_send_cesium_enable_ind
10036 \brief Used to send proprietary cesium enable indication to fw
10037 \param hHal
10038 \param sessionId
10039 \- return QDF_STATUS
10040 -------------------------------------------------------------------------*/
10041QDF_STATUS sme_send_cesium_enable_ind(tHalHandle hHal, uint32_t sessionId)
10042{
10043 QDF_STATUS status = QDF_STATUS_SUCCESS;
10044 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
10045 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Rajeev Kumar37d478b2017-04-17 16:59:28 -070010046 struct scheduler_msg message = {0};
Rajeev Kumar8e3e2832015-11-06 16:02:54 -080010047
10048 status = sme_acquire_global_lock(&pMac->sme);
10049 if (QDF_STATUS_SUCCESS == status) {
Rajeev Kumar8eaedf62017-01-21 11:03:13 -080010050 message.bodyptr = NULL;
10051 message.type = WMA_IBSS_CESIUM_ENABLE_IND;
10052 qdf_status = scheduler_post_msg(QDF_MODULE_ID_WMA,
10053 &message);
Rajeev Kumar8e3e2832015-11-06 16:02:54 -080010054 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
10055 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
10056 "%s: failed to post message to WMA",
10057 __func__);
10058 status = QDF_STATUS_E_FAILURE;
10059 }
10060 sme_release_global_lock(&pMac->sme);
10061 }
10062
10063 return status;
10064}
10065
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010066void sme_get_command_q_status(tHalHandle hHal)
10067{
10068 tSmeCmd *pTempCmd = NULL;
10069 tListElem *pEntry;
10070 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
10071
10072 if (NULL == pMac) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053010073 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010074 "%s: pMac is NULL", __func__);
10075 return;
10076 }
10077
Krunal Sonia8270f52017-02-23 19:51:25 -080010078 pEntry = csr_nonscan_active_ll_peek_head(pMac, LL_ACCESS_LOCK);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010079 if (pEntry) {
10080 pTempCmd = GET_BASE_ADDR(pEntry, tSmeCmd, Link);
10081 }
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070010082 sme_err("Currently smeCmdActiveList has command (0x%X)",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010083 (pTempCmd) ? pTempCmd->command : eSmeNoCommand);
10084 if (pTempCmd) {
10085 if (eSmeCsrCommandMask & pTempCmd->command) {
10086 /* CSR command is stuck. See what the reason code is for that command */
10087 dump_csr_command_info(pMac, pTempCmd);
10088 }
10089 } /* if(pTempCmd) */
10090
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070010091 sme_err("Currently smeCmdPendingList has %d commands",
Krunal Soni72dba662017-02-15 20:13:17 -080010092 csr_nonscan_pending_ll_count(pMac));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010093
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010094 return;
10095}
Kiran Kumar Lokere1aa9c9a2016-10-05 18:50:59 -070010096/**
10097 * sme_set_prefer_80MHz_over_160MHz() - API to set sta_prefer_80MHz_over_160MHz
10098 * @hal: The handle returned by macOpen
10099 * @sta_prefer_80MHz_over_160MHz: sta_prefer_80MHz_over_160MHz config param
10100 */
10101void sme_set_prefer_80MHz_over_160MHz(tHalHandle hal,
10102 bool sta_prefer_80MHz_over_160MHz)
10103{
10104 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
10105 mac_ctx->sta_prefer_80MHz_over_160MHz = sta_prefer_80MHz_over_160MHz;
10106}
10107
Agrawal Ashishb141b092016-09-02 19:59:26 +053010108#ifdef WLAN_FEATURE_DSRC
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010109/**
10110 * sme_set_dot11p_config() - API to set the 802.11p config
10111 * @hHal: The handle returned by macOpen
10112 * @enable_dot11p: 802.11p config param
10113 */
10114void sme_set_dot11p_config(tHalHandle hHal, bool enable_dot11p)
10115{
10116 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
10117 pMac->enable_dot11p = enable_dot11p;
10118}
10119
10120/**
10121 * copy_sir_ocb_config() - Performs deep copy of an OCB configuration
10122 * @src: the source configuration
10123 *
10124 * Return: pointer to the copied OCB configuration
10125 */
10126static struct sir_ocb_config *sme_copy_sir_ocb_config(
10127 struct sir_ocb_config *src)
10128{
10129 struct sir_ocb_config *dst;
10130 uint32_t length;
10131 void *cursor;
10132
10133 length = sizeof(*src) +
10134 src->channel_count * sizeof(*src->channels) +
10135 src->schedule_size * sizeof(*src->schedule) +
10136 src->dcc_ndl_chan_list_len +
10137 src->dcc_ndl_active_state_list_len;
10138
Anurag Chouhan600c3a02016-03-01 10:33:54 +053010139 dst = qdf_mem_malloc(length);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010140 if (!dst)
10141 return NULL;
10142
10143 *dst = *src;
10144
10145 cursor = dst;
10146 cursor += sizeof(*dst);
10147 dst->channels = cursor;
10148 cursor += src->channel_count * sizeof(*src->channels);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053010149 qdf_mem_copy(dst->channels, src->channels,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010150 src->channel_count * sizeof(*src->channels));
10151 dst->schedule = cursor;
10152 cursor += src->schedule_size * sizeof(*src->schedule);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053010153 qdf_mem_copy(dst->schedule, src->schedule,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010154 src->schedule_size * sizeof(*src->schedule));
10155 dst->dcc_ndl_chan_list = cursor;
10156 cursor += src->dcc_ndl_chan_list_len;
Anurag Chouhan600c3a02016-03-01 10:33:54 +053010157 qdf_mem_copy(dst->dcc_ndl_chan_list, src->dcc_ndl_chan_list,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010158 src->dcc_ndl_chan_list_len);
10159 dst->dcc_ndl_active_state_list = cursor;
10160 cursor += src->dcc_ndl_active_state_list_len;
Anurag Chouhan600c3a02016-03-01 10:33:54 +053010161 qdf_mem_copy(dst->dcc_ndl_active_state_list,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010162 src->dcc_ndl_active_state_list,
10163 src->dcc_ndl_active_state_list_len);
10164 return dst;
10165}
10166
10167/**
10168 * sme_ocb_set_config() - Set the OCB configuration
10169 * @hHal: reference to the HAL
10170 * @context: the context of the call
10171 * @callback: the callback to hdd
10172 * @config: the OCB configuration
10173 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010174 * Return: QDF_STATUS_SUCCESS on success, QDF_STATUS_E_FAILURE on failure
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010175 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010176QDF_STATUS sme_ocb_set_config(tHalHandle hHal, void *context,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010177 ocb_callback callback,
10178 struct sir_ocb_config *config)
10179{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010180 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010181 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Rajeev Kumar8eaedf62017-01-21 11:03:13 -080010182 struct scheduler_msg msg = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010183 struct sir_ocb_config *msg_body;
10184
10185 /* Lock the SME structure */
10186 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010187 if (!QDF_IS_STATUS_SUCCESS(status))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010188 return status;
10189
10190 /*
10191 * Check if there is a pending request and return an error if one
10192 * exists
10193 */
10194 if (pMac->sme.ocb_set_config_callback) {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010195 status = QDF_STATUS_E_BUSY;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010196 goto end;
10197 }
10198
10199 msg_body = sme_copy_sir_ocb_config(config);
10200
10201 if (!msg_body) {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010202 status = QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010203 goto end;
10204 }
10205
10206 msg.type = WMA_OCB_SET_CONFIG_CMD;
10207 msg.bodyptr = msg_body;
10208
10209 /* Set the request callback and context */
10210 pMac->sme.ocb_set_config_callback = callback;
10211 pMac->sme.ocb_set_config_context = context;
10212
Rajeev Kumar8eaedf62017-01-21 11:03:13 -080010213 status = scheduler_post_msg(QDF_MODULE_ID_WMA, &msg);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010214 if (!QDF_IS_STATUS_SUCCESS(status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053010215 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010216 FL("Error posting message to WDA: %d"), status);
10217 pMac->sme.ocb_set_config_callback = callback;
10218 pMac->sme.ocb_set_config_context = context;
Anurag Chouhan600c3a02016-03-01 10:33:54 +053010219 qdf_mem_free(msg_body);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010220 goto end;
10221 }
10222
10223end:
10224 sme_release_global_lock(&pMac->sme);
10225
10226 return status;
10227}
10228
10229/**
10230 * sme_ocb_set_utc_time() - Set the OCB UTC time
10231 * @hHal: reference to the HAL
10232 * @utc: the UTC time struct
10233 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010234 * Return: QDF_STATUS_SUCCESS on success, QDF_STATUS_E_FAILURE on failure
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010235 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010236QDF_STATUS sme_ocb_set_utc_time(tHalHandle hHal, struct sir_ocb_utc *utc)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010237{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010238 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010239 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Rajeev Kumar8eaedf62017-01-21 11:03:13 -080010240 struct scheduler_msg msg = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010241 struct sir_ocb_utc *sme_utc;
10242
10243 /* Lock the SME structure */
10244 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010245 if (!QDF_IS_STATUS_SUCCESS(status))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010246 return status;
10247
Anurag Chouhan600c3a02016-03-01 10:33:54 +053010248 sme_utc = qdf_mem_malloc(sizeof(*sme_utc));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010249 if (!sme_utc) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053010250 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010251 FL("Malloc failed"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010252 status = QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010253 goto end;
10254 }
10255 *sme_utc = *utc;
10256
10257 msg.type = WMA_OCB_SET_UTC_TIME_CMD;
10258 msg.reserved = 0;
10259 msg.bodyptr = sme_utc;
Rajeev Kumar8eaedf62017-01-21 11:03:13 -080010260 status = scheduler_post_msg(QDF_MODULE_ID_WMA, &msg);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010261 if (!QDF_IS_STATUS_SUCCESS(status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053010262 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010263 FL("Not able to post message to WDA"));
Anurag Chouhan600c3a02016-03-01 10:33:54 +053010264 qdf_mem_free(utc);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010265 goto end;
10266 }
10267
10268end:
10269 sme_release_global_lock(&pMac->sme);
10270
10271 return status;
10272}
10273
10274/**
10275 * sme_ocb_start_timing_advert() - Start sending timing advert frames
10276 * @hHal: reference to the HAL
10277 * @timing_advert: the timing advertisement struct
10278 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010279 * Return: QDF_STATUS_SUCCESS on success, QDF_STATUS_E_FAILURE on failure
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010280 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010281QDF_STATUS sme_ocb_start_timing_advert(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010282 struct sir_ocb_timing_advert *timing_advert)
10283{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010284 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010285 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Rajeev Kumar8eaedf62017-01-21 11:03:13 -080010286 struct scheduler_msg msg = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010287 void *buf;
10288 struct sir_ocb_timing_advert *sme_timing_advert;
10289
10290 /* Lock the SME structure */
10291 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010292 if (!QDF_IS_STATUS_SUCCESS(status))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010293 return status;
10294
Anurag Chouhan600c3a02016-03-01 10:33:54 +053010295 buf = qdf_mem_malloc(sizeof(*sme_timing_advert) +
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010296 timing_advert->template_length);
10297 if (!buf) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053010298 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010299 FL("Not able to allocate memory for start TA"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010300 status = QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010301 goto end;
10302 }
10303
10304 sme_timing_advert = (struct sir_ocb_timing_advert *)buf;
10305 *sme_timing_advert = *timing_advert;
10306 sme_timing_advert->template_value = buf + sizeof(*sme_timing_advert);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053010307 qdf_mem_copy(sme_timing_advert->template_value,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010308 timing_advert->template_value, timing_advert->template_length);
10309
10310 msg.type = WMA_OCB_START_TIMING_ADVERT_CMD;
10311 msg.reserved = 0;
10312 msg.bodyptr = buf;
Rajeev Kumar8eaedf62017-01-21 11:03:13 -080010313 status = scheduler_post_msg(QDF_MODULE_ID_WMA, &msg);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010314 if (!QDF_IS_STATUS_SUCCESS(status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053010315 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010316 FL("Not able to post msg to WDA"));
10317 goto end;
10318 }
10319
10320end:
10321 sme_release_global_lock(&pMac->sme);
10322
10323 return status;
10324}
10325
10326/**
10327 * sme_ocb_stop_timing_advert() - Stop sending timing advert frames on a channel
10328 * @hHal: reference to the HAL
10329 * @timing_advert: the timing advertisement struct
10330 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010331 * Return: QDF_STATUS_SUCCESS on success, QDF_STATUS_E_FAILURE on failure
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010332 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010333QDF_STATUS sme_ocb_stop_timing_advert(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010334 struct sir_ocb_timing_advert *timing_advert)
10335{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010336 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010337 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Rajeev Kumar8eaedf62017-01-21 11:03:13 -080010338 struct scheduler_msg msg = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010339 struct sir_ocb_timing_advert *sme_timing_advert;
10340
10341 /* Lock the SME structure */
10342 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010343 if (!QDF_IS_STATUS_SUCCESS(status))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010344 return status;
10345
Anurag Chouhan600c3a02016-03-01 10:33:54 +053010346 sme_timing_advert = qdf_mem_malloc(sizeof(*timing_advert));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010347 if (!sme_timing_advert) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053010348 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010349 FL("Not able to allocate memory for stop TA"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010350 status = QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010351 goto end;
10352 }
10353 *sme_timing_advert = *timing_advert;
10354
10355 msg.type = WMA_OCB_STOP_TIMING_ADVERT_CMD;
10356 msg.reserved = 0;
10357 msg.bodyptr = sme_timing_advert;
Rajeev Kumar8eaedf62017-01-21 11:03:13 -080010358 status = scheduler_post_msg(QDF_MODULE_ID_WMA, &msg);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010359 if (!QDF_IS_STATUS_SUCCESS(status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053010360 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010361 FL("Not able to post msg to WDA"));
10362 goto end;
10363 }
10364
10365end:
10366 sme_release_global_lock(&pMac->sme);
10367
10368 return status;
10369}
10370
10371/**
Naveen Rawatb4d37622015-11-13 16:15:25 -080010372 * sme_ocb_gen_timing_advert_frame() - generate TA frame and populate the buffer
10373 * @hal_handle: reference to the HAL
10374 * @self_addr: the self MAC address
10375 * @buf: the buffer that will contain the frame
10376 * @timestamp_offset: return for the offset of the timestamp field
10377 * @time_value_offset: return for the time_value field in the TA IE
10378 *
10379 * Return: the length of the buffer.
10380 */
10381int sme_ocb_gen_timing_advert_frame(tHalHandle hal_handle,
10382 tSirMacAddr self_addr, uint8_t **buf,
10383 uint32_t *timestamp_offset,
10384 uint32_t *time_value_offset)
10385{
10386 int template_length;
10387 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal_handle);
10388
10389 template_length = sch_gen_timing_advert_frame(mac_ctx, self_addr, buf,
10390 timestamp_offset,
10391 time_value_offset);
10392 return template_length;
10393}
10394/**
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010395 * sme_ocb_get_tsf_timer() - Get the TSF timer value
10396 * @hHal: reference to the HAL
10397 * @context: the context of the call
10398 * @callback: the callback to hdd
10399 * @request: the TSF timer request
10400 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010401 * Return: QDF_STATUS_SUCCESS on success, QDF_STATUS_E_FAILURE on failure
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010402 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010403QDF_STATUS sme_ocb_get_tsf_timer(tHalHandle hHal, void *context,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010404 ocb_callback callback,
10405 struct sir_ocb_get_tsf_timer *request)
10406{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010407 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010408 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Rajeev Kumar8eaedf62017-01-21 11:03:13 -080010409 struct scheduler_msg msg = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010410 struct sir_ocb_get_tsf_timer *msg_body;
10411
10412 /* Lock the SME structure */
10413 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010414 if (!QDF_IS_STATUS_SUCCESS(status))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010415 return status;
10416
10417 /* Allocate memory for the WMI request, and copy the parameter */
Anurag Chouhan600c3a02016-03-01 10:33:54 +053010418 msg_body = qdf_mem_malloc(sizeof(*msg_body));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010419 if (!msg_body) {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010420 status = QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010421 goto end;
10422 }
10423 *msg_body = *request;
10424
10425 msg.type = WMA_OCB_GET_TSF_TIMER_CMD;
10426 msg.bodyptr = msg_body;
10427
10428 /* Set the request callback and the context */
10429 pMac->sme.ocb_get_tsf_timer_callback = callback;
10430 pMac->sme.ocb_get_tsf_timer_context = context;
10431
10432 /* Post the message to WDA */
Rajeev Kumar8eaedf62017-01-21 11:03:13 -080010433 status = scheduler_post_msg(QDF_MODULE_ID_WMA, &msg);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010434 if (!QDF_IS_STATUS_SUCCESS(status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053010435 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010436 FL("Error posting message to WDA: %d"), status);
10437 pMac->sme.ocb_get_tsf_timer_callback = NULL;
10438 pMac->sme.ocb_get_tsf_timer_context = NULL;
Anurag Chouhan600c3a02016-03-01 10:33:54 +053010439 qdf_mem_free(msg_body);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010440 goto end;
10441 }
10442
10443end:
10444 sme_release_global_lock(&pMac->sme);
10445
10446 return status;
10447}
10448
10449/**
10450 * sme_dcc_get_stats() - Get the DCC stats
10451 * @hHal: reference to the HAL
10452 * @context: the context of the call
10453 * @callback: the callback to hdd
10454 * @request: the get DCC stats request
10455 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010456 * Return: QDF_STATUS_SUCCESS on success, QDF_STATUS_E_FAILURE on failure
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010457 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010458QDF_STATUS sme_dcc_get_stats(tHalHandle hHal, void *context,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010459 ocb_callback callback,
10460 struct sir_dcc_get_stats *request)
10461{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010462 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010463 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Rajeev Kumar8eaedf62017-01-21 11:03:13 -080010464 struct scheduler_msg msg = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010465 struct sir_dcc_get_stats *msg_body;
10466
10467 /* Lock the SME structure */
10468 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010469 if (!QDF_IS_STATUS_SUCCESS(status))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010470 return status;
10471
10472 /* Allocate memory for the WMI request, and copy the parameter */
Anurag Chouhan600c3a02016-03-01 10:33:54 +053010473 msg_body = qdf_mem_malloc(sizeof(*msg_body) +
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010474 request->request_array_len);
10475 if (!msg_body) {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010476 status = QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010477 goto end;
10478 }
10479 *msg_body = *request;
10480 msg_body->request_array = (void *)msg_body + sizeof(*msg_body);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053010481 qdf_mem_copy(msg_body->request_array, request->request_array,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010482 request->request_array_len);
10483
10484 msg.type = WMA_DCC_GET_STATS_CMD;
10485 msg.bodyptr = msg_body;
10486
10487 /* Set the request callback and context */
10488 pMac->sme.dcc_get_stats_callback = callback;
10489 pMac->sme.dcc_get_stats_context = context;
10490
Rajeev Kumar8eaedf62017-01-21 11:03:13 -080010491 status = scheduler_post_msg(QDF_MODULE_ID_WMA, &msg);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010492 if (!QDF_IS_STATUS_SUCCESS(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 FL("Error posting message to WDA: %d"), status);
10495 pMac->sme.dcc_get_stats_callback = callback;
10496 pMac->sme.dcc_get_stats_context = context;
Anurag Chouhan600c3a02016-03-01 10:33:54 +053010497 qdf_mem_free(msg_body);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010498 goto end;
10499 }
10500
10501end:
10502 sme_release_global_lock(&pMac->sme);
10503
10504 return status;
10505}
10506
10507/**
10508 * sme_dcc_clear_stats() - Clear the DCC stats
10509 * @hHal: reference to the HAL
10510 * @vdev_id: vdev id for OCB interface
10511 * @dcc_stats_bitmap: the entries in the stats to clear
10512 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010513 * Return: QDF_STATUS_SUCCESS on success, QDF_STATUS_E_FAILURE on failure
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010514 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010515QDF_STATUS sme_dcc_clear_stats(tHalHandle hHal, uint32_t vdev_id,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010516 uint32_t dcc_stats_bitmap)
10517{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010518 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010519 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Rajeev Kumar8eaedf62017-01-21 11:03:13 -080010520 struct scheduler_msg msg = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010521 struct sir_dcc_clear_stats *request;
10522
10523 /* Lock the SME structure */
10524 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010525 if (!QDF_IS_STATUS_SUCCESS(status))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010526 return status;
10527
Anurag Chouhan600c3a02016-03-01 10:33:54 +053010528 request = qdf_mem_malloc(sizeof(struct sir_dcc_clear_stats));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010529 if (!request) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053010530 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010531 FL("Not able to allocate memory"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010532 status = QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010533 goto end;
10534 }
10535
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010536 request->vdev_id = vdev_id;
10537 request->dcc_stats_bitmap = dcc_stats_bitmap;
10538
10539 msg.type = WMA_DCC_CLEAR_STATS_CMD;
10540 msg.bodyptr = request;
10541
Rajeev Kumar8eaedf62017-01-21 11:03:13 -080010542 status = scheduler_post_msg(QDF_MODULE_ID_WMA, &msg);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010543 if (!QDF_IS_STATUS_SUCCESS(status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053010544 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010545 FL("Not able to post msg to WDA"));
Anurag Chouhan600c3a02016-03-01 10:33:54 +053010546 qdf_mem_free(request);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010547 goto end;
10548 }
10549
10550end:
10551 sme_release_global_lock(&pMac->sme);
10552
10553 return status;
10554}
10555
10556/**
10557 * sme_dcc_update_ndl() - Update the DCC settings
10558 * @hHal: reference to the HAL
10559 * @context: the context of the call
10560 * @callback: the callback to hdd
10561 * @request: the update DCC request
10562 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010563 * Return: QDF_STATUS_SUCCESS on success, QDF_STATUS_E_FAILURE on failure
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010564 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010565QDF_STATUS sme_dcc_update_ndl(tHalHandle hHal, void *context,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010566 ocb_callback callback,
10567 struct sir_dcc_update_ndl *request)
10568{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010569 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010570 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Rajeev Kumar8eaedf62017-01-21 11:03:13 -080010571 struct scheduler_msg msg = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010572 struct sir_dcc_update_ndl *msg_body;
10573
10574 /* Lock the SME structure */
10575 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010576 if (!QDF_IS_STATUS_SUCCESS(status))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010577 return status;
10578
10579 /* Allocate memory for the WMI request, and copy the parameter */
Anurag Chouhan600c3a02016-03-01 10:33:54 +053010580 msg_body = qdf_mem_malloc(sizeof(*msg_body) +
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010581 request->dcc_ndl_chan_list_len +
10582 request->dcc_ndl_active_state_list_len);
10583 if (!msg_body) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053010584 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010585 FL("Failed to allocate memory"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010586 status = QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010587 goto end;
10588 }
10589
10590 *msg_body = *request;
10591
10592 msg_body->dcc_ndl_chan_list = (void *)msg_body + sizeof(*msg_body);
10593 msg_body->dcc_ndl_active_state_list = msg_body->dcc_ndl_chan_list +
10594 request->dcc_ndl_chan_list_len;
Anurag Chouhan600c3a02016-03-01 10:33:54 +053010595 qdf_mem_copy(msg_body->dcc_ndl_chan_list, request->dcc_ndl_chan_list,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010596 request->dcc_ndl_active_state_list_len);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053010597 qdf_mem_copy(msg_body->dcc_ndl_active_state_list,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010598 request->dcc_ndl_active_state_list,
10599 request->dcc_ndl_active_state_list_len);
10600
10601 msg.type = WMA_DCC_UPDATE_NDL_CMD;
10602 msg.bodyptr = msg_body;
10603
10604 /* Set the request callback and the context */
10605 pMac->sme.dcc_update_ndl_callback = callback;
10606 pMac->sme.dcc_update_ndl_context = context;
10607
Rajeev Kumar8eaedf62017-01-21 11:03:13 -080010608 status = scheduler_post_msg(QDF_MODULE_ID_WMA, &msg);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010609 if (!QDF_IS_STATUS_SUCCESS(status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053010610 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010611 FL("Error posting message to WDA: %d"), status);
10612 pMac->sme.dcc_update_ndl_callback = NULL;
10613 pMac->sme.dcc_update_ndl_context = NULL;
Anurag Chouhan600c3a02016-03-01 10:33:54 +053010614 qdf_mem_free(msg_body);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010615 goto end;
10616 }
10617
10618end:
10619 sme_release_global_lock(&pMac->sme);
10620
10621 return status;
10622}
10623
10624/**
10625 * sme_register_for_dcc_stats_event() - Register for the periodic DCC stats
10626 * event
10627 * @hHal: reference to the HAL
10628 * @context: the context of the call
10629 * @callback: the callback to hdd
10630 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010631 * Return: QDF_STATUS_SUCCESS on success, QDF_STATUS_E_FAILURE on failure
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010632 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010633QDF_STATUS sme_register_for_dcc_stats_event(tHalHandle hHal, void *context,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010634 ocb_callback callback)
10635{
10636 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010637 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010638
10639 status = sme_acquire_global_lock(&pMac->sme);
10640 pMac->sme.dcc_stats_event_callback = callback;
10641 pMac->sme.dcc_stats_event_context = context;
10642 sme_release_global_lock(&pMac->sme);
10643
10644 return 0;
10645}
10646
Arun Khandavalli4b55da72016-07-19 19:55:01 +053010647/**
10648 * sme_deregister_for_dcc_stats_event() - De-Register for the periodic DCC stats
10649 * event
10650 * @h_hal: Hal Handle
10651 *
10652 * This function de-registers the DCC perioc stats callback
10653 *
10654 * Return: QDF_STATUS Enumeration
10655 */
10656QDF_STATUS sme_deregister_for_dcc_stats_event(tHalHandle h_hal)
10657{
10658 tpAniSirGlobal mac;
10659 QDF_STATUS status;
10660
10661 if (!h_hal) {
10662 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
10663 FL("h_hal is not valid"));
10664 return QDF_STATUS_E_INVAL;
10665 }
10666 mac = PMAC_STRUCT(h_hal);
10667
10668 status = sme_acquire_global_lock(&mac->sme);
10669 if (!QDF_IS_STATUS_SUCCESS(status)) {
10670 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
10671 FL("Failed to acquire global lock"));
10672 return status;
10673 }
10674 mac->sme.dcc_stats_event_callback = NULL;
10675 mac->sme.dcc_stats_event_context = NULL;
10676 sme_release_global_lock(&mac->sme);
10677
10678 return status;
10679}
Agrawal Ashishb141b092016-09-02 19:59:26 +053010680#endif
Arun Khandavalli4b55da72016-07-19 19:55:01 +053010681
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010682void sme_get_recovery_stats(tHalHandle hHal)
10683{
10684 uint8_t i;
10685
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053010686 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010687 "Self Recovery Stats");
10688 for (i = 0; i < MAX_ACTIVE_CMD_STATS; i++) {
10689 if (eSmeNoCommand !=
10690 g_self_recovery_stats.activeCmdStats[i].command) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053010691 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010692 "timestamp %llu: command 0x%0X: reason %d: session %d",
10693 g_self_recovery_stats.activeCmdStats[i].
10694 timestamp,
10695 g_self_recovery_stats.activeCmdStats[i].command,
10696 g_self_recovery_stats.activeCmdStats[i].reason,
10697 g_self_recovery_stats.activeCmdStats[i].
10698 sessionId);
10699 }
10700 }
10701}
10702
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010703QDF_STATUS sme_notify_modem_power_state(tHalHandle hHal, uint32_t value)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010704{
Rajeev Kumar37d478b2017-04-17 16:59:28 -070010705 struct scheduler_msg msg = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010706 tpSirModemPowerStateInd request_buf;
10707 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
10708
10709 if (NULL == pMac) {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010710 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010711 }
10712
Anurag Chouhan600c3a02016-03-01 10:33:54 +053010713 request_buf = qdf_mem_malloc(sizeof(tSirModemPowerStateInd));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010714 if (NULL == request_buf) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053010715 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010716 "%s: Not able to allocate memory for MODEM POWER STATE IND",
10717 __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010718 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010719 }
10720
10721 request_buf->param = value;
10722
10723 msg.type = WMA_MODEM_POWER_STATE_IND;
10724 msg.reserved = 0;
10725 msg.bodyptr = request_buf;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010726 if (!QDF_IS_STATUS_SUCCESS
Rajeev Kumar8eaedf62017-01-21 11:03:13 -080010727 (scheduler_post_msg(QDF_MODULE_ID_WMA, &msg))) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053010728 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010729 "%s: Not able to post WMA_MODEM_POWER_STATE_IND message"
10730 " to WMA", __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053010731 qdf_mem_free(request_buf);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010732 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010733 }
10734
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010735 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010736}
10737
10738#ifdef QCA_HT_2040_COEX
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010739QDF_STATUS sme_notify_ht2040_mode(tHalHandle hHal, uint16_t staId,
Anurag Chouhan6d760662016-02-20 16:05:43 +053010740 struct qdf_mac_addr macAddrSTA,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010741 uint8_t sessionId,
10742 uint8_t channel_type)
10743{
Rajeev Kumar37d478b2017-04-17 16:59:28 -070010744 struct scheduler_msg msg = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010745 tUpdateVHTOpMode *pHtOpMode = NULL;
10746 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
10747
10748 if (NULL == pMac) {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010749 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010750 }
10751
Anurag Chouhan600c3a02016-03-01 10:33:54 +053010752 pHtOpMode = qdf_mem_malloc(sizeof(tUpdateVHTOpMode));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010753 if (NULL == pHtOpMode) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053010754 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010755 "%s: Not able to allocate memory for setting OP mode",
10756 __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010757 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010758 }
10759
10760 switch (channel_type) {
10761 case eHT_CHAN_HT20:
10762 pHtOpMode->opMode = eHT_CHANNEL_WIDTH_20MHZ;
10763 break;
10764
10765 case eHT_CHAN_HT40MINUS:
10766 case eHT_CHAN_HT40PLUS:
10767 pHtOpMode->opMode = eHT_CHANNEL_WIDTH_40MHZ;
10768 break;
10769
10770 default:
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053010771 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010772 "%s: Invalid OP mode", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010773 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010774 }
10775
10776 pHtOpMode->staId = staId,
Anurag Chouhan600c3a02016-03-01 10:33:54 +053010777 qdf_mem_copy(pHtOpMode->peer_mac, macAddrSTA.bytes,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010778 sizeof(tSirMacAddr));
10779 pHtOpMode->smesessionId = sessionId;
10780
10781 msg.type = WMA_UPDATE_OP_MODE;
10782 msg.reserved = 0;
10783 msg.bodyptr = pHtOpMode;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010784 if (!QDF_IS_STATUS_SUCCESS
Rajeev Kumar8eaedf62017-01-21 11:03:13 -080010785 (scheduler_post_msg(QDF_MODULE_ID_WMA, &msg))) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053010786 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010787 "%s: Not able to post WMA_UPDATE_OP_MODE message"
10788 " to WMA", __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053010789 qdf_mem_free(pHtOpMode);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010790 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010791 }
10792
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053010793 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010794 "%s: Notifed FW about OP mode: %d for staId=%d",
10795 __func__, pHtOpMode->opMode, staId);
10796
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010797 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010798}
10799
10800/* ---------------------------------------------------------------------------
10801
10802 \fn sme_set_ht2040_mode
10803
10804 \brief To update HT Operation beacon IE.
10805
10806 \param
10807
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010808 \return QDF_STATUS SUCCESS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010809 FAILURE or RESOURCES
10810 The API finished and failed.
10811
10812 -------------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010813QDF_STATUS sme_set_ht2040_mode(tHalHandle hHal, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010814 uint8_t channel_type, bool obssEnabled)
10815{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010816 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010817 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
10818 ePhyChanBondState cbMode;
10819
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053010820 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010821 "%s: Update HT operation beacon IE, channel_type=%d",
10822 __func__, channel_type);
10823
10824 switch (channel_type) {
10825 case eHT_CHAN_HT20:
10826 cbMode = PHY_SINGLE_CHANNEL_CENTERED;
10827 break;
10828 case eHT_CHAN_HT40MINUS:
10829 cbMode = PHY_DOUBLE_CHANNEL_HIGH_PRIMARY;
10830 break;
10831 case eHT_CHAN_HT40PLUS:
10832 cbMode = PHY_DOUBLE_CHANNEL_LOW_PRIMARY;
10833 break;
10834 default:
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053010835 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010836 "%s:Error!!! Invalid HT20/40 mode !", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010837 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010838 }
10839 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010840 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010841 status = csr_set_ht2040_mode(pMac, sessionId,
10842 cbMode, obssEnabled);
10843 sme_release_global_lock(&pMac->sme);
10844 }
10845 return status;
10846}
10847
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010848#endif
10849
10850/*
10851 * SME API to enable/disable idle mode powersave
10852 * This should be called only if powersave offload
10853 * is enabled
10854 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010855QDF_STATUS sme_set_idle_powersave_config(void *cds_context,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010856 tHalHandle hHal, uint32_t value)
10857{
Anurag Chouhan6d760662016-02-20 16:05:43 +053010858 void *wmaContext = cds_get_context(QDF_MODULE_ID_WMA);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010859 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
10860
10861 if (NULL == wmaContext) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053010862 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010863 "%s: wmaContext is NULL", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010864 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010865 }
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053010866 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010867 " Idle Ps Set Value %d", value);
10868
10869 pMac->imps_enabled = false;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010870 if (QDF_STATUS_SUCCESS != wma_set_idle_ps_config(wmaContext, value)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053010871 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010872 " Failed to Set Idle Ps Value %d", value);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010873 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010874 }
10875 if (value)
10876 pMac->imps_enabled = true;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010877 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010878}
10879
10880int16_t sme_get_ht_config(tHalHandle hHal, uint8_t session_id, uint16_t ht_capab)
10881{
10882 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
10883 tCsrRoamSession *pSession = CSR_GET_SESSION(pMac, session_id);
10884
10885 if (NULL == pSession) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053010886 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010887 "%s: pSession is NULL", __func__);
10888 return -EIO;
10889 }
10890 switch (ht_capab) {
10891 case WNI_CFG_HT_CAP_INFO_ADVANCE_CODING:
10892 return pSession->htConfig.ht_rx_ldpc;
10893 case WNI_CFG_HT_CAP_INFO_TX_STBC:
10894 return pSession->htConfig.ht_tx_stbc;
10895 case WNI_CFG_HT_CAP_INFO_RX_STBC:
10896 return pSession->htConfig.ht_rx_stbc;
10897 case WNI_CFG_HT_CAP_INFO_SHORT_GI_20MHZ:
Sandeep Puligilla607f34a2016-05-25 14:37:47 -070010898 return pSession->htConfig.ht_sgi20;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010899 case WNI_CFG_HT_CAP_INFO_SHORT_GI_40MHZ:
Sandeep Puligilla607f34a2016-05-25 14:37:47 -070010900 return pSession->htConfig.ht_sgi40;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010901 default:
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053010902 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010903 "invalid ht capability");
10904 return -EIO;
10905 }
10906}
10907
10908int sme_update_ht_config(tHalHandle hHal, uint8_t sessionId, uint16_t htCapab,
10909 int value)
10910{
10911 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
10912 tCsrRoamSession *pSession = CSR_GET_SESSION(pMac, sessionId);
10913
10914 if (NULL == pSession) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053010915 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010916 "%s: pSession is NULL", __func__);
10917 return -EIO;
10918 }
10919
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010920 if (QDF_STATUS_SUCCESS != wma_set_htconfig(sessionId, htCapab, value)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053010921 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010922 "Failed to set ht capability in target");
10923 return -EIO;
10924 }
10925
10926 switch (htCapab) {
10927 case WNI_CFG_HT_CAP_INFO_ADVANCE_CODING:
10928 pSession->htConfig.ht_rx_ldpc = value;
10929 break;
10930 case WNI_CFG_HT_CAP_INFO_TX_STBC:
10931 pSession->htConfig.ht_tx_stbc = value;
10932 break;
10933 case WNI_CFG_HT_CAP_INFO_RX_STBC:
10934 pSession->htConfig.ht_rx_stbc = value;
10935 break;
10936 case WNI_CFG_HT_CAP_INFO_SHORT_GI_20MHZ:
Krishna Kumaar Natarajana5c5aad2016-12-05 14:12:13 -080010937 value = value ? 1 : 0; /* HT SGI can be only 1 or 0 */
Sandeep Puligilla607f34a2016-05-25 14:37:47 -070010938 pSession->htConfig.ht_sgi20 = value;
10939 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010940 case WNI_CFG_HT_CAP_INFO_SHORT_GI_40MHZ:
Krishna Kumaar Natarajana5c5aad2016-12-05 14:12:13 -080010941 value = value ? 1 : 0; /* HT SGI can be only 1 or 0 */
Sandeep Puligilla607f34a2016-05-25 14:37:47 -070010942 pSession->htConfig.ht_sgi40 = value;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010943 break;
10944 }
10945
10946 return 0;
10947}
10948
10949#define HT20_SHORT_GI_MCS7_RATE 722
10950/* ---------------------------------------------------------------------------
10951 \fn sme_send_rate_update_ind
10952 \brief API to Update rate
10953 \param hHal - The handle returned by mac_open
10954 \param rateUpdateParams - Pointer to rate update params
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010955 \return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010956 ---------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010957QDF_STATUS sme_send_rate_update_ind(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010958 tSirRateUpdateInd *rateUpdateParams)
10959{
10960 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010961 QDF_STATUS status;
Rajeev Kumar37d478b2017-04-17 16:59:28 -070010962 struct scheduler_msg msg = {0};
Anurag Chouhan600c3a02016-03-01 10:33:54 +053010963 tSirRateUpdateInd *rate_upd = qdf_mem_malloc(sizeof(tSirRateUpdateInd));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010964
10965 if (rate_upd == NULL) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053010966 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010967 "Rate update struct alloc failed");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010968 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010969 }
10970 *rate_upd = *rateUpdateParams;
10971
10972 if (rate_upd->mcastDataRate24GHz == HT20_SHORT_GI_MCS7_RATE)
10973 rate_upd->mcastDataRate24GHzTxFlag =
10974 eHAL_TX_RATE_HT20 | eHAL_TX_RATE_SGI;
10975 else if (rate_upd->reliableMcastDataRate ==
10976 HT20_SHORT_GI_MCS7_RATE)
10977 rate_upd->reliableMcastDataRateTxFlag =
10978 eHAL_TX_RATE_HT20 | eHAL_TX_RATE_SGI;
10979
10980 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010981 if (QDF_STATUS_SUCCESS == status) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010982 msg.type = WMA_RATE_UPDATE_IND;
10983 msg.bodyptr = rate_upd;
Sreelakshmi Konamki6a065362016-05-31 16:05:01 +053010984 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
10985 NO_SESSION, msg.type));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010986 if (!QDF_IS_STATUS_SUCCESS
Rajeev Kumar8eaedf62017-01-21 11:03:13 -080010987 (scheduler_post_msg(QDF_MODULE_ID_WMA, &msg))) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053010988 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010989 "%s: Not able "
10990 "to post WMA_SET_RMC_RATE_IND to WMA!",
10991 __func__);
10992
10993 sme_release_global_lock(&pMac->sme);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053010994 qdf_mem_free(rate_upd);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010995 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010996 }
10997
10998 sme_release_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010999 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011000 }
11001
11002 return status;
11003}
11004
11005/**
Kondabattini, Ganeshe4f18e02016-09-13 13:01:22 +053011006 * sme_update_access_policy_vendor_ie() - update vendor ie and access policy.
11007 * @hal: Pointer to the mac context
11008 * @session_id: sme session id
11009 * @vendor_ie: vendor ie
11010 * @access_policy: vendor ie access policy
11011 *
11012 * This function updates the vendor ie and access policy to lim.
11013 *
11014 * Return: success or failure.
11015 */
11016QDF_STATUS sme_update_access_policy_vendor_ie(tHalHandle hal,
11017 uint8_t session_id, uint8_t *vendor_ie, int access_policy)
11018{
11019 struct sme_update_access_policy_vendor_ie *msg;
11020 uint16_t msg_len;
11021 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Kondabattini, Ganeshe4f18e02016-09-13 13:01:22 +053011022
11023 msg_len = sizeof(*msg);
11024
11025 msg = qdf_mem_malloc(msg_len);
11026 if (!msg) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070011027 sme_err("failed to allocate memory for sme_update_access_policy_vendor_ie");
Kondabattini, Ganeshe4f18e02016-09-13 13:01:22 +053011028 return QDF_STATUS_E_FAILURE;
11029 }
11030
Kondabattini, Ganeshe4f18e02016-09-13 13:01:22 +053011031 msg->msg_type = (uint16_t)eWNI_SME_UPDATE_ACCESS_POLICY_VENDOR_IE;
11032 msg->length = (uint16_t)msg_len;
11033
11034 qdf_mem_copy(&msg->ie[0], vendor_ie, sizeof(msg->ie));
11035
11036 msg->sme_session_id = session_id;
11037 msg->access_policy = access_policy;
11038
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070011039 sme_debug("sme_session_id: %hu, access_policy: %d", session_id,
11040 access_policy);
Kondabattini, Ganeshe4f18e02016-09-13 13:01:22 +053011041
Rajeev Kumard138ac52017-01-30 18:38:37 -080011042 status = umac_send_mb_message_to_mac(msg);
Kondabattini, Ganeshe4f18e02016-09-13 13:01:22 +053011043
11044 return status;
11045}
11046
11047/**
Agrawal Ashishda3e9502016-09-21 17:43:51 +053011048 * sme_update_short_retry_limit_threshold() - update short frame retry limit TH
11049 * @hal: Handle returned by mac_open
11050 * @session_id: Session ID on which short frame retry limit needs to be
11051 * updated to FW
11052 * @short_limit_count_th: Retry count TH to retry short frame.
11053 *
11054 * This function is used to configure count to retry short frame.
11055 *
11056 * Return: QDF_STATUS
11057 */
11058QDF_STATUS sme_update_short_retry_limit_threshold(tHalHandle hal_handle,
11059 struct sme_short_retry_limit *short_retry_limit_th)
11060{
Agrawal Ashishda3e9502016-09-21 17:43:51 +053011061 QDF_STATUS status = QDF_STATUS_SUCCESS;
11062 struct sme_short_retry_limit *srl;
Rajeev Kumar37d478b2017-04-17 16:59:28 -070011063 struct scheduler_msg msg = {0};
Agrawal Ashishda3e9502016-09-21 17:43:51 +053011064
11065 srl = qdf_mem_malloc(sizeof(*srl));
11066 if (NULL == srl) {
11067 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
11068 "%s: fail to alloc short retry limit", __func__);
11069 return QDF_STATUS_E_FAILURE;
11070 }
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070011071 sme_debug("session_id %d short retry limit count: %d",
Agrawal Ashishda3e9502016-09-21 17:43:51 +053011072 short_retry_limit_th->session_id,
11073 short_retry_limit_th->short_retry_limit);
11074
11075 srl->session_id = short_retry_limit_th->session_id;
11076 srl->short_retry_limit = short_retry_limit_th->short_retry_limit;
11077
11078 qdf_mem_zero(&msg, sizeof(msg));
11079 msg.type = SIR_HAL_SHORT_RETRY_LIMIT_CNT;
11080 msg.reserved = 0;
11081 msg.bodyptr = srl;
Rajeev Kumar8eaedf62017-01-21 11:03:13 -080011082 status = scheduler_post_msg(QDF_MODULE_ID_WMA, &msg);
Agrawal Ashishda3e9502016-09-21 17:43:51 +053011083 if (status != QDF_STATUS_SUCCESS) {
11084 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
11085 FL("Not able to post short retry limit count to WDA"));
11086 qdf_mem_free(srl);
11087 return QDF_STATUS_E_FAILURE;
11088 }
11089
11090 return status;
11091}
11092
11093/**
11094 * sme_update_long_retry_limit_threshold() - update long retry limit TH
11095 * @hal: Handle returned by mac_open
11096 * @session_id: Session ID on which long frames retry TH needs to be updated
11097 * to FW
11098 * @long_limit_count_th: Retry count to retry long frame.
11099 *
11100 * This function is used to configure TH to retry long frame.
11101 *
11102 * Return: QDF_STATUS
11103*/
11104QDF_STATUS sme_update_long_retry_limit_threshold(tHalHandle hal_handle,
11105 struct sme_long_retry_limit *long_retry_limit_th)
11106{
Agrawal Ashishda3e9502016-09-21 17:43:51 +053011107 QDF_STATUS status = QDF_STATUS_SUCCESS;
11108 struct sme_long_retry_limit *lrl;
Rajeev Kumar37d478b2017-04-17 16:59:28 -070011109 struct scheduler_msg msg = {0};
Agrawal Ashishda3e9502016-09-21 17:43:51 +053011110
11111 lrl = qdf_mem_malloc(sizeof(*lrl));
11112 if (NULL == lrl) {
11113 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
11114 "%s: fail to alloc long retry limit", __func__);
11115 return QDF_STATUS_E_FAILURE;
11116 }
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070011117 sme_debug("session_id %d long retry limit count: %d",
Agrawal Ashishda3e9502016-09-21 17:43:51 +053011118 long_retry_limit_th->session_id,
11119 long_retry_limit_th->long_retry_limit);
11120
11121 lrl->session_id = long_retry_limit_th->session_id;
11122 lrl->long_retry_limit = long_retry_limit_th->long_retry_limit;
11123
11124 qdf_mem_zero(&msg, sizeof(msg));
11125 msg.type = SIR_HAL_LONG_RETRY_LIMIT_CNT;
11126 msg.reserved = 0;
11127 msg.bodyptr = lrl;
Rajeev Kumar8eaedf62017-01-21 11:03:13 -080011128 status = scheduler_post_msg(QDF_MODULE_ID_WMA, &msg);
Agrawal Ashishda3e9502016-09-21 17:43:51 +053011129
11130 if (status != QDF_STATUS_SUCCESS) {
11131 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
11132 FL("Not able to post long retry limit count to WDA"));
11133 qdf_mem_free(lrl);
11134 return QDF_STATUS_E_FAILURE;
11135 }
11136
11137 return status;
11138}
11139
11140/**
Agrawal, Ashish4e5fa1c2016-09-21 19:03:43 +053011141 * sme_update_sta_inactivity_timeout(): Update sta_inactivity_timeout to FW
11142 * @hal: Handle returned by mac_open
11143 * @session_id: Session ID on which sta_inactivity_timeout needs
11144 * to be updated to FW
11145 * @sta_inactivity_timeout: sta inactivity timeout.
11146 *
11147 * If a station does not send anything in sta_inactivity_timeout seconds, an
11148 * empty data frame is sent to it in order to verify whether it is
11149 * still in range. If this frame is not ACKed, the station will be
11150 * disassociated and then deauthenticated.
11151 *
11152 * Return: QDF_STATUS_SUCCESS or non-zero on failure.
11153*/
11154QDF_STATUS sme_update_sta_inactivity_timeout(tHalHandle hal_handle,
11155 struct sme_sta_inactivity_timeout *sta_inactivity_timer)
11156{
11157 struct sme_sta_inactivity_timeout *inactivity_time;
11158 void *wma_handle;
11159
11160 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
11161 inactivity_time = qdf_mem_malloc(sizeof(*inactivity_time));
11162 if (NULL == inactivity_time) {
11163 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
11164 "%s: fail to alloc inactivity_time", __func__);
11165 return QDF_STATUS_E_FAILURE;
11166 }
11167 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO,
11168 FL("sta_inactivity_timeout: %d"),
11169 sta_inactivity_timer->sta_inactivity_timeout);
11170 inactivity_time->session_id = sta_inactivity_timer->session_id;
11171 inactivity_time->sta_inactivity_timeout =
11172 sta_inactivity_timer->sta_inactivity_timeout;
11173
11174 wma_update_sta_inactivity_timeout(wma_handle,
11175 inactivity_time);
11176 return QDF_STATUS_SUCCESS;
11177}
11178
11179/**
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011180 * sme_get_reg_info() - To get registration info
11181 * @hHal: HAL context
11182 * @chanId: channel id
11183 * @regInfo1: first reg info to fill
11184 * @regInfo2: second reg info to fill
11185 *
11186 * This routine will give you reg info
11187 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011188 * Return: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011189 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011190QDF_STATUS sme_get_reg_info(tHalHandle hHal, uint8_t chanId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011191 uint32_t *regInfo1, uint32_t *regInfo2)
11192{
11193 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011194 QDF_STATUS status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011195 uint8_t i;
11196 bool found = false;
11197
11198 status = sme_acquire_global_lock(&pMac->sme);
11199 *regInfo1 = 0;
11200 *regInfo2 = 0;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011201 if (!QDF_IS_STATUS_SUCCESS(status))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011202 return status;
11203
11204 for (i = 0; i < WNI_CFG_VALID_CHANNEL_LIST_LEN; i++) {
Amar Singhala297bfa2015-10-15 15:07:29 -070011205 if (pMac->scan.defaultPowerTable[i].chan_num == chanId) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011206 SME_SET_CHANNEL_REG_POWER(*regInfo1,
Amar Singhal5cccafe2017-02-15 12:42:58 -080011207 pMac->scan.defaultPowerTable[i].tx_power);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011208
11209 SME_SET_CHANNEL_MAX_TX_POWER(*regInfo2,
Amar Singhal5cccafe2017-02-15 12:42:58 -080011210 pMac->scan.defaultPowerTable[i].tx_power);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011211 found = true;
11212 break;
11213 }
11214 }
11215 if (!found)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011216 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011217
11218 sme_release_global_lock(&pMac->sme);
11219 return status;
11220}
11221
11222#ifdef FEATURE_WLAN_AUTO_SHUTDOWN
11223/* ---------------------------------------------------------------------------
11224 \fn sme_auto_shutdown_cb
11225 \brief Used to plug in callback function for receiving auto shutdown evt
11226 \param hHal
11227 \param pCallbackfn : callback function pointer should be plugged in
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011228 \- return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011229 -------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011230QDF_STATUS sme_set_auto_shutdown_cb(tHalHandle hHal, void (*pCallbackfn)(void)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011231 ) {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011232 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011233 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
11234
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053011235 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011236 "%s: Plug in Auto shutdown event callback", __func__);
11237
11238 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011239 if (QDF_STATUS_SUCCESS == status) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011240 if (NULL != pCallbackfn) {
11241 pMac->sme.pAutoShutdownNotificationCb = pCallbackfn;
11242 }
11243 sme_release_global_lock(&pMac->sme);
11244 }
11245
11246 return status;
11247}
11248
11249/* ---------------------------------------------------------------------------
11250 \fn sme_set_auto_shutdown_timer
11251 \API to set auto shutdown timer value in FW.
11252 \param hHal - The handle returned by mac_open
11253 \param timer_val - The auto shutdown timer value to be set
11254 \- return Configuration message posting status, SUCCESS or Fail
11255 -------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011256QDF_STATUS sme_set_auto_shutdown_timer(tHalHandle hHal, uint32_t timer_val)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011257{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011258 QDF_STATUS status = QDF_STATUS_SUCCESS;
11259 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011260 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
11261 tSirAutoShutdownCmdParams *auto_sh_cmd;
Rajeev Kumar37d478b2017-04-17 16:59:28 -070011262 struct scheduler_msg message = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011263
11264 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011265 if (QDF_STATUS_SUCCESS == status) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011266 auto_sh_cmd = (tSirAutoShutdownCmdParams *)
Anurag Chouhan600c3a02016-03-01 10:33:54 +053011267 qdf_mem_malloc(sizeof(tSirAutoShutdownCmdParams));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011268 if (auto_sh_cmd == NULL) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053011269 QDF_TRACE(QDF_MODULE_ID_HDD, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011270 "%s Request Buffer Alloc Fail", __func__);
11271 sme_release_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011272 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011273 }
11274
11275 auto_sh_cmd->timer_val = timer_val;
11276
11277 /* serialize the req through MC thread */
Rajeev Kumar8eaedf62017-01-21 11:03:13 -080011278 message.bodyptr = auto_sh_cmd;
11279 message.type = WMA_SET_AUTO_SHUTDOWN_TIMER_REQ;
11280 qdf_status = scheduler_post_msg(QDF_MODULE_ID_WMA,
11281 &message);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011282 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053011283 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011284 "%s: Post Auto shutdown MSG fail", __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053011285 qdf_mem_free(auto_sh_cmd);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011286 sme_release_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011287 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011288 }
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053011289 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011290 "%s: Posted Auto shutdown MSG", __func__);
11291 sme_release_global_lock(&pMac->sme);
11292 }
11293
11294 return status;
11295}
11296#endif
11297
11298#ifdef FEATURE_WLAN_CH_AVOID
11299/* ---------------------------------------------------------------------------
11300 \fn sme_add_ch_avoid_callback
11301 \brief Used to plug in callback function
11302 Which notify channel may not be used with SAP or P2PGO mode.
11303 Notification come from FW.
11304 \param hHal
11305 \param pCallbackfn : callback function pointer should be plugged in
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011306 \- return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011307 -------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011308QDF_STATUS sme_add_ch_avoid_callback
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011309 (tHalHandle hHal, void (*pCallbackfn)(void *pAdapter, void *indParam)
11310 ) {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011311 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011312 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
11313
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053011314 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011315 "%s: Plug in CH AVOID CB", __func__);
11316
11317 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011318 if (QDF_STATUS_SUCCESS == status) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011319 if (NULL != pCallbackfn) {
11320 pMac->sme.pChAvoidNotificationCb = pCallbackfn;
11321 }
11322 sme_release_global_lock(&pMac->sme);
11323 }
11324
11325 return status;
11326}
11327
11328/* ---------------------------------------------------------------------------
11329 \fn sme_ch_avoid_update_req
11330 \API to request channel avoidance update from FW.
11331 \param hHal - The handle returned by mac_open
11332 \param update_type - The udpate_type parameter of this request call
11333 \- return Configuration message posting status, SUCCESS or Fail
11334 -------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011335QDF_STATUS sme_ch_avoid_update_req(tHalHandle hHal)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011336{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011337 QDF_STATUS status = QDF_STATUS_SUCCESS;
11338 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011339 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
11340 tSirChAvoidUpdateReq *cauReq;
Rajeev Kumar37d478b2017-04-17 16:59:28 -070011341 struct scheduler_msg message = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011342
11343 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011344 if (QDF_STATUS_SUCCESS == status) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011345 cauReq = (tSirChAvoidUpdateReq *)
Anurag Chouhan600c3a02016-03-01 10:33:54 +053011346 qdf_mem_malloc(sizeof(tSirChAvoidUpdateReq));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011347 if (NULL == cauReq) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053011348 QDF_TRACE(QDF_MODULE_ID_HDD, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011349 "%s Request Buffer Alloc Fail", __func__);
11350 sme_release_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011351 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011352 }
11353
11354 cauReq->reserved_param = 0;
11355
11356 /* serialize the req through MC thread */
Rajeev Kumar8eaedf62017-01-21 11:03:13 -080011357 message.bodyptr = cauReq;
11358 message.type = WMA_CH_AVOID_UPDATE_REQ;
11359 qdf_status = scheduler_post_msg(QDF_MODULE_ID_WMA,
11360 &message);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011361 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053011362 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011363 "%s: Post Ch Avoid Update MSG fail",
11364 __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053011365 qdf_mem_free(cauReq);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011366 sme_release_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011367 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011368 }
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053011369 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011370 "%s: Posted Ch Avoid Update MSG", __func__);
11371 sme_release_global_lock(&pMac->sme);
11372 }
11373
11374 return status;
11375}
11376#endif /* FEATURE_WLAN_CH_AVOID */
11377
11378/**
11379 * sme_set_miracast() - Function to set miracast value to UMAC
11380 * @hal: Handle returned by macOpen
11381 * @filter_type: 0-Disabled, 1-Source, 2-sink
11382 *
11383 * This function passes down the value of miracast set by
11384 * framework to UMAC
11385 *
11386 * Return: Configuration message posting status, SUCCESS or Fail
11387 *
11388 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011389QDF_STATUS sme_set_miracast(tHalHandle hal, uint8_t filter_type)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011390{
Rajeev Kumar37d478b2017-04-17 16:59:28 -070011391 struct scheduler_msg msg = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011392 uint32_t *val;
11393 tpAniSirGlobal mac_ptr = PMAC_STRUCT(hal);
11394
Anurag Chouhan600c3a02016-03-01 10:33:54 +053011395 val = qdf_mem_malloc(sizeof(*val));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011396 if (NULL == val || NULL == mac_ptr) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053011397 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011398 "%s: Invalid pointer", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011399 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011400 }
11401
11402 *val = filter_type;
11403
11404 msg.type = SIR_HAL_SET_MIRACAST;
11405 msg.reserved = 0;
11406 msg.bodyptr = val;
11407
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011408 if (!QDF_IS_STATUS_SUCCESS(
Rajeev Kumar8eaedf62017-01-21 11:03:13 -080011409 scheduler_post_msg(QDF_MODULE_ID_WMA, &msg))) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053011410 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011411 "%s: Not able to post WDA_SET_MAS_ENABLE_DISABLE to WMA!",
11412 __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053011413 qdf_mem_free(val);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011414 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011415 }
11416
11417 mac_ptr->sme.miracast_value = filter_type;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011418 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011419}
11420
11421/**
11422 * sme_set_mas() - Function to set MAS value to UMAC
11423 * @val: 1-Enable, 0-Disable
11424 *
11425 * This function passes down the value of MAS to the UMAC. A
11426 * value of 1 will enable MAS and a value of 0 will disable MAS
11427 *
11428 * Return: Configuration message posting status, SUCCESS or Fail
11429 *
11430 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011431QDF_STATUS sme_set_mas(uint32_t val)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011432{
Rajeev Kumar37d478b2017-04-17 16:59:28 -070011433 struct scheduler_msg msg = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011434 uint32_t *ptr_val;
11435
Anurag Chouhan600c3a02016-03-01 10:33:54 +053011436 ptr_val = qdf_mem_malloc(sizeof(*ptr_val));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011437 if (NULL == ptr_val) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053011438 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011439 "%s: could not allocate ptr_val", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011440 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011441 }
11442
11443 *ptr_val = val;
11444
11445 msg.type = SIR_HAL_SET_MAS;
11446 msg.reserved = 0;
11447 msg.bodyptr = ptr_val;
11448
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011449 if (!QDF_IS_STATUS_SUCCESS(
Rajeev Kumar8eaedf62017-01-21 11:03:13 -080011450 scheduler_post_msg(QDF_MODULE_ID_WMA, &msg))) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053011451 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011452 "%s: Not able to post WDA_SET_MAS_ENABLE_DISABLE to WMA!",
11453 __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053011454 qdf_mem_free(ptr_val);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011455 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011456 }
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011457 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011458}
11459
Kiran Kumar Lokere999e58c2016-01-07 02:18:39 -080011460/**
11461 * sme_roam_channel_change_req() - Channel change to new target channel
11462 * @hHal: handle returned by mac_open
11463 * @bssid: mac address of BSS
11464 * @ch_params: target channel information
11465 * @profile: CSR profile
11466 *
11467 * API to Indicate Channel change to new target channel
11468 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011469 * Return: QDF_STATUS
Kiran Kumar Lokere999e58c2016-01-07 02:18:39 -080011470 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011471QDF_STATUS sme_roam_channel_change_req(tHalHandle hHal,
Amar Singhale4f28ee2015-10-21 14:36:56 -070011472 struct qdf_mac_addr bssid,
Amar Singhal5cccafe2017-02-15 12:42:58 -080011473 struct ch_params *ch_params,
Amar Singhale4f28ee2015-10-21 14:36:56 -070011474 tCsrRoamProfile *profile)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011475{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011476 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011477 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011478
11479 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011480 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011481
Kiran Kumar Lokere999e58c2016-01-07 02:18:39 -080011482 status = csr_roam_channel_change_req(pMac, bssid, ch_params,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011483 profile);
11484 sme_release_global_lock(&pMac->sme);
11485 }
11486 return status;
11487}
11488
11489/* -------------------------------------------------------------------------
11490 \fn sme_process_channel_change_resp
11491 \brief API to Indicate Channel change response message to SAP.
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011492 \return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011493 ---------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011494QDF_STATUS sme_process_channel_change_resp(tpAniSirGlobal pMac,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011495 uint16_t msg_type, void *pMsgBuf)
11496{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011497 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011498 tCsrRoamInfo proam_info = { 0 };
11499 eCsrRoamResult roamResult;
11500 tpSwitchChannelParams pChnlParams = (tpSwitchChannelParams) pMsgBuf;
11501 uint32_t SessionId = pChnlParams->peSessionId;
11502
11503 proam_info.channelChangeRespEvent =
11504 (tSirChanChangeResponse *)
Anurag Chouhan600c3a02016-03-01 10:33:54 +053011505 qdf_mem_malloc(sizeof(tSirChanChangeResponse));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011506 if (NULL == proam_info.channelChangeRespEvent) {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011507 status = QDF_STATUS_E_NOMEM;
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070011508 sme_err("Channel Change Event Allocation Failed: %d\n", status);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011509 return status;
11510 }
11511 if (msg_type == eWNI_SME_CHANNEL_CHANGE_RSP) {
11512 proam_info.channelChangeRespEvent->sessionId = SessionId;
11513 proam_info.channelChangeRespEvent->newChannelNumber =
11514 pChnlParams->channelNumber;
11515 proam_info.channelChangeRespEvent->secondaryChannelOffset =
11516 pChnlParams->ch_width;
11517
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011518 if (pChnlParams->status == QDF_STATUS_SUCCESS) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053011519 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO_MED,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011520 "sapdfs: Received success eWNI_SME_CHANNEL_CHANGE_RSP for sessionId[%d]",
11521 SessionId);
11522 proam_info.channelChangeRespEvent->channelChangeStatus =
11523 1;
11524 roamResult = eCSR_ROAM_RESULT_CHANNEL_CHANGE_SUCCESS;
11525 } else {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053011526 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO_MED,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011527 "sapdfs: Received failure eWNI_SME_CHANNEL_CHANGE_RSP for sessionId[%d]",
11528 SessionId);
11529 proam_info.channelChangeRespEvent->channelChangeStatus =
11530 0;
11531 roamResult = eCSR_ROAM_RESULT_CHANNEL_CHANGE_FAILURE;
11532 }
11533
11534 csr_roam_call_callback(pMac, SessionId, &proam_info, 0,
11535 eCSR_ROAM_SET_CHANNEL_RSP, roamResult);
11536
11537 } else {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011538 status = QDF_STATUS_E_FAILURE;
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070011539 sme_err("Invalid Channel Change Resp Message: %d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011540 status);
11541 }
Anurag Chouhan600c3a02016-03-01 10:33:54 +053011542 qdf_mem_free(proam_info.channelChangeRespEvent);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011543
11544 return status;
11545}
11546
11547/* -------------------------------------------------------------------------
11548 \fn sme_roam_start_beacon_req
11549 \brief API to Indicate LIM to start Beacon Tx
11550 \after SAP CAC Wait is completed.
11551 \param hHal - The handle returned by mac_open
11552 \param sessionId - session ID
11553 \param dfsCacWaitStatus - CAC WAIT status flag
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011554 \return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011555 ---------------------------------------------------------------------------*/
Anurag Chouhan6d760662016-02-20 16:05:43 +053011556QDF_STATUS sme_roam_start_beacon_req(tHalHandle hHal, struct qdf_mac_addr bssid,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011557 uint8_t dfsCacWaitStatus)
11558{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011559 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011560 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
11561 status = sme_acquire_global_lock(&pMac->sme);
11562
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011563 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011564 status = csr_roam_start_beacon_req(pMac, bssid, dfsCacWaitStatus);
11565 sme_release_global_lock(&pMac->sme);
11566 }
11567 return status;
11568}
11569
Kiran Kumar Lokere999e58c2016-01-07 02:18:39 -080011570/**
11571 * sme_roam_csa_ie_request() - request CSA IE transmission from PE
11572 * @hHal: handle returned by mac_open
11573 * @bssid: SAP bssid
11574 * @targetChannel: target channel information
11575 * @csaIeReqd: CSA IE Request
11576 * @ch_params: channel information
11577 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011578 * Return: QDF_STATUS
Kiran Kumar Lokere999e58c2016-01-07 02:18:39 -080011579 */
Anurag Chouhan6d760662016-02-20 16:05:43 +053011580QDF_STATUS sme_roam_csa_ie_request(tHalHandle hHal, struct qdf_mac_addr bssid,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011581 uint8_t targetChannel, uint8_t csaIeReqd,
Amar Singhal5cccafe2017-02-15 12:42:58 -080011582 struct ch_params *ch_params)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011583{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011584 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011585 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
11586 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011587 if (QDF_IS_STATUS_SUCCESS(status)) {
Kiran Kumar Lokere999e58c2016-01-07 02:18:39 -080011588 status = csr_roam_send_chan_sw_ie_request(pMac, bssid,
11589 targetChannel, csaIeReqd, ch_params);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011590 sme_release_global_lock(&pMac->sme);
11591 }
11592 return status;
11593}
11594
11595/* ---------------------------------------------------------------------------
11596 \fn sme_init_thermal_info
11597 \brief SME API to initialize the thermal mitigation parameters
11598 \param hHal
11599 \param thermalParam : thermal mitigation parameters
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011600 \- return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011601 -------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011602QDF_STATUS sme_init_thermal_info(tHalHandle hHal, tSmeThermalParams thermalParam)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011603{
11604 t_thermal_mgmt *pWmaParam;
Rajeev Kumar37d478b2017-04-17 16:59:28 -070011605 struct scheduler_msg msg = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011606 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
11607
Anurag Chouhan600c3a02016-03-01 10:33:54 +053011608 pWmaParam = (t_thermal_mgmt *) qdf_mem_malloc(sizeof(t_thermal_mgmt));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011609 if (NULL == pWmaParam) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053011610 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011611 "%s: could not allocate tThermalMgmt", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011612 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011613 }
11614
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011615 pWmaParam->thermalMgmtEnabled = thermalParam.smeThermalMgmtEnabled;
11616 pWmaParam->throttlePeriod = thermalParam.smeThrottlePeriod;
Poddar, Siddarth83905022016-04-16 17:56:08 -070011617
11618 pWmaParam->throttle_duty_cycle_tbl[0] =
11619 thermalParam.sme_throttle_duty_cycle_tbl[0];
11620 pWmaParam->throttle_duty_cycle_tbl[1] =
11621 thermalParam.sme_throttle_duty_cycle_tbl[1];
11622 pWmaParam->throttle_duty_cycle_tbl[2] =
11623 thermalParam.sme_throttle_duty_cycle_tbl[2];
11624 pWmaParam->throttle_duty_cycle_tbl[3] =
11625 thermalParam.sme_throttle_duty_cycle_tbl[3];
11626
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011627 pWmaParam->thermalLevels[0].minTempThreshold =
11628 thermalParam.smeThermalLevels[0].smeMinTempThreshold;
11629 pWmaParam->thermalLevels[0].maxTempThreshold =
11630 thermalParam.smeThermalLevels[0].smeMaxTempThreshold;
11631 pWmaParam->thermalLevels[1].minTempThreshold =
11632 thermalParam.smeThermalLevels[1].smeMinTempThreshold;
11633 pWmaParam->thermalLevels[1].maxTempThreshold =
11634 thermalParam.smeThermalLevels[1].smeMaxTempThreshold;
11635 pWmaParam->thermalLevels[2].minTempThreshold =
11636 thermalParam.smeThermalLevels[2].smeMinTempThreshold;
11637 pWmaParam->thermalLevels[2].maxTempThreshold =
11638 thermalParam.smeThermalLevels[2].smeMaxTempThreshold;
11639 pWmaParam->thermalLevels[3].minTempThreshold =
11640 thermalParam.smeThermalLevels[3].smeMinTempThreshold;
11641 pWmaParam->thermalLevels[3].maxTempThreshold =
11642 thermalParam.smeThermalLevels[3].smeMaxTempThreshold;
11643
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011644 if (QDF_STATUS_SUCCESS == sme_acquire_global_lock(&pMac->sme)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011645 msg.type = WMA_INIT_THERMAL_INFO_CMD;
11646 msg.bodyptr = pWmaParam;
11647
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011648 if (!QDF_IS_STATUS_SUCCESS
Rajeev Kumar8eaedf62017-01-21 11:03:13 -080011649 (scheduler_post_msg(QDF_MODULE_ID_WMA, &msg))) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053011650 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011651 "%s: Not able to post WMA_SET_THERMAL_INFO_CMD to WMA!",
11652 __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053011653 qdf_mem_free(pWmaParam);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011654 sme_release_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011655 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011656 }
11657 sme_release_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011658 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011659 }
Anurag Chouhan600c3a02016-03-01 10:33:54 +053011660 qdf_mem_free(pWmaParam);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011661 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011662}
11663
11664/**
11665 * sme_add_set_thermal_level_callback() - Plug in set thermal level callback
11666 * @hal: Handle returned by macOpen
11667 * @callback: sme_set_thermal_level_callback
11668 *
11669 * Plug in set thermal level callback
11670 *
11671 * Return: none
11672 */
11673void sme_add_set_thermal_level_callback(tHalHandle hal,
11674 sme_set_thermal_level_callback callback)
11675{
11676 tpAniSirGlobal pMac = PMAC_STRUCT(hal);
11677
11678 pMac->sme.set_thermal_level_cb = callback;
11679}
11680
11681/**
11682 * sme_set_thermal_level() - SME API to set the thermal mitigation level
11683 * @hal: Handler to HAL
11684 * @level: Thermal mitigation level
11685 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011686 * Return: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011687 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011688QDF_STATUS sme_set_thermal_level(tHalHandle hal, uint8_t level)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011689{
Rajeev Kumar37d478b2017-04-17 16:59:28 -070011690 struct scheduler_msg msg = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011691 tpAniSirGlobal pMac = PMAC_STRUCT(hal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011692 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011693
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011694 if (QDF_STATUS_SUCCESS == sme_acquire_global_lock(&pMac->sme)) {
Anurag Chouhan600c3a02016-03-01 10:33:54 +053011695 qdf_mem_set(&msg, sizeof(msg), 0);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011696 msg.type = WMA_SET_THERMAL_LEVEL;
11697 msg.bodyval = level;
11698
Rajeev Kumar8eaedf62017-01-21 11:03:13 -080011699 qdf_status = scheduler_post_msg(QDF_MODULE_ID_WMA, &msg);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011700 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053011701 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011702 "%s: Not able to post WMA_SET_THERMAL_LEVEL to WMA!",
11703 __func__);
11704 sme_release_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011705 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011706 }
11707 sme_release_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011708 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011709 }
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011710 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011711}
11712
11713/* ---------------------------------------------------------------------------
11714 \fn sme_txpower_limit
11715 \brief SME API to set txpower limits
11716 \param hHal
11717 \param psmetx : power limits for 2g/5g
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011718 \- return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011719 -------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011720QDF_STATUS sme_txpower_limit(tHalHandle hHal, tSirTxPowerLimit *psmetx)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011721{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011722 QDF_STATUS status = QDF_STATUS_SUCCESS;
11723 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Rajeev Kumar37d478b2017-04-17 16:59:28 -070011724 struct scheduler_msg message = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011725 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Prashanth Bhatta75fa9a12016-01-11 18:30:08 -080011726 tSirTxPowerLimit *tx_power_limit;
11727
Anurag Chouhan600c3a02016-03-01 10:33:54 +053011728 tx_power_limit = qdf_mem_malloc(sizeof(*tx_power_limit));
Prashanth Bhatta75fa9a12016-01-11 18:30:08 -080011729 if (!tx_power_limit) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053011730 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prashanth Bhatta75fa9a12016-01-11 18:30:08 -080011731 "%s: Memory allocation for TxPowerLimit failed!",
11732 __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011733 return QDF_STATUS_E_FAILURE;
Prashanth Bhatta75fa9a12016-01-11 18:30:08 -080011734 }
11735
11736 *tx_power_limit = *psmetx;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011737
11738 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011739 if (QDF_IS_STATUS_SUCCESS(status)) {
Rajeev Kumar8eaedf62017-01-21 11:03:13 -080011740 message.type = WMA_TX_POWER_LIMIT;
11741 message.reserved = 0;
11742 message.bodyptr = tx_power_limit;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011743
Rajeev Kumar8eaedf62017-01-21 11:03:13 -080011744 qdf_status = scheduler_post_msg(QDF_MODULE_ID_WMA,
11745 &message);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011746 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053011747 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011748 "%s: not able to post WMA_TX_POWER_LIMIT",
11749 __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011750 status = QDF_STATUS_E_FAILURE;
Anurag Chouhan600c3a02016-03-01 10:33:54 +053011751 qdf_mem_free(tx_power_limit);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011752 }
11753 sme_release_global_lock(&pMac->sme);
11754 }
11755 return status;
11756}
11757
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011758QDF_STATUS sme_update_connect_debug(tHalHandle hHal, uint32_t set_value)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011759{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011760 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011761 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
11762 pMac->fEnableDebugLog = set_value;
11763 return status;
11764}
11765
11766/* ---------------------------------------------------------------------------
11767 \fn sme_ap_disable_intra_bss_fwd
11768
11769 \brief
11770 SME will send message to WMA to set Intra BSS in txrx
11771
11772 \param
11773
11774 hHal - The handle returned by mac_open
11775
11776 sessionId - session id ( vdev id)
11777
11778 disablefwd - bool value that indicate disable intrabss fwd disable
11779
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011780 \return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011781 --------------------------------------------------------------------------- */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011782QDF_STATUS sme_ap_disable_intra_bss_fwd(tHalHandle hHal, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011783 bool disablefwd)
11784{
11785 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011786 int status = QDF_STATUS_SUCCESS;
11787 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Rajeev Kumar37d478b2017-04-17 16:59:28 -070011788 struct scheduler_msg message = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011789 tpDisableIntraBssFwd pSapDisableIntraFwd = NULL;
11790
11791 /* Prepare the request to send to SME. */
Anurag Chouhan600c3a02016-03-01 10:33:54 +053011792 pSapDisableIntraFwd = qdf_mem_malloc(sizeof(tDisableIntraBssFwd));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011793 if (NULL == pSapDisableIntraFwd) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070011794 sme_err("Memory Allocation Failure!!!");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011795 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011796 }
11797
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011798 pSapDisableIntraFwd->sessionId = sessionId;
11799 pSapDisableIntraFwd->disableintrabssfwd = disablefwd;
11800
11801 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011802 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011803 /* serialize the req through MC thread */
Rajeev Kumar8eaedf62017-01-21 11:03:13 -080011804 message.bodyptr = pSapDisableIntraFwd;
11805 message.type = WMA_SET_SAP_INTRABSS_DIS;
11806 qdf_status = scheduler_post_msg(QDF_MODULE_ID_WMA,
11807 &message);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011808 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
11809 status = QDF_STATUS_E_FAILURE;
Anurag Chouhan600c3a02016-03-01 10:33:54 +053011810 qdf_mem_free(pSapDisableIntraFwd);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011811 }
11812 sme_release_global_lock(&pMac->sme);
11813 }
11814 return status;
11815}
11816
11817#ifdef WLAN_FEATURE_STATS_EXT
11818
11819/******************************************************************************
11820 \fn sme_stats_ext_register_callback
11821
11822 \brief
11823 a function called to register the callback that send vendor event for stats
11824 ext
11825
11826 \param callback - callback to be registered
11827******************************************************************************/
11828void sme_stats_ext_register_callback(tHalHandle hHal, StatsExtCallback callback)
11829{
11830 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
11831
11832 pMac->sme.StatsExtCallback = callback;
11833}
11834
Arun Khandavalli4b55da72016-07-19 19:55:01 +053011835/**
11836 * sme_stats_ext_deregister_callback() - De-register ext stats callback
11837 * @h_hal: Hal Handle
11838 *
11839 * This function is called to de initialize the HDD NAN feature. Currently
11840 * the only operation required is to de-register a callback with SME.
11841 *
11842 * Return: None
11843 */
11844void sme_stats_ext_deregister_callback(tHalHandle h_hal)
11845{
11846 tpAniSirGlobal pmac;
11847
11848 if (!h_hal) {
11849 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
11850 FL("hHal is not valid"));
11851 return;
11852 }
11853
11854 pmac = PMAC_STRUCT(h_hal);
11855 pmac->sme.StatsExtCallback = NULL;
11856}
11857
11858
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011859/******************************************************************************
11860 \fn sme_stats_ext_request
11861
11862 \brief
11863 a function called when HDD receives STATS EXT vendor command from userspace
11864
11865 \param sessionID - vdevID for the stats ext request
11866
11867 \param input - Stats Ext Request structure ptr
11868
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011869 \return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011870******************************************************************************/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011871QDF_STATUS sme_stats_ext_request(uint8_t session_id, tpStatsExtRequestReq input)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011872{
Rajeev Kumar37d478b2017-04-17 16:59:28 -070011873 struct scheduler_msg msg = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011874 tpStatsExtRequest data;
11875 size_t data_len;
11876
11877 data_len = sizeof(tStatsExtRequest) + input->request_data_len;
Anurag Chouhan600c3a02016-03-01 10:33:54 +053011878 data = qdf_mem_malloc(data_len);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011879
11880 if (data == NULL) {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011881 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011882 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011883 data->vdev_id = session_id;
11884 data->request_data_len = input->request_data_len;
11885 if (input->request_data_len) {
Anurag Chouhan600c3a02016-03-01 10:33:54 +053011886 qdf_mem_copy(data->request_data,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011887 input->request_data, input->request_data_len);
11888 }
11889
11890 msg.type = WMA_STATS_EXT_REQUEST;
11891 msg.reserved = 0;
11892 msg.bodyptr = data;
11893
Rajeev Kumar8eaedf62017-01-21 11:03:13 -080011894 if (QDF_STATUS_SUCCESS != scheduler_post_msg(QDF_MODULE_ID_WMA,
Krunal Soni66c113f2016-12-21 16:46:47 -080011895 &msg)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053011896 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011897 "%s: Not able to post WMA_STATS_EXT_REQUEST message to WMA",
11898 __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053011899 qdf_mem_free(data);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011900 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011901 }
11902
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011903 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011904}
11905
11906/******************************************************************************
11907 \fn sme_stats_ext_event
11908
11909 \brief
11910 a callback function called when SME received eWNI_SME_STATS_EXT_EVENT
11911 response from WMA
11912
11913 \param hHal - HAL handle for device
11914 \param pMsg - Message body passed from WMA; includes NAN header
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011915 \return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011916******************************************************************************/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011917QDF_STATUS sme_stats_ext_event(tHalHandle hHal, void *pMsg)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011918{
11919 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011920 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011921
11922 if (NULL == pMsg) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070011923 sme_err("pMsg is NULL in sme_stats_ext_event");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011924 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011925 } else {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011926 if (pMac->sme.StatsExtCallback) {
11927 pMac->sme.StatsExtCallback(pMac->hHdd,
11928 (tpStatsExtEvent) pMsg);
11929 }
11930 }
11931
11932 return status;
11933}
11934
11935#endif
11936
11937/* ---------------------------------------------------------------------------
11938 \fn sme_update_dfs_scan_mode
11939 \brief Update DFS roam scan mode
11940 This function is called through dynamic setConfig callback function
11941 to configure allowDFSChannelRoam.
11942 \param hHal - HAL handle for device
11943 \param sessionId - Session Identifier
11944 \param allowDFSChannelRoam - DFS roaming scan mode 0 (disable),
11945 1 (passive), 2 (active)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011946 \return QDF_STATUS_SUCCESS - SME update DFS roaming scan config
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011947 successfully.
11948 Other status means SME failed to update DFS roaming scan config.
11949 \sa
11950 -------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011951QDF_STATUS sme_update_dfs_scan_mode(tHalHandle hHal, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011952 uint8_t allowDFSChannelRoam)
11953{
11954 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011955 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011956
Naveen Rawatc36f7eb2016-11-10 20:01:03 -080011957 if (sessionId >= CSR_ROAM_SESSION_MAX) {
11958 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
11959 FL("Invalid sme session id: %d"), sessionId);
11960 return QDF_STATUS_E_INVAL;
11961 }
11962
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011963 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011964 if (QDF_IS_STATUS_SUCCESS(status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053011965 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011966 "LFR runtime successfully set AllowDFSChannelRoam Mode to "
11967 "%d - old value is %d - roam state is %s",
11968 allowDFSChannelRoam,
11969 pMac->roam.configParam.allowDFSChannelRoam,
11970 mac_trace_get_neighbour_roam_state(pMac->roam.
11971 neighborRoamInfo
11972 [sessionId].
11973 neighborRoamState));
11974 pMac->roam.configParam.allowDFSChannelRoam =
11975 allowDFSChannelRoam;
11976 sme_release_global_lock(&pMac->sme);
11977 }
11978 if (pMac->roam.configParam.isRoamOffloadScanEnabled) {
11979 csr_roam_offload_scan(pMac, sessionId,
11980 ROAM_SCAN_OFFLOAD_UPDATE_CFG,
11981 REASON_ROAM_DFS_SCAN_MODE_CHANGED);
11982 }
11983
11984 return status;
11985}
11986
11987/*--------------------------------------------------------------------------
11988 \brief sme_get_dfs_scan_mode() - get DFS roam scan mode
11989 This is a synchronous call
11990 \param hHal - The handle returned by mac_open.
11991 \return DFS roaming scan mode 0 (disable), 1 (passive), 2 (active)
11992 \sa
11993 --------------------------------------------------------------------------*/
11994uint8_t sme_get_dfs_scan_mode(tHalHandle hHal)
11995{
11996 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
11997 return pMac->roam.configParam.allowDFSChannelRoam;
11998}
11999
12000/*----------------------------------------------------------------------------
12001 \fn sme_modify_add_ie
12002 \brief This function sends msg to updates the additional IE buffers in PE
12003 \param hHal - global structure
12004 \param pModifyIE - pointer to tModifyIE structure
12005 \param updateType - type of buffer
12006 \- return Success or failure
12007 -----------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012008QDF_STATUS sme_modify_add_ie(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012009 tSirModifyIE *pModifyIE, eUpdateIEsType updateType)
12010{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012011 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012012 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
12013 status = sme_acquire_global_lock(&pMac->sme);
12014
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012015 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012016 status = csr_roam_modify_add_ies(pMac, pModifyIE, updateType);
12017 sme_release_global_lock(&pMac->sme);
12018 }
12019 return status;
12020}
12021
12022/*----------------------------------------------------------------------------
12023 \fn sme_update_add_ie
12024 \brief This function sends msg to updates the additional IE buffers in PE
12025 \param hHal - global structure
12026 \param pUpdateIE - pointer to structure tUpdateIE
12027 \param updateType - type of buffer
12028 \- return Success or failure
12029 -----------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012030QDF_STATUS sme_update_add_ie(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012031 tSirUpdateIE *pUpdateIE, eUpdateIEsType updateType)
12032{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012033 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012034 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
12035 status = sme_acquire_global_lock(&pMac->sme);
12036
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012037 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012038 status = csr_roam_update_add_ies(pMac, pUpdateIE, updateType);
12039 sme_release_global_lock(&pMac->sme);
12040 }
12041 return status;
12042}
12043
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012044/**
12045 * sme_update_dsc_pto_up_mapping()
12046 * @hHal: HAL context
12047 * @dscpmapping: pointer to DSCP mapping structure
12048 * @sessionId: SME session id
12049 *
12050 * This routine is called to update dscp mapping
12051 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012052 * Return: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012053 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012054QDF_STATUS sme_update_dsc_pto_up_mapping(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012055 sme_QosWmmUpType *dscpmapping,
12056 uint8_t sessionId)
12057{
12058 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012059 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012060 uint8_t i, j, peSessionId;
12061 tCsrRoamSession *pCsrSession = NULL;
12062 tpPESession pSession = NULL;
12063
12064 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012065 if (!QDF_IS_STATUS_SUCCESS(status))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012066 return status;
12067 pCsrSession = CSR_GET_SESSION(pMac, sessionId);
12068 if (pCsrSession == NULL) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053012069 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012070 FL("Session lookup fails for CSR session"));
12071 sme_release_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012072 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012073 }
12074 if (!CSR_IS_SESSION_VALID(pMac, sessionId)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053012075 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012076 FL("Invalid session Id %u"), sessionId);
12077 sme_release_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012078 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012079 }
12080
12081 pSession = pe_find_session_by_bssid(pMac,
12082 pCsrSession->connectedProfile.bssid.bytes,
12083 &peSessionId);
12084
12085 if (pSession == NULL) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053012086 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012087 FL(" Session lookup fails for BSSID"));
12088 sme_release_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012089 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012090 }
12091
12092 if (!pSession->QosMapSet.present) {
Srinivas Girigowda2b5d47c2017-03-29 00:28:46 -070012093 sme_debug("QOS Mapping IE not present");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012094 sme_release_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012095 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012096 }
12097 for (i = 0; i < SME_QOS_WMM_UP_MAX; i++) {
12098 for (j = pSession->QosMapSet.dscp_range[i][0];
12099 j <= pSession->QosMapSet.dscp_range[i][1];
12100 j++) {
12101 if ((pSession->QosMapSet.dscp_range[i][0] == 255)
12102 && (pSession->QosMapSet.dscp_range[i][1] ==
12103 255)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053012104 QDF_TRACE(QDF_MODULE_ID_SME,
12105 QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012106 FL("User Priority %d isn't used"), i);
12107 break;
12108 } else {
12109 dscpmapping[j] = i;
12110 }
12111 }
12112 }
12113 for (i = 0; i < pSession->QosMapSet.num_dscp_exceptions; i++)
12114 if (pSession->QosMapSet.dscp_exceptions[i][0] != 255)
12115 dscpmapping[pSession->QosMapSet.dscp_exceptions[i][0]] =
12116 pSession->QosMapSet.dscp_exceptions[i][1];
12117
12118 sme_release_global_lock(&pMac->sme);
12119 return status;
12120}
12121
12122/* ---------------------------------------------------------------------------
12123 \fn sme_abort_roam_scan
12124 \brief API to abort current roam scan cycle by roam scan offload module.
12125 \param hHal - The handle returned by mac_open.
12126 \param sessionId - Session Identifier
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012127 \return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012128 ---------------------------------------------------------------------------*/
12129
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012130QDF_STATUS sme_abort_roam_scan(tHalHandle hHal, uint8_t sessionId)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012131{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012132 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012133 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
12134
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012135 if (pMac->roam.configParam.isRoamOffloadScanEnabled) {
12136 /* acquire the lock for the sme object */
12137 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012138 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012139 csr_roam_offload_scan(pMac, sessionId,
12140 ROAM_SCAN_OFFLOAD_ABORT_SCAN,
12141 REASON_ROAM_ABORT_ROAM_SCAN);
12142 /* release the lock for the sme object */
12143 sme_release_global_lock(&pMac->sme);
12144 }
12145 }
12146
12147 return status;
12148}
12149
12150#ifdef FEATURE_WLAN_EXTSCAN
12151/**
12152 * sme_get_valid_channels_by_band() - to fetch valid channels filtered by band
12153 * @hHal: HAL context
12154 * @wifiBand: RF band information
12155 * @aValidChannels: output array to store channel info
12156 * @pNumChannels: output number of channels
12157 *
12158 * SME API to fetch all valid channels filtered by band
12159 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012160 * Return: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012161 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012162QDF_STATUS sme_get_valid_channels_by_band(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012163 uint8_t wifiBand,
12164 uint32_t *aValidChannels,
12165 uint8_t *pNumChannels)
12166{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012167 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012168 uint8_t chanList[WNI_CFG_VALID_CHANNEL_LIST_LEN] = { 0 };
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012169 uint8_t numChannels = 0;
12170 uint8_t i = 0;
12171 uint32_t totValidChannels = WNI_CFG_VALID_CHANNEL_LIST_LEN;
Kiran Kumar Lokerea3de2262017-04-12 12:15:04 -070012172 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hHal);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012173
12174 if (!aValidChannels || !pNumChannels) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070012175 sme_err("Output channel list/NumChannels is NULL");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012176 return QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012177 }
12178
Sreelakshmi Konamki0d17c6a2017-06-08 12:58:54 +053012179 if (wifiBand >= WIFI_BAND_MAX) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070012180 sme_err("Invalid wifiBand: %d", wifiBand);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012181 return QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012182 }
12183
Tushnim Bhattacharyya0c4ad2d2017-03-09 15:59:03 -080012184 status = sme_get_cfg_valid_channels(&chanList[0],
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012185 &totValidChannels);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012186 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070012187 sme_err("Fail to get valid channel list (err=%d)", status);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012188 return status;
12189 }
12190
12191 switch (wifiBand) {
12192 case WIFI_BAND_UNSPECIFIED:
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070012193 sme_debug("Unspec Band, return all %d valid channels",
12194 totValidChannels);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012195 numChannels = totValidChannels;
12196 for (i = 0; i < totValidChannels; i++) {
12197 aValidChannels[i] = cds_chan_to_freq(chanList[i]);
12198 }
12199 break;
12200
12201 case WIFI_BAND_BG:
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070012202 sme_debug("WIFI_BAND_BG (2.4 GHz)");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012203 for (i = 0; i < totValidChannels; i++) {
Kiran Kumar Lokerea3de2262017-04-12 12:15:04 -070012204 if (WLAN_REG_IS_24GHZ_CH(chanList[i])) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012205 aValidChannels[numChannels++] =
12206 cds_chan_to_freq(chanList[i]);
12207 }
12208 }
12209 break;
12210
12211 case WIFI_BAND_A:
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070012212 sme_debug("WIFI_BAND_A (5 GHz without DFS)");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012213 for (i = 0; i < totValidChannels; i++) {
Kiran Kumar Lokerea3de2262017-04-12 12:15:04 -070012214 if (WLAN_REG_IS_5GHZ_CH(chanList[i]) &&
12215 !wlan_reg_is_dfs_ch(mac_ctx->pdev, chanList[i])) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012216 aValidChannels[numChannels++] =
12217 cds_chan_to_freq(chanList[i]);
12218 }
12219 }
12220 break;
12221
12222 case WIFI_BAND_ABG:
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070012223 sme_debug("WIFI_BAND_ABG (2.4 GHz + 5 GHz; no DFS)");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012224 for (i = 0; i < totValidChannels; i++) {
Kiran Kumar Lokerea3de2262017-04-12 12:15:04 -070012225 if ((WLAN_REG_IS_24GHZ_CH(chanList[i]) ||
12226 WLAN_REG_IS_5GHZ_CH(chanList[i])) &&
12227 !wlan_reg_is_dfs_ch(mac_ctx->pdev, chanList[i])) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012228 aValidChannels[numChannels++] =
12229 cds_chan_to_freq(chanList[i]);
12230 }
12231 }
12232 break;
12233
12234 case WIFI_BAND_A_DFS_ONLY:
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070012235 sme_debug("WIFI_BAND_A_DFS (5 GHz DFS only)");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012236 for (i = 0; i < totValidChannels; i++) {
Kiran Kumar Lokerea3de2262017-04-12 12:15:04 -070012237 if (WLAN_REG_IS_5GHZ_CH(chanList[i]) &&
12238 wlan_reg_is_dfs_ch(mac_ctx->pdev, chanList[i])) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012239 aValidChannels[numChannels++] =
12240 cds_chan_to_freq(chanList[i]);
12241 }
12242 }
12243 break;
12244
12245 case WIFI_BAND_A_WITH_DFS:
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070012246 sme_debug("WIFI_BAND_A_WITH_DFS (5 GHz with DFS)");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012247 for (i = 0; i < totValidChannels; i++) {
Kiran Kumar Lokerea3de2262017-04-12 12:15:04 -070012248 if (WLAN_REG_IS_5GHZ_CH(chanList[i])) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012249 aValidChannels[numChannels++] =
12250 cds_chan_to_freq(chanList[i]);
12251 }
12252 }
12253 break;
12254
12255 case WIFI_BAND_ABG_WITH_DFS:
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070012256 sme_debug("WIFI_BAND_ABG_WITH_DFS (2.4 GHz+5 GHz with DFS)");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012257 for (i = 0; i < totValidChannels; i++) {
Kiran Kumar Lokerea3de2262017-04-12 12:15:04 -070012258 if (WLAN_REG_IS_24GHZ_CH(chanList[i]) ||
12259 WLAN_REG_IS_5GHZ_CH(chanList[i])) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012260 aValidChannels[numChannels++] =
12261 cds_chan_to_freq(chanList[i]);
12262 }
12263 }
12264 break;
12265
12266 default:
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070012267 sme_err("Unknown wifiBand: %d", wifiBand);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012268 return QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012269 break;
12270 }
12271 *pNumChannels = numChannels;
12272
12273 return status;
12274}
12275
12276/* ---------------------------------------------------------------------------
12277 \fn sme_ext_scan_get_capabilities
12278 \brief SME API to fetch extscan capabilities
12279 \param hHal
12280 \param pReq: extscan capabilities structure
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012281 \- return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012282 -------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012283QDF_STATUS sme_ext_scan_get_capabilities(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012284 tSirGetExtScanCapabilitiesReqParams *
12285 pReq)
12286{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012287 QDF_STATUS status = QDF_STATUS_SUCCESS;
12288 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012289 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Rajeev Kumar37d478b2017-04-17 16:59:28 -070012290 struct scheduler_msg message = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012291
12292 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012293 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012294 /* Serialize the req through MC thread */
Rajeev Kumar8eaedf62017-01-21 11:03:13 -080012295 message.bodyptr = pReq;
12296 message.type = WMA_EXTSCAN_GET_CAPABILITIES_REQ;
Sreelakshmi Konamki6a065362016-05-31 16:05:01 +053012297 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
Rajeev Kumar8eaedf62017-01-21 11:03:13 -080012298 NO_SESSION, message.type));
12299 qdf_status = scheduler_post_msg(QDF_MODULE_ID_WMA,
12300 &message);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012301 if (!QDF_IS_STATUS_SUCCESS(qdf_status))
12302 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012303
12304 sme_release_global_lock(&pMac->sme);
12305 }
12306 return status;
12307}
12308
12309/* ---------------------------------------------------------------------------
12310 \fn sme_ext_scan_start
12311 \brief SME API to issue extscan start
12312 \param hHal
12313 \param pStartCmd: extscan start structure
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012314 \- return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012315 -------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012316QDF_STATUS sme_ext_scan_start(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012317 tSirWifiScanCmdReqParams *pStartCmd)
12318{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012319 QDF_STATUS status = QDF_STATUS_SUCCESS;
12320 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012321 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Rajeev Kumar37d478b2017-04-17 16:59:28 -070012322 struct scheduler_msg message = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012323
12324 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012325 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012326 /* Serialize the req through MC thread */
Rajeev Kumar8eaedf62017-01-21 11:03:13 -080012327 message.bodyptr = pStartCmd;
12328 message.type = WMA_EXTSCAN_START_REQ;
Sreelakshmi Konamki6a065362016-05-31 16:05:01 +053012329 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
Rajeev Kumar8eaedf62017-01-21 11:03:13 -080012330 NO_SESSION, message.type));
12331 qdf_status = scheduler_post_msg(QDF_MODULE_ID_WMA,
12332 &message);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012333 if (!QDF_IS_STATUS_SUCCESS(qdf_status))
12334 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012335
12336 sme_release_global_lock(&pMac->sme);
12337 }
12338 return status;
12339}
12340
12341/* ---------------------------------------------------------------------------
12342 \fn sme_ext_scan_stop
12343 \brief SME API to issue extscan stop
12344 \param hHal
12345 \param pStopReq: extscan stop structure
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012346 \- return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012347 -------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012348QDF_STATUS sme_ext_scan_stop(tHalHandle hHal, tSirExtScanStopReqParams *pStopReq)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012349{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012350 QDF_STATUS status = QDF_STATUS_SUCCESS;
12351 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012352 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Rajeev Kumar37d478b2017-04-17 16:59:28 -070012353 struct scheduler_msg message = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012354
12355 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012356 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012357 /* Serialize the req through MC thread */
Rajeev Kumar8eaedf62017-01-21 11:03:13 -080012358 message.bodyptr = pStopReq;
12359 message.type = WMA_EXTSCAN_STOP_REQ;
Sreelakshmi Konamki6a065362016-05-31 16:05:01 +053012360 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
Rajeev Kumar8eaedf62017-01-21 11:03:13 -080012361 NO_SESSION, message.type));
12362 qdf_status = scheduler_post_msg(QDF_MODULE_ID_WMA,
12363 &message);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012364 if (!QDF_IS_STATUS_SUCCESS(qdf_status))
12365 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012366 sme_release_global_lock(&pMac->sme);
12367 }
12368 return status;
12369}
12370
12371/* ---------------------------------------------------------------------------
12372 \fn sme_set_bss_hotlist
12373 \brief SME API to set BSSID hotlist
12374 \param hHal
12375 \param pSetHotListReq: extscan set hotlist structure
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012376 \- return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012377 -------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012378QDF_STATUS sme_set_bss_hotlist(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012379 tSirExtScanSetBssidHotListReqParams *
12380 pSetHotListReq)
12381{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012382 QDF_STATUS status = QDF_STATUS_SUCCESS;
12383 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012384 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Rajeev Kumar37d478b2017-04-17 16:59:28 -070012385 struct scheduler_msg message = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012386
12387 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012388 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012389 /* Serialize the req through MC thread */
Rajeev Kumar8eaedf62017-01-21 11:03:13 -080012390 message.bodyptr = pSetHotListReq;
12391 message.type = WMA_EXTSCAN_SET_BSSID_HOTLIST_REQ;
Sreelakshmi Konamki6a065362016-05-31 16:05:01 +053012392 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
Rajeev Kumar8eaedf62017-01-21 11:03:13 -080012393 NO_SESSION, message.type));
12394 qdf_status = scheduler_post_msg(QDF_MODULE_ID_WMA,
12395 &message);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012396 if (!QDF_IS_STATUS_SUCCESS(qdf_status))
12397 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012398
12399 sme_release_global_lock(&pMac->sme);
12400 }
12401 return status;
12402}
12403
12404/* ---------------------------------------------------------------------------
12405 \fn sme_reset_bss_hotlist
12406 \brief SME API to reset BSSID hotlist
12407 \param hHal
12408 \param pSetHotListReq: extscan set hotlist structure
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012409 \- return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012410 -------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012411QDF_STATUS sme_reset_bss_hotlist(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012412 tSirExtScanResetBssidHotlistReqParams *
12413 pResetReq)
12414{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012415 QDF_STATUS status = QDF_STATUS_SUCCESS;
12416 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012417 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Rajeev Kumar37d478b2017-04-17 16:59:28 -070012418 struct scheduler_msg message = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012419
12420 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012421 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012422 /* Serialize the req through MC thread */
Rajeev Kumar8eaedf62017-01-21 11:03:13 -080012423 message.bodyptr = pResetReq;
12424 message.type = WMA_EXTSCAN_RESET_BSSID_HOTLIST_REQ;
Sreelakshmi Konamki6a065362016-05-31 16:05:01 +053012425 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
Rajeev Kumar8eaedf62017-01-21 11:03:13 -080012426 NO_SESSION, message.type));
12427 qdf_status = scheduler_post_msg(QDF_MODULE_ID_WMA,
12428 &message);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012429 if (!QDF_IS_STATUS_SUCCESS(qdf_status))
12430 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012431
12432 sme_release_global_lock(&pMac->sme);
12433 }
12434 return status;
12435}
12436
Manikandan Mohan80dea792016-04-28 16:36:48 -070012437/**
12438 * sme_send_wisa_params(): Pass WISA mode to WMA
12439 * @hal: HAL context
12440 * @wisa_params: pointer to WISA params struct
12441 * @sessionId: SME session id
12442 *
12443 * Pass WISA params to WMA
12444 *
12445 * Return: QDF_STATUS
12446 */
12447QDF_STATUS sme_set_wisa_params(tHalHandle hal,
12448 struct sir_wisa_params *wisa_params)
12449{
12450 QDF_STATUS status = QDF_STATUS_SUCCESS;
12451 tpAniSirGlobal mac = PMAC_STRUCT(hal);
Rajeev Kumar37d478b2017-04-17 16:59:28 -070012452 struct scheduler_msg message = {0};
Manikandan Mohan80dea792016-04-28 16:36:48 -070012453 struct sir_wisa_params *cds_msg_wisa_params;
12454
12455 cds_msg_wisa_params = qdf_mem_malloc(sizeof(struct sir_wisa_params));
12456 if (!cds_msg_wisa_params)
12457 return QDF_STATUS_E_NOMEM;
12458
12459 *cds_msg_wisa_params = *wisa_params;
12460 status = sme_acquire_global_lock(&mac->sme);
12461 if (QDF_IS_STATUS_SUCCESS(status)) {
Rajeev Kumar8eaedf62017-01-21 11:03:13 -080012462 message.bodyptr = cds_msg_wisa_params;
12463 message.type = WMA_SET_WISA_PARAMS;
12464 status = scheduler_post_msg(QDF_MODULE_ID_WMA, &message);
Manikandan Mohan80dea792016-04-28 16:36:48 -070012465 sme_release_global_lock(&mac->sme);
12466 }
12467 return status;
12468}
12469
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012470/* ---------------------------------------------------------------------------
12471 \fn sme_set_significant_change
12472 \brief SME API to set significant change
12473 \param hHal
12474 \param pSetSignificantChangeReq: extscan set significant change structure
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012475 \- return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012476 -------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012477QDF_STATUS sme_set_significant_change(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012478 tSirExtScanSetSigChangeReqParams *
12479 pSetSignificantChangeReq)
12480{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012481 QDF_STATUS status = QDF_STATUS_SUCCESS;
12482 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012483 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Rajeev Kumar37d478b2017-04-17 16:59:28 -070012484 struct scheduler_msg message = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012485
12486 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012487 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012488 /* Serialize the req through MC thread */
Rajeev Kumar8eaedf62017-01-21 11:03:13 -080012489 message.bodyptr = pSetSignificantChangeReq;
12490 message.type = WMA_EXTSCAN_SET_SIGNF_CHANGE_REQ;
Sreelakshmi Konamki6a065362016-05-31 16:05:01 +053012491 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
Rajeev Kumar8eaedf62017-01-21 11:03:13 -080012492 NO_SESSION, message.type));
12493 qdf_status = scheduler_post_msg(QDF_MODULE_ID_WMA,
12494 &message);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012495 if (!QDF_IS_STATUS_SUCCESS(qdf_status))
12496 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012497
12498 sme_release_global_lock(&pMac->sme);
12499 }
12500 return status;
12501}
12502
12503/* ---------------------------------------------------------------------------
12504 \fn sme_reset_significant_change
12505 \brief SME API to reset significant change
12506 \param hHal
12507 \param pResetReq: extscan reset significant change structure
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012508 \- return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012509 -------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012510QDF_STATUS sme_reset_significant_change(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012511 tSirExtScanResetSignificantChangeReqParams
12512 *pResetReq)
12513{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012514 QDF_STATUS status = QDF_STATUS_SUCCESS;
12515 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012516 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Rajeev Kumar37d478b2017-04-17 16:59:28 -070012517 struct scheduler_msg message = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012518
12519 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012520 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012521 /* Serialize the req through MC thread */
Rajeev Kumar8eaedf62017-01-21 11:03:13 -080012522 message.bodyptr = pResetReq;
12523 message.type = WMA_EXTSCAN_RESET_SIGNF_CHANGE_REQ;
Sreelakshmi Konamki6a065362016-05-31 16:05:01 +053012524 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
Rajeev Kumar8eaedf62017-01-21 11:03:13 -080012525 NO_SESSION, message.type));
12526 qdf_status = scheduler_post_msg(QDF_MODULE_ID_WMA,
12527 &message);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012528 if (!QDF_IS_STATUS_SUCCESS(qdf_status))
12529 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012530
12531 sme_release_global_lock(&pMac->sme);
12532 }
12533 return status;
12534}
12535
12536/* ---------------------------------------------------------------------------
12537 \fn sme_get_cached_results
12538 \brief SME API to get cached results
12539 \param hHal
12540 \param pCachedResultsReq: extscan get cached results structure
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012541 \- return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012542 -------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012543QDF_STATUS sme_get_cached_results(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012544 tSirExtScanGetCachedResultsReqParams *
12545 pCachedResultsReq)
12546{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012547 QDF_STATUS status = QDF_STATUS_SUCCESS;
12548 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012549 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Rajeev Kumar37d478b2017-04-17 16:59:28 -070012550 struct scheduler_msg message = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012551
12552 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012553 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012554 /* Serialize the req through MC thread */
Rajeev Kumar8eaedf62017-01-21 11:03:13 -080012555 message.bodyptr = pCachedResultsReq;
12556 message.type = WMA_EXTSCAN_GET_CACHED_RESULTS_REQ;
Sreelakshmi Konamki6a065362016-05-31 16:05:01 +053012557 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
Rajeev Kumar8eaedf62017-01-21 11:03:13 -080012558 NO_SESSION, message.type));
12559 qdf_status = scheduler_post_msg(QDF_MODULE_ID_WMA,
12560 &message);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012561 if (!QDF_IS_STATUS_SUCCESS(qdf_status))
12562 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012563
12564 sme_release_global_lock(&pMac->sme);
12565 }
12566 return status;
12567}
12568
12569/**
12570 * sme_set_epno_list() - set epno network list
Deepak Dhamdhere0f076bd2016-06-02 11:29:21 -070012571 * @hal: global hal handle
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012572 * @input: request message
12573 *
12574 * This function constructs the cds message and fill in message type,
12575 * bodyptr with %input and posts it to WDA queue.
12576 *
Deepak Dhamdhere0f076bd2016-06-02 11:29:21 -070012577 * Return: QDF_STATUS enumeration
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012578 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012579QDF_STATUS sme_set_epno_list(tHalHandle hal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012580 struct wifi_epno_params *input)
12581{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012582 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012583 tpAniSirGlobal mac = PMAC_STRUCT(hal);
Rajeev Kumar37d478b2017-04-17 16:59:28 -070012584 struct scheduler_msg message = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012585 struct wifi_epno_params *req_msg;
12586 int len, i;
12587
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070012588 SME_ENTER();
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012589 len = sizeof(*req_msg) +
12590 (input->num_networks * sizeof(struct wifi_epno_network));
Mukul Sharmae8c919f2016-10-02 20:35:15 +053012591
Anurag Chouhan600c3a02016-03-01 10:33:54 +053012592 req_msg = qdf_mem_malloc(len);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012593 if (!req_msg) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070012594 sme_err("qdf_mem_malloc failed");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012595 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012596 }
12597
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012598 req_msg->num_networks = input->num_networks;
12599 req_msg->request_id = input->request_id;
12600 req_msg->session_id = input->session_id;
Mukul Sharmae8c919f2016-10-02 20:35:15 +053012601
12602 /* Fill only when num_networks are non zero */
12603 if (req_msg->num_networks) {
12604 req_msg->min_5ghz_rssi = input->min_5ghz_rssi;
12605 req_msg->min_24ghz_rssi = input->min_24ghz_rssi;
12606 req_msg->initial_score_max = input->initial_score_max;
12607 req_msg->same_network_bonus = input->same_network_bonus;
12608 req_msg->secure_bonus = input->secure_bonus;
12609 req_msg->band_5ghz_bonus = input->band_5ghz_bonus;
12610 req_msg->current_connection_bonus =
12611 input->current_connection_bonus;
12612
12613 for (i = 0; i < req_msg->num_networks; i++) {
12614 req_msg->networks[i].flags = input->networks[i].flags;
12615 req_msg->networks[i].auth_bit_field =
12616 input->networks[i].auth_bit_field;
12617 req_msg->networks[i].ssid.length =
12618 input->networks[i].ssid.length;
12619 qdf_mem_copy(req_msg->networks[i].ssid.ssId,
12620 input->networks[i].ssid.ssId,
12621 req_msg->networks[i].ssid.length);
12622 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012623 }
12624
12625 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012626 if (QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070012627 sme_err("sme_acquire_global_lock failed!(status=%d)",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012628 status);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053012629 qdf_mem_free(req_msg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012630 return status;
12631 }
12632
12633 /* Serialize the req through MC thread */
Rajeev Kumar8eaedf62017-01-21 11:03:13 -080012634 message.bodyptr = req_msg;
12635 message.type = WMA_SET_EPNO_LIST_REQ;
12636 status = scheduler_post_msg(QDF_MODULE_ID_WMA, &message);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012637 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070012638 sme_err("scheduler_post_msg failed!(err=%d)",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012639 status);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053012640 qdf_mem_free(req_msg);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012641 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012642 }
12643 sme_release_global_lock(&mac->sme);
12644 return status;
12645}
12646
12647/**
12648 * sme_set_passpoint_list() - set passpoint network list
12649 * @hal: global hal handle
12650 * @input: request message
12651 *
12652 * This function constructs the cds message and fill in message type,
12653 * bodyptr with @input and posts it to WDA queue.
12654 *
Deepak Dhamdhere0f076bd2016-06-02 11:29:21 -070012655 * Return: QDF_STATUS enumeration
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012656 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012657QDF_STATUS sme_set_passpoint_list(tHalHandle hal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012658 struct wifi_passpoint_req *input)
12659{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012660 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012661 tpAniSirGlobal mac = PMAC_STRUCT(hal);
Rajeev Kumar37d478b2017-04-17 16:59:28 -070012662 struct scheduler_msg message = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012663 struct wifi_passpoint_req *req_msg;
12664 int len, i;
12665
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070012666 SME_ENTER();
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012667 len = sizeof(*req_msg) +
12668 (input->num_networks * sizeof(struct wifi_passpoint_network));
Anurag Chouhan600c3a02016-03-01 10:33:54 +053012669 req_msg = qdf_mem_malloc(len);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012670 if (!req_msg) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070012671 sme_err("qdf_mem_malloc failed");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012672 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012673 }
12674
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012675 req_msg->num_networks = input->num_networks;
12676 req_msg->request_id = input->request_id;
12677 req_msg->session_id = input->session_id;
12678 for (i = 0; i < req_msg->num_networks; i++) {
12679 req_msg->networks[i].id =
12680 input->networks[i].id;
Anurag Chouhan600c3a02016-03-01 10:33:54 +053012681 qdf_mem_copy(req_msg->networks[i].realm,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012682 input->networks[i].realm,
12683 strlen(input->networks[i].realm) + 1);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053012684 qdf_mem_copy(req_msg->networks[i].plmn,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012685 input->networks[i].plmn,
12686 SIR_PASSPOINT_PLMN_LEN);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053012687 qdf_mem_copy(req_msg->networks[i].roaming_consortium_ids,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012688 input->networks[i].roaming_consortium_ids,
12689 sizeof(req_msg->networks[i].roaming_consortium_ids));
12690 }
12691
12692 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012693 if (QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070012694 sme_err("sme_acquire_global_lock failed!(status=%d)",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012695 status);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053012696 qdf_mem_free(req_msg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012697 return status;
12698 }
12699
12700 /* Serialize the req through MC thread */
Rajeev Kumar8eaedf62017-01-21 11:03:13 -080012701 message.bodyptr = req_msg;
12702 message.type = WMA_SET_PASSPOINT_LIST_REQ;
12703 status = scheduler_post_msg(QDF_MODULE_ID_WMA, &message);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012704 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070012705 sme_err("scheduler_post_msg failed!(err=%d)",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012706 status);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053012707 qdf_mem_free(req_msg);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012708 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012709 }
12710 sme_release_global_lock(&mac->sme);
12711 return status;
12712}
12713
12714/**
12715 * sme_reset_passpoint_list() - reset passpoint network list
12716 * @hHal: global hal handle
12717 * @input: request message
12718 *
Deepak Dhamdhere0f076bd2016-06-02 11:29:21 -070012719 * Return: QDF_STATUS enumeration
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012720 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012721QDF_STATUS sme_reset_passpoint_list(tHalHandle hal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012722 struct wifi_passpoint_req *input)
12723{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012724 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012725 tpAniSirGlobal mac = PMAC_STRUCT(hal);
Rajeev Kumar37d478b2017-04-17 16:59:28 -070012726 struct scheduler_msg message = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012727 struct wifi_passpoint_req *req_msg;
12728
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070012729 SME_ENTER();
Anurag Chouhan600c3a02016-03-01 10:33:54 +053012730 req_msg = qdf_mem_malloc(sizeof(*req_msg));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012731 if (!req_msg) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070012732 sme_err("qdf_mem_malloc failed");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012733 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012734 }
12735
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012736 req_msg->request_id = input->request_id;
12737 req_msg->session_id = input->session_id;
12738
12739 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012740 if (QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070012741 sme_err("sme_acquire_global_lock failed!(status=%d)",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012742 status);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053012743 qdf_mem_free(req_msg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012744 return status;
12745 }
12746
12747 /* Serialize the req through MC thread */
Rajeev Kumar8eaedf62017-01-21 11:03:13 -080012748 message.bodyptr = req_msg;
12749 message.type = WMA_RESET_PASSPOINT_LIST_REQ;
12750 status = scheduler_post_msg(QDF_MODULE_ID_WMA, &message);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012751 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070012752 sme_err("scheduler_post_msg failed!(err=%d)",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012753 status);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053012754 qdf_mem_free(req_msg);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012755 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012756 }
12757 sme_release_global_lock(&mac->sme);
12758 return status;
12759}
12760
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012761QDF_STATUS sme_ext_scan_register_callback(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012762 void (*pExtScanIndCb)(void *,
12763 const uint16_t,
12764 void *))
12765{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012766 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012767 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
12768
12769 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012770 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012771 pMac->sme.pExtScanIndCb = pExtScanIndCb;
12772 sme_release_global_lock(&pMac->sme);
12773 }
12774 return status;
12775}
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012776#endif /* FEATURE_WLAN_EXTSCAN */
12777
12778#ifdef WLAN_FEATURE_LINK_LAYER_STATS
12779
12780/* ---------------------------------------------------------------------------
12781 \fn sme_ll_stats_clear_req
12782 \brief SME API to clear Link Layer Statistics
12783 \param hHal
12784 \param pclearStatsReq: Link Layer clear stats request params structure
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012785 \- return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012786 -------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012787QDF_STATUS sme_ll_stats_clear_req(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012788 tSirLLStatsClearReq *pclearStatsReq)
12789{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012790 QDF_STATUS status = QDF_STATUS_SUCCESS;
12791 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012792 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Rajeev Kumar37d478b2017-04-17 16:59:28 -070012793 struct scheduler_msg message = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012794 tSirLLStatsClearReq *clear_stats_req;
12795
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053012796 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012797 "staId = %u", pclearStatsReq->staId);
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053012798 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012799 "statsClearReqMask = 0x%X",
12800 pclearStatsReq->statsClearReqMask);
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053012801 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012802 "stopReq = %u", pclearStatsReq->stopReq);
12803
Anurag Chouhan600c3a02016-03-01 10:33:54 +053012804 clear_stats_req = qdf_mem_malloc(sizeof(*clear_stats_req));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012805
12806 if (!clear_stats_req) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053012807 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012808 "%s: Not able to allocate memory for WMA_LL_STATS_CLEAR_REQ",
12809 __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012810 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012811 }
12812
12813 *clear_stats_req = *pclearStatsReq;
12814
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012815 if (QDF_STATUS_SUCCESS == sme_acquire_global_lock(&pMac->sme)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012816 /* Serialize the req through MC thread */
Rajeev Kumar8eaedf62017-01-21 11:03:13 -080012817 message.bodyptr = clear_stats_req;
12818 message.type = WMA_LINK_LAYER_STATS_CLEAR_REQ;
Sreelakshmi Konamki6a065362016-05-31 16:05:01 +053012819 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
Rajeev Kumar8eaedf62017-01-21 11:03:13 -080012820 NO_SESSION, message.type));
12821 qdf_status = scheduler_post_msg(QDF_MODULE_ID_WMA,
12822 &message);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012823 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053012824 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012825 "%s: not able to post WMA_LL_STATS_CLEAR_REQ",
12826 __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053012827 qdf_mem_free(clear_stats_req);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012828 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012829 }
12830 sme_release_global_lock(&pMac->sme);
12831 } else {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053012832 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR, "%s: "
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012833 "sme_acquire_global_lock error", __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053012834 qdf_mem_free(clear_stats_req);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012835 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012836 }
12837
12838 return status;
12839}
12840
12841/* ---------------------------------------------------------------------------
12842 \fn sme_ll_stats_set_req
12843 \brief SME API to set the Link Layer Statistics
12844 \param hHal
12845 \param psetStatsReq: Link Layer set stats request params structure
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012846 \- return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012847 -------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012848QDF_STATUS sme_ll_stats_set_req(tHalHandle hHal, tSirLLStatsSetReq *psetStatsReq)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012849{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012850 QDF_STATUS status = QDF_STATUS_SUCCESS;
12851 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012852 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Rajeev Kumar37d478b2017-04-17 16:59:28 -070012853 struct scheduler_msg message = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012854 tSirLLStatsSetReq *set_stats_req;
12855
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053012856 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012857 "%s: MPDU Size = %u", __func__,
12858 psetStatsReq->mpduSizeThreshold);
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053012859 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012860 " Aggressive Stats Collections = %u",
12861 psetStatsReq->aggressiveStatisticsGathering);
12862
Anurag Chouhan600c3a02016-03-01 10:33:54 +053012863 set_stats_req = qdf_mem_malloc(sizeof(*set_stats_req));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012864
12865 if (!set_stats_req) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053012866 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012867 "%s: Not able to allocate memory for WMA_LL_STATS_SET_REQ",
12868 __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012869 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012870 }
12871
12872 *set_stats_req = *psetStatsReq;
12873
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012874 if (QDF_STATUS_SUCCESS == sme_acquire_global_lock(&pMac->sme)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012875 /* Serialize the req through MC thread */
Rajeev Kumar8eaedf62017-01-21 11:03:13 -080012876 message.bodyptr = set_stats_req;
12877 message.type = WMA_LINK_LAYER_STATS_SET_REQ;
Sreelakshmi Konamki6a065362016-05-31 16:05:01 +053012878 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
Rajeev Kumar8eaedf62017-01-21 11:03:13 -080012879 NO_SESSION, message.type));
12880 qdf_status = scheduler_post_msg(QDF_MODULE_ID_WMA,
12881 &message);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012882 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053012883 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012884 "%s: not able to post WMA_LL_STATS_SET_REQ",
12885 __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053012886 qdf_mem_free(set_stats_req);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012887 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012888 }
12889 sme_release_global_lock(&pMac->sme);
12890 } else {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053012891 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR, "%s: "
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012892 "sme_acquire_global_lock error", __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053012893 qdf_mem_free(set_stats_req);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012894 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012895 }
12896
12897 return status;
12898}
12899
12900/* ---------------------------------------------------------------------------
12901 \fn sme_ll_stats_get_req
12902 \brief SME API to get the Link Layer Statistics
12903 \param hHal
12904 \param pgetStatsReq: Link Layer get stats request params structure
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012905 \- return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012906 -------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012907QDF_STATUS sme_ll_stats_get_req(tHalHandle hHal, tSirLLStatsGetReq *pgetStatsReq)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012908{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012909 QDF_STATUS status = QDF_STATUS_SUCCESS;
12910 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012911 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Rajeev Kumar37d478b2017-04-17 16:59:28 -070012912 struct scheduler_msg message = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012913 tSirLLStatsGetReq *get_stats_req;
12914
Anurag Chouhan600c3a02016-03-01 10:33:54 +053012915 get_stats_req = qdf_mem_malloc(sizeof(*get_stats_req));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012916
12917 if (!get_stats_req) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053012918 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012919 "%s: Not able to allocate memory for WMA_LL_STATS_GET_REQ",
12920 __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012921 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012922 }
12923
12924 *get_stats_req = *pgetStatsReq;
12925
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012926 if (QDF_STATUS_SUCCESS == sme_acquire_global_lock(&pMac->sme)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012927 /* Serialize the req through MC thread */
Rajeev Kumar8eaedf62017-01-21 11:03:13 -080012928 message.bodyptr = get_stats_req;
12929 message.type = WMA_LINK_LAYER_STATS_GET_REQ;
Sreelakshmi Konamki6a065362016-05-31 16:05:01 +053012930 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
Rajeev Kumar8eaedf62017-01-21 11:03:13 -080012931 NO_SESSION, message.type));
12932 qdf_status = scheduler_post_msg(QDF_MODULE_ID_WMA,
12933 &message);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012934 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053012935 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012936 "%s: not able to post WMA_LL_STATS_GET_REQ",
12937 __func__);
12938
Anurag Chouhan600c3a02016-03-01 10:33:54 +053012939 qdf_mem_free(get_stats_req);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012940 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012941
12942 }
12943 sme_release_global_lock(&pMac->sme);
12944 } else {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053012945 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR, "%s: "
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012946 "sme_acquire_global_lock error", __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053012947 qdf_mem_free(get_stats_req);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012948 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012949 }
12950
12951 return status;
12952}
12953
12954/* ---------------------------------------------------------------------------
12955 \fn sme_set_link_layer_stats_ind_cb
12956 \brief SME API to trigger the stats are available after get request
12957 \param hHal
12958 \param callback_routine - HDD callback which needs to be invoked after
12959 getting status notification from FW
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012960 \- return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012961 -------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012962QDF_STATUS sme_set_link_layer_stats_ind_cb
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012963 (tHalHandle hHal,
12964 void (*callback_routine)(void *callbackCtx, int indType, void *pRsp)
12965 ) {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012966 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012967 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
12968
12969 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012970 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012971 pMac->sme.pLinkLayerStatsIndCallback = callback_routine;
12972 sme_release_global_lock(&pMac->sme);
12973 } else {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053012974 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR, "%s: "
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012975 "sme_acquire_global_lock error", __func__);
12976 }
12977
12978 return status;
12979}
12980
Arun Khandavalli4b55da72016-07-19 19:55:01 +053012981/**
Zhang Qiana6e9c102016-12-22 16:47:24 +080012982 * sme_set_link_layer_ext_cb() - Register callback for link layer statistics
12983 * @hal: Mac global handle
12984 * @ll_stats_ext_cb: HDD callback which needs to be invoked after getting
12985 * status notification from FW
12986 *
12987 * Return: eHalStatus
12988 */
12989QDF_STATUS sme_set_link_layer_ext_cb(tHalHandle hal,
12990 void (*ll_stats_ext_cb)(tHddHandle callback_ctx,
12991 tSirLLStatsResults *rsp))
12992{
12993 QDF_STATUS status;
12994 tpAniSirGlobal mac = PMAC_STRUCT(hal);
12995
12996 status = sme_acquire_global_lock(&mac->sme);
12997 if (status == QDF_STATUS_SUCCESS) {
12998 mac->sme.link_layer_stats_ext_cb = ll_stats_ext_cb;
12999 sme_release_global_lock(&mac->sme);
13000 } else {
13001 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
13002 "%s: sme_qcquire_global_lock error", __func__);
13003 }
13004 return status;
13005}
13006
13007/**
Arun Khandavalli4b55da72016-07-19 19:55:01 +053013008 * sme_reset_link_layer_stats_ind_cb() - SME API to reset link layer stats
13009 * indication
13010 * @h_hal: Hal Handle
13011 *
13012 * This function reset's the link layer stats indication
13013 *
13014 * Return: QDF_STATUS Enumeration
13015 */
13016
13017QDF_STATUS sme_reset_link_layer_stats_ind_cb(tHalHandle h_hal)
13018{
13019 QDF_STATUS status;
13020 tpAniSirGlobal pmac;
13021
13022 if (!h_hal) {
13023 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
13024 FL("hHal is not valid"));
13025 return QDF_STATUS_E_INVAL;
13026 }
13027 pmac = PMAC_STRUCT(h_hal);
13028
13029 status = sme_acquire_global_lock(&pmac->sme);
13030 if (QDF_IS_STATUS_SUCCESS(status)) {
13031 pmac->sme.pLinkLayerStatsIndCallback = NULL;
13032 sme_release_global_lock(&pmac->sme);
13033 } else {
13034 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR, "%s: sme_acquire_global_lock error",
13035 __func__);
13036 }
13037
13038 return status;
13039}
13040
Zhang Qian73c348a2017-03-13 16:15:55 +080013041/**
13042 * sme_ll_stats_set_thresh - set threshold for mac counters
13043 * @hal, hal layer handle
13044 * @threshold, threshold for mac counters
13045 *
13046 * Return: QDF_STATUS Enumeration
13047 */
13048QDF_STATUS sme_ll_stats_set_thresh(tHalHandle hal,
13049 struct sir_ll_ext_stats_threshold *threshold)
13050{
13051 QDF_STATUS status;
13052 tpAniSirGlobal mac;
13053 struct scheduler_msg message;
13054 struct sir_ll_ext_stats_threshold *thresh;
13055
13056 if (!threshold) {
13057 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
13058 FL("threshold is not valid"));
13059 return QDF_STATUS_E_INVAL;
13060 }
13061
13062 if (!hal) {
13063 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
13064 FL("hal is not valid"));
13065 return QDF_STATUS_E_INVAL;
13066 }
13067 mac = PMAC_STRUCT(hal);
13068
13069 thresh = qdf_mem_malloc(sizeof(*thresh));
13070 if (!thresh) {
13071 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
13072 "%s: Fail to alloc mem", __func__);
13073 return QDF_STATUS_E_NOMEM;
13074 }
13075 *thresh = *threshold;
13076
13077 status = sme_acquire_global_lock(&mac->sme);
13078 if (QDF_IS_STATUS_SUCCESS(status)) {
13079 /* Serialize the req through MC thread */
13080 message.bodyptr = thresh;
13081 message.type = WDA_LINK_LAYER_STATS_SET_THRESHOLD;
13082 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
13083 NO_SESSION, message.type));
13084 status = scheduler_post_msg(QDF_MODULE_ID_WMA, &message);
13085 if (!QDF_IS_STATUS_SUCCESS(status)) {
13086 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
13087 "%s: not able to post WDA_LL_STATS_GET_REQ",
13088 __func__);
13089 qdf_mem_free(thresh);
13090 }
13091 sme_release_global_lock(&mac->sme);
13092 } else {
13093 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
13094 FL("sme_acquire_global_lock error"));
13095 qdf_mem_free(thresh);
13096 }
13097 return status;
13098}
Arun Khandavalli4b55da72016-07-19 19:55:01 +053013099
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013100#endif /* WLAN_FEATURE_LINK_LAYER_STATS */
13101
Sridhar Selvarajdc400d22016-10-18 17:18:03 +053013102#ifdef WLAN_POWER_DEBUGFS
13103/**
13104 * sme_power_debug_stats_req() - SME API to collect Power debug stats
13105 * @callback_fn: Pointer to the callback function for Power stats event
13106 * @power_stats_context: Pointer to context
13107 *
13108 * Return: QDF_STATUS
13109 */
13110QDF_STATUS sme_power_debug_stats_req(tHalHandle hal, void (*callback_fn)
13111 (struct power_stats_response *response,
13112 void *context), void *power_stats_context)
13113{
13114 QDF_STATUS status = QDF_STATUS_SUCCESS;
13115 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
Rajeev Kumar37d478b2017-04-17 16:59:28 -070013116 struct scheduler_msg msg = {0};
Sridhar Selvarajdc400d22016-10-18 17:18:03 +053013117
13118 status = sme_acquire_global_lock(&mac_ctx->sme);
13119 if (QDF_IS_STATUS_SUCCESS(status)) {
13120 if (!callback_fn) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070013121 sme_err("Indication callback did not registered");
Sridhar Selvarajdc400d22016-10-18 17:18:03 +053013122 sme_release_global_lock(&mac_ctx->sme);
13123 return QDF_STATUS_E_FAILURE;
13124 }
13125
13126 mac_ctx->sme.power_debug_stats_context = power_stats_context;
13127 mac_ctx->sme.power_stats_resp_callback = callback_fn;
13128 msg.bodyptr = NULL;
13129 msg.type = WMA_POWER_DEBUG_STATS_REQ;
Rajeev Kumar8eaedf62017-01-21 11:03:13 -080013130 status = scheduler_post_msg(QDF_MODULE_ID_WMA, &msg);
Sridhar Selvarajdc400d22016-10-18 17:18:03 +053013131 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070013132 sme_err("not able to post WDA_POWER_DEBUG_STATS_REQ");
Sridhar Selvarajdc400d22016-10-18 17:18:03 +053013133 }
13134 sme_release_global_lock(&mac_ctx->sme);
13135 }
13136 return status;
13137}
13138#endif
13139
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013140/**
13141 * sme_fw_mem_dump_register_cb() - Register fw memory dump callback
13142 *
13143 * @hal - MAC global handle
13144 * @callback_routine - callback routine from HDD
13145 *
13146 * This API is invoked by HDD to register its callback in SME
13147 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013148 * Return: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013149 */
13150#ifdef WLAN_FEATURE_MEMDUMP
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013151QDF_STATUS sme_fw_mem_dump_register_cb(tHalHandle hal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013152 void (*callback_routine)(void *cb_context,
13153 struct fw_dump_rsp *rsp))
13154{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013155 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013156 tpAniSirGlobal pmac = PMAC_STRUCT(hal);
13157
13158 status = sme_acquire_global_lock(&pmac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013159 if (QDF_STATUS_SUCCESS == status) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013160 pmac->sme.fw_dump_callback = callback_routine;
13161 sme_release_global_lock(&pmac->sme);
13162 } else {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053013163 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013164 FL("sme_acquire_global_lock error"));
13165 }
13166
13167 return status;
13168}
13169#else
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013170QDF_STATUS sme_fw_mem_dump_register_cb(tHalHandle hal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013171 void (*callback_routine)(void *cb_context,
13172 struct fw_dump_rsp *rsp))
13173{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013174 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013175}
13176#endif /* WLAN_FEATURE_MEMDUMP */
13177
13178/**
13179 * sme_fw_mem_dump_unregister_cb() - Unregister fw memory dump callback
13180 *
13181 * @hHal - MAC global handle
13182 *
13183 * This API is invoked by HDD to unregister its callback in SME
13184 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013185 * Return: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013186 */
13187#ifdef WLAN_FEATURE_MEMDUMP
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013188QDF_STATUS sme_fw_mem_dump_unregister_cb(tHalHandle hal)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013189{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013190 QDF_STATUS status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013191 tpAniSirGlobal pmac = PMAC_STRUCT(hal);
13192
13193 status = sme_acquire_global_lock(&pmac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013194 if (QDF_STATUS_SUCCESS == status) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013195 pmac->sme.fw_dump_callback = NULL;
13196 sme_release_global_lock(&pmac->sme);
13197 } else {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053013198 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013199 FL("sme_acquire_global_lock error"));
13200 }
13201
13202 return status;
13203}
13204#else
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013205QDF_STATUS sme_fw_mem_dump_unregister_cb(tHalHandle hal)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013206{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013207 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013208}
13209#endif /* WLAN_FEATURE_MEMDUMP */
13210
13211#ifdef WLAN_FEATURE_ROAM_OFFLOAD
13212/*--------------------------------------------------------------------------
13213 \brief sme_update_roam_offload_enabled() - enable/disable roam offload feaure
13214 It is used at in the REG_DYNAMIC_VARIABLE macro definition of
13215 \param hHal - The handle returned by mac_open.
13216 \param nRoamOffloadEnabled - The bool to update with
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013217 \return QDF_STATUS_SUCCESS - SME update config successfully.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013218 Other status means SME is failed to update.
13219 \sa
13220 --------------------------------------------------------------------------*/
13221
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013222QDF_STATUS sme_update_roam_offload_enabled(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013223 bool nRoamOffloadEnabled)
13224{
13225 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013226 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013227
13228 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013229 if (QDF_IS_STATUS_SUCCESS(status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053013230 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013231 "%s: LFR3:gRoamOffloadEnabled is changed from %d to %d",
13232 __func__, pMac->roam.configParam.isRoamOffloadEnabled,
13233 nRoamOffloadEnabled);
13234 pMac->roam.configParam.isRoamOffloadEnabled =
13235 nRoamOffloadEnabled;
13236 sme_release_global_lock(&pMac->sme);
13237 }
13238
13239 return status;
13240}
13241
Deepak Dhamdheref2a7d8b2016-08-19 16:17:38 -070013242/**
13243 * sme_update_roam_key_mgmt_offload_enabled() - enable/disable key mgmt offload
13244 * This is a synchronous call
13245 * @hal_ctx: The handle returned by mac_open.
13246 * @session_id: Session Identifier
13247 * @key_mgmt_offload_enabled: key mgmt enable/disable flag
13248 * @okc_enabled: Opportunistic key caching enable/disable flag
13249 * Return: QDF_STATUS_SUCCESS - SME updated config successfully.
13250 * Other status means SME is failed to update.
13251 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013252
Deepak Dhamdheref2a7d8b2016-08-19 16:17:38 -070013253QDF_STATUS sme_update_roam_key_mgmt_offload_enabled(tHalHandle hal_ctx,
13254 uint8_t session_id,
13255 bool key_mgmt_offload_enabled,
13256 bool okc_enabled)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013257{
Deepak Dhamdheref2a7d8b2016-08-19 16:17:38 -070013258 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal_ctx);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013259 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013260
Deepak Dhamdheref2a7d8b2016-08-19 16:17:38 -070013261 status = sme_acquire_global_lock(&mac_ctx->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013262 if (QDF_IS_STATUS_SUCCESS(status)) {
Deepak Dhamdheref2a7d8b2016-08-19 16:17:38 -070013263 if (CSR_IS_SESSION_VALID(mac_ctx, session_id)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053013264 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO,
Deepak Dhamdheref2a7d8b2016-08-19 16:17:38 -070013265 "%s: LFR3: key_mgmt_offload_enabled changed to %d",
13266 __func__, key_mgmt_offload_enabled);
13267 status = csr_roam_set_key_mgmt_offload(mac_ctx,
13268 session_id,
13269 key_mgmt_offload_enabled,
13270 okc_enabled);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013271 } else {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013272 status = QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013273 }
Deepak Dhamdheref2a7d8b2016-08-19 16:17:38 -070013274 sme_release_global_lock(&mac_ctx->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013275 }
13276
13277 return status;
13278}
Prashanth Bhattabfc25292015-11-05 11:16:21 -080013279#endif
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013280
13281/* ---------------------------------------------------------------------------
13282 \fn sme_get_temperature
13283 \brief SME API to get the pdev temperature
13284 \param hHal
13285 \param temperature context
13286 \param pCallbackfn: callback fn with response (temperature)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013287 \- return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013288 -------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013289QDF_STATUS sme_get_temperature(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013290 void *tempContext,
13291 void (*pCallbackfn)(int temperature,
13292 void *pContext))
13293{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013294 QDF_STATUS status = QDF_STATUS_SUCCESS;
13295 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013296 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Rajeev Kumar37d478b2017-04-17 16:59:28 -070013297 struct scheduler_msg message = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013298
13299 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013300 if (QDF_STATUS_SUCCESS == status) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013301 if ((NULL == pCallbackfn) &&
13302 (NULL == pMac->sme.pGetTemperatureCb)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053013303 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013304 FL
13305 ("Indication Call back did not registered"));
13306 sme_release_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013307 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013308 } else if (NULL != pCallbackfn) {
13309 pMac->sme.pTemperatureCbContext = tempContext;
13310 pMac->sme.pGetTemperatureCb = pCallbackfn;
13311 }
13312 /* serialize the req through MC thread */
Rajeev Kumar8eaedf62017-01-21 11:03:13 -080013313 message.bodyptr = NULL;
13314 message.type = WMA_GET_TEMPERATURE_REQ;
13315 qdf_status = scheduler_post_msg(QDF_MODULE_ID_WMA,
13316 &message);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013317 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053013318 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013319 FL("Post Get Temperature msg fail"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013320 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013321 }
13322 sme_release_global_lock(&pMac->sme);
13323 }
13324 return status;
13325}
13326
13327/* ---------------------------------------------------------------------------
13328 \fn sme_set_scanning_mac_oui
13329 \brief SME API to set scanning mac oui
13330 \param hHal
13331 \param pScanMacOui: Scanning Mac Oui (input 3 bytes)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013332 \- return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013333 -------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013334QDF_STATUS sme_set_scanning_mac_oui(tHalHandle hHal, tSirScanMacOui *pScanMacOui)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013335{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013336 QDF_STATUS status = QDF_STATUS_SUCCESS;
13337 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013338 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Rajeev Kumar37d478b2017-04-17 16:59:28 -070013339 struct scheduler_msg message = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013340
13341 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013342 if (QDF_STATUS_SUCCESS == status) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013343 /* Serialize the req through MC thread */
Rajeev Kumar8eaedf62017-01-21 11:03:13 -080013344 message.bodyptr = pScanMacOui;
13345 message.type = WMA_SET_SCAN_MAC_OUI_REQ;
13346 qdf_status = scheduler_post_msg(QDF_MODULE_ID_WMA,
13347 &message);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013348 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053013349 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013350 FL("Msg post Set Scan Mac OUI failed"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013351 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013352 }
13353 sme_release_global_lock(&pMac->sme);
13354 }
13355 return status;
13356}
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013357
13358#ifdef DHCP_SERVER_OFFLOAD
13359/* ---------------------------------------------------------------------------
13360 \fn sme_set_dhcp_srv_offload
13361 \brief SME API to set DHCP server offload info
13362 \param hHal
13363 \param pDhcpSrvInfo : DHCP server offload info struct
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013364 \- return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013365 -------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013366QDF_STATUS sme_set_dhcp_srv_offload(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013367 tSirDhcpSrvOffloadInfo *pDhcpSrvInfo)
13368{
Rajeev Kumar37d478b2017-04-17 16:59:28 -070013369 struct scheduler_msg message = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013370 tSirDhcpSrvOffloadInfo *pSmeDhcpSrvInfo;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013371 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013372 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
13373
Anurag Chouhan600c3a02016-03-01 10:33:54 +053013374 pSmeDhcpSrvInfo = qdf_mem_malloc(sizeof(*pSmeDhcpSrvInfo));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013375
13376 if (!pSmeDhcpSrvInfo) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053013377 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013378 "%s: Not able to allocate memory for WMA_SET_DHCP_SERVER_OFFLOAD_CMD",
13379 __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013380 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013381 }
13382
13383 *pSmeDhcpSrvInfo = *pDhcpSrvInfo;
13384
13385 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013386 if (QDF_STATUS_SUCCESS == status) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013387 /* serialize the req through MC thread */
Rajeev Kumar8eaedf62017-01-21 11:03:13 -080013388 message.type = WMA_SET_DHCP_SERVER_OFFLOAD_CMD;
13389 message.bodyptr = pSmeDhcpSrvInfo;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013390
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013391 if (!QDF_IS_STATUS_SUCCESS
Rajeev Kumar8eaedf62017-01-21 11:03:13 -080013392 (scheduler_post_msg(QDF_MODULE_ID_WMA,
13393 &message))) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053013394 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013395 "%s: Not able to post WMA_SET_DHCP_SERVER_OFFLOAD_CMD to WMA!",
13396 __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053013397 qdf_mem_free(pSmeDhcpSrvInfo);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013398 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013399 }
13400 sme_release_global_lock(&pMac->sme);
13401 } else {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053013402 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013403 "%s: sme_acquire_global_lock error!", __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053013404 qdf_mem_free(pSmeDhcpSrvInfo);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013405 }
13406
13407 return status;
13408}
13409#endif /* DHCP_SERVER_OFFLOAD */
13410
13411#ifdef WLAN_FEATURE_GPIO_LED_FLASHING
13412/* ---------------------------------------------------------------------------
13413 \fn sme_set_led_flashing
13414 \brief API to set the Led flashing parameters.
13415 \param hHal - The handle returned by mac_open.
13416 \param x0, x1 - led flashing parameters
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013417 \return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013418 ---------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013419QDF_STATUS sme_set_led_flashing(tHalHandle hHal, uint8_t type,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013420 uint32_t x0, uint32_t x1)
13421{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013422 QDF_STATUS status = QDF_STATUS_SUCCESS;
13423 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013424 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Rajeev Kumar37d478b2017-04-17 16:59:28 -070013425 struct scheduler_msg message = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013426 tSirLedFlashingReq *ledflashing;
13427
Anurag Chouhan600c3a02016-03-01 10:33:54 +053013428 ledflashing = qdf_mem_malloc(sizeof(*ledflashing));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013429 if (!ledflashing) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053013430 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013431 FL
13432 ("Not able to allocate memory for WMA_LED_TIMING_REQ"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013433 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013434 }
13435
13436 ledflashing->pattern_id = type;
13437 ledflashing->led_x0 = x0;
13438 ledflashing->led_x1 = x1;
13439
13440 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013441 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013442 /* Serialize the req through MC thread */
Rajeev Kumar8eaedf62017-01-21 11:03:13 -080013443 message.bodyptr = ledflashing;
13444 message.type = WMA_LED_FLASHING_REQ;
13445 qdf_status = scheduler_post_msg(QDF_MODULE_ID_WMA,
13446 &message);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013447 if (!QDF_IS_STATUS_SUCCESS(qdf_status))
13448 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013449 sme_release_global_lock(&pMac->sme);
13450 }
13451 return status;
13452}
13453#endif
13454
13455/**
13456 * sme_handle_dfS_chan_scan() - handle DFS channel configuration
13457 * @h_hal: corestack handler
13458 * @dfs_flag: flag indicating dfs channel enable/disable
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013459 * Return: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013460 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013461QDF_STATUS sme_handle_dfs_chan_scan(tHalHandle h_hal, uint8_t dfs_flag)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013462{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013463 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013464 tpAniSirGlobal mac = PMAC_STRUCT(h_hal);
13465
13466 status = sme_acquire_global_lock(&mac->sme);
13467
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013468 if (QDF_STATUS_SUCCESS == status) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013469
13470 mac->scan.fEnableDFSChnlScan = dfs_flag;
13471
13472 /* update the channel list to the firmware */
13473 status = csr_update_channel_list(mac);
13474
13475 sme_release_global_lock(&mac->sme);
13476 }
13477
13478 return status;
13479}
13480
Edhar, Mahesh Kumardf2ec122015-11-16 11:33:16 +053013481#ifdef FEATURE_WLAN_MCC_TO_SCC_SWITCH
13482/**
13483 * sme_validate_sap_channel_switch() - validate target channel switch w.r.t
13484 * concurreny rules set to avoid channel interference.
13485 * @hal - Hal context
13486 * @sap_ch - channel to switch
13487 * @sap_phy_mode - phy mode of SAP
13488 * @cc_switch_mode - concurreny switch mode
13489 * @session_id - sme session id.
13490 *
13491 * Return: true if there is no channel interference else return false
13492 */
13493bool sme_validate_sap_channel_switch(tHalHandle hal,
13494 uint16_t sap_ch, eCsrPhyMode sap_phy_mode, uint8_t cc_switch_mode,
13495 uint8_t session_id)
13496{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013497 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Edhar, Mahesh Kumardf2ec122015-11-16 11:33:16 +053013498 tpAniSirGlobal mac = PMAC_STRUCT(hal);
13499 tCsrRoamSession *session = CSR_GET_SESSION(mac, session_id);
13500 uint16_t intf_channel = 0;
13501
13502 if (!session)
13503 return false;
13504
13505 session->ch_switch_in_progress = true;
13506 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013507 if (QDF_IS_STATUS_SUCCESS(status)) {
Edhar, Mahesh Kumardf2ec122015-11-16 11:33:16 +053013508 intf_channel = csr_check_concurrent_channel_overlap(mac, sap_ch,
13509 sap_phy_mode,
13510 cc_switch_mode);
13511 sme_release_global_lock(&mac->sme);
13512 } else {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053013513 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Edhar, Mahesh Kumardf2ec122015-11-16 11:33:16 +053013514 FL("sme_acquire_global_lock error!"));
13515 session->ch_switch_in_progress = false;
13516 return false;
13517 }
13518
13519 session->ch_switch_in_progress = false;
13520 return (intf_channel == 0) ? true : false;
13521}
13522#endif
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013523
13524/**
13525 * sme_configure_stats_avg_factor() - function to config avg. stats factor
13526 * @hal: hal
13527 * @session_id: session ID
13528 * @stats_avg_factor: average stats factor
13529 *
13530 * This function configures the stats avg factor in firmware
13531 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013532 * Return: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013533 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013534QDF_STATUS sme_configure_stats_avg_factor(tHalHandle hal, uint8_t session_id,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013535 uint16_t stats_avg_factor)
13536{
Rajeev Kumar37d478b2017-04-17 16:59:28 -070013537 struct scheduler_msg msg = {0};
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013538 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013539 tpAniSirGlobal mac = PMAC_STRUCT(hal);
13540 struct sir_stats_avg_factor *stats_factor;
13541
Anurag Chouhan600c3a02016-03-01 10:33:54 +053013542 stats_factor = qdf_mem_malloc(sizeof(*stats_factor));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013543
13544 if (!stats_factor) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053013545 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013546 "%s: Not able to allocate memory for SIR_HAL_CONFIG_STATS_FACTOR",
13547 __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013548 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013549 }
13550
13551 status = sme_acquire_global_lock(&mac->sme);
13552
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013553 if (QDF_STATUS_SUCCESS == status) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013554
13555 stats_factor->vdev_id = session_id;
13556 stats_factor->stats_avg_factor = stats_avg_factor;
13557
13558 /* serialize the req through MC thread */
13559 msg.type = SIR_HAL_CONFIG_STATS_FACTOR;
13560 msg.bodyptr = stats_factor;
13561
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013562 if (!QDF_IS_STATUS_SUCCESS(
Rajeev Kumar8eaedf62017-01-21 11:03:13 -080013563 scheduler_post_msg(QDF_MODULE_ID_WMA, &msg))) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053013564 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013565 "%s: Not able to post SIR_HAL_CONFIG_STATS_FACTOR to WMA!",
13566 __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053013567 qdf_mem_free(stats_factor);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013568 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013569 }
13570 sme_release_global_lock(&mac->sme);
13571 } else {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053013572 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013573 "%s: sme_acquire_global_lock error!",
13574 __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053013575 qdf_mem_free(stats_factor);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013576 }
13577
13578 return status;
13579}
13580
13581/**
13582 * sme_configure_guard_time() - function to configure guard time
13583 * @hal: hal
13584 * @session_id: session id
13585 * @guard_time: guard time
13586 *
13587 * This function configures the guard time in firmware
13588 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013589 * Return: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013590 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013591QDF_STATUS sme_configure_guard_time(tHalHandle hal, uint8_t session_id,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013592 uint32_t guard_time)
13593{
Rajeev Kumar37d478b2017-04-17 16:59:28 -070013594 struct scheduler_msg msg = {0};
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013595 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013596 tpAniSirGlobal mac = PMAC_STRUCT(hal);
13597 struct sir_guard_time_request *g_time;
13598
Anurag Chouhan600c3a02016-03-01 10:33:54 +053013599 g_time = qdf_mem_malloc(sizeof(*g_time));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013600
13601 if (!g_time) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053013602 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013603 "%s: Not able to allocate memory for SIR_HAL_CONFIG_GUARD_TIME",
13604 __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013605 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013606 }
13607
13608 status = sme_acquire_global_lock(&mac->sme);
13609
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013610 if (QDF_STATUS_SUCCESS == status) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013611
13612 g_time->vdev_id = session_id;
13613 g_time->guard_time = guard_time;
13614
13615 /* serialize the req through MC thread */
13616 msg.type = SIR_HAL_CONFIG_GUARD_TIME;
13617 msg.bodyptr = g_time;
13618
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013619 if (!QDF_IS_STATUS_SUCCESS(
Rajeev Kumar8eaedf62017-01-21 11:03:13 -080013620 scheduler_post_msg(QDF_MODULE_ID_WMA, &msg))) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053013621 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013622 "%s: Not able to post SIR_HAL_CONFIG_GUARD_TIME to WMA!",
13623 __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053013624 qdf_mem_free(g_time);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013625 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013626 }
13627 sme_release_global_lock(&mac->sme);
13628 } else {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053013629 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013630 "%s: sme_acquire_global_lock error!",
13631 __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053013632 qdf_mem_free(g_time);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013633 }
13634
13635 return status;
13636}
13637
13638/**
13639 * sme_configure_modulated_dtim() - function to configure modulated dtim
13640 * @h_hal: SME API to enable/disable modulated DTIM instantaneously
13641 * @session_id: session ID
13642 * @modulated_dtim: modulated dtim value
13643 *
13644 * This function configures the modulated dtim in firmware
13645 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013646 * Return: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013647 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013648QDF_STATUS sme_configure_modulated_dtim(tHalHandle h_hal, uint8_t session_id,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013649 uint32_t modulated_dtim)
13650{
Rajeev Kumar37d478b2017-04-17 16:59:28 -070013651 struct scheduler_msg msg = {0};
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013652 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013653 tpAniSirGlobal mac = PMAC_STRUCT(h_hal);
13654 wma_cli_set_cmd_t *iwcmd;
13655
Anurag Chouhan600c3a02016-03-01 10:33:54 +053013656 iwcmd = qdf_mem_malloc(sizeof(*iwcmd));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013657 if (NULL == iwcmd) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053013658 QDF_TRACE(QDF_MODULE_ID_SME,
13659 QDF_TRACE_LEVEL_FATAL,
Anurag Chouhanf04e84f2016-03-03 10:12:12 +053013660 "%s: qdf_mem_malloc failed", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013661 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013662 }
13663
13664 status = sme_acquire_global_lock(&mac->sme);
13665
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013666 if (QDF_STATUS_SUCCESS == status) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013667
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013668 iwcmd->param_value = modulated_dtim;
13669 iwcmd->param_vdev_id = session_id;
13670 iwcmd->param_id = GEN_PARAM_MODULATED_DTIM;
13671 iwcmd->param_vp_dev = GEN_CMD;
13672 msg.type = WMA_CLI_SET_CMD;
13673 msg.reserved = 0;
13674 msg.bodyptr = (void *)iwcmd;
13675
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013676 if (!QDF_IS_STATUS_SUCCESS(
Rajeev Kumar8eaedf62017-01-21 11:03:13 -080013677 scheduler_post_msg(QDF_MODULE_ID_WMA, &msg))) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053013678 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013679 "%s: Not able to post GEN_PARAM_DYNAMIC_DTIM to WMA!",
13680 __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053013681 qdf_mem_free(iwcmd);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013682 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013683 }
13684 sme_release_global_lock(&mac->sme);
13685 } else {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053013686 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013687 "%s: sme_acquire_global_lock error!",
13688 __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053013689 qdf_mem_free(iwcmd);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013690 }
13691
13692 return status;
13693}
13694
13695/*
13696 * sme_wifi_start_logger() - Send the start/stop logging command to WMA
13697 * to either start/stop logging
13698 * @hal: HAL context
13699 * @start_log: Structure containing the wifi start logger params
13700 *
13701 * This function sends the start/stop logging command to WMA
13702 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013703 * Return: QDF_STATUS_SUCCESS on successful posting
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013704 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013705QDF_STATUS sme_wifi_start_logger(tHalHandle hal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013706 struct sir_wifi_start_log start_log)
13707{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013708 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013709 tpAniSirGlobal mac = PMAC_STRUCT(hal);
Rajeev Kumar37d478b2017-04-17 16:59:28 -070013710 struct scheduler_msg message = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013711 struct sir_wifi_start_log *req_msg;
13712 uint32_t len;
13713
13714 len = sizeof(*req_msg);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053013715 req_msg = qdf_mem_malloc(len);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013716 if (!req_msg) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070013717 sme_err("qdf_mem_malloc failed");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013718 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013719 }
13720
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013721 req_msg->verbose_level = start_log.verbose_level;
Poddar, Siddartheefe3482016-09-21 18:12:59 +053013722 req_msg->is_iwpriv_command = start_log.is_iwpriv_command;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013723 req_msg->ring_id = start_log.ring_id;
Srinivas Girigowdac34f11d2016-02-25 16:02:42 -080013724 req_msg->ini_triggered = start_log.ini_triggered;
13725 req_msg->user_triggered = start_log.user_triggered;
Poddar, Siddarth176c4362016-10-03 12:25:00 +053013726 req_msg->size = start_log.size;
Poddar, Siddarthab99a272017-04-10 12:53:26 +053013727 req_msg->is_pktlog_buff_clear = start_log.is_pktlog_buff_clear;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013728
13729 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013730 if (status != QDF_STATUS_SUCCESS) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070013731 sme_err("sme_acquire_global_lock failed(status=%d)", status);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053013732 qdf_mem_free(req_msg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013733 return status;
13734 }
13735
13736 /* Serialize the req through MC thread */
Rajeev Kumar8eaedf62017-01-21 11:03:13 -080013737 message.bodyptr = req_msg;
13738 message.type = SIR_HAL_START_STOP_LOGGING;
13739 status = scheduler_post_msg(QDF_MODULE_ID_WMA, &message);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013740 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070013741 sme_err("scheduler_post_msg failed!(err=%d)", status);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053013742 qdf_mem_free(req_msg);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013743 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013744 }
13745 sme_release_global_lock(&mac->sme);
13746
13747 return status;
13748}
13749
13750/**
13751 * sme_neighbor_middle_of_roaming() - Function to know if
13752 * STA is in the middle of roaming states
13753 * @hal: Handle returned by macOpen
13754 * @sessionId: sessionId of the STA session
13755 *
13756 * This function is a wrapper to call
13757 * csr_neighbor_middle_of_roaming to know STA is in the
13758 * middle of roaming states
13759 *
13760 * Return: True or False
13761 *
13762 */
13763bool sme_neighbor_middle_of_roaming(tHalHandle hHal, uint8_t sessionId)
13764{
Sandeep Puligillaca631612016-11-08 11:53:52 -080013765 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hHal);
13766 bool val = false;
13767
13768 if (CSR_IS_SESSION_VALID(mac_ctx, sessionId))
13769 val = csr_neighbor_middle_of_roaming(mac_ctx, sessionId);
13770 else
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070013771 sme_err("Invalid Session: %d", sessionId);
13772
Sandeep Puligillaca631612016-11-08 11:53:52 -080013773 return val;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013774}
13775
13776/*
13777 * sme_send_flush_logs_cmd_to_fw() - Flush FW logs
13778 * @mac: MAC handle
13779 *
13780 * This function is used to send the command that will
13781 * be used to flush the logs in the firmware
13782 *
Deepak Dhamdhere0f076bd2016-06-02 11:29:21 -070013783 * Return: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013784 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013785QDF_STATUS sme_send_flush_logs_cmd_to_fw(tpAniSirGlobal mac)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013786{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013787 QDF_STATUS status;
Rajeev Kumar37d478b2017-04-17 16:59:28 -070013788 struct scheduler_msg message = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013789
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013790 /* Serialize the req through MC thread */
13791 message.bodyptr = NULL;
13792 message.type = SIR_HAL_FLUSH_LOG_TO_FW;
Rajeev Kumar8eaedf62017-01-21 11:03:13 -080013793 status = scheduler_post_msg(QDF_MODULE_ID_WMA, &message);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013794 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070013795 sme_err("scheduler_post_msg failed!(err=%d)", status);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013796 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013797 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013798 return status;
13799}
13800
13801/**
13802 * sme_enable_uapsd_for_ac() - enable uapsd for access catagory requerst to WMA
13803 * @cds_ctx: cds context
13804 * @sta_id: station id
13805 * @ac: access catagory
13806 * @tid: tid value
13807 * @pri: user priority
13808 * @srvc_int: service interval
13809 * @sus_int: suspend interval
13810 * @dir: tspec direction
13811 * @psb: PSB value
13812 * @sessionId: session id
13813 * @delay_interval: delay interval
13814 *
Anurag Chouhanf04e84f2016-03-03 10:12:12 +053013815 * Return: QDF status
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013816 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013817QDF_STATUS sme_enable_uapsd_for_ac(void *cds_ctx, uint8_t sta_id,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013818 sme_ac_enum_type ac, uint8_t tid,
13819 uint8_t pri, uint32_t srvc_int,
13820 uint32_t sus_int,
13821 sme_tspec_dir_type dir,
13822 uint8_t psb, uint32_t sessionId,
13823 uint32_t delay_interval)
13824{
13825 void *wma_handle;
13826 t_wma_trigger_uapsd_params uapsd_params;
13827 enum uapsd_ac access_category;
13828
13829 if (!psb) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053013830 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013831 "No need to configure auto trigger:psb is 0");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013832 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013833 }
13834
Anurag Chouhan6d760662016-02-20 16:05:43 +053013835 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013836 if (!wma_handle) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053013837 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013838 "wma_handle is NULL");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013839 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013840 }
13841
13842 switch (ac) {
13843 case SME_AC_BK:
13844 access_category = UAPSD_BK;
13845 break;
13846 case SME_AC_BE:
13847 access_category = UAPSD_BE;
13848 break;
13849 case SME_AC_VI:
13850 access_category = UAPSD_VI;
13851 break;
13852 case SME_AC_VO:
13853 access_category = UAPSD_VO;
13854 break;
13855 default:
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013856 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013857 }
13858
13859 uapsd_params.wmm_ac = access_category;
13860 uapsd_params.user_priority = pri;
13861 uapsd_params.service_interval = srvc_int;
13862 uapsd_params.delay_interval = delay_interval;
13863 uapsd_params.suspend_interval = sus_int;
13864
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013865 if (QDF_STATUS_SUCCESS !=
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013866 wma_trigger_uapsd_params(wma_handle, sessionId, &uapsd_params)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053013867 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013868 "Failed to Trigger Uapsd params for sessionId %d",
13869 sessionId);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013870 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013871 }
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013872 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013873}
13874
13875/**
13876 * sme_disable_uapsd_for_ac() - disable uapsed access catagory request to WMA
13877 * @cds_ctx: cds context
13878 * @sta_id: station id
13879 * @ac: access catagory
13880 * @sessionId: session id
13881 *
Anurag Chouhanf04e84f2016-03-03 10:12:12 +053013882 * Return: QDF status
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013883 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013884QDF_STATUS sme_disable_uapsd_for_ac(void *cds_ctx, uint8_t sta_id,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013885 sme_ac_enum_type ac,
13886 uint32_t sessionId)
13887{
13888 void *wma_handle;
13889 enum uapsd_ac access_category;
13890
13891 switch (ac) {
13892 case SME_AC_BK:
13893 access_category = UAPSD_BK;
13894 break;
13895 case SME_AC_BE:
13896 access_category = UAPSD_BE;
13897 break;
13898 case SME_AC_VI:
13899 access_category = UAPSD_VI;
13900 break;
13901 case SME_AC_VO:
13902 access_category = UAPSD_VO;
13903 break;
13904 default:
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013905 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013906 }
13907
Anurag Chouhan6d760662016-02-20 16:05:43 +053013908 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013909 if (!wma_handle) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053013910 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013911 "wma handle is NULL");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013912 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013913 }
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013914 if (QDF_STATUS_SUCCESS !=
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013915 wma_disable_uapsd_per_ac(wma_handle, sessionId, access_category)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053013916 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013917 "Failed to disable uapsd for ac %d for sessionId %d",
13918 ac, sessionId);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013919 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013920 }
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013921 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013922}
13923
13924/**
13925 * sme_update_nss() - SME API to change the number for spatial streams
13926 * (1 or 2)
13927 * @hal: Handle returned by mac open
13928 * @nss: Number of spatial streams
13929 *
13930 * This function is used to update the number of spatial streams supported.
13931 *
13932 * Return: Success upon successfully changing nss else failure
13933 *
13934 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013935QDF_STATUS sme_update_nss(tHalHandle h_hal, uint8_t nss)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013936{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013937 QDF_STATUS status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013938 tpAniSirGlobal mac_ctx = PMAC_STRUCT(h_hal);
13939 uint32_t i, value = 0;
13940 union {
13941 uint16_t cfg_value16;
13942 tSirMacHTCapabilityInfo ht_cap_info;
13943 } uHTCapabilityInfo;
13944 tCsrRoamSession *csr_session;
13945
13946 status = sme_acquire_global_lock(&mac_ctx->sme);
13947
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013948 if (QDF_STATUS_SUCCESS == status) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013949 mac_ctx->roam.configParam.enable2x2 = (nss == 1) ? 0 : 1;
13950
13951 /* get the HT capability info*/
13952 sme_cfg_get_int(mac_ctx, WNI_CFG_HT_CAP_INFO, &value);
13953 uHTCapabilityInfo.cfg_value16 = (0xFFFF & value);
13954
13955 for (i = 0; i < CSR_ROAM_SESSION_MAX; i++) {
13956 if (CSR_IS_SESSION_VALID(mac_ctx, i)) {
13957 csr_session = &mac_ctx->roam.roamSession[i];
13958 csr_session->htConfig.ht_tx_stbc =
13959 uHTCapabilityInfo.ht_cap_info.txSTBC;
13960 }
13961 }
13962
13963 sme_release_global_lock(&mac_ctx->sme);
13964 }
13965 return status;
13966}
13967
13968/**
Archana Ramachandran5041b252016-04-25 14:29:25 -070013969 * sme_update_user_configured_nss() - sets the nss based on user request
13970 * @hal: Pointer to HAL
13971 * @nss: number of streams
13972 *
13973 * Return: None
13974 */
13975void sme_update_user_configured_nss(tHalHandle hal, uint8_t nss)
13976{
13977 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
13978
13979 mac_ctx->user_configured_nss = nss;
13980}
13981
13982/**
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013983 * sme_set_rssi_threshold_breached_cb() - set rssi threshold breached callback
Arun Khandavalli4b55da72016-07-19 19:55:01 +053013984 * @h_hal: global hal handle
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013985 * @cb: callback function pointer
13986 *
13987 * This function stores the rssi threshold breached callback function.
13988 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013989 * Return: QDF_STATUS enumeration.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013990 */
Arun Khandavalli4b55da72016-07-19 19:55:01 +053013991QDF_STATUS sme_set_rssi_threshold_breached_cb(tHalHandle h_hal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013992 void (*cb)(void *, struct rssi_breach_event *))
13993{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013994 QDF_STATUS status = QDF_STATUS_SUCCESS;
Arun Khandavalli4b55da72016-07-19 19:55:01 +053013995 tpAniSirGlobal mac;
13996
13997 if (!h_hal) {
13998 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
13999 FL("hHal is not valid"));
14000 return QDF_STATUS_E_INVAL;
14001 }
14002 mac = PMAC_STRUCT(h_hal);
14003
14004 status = sme_acquire_global_lock(&mac->sme);
14005 if (!QDF_IS_STATUS_SUCCESS(status)) {
14006 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
14007 FL("sme_acquire_global_lock failed!(status=%d)"),
14008 status);
14009 return status;
14010 }
14011
14012 mac->sme.rssi_threshold_breached_cb = cb;
14013 sme_release_global_lock(&mac->sme);
14014 return status;
14015}
14016
14017/**
14018 * sme_set_rssi_threshold_breached_cb() - Reset rssi threshold breached callback
14019 * @hal: global hal handle
14020 *
14021 * This function de-registers the rssi threshold breached callback function.
14022 *
14023 * Return: QDF_STATUS enumeration.
14024 */
14025QDF_STATUS sme_reset_rssi_threshold_breached_cb(tHalHandle hal)
14026{
14027 QDF_STATUS status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014028 tpAniSirGlobal mac = PMAC_STRUCT(hal);
14029
14030 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014031 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070014032 sme_err("sme_acquire_global_lock failed!(status=%d)", status);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014033 return status;
14034 }
14035
Arun Khandavalli4b55da72016-07-19 19:55:01 +053014036 mac->sme.rssi_threshold_breached_cb = NULL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014037 sme_release_global_lock(&mac->sme);
14038 return status;
14039}
14040
14041/**
14042 * sme_is_any_session_in_connected_state() - SME wrapper API to
14043 * check if any session is in connected state or not.
14044 *
14045 * @hal: Handle returned by mac open
14046 *
14047 * This function is used to check if any valid sme session is in
14048 * connected state or not.
14049 *
14050 * Return: true if any session is connected, else false.
14051 *
14052 */
14053bool sme_is_any_session_in_connected_state(tHalHandle h_hal)
14054{
14055 tpAniSirGlobal mac_ctx = PMAC_STRUCT(h_hal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014056 QDF_STATUS status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014057 bool ret = false;
14058
14059 status = sme_acquire_global_lock(&mac_ctx->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014060 if (QDF_STATUS_SUCCESS == status) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014061 ret = csr_is_any_session_in_connect_state(mac_ctx);
14062 sme_release_global_lock(&mac_ctx->sme);
14063 }
14064 return ret;
14065}
14066
14067/**
14068 * sme_set_rssi_monitoring() - set rssi monitoring
14069 * @hal: global hal handle
14070 * @input: request message
14071 *
14072 * This function constructs the vos message and fill in message type,
14073 * bodyptr with @input and posts it to WDA queue.
14074 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014075 * Return: QDF_STATUS enumeration
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014076 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014077QDF_STATUS sme_set_rssi_monitoring(tHalHandle hal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014078 struct rssi_monitor_req *input)
14079{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014080 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014081 tpAniSirGlobal mac = PMAC_STRUCT(hal);
Rajeev Kumar37d478b2017-04-17 16:59:28 -070014082 struct scheduler_msg message = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014083 struct rssi_monitor_req *req_msg;
14084
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070014085 SME_ENTER();
Anurag Chouhan600c3a02016-03-01 10:33:54 +053014086 req_msg = qdf_mem_malloc(sizeof(*req_msg));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014087 if (!req_msg) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070014088 sme_err("memory allocation failed");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014089 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014090 }
14091
14092 *req_msg = *input;
14093
14094 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014095 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070014096 sme_err("sme_acquire_global_lock failed!(status=%d)", status);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053014097 qdf_mem_free(req_msg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014098 return status;
14099 }
14100
14101 /* Serialize the req through MC thread */
Rajeev Kumar8eaedf62017-01-21 11:03:13 -080014102 message.bodyptr = req_msg;
14103 message.type = WMA_SET_RSSI_MONITOR_REQ;
14104 status = scheduler_post_msg(QDF_MODULE_ID_WMA, &message);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014105 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070014106 sme_err("scheduler_post_msg failed!(err=%d)", status);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053014107 qdf_mem_free(req_msg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014108 }
14109 sme_release_global_lock(&mac->sme);
14110
14111 return status;
14112}
14113
14114/**
14115 * sme_fw_mem_dump() - Get FW memory dump
14116 * @hHal: hal handle
14117 * @recvd_req: received memory dump request.
14118 *
14119 * This API is invoked by HDD to indicate FW to start
14120 * dumping firmware memory.
14121 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014122 * Return: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014123 */
14124#ifdef WLAN_FEATURE_MEMDUMP
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014125QDF_STATUS sme_fw_mem_dump(tHalHandle hHal, void *recvd_req)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014126{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014127 QDF_STATUS status = QDF_STATUS_SUCCESS;
14128 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014129 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Rajeev Kumar37d478b2017-04-17 16:59:28 -070014130 struct scheduler_msg msg = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014131 struct fw_dump_req *send_req;
14132 struct fw_dump_seg_req seg_req;
14133 int loop;
14134
Anurag Chouhan600c3a02016-03-01 10:33:54 +053014135 send_req = qdf_mem_malloc(sizeof(*send_req));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014136 if (!send_req) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053014137 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014138 FL("Memory allocation failed for WDA_FW_MEM_DUMP"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014139 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014140 }
Anurag Chouhan600c3a02016-03-01 10:33:54 +053014141 qdf_mem_copy(send_req, recvd_req, sizeof(*send_req));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014142
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053014143 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014144 FL("request_id:%d num_seg:%d"),
14145 send_req->request_id, send_req->num_seg);
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053014146 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014147 FL("Segment Information"));
14148 for (loop = 0; loop < send_req->num_seg; loop++) {
14149 seg_req = send_req->segment[loop];
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053014150 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014151 FL("seg_number:%d"), loop);
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053014152 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014153 FL("seg_id:%d start_addr_lo:0x%x start_addr_hi:0x%x"),
14154 seg_req.seg_id, seg_req.seg_start_addr_lo,
14155 seg_req.seg_start_addr_hi);
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053014156 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014157 FL("seg_length:%d dst_addr_lo:0x%x dst_addr_hi:0x%x"),
14158 seg_req.seg_length, seg_req.dst_addr_lo,
14159 seg_req.dst_addr_hi);
14160 }
14161
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014162 if (QDF_STATUS_SUCCESS == sme_acquire_global_lock(&pMac->sme)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014163 msg.bodyptr = send_req;
14164 msg.type = WMA_FW_MEM_DUMP_REQ;
14165 msg.reserved = 0;
14166
Rajeev Kumar8eaedf62017-01-21 11:03:13 -080014167 qdf_status = scheduler_post_msg(QDF_MODULE_ID_WMA, &msg);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014168 if (QDF_STATUS_SUCCESS != qdf_status) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053014169 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014170 FL("Not able to post WMA_FW_MEM_DUMP"));
Anurag Chouhan600c3a02016-03-01 10:33:54 +053014171 qdf_mem_free(send_req);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014172 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014173 }
14174 sme_release_global_lock(&pMac->sme);
14175 } else {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053014176 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014177 FL("Failed to acquire SME Global Lock"));
Anurag Chouhan600c3a02016-03-01 10:33:54 +053014178 qdf_mem_free(send_req);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014179 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014180 }
14181
14182 return status;
14183}
14184#else
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014185QDF_STATUS sme_fw_mem_dump(tHalHandle hHal, void *recvd_req)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014186{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014187 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014188}
14189#endif /* WLAN_FEATURE_MEMDUMP */
14190
14191/*
Manishekar Chandrasekaran7009f252016-04-21 19:14:15 +053014192 * sme_pdev_set_pcl() - Send WMI_PDEV_SET_PCL_CMDID to the WMA
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014193 * @hal: Handle returned by macOpen
14194 * @msg: PCL channel list and length structure
14195 *
Manishekar Chandrasekaran7009f252016-04-21 19:14:15 +053014196 * Sends the command to WMA to send WMI_PDEV_SET_PCL_CMDID to FW
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014197 * Return: QDF_STATUS_SUCCESS on successful posting
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014198 */
Tushnim Bhattacharyya0c4ad2d2017-03-09 15:59:03 -080014199QDF_STATUS sme_pdev_set_pcl(struct policy_mgr_pcl_list msg)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014200{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014201 QDF_STATUS status = QDF_STATUS_SUCCESS;
Tushnim Bhattacharyya0c4ad2d2017-03-09 15:59:03 -080014202 tpAniSirGlobal mac = sme_get_mac_context();
Rajeev Kumar37d478b2017-04-17 16:59:28 -070014203 struct scheduler_msg message = {0};
Manishekar Chandrasekaran7009f252016-04-21 19:14:15 +053014204 struct wmi_pcl_chan_weights *req_msg;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014205 uint32_t len, i;
14206
14207 len = sizeof(*req_msg);
14208
Anurag Chouhan600c3a02016-03-01 10:33:54 +053014209 req_msg = qdf_mem_malloc(len);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014210 if (!req_msg) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070014211 sme_err("qdf_mem_malloc failed");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014212 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014213 }
14214
Manishekar Chandrasekaran7009f252016-04-21 19:14:15 +053014215 for (i = 0; i < msg.pcl_len; i++) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014216 req_msg->pcl_list[i] = msg.pcl_list[i];
Manishekar Chandrasekaran7009f252016-04-21 19:14:15 +053014217 req_msg->weight_list[i] = msg.weight_list[i];
14218 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014219
14220 req_msg->pcl_len = msg.pcl_len;
14221
14222 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014223 if (status != QDF_STATUS_SUCCESS) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070014224 sme_err("sme_acquire_global_lock failed!(status=%d)", status);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053014225 qdf_mem_free(req_msg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014226 return status;
14227 }
14228
14229 /* Serialize the req through MC thread */
Rajeev Kumar8eaedf62017-01-21 11:03:13 -080014230 message.bodyptr = req_msg;
14231 message.type = SIR_HAL_PDEV_SET_PCL_TO_FW;
14232 status = scheduler_post_msg(QDF_MODULE_ID_WMA, &message);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014233 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070014234 sme_err("scheduler_post_msg failed!(err=%d)", status);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053014235 qdf_mem_free(req_msg);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014236 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014237 }
14238 sme_release_global_lock(&mac->sme);
14239
14240 return status;
14241}
14242
14243/*
Manishekar Chandrasekarand9640342016-04-27 12:28:26 +053014244 * sme_pdev_set_hw_mode() - Send WMI_PDEV_SET_HW_MODE_CMDID to the WMA
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014245 * @hal: Handle returned by macOpen
14246 * @msg: HW mode structure containing hw mode and callback details
14247 *
Manishekar Chandrasekarand9640342016-04-27 12:28:26 +053014248 * Sends the command to CSR to send WMI_PDEV_SET_HW_MODE_CMDID to FW
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014249 * Return: QDF_STATUS_SUCCESS on successful posting
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014250 */
Tushnim Bhattacharyya0c4ad2d2017-03-09 15:59:03 -080014251QDF_STATUS sme_pdev_set_hw_mode(struct policy_mgr_hw_mode msg)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014252{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014253 QDF_STATUS status = QDF_STATUS_SUCCESS;
Tushnim Bhattacharyya0c4ad2d2017-03-09 15:59:03 -080014254 tpAniSirGlobal mac = sme_get_mac_context();
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014255 tSmeCmd *cmd = NULL;
14256
14257 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014258 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070014259 sme_err("Failed to acquire lock");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014260 return QDF_STATUS_E_RESOURCES;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014261 }
14262
Krunal Soni78618d92017-02-14 21:46:31 -080014263 cmd = csr_get_command_buffer(mac);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014264 if (!cmd) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070014265 sme_err("Get command buffer failed");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014266 sme_release_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014267 return QDF_STATUS_E_NULL_VALUE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014268 }
14269
14270 cmd->command = e_sme_command_set_hw_mode;
Ganesh Kondabattiniae1c6a22017-05-02 18:02:11 +053014271 cmd->sessionId = msg.session_id;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014272 cmd->u.set_hw_mode_cmd.hw_mode_index = msg.hw_mode_index;
14273 cmd->u.set_hw_mode_cmd.set_hw_mode_cb = msg.set_hw_mode_cb;
Chandrasekaran, Manishekaref70c0d2015-10-20 19:54:55 +053014274 cmd->u.set_hw_mode_cmd.reason = msg.reason;
14275 cmd->u.set_hw_mode_cmd.session_id = msg.session_id;
Tushnim Bhattacharyya0c4ad2d2017-03-09 15:59:03 -080014276 cmd->u.set_hw_mode_cmd.context = msg.context;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014277
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070014278 sme_debug("Queuing set hw mode to CSR, session: %d reason: %d",
Chandrasekaran, Manishekarce2172e2016-02-18 16:12:43 +053014279 cmd->u.set_hw_mode_cmd.session_id,
14280 cmd->u.set_hw_mode_cmd.reason);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014281 csr_queue_sme_command(mac, cmd, false);
14282
14283 sme_release_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014284 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014285}
14286
14287/**
14288 * sme_register_hw_mode_trans_cb() - HW mode transition callback registration
14289 * @hal: Handle returned by macOpen
14290 * @callback: HDD callback to be registered
14291 *
14292 * Registers the HDD callback with SME. This callback will be invoked when
14293 * HW mode transition event is received from the FW
14294 *
14295 * Return: None
14296 */
14297void sme_register_hw_mode_trans_cb(tHalHandle hal,
14298 hw_mode_transition_cb callback)
14299{
14300 tpAniSirGlobal mac = PMAC_STRUCT(hal);
14301
14302 mac->sme.sme_hw_mode_trans_cb = callback;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014303}
14304
14305/**
14306 * sme_nss_update_request() - Send beacon templete update to FW with new
14307 * nss value
14308 * @hal: Handle returned by macOpen
14309 * @vdev_id: the session id
14310 * @new_nss: the new nss value
14311 * @cback: hdd callback
14312 * @next_action: next action to happen at policy mgr after beacon update
14313 *
14314 * Sends the command to CSR to send to PE
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014315 * Return: QDF_STATUS_SUCCESS on successful posting
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014316 */
Tushnim Bhattacharyya0c4ad2d2017-03-09 15:59:03 -080014317QDF_STATUS sme_nss_update_request(uint32_t vdev_id,
14318 uint8_t new_nss, policy_mgr_nss_update_cback cback,
14319 uint8_t next_action, struct wlan_objmgr_psoc *psoc,
14320 enum policy_mgr_conn_update_reason reason)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014321{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014322 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Tushnim Bhattacharyya0c4ad2d2017-03-09 15:59:03 -080014323 tpAniSirGlobal mac = sme_get_mac_context();
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014324 tSmeCmd *cmd = NULL;
14325
14326 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014327 if (QDF_IS_STATUS_SUCCESS(status)) {
Krunal Soni78618d92017-02-14 21:46:31 -080014328 cmd = csr_get_command_buffer(mac);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014329 if (!cmd) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070014330 sme_err("Get command buffer failed");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014331 sme_release_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014332 return QDF_STATUS_E_NULL_VALUE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014333 }
14334 cmd->command = e_sme_command_nss_update;
14335 /* Sessionized modules may require this info */
14336 cmd->sessionId = vdev_id;
14337 cmd->u.nss_update_cmd.new_nss = new_nss;
14338 cmd->u.nss_update_cmd.session_id = vdev_id;
14339 cmd->u.nss_update_cmd.nss_update_cb = cback;
Tushnim Bhattacharyya0c4ad2d2017-03-09 15:59:03 -080014340 cmd->u.nss_update_cmd.context = psoc;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014341 cmd->u.nss_update_cmd.next_action = next_action;
Chandrasekaran, Manishekarce2172e2016-02-18 16:12:43 +053014342 cmd->u.nss_update_cmd.reason = reason;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014343
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070014344 sme_debug("Queuing e_sme_command_nss_update to CSR");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014345 csr_queue_sme_command(mac, cmd, false);
14346 sme_release_global_lock(&mac->sme);
14347 }
14348 return status;
14349}
14350
14351/**
14352 * sme_soc_set_dual_mac_config() - Set dual mac configurations
14353 * @hal: Handle returned by macOpen
14354 * @msg: Structure containing the dual mac config parameters
14355 *
14356 * Queues configuration information to CSR to configure
14357 * WLAN firmware for the dual MAC features
14358 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014359 * Return: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014360 */
Tushnim Bhattacharyya0c4ad2d2017-03-09 15:59:03 -080014361QDF_STATUS sme_soc_set_dual_mac_config(struct policy_mgr_dual_mac_config msg)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014362{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014363 QDF_STATUS status = QDF_STATUS_SUCCESS;
Tushnim Bhattacharyya0c4ad2d2017-03-09 15:59:03 -080014364 tpAniSirGlobal mac = sme_get_mac_context();
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014365 tSmeCmd *cmd;
14366
14367 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014368 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070014369 sme_err("Failed to acquire lock");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014370 return QDF_STATUS_E_RESOURCES;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014371 }
14372
Krunal Soni78618d92017-02-14 21:46:31 -080014373 cmd = csr_get_command_buffer(mac);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014374 if (!cmd) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070014375 sme_err("Get command buffer failed");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014376 sme_release_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014377 return QDF_STATUS_E_NULL_VALUE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014378 }
14379
14380 cmd->command = e_sme_command_set_dual_mac_config;
14381 cmd->u.set_dual_mac_cmd.scan_config = msg.scan_config;
14382 cmd->u.set_dual_mac_cmd.fw_mode_config = msg.fw_mode_config;
14383 cmd->u.set_dual_mac_cmd.set_dual_mac_cb = msg.set_dual_mac_cb;
14384
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070014385 sme_debug("set_dual_mac_config scan_config: %x fw_mode_config: %x",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014386 cmd->u.set_dual_mac_cmd.scan_config,
14387 cmd->u.set_dual_mac_cmd.fw_mode_config);
14388 csr_queue_sme_command(mac, cmd, false);
14389
14390 sme_release_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014391 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014392}
14393
Ravi Joshi9e891ba2015-11-09 19:03:46 -080014394#ifdef FEATURE_LFR_SUBNET_DETECTION
14395/**
14396 * sme_gateway_param_update() - to update gateway parameters with WMA
14397 * @Hal: hal handle
14398 * @gw_params: request parameters from HDD
14399 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014400 * Return: QDF_STATUS
Ravi Joshi9e891ba2015-11-09 19:03:46 -080014401 *
14402 * This routine will update gateway parameters to WMA
14403 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014404QDF_STATUS sme_gateway_param_update(tHalHandle Hal,
Ravi Joshi9e891ba2015-11-09 19:03:46 -080014405 struct gateway_param_update_req *gw_params)
14406{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014407 QDF_STATUS qdf_status;
Rajeev Kumar37d478b2017-04-17 16:59:28 -070014408 struct scheduler_msg message = {0};
Ravi Joshi9e891ba2015-11-09 19:03:46 -080014409 struct gateway_param_update_req *request_buf;
14410
Anurag Chouhan600c3a02016-03-01 10:33:54 +053014411 request_buf = qdf_mem_malloc(sizeof(*request_buf));
Ravi Joshi9e891ba2015-11-09 19:03:46 -080014412 if (NULL == request_buf) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053014413 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Ravi Joshi9e891ba2015-11-09 19:03:46 -080014414 FL("Not able to allocate memory for gw param update request"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014415 return QDF_STATUS_E_NOMEM;
Ravi Joshi9e891ba2015-11-09 19:03:46 -080014416 }
14417
14418 *request_buf = *gw_params;
14419
Rajeev Kumar8eaedf62017-01-21 11:03:13 -080014420 message.type = WMA_GW_PARAM_UPDATE_REQ;
14421 message.reserved = 0;
14422 message.bodyptr = request_buf;
14423 qdf_status = scheduler_post_msg(QDF_MODULE_ID_WMA, &message);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014424 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053014425 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Ravi Joshi9e891ba2015-11-09 19:03:46 -080014426 FL("Not able to post WMA_GW_PARAM_UPDATE_REQ message to HAL"));
Anurag Chouhan600c3a02016-03-01 10:33:54 +053014427 qdf_mem_free(request_buf);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014428 return QDF_STATUS_E_FAILURE;
Ravi Joshi9e891ba2015-11-09 19:03:46 -080014429 }
14430
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014431 return QDF_STATUS_SUCCESS;
Ravi Joshi9e891ba2015-11-09 19:03:46 -080014432}
14433#endif /* FEATURE_LFR_SUBNET_DETECTION */
14434
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014435/**
Archana Ramachandrana20ef812015-11-13 16:12:13 -080014436 * sme_soc_set_antenna_mode() - set antenna mode
14437 * @hal: Handle returned by macOpen
14438 * @msg: Structure containing the antenna mode parameters
14439 *
14440 * Send the command to CSR to send
14441 * WMI_SOC_SET_ANTENNA_MODE_CMDID to FW
14442 *
14443 * Return: QDF_STATUS
14444 */
14445QDF_STATUS sme_soc_set_antenna_mode(tHalHandle hal,
14446 struct sir_antenna_mode_param *msg)
14447{
14448 QDF_STATUS status = QDF_STATUS_SUCCESS;
14449 tpAniSirGlobal mac = PMAC_STRUCT(hal);
14450 tSmeCmd *cmd;
14451
14452 if (NULL == msg) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070014453 sme_err("antenna mode mesg is NULL");
Archana Ramachandrana20ef812015-11-13 16:12:13 -080014454 return QDF_STATUS_E_FAILURE;
14455 }
14456
14457 status = sme_acquire_global_lock(&mac->sme);
14458 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070014459 sme_err("Failed to acquire lock");
Archana Ramachandrana20ef812015-11-13 16:12:13 -080014460 return QDF_STATUS_E_RESOURCES;
14461 }
14462
Krunal Soni78618d92017-02-14 21:46:31 -080014463 cmd = csr_get_command_buffer(mac);
Archana Ramachandrana20ef812015-11-13 16:12:13 -080014464 if (!cmd) {
14465 sme_release_global_lock(&mac->sme);
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070014466 sme_err("Get command buffer failed");
Archana Ramachandrana20ef812015-11-13 16:12:13 -080014467 return QDF_STATUS_E_NULL_VALUE;
14468 }
14469
14470 cmd->command = e_sme_command_set_antenna_mode;
14471 cmd->u.set_antenna_mode_cmd = *msg;
14472
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070014473 sme_debug("Antenna mode rx_chains: %d tx_chains: %d",
Archana Ramachandrana20ef812015-11-13 16:12:13 -080014474 cmd->u.set_antenna_mode_cmd.num_rx_chains,
14475 cmd->u.set_antenna_mode_cmd.num_tx_chains);
14476
14477 csr_queue_sme_command(mac, cmd, false);
14478 sme_release_global_lock(&mac->sme);
14479
14480 return QDF_STATUS_SUCCESS;
14481}
14482
14483/**
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014484 * sme_set_peer_authorized() - call peer authorized callback
14485 * @peer_addr: peer mac address
14486 * @auth_cb: auth callback
14487 * @vdev_id: vdev id
14488 *
Anurag Chouhanf04e84f2016-03-03 10:12:12 +053014489 * Return: QDF Status
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014490 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014491QDF_STATUS sme_set_peer_authorized(uint8_t *peer_addr,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014492 sme_peer_authorized_fp auth_cb,
14493 uint32_t vdev_id)
14494{
14495 void *wma_handle;
14496
Anurag Chouhan6d760662016-02-20 16:05:43 +053014497 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014498 if (!wma_handle) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053014499 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014500 "wma handle is NULL");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014501 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014502 }
14503
14504 wma_set_peer_authorized_cb(wma_handle, auth_cb);
14505 return wma_set_peer_param(wma_handle, peer_addr, WMI_PEER_AUTHORIZE,
14506 1, vdev_id);
14507}
14508
14509/*
Amar Singhal7c1e8982016-05-19 15:08:09 -070014510 * sme_handle_set_fcc_channel() - set spec. tx power for non-fcc channel
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014511 * @hal: HAL pointer
Amar Singhal83a047a2016-05-19 15:56:11 -070014512 * @fcc_constraint: flag to enable/disable the constraint
14513 * @scan_pending: whether there is pending scan
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014514 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014515 * Return: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014516 */
Amar Singhal83a047a2016-05-19 15:56:11 -070014517QDF_STATUS sme_handle_set_fcc_channel(tHalHandle hal, bool fcc_constraint,
14518 bool scan_pending)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014519{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014520 QDF_STATUS status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014521 tpAniSirGlobal mac_ptr = PMAC_STRUCT(hal);
14522
14523 status = sme_acquire_global_lock(&mac_ptr->sme);
14524
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014525 if (QDF_STATUS_SUCCESS == status) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014526
14527 if (fcc_constraint != mac_ptr->scan.fcc_constraint) {
14528 mac_ptr->scan.fcc_constraint = fcc_constraint;
Amar Singhal83a047a2016-05-19 15:56:11 -070014529 if (scan_pending)
14530 mac_ptr->scan.defer_update_channel_list = true;
14531 else
14532 status = csr_update_channel_list(mac_ptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014533 }
14534
14535 sme_release_global_lock(&mac_ptr->sme);
14536 }
14537
14538 return status;
14539}
14540/**
14541 * sme_setdef_dot11mode() - Updates pMac with default dot11mode
14542 * @hal: Global MAC pointer
14543 *
14544 * Return: NULL.
14545 */
14546void sme_setdef_dot11mode(tHalHandle hal)
14547{
14548 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
14549 csr_set_default_dot11_mode(mac_ctx);
14550}
14551
14552/**
14553 * sme_update_roam_scan_hi_rssi_scan_params() - update high rssi scan
14554 * params
14555 * @hal_handle - The handle returned by macOpen.
14556 * @session_id - Session Identifier
14557 * @notify_id - Identifies 1 of the 4 parameters to be modified
14558 * @val New value of the parameter
14559 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014560 * Return: QDF_STATUS - SME update config successful.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014561 * Other status means SME failed to update
14562 */
14563
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014564QDF_STATUS sme_update_roam_scan_hi_rssi_scan_params(tHalHandle hal_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014565 uint8_t session_id,
14566 uint32_t notify_id,
14567 int32_t val)
14568{
14569 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal_handle);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014570 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014571 tCsrNeighborRoamConfig *nr_config = NULL;
14572 tpCsrNeighborRoamControlInfo nr_info = NULL;
14573 uint32_t reason = 0;
14574
Naveen Rawatc36f7eb2016-11-10 20:01:03 -080014575 if (session_id >= CSR_ROAM_SESSION_MAX) {
14576 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
14577 FL("Invalid sme session id: %d"), session_id);
14578 return QDF_STATUS_E_INVAL;
14579 }
14580
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014581 status = sme_acquire_global_lock(&mac_ctx->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014582 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014583 nr_config = &mac_ctx->roam.configParam.neighborRoamConfig;
14584 nr_info = &mac_ctx->roam.neighborRoamInfo[session_id];
14585 switch (notify_id) {
14586 case eCSR_HI_RSSI_SCAN_MAXCOUNT_ID:
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053014587 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014588 "%s: gRoamScanHirssiMaxCount %d => %d",
14589 __func__, nr_config->nhi_rssi_scan_max_count,
14590 val);
14591 nr_config->nhi_rssi_scan_max_count = val;
14592 nr_info->cfgParams.hi_rssi_scan_max_count = val;
14593 reason = REASON_ROAM_SCAN_HI_RSSI_MAXCOUNT_CHANGED;
14594 break;
14595
14596 case eCSR_HI_RSSI_SCAN_RSSI_DELTA_ID:
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053014597 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014598 FL("gRoamScanHiRssiDelta %d => %d"),
14599 nr_config->nhi_rssi_scan_rssi_delta,
14600 val);
14601 nr_config->nhi_rssi_scan_rssi_delta = val;
14602 nr_info->cfgParams.hi_rssi_scan_rssi_delta = val;
14603 reason = REASON_ROAM_SCAN_HI_RSSI_DELTA_CHANGED;
14604 break;
14605
14606 case eCSR_HI_RSSI_SCAN_DELAY_ID:
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053014607 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014608 FL("gRoamScanHiRssiDelay %d => %d"),
14609 nr_config->nhi_rssi_scan_delay,
14610 val);
14611 nr_config->nhi_rssi_scan_delay = val;
14612 nr_info->cfgParams.hi_rssi_scan_delay = val;
14613 reason = REASON_ROAM_SCAN_HI_RSSI_DELAY_CHANGED;
14614 break;
14615
14616 case eCSR_HI_RSSI_SCAN_RSSI_UB_ID:
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053014617 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014618 FL("gRoamScanHiRssiUpperBound %d => %d"),
14619 nr_config->nhi_rssi_scan_rssi_ub,
14620 val);
14621 nr_config->nhi_rssi_scan_rssi_ub = val;
14622 nr_info->cfgParams.hi_rssi_scan_rssi_ub = val;
14623 reason = REASON_ROAM_SCAN_HI_RSSI_UB_CHANGED;
14624 break;
14625
14626 default:
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053014627 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014628 FL("invalid parameter notify_id %d"),
14629 notify_id);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014630 status = QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014631 break;
14632 }
14633 sme_release_global_lock(&mac_ctx->sme);
14634 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014635 if (mac_ctx->roam.configParam.isRoamOffloadScanEnabled &&
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014636 status == QDF_STATUS_SUCCESS) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014637 csr_roam_offload_scan(mac_ctx, session_id,
14638 ROAM_SCAN_OFFLOAD_UPDATE_CFG, reason);
14639 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014640
14641 return status;
14642}
14643
Krishna Kumaar Natarajan052c6e62015-09-28 15:32:55 -070014644/**
14645 * sme_update_tgt_services() - update the target services config.
14646 * @hal: HAL pointer.
14647 * @cfg: wma_tgt_services parameters.
14648 *
14649 * update the target services config.
14650 *
14651 * Return: None.
14652 */
14653void sme_update_tgt_services(tHalHandle hal, struct wma_tgt_services *cfg)
14654{
14655 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
14656
14657 mac_ctx->lteCoexAntShare = cfg->lte_coex_ant_share;
14658 mac_ctx->beacon_offload = cfg->beacon_offload;
mukul sharma72c8b222015-09-04 17:02:01 +053014659 mac_ctx->pmf_offload = cfg->pmf_offload;
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053014660 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO,
mukul sharma72c8b222015-09-04 17:02:01 +053014661 FL("mac_ctx->pmf_offload: %d"), mac_ctx->pmf_offload);
Krishna Kumaar Natarajan052c6e62015-09-28 15:32:55 -070014662
14663 return;
14664}
Masti, Narayanraddic4a7ab82015-11-25 15:41:10 +053014665
Chandrasekaran, Manishekar2859de42016-02-11 16:17:38 +053014666/**
14667 * sme_is_session_id_valid() - Check if the session id is valid
14668 * @hal: Pointer to HAL
14669 * @session_id: Session id
14670 *
14671 * Checks if the session id is valid or not
14672 *
14673 * Return: True is the session id is valid, false otherwise
14674 */
14675bool sme_is_session_id_valid(tHalHandle hal, uint32_t session_id)
14676{
14677 tpAniSirGlobal mac = PMAC_STRUCT(hal);
14678 if (!mac) {
Chandrasekaran, Manishekard3cb4772016-02-22 22:21:10 +053014679 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
14680 "%s: null mac pointer", __func__);
Chandrasekaran, Manishekar2859de42016-02-11 16:17:38 +053014681 return false;
14682 }
14683
14684 if (CSR_IS_SESSION_VALID(mac, session_id)) {
14685 return true;
14686 } else {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070014687 sme_err("Invalid session id: %d", session_id);
Chandrasekaran, Manishekar2859de42016-02-11 16:17:38 +053014688 return false;
14689 }
14690}
14691
Masti, Narayanraddic4a7ab82015-11-25 15:41:10 +053014692#ifdef FEATURE_WLAN_TDLS
14693
14694/**
14695 * sme_get_opclass() - determine operating class
14696 * @hal: Pointer to HAL
14697 * @channel: channel id
14698 * @bw_offset: bandwidth offset
14699 * @opclass: pointer to operating class
14700 *
14701 * Function will determine operating class from regdm_get_opclass_from_channel
14702 *
14703 * Return: none
14704 */
14705void sme_get_opclass(tHalHandle hal, uint8_t channel, uint8_t bw_offset,
14706 uint8_t *opclass)
14707{
14708 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
14709
14710 /* redgm opclass table contains opclass for 40MHz low primary,
14711 * 40MHz high primary and 20MHz. No support for 80MHz yet. So
14712 * first we will check if bit for 40MHz is set and if so find
14713 * matching opclass either with low primary or high primary
14714 * (a channel would never be in both) and then search for opclass
14715 * matching 20MHz, else for any BW.
14716 */
14717 if (bw_offset & (1 << BW_40_OFFSET_BIT)) {
Kiran Kumar Lokerea3de2262017-04-12 12:15:04 -070014718 *opclass = wlan_reg_dmn_get_opclass_from_channel(
Masti, Narayanraddic4a7ab82015-11-25 15:41:10 +053014719 mac_ctx->scan.countryCodeCurrent,
14720 channel, BW40_LOW_PRIMARY);
14721 if (!(*opclass)) {
Kiran Kumar Lokerea3de2262017-04-12 12:15:04 -070014722 *opclass = wlan_reg_dmn_get_opclass_from_channel(
Masti, Narayanraddic4a7ab82015-11-25 15:41:10 +053014723 mac_ctx->scan.countryCodeCurrent,
14724 channel, BW40_HIGH_PRIMARY);
14725 }
14726 } else if (bw_offset & (1 << BW_20_OFFSET_BIT)) {
Kiran Kumar Lokerea3de2262017-04-12 12:15:04 -070014727 *opclass = wlan_reg_dmn_get_opclass_from_channel(
Masti, Narayanraddic4a7ab82015-11-25 15:41:10 +053014728 mac_ctx->scan.countryCodeCurrent,
14729 channel, BW20);
14730 } else {
Kiran Kumar Lokerea3de2262017-04-12 12:15:04 -070014731 *opclass = wlan_reg_dmn_get_opclass_from_channel(
Masti, Narayanraddic4a7ab82015-11-25 15:41:10 +053014732 mac_ctx->scan.countryCodeCurrent,
14733 channel, BWALL);
14734 }
14735}
14736#endif
Ryan Hsu3c8f79f2015-12-02 16:45:09 -080014737
14738#ifdef FEATURE_GREEN_AP
14739/**
14740 * sme_send_egap_conf_params() - set the enhanced green ap configuration params
14741 * @enable: enable/disable the enhanced green ap feature
14742 * @inactivity_time: inactivity timeout value
14743 * @wait_time: wait timeout value
14744 * @flag: feature flag in bitmasp
14745 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014746 * Return: Return QDF_STATUS, otherwise appropriate failure code
Ryan Hsu3c8f79f2015-12-02 16:45:09 -080014747 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014748QDF_STATUS sme_send_egap_conf_params(uint32_t enable, uint32_t inactivity_time,
Ryan Hsu3c8f79f2015-12-02 16:45:09 -080014749 uint32_t wait_time, uint32_t flags)
14750{
Rajeev Kumar37d478b2017-04-17 16:59:28 -070014751 struct scheduler_msg message = {0};
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014752 QDF_STATUS status;
Ryan Hsu3c8f79f2015-12-02 16:45:09 -080014753 struct egap_conf_params *egap_params;
14754
Anurag Chouhan600c3a02016-03-01 10:33:54 +053014755 egap_params = qdf_mem_malloc(sizeof(*egap_params));
Ryan Hsu3c8f79f2015-12-02 16:45:09 -080014756 if (NULL == egap_params) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053014757 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Ryan Hsu3c8f79f2015-12-02 16:45:09 -080014758 "%s: fail to alloc egap_params", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014759 return QDF_STATUS_E_NOMEM;
Ryan Hsu3c8f79f2015-12-02 16:45:09 -080014760 }
14761
14762 egap_params->enable = enable;
14763 egap_params->inactivity_time = inactivity_time;
14764 egap_params->wait_time = wait_time;
14765 egap_params->flags = flags;
14766
14767 message.type = WMA_SET_EGAP_CONF_PARAMS;
14768 message.bodyptr = egap_params;
Rajeev Kumar8eaedf62017-01-21 11:03:13 -080014769 status = scheduler_post_msg(QDF_MODULE_ID_WMA, &message);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014770 if (!QDF_IS_STATUS_SUCCESS(status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053014771 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Ryan Hsu3c8f79f2015-12-02 16:45:09 -080014772 "%s: Not able to post msg to WMA!", __func__);
14773
Anurag Chouhan600c3a02016-03-01 10:33:54 +053014774 qdf_mem_free(egap_params);
Ryan Hsu3c8f79f2015-12-02 16:45:09 -080014775 }
14776 return status;
14777}
14778#endif
Sandeep Puligillae0875662016-02-12 16:09:21 -080014779
14780/**
Anurag Chouhanbf5e0e22016-09-12 12:54:09 +053014781 * sme_set_fw_test() - set fw test
14782 * @fw_test: fw test param
14783 *
14784 * Return: Return QDF_STATUS, otherwise appropriate failure code
14785 */
14786QDF_STATUS sme_set_fw_test(struct set_fwtest_params *fw_test)
14787{
14788 void *wma_handle;
14789
14790 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
14791 if (!wma_handle) {
14792 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
14793 "wma handle is NULL");
14794 return QDF_STATUS_E_FAILURE;
14795 }
14796 wma_process_fw_test_cmd(wma_handle, fw_test);
14797 return QDF_STATUS_SUCCESS;
14798}
14799
14800/**
Sandeep Puligillae0875662016-02-12 16:09:21 -080014801 * sme_ht40_stop_obss_scan() - ht40 obss stop scan
14802 * @hal: mac handel
14803 * @vdev_id: vdev identifier
14804 *
14805 * Return: Return QDF_STATUS, otherwise appropriate failure code
14806 */
14807QDF_STATUS sme_ht40_stop_obss_scan(tHalHandle hal, uint32_t vdev_id)
14808{
14809 void *wma_handle;
14810
14811 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
14812 if (!wma_handle) {
14813 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
14814 "wma handle is NULL");
14815 return QDF_STATUS_E_FAILURE;
14816 }
14817 wma_ht40_stop_obss_scan(wma_handle, vdev_id);
14818 return QDF_STATUS_SUCCESS;
14819}
Archana Ramachandran20d2e232016-02-11 16:58:40 -080014820
14821/**
14822 * sme_update_mimo_power_save() - Update MIMO power save
14823 * configuration
14824 * @hal: The handle returned by macOpen
14825 * @is_ht_smps_enabled: enable/disable ht smps
14826 * @ht_smps_mode: smps mode disabled/static/dynamic
Archana Ramachandranfec24812016-02-16 16:31:56 -080014827 * @send_smps_action: flag to send smps force mode command
14828 * to FW
Archana Ramachandran20d2e232016-02-11 16:58:40 -080014829 *
14830 * Return: QDF_STATUS if SME update mimo power save
14831 * configuration sucsess else failue status
14832 */
14833QDF_STATUS sme_update_mimo_power_save(tHalHandle hal,
14834 uint8_t is_ht_smps_enabled,
Archana Ramachandranfec24812016-02-16 16:31:56 -080014835 uint8_t ht_smps_mode,
14836 bool send_smps_action)
Archana Ramachandran20d2e232016-02-11 16:58:40 -080014837{
14838 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
Archana Ramachandranfec24812016-02-16 16:31:56 -080014839
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070014840 sme_debug("SMPS enable: %d mode: %d send action: %d",
Archana Ramachandranfec24812016-02-16 16:31:56 -080014841 is_ht_smps_enabled, ht_smps_mode,
14842 send_smps_action);
Archana Ramachandran20d2e232016-02-11 16:58:40 -080014843 mac_ctx->roam.configParam.enableHtSmps =
14844 is_ht_smps_enabled;
14845 mac_ctx->roam.configParam.htSmps = ht_smps_mode;
Archana Ramachandranfec24812016-02-16 16:31:56 -080014846 mac_ctx->roam.configParam.send_smps_action =
14847 send_smps_action;
Archana Ramachandran20d2e232016-02-11 16:58:40 -080014848
14849 return QDF_STATUS_SUCCESS;
14850}
14851
14852/**
14853 * sme_is_sta_smps_allowed() - check if the supported nss for
14854 * the session is greater than 1x1 to enable sta SMPS
14855 * @hal: The handle returned by macOpen
14856 * @session_id: session id
14857 *
14858 * Return: bool returns true if supported nss is greater than
14859 * 1x1 else false
14860 */
14861bool sme_is_sta_smps_allowed(tHalHandle hal, uint8_t session_id)
14862{
14863 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
14864 tCsrRoamSession *csr_session;
14865
Archana Ramachandran20d2e232016-02-11 16:58:40 -080014866 csr_session = CSR_GET_SESSION(mac_ctx, session_id);
14867 if (NULL == csr_session) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070014868 sme_err("SME session not valid: %d", session_id);
Sreelakshmi Konamki58697e12016-05-25 17:30:18 +053014869 return false;
14870 }
14871
14872 if (!CSR_IS_SESSION_VALID(mac_ctx, session_id)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070014873 sme_err("CSR session not valid: %d", session_id);
Archana Ramachandran20d2e232016-02-11 16:58:40 -080014874 return false;
14875 }
14876
14877 return (csr_session->supported_nss_1x1 == true) ? false : true;
14878}
Gupta, Kapil4cb1d7d2016-04-16 18:16:25 -070014879
14880/**
14881 * sme_add_beacon_filter() - set the beacon filter configuration
14882 * @hal: The handle returned by macOpen
14883 * @session_id: session id
14884 * @ie_map: bitwise array of IEs
14885 *
14886 * Return: Return QDF_STATUS, otherwise appropriate failure code
14887 */
14888QDF_STATUS sme_add_beacon_filter(tHalHandle hal,
14889 uint32_t session_id,
14890 uint32_t *ie_map)
14891{
Rajeev Kumar37d478b2017-04-17 16:59:28 -070014892 struct scheduler_msg message = {0};
Gupta, Kapil4cb1d7d2016-04-16 18:16:25 -070014893 QDF_STATUS qdf_status;
14894 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
14895 struct beacon_filter_param *filter_param;
14896
14897 if (!CSR_IS_SESSION_VALID(mac_ctx, session_id)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070014898 sme_err("CSR session not valid: %d", session_id);
Gupta, Kapil4cb1d7d2016-04-16 18:16:25 -070014899 return QDF_STATUS_E_FAILURE;
14900 }
14901
14902 filter_param = qdf_mem_malloc(sizeof(*filter_param));
14903 if (NULL == filter_param) {
14904 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
14905 "%s: fail to alloc filter_param", __func__);
14906 return QDF_STATUS_E_FAILURE;
14907 }
14908
14909 filter_param->vdev_id = session_id;
14910
14911 qdf_mem_copy(filter_param->ie_map, ie_map,
14912 BCN_FLT_MAX_ELEMS_IE_LIST * sizeof(uint32_t));
14913
14914 message.type = WMA_ADD_BCN_FILTER_CMDID;
14915 message.bodyptr = filter_param;
Rajeev Kumar8eaedf62017-01-21 11:03:13 -080014916 qdf_status = scheduler_post_msg(QDF_MODULE_ID_WMA,
Gupta, Kapil4cb1d7d2016-04-16 18:16:25 -070014917 &message);
14918 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
14919 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
14920 "%s: Not able to post msg to WDA!",
14921 __func__);
14922
14923 qdf_mem_free(filter_param);
14924 }
14925 return qdf_status;
14926}
14927
14928/**
14929 * sme_remove_beacon_filter() - set the beacon filter configuration
14930 * @hal: The handle returned by macOpen
14931 * @session_id: session id
14932 *
14933 * Return: Return QDF_STATUS, otherwise appropriate failure code
14934 */
14935QDF_STATUS sme_remove_beacon_filter(tHalHandle hal, uint32_t session_id)
14936{
Rajeev Kumar37d478b2017-04-17 16:59:28 -070014937 struct scheduler_msg message = {0};
Gupta, Kapil4cb1d7d2016-04-16 18:16:25 -070014938 QDF_STATUS qdf_status;
14939 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
14940 struct beacon_filter_param *filter_param;
14941
14942 if (!CSR_IS_SESSION_VALID(mac_ctx, session_id)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070014943 sme_err("CSR session not valid: %d", session_id);
Gupta, Kapil4cb1d7d2016-04-16 18:16:25 -070014944 return QDF_STATUS_E_FAILURE;
14945 }
14946
14947 filter_param = qdf_mem_malloc(sizeof(*filter_param));
14948 if (NULL == filter_param) {
14949 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
14950 "%s: fail to alloc filter_param", __func__);
14951 return QDF_STATUS_E_FAILURE;
14952 }
14953
14954 filter_param->vdev_id = session_id;
14955
14956 message.type = WMA_REMOVE_BCN_FILTER_CMDID;
14957 message.bodyptr = filter_param;
Rajeev Kumar8eaedf62017-01-21 11:03:13 -080014958 qdf_status = scheduler_post_msg(QDF_MODULE_ID_WMA,
Gupta, Kapil4cb1d7d2016-04-16 18:16:25 -070014959 &message);
14960 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
14961 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
14962 "%s: Not able to post msg to WDA!",
14963 __func__);
14964
14965 qdf_mem_free(filter_param);
14966 }
14967 return qdf_status;
14968}
Arun Khandavalli2476ef52016-04-26 20:19:43 +053014969
Arun Khandavalli2476ef52016-04-26 20:19:43 +053014970/**
Kondabattini, Ganesh3f2d02c2016-09-13 12:23:47 +053014971 * sme_send_disassoc_req_frame - send disassoc req
14972 * @hal: handler to hal
14973 * @session_id: session id
14974 * @peer_mac: peer mac address
14975 * @reason: reason for disassociation
14976 * wait_for_ack: wait for acknowledgment
14977 *
14978 * function to send disassoc request to lim
14979 *
14980 * return: none
14981 */
14982void sme_send_disassoc_req_frame(tHalHandle hal, uint8_t session_id,
14983 uint8_t *peer_mac, uint16_t reason, uint8_t wait_for_ack)
14984{
14985 struct sme_send_disassoc_frm_req *msg;
14986 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
14987 A_UINT8 *buf;
14988 A_UINT16 tmp;
14989
14990 msg = qdf_mem_malloc(sizeof(struct sme_send_disassoc_frm_req));
14991
14992 if (NULL == msg)
14993 qdf_status = QDF_STATUS_E_FAILURE;
14994 else
14995 qdf_status = QDF_STATUS_SUCCESS;
14996
14997 if (!QDF_IS_STATUS_SUCCESS(qdf_status))
14998 return;
14999
Kondabattini, Ganesh3f2d02c2016-09-13 12:23:47 +053015000 msg->msg_type = (uint16_t) eWNI_SME_SEND_DISASSOC_FRAME;
15001
15002 msg->length = (uint16_t) sizeof(struct sme_send_disassoc_frm_req);
15003
15004 buf = &msg->session_id;
15005
15006 /* session id */
15007 *buf = (A_UINT8) session_id;
15008 buf += sizeof(A_UINT8);
15009
15010 /* transaction id */
15011 *buf = 0;
15012 *(buf + 1) = 0;
15013 buf += sizeof(A_UINT16);
15014
15015 /* Set the peer MAC address before sending the message to LIM */
15016 qdf_mem_copy(buf, peer_mac, QDF_MAC_ADDR_SIZE);
15017
15018 buf += QDF_MAC_ADDR_SIZE;
15019
15020 /* reasoncode */
15021 tmp = (uint16_t) reason;
15022 qdf_mem_copy(buf, &tmp, sizeof(uint16_t));
15023 buf += sizeof(uint16_t);
15024
15025 *buf = wait_for_ack;
15026 buf += sizeof(uint8_t);
15027
Rajeev Kumard138ac52017-01-30 18:38:37 -080015028 qdf_status = umac_send_mb_message_to_mac(msg);
Kondabattini, Ganesh3f2d02c2016-09-13 12:23:47 +053015029
15030 if (qdf_status != QDF_STATUS_SUCCESS)
15031 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
15032 FL("cds_send_mb_message Failed"));
15033}
15034
Jeff Johnsona867e0c2017-01-26 13:43:51 -080015035QDF_STATUS sme_get_bpf_offload_capabilities(tHalHandle hal,
15036 bpf_get_offload_cb callback,
15037 void *context)
Arun Khandavalli2476ef52016-04-26 20:19:43 +053015038{
15039 QDF_STATUS status = QDF_STATUS_SUCCESS;
15040 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
Rajeev Kumar37d478b2017-04-17 16:59:28 -070015041 struct scheduler_msg cds_msg = {0};
Arun Khandavalli2476ef52016-04-26 20:19:43 +053015042
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070015043 SME_ENTER();
Arun Khandavalli2476ef52016-04-26 20:19:43 +053015044
15045 status = sme_acquire_global_lock(&mac_ctx->sme);
15046 if (QDF_STATUS_SUCCESS == status) {
15047 /* Serialize the req through MC thread */
Jeff Johnsona867e0c2017-01-26 13:43:51 -080015048 mac_ctx->sme.bpf_get_offload_cb = callback;
15049 mac_ctx->sme.bpf_get_offload_context = context;
Arun Khandavalli2476ef52016-04-26 20:19:43 +053015050 cds_msg.bodyptr = NULL;
15051 cds_msg.type = WDA_BPF_GET_CAPABILITIES_REQ;
Rajeev Kumar8eaedf62017-01-21 11:03:13 -080015052 status = scheduler_post_msg(QDF_MODULE_ID_WMA, &cds_msg);
Arun Khandavalli2476ef52016-04-26 20:19:43 +053015053 if (!QDF_IS_STATUS_SUCCESS(status)) {
15054 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
15055 FL("Post bpf get offload msg fail"));
15056 status = QDF_STATUS_E_FAILURE;
15057 }
15058 sme_release_global_lock(&mac_ctx->sme);
15059 } else {
15060 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
15061 FL("sme_acquire_global_lock error"));
15062 }
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070015063 SME_EXIT();
Arun Khandavalli2476ef52016-04-26 20:19:43 +053015064 return status;
15065}
15066
15067
15068/**
15069 * sme_set_bpf_instructions() - Set BPF bpf filter instructions.
15070 * @hal: HAL handle
15071 * @bpf_set_offload: struct to set bpf filter instructions.
15072 *
15073 * Return: QDF_STATUS enumeration.
15074 */
15075QDF_STATUS sme_set_bpf_instructions(tHalHandle hal,
15076 struct sir_bpf_set_offload *req)
15077{
15078 QDF_STATUS status = QDF_STATUS_SUCCESS;
15079 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
Rajeev Kumar37d478b2017-04-17 16:59:28 -070015080 struct scheduler_msg cds_msg = {0};
Arun Khandavalli2476ef52016-04-26 20:19:43 +053015081 struct sir_bpf_set_offload *set_offload;
15082
Arun Khandavallica198b52016-04-26 20:53:35 +053015083 set_offload = qdf_mem_malloc(sizeof(*set_offload) +
15084 req->current_length);
Arun Khandavalli2476ef52016-04-26 20:19:43 +053015085
15086 if (NULL == set_offload) {
15087 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
15088 FL("Failed to alloc set_offload"));
15089 return QDF_STATUS_E_NOMEM;
15090 }
15091
15092 set_offload->session_id = req->session_id;
15093 set_offload->filter_id = req->filter_id;
15094 set_offload->current_offset = req->current_offset;
15095 set_offload->total_length = req->total_length;
Rajeev Kumare5a16822016-07-27 13:11:42 -070015096 set_offload->current_length = req->current_length;
Arun Khandavalli2476ef52016-04-26 20:19:43 +053015097 if (set_offload->total_length) {
Arun Khandavallica198b52016-04-26 20:53:35 +053015098 set_offload->program = ((uint8_t *)set_offload) +
15099 sizeof(*set_offload);
Arun Khandavalli2476ef52016-04-26 20:19:43 +053015100 qdf_mem_copy(set_offload->program, req->program,
15101 set_offload->current_length);
15102 }
15103 status = sme_acquire_global_lock(&mac_ctx->sme);
15104 if (QDF_STATUS_SUCCESS == status) {
15105 /* Serialize the req through MC thread */
15106 cds_msg.bodyptr = set_offload;
15107 cds_msg.type = WDA_BPF_SET_INSTRUCTIONS_REQ;
Rajeev Kumar8eaedf62017-01-21 11:03:13 -080015108 status = scheduler_post_msg(QDF_MODULE_ID_WMA, &cds_msg);
Arun Khandavalli2476ef52016-04-26 20:19:43 +053015109
15110 if (!QDF_IS_STATUS_SUCCESS(status)) {
15111 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
15112 FL("Post BPF set offload msg fail"));
15113 status = QDF_STATUS_E_FAILURE;
Arun Khandavalli2476ef52016-04-26 20:19:43 +053015114 qdf_mem_free(set_offload);
15115 }
15116 sme_release_global_lock(&mac_ctx->sme);
15117 } else {
15118 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
15119 FL("sme_acquire_global_lock failed"));
Arun Khandavalli2476ef52016-04-26 20:19:43 +053015120 qdf_mem_free(set_offload);
15121 }
15122 return status;
15123}
15124
15125/**
Abhishek Singh1c676222016-05-09 14:20:28 +053015126 * sme_get_wni_dot11_mode() - return configured wni dot11mode
15127 * @hal: hal pointer
15128 *
15129 * Return: wni dot11 mode.
15130 */
15131uint32_t sme_get_wni_dot11_mode(tHalHandle hal)
15132{
15133 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
15134
15135 return csr_translate_to_wni_cfg_dot11_mode(mac_ctx,
15136 mac_ctx->roam.configParam.uCfgDot11Mode);
15137}
15138
15139/**
Manjunathappa Prakash59f861d2016-04-21 10:33:31 -070015140 * sme_create_mon_session() - post message to create PE session for monitormode
15141 * operation
15142 * @hal_handle: Handle to the HAL
15143 * @bssid: pointer to bssid
15144 *
15145 * Return: QDF_STATUS_SUCCESS on success, non-zero error code on failure.
15146 */
15147QDF_STATUS sme_create_mon_session(tHalHandle hal_handle, tSirMacAddr bss_id)
15148{
15149 QDF_STATUS status = QDF_STATUS_E_FAILURE;
15150 struct sir_create_session *msg;
15151
15152 msg = qdf_mem_malloc(sizeof(*msg));
15153 if (NULL != msg) {
15154 msg->type = eWNI_SME_MON_INIT_SESSION;
15155 msg->msg_len = sizeof(*msg);
15156 qdf_mem_copy(msg->bss_id.bytes, bss_id, QDF_MAC_ADDR_SIZE);
Rajeev Kumard138ac52017-01-30 18:38:37 -080015157 status = umac_send_mb_message_to_mac(msg);
Manjunathappa Prakash59f861d2016-04-21 10:33:31 -070015158 }
15159 return status;
15160}
Gupta, Kapil96c7f2f2016-04-25 19:13:41 +053015161
Kapil Gupta4f0c0c12017-02-07 15:21:15 +053015162void sme_set_chan_info_callback(tHalHandle hal_handle,
15163 void (*callback)(struct scan_chan_info *chan_info))
15164{
15165 tpAniSirGlobal mac;
15166
15167 if (hal_handle == NULL) {
15168 QDF_ASSERT(0);
15169 return;
15170 }
15171 mac = PMAC_STRUCT(hal_handle);
15172 mac->chan_info_cb = callback;
15173}
15174
Gupta, Kapil96c7f2f2016-04-25 19:13:41 +053015175/**
15176 * sme_set_adaptive_dwelltime_config() - Update Adaptive dwelltime configuration
15177 * @hal: The handle returned by macOpen
15178 * @params: adaptive_dwelltime_params config
15179 *
15180 * Return: QDF_STATUS if adaptive dwell time update
15181 * configuration sucsess else failure status
15182 */
15183QDF_STATUS sme_set_adaptive_dwelltime_config(tHalHandle hal,
15184 struct adaptive_dwelltime_params *params)
15185{
Rajeev Kumar37d478b2017-04-17 16:59:28 -070015186 struct scheduler_msg message = {0};
Gupta, Kapil96c7f2f2016-04-25 19:13:41 +053015187 QDF_STATUS status;
15188 struct adaptive_dwelltime_params *dwelltime_params;
15189
15190 dwelltime_params = qdf_mem_malloc(sizeof(*dwelltime_params));
15191 if (NULL == dwelltime_params) {
15192 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
15193 "%s: fail to alloc dwelltime_params", __func__);
15194 return QDF_STATUS_E_NOMEM;
15195 }
15196
15197 dwelltime_params->is_enabled = params->is_enabled;
15198 dwelltime_params->dwelltime_mode = params->dwelltime_mode;
15199 dwelltime_params->lpf_weight = params->lpf_weight;
15200 dwelltime_params->passive_mon_intval = params->passive_mon_intval;
15201 dwelltime_params->wifi_act_threshold = params->wifi_act_threshold;
15202
15203 message.type = WMA_SET_ADAPT_DWELLTIME_CONF_PARAMS;
15204 message.bodyptr = dwelltime_params;
Rajeev Kumar8eaedf62017-01-21 11:03:13 -080015205 status = scheduler_post_msg(QDF_MODULE_ID_WMA, &message);
Gupta, Kapil96c7f2f2016-04-25 19:13:41 +053015206 if (!QDF_IS_STATUS_SUCCESS(status)) {
15207 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
15208 "%s: Not able to post msg to WMA!", __func__);
15209
15210 qdf_mem_free(dwelltime_params);
15211 }
15212 return status;
15213}
Naveen Rawata410c5a2016-09-19 14:22:33 -070015214
15215/**
15216 * sme_set_vdev_ies_per_band() - sends the per band IEs to vdev
15217 * @hal: Pointer to HAL
15218 * @vdev_id: vdev_id for which IE is targeted
15219 *
15220 * Return: None
15221 */
15222void sme_set_vdev_ies_per_band(tHalHandle hal, uint8_t vdev_id)
15223{
Naveen Rawata410c5a2016-09-19 14:22:33 -070015224 struct sir_set_vdev_ies_per_band *p_msg;
15225 QDF_STATUS status = QDF_STATUS_E_FAILURE;
15226
15227 p_msg = qdf_mem_malloc(sizeof(*p_msg));
15228 if (NULL == p_msg) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070015229 sme_err("mem alloc failed for sme msg");
Naveen Rawata410c5a2016-09-19 14:22:33 -070015230 return;
15231 }
15232
15233 p_msg->vdev_id = vdev_id;
15234 p_msg->msg_type = eWNI_SME_SET_VDEV_IES_PER_BAND;
15235 p_msg->len = sizeof(*p_msg);
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070015236 sme_debug("sending eWNI_SME_SET_VDEV_IES_PER_BAND: vdev_id: %d",
Naveen Rawata410c5a2016-09-19 14:22:33 -070015237 vdev_id);
Rajeev Kumard138ac52017-01-30 18:38:37 -080015238 status = umac_send_mb_message_to_mac(p_msg);
Naveen Rawata410c5a2016-09-19 14:22:33 -070015239 if (QDF_STATUS_SUCCESS != status)
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070015240 sme_err("Send eWNI_SME_SET_VDEV_IES_PER_BAND fail");
Naveen Rawata410c5a2016-09-19 14:22:33 -070015241}
15242
Kiran Kumar Lokere666bf852016-05-02 12:23:02 -070015243/**
15244 * sme_set_pdev_ht_vht_ies() - sends the set pdev IE req
15245 * @hal: Pointer to HAL
15246 * @enable2x2: 1x1 or 2x2 mode.
15247 *
15248 * Sends the set pdev IE req with Nss value.
15249 *
15250 * Return: None
15251 */
15252void sme_set_pdev_ht_vht_ies(tHalHandle hal, bool enable2x2)
15253{
15254 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
15255 struct sir_set_ht_vht_cfg *ht_vht_cfg;
15256 QDF_STATUS status = QDF_STATUS_E_FAILURE;
15257
Kiran Kumar Lokere666bf852016-05-02 12:23:02 -070015258 if (!((mac_ctx->roam.configParam.uCfgDot11Mode ==
15259 eCSR_CFG_DOT11_MODE_AUTO) ||
15260 (mac_ctx->roam.configParam.uCfgDot11Mode ==
15261 eCSR_CFG_DOT11_MODE_11N) ||
15262 (mac_ctx->roam.configParam.uCfgDot11Mode ==
15263 eCSR_CFG_DOT11_MODE_11N_ONLY) ||
15264 (mac_ctx->roam.configParam.uCfgDot11Mode ==
15265 eCSR_CFG_DOT11_MODE_11AC) ||
15266 (mac_ctx->roam.configParam.uCfgDot11Mode ==
15267 eCSR_CFG_DOT11_MODE_11AC_ONLY)))
15268 return;
15269
15270 status = sme_acquire_global_lock(&mac_ctx->sme);
15271 if (QDF_STATUS_SUCCESS == status) {
15272 ht_vht_cfg = qdf_mem_malloc(sizeof(*ht_vht_cfg));
15273 if (NULL == ht_vht_cfg) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070015274 sme_err("mem alloc failed for ht_vht_cfg");
Kiran Kumar Lokere666bf852016-05-02 12:23:02 -070015275 sme_release_global_lock(&mac_ctx->sme);
15276 return;
15277 }
15278
15279 ht_vht_cfg->pdev_id = 0;
15280 if (enable2x2)
15281 ht_vht_cfg->nss = 2;
15282 else
15283 ht_vht_cfg->nss = 1;
15284 ht_vht_cfg->dot11mode =
15285 (uint8_t)csr_translate_to_wni_cfg_dot11_mode(mac_ctx,
15286 mac_ctx->roam.configParam.uCfgDot11Mode);
15287
15288 ht_vht_cfg->msg_type = eWNI_SME_PDEV_SET_HT_VHT_IE;
15289 ht_vht_cfg->len = sizeof(*ht_vht_cfg);
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070015290 sme_debug("SET_HT_VHT_IE with nss: %d, dot11mode: %d",
15291 ht_vht_cfg->nss,
15292 ht_vht_cfg->dot11mode);
Rajeev Kumard138ac52017-01-30 18:38:37 -080015293 status = umac_send_mb_message_to_mac(ht_vht_cfg);
Kiran Kumar Lokere666bf852016-05-02 12:23:02 -070015294 if (QDF_STATUS_SUCCESS != status) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070015295 sme_err("Send SME_PDEV_SET_HT_VHT_IE fail");
Kiran Kumar Lokere666bf852016-05-02 12:23:02 -070015296 }
15297 sme_release_global_lock(&mac_ctx->sme);
15298 }
15299 return;
15300}
15301
15302/**
15303 * sme_update_vdev_type_nss() - sets the nss per vdev type
15304 * @hal: Pointer to HAL
15305 * @max_supp_nss: max_supported Nss
15306 * @band: 5G or 2.4G band
15307 *
15308 * Sets the per band Nss for each vdev type based on INI and configured
15309 * chain mask value.
15310 *
15311 * Return: None
15312 */
15313void sme_update_vdev_type_nss(tHalHandle hal, uint8_t max_supp_nss,
15314 uint32_t vdev_type_nss, eCsrBand band)
15315{
15316 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
15317 struct vdev_type_nss *vdev_nss;
15318
15319 if (eCSR_BAND_5G == band)
15320 vdev_nss = &mac_ctx->vdev_type_nss_5g;
15321 else
15322 vdev_nss = &mac_ctx->vdev_type_nss_2g;
15323
15324 vdev_nss->sta = QDF_MIN(max_supp_nss, CFG_STA_NSS(vdev_type_nss));
15325 vdev_nss->sap = QDF_MIN(max_supp_nss, CFG_SAP_NSS(vdev_type_nss));
15326 vdev_nss->p2p_go = QDF_MIN(max_supp_nss,
15327 CFG_P2P_GO_NSS(vdev_type_nss));
15328 vdev_nss->p2p_cli = QDF_MIN(max_supp_nss,
15329 CFG_P2P_CLI_NSS(vdev_type_nss));
15330 vdev_nss->p2p_dev = QDF_MIN(max_supp_nss,
15331 CFG_P2P_DEV_NSS(vdev_type_nss));
15332 vdev_nss->ibss = QDF_MIN(max_supp_nss, CFG_IBSS_NSS(vdev_type_nss));
15333 vdev_nss->tdls = QDF_MIN(max_supp_nss, CFG_TDLS_NSS(vdev_type_nss));
15334 vdev_nss->ocb = QDF_MIN(max_supp_nss, CFG_OCB_NSS(vdev_type_nss));
15335
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070015336 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 -070015337 band, vdev_nss->sta, vdev_nss->sap, vdev_nss->p2p_cli,
15338 vdev_nss->p2p_go, vdev_nss->p2p_dev, vdev_nss->ibss,
15339 vdev_nss->tdls, vdev_nss->ocb);
15340}
Peng Xu8fdaa492016-06-22 10:20:47 -070015341
15342/**
Nitesh Shahdb5ea0d2017-03-22 15:17:47 +053015343 * sme_update_hw_dbs_capable() - sets the HW DBS capability
15344 * @hal: Pointer to HAL
15345 * @hw_dbs_capable: HW DBS capability
15346 *
15347 * Sets HW DBS capability based on INI and fw capability.
15348 *
15349 * Return: None
15350 */
15351void sme_update_hw_dbs_capable(tHalHandle hal, uint8_t hw_dbs_capable)
15352{
15353 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
15354 mac_ctx->hw_dbs_capable = hw_dbs_capable;
15355}
15356
15357/**
Peng Xu8fdaa492016-06-22 10:20:47 -070015358 * sme_register_p2p_lo_event() - Register for the p2p lo event
15359 * @hHal: reference to the HAL
15360 * @context: the context of the call
15361 * @callback: the callback to hdd
15362 *
15363 * This function registers the callback function for P2P listen
15364 * offload stop event.
15365 *
15366 * Return: none
15367 */
15368void sme_register_p2p_lo_event(tHalHandle hHal, void *context,
15369 p2p_lo_callback callback)
15370{
15371 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
15372 QDF_STATUS status = QDF_STATUS_E_FAILURE;
15373
15374 status = sme_acquire_global_lock(&pMac->sme);
15375 pMac->sme.p2p_lo_event_callback = callback;
15376 pMac->sme.p2p_lo_event_context = context;
15377 sme_release_global_lock(&pMac->sme);
15378}
Manjeet Singhf82ed072016-07-08 11:40:00 +053015379
15380/**
15381 * sme_process_mac_pwr_dbg_cmd() - enable mac pwr debugging
15382 * @hal: The handle returned by macOpen
15383 * @session_id: session id
15384 * @dbg_args: args for mac pwr debug command
15385 * Return: Return QDF_STATUS, otherwise appropriate failure code
15386 */
15387QDF_STATUS sme_process_mac_pwr_dbg_cmd(tHalHandle hal, uint32_t session_id,
15388 struct sir_mac_pwr_dbg_cmd*
15389 dbg_args)
15390{
Rajeev Kumar37d478b2017-04-17 16:59:28 -070015391 struct scheduler_msg message = {0};
Manjeet Singhf82ed072016-07-08 11:40:00 +053015392 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
15393 struct sir_mac_pwr_dbg_cmd *req;
15394 int i;
15395
15396 if (!CSR_IS_SESSION_VALID(mac_ctx, session_id)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070015397 sme_err("CSR session not valid: %d", session_id);
Manjeet Singhf82ed072016-07-08 11:40:00 +053015398 return QDF_STATUS_E_FAILURE;
15399 }
15400
15401 req = qdf_mem_malloc(sizeof(*req));
15402 if (NULL == req) {
15403 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
15404 "%s: fail to alloc mac_pwr_dbg_args", __func__);
15405 return QDF_STATUS_E_FAILURE;
15406 }
15407 req->module_id = dbg_args->module_id;
15408 req->pdev_id = dbg_args->pdev_id;
15409 req->num_args = dbg_args->num_args;
15410 for (i = 0; i < req->num_args; i++)
15411 req->args[i] = dbg_args->args[i];
15412
15413 message.type = SIR_HAL_POWER_DBG_CMD;
15414 message.bodyptr = req;
15415
Rajeev Kumar8eaedf62017-01-21 11:03:13 -080015416 if (!QDF_IS_STATUS_SUCCESS(scheduler_post_msg
Manjeet Singhf82ed072016-07-08 11:40:00 +053015417 (QDF_MODULE_ID_WMA, &message))) {
15418 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
15419 "%s: Not able to post msg to WDA!",
15420 __func__);
15421 qdf_mem_free(req);
15422 }
15423 return QDF_STATUS_SUCCESS;
15424}
Tushnim Bhattacharyyaf44a9d82016-07-05 10:52:06 -070015425/**
15426 * sme_get_vdev_type_nss() - gets the nss per vdev type
Tushnim Bhattacharyyaf44a9d82016-07-05 10:52:06 -070015427 * @dev_mode: connection type.
15428 * @nss2g: Pointer to the 2G Nss parameter.
15429 * @nss5g: Pointer to the 5G Nss parameter.
15430 *
15431 * Fills the 2G and 5G Nss values based on connection type.
15432 *
15433 * Return: None
15434 */
Tushnim Bhattacharyya0c4ad2d2017-03-09 15:59:03 -080015435void sme_get_vdev_type_nss(enum tQDF_ADAPTER_MODE dev_mode,
Tushnim Bhattacharyyaf44a9d82016-07-05 10:52:06 -070015436 uint8_t *nss_2g, uint8_t *nss_5g)
15437{
Tushnim Bhattacharyya0c4ad2d2017-03-09 15:59:03 -080015438 tpAniSirGlobal mac_ctx = sme_get_mac_context();
15439
15440 if (NULL == mac_ctx) {
15441 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
15442 FL("Invalid MAC context"));
15443 return;
15444 }
Tushnim Bhattacharyyaf44a9d82016-07-05 10:52:06 -070015445 csr_get_vdev_type_nss(mac_ctx, dev_mode, nss_2g, nss_5g);
15446}
Agrawal Ashish21ba2572016-09-03 16:40:10 +053015447
15448/**
15449 * sme_update_sta_roam_policy() - update sta roam policy for
15450 * unsafe and DFS channels.
15451 * @hal_handle: hal handle for getting global mac struct
15452 * @dfs_mode: dfs mode which tell if dfs channel needs to be
15453 * skipped or not
15454 * @skip_unsafe_channels: Param to tell if driver needs to
15455 * skip unsafe channels or not.
15456 * @param session_id: sme_session_id
Agrawal, Ashish9f84c402016-11-30 16:19:44 +053015457 * @sap_operating_band: Band on which SAP is operating
Agrawal Ashish21ba2572016-09-03 16:40:10 +053015458 *
15459 * sme_update_sta_roam_policy update sta rome policies to csr
15460 * this function will call csrUpdateChannelList as well
15461 * to include/exclude DFS channels and unsafe channels.
15462 *
15463 * Return: eHAL_STATUS_SUCCESS or non-zero on failure.
15464 */
15465QDF_STATUS sme_update_sta_roam_policy(tHalHandle hal_handle,
15466 enum sta_roam_policy_dfs_mode dfs_mode,
15467 bool skip_unsafe_channels,
Agrawal, Ashish9f84c402016-11-30 16:19:44 +053015468 uint8_t session_id, uint8_t sap_operating_band)
Agrawal Ashish21ba2572016-09-03 16:40:10 +053015469{
15470 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal_handle);
15471 QDF_STATUS status = QDF_STATUS_SUCCESS;
15472 tSmeConfigParams sme_config;
15473
15474 if (!mac_ctx) {
15475 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_FATAL,
15476 "%s: mac_ctx is null", __func__);
15477 return QDF_STATUS_E_FAILURE;
15478 }
15479 qdf_mem_zero(&sme_config, sizeof(sme_config));
15480 sme_get_config_param(hal_handle, &sme_config);
15481
15482 sme_config.csrConfig.sta_roam_policy_params.dfs_mode =
15483 dfs_mode;
15484 sme_config.csrConfig.sta_roam_policy_params.skip_unsafe_channels =
15485 skip_unsafe_channels;
Agrawal, Ashish9f84c402016-11-30 16:19:44 +053015486 sme_config.csrConfig.sta_roam_policy_params.sap_operating_band =
15487 sap_operating_band;
Agrawal Ashish21ba2572016-09-03 16:40:10 +053015488
15489 sme_update_config(hal_handle, &sme_config);
15490
15491 status = csr_update_channel_list(mac_ctx);
15492 if (QDF_STATUS_SUCCESS != status) {
15493 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
15494 FL("failed to update the supported channel list"));
15495 }
15496 if (mac_ctx->roam.configParam.isRoamOffloadScanEnabled)
15497 csr_roam_offload_scan(mac_ctx, session_id,
15498 ROAM_SCAN_OFFLOAD_UPDATE_CFG,
15499 REASON_ROAM_SCAN_STA_ROAM_POLICY_CHANGED);
Selvaraj, Sridharebda0f22016-08-29 16:05:23 +053015500 return status;
15501}
15502
15503/**
15504 * sme_enable_disable_chanavoidind_event - configure ca event ind
15505 * @hal: handler to hal
15506 * @set_value: enable/disable
15507 *
15508 * function to enable/disable chan avoidance indication
15509 *
15510 * Return: QDF_STATUS
15511 */
15512QDF_STATUS sme_enable_disable_chanavoidind_event(tHalHandle hal,
15513 uint8_t set_value)
15514{
15515 QDF_STATUS status;
15516 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
Rajeev Kumar37d478b2017-04-17 16:59:28 -070015517 struct scheduler_msg msg = {0};
Selvaraj, Sridharebda0f22016-08-29 16:05:23 +053015518
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070015519 sme_debug("set_value: %d", set_value);
Selvaraj, Sridharebda0f22016-08-29 16:05:23 +053015520 status = sme_acquire_global_lock(&mac_ctx->sme);
15521 if (QDF_STATUS_SUCCESS == status) {
Rajeev Kumar8eaedf62017-01-21 11:03:13 -080015522 qdf_mem_zero(&msg, sizeof(struct scheduler_msg));
Selvaraj, Sridharebda0f22016-08-29 16:05:23 +053015523 msg.type = WMA_SEND_FREQ_RANGE_CONTROL_IND;
15524 msg.bodyval = set_value;
Rajeev Kumar8eaedf62017-01-21 11:03:13 -080015525 status = scheduler_post_msg(QDF_MODULE_ID_WMA, &msg);
Selvaraj, Sridharebda0f22016-08-29 16:05:23 +053015526 sme_release_global_lock(&mac_ctx->sme);
15527 return status;
15528 }
Deepak Dhamdhereb106ae52016-08-10 20:55:30 +053015529 return status;
15530}
Agrawal Ashish21ba2572016-09-03 16:40:10 +053015531
Deepak Dhamdhereb106ae52016-08-10 20:55:30 +053015532/*
15533 * sme_set_default_scan_ie() - API to send default scan IE to LIM
15534 * @hal: reference to the HAL
15535 * @session_id: current session ID
15536 * @ie_data: Pointer to Scan IE data
15537 * @ie_len: Length of @ie_data
15538 *
15539 * Return: QDF_STATUS
15540 */
15541QDF_STATUS sme_set_default_scan_ie(tHalHandle hal, uint16_t session_id,
15542 uint8_t *ie_data, uint16_t ie_len)
15543{
15544 QDF_STATUS status;
15545 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
15546 struct hdd_default_scan_ie *set_ie_params;
15547
15548 status = sme_acquire_global_lock(&mac_ctx->sme);
15549 if (QDF_IS_STATUS_SUCCESS(status)) {
15550 set_ie_params = qdf_mem_malloc(sizeof(*set_ie_params));
15551 if (!set_ie_params)
15552 status = QDF_STATUS_E_NOMEM;
15553 else {
15554 set_ie_params->message_type = eWNI_SME_DEFAULT_SCAN_IE;
15555 set_ie_params->length = sizeof(*set_ie_params);
15556 set_ie_params->session_id = session_id;
15557 set_ie_params->ie_len = ie_len;
15558 qdf_mem_copy(set_ie_params->ie_data, ie_data, ie_len);
Rajeev Kumard138ac52017-01-30 18:38:37 -080015559 status = umac_send_mb_message_to_mac(set_ie_params);
Deepak Dhamdhereb106ae52016-08-10 20:55:30 +053015560 }
15561 sme_release_global_lock(&mac_ctx->sme);
15562 }
Agrawal Ashish21ba2572016-09-03 16:40:10 +053015563 return status;
15564}
Padma, Santhosh Kumard7cc0792016-06-28 18:54:12 +053015565
Kabilan Kannan3c0a7352016-12-02 18:49:38 -080015566QDF_STATUS sme_set_sar_power_limits(tHalHandle hal,
15567 struct sar_limit_cmd_params *sar_limit_cmd)
15568{
15569 void *wma_handle;
15570
15571 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
15572 if (!wma_handle) {
15573 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
15574 "wma handle is NULL");
15575 return QDF_STATUS_E_FAILURE;
15576 }
15577
15578 return wma_set_sar_limit(wma_handle, sar_limit_cmd);
15579}
15580
Padma, Santhosh Kumar72e7aec2016-10-12 17:23:44 +053015581#ifdef WLAN_FEATURE_DISA
Padma, Santhosh Kumard7cc0792016-06-28 18:54:12 +053015582/**
15583 * sme_encrypt_decrypt_msg() - handles encrypt/decrypt mesaage
15584 * @hal: HAL handle
15585 * @encrypt_decrypt_params: struct to set encryption/decryption params.
15586 *
15587 * Return: QDF_STATUS enumeration.
15588 */
15589QDF_STATUS sme_encrypt_decrypt_msg(tHalHandle hal,
Jeff Johnsone8216e82017-01-26 15:54:51 -080015590 struct encrypt_decrypt_req_params *encrypt_decrypt_params,
15591 sme_encrypt_decrypt_callback callback,
15592 void *context)
Padma, Santhosh Kumard7cc0792016-06-28 18:54:12 +053015593{
15594 QDF_STATUS status = QDF_STATUS_SUCCESS;
15595 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
Rajeev Kumar37d478b2017-04-17 16:59:28 -070015596 struct scheduler_msg cds_msg = {0};
Padma, Santhosh Kumard7cc0792016-06-28 18:54:12 +053015597 struct encrypt_decrypt_req_params *params;
15598 uint8_t *ptr;
15599
15600 ptr = qdf_mem_malloc(sizeof(*params) +
15601 encrypt_decrypt_params->data_len);
15602 if (ptr == NULL) {
15603 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
15604 FL("Failed to alloc memory for encrypt/decrypt params"));
15605 return QDF_STATUS_E_NOMEM;
15606 }
15607
15608 params = (struct encrypt_decrypt_req_params *)ptr;
15609
15610 *params = *encrypt_decrypt_params;
15611
15612 if (params->data_len) {
15613 params->data = ptr + sizeof(*params);
15614
15615 qdf_mem_copy(params->data, encrypt_decrypt_params->data,
15616 params->data_len);
15617 }
15618
15619 status = sme_acquire_global_lock(&mac_ctx->sme);
15620 if (status == QDF_STATUS_SUCCESS) {
15621 /* Serialize the req through MC thread */
Jeff Johnsone8216e82017-01-26 15:54:51 -080015622 mac_ctx->sme.encrypt_decrypt_cb = callback;
15623 mac_ctx->sme.encrypt_decrypt_context = context;
Padma, Santhosh Kumard7cc0792016-06-28 18:54:12 +053015624 cds_msg.bodyptr = params;
15625 cds_msg.type = WMA_ENCRYPT_DECRYPT_MSG;
Rajeev Kumar8eaedf62017-01-21 11:03:13 -080015626 status = scheduler_post_msg(QDF_MODULE_ID_WMA, &cds_msg);
Padma, Santhosh Kumard7cc0792016-06-28 18:54:12 +053015627
15628 if (!QDF_IS_STATUS_SUCCESS(status)) {
15629 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
15630 FL("Post encrypt/decrypt msg fail"));
15631 status = QDF_STATUS_E_FAILURE;
15632 qdf_mem_free(params);
15633 }
15634 sme_release_global_lock(&mac_ctx->sme);
15635 } else {
15636 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
15637 FL("sme_acquire_global_lock failed"));
15638 qdf_mem_free(params);
15639 }
15640 return status;
15641
15642}
Padma, Santhosh Kumar72e7aec2016-10-12 17:23:44 +053015643#endif
Agrawal Ashishb2d1a452016-05-05 12:23:58 +053015644
15645QDF_STATUS sme_set_cts2self_for_p2p_go(tHalHandle hal_handle)
15646{
Agrawal Ashishb2d1a452016-05-05 12:23:58 +053015647 void *wma_handle;
15648
15649 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
15650 if (!wma_handle) {
15651 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
15652 "wma_handle is NULL");
15653 return QDF_STATUS_E_FAILURE;
15654 }
Agrawal Ashishb2d1a452016-05-05 12:23:58 +053015655 if (QDF_STATUS_SUCCESS !=
15656 wma_set_cts2self_for_p2p_go(wma_handle, true)) {
15657 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
15658 "%s: Failed to set cts2self for p2p GO to firmware",
15659 __func__);
15660 return QDF_STATUS_E_FAILURE;
15661 }
15662 return QDF_STATUS_SUCCESS;
15663}
Yingying Tang95409972016-10-20 15:16:15 +080015664
Agrawal, Ashish35b251d2016-09-08 19:21:03 +053015665/**
15666 * sme_update_tx_fail_cnt_threshold() - update tx fail count Threshold
15667 * @hal: Handle returned by mac_open
15668 * @session_id: Session ID on which tx fail count needs to be updated to FW
15669 * @tx_fail_count: Count for tx fail threshold after which FW will disconnect
15670 *
15671 * This function is used to set tx fail count threshold to firmware.
15672 * firmware will issue disocnnect with peer device once this threshold is
15673 * reached.
15674 *
15675 * Return: Return QDF_STATUS, otherwise appropriate failure code
15676 */
15677QDF_STATUS sme_update_tx_fail_cnt_threshold(tHalHandle hal_handle,
15678 uint8_t session_id, uint32_t tx_fail_count)
15679{
Agrawal, Ashish35b251d2016-09-08 19:21:03 +053015680 QDF_STATUS status = QDF_STATUS_E_FAILURE;
15681 struct sme_tx_fail_cnt_threshold *tx_fail_cnt;
Rajeev Kumar37d478b2017-04-17 16:59:28 -070015682 struct scheduler_msg msg = {0};
Agrawal, Ashish35b251d2016-09-08 19:21:03 +053015683
15684 tx_fail_cnt = qdf_mem_malloc(sizeof(*tx_fail_cnt));
15685 if (NULL == tx_fail_cnt) {
15686 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
15687 "%s: fail to alloc filter_param", __func__);
15688 return QDF_STATUS_E_FAILURE;
15689 }
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070015690 sme_debug("session_id: %d tx_fail_count: %d",
15691 session_id, tx_fail_count);
Agrawal, Ashish35b251d2016-09-08 19:21:03 +053015692 tx_fail_cnt->session_id = session_id;
15693 tx_fail_cnt->tx_fail_cnt_threshold = tx_fail_count;
15694
Rajeev Kumar8eaedf62017-01-21 11:03:13 -080015695 qdf_mem_zero(&msg, sizeof(struct scheduler_msg));
Agrawal, Ashish35b251d2016-09-08 19:21:03 +053015696 msg.type = SIR_HAL_UPDATE_TX_FAIL_CNT_TH;
15697 msg.reserved = 0;
15698 msg.bodyptr = tx_fail_cnt;
Rajeev Kumar8eaedf62017-01-21 11:03:13 -080015699 status = scheduler_post_msg(QDF_MODULE_ID_WMA, &msg);
Agrawal, Ashish35b251d2016-09-08 19:21:03 +053015700
15701 if (!QDF_IS_STATUS_SUCCESS(status)) {
15702 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
15703 FL("Not able to post Tx fail count message to WDA"));
15704 qdf_mem_free(tx_fail_cnt);
15705 }
Sreelakshmi Konamki58c72432016-11-09 17:06:44 +053015706 return status;
15707}
Agrawal, Ashish35b251d2016-09-08 19:21:03 +053015708
Sreelakshmi Konamki58c72432016-11-09 17:06:44 +053015709QDF_STATUS sme_set_lost_link_info_cb(tHalHandle hal,
15710 void (*cb)(void *, struct sir_lost_link_info *))
15711{
15712 QDF_STATUS status = QDF_STATUS_SUCCESS;
15713 tpAniSirGlobal mac = PMAC_STRUCT(hal);
15714
15715 status = sme_acquire_global_lock(&mac->sme);
15716 if (QDF_IS_STATUS_SUCCESS(status)) {
15717 mac->sme.lost_link_info_cb = cb;
15718 sme_release_global_lock(&mac->sme);
Sreelakshmi Konamki58c72432016-11-09 17:06:44 +053015719 } else {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070015720 sme_err("sme_acquire_global_lock error status: %d",
Sreelakshmi Konamki58c72432016-11-09 17:06:44 +053015721 status);
15722 }
Agrawal, Ashish35b251d2016-09-08 19:21:03 +053015723 return status;
15724}
Yingying Tang95409972016-10-20 15:16:15 +080015725
yeshwanth sriram guntukaa1ba9a22017-02-28 16:17:32 +053015726#ifdef FEATURE_WLAN_ESE
15727bool sme_roam_is_ese_assoc(tCsrRoamInfo *roam_info)
15728{
15729 return roam_info->isESEAssoc;
15730}
15731#endif
15732
15733bool sme_neighbor_roam_is11r_assoc(tHalHandle hal_ctx, uint8_t session_id)
15734{
15735 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal_ctx);
15736 return csr_neighbor_roam_is11r_assoc(mac_ctx, session_id);
15737}
Yingying Tang95409972016-10-20 15:16:15 +080015738
15739#ifdef WLAN_FEATURE_WOW_PULSE
15740/**
15741 * sme_set_wow_pulse() - set wow pulse info
15742 * @wow_pulse_set_info: wow_pulse_mode structure pointer
15743 *
15744 * Return: QDF_STATUS
15745 */
15746QDF_STATUS sme_set_wow_pulse(struct wow_pulse_mode *wow_pulse_set_info)
15747{
Rajeev Kumar37d478b2017-04-17 16:59:28 -070015748 struct scheduler_msg message = {0};
Yingying Tang95409972016-10-20 15:16:15 +080015749 QDF_STATUS status;
15750 struct wow_pulse_mode *wow_pulse_set_cmd;
15751
15752 if (!wow_pulse_set_info) {
15753 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
15754 "%s: invalid wow_pulse_set_info pointer", __func__);
15755 return QDF_STATUS_E_FAILURE;
15756 }
15757
15758 wow_pulse_set_cmd = qdf_mem_malloc(sizeof(*wow_pulse_set_cmd));
15759 if (NULL == wow_pulse_set_cmd) {
15760 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
15761 "%s: fail to alloc wow_pulse_set_cmd", __func__);
15762 return QDF_STATUS_E_NOMEM;
15763 }
15764
15765 *wow_pulse_set_cmd = *wow_pulse_set_info;
15766
15767 message.type = WMA_SET_WOW_PULSE_CMD;
15768 message.bodyptr = wow_pulse_set_cmd;
Rajeev Kumar8eaedf62017-01-21 11:03:13 -080015769 status = scheduler_post_msg(QDF_MODULE_ID_WMA,
Yingying Tang95409972016-10-20 15:16:15 +080015770 &message);
15771 if (!QDF_IS_STATUS_SUCCESS(status)) {
15772 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
15773 "%s: Not able to post msg to WDA!",
15774 __func__);
15775 qdf_mem_free(wow_pulse_set_cmd);
15776 status = QDF_STATUS_E_FAILURE;
15777 }
15778
15779 return status;
15780}
15781#endif
Naveen Rawat664a7cb2017-01-19 17:58:14 -080015782
15783/**
15784 * sme_prepare_beacon_from_bss_descp() - prepares beacon frame by populating
15785 * different fields and IEs from bss descriptor.
15786 * @frame_buf: frame buffer to populate
15787 * @bss_descp: bss descriptor
15788 * @bssid: bssid of the beacon frame to populate
15789 * @ie_len: length of IE fields
15790 *
15791 * Return: None
15792 */
15793static void sme_prepare_beacon_from_bss_descp(uint8_t *frame_buf,
15794 tSirBssDescription *bss_descp,
15795 const tSirMacAddr bssid,
Naveen Rawat6dabf4e2017-02-08 15:55:49 -080015796 uint32_t ie_len)
Naveen Rawat664a7cb2017-01-19 17:58:14 -080015797{
15798 tDot11fBeacon1 *bcn_fixed;
15799 tpSirMacMgmtHdr mac_hdr = (tpSirMacMgmtHdr)frame_buf;
15800
15801 /* populate mac header first to indicate beacon */
15802 mac_hdr->fc.protVer = SIR_MAC_PROTOCOL_VERSION;
15803 mac_hdr->fc.type = SIR_MAC_MGMT_FRAME;
15804 mac_hdr->fc.subType = SIR_MAC_MGMT_BEACON;
15805 qdf_mem_copy((uint8_t *) mac_hdr->da,
15806 (uint8_t *) "\xFF\xFF\xFF\xFF\xFF\xFF",
15807 sizeof(struct qdf_mac_addr));
15808 qdf_mem_copy((uint8_t *) mac_hdr->sa, bssid,
15809 sizeof(struct qdf_mac_addr));
15810 qdf_mem_copy((uint8_t *) mac_hdr->bssId, bssid,
15811 sizeof(struct qdf_mac_addr));
15812
15813 /* now populate fixed params */
15814 bcn_fixed = (tDot11fBeacon1 *)(frame_buf + SIR_MAC_HDR_LEN_3A);
15815 /* populate timestamp */
15816 qdf_mem_copy(&bcn_fixed->TimeStamp.timestamp, &bss_descp->timeStamp,
15817 sizeof(bss_descp->timeStamp));
15818 /* populate beacon interval */
15819 bcn_fixed->BeaconInterval.interval = bss_descp->beaconInterval;
15820 /* populate capability */
15821 qdf_mem_copy(&bcn_fixed->Capabilities, &bss_descp->capabilityInfo,
15822 sizeof(bss_descp->capabilityInfo));
15823
15824 /* copy IEs now */
15825 qdf_mem_copy(frame_buf + SIR_MAC_HDR_LEN_3A
15826 + SIR_MAC_B_PR_SSID_OFFSET,
15827 &bss_descp->ieFields, ie_len);
15828}
15829
15830QDF_STATUS sme_get_beacon_frm(tHalHandle hal, tCsrRoamProfile *profile,
15831 const tSirMacAddr bssid,
15832 uint8_t **frame_buf, uint32_t *frame_len)
15833{
15834 QDF_STATUS status = QDF_STATUS_SUCCESS;
Naveen Rawat56b4de82017-02-17 14:38:49 -080015835 tScanResultHandle result_handle = NULL;
Naveen Rawat664a7cb2017-01-19 17:58:14 -080015836 tCsrScanResultFilter *scan_filter;
15837 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
15838 tSirBssDescription *bss_descp;
15839 tScanResultList *bss_list;
15840 uint32_t ie_len;
15841
15842 scan_filter = qdf_mem_malloc(sizeof(tCsrScanResultFilter));
15843 if (NULL == scan_filter) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070015844 sme_err("memory allocation failed");
Naveen Rawat664a7cb2017-01-19 17:58:14 -080015845 status = QDF_STATUS_E_NOMEM;
15846 goto free_scan_flter;
15847 }
15848 status = csr_roam_prepare_filter_from_profile(mac_ctx,
15849 profile, scan_filter);
15850 if (QDF_IS_STATUS_ERROR(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070015851 sme_err("prepare_filter failed");
Naveen Rawat664a7cb2017-01-19 17:58:14 -080015852 goto free_scan_flter;
15853 }
15854
15855 /* update filter to get scan result with just target BSSID */
15856 if (NULL == scan_filter->BSSIDs.bssid) {
15857 scan_filter->BSSIDs.bssid =
15858 qdf_mem_malloc(sizeof(struct qdf_mac_addr));
15859 if (scan_filter->BSSIDs.bssid == NULL) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070015860 sme_err("malloc failed");
Naveen Rawat664a7cb2017-01-19 17:58:14 -080015861 status = QDF_STATUS_E_NOMEM;
15862 goto free_scan_flter;
15863 }
15864 }
15865 scan_filter->BSSIDs.numOfBSSIDs = 1;
15866 qdf_mem_copy(scan_filter->BSSIDs.bssid[0].bytes,
15867 bssid, sizeof(struct qdf_mac_addr));
15868
15869 status = csr_scan_get_result(mac_ctx, scan_filter, &result_handle);
15870 if (QDF_STATUS_SUCCESS != status) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070015871 sme_err("parse_scan_result failed");
Naveen Rawat664a7cb2017-01-19 17:58:14 -080015872 goto free_scan_flter;
15873 }
15874
15875 bss_list = (tScanResultList *)result_handle;
15876 bss_descp = csr_get_fst_bssdescr_ptr(bss_list);
Naveen Rawatae0aaa82017-02-17 14:41:19 -080015877 if (!bss_descp) {
Srinivas Girigowda2c263352017-03-17 17:49:53 -070015878 sme_err("unable to fetch bss descriptor");
Naveen Rawatae0aaa82017-02-17 14:41:19 -080015879 status = QDF_STATUS_E_FAULT;
15880 goto free_scan_flter;
15881 }
Naveen Rawat664a7cb2017-01-19 17:58:14 -080015882
15883 /*
15884 * bss_descp->length = sizeof(tSirBssDescription) - sizeof(length_field)
15885 * - sizeof(ieFields) + ie_len;
15886 */
15887 ie_len = bss_descp->length - sizeof(tSirBssDescription)
15888 + sizeof(bss_descp->length) + sizeof(bss_descp->ieFields);
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070015889 sme_debug("found bss_descriptor ie_len: %d", ie_len);
Naveen Rawat664a7cb2017-01-19 17:58:14 -080015890
15891 /* include mac header and fixed params along with IEs in frame */
15892 *frame_len = SIR_MAC_HDR_LEN_3A + SIR_MAC_B_PR_SSID_OFFSET + ie_len;
15893 *frame_buf = qdf_mem_malloc(*frame_len);
15894 if (NULL == *frame_buf) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070015895 sme_err("memory allocation failed");
Naveen Rawat664a7cb2017-01-19 17:58:14 -080015896 status = QDF_STATUS_E_NOMEM;
15897 goto free_scan_flter;
15898 }
15899
15900 sme_prepare_beacon_from_bss_descp(*frame_buf, bss_descp, bssid, ie_len);
15901
15902free_scan_flter:
15903 /* free scan filter and exit */
15904 if (scan_filter) {
15905 csr_free_scan_filter(mac_ctx, scan_filter);
15906 qdf_mem_free(scan_filter);
15907 }
15908
Naveen Rawatae0aaa82017-02-17 14:41:19 -080015909 return status;
Naveen Rawat664a7cb2017-01-19 17:58:14 -080015910}
15911
Naveen Rawat4195c5e2017-05-22 17:07:45 -070015912QDF_STATUS sme_fast_reassoc(tHalHandle hal, tCsrRoamProfile *profile,
15913 const tSirMacAddr bssid, int channel,
15914 uint8_t vdev_id)
15915{
15916 QDF_STATUS status;
15917 struct wma_roam_invoke_cmd *fastreassoc;
15918 struct scheduler_msg msg = {0};
15919
15920 fastreassoc = qdf_mem_malloc(sizeof(*fastreassoc));
15921 if (NULL == fastreassoc) {
15922 sme_err("qdf_mem_malloc failed for fastreassoc");
15923 return QDF_STATUS_E_NOMEM;
15924 }
15925 fastreassoc->vdev_id = vdev_id;
15926 fastreassoc->channel = channel;
15927 fastreassoc->bssid[0] = bssid[0];
15928 fastreassoc->bssid[1] = bssid[1];
15929 fastreassoc->bssid[2] = bssid[2];
15930 fastreassoc->bssid[3] = bssid[3];
15931 fastreassoc->bssid[4] = bssid[4];
15932 fastreassoc->bssid[5] = bssid[5];
15933
15934 status = sme_get_beacon_frm(hal, profile, bssid,
15935 &fastreassoc->frame_buf,
15936 &fastreassoc->frame_len);
15937
15938 if (QDF_STATUS_SUCCESS != status) {
15939 sme_warn("sme_get_beacon_frm failed");
15940 fastreassoc->frame_buf = NULL;
15941 fastreassoc->frame_len = 0;
15942 }
15943
15944 msg.type = SIR_HAL_ROAM_INVOKE;
15945 msg.reserved = 0;
15946 msg.bodyptr = fastreassoc;
15947 status = scheduler_post_msg(QDF_MODULE_ID_WMA, &msg);
15948 if (QDF_STATUS_SUCCESS != status) {
15949 sme_err("Not able to post ROAM_INVOKE_CMD message to WMA");
15950 qdf_mem_free(fastreassoc);
15951 }
15952
15953 return status;
15954}
15955
Nitesh Shah99dd9552017-03-20 19:27:47 +053015956/**
15957 * sme_delete_all_tdls_peers(): send request to delete tdls peers
15958 * @hal: handler for HAL
15959 * @session_id: session id
15960 *
15961 * This function sends request to lim to delete tdls peers
15962 *
15963 * Return: QDF_STATUS
15964 */
15965QDF_STATUS sme_delete_all_tdls_peers(tHalHandle hal, uint8_t session_id)
15966{
15967 struct sir_del_all_tdls_peers *msg;
15968 QDF_STATUS status = QDF_STATUS_SUCCESS;
15969 tpAniSirGlobal p_mac = PMAC_STRUCT(hal);
15970 tCsrRoamSession *session = CSR_GET_SESSION(p_mac, session_id);
15971
15972 msg = qdf_mem_malloc(sizeof(*msg));
15973 if (NULL == msg) {
Srinivas Girigowda2c263352017-03-17 17:49:53 -070015974 sme_err("memory alloc failed");
Nitesh Shah99dd9552017-03-20 19:27:47 +053015975 return QDF_STATUS_E_FAILURE;
15976 }
15977
15978 qdf_mem_zero(msg, sizeof(*msg));
15979
15980 msg->msg_type = eWNI_SME_DEL_ALL_TDLS_PEERS;
15981 msg->msg_len = (uint16_t) sizeof(*msg);
15982
15983 qdf_mem_copy(msg->bssid.bytes, session->connectedProfile.bssid.bytes,
15984 sizeof(struct qdf_mac_addr));
15985
15986 status = umac_send_mb_message_to_mac(msg);
15987
15988 if (status != QDF_STATUS_SUCCESS) {
Srinivas Girigowda2c263352017-03-17 17:49:53 -070015989 sme_err("cds_send_mb_message_to_mac Failed");
Nitesh Shah99dd9552017-03-20 19:27:47 +053015990 status = QDF_STATUS_E_FAILURE;
15991 }
15992
15993 return status;
15994}
Krishna Kumaar Natarajanf1581df2017-02-21 13:42:08 -080015995
15996QDF_STATUS sme_set_peer_param(uint8_t *peer_addr, uint32_t param_id,
15997 uint32_t param_value, uint32_t vdev_id)
15998{
15999 void *wma_handle;
16000
16001 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
16002 if (!wma_handle) {
Srinivas Girigowda2c263352017-03-17 17:49:53 -070016003 sme_err("wma handle is NULL");
Krishna Kumaar Natarajanf1581df2017-02-21 13:42:08 -080016004 return QDF_STATUS_E_FAILURE;
16005 }
16006
16007 return wma_set_peer_param(wma_handle, peer_addr, param_id,
16008 param_value, vdev_id);
16009}
Tushnim Bhattacharyya9e81b4c2017-02-15 17:11:14 -080016010
16011QDF_STATUS sme_register_set_connection_info_cb(tHalHandle hHal,
Tushnim Bhattacharyya0c4ad2d2017-03-09 15:59:03 -080016012 bool (*set_connection_info_cb)(bool),
16013 bool (*get_connection_info_cb)(uint8_t *session_id,
16014 enum scan_reject_states *reason))
Tushnim Bhattacharyya9e81b4c2017-02-15 17:11:14 -080016015{
16016 QDF_STATUS status = QDF_STATUS_SUCCESS;
16017 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
16018
16019 status = sme_acquire_global_lock(&pMac->sme);
16020 if (QDF_IS_STATUS_SUCCESS(status)) {
16021 pMac->sme.set_connection_info_cb = set_connection_info_cb;
Tushnim Bhattacharyya0c4ad2d2017-03-09 15:59:03 -080016022 pMac->sme.get_connection_info_cb = get_connection_info_cb;
Tushnim Bhattacharyya9e81b4c2017-02-15 17:11:14 -080016023 sme_release_global_lock(&pMac->sme);
16024 }
16025 return status;
16026}
Sreelakshmi Konamki88a2a412017-04-14 15:11:55 +053016027
16028QDF_STATUS sme_rso_cmd_status_cb(tHalHandle hal,
16029 void (*cb)(void *, struct rso_cmd_status *))
16030{
16031 QDF_STATUS status = QDF_STATUS_SUCCESS;
16032 tpAniSirGlobal mac = PMAC_STRUCT(hal);
16033
16034 mac->sme.rso_cmd_status_cb = cb;
Srinivas Girigowda2c263352017-03-17 17:49:53 -070016035 sme_debug("Registered RSO command status callback");
Sreelakshmi Konamki88a2a412017-04-14 15:11:55 +053016036 return status;
16037}
Kiran Kumar Lokerea3de2262017-04-12 12:15:04 -070016038
16039void sme_store_pdev(tHalHandle hal, struct wlan_objmgr_pdev *pdev)
16040{
16041 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
16042 void *wma_handle;
16043 QDF_STATUS status;
16044
Kiran Kumar Lokeref089a3a2017-04-20 21:39:26 -070016045 status = wlan_objmgr_pdev_try_get_ref(pdev, WLAN_LEGACY_MAC_ID);
Kiran Kumar Lokerea3de2262017-04-12 12:15:04 -070016046 if (QDF_STATUS_SUCCESS != status) {
16047 mac_ctx->pdev = NULL;
16048 return;
16049 }
16050 mac_ctx->pdev = pdev;
16051 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
16052 if (!wma_handle) {
16053 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Kiran Kumar Lokeref089a3a2017-04-20 21:39:26 -070016054 FL("wma handle is NULL"));
Kiran Kumar Lokerea3de2262017-04-12 12:15:04 -070016055 return;
16056 }
16057 wma_store_pdev(wma_handle, pdev);
16058}
16059
Padma, Santhosh Kumar16dacfb2017-03-21 19:05:40 +053016060QDF_STATUS sme_congestion_register_callback(tHalHandle hal,
16061 void (*congestion_cb)(void *, uint32_t congestion, uint32_t vdev_id))
16062{
16063 QDF_STATUS status;
16064 tpAniSirGlobal mac = PMAC_STRUCT(hal);
16065
16066 status = sme_acquire_global_lock(&mac->sme);
16067 if (QDF_IS_STATUS_SUCCESS(status)) {
16068 mac->sme.congestion_cb = congestion_cb;
16069 sme_release_global_lock(&mac->sme);
Srinivas Girigowda2c263352017-03-17 17:49:53 -070016070 sme_debug("congestion callback set");
Padma, Santhosh Kumar16dacfb2017-03-21 19:05:40 +053016071 } else {
Srinivas Girigowda2c263352017-03-17 17:49:53 -070016072 sme_err("Aquiring lock failed %d", status);
Padma, Santhosh Kumar16dacfb2017-03-21 19:05:40 +053016073 }
16074
16075 return status;
16076}