blob: 2983525148fca8540213646ca393d5f4a33cb64a [file] [log] [blame]
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001/*
Abhishek Singh7996eb72015-12-30 17:24:02 +05302 * Copyright (c) 2012-2016 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
40#include "sms_debug.h"
41#include "sme_api.h"
42#include "csr_inside_api.h"
43#include "sme_inside.h"
44#include "csr_internal.h"
45#include "wma_types.h"
46#include "wma_if.h"
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053047#include "qdf_trace.h"
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080048#include "sme_trace.h"
Anurag Chouhan6d760662016-02-20 16:05:43 +053049#include "qdf_types.h"
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053050#include "qdf_trace.h"
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080051#include "cds_utils.h"
52#include "sap_api.h"
53#include "mac_trace.h"
54#ifdef WLAN_FEATURE_NAN
55#include "nan_api.h"
56#endif
Naveen Rawat3b6068c2016-04-14 19:01:06 -070057#include "cds_regdomain.h"
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080058#include "cfg_api.h"
59#include "sme_power_save_api.h"
60#include "wma.h"
Naveen Rawatb4d37622015-11-13 16:15:25 -080061#include "sch_api.h"
Deepak Dhamdhere0f076bd2016-06-02 11:29:21 -070062#include "sme_nan_datapath.h"
Agrawal Ashish21ba2572016-09-03 16:40:10 +053063#include "csr_api.h"
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080064
65extern tSirRetStatus u_mac_post_ctrl_msg(void *pSirGlobal, tSirMbMsg *pMb);
66
67#define LOG_SIZE 256
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080068
69static tSelfRecoveryStats g_self_recovery_stats;
70/* TxMB Functions */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053071extern QDF_STATUS pmc_prepare_command(tpAniSirGlobal pMac, uint32_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080072 eSmeCommandType cmdType, void *pvParam,
73 uint32_t size, tSmeCmd **ppCmd);
74extern void pmc_release_command(tpAniSirGlobal pMac, tSmeCmd *pCommand);
75extern void qos_release_command(tpAniSirGlobal pMac, tSmeCmd *pCommand);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053076extern QDF_STATUS p2p_process_remain_on_channel_cmd(tpAniSirGlobal pMac,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080077 tSmeCmd *p2pRemainonChn);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053078extern QDF_STATUS sme_remain_on_chn_rsp(tpAniSirGlobal pMac, uint8_t *pMsg);
79extern QDF_STATUS sme_remain_on_chn_ready(tHalHandle hHal, uint8_t *pMsg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080080
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053081static QDF_STATUS init_sme_cmd_list(tpAniSirGlobal pMac);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080082static void sme_abort_command(tpAniSirGlobal pMac, tSmeCmd *pCommand,
83 bool fStopping);
84
85eCsrPhyMode sme_get_phy_mode(tHalHandle hHal);
86
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053087QDF_STATUS sme_handle_change_country_code(tpAniSirGlobal pMac, void *pMsgBuf);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080088
89void sme_disconnect_connected_sessions(tpAniSirGlobal pMac);
90
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053091QDF_STATUS sme_handle_generic_change_country_code(tpAniSirGlobal pMac,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080092 void *pMsgBuf);
93
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053094QDF_STATUS sme_process_nss_update_resp(tpAniSirGlobal mac, uint8_t *msg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080095
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -080096#ifdef FEATURE_WLAN_ESE
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080097bool csr_is_supported_channel(tpAniSirGlobal pMac, uint8_t channelId);
98#endif
99
100#ifdef WLAN_FEATURE_11W
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530101QDF_STATUS sme_unprotected_mgmt_frm_ind(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800102 tpSirSmeUnprotMgmtFrameInd pSmeMgmtFrm);
103#endif
104
105/* Message processor for events from DFS */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530106QDF_STATUS dfs_msg_processor(tpAniSirGlobal pMac,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800107 uint16_t msg_type, void *pMsgBuf);
108
109/* Channel Change Response Indication Handler */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530110QDF_STATUS sme_process_channel_change_resp(tpAniSirGlobal pMac,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800111 uint16_t msg_type, void *pMsgBuf);
112
113/* Internal SME APIs */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530114QDF_STATUS sme_acquire_global_lock(tSmeStruct *psSme)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800115{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530116 QDF_STATUS status = QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800117
118 if (psSme) {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530119 if (QDF_IS_STATUS_SUCCESS
Anurag Chouhana37b5b72016-02-21 14:53:42 +0530120 (qdf_mutex_acquire(&psSme->lkSmeGlobalLock))) {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530121 status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800122 }
123 }
124
125 return status;
126}
127
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530128QDF_STATUS sme_release_global_lock(tSmeStruct *psSme)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800129{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530130 QDF_STATUS status = QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800131
132 if (psSme) {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530133 if (QDF_IS_STATUS_SUCCESS
Anurag Chouhana37b5b72016-02-21 14:53:42 +0530134 (qdf_mutex_release(&psSme->lkSmeGlobalLock))) {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530135 status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800136 }
137 }
138
139 return status;
140}
141
142/**
143 * sme_process_set_hw_mode_resp() - Process set HW mode response
144 * @mac: Global MAC pointer
145 * @msg: HW mode response
146 *
147 * Processes the HW mode response and invokes the HDD callback
148 * to process further
149 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530150static QDF_STATUS sme_process_set_hw_mode_resp(tpAniSirGlobal mac, uint8_t *msg)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800151{
152 tListElem *entry = NULL;
153 tSmeCmd *command = NULL;
154 bool found;
155 hw_mode_cb callback = NULL;
156 struct sir_set_hw_mode_resp *param;
Chandrasekaran, Manishekarce2172e2016-02-18 16:12:43 +0530157 enum sir_conn_update_reason reason;
Chandrasekaran, Manishekaref70c0d2015-10-20 19:54:55 +0530158 tSmeCmd *saved_cmd;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800159
Chandrasekaran, Manishekaref70c0d2015-10-20 19:54:55 +0530160 sms_log(mac, LOG1, FL("%s"), __func__);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800161 param = (struct sir_set_hw_mode_resp *)msg;
162 if (!param) {
163 sms_log(mac, LOGE, FL("HW mode resp param is NULL"));
164 /* Not returning. Need to check if active command list
165 * needs to be freed
166 */
167 }
168
169 entry = csr_ll_peek_head(&mac->sme.smeCmdActiveList,
170 LL_ACCESS_LOCK);
171 if (!entry) {
172 sms_log(mac, LOGE, FL("No cmd found in active list"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530173 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800174 }
175
176 command = GET_BASE_ADDR(entry, tSmeCmd, Link);
177 if (!command) {
178 sms_log(mac, LOGE, FL("Base address is NULL"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530179 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800180 }
181
182 if (e_sme_command_set_hw_mode != command->command) {
183 sms_log(mac, LOGE, FL("Command mismatch!"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530184 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800185 }
186
187 callback = command->u.set_hw_mode_cmd.set_hw_mode_cb;
Chandrasekaran, Manishekaref70c0d2015-10-20 19:54:55 +0530188 reason = command->u.set_hw_mode_cmd.reason;
Chandrasekaran, Manishekarce2172e2016-02-18 16:12:43 +0530189
190 sms_log(mac, LOG1, FL("reason:%d session:%d"),
191 command->u.set_hw_mode_cmd.reason,
192 command->u.set_hw_mode_cmd.session_id);
193
Chandrasekaran, Manishekar4dd215e2016-04-16 18:48:34 -0700194 if (!callback) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800195 sms_log(mac, LOGE, FL("Callback does not exist"));
Chandrasekaran, Manishekar4dd215e2016-04-16 18:48:34 -0700196 goto end;
197 }
198
199 if (!param) {
200 sms_log(mac, LOGE,
201 FL("Callback failed since HW mode params is NULL"));
202 goto end;
203 }
204
205 /* Irrespective of the reason for which the hw mode change request
206 * was issued, the policy manager connection table needs to be updated
207 * with the new vdev-mac id mapping, tx/rx spatial streams etc., if the
208 * set hw mode was successful.
209 */
210 callback(param->status,
211 param->cfgd_hw_mode_index,
212 param->num_vdev_mac_entries,
213 param->vdev_mac_map);
214
215 if (reason == SIR_UPDATE_REASON_HIDDEN_STA) {
216 /* In the case of hidden SSID, connection update
217 * (set hw mode) is done after the scan with reason
218 * code eCsrScanForSsid completes. The connect/failure
219 * needs to be handled after the response of set hw
220 * mode
221 */
222 saved_cmd = (tSmeCmd *)mac->sme.saved_scan_cmd;
223 if (!saved_cmd) {
224 sms_log(mac, LOGP,
225 FL("saved cmd is NULL, Check this"));
226 goto end;
227 }
228 if (param->status == SET_HW_MODE_STATUS_OK) {
229 sms_log(mac, LOG1,
230 FL("search for ssid success"));
231 csr_scan_handle_search_for_ssid(mac,
232 saved_cmd);
233 } else {
234 sms_log(mac, LOG1,
235 FL("search for ssid failure"));
236 csr_scan_handle_search_for_ssid_failure(mac,
237 saved_cmd);
238 }
239 if (saved_cmd->u.roamCmd.pRoamBssEntry)
240 qdf_mem_free(
241 saved_cmd->u.roamCmd.pRoamBssEntry);
242 if (saved_cmd->u.scanCmd.u.scanRequest.SSIDs.SSIDList)
243 qdf_mem_free(saved_cmd->u.scanCmd.u.
244 scanRequest.SSIDs.SSIDList);
245 if (saved_cmd->u.scanCmd.pToRoamProfile)
246 qdf_mem_free(saved_cmd->u.scanCmd.
247 pToRoamProfile);
248 if (saved_cmd) {
249 qdf_mem_free(saved_cmd);
250 saved_cmd = NULL;
251 mac->sme.saved_scan_cmd = NULL;
252 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800253 }
254
Chandrasekaran, Manishekaref70c0d2015-10-20 19:54:55 +0530255end:
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800256 found = csr_ll_remove_entry(&mac->sme.smeCmdActiveList, entry,
257 LL_ACCESS_LOCK);
258 if (found) {
259 /* Now put this command back on the avilable command list */
260 sme_release_command(mac, command);
261 }
262 sme_process_pending_queue(mac);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530263 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800264}
265
266/**
267 * sme_process_hw_mode_trans_ind() - Process HW mode transition indication
268 * @mac: Global MAC pointer
269 * @msg: HW mode transition response
270 *
271 * Processes the HW mode transition indication and invoke the HDD callback
272 * to process further
273 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530274static QDF_STATUS sme_process_hw_mode_trans_ind(tpAniSirGlobal mac,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800275 uint8_t *msg)
276{
277 hw_mode_transition_cb callback = NULL;
278 struct sir_hw_mode_trans_ind *param;
279
280 param = (struct sir_hw_mode_trans_ind *)msg;
281 if (!param) {
282 sms_log(mac, LOGE, FL("HW mode trans ind param is NULL"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530283 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800284 }
285
286 callback = mac->sme.sme_hw_mode_trans_cb;
287 if (callback) {
288 sms_log(mac, LOGE, FL("Calling registered callback..."));
289 callback(param->old_hw_mode_index,
290 param->new_hw_mode_index,
291 param->num_vdev_mac_entries,
292 param->vdev_mac_map);
293 }
294
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530295 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800296}
297
Naveen Rawate7d86052015-11-13 12:01:43 -0800298/**
299 * free_sme_cmds() - This function frees memory allocated for SME commands
300 * @mac_ctx: Pointer to Global MAC structure
301 *
302 * This function frees memory allocated for SME commands
303 *
304 * @Return: void
305 */
306static void free_sme_cmds(tpAniSirGlobal mac_ctx)
307{
308 uint32_t idx;
309 if (NULL == mac_ctx->sme.pSmeCmdBufAddr)
310 return;
311
312 for (idx = 0; idx < mac_ctx->sme.totalSmeCmd; idx++)
Anurag Chouhan600c3a02016-03-01 10:33:54 +0530313 qdf_mem_free(mac_ctx->sme.pSmeCmdBufAddr[idx]);
Naveen Rawate7d86052015-11-13 12:01:43 -0800314
Anurag Chouhan600c3a02016-03-01 10:33:54 +0530315 qdf_mem_free(mac_ctx->sme.pSmeCmdBufAddr);
Naveen Rawate7d86052015-11-13 12:01:43 -0800316 mac_ctx->sme.pSmeCmdBufAddr = NULL;
317}
318
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530319static QDF_STATUS init_sme_cmd_list(tpAniSirGlobal pMac)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800320{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530321 QDF_STATUS status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800322 tSmeCmd *pCmd;
323 uint32_t cmd_idx;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530324 QDF_STATUS qdf_status;
Anurag Chouhan210db072016-02-22 18:42:15 +0530325 qdf_mc_timer_t *cmdTimeoutTimer = NULL;
Naveen Rawate7d86052015-11-13 12:01:43 -0800326 uint32_t sme_cmd_ptr_ary_sz;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800327
328 pMac->sme.totalSmeCmd = SME_TOTAL_COMMAND;
329
330 status = csr_ll_open(pMac->hHdd, &pMac->sme.smeCmdActiveList);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530331 if (!QDF_IS_STATUS_SUCCESS(status))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800332 goto end;
333
334 status = csr_ll_open(pMac->hHdd, &pMac->sme.smeCmdPendingList);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530335 if (!QDF_IS_STATUS_SUCCESS(status))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800336 goto end;
337
338 status = csr_ll_open(pMac->hHdd, &pMac->sme.smeScanCmdActiveList);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530339 if (!QDF_IS_STATUS_SUCCESS(status))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800340 goto end;
341
342 status = csr_ll_open(pMac->hHdd, &pMac->sme.smeScanCmdPendingList);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530343 if (!QDF_IS_STATUS_SUCCESS(status))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800344 goto end;
345
346 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;
Anurag Chouhan600c3a02016-03-01 10:33:54 +0530359 qdf_mem_set(pMac->sme.pSmeCmdBufAddr, sme_cmd_ptr_ary_sz, 0);
Naveen Rawate7d86052015-11-13 12:01:43 -0800360 for (cmd_idx = 0; cmd_idx < pMac->sme.totalSmeCmd; cmd_idx++) {
361 /*
362 * Since total size of all commands together can be huge chunk
363 * of memory, allocate SME cmd individually. These SME CMDs are
364 * moved between pending and active queues. And these freeing of
365 * these queues just manipulates the list but does not actually
366 * frees SME CMD pointers. Hence store each SME CMD address in
367 * the array, sme.pSmeCmdBufAddr. This will later facilitate
368 * freeing up of all SME CMDs with just a for loop.
369 */
370 pMac->sme.pSmeCmdBufAddr[cmd_idx] =
Anurag Chouhan600c3a02016-03-01 10:33:54 +0530371 qdf_mem_malloc(sizeof(tSmeCmd));
Naveen Rawate7d86052015-11-13 12:01:43 -0800372 if (NULL == pMac->sme.pSmeCmdBufAddr[cmd_idx]) {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530373 status = QDF_STATUS_E_NOMEM;
Naveen Rawate7d86052015-11-13 12:01:43 -0800374 free_sme_cmds(pMac);
375 goto end;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800376 }
Naveen Rawate7d86052015-11-13 12:01:43 -0800377 pCmd = (tSmeCmd *)pMac->sme.pSmeCmdBufAddr[cmd_idx];
378 csr_ll_insert_tail(&pMac->sme.smeCmdFreeList,
379 &pCmd->Link, LL_ACCESS_LOCK);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800380 }
381
382 /* This timer is only to debug the active list command timeout */
383
384 cmdTimeoutTimer =
Anurag Chouhan600c3a02016-03-01 10:33:54 +0530385 (qdf_mc_timer_t *) qdf_mem_malloc(sizeof(qdf_mc_timer_t));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800386 if (cmdTimeoutTimer) {
387 pMac->sme.smeCmdActiveList.cmdTimeoutTimer = cmdTimeoutTimer;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530388 qdf_status =
Anurag Chouhan210db072016-02-22 18:42:15 +0530389 qdf_mc_timer_init(pMac->sme.smeCmdActiveList.
Anurag Chouhan6d760662016-02-20 16:05:43 +0530390 cmdTimeoutTimer, QDF_TIMER_TYPE_SW,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800391 active_list_cmd_timeout_handle, (void *)pMac);
392
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530393 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +0530394 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800395 "Init Timer fail for active list command process time out");
Anurag Chouhan600c3a02016-03-01 10:33:54 +0530396 qdf_mem_free(pMac->sme.smeCmdActiveList.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800397 cmdTimeoutTimer);
398 pMac->sme.smeCmdActiveList.cmdTimeoutTimer = NULL;
399 } else {
400 pMac->sme.smeCmdActiveList.cmdTimeoutDuration =
401 CSR_ACTIVE_LIST_CMD_TIMEOUT_VALUE;
402 }
403 }
404
405end:
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530406 if (!QDF_IS_STATUS_SUCCESS(status))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800407 sms_log(pMac, LOGE, "failed to initialize sme command list:%d\n",
408 status);
409
410 return status;
411}
412
413void sme_release_command(tpAniSirGlobal pMac, tSmeCmd *pCmd)
414{
415 pCmd->command = eSmeNoCommand;
416 csr_ll_insert_tail(&pMac->sme.smeCmdFreeList, &pCmd->Link, LL_ACCESS_LOCK);
417}
418
419static void sme_release_cmd_list(tpAniSirGlobal pMac, tDblLinkList *pList)
420{
421 tListElem *pEntry;
422 tSmeCmd *pCommand;
423
424 while ((pEntry = csr_ll_remove_head(pList, LL_ACCESS_LOCK)) != NULL) {
425 /* TODO: base on command type to call release functions */
426 /* reinitialize different command types so they can be reused */
427 pCommand = GET_BASE_ADDR(pEntry, tSmeCmd, Link);
428 sme_abort_command(pMac, pCommand, true);
429 }
430}
431
432static void purge_sme_cmd_list(tpAniSirGlobal pMac)
433{
434 /* release any out standing commands back to free command list */
435 sme_release_cmd_list(pMac, &pMac->sme.smeCmdPendingList);
436 sme_release_cmd_list(pMac, &pMac->sme.smeCmdActiveList);
437 sme_release_cmd_list(pMac, &pMac->sme.smeScanCmdPendingList);
438 sme_release_cmd_list(pMac, &pMac->sme.smeScanCmdActiveList);
439}
440
441void purge_sme_session_cmd_list(tpAniSirGlobal pMac, uint32_t sessionId,
442 tDblLinkList *pList)
443{
444 /* release any out standing commands back to free command list */
445 tListElem *pEntry, *pNext;
446 tSmeCmd *pCommand;
447 tDblLinkList localList;
448
Anurag Chouhan600c3a02016-03-01 10:33:54 +0530449 qdf_mem_zero(&localList, sizeof(tDblLinkList));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530450 if (!QDF_IS_STATUS_SUCCESS(csr_ll_open(pMac->hHdd, &localList))) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800451 sms_log(pMac, LOGE, FL(" failed to open list"));
452 return;
453 }
454
455 csr_ll_lock(pList);
456 pEntry = csr_ll_peek_head(pList, LL_ACCESS_NOLOCK);
457 while (pEntry != NULL) {
458 pNext = csr_ll_next(pList, pEntry, LL_ACCESS_NOLOCK);
459 pCommand = GET_BASE_ADDR(pEntry, tSmeCmd, Link);
460 if (pCommand->sessionId == sessionId) {
461 if (csr_ll_remove_entry(pList, pEntry, LL_ACCESS_NOLOCK)) {
462 csr_ll_insert_tail(&localList, pEntry,
463 LL_ACCESS_NOLOCK);
464 }
465 }
466 pEntry = pNext;
467 }
468 csr_ll_unlock(pList);
469
470 while ((pEntry = csr_ll_remove_head(&localList, LL_ACCESS_NOLOCK))) {
471 pCommand = GET_BASE_ADDR(pEntry, tSmeCmd, Link);
472 sme_abort_command(pMac, pCommand, true);
473 }
474 csr_ll_close(&localList);
475}
476
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530477static QDF_STATUS free_sme_cmd_list(tpAniSirGlobal pMac)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800478{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530479 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800480
481 purge_sme_cmd_list(pMac);
482 csr_ll_close(&pMac->sme.smeCmdPendingList);
483 csr_ll_close(&pMac->sme.smeCmdActiveList);
484 csr_ll_close(&pMac->sme.smeScanCmdPendingList);
485 csr_ll_close(&pMac->sme.smeScanCmdActiveList);
486 csr_ll_close(&pMac->sme.smeCmdFreeList);
487
488 /*destroy active list command time out timer */
Anurag Chouhan210db072016-02-22 18:42:15 +0530489 qdf_mc_timer_destroy(pMac->sme.smeCmdActiveList.cmdTimeoutTimer);
Anurag Chouhan600c3a02016-03-01 10:33:54 +0530490 qdf_mem_free(pMac->sme.smeCmdActiveList.cmdTimeoutTimer);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800491 pMac->sme.smeCmdActiveList.cmdTimeoutTimer = NULL;
492
Anurag Chouhana37b5b72016-02-21 14:53:42 +0530493 status = qdf_mutex_acquire(&pMac->sme.lkSmeGlobalLock);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530494 if (status != QDF_STATUS_SUCCESS) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800495 sms_log(pMac, LOGE,
496 FL("Failed to acquire the lock status = %d"), status);
497 goto done;
498 }
499
Naveen Rawate7d86052015-11-13 12:01:43 -0800500 free_sme_cmds(pMac);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800501
Anurag Chouhana37b5b72016-02-21 14:53:42 +0530502 status = qdf_mutex_release(&pMac->sme.lkSmeGlobalLock);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530503 if (status != QDF_STATUS_SUCCESS) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800504 sms_log(pMac, LOGE,
505 FL("Failed to release the lock status = %d"), status);
506 }
507done:
508 return status;
509}
510
511void dump_csr_command_info(tpAniSirGlobal pMac, tSmeCmd *pCmd)
512{
513 switch (pCmd->command) {
514 case eSmeCommandScan:
515 sms_log(pMac, LOGE, " scan command reason is %d",
516 pCmd->u.scanCmd.reason);
517 break;
518
519 case eSmeCommandRoam:
520 sms_log(pMac, LOGE, " roam command reason is %d",
521 pCmd->u.roamCmd.roamReason);
522 break;
523
524 case eSmeCommandWmStatusChange:
525 sms_log(pMac, LOGE, " WMStatusChange command type is %d",
526 pCmd->u.wmStatusChangeCmd.Type);
527 break;
528
529 case eSmeCommandSetKey:
530 sms_log(pMac, LOGE, " setKey command auth(%d) enc(%d)",
531 pCmd->u.setKeyCmd.authType, pCmd->u.setKeyCmd.encType);
532 break;
533
534 default:
535 sms_log(pMac, LOGE, " default: Unhandled command %d",
536 pCmd->command);
537 break;
538 }
539}
540
541tSmeCmd *sme_get_command_buffer(tpAniSirGlobal pMac)
542{
543 tSmeCmd *pRetCmd = NULL, *pTempCmd = NULL;
544 tListElem *pEntry;
545 static int sme_command_queue_full;
546
547 pEntry = csr_ll_remove_head(&pMac->sme.smeCmdFreeList, LL_ACCESS_LOCK);
548
549 /* If we can get another MS Msg buffer, then we are ok. Just link */
550 /* the entry onto the linked list. (We are using the linked list */
551 /* to keep track of tfhe message buffers). */
552 if (pEntry) {
553 pRetCmd = GET_BASE_ADDR(pEntry, tSmeCmd, Link);
554 /* reset when free list is available */
555 sme_command_queue_full = 0;
556 } else {
557 int idx = 1;
558
559 /* Cannot change pRetCmd here since it needs to return later. */
560 pEntry =
561 csr_ll_peek_head(&pMac->sme.smeCmdActiveList, LL_ACCESS_LOCK);
562 if (pEntry) {
563 pTempCmd = GET_BASE_ADDR(pEntry, tSmeCmd, Link);
564 }
565 sms_log(pMac, LOGE,
566 "Out of command buffer.... command (0x%X) stuck",
567 (pTempCmd) ? pTempCmd->command : eSmeNoCommand);
568 if (pTempCmd) {
569 if (eSmeCsrCommandMask & pTempCmd->command) {
570 /* CSR command is stuck. See what the reason code is for that command */
571 dump_csr_command_info(pMac, pTempCmd);
572 }
573 } /* if(pTempCmd) */
574
575 /* dump what is in the pending queue */
576 csr_ll_lock(&pMac->sme.smeCmdPendingList);
577 pEntry =
578 csr_ll_peek_head(&pMac->sme.smeCmdPendingList,
579 LL_ACCESS_NOLOCK);
580 while (pEntry && !sme_command_queue_full) {
581 pTempCmd = GET_BASE_ADDR(pEntry, tSmeCmd, Link);
582 /* Print only 1st five commands from pending queue. */
583 if (idx <= 5)
584 sms_log(pMac, LOGE,
585 "Out of command buffer.... SME pending command #%d (0x%X)",
586 idx, pTempCmd->command);
587 idx++;
588 if (eSmeCsrCommandMask & pTempCmd->command) {
589 /* CSR command is stuck. See what the reason code is for that command */
590 dump_csr_command_info(pMac, pTempCmd);
591 }
592 pEntry =
593 csr_ll_next(&pMac->sme.smeCmdPendingList, pEntry,
594 LL_ACCESS_NOLOCK);
595 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800596 csr_ll_unlock(&pMac->sme.smeCmdPendingList);
597
DARAM SUDHAf6c3f972015-05-26 19:26:16 +0530598 idx = 1;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800599 /* There may be some more command in CSR's own pending queue */
600 csr_ll_lock(&pMac->roam.roamCmdPendingList);
601 pEntry =
602 csr_ll_peek_head(&pMac->roam.roamCmdPendingList,
603 LL_ACCESS_NOLOCK);
DARAM SUDHAf6c3f972015-05-26 19:26:16 +0530604 while (pEntry && !sme_command_queue_full) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800605 pTempCmd = GET_BASE_ADDR(pEntry, tSmeCmd, Link);
DARAM SUDHAf6c3f972015-05-26 19:26:16 +0530606 /* Print only 1st five commands from CSR pending queue */
607 if (idx <= 5)
608 sms_log(pMac, LOGE,
609 "Out of command buffer.... "
610 "CSR roamCmdPendingList command #%d (0x%X)",
611 idx, pTempCmd->command);
612 idx++;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800613 dump_csr_command_info(pMac, pTempCmd);
614 pEntry =
615 csr_ll_next(&pMac->roam.roamCmdPendingList, pEntry,
616 LL_ACCESS_NOLOCK);
617 }
DARAM SUDHAf6c3f972015-05-26 19:26:16 +0530618
619 /* Increment static variable so that it prints
620 * pending command only once
621 */
622 sme_command_queue_full++;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800623 csr_ll_unlock(&pMac->roam.roamCmdPendingList);
DARAM SUDHAf6c3f972015-05-26 19:26:16 +0530624
Abhishek Singh5ea86532016-04-27 14:10:53 +0530625 if (pMac->roam.configParam.enable_fatal_event)
626 cds_flush_logs(WLAN_LOG_TYPE_FATAL,
627 WLAN_LOG_INDICATOR_HOST_DRIVER,
628 WLAN_LOG_REASON_SME_OUT_OF_CMD_BUF,
629 false,
630 pMac->sme.enableSelfRecovery ? true : false);
631 else if (pMac->sme.enableSelfRecovery)
632 cds_trigger_recovery();
633 else
634 QDF_BUG(0);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800635 }
636
637 /* memset to zero */
638 if (pRetCmd) {
Anurag Chouhan600c3a02016-03-01 10:33:54 +0530639 qdf_mem_set((uint8_t *)&pRetCmd->command,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800640 sizeof(pRetCmd->command), 0);
Anurag Chouhan600c3a02016-03-01 10:33:54 +0530641 qdf_mem_set((uint8_t *)&pRetCmd->sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800642 sizeof(pRetCmd->sessionId), 0);
Anurag Chouhan600c3a02016-03-01 10:33:54 +0530643 qdf_mem_set((uint8_t *)&pRetCmd->u, sizeof(pRetCmd->u), 0);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800644 }
645
646 return pRetCmd;
647}
648
649void sme_push_command(tpAniSirGlobal pMac, tSmeCmd *pCmd, bool fHighPriority)
650{
651 if (!SME_IS_START(pMac)) {
652 sms_log(pMac, LOGE, FL("Sme in stop state"));
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +0530653 QDF_ASSERT(0);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800654 return;
655 }
656
657 if (fHighPriority) {
658 csr_ll_insert_head(&pMac->sme.smeCmdPendingList, &pCmd->Link,
659 LL_ACCESS_LOCK);
660 } else {
661 csr_ll_insert_tail(&pMac->sme.smeCmdPendingList, &pCmd->Link,
662 LL_ACCESS_LOCK);
663 }
664
665 /* process the command queue... */
666 sme_process_pending_queue(pMac);
667
668 return;
669}
670
671/* For commands that need to do extra cleanup. */
672static void sme_abort_command(tpAniSirGlobal pMac, tSmeCmd *pCommand,
673 bool fStopping)
674{
675 if (eSmePmcCommandMask & pCommand->command) {
676 sms_log(pMac, LOG1,
677 "No need to process PMC commands");
678 return;
679 }
680 if (eSmeCsrCommandMask & pCommand->command) {
681 csr_abort_command(pMac, pCommand, fStopping);
682 return;
683 }
684 switch (pCommand->command) {
685 case eSmeCommandRemainOnChannel:
686 if (NULL != pCommand->u.remainChlCmd.callback) {
687 remainOnChanCallback callback =
688 pCommand->u.remainChlCmd.callback;
689 /* process the msg */
690 if (callback) {
691 callback(pMac, pCommand->u.remainChlCmd.
692 callbackCtx, eCSR_SCAN_ABORT,
693 pCommand->u.remainChlCmd.scan_id);
694 }
695 }
696 sme_release_command(pMac, pCommand);
697 break;
698 default:
699 sme_release_command(pMac, pCommand);
700 break;
701 }
702
703}
704
705tListElem *csr_get_cmd_to_process(tpAniSirGlobal pMac, tDblLinkList *pList,
706 uint8_t sessionId, bool fInterlocked)
707{
708 tListElem *pCurEntry = NULL;
709 tSmeCmd *pCommand;
710
711 /* Go through the list and return the command whose session id is not
712 * matching with the current ongoing scan cmd sessionId */
713 pCurEntry = csr_ll_peek_head(pList, LL_ACCESS_LOCK);
714 while (pCurEntry) {
715 pCommand = GET_BASE_ADDR(pCurEntry, tSmeCmd, Link);
716 if (pCommand->sessionId != sessionId) {
717 sms_log(pMac, LOG1,
718 "selected the command with different sessionId");
719 return pCurEntry;
720 }
721
722 pCurEntry = csr_ll_next(pList, pCurEntry, fInterlocked);
723 }
724
725 sms_log(pMac, LOG1, "No command pending with different sessionId");
726 return NULL;
727}
728
729bool sme_process_scan_queue(tpAniSirGlobal pMac)
730{
731 tListElem *pEntry;
732 tSmeCmd *pCommand;
733 tListElem *pSmeEntry = NULL;
734 tSmeCmd *pSmeCommand = NULL;
735 bool status = true;
736
737 if ((!csr_ll_is_list_empty(&pMac->sme.smeCmdActiveList,
738 LL_ACCESS_LOCK))) {
739 pSmeEntry = csr_ll_peek_head(&pMac->sme.smeCmdActiveList,
740 LL_ACCESS_LOCK);
741 if (pSmeEntry)
742 pSmeCommand = GET_BASE_ADDR(pSmeEntry, tSmeCmd, Link);
743 }
744 csr_ll_lock(&pMac->sme.smeScanCmdActiveList);
745 if (csr_ll_is_list_empty(&pMac->sme.smeScanCmdPendingList,
746 LL_ACCESS_LOCK))
747 goto end;
748 pEntry = csr_ll_peek_head(&pMac->sme.smeScanCmdPendingList,
749 LL_ACCESS_LOCK);
750 if (!pEntry)
751 goto end;
752
Archana Ramachandran31b5b652016-09-21 15:37:58 -0700753 sms_log(pMac, LOG1,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800754 FL("scan_count in active scanlist %d "),
755 pMac->sme.smeScanCmdActiveList.Count);
756
757 pCommand = GET_BASE_ADDR(pEntry, tSmeCmd, Link);
758 if (pSmeCommand != NULL) {
759 /*
760 * if scan is running on one interface and SME receives
761 * the next command on the same interface then
762 * dont the allow the command to be queued to
763 * smeCmdPendingList. If next scan is allowed on
764 * the same interface the CSR state machine will
765 * get screwed up.
766 */
767 if (pSmeCommand->sessionId == pCommand->sessionId) {
768 status = false;
769 goto end;
770 }
771 }
772 /*
773 * We cannot execute any command in wait-for-key state until setKey is
774 * through.
775 */
776 if (CSR_IS_WAIT_FOR_KEY(pMac, pCommand->sessionId)) {
777 if (!CSR_IS_SET_KEY_COMMAND(pCommand)) {
778 sms_log(pMac, LOGE,
779 FL("Can't process cmd(%d), waiting for key"),
780 pCommand->command);
781 status = false;
782 goto end;
783 }
784 }
785 if (csr_ll_remove_entry(&pMac->sme.smeScanCmdPendingList, pEntry,
786 LL_ACCESS_LOCK)) {
787 csr_ll_insert_head(&pMac->sme.smeScanCmdActiveList,
788 &pCommand->Link, LL_ACCESS_NOLOCK);
789 switch (pCommand->command) {
790 case eSmeCommandScan:
791 sms_log(pMac, LOG1, FL("Processing scan offload cmd."));
Anurag Chouhan210db072016-02-22 18:42:15 +0530792 qdf_mc_timer_start(&pCommand->u.scanCmd.csr_scan_timer,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800793 CSR_ACTIVE_SCAN_LIST_CMD_TIMEOUT);
794 csr_process_scan_command(pMac, pCommand);
795 break;
796 case eSmeCommandRemainOnChannel:
797 sms_log(pMac, LOG1,
798 FL("Processing remain on channel offload cmd"));
799 p2p_process_remain_on_channel_cmd(pMac, pCommand);
800 break;
801 default:
802 sms_log(pMac, LOGE,
803 FL("Wrong cmd enqueued to ScanCmdPendingList"));
804 pEntry = csr_ll_remove_head(
805 &pMac->sme.smeScanCmdActiveList,
806 LL_ACCESS_NOLOCK);
807 pCommand = GET_BASE_ADDR(pEntry, tSmeCmd, Link);
808 sme_release_command(pMac, pCommand);
809 break;
810 }
811 }
812end:
813 csr_ll_unlock(&pMac->sme.smeScanCmdActiveList);
814 return status;
815}
816
817/**
818 * sme_process_command() - processes SME commnd
819 * @mac_ctx: mac global context
820 *
821 * This function is called by sme_process_pending_queue() in a while loop
822 *
823 * Return: true indicates that caller function can proceed to next cmd
824 * false otherwise.
825 */
826bool sme_process_command(tpAniSirGlobal pMac)
827{
828 bool fContinue = false;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530829 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800830 tListElem *pEntry;
831 tSmeCmd *pCommand;
832 tListElem *pSmeEntry;
833 tSmeCmd *pSmeCommand;
834
835 /*
836 * if the ActiveList is empty, then nothing is active so we can process
837 * a pending command...
838 * alwasy lock active list before locking pending list
839 */
840 csr_ll_lock(&pMac->sme.smeCmdActiveList);
841 if (!csr_ll_is_list_empty(&pMac->sme.smeCmdActiveList,
842 LL_ACCESS_NOLOCK)) {
843 csr_ll_unlock(&pMac->sme.smeCmdActiveList);
844 goto process_scan_q;
845 }
846
847 if (csr_ll_is_list_empty(&pMac->sme.smeCmdPendingList,
848 LL_ACCESS_LOCK)) {
849 /* No command waiting */
850 csr_ll_unlock(&pMac->sme.smeCmdActiveList);
851 goto process_scan_q;
852 }
853
854 /*
855 * If scan command is pending in the smeScanCmdActive list then pick the
856 * command from smeCmdPendingList which is not matching with the scan
857 * command session id. At any point of time only one command will be
858 * allowed on a single session.
859 */
860 if (!csr_ll_is_list_empty(
861 &pMac->sme.smeScanCmdActiveList, LL_ACCESS_LOCK)) {
862 pSmeEntry = csr_ll_peek_head(&pMac->sme.smeScanCmdActiveList,
863 LL_ACCESS_LOCK);
864 if (pSmeEntry) {
865 pSmeCommand = GET_BASE_ADDR(pSmeEntry, tSmeCmd, Link);
866 pEntry = csr_get_cmd_to_process(pMac,
867 &pMac->sme.smeCmdPendingList,
868 pSmeCommand->sessionId,
869 LL_ACCESS_LOCK);
870 goto sme_process_cmd;
871 }
872 }
873
874 /* Peek the command */
875 pEntry = csr_ll_peek_head(&pMac->sme.smeCmdPendingList, LL_ACCESS_LOCK);
876sme_process_cmd:
877 if (!pEntry) {
878 csr_ll_unlock(&pMac->sme.smeCmdActiveList);
879 goto process_scan_q;
880 }
881 pCommand = GET_BASE_ADDR(pEntry, tSmeCmd, Link);
882 /*
883 * Allow only disconnect command in wait-for-key state until setKey is
884 * through.
885 */
886 if (CSR_IS_WAIT_FOR_KEY(pMac, pCommand->sessionId)
887 && !CSR_IS_DISCONNECT_COMMAND(pCommand)
888 && !CSR_IS_SET_KEY_COMMAND(pCommand)) {
889 if (CSR_IS_CLOSE_SESSION_COMMAND(pCommand)) {
890 tSmeCmd *sme_cmd = NULL;
891
892 sms_log(pMac, LOGE,
893 FL("SessionId %d: close session command issued while waiting for key, issue disconnect first"),
894 pCommand->sessionId);
895 status = csr_prepare_disconnect_command(pMac,
896 pCommand->sessionId, &sme_cmd);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530897 if (status == QDF_STATUS_SUCCESS && sme_cmd) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800898 csr_ll_lock(&pMac->sme.smeCmdPendingList);
899 csr_ll_insert_head(&pMac->sme.smeCmdPendingList,
900 &sme_cmd->Link, LL_ACCESS_NOLOCK);
901 pEntry = csr_ll_peek_head(
902 &pMac->sme.smeCmdPendingList,
903 LL_ACCESS_NOLOCK);
904 csr_ll_unlock(&pMac->sme.smeCmdPendingList);
905 goto sme_process_cmd;
906 }
907 }
908
909 csr_ll_unlock(&pMac->sme.smeCmdActiveList);
910 sms_log(pMac, LOGE,
911 FL("SessionId %d: Can't process cmd(%d), waiting for key"),
912 pCommand->sessionId, pCommand->command);
913 fContinue = false;
914 goto process_scan_q;
915 }
916
917 if (!csr_ll_remove_entry(&pMac->sme.smeCmdPendingList, pEntry,
918 LL_ACCESS_LOCK)) {
919 /* This is odd. Some one else pull off the command. */
920 csr_ll_unlock(&pMac->sme.smeCmdActiveList);
921 goto process_scan_q;
922 }
923 /* we can reuse the pCommand. Insert the command onto the ActiveList */
924 csr_ll_insert_head(&pMac->sme.smeCmdActiveList, &pCommand->Link,
925 LL_ACCESS_NOLOCK);
926 /* .... and process the command. */
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +0530927 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_COMMAND,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800928 pCommand->sessionId, pCommand->command));
929
930 switch (pCommand->command) {
931 case eSmeCommandScan:
932 csr_ll_unlock(&pMac->sme.smeCmdActiveList);
933 status = csr_process_scan_command(pMac, pCommand);
934 break;
935 case eSmeCommandRoam:
936 csr_ll_unlock(&pMac->sme.smeCmdActiveList);
937 status = csr_roam_process_command(pMac, pCommand);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530938 if (!QDF_IS_STATUS_SUCCESS(status)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800939 && csr_ll_remove_entry(&pMac->sme.smeCmdActiveList,
940 &pCommand->Link, LL_ACCESS_LOCK))
941 csr_release_command_roam(pMac, pCommand);
942 break;
943 case eSmeCommandWmStatusChange:
944 csr_ll_unlock(&pMac->sme.smeCmdActiveList);
945 csr_roam_process_wm_status_change_command(pMac, pCommand);
946 break;
947 case eSmeCommandSetKey:
948 csr_ll_unlock(&pMac->sme.smeCmdActiveList);
949 status = csr_roam_process_set_key_command(pMac, pCommand);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530950 if (!QDF_IS_STATUS_SUCCESS(status)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800951 && csr_ll_remove_entry(&pMac->sme.smeCmdActiveList,
952 &pCommand->Link, LL_ACCESS_LOCK)) {
953 csr_release_command_set_key(pMac, pCommand);
954 }
955 break;
956 case eSmeCommandAddStaSession:
957 csr_ll_unlock(&pMac->sme.smeCmdActiveList);
958 csr_process_add_sta_session_command(pMac, pCommand);
959 break;
Deepak Dhamdhere0f076bd2016-06-02 11:29:21 -0700960 case eSmeCommandNdpInitiatorRequest:
961 csr_ll_unlock(&pMac->sme.smeCmdActiveList);
962 if (csr_process_ndp_initiator_request(pMac, pCommand) !=
963 QDF_STATUS_SUCCESS)
964 if (csr_ll_remove_entry(
965 &pMac->sme.smeCmdActiveList,
966 &pCommand->Link, LL_ACCESS_LOCK))
967 csr_release_command(pMac, pCommand);
Abhishek Singh4fef7472016-06-06 11:36:03 -0700968 break;
969 case eSmeCommandNdpResponderRequest:
970 csr_ll_unlock(&pMac->sme.smeCmdActiveList);
971 status = csr_process_ndp_responder_request(pMac, pCommand);
972 if (status != QDF_STATUS_SUCCESS) {
973 if (csr_ll_remove_entry(&pMac->sme.smeCmdActiveList,
Naveen Rawatf28315c2016-06-29 18:06:02 -0700974 &pCommand->Link, LL_ACCESS_LOCK))
975 csr_release_command(pMac, pCommand);
976 }
977 break;
978 case eSmeCommandNdpDataEndInitiatorRequest:
979 csr_ll_unlock(&pMac->sme.smeCmdActiveList);
980 status = csr_process_ndp_data_end_request(pMac, pCommand);
981 if (status != QDF_STATUS_SUCCESS) {
982 if (csr_ll_remove_entry(&pMac->sme.smeCmdActiveList,
983 &pCommand->Link, LL_ACCESS_LOCK))
Abhishek Singh4fef7472016-06-06 11:36:03 -0700984 csr_release_command(pMac, pCommand);
985 }
986 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800987 case eSmeCommandDelStaSession:
988 csr_ll_unlock(&pMac->sme.smeCmdActiveList);
989 csr_process_del_sta_session_command(pMac, pCommand);
990 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800991 case eSmeCommandRemainOnChannel:
992 csr_ll_unlock(&pMac->sme.smeCmdActiveList);
993 p2p_process_remain_on_channel_cmd(pMac, pCommand);
994 break;
995 /*
996 * Treat standby differently here because caller may not be able
997 * to handle the failure so we do our best here
998 */
999 case eSmeCommandEnterStandby:
1000 break;
1001 case eSmeCommandAddTs:
1002 case eSmeCommandDelTs:
1003 csr_ll_unlock(&pMac->sme.smeCmdActiveList);
1004#ifndef WLAN_MDM_CODE_REDUCTION_OPT
1005 fContinue = qos_process_command(pMac, pCommand);
1006 if (fContinue && csr_ll_remove_entry(
1007 &pMac->sme.smeCmdActiveList,
1008 &pCommand->Link, LL_ACCESS_NOLOCK)) {
1009 /* The command failed, remove it */
1010 qos_release_command(pMac, pCommand);
1011 }
1012#endif
1013 break;
1014#ifdef FEATURE_WLAN_TDLS
1015 case eSmeCommandTdlsSendMgmt:
1016 case eSmeCommandTdlsAddPeer:
1017 case eSmeCommandTdlsDelPeer:
1018 case eSmeCommandTdlsLinkEstablish:
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301019 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001020 FL("sending TDLS Command 0x%x to PE"),
1021 pCommand->command);
1022 csr_ll_unlock(&pMac->sme.smeCmdActiveList);
1023 status = csr_tdls_process_cmd(pMac, pCommand);
1024 break;
1025#endif
1026 case e_sme_command_set_hw_mode:
1027 csr_ll_unlock(&pMac->sme.smeCmdActiveList);
1028 csr_process_set_hw_mode(pMac, pCommand);
1029 break;
1030 case e_sme_command_nss_update:
1031 csr_ll_unlock(&pMac->sme.smeCmdActiveList);
1032 csr_process_nss_update_req(pMac, pCommand);
1033 break;
1034 case e_sme_command_set_dual_mac_config:
1035 csr_ll_unlock(&pMac->sme.smeCmdActiveList);
1036 csr_process_set_dual_mac_config(pMac, pCommand);
1037 break;
Archana Ramachandrana20ef812015-11-13 16:12:13 -08001038 case e_sme_command_set_antenna_mode:
1039 csr_ll_unlock(&pMac->sme.smeCmdActiveList);
1040 csr_process_set_antenna_mode(pMac, pCommand);
1041 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001042 default:
1043 /* something is wrong */
1044 /* remove it from the active list */
1045 sms_log(pMac, LOGE, FL("unknown command %d"),
1046 pCommand->command);
1047 pEntry = csr_ll_remove_head(&pMac->sme.smeCmdActiveList,
1048 LL_ACCESS_NOLOCK);
1049 csr_ll_unlock(&pMac->sme.smeCmdActiveList);
1050 pCommand = GET_BASE_ADDR(pEntry, tSmeCmd, Link);
1051 sme_release_command(pMac, pCommand);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301052 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001053 break;
1054 }
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301055 if (!QDF_IS_STATUS_SUCCESS(status))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001056 fContinue = true;
1057process_scan_q:
1058 if (!(sme_process_scan_queue(pMac)))
1059 fContinue = false;
1060 return fContinue;
1061}
1062
1063void sme_process_pending_queue(tpAniSirGlobal pMac)
1064{
1065 while (sme_process_command(pMac))
1066 ;
1067}
1068
1069bool sme_command_pending(tpAniSirGlobal pMac)
1070{
1071 return !csr_ll_is_list_empty(&pMac->sme.smeCmdActiveList, LL_ACCESS_NOLOCK)
1072 || !csr_ll_is_list_empty(&pMac->sme.smeCmdPendingList,
1073 LL_ACCESS_NOLOCK);
1074}
1075
1076/* Global APIs */
1077
1078/**
1079 * sme_open() - Initialze all SME modules and put them at idle state
1080 * @hHal: The handle returned by mac_open
1081 *
1082 * The function initializes each module inside SME, PMC, CSR, etc. Upon
1083 * successfully return, all modules are at idle state ready to start.
1084 * smeOpen must be called before any other SME APIs can be involved.
1085 * smeOpen must be called after mac_open.
1086 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301087 * Return: QDF_STATUS_SUCCESS - SME is successfully initialized.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001088 * Other status means SME is failed to be initialized
1089 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301090QDF_STATUS sme_open(tHalHandle hHal)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001091{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301092 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001093 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001094
1095 pMac->sme.state = SME_STATE_STOP;
Anurag Chouhan6d760662016-02-20 16:05:43 +05301096 pMac->sme.currDeviceMode = QDF_STA_MODE;
Anurag Chouhana37b5b72016-02-21 14:53:42 +05301097 if (!QDF_IS_STATUS_SUCCESS(qdf_mutex_create(
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001098 &pMac->sme.lkSmeGlobalLock))) {
1099 sms_log(pMac, LOGE, FL("sme_open failed init lock"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301100 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001101 }
1102 status = csr_open(pMac);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301103 if (!QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001104 sms_log(pMac, LOGE, FL("csr_open failed, status=%d"), status);
1105 return status;
1106 }
1107
1108 status = sme_ps_open(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301109 if (!QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001110 sms_log(pMac, LOGE,
1111 FL("sme_ps_open failed during initialization with status=%d"),
1112 status);
1113 return status;
1114 }
1115#ifdef FEATURE_WLAN_TDLS
1116 pMac->is_tdls_power_save_prohibited = 0;
1117#endif
1118
1119#ifndef WLAN_MDM_CODE_REDUCTION_OPT
1120 status = sme_qos_open(pMac);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301121 if (!QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001122 sms_log(pMac, LOGE, FL("Qos open, status=%d"), status);
1123 return status;
1124 }
1125#endif
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001126 status = init_sme_cmd_list(pMac);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301127 if (!QDF_IS_STATUS_SUCCESS(status))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001128 return status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001129
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001130 status = rrm_open(pMac);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301131 if (!QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001132 sms_log(pMac, LOGE, FL("rrm_open failed, status=%d"), status);
1133 return status;
1134 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001135 sme_p2p_open(pMac);
1136 sme_trace_init(pMac);
1137 return status;
1138}
1139
1140/*
1141 * sme_init_chan_list, triggers channel setup based on country code.
1142 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301143QDF_STATUS sme_init_chan_list(tHalHandle hal, uint8_t *alpha2,
Amar Singhala297bfa2015-10-15 15:07:29 -07001144 enum country_src cc_src)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001145{
1146 tpAniSirGlobal pmac = PMAC_STRUCT(hal);
1147
Amar Singhala297bfa2015-10-15 15:07:29 -07001148 if ((cc_src == SOURCE_USERSPACE) &&
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001149 (pmac->roam.configParam.fSupplicantCountryCodeHasPriority)) {
1150 pmac->roam.configParam.Is11dSupportEnabled = false;
1151 }
1152
1153 return csr_init_chan_list(pmac, alpha2);
1154}
1155
1156/*--------------------------------------------------------------------------
1157
1158 \brief sme_set11dinfo() - Set the 11d information about valid channels
1159 and there power using information from nvRAM
1160 This function is called only for AP.
1161
1162 This is a synchronous call
1163
1164 \param hHal - The handle returned by mac_open.
1165 \Param pSmeConfigParams - a pointer to a caller allocated object of
1166 typedef struct _smeConfigParams.
1167
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301168 \return QDF_STATUS_SUCCESS - SME update the config parameters successfully.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001169
1170 Other status means SME is failed to update the config parameters.
1171 \sa
1172 --------------------------------------------------------------------------*/
1173
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301174QDF_STATUS sme_set11dinfo(tHalHandle hHal, tpSmeConfigParams pSmeConfigParams)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001175{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301176 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001177 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
1178
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301179 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001180 TRACE_CODE_SME_RX_HDD_MSG_SET_11DINFO, NO_SESSION, 0));
1181 if (NULL == pSmeConfigParams) {
1182 sms_log(pMac, LOGE,
1183 "Empty config param structure for SME, nothing to update");
1184 return status;
1185 }
1186
1187 status = csr_set_channels(hHal, &pSmeConfigParams->csrConfig);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301188 if (!QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001189 sms_log(pMac, LOGE,
1190 "csr_change_default_config_param failed with status=%d",
1191 status);
1192 }
1193 return status;
1194}
1195
1196/**
1197 * sme_set_scan_disable() - Dynamically enable/disable scan
1198 * @h_hal: Handle to HAL
1199 *
1200 * This command gives the user an option to dynamically
1201 * enable or disable scans.
1202 *
1203 * Return: None
1204 */
1205void sme_set_scan_disable(tHalHandle h_hal, int value)
1206{
1207 tpAniSirGlobal mac_ctx = PMAC_STRUCT(h_hal);
1208 mac_ctx->lim.scan_disabled = value;
1209 sms_log(mac_ctx, LOG1, FL("value=%d"), value);
1210}
1211/*--------------------------------------------------------------------------
1212
1213 \brief sme_get_soft_ap_domain() - Get the current regulatory domain of softAp.
1214
1215 This is a synchronous call
1216
1217 \param hHal - The handle returned by HostapdAdapter.
1218 \Param v_REGDOMAIN_t - The current Regulatory Domain requested for SoftAp.
1219
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301220 \return QDF_STATUS_SUCCESS - SME successfully completed the request.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001221
1222 Other status means, failed to get the current regulatory domain.
1223 \sa
1224 --------------------------------------------------------------------------*/
1225
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301226QDF_STATUS sme_get_soft_ap_domain(tHalHandle hHal, v_REGDOMAIN_t *domainIdSoftAp)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001227{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301228 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001229 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
1230
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301231 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001232 TRACE_CODE_SME_RX_HDD_MSG_GET_SOFTAP_DOMAIN,
1233 NO_SESSION, 0));
1234 if (NULL == domainIdSoftAp) {
1235 sms_log(pMac, LOGE, "Uninitialized domain Id");
1236 return status;
1237 }
1238
1239 *domainIdSoftAp = pMac->scan.domainIdCurrent;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301240 status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001241
1242 return status;
1243}
1244
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301245QDF_STATUS sme_set_reg_info(tHalHandle hHal, uint8_t *apCntryCode)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001246{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301247 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001248 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
1249
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301250 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001251 TRACE_CODE_SME_RX_HDD_MSG_SET_REGINFO, NO_SESSION, 0));
1252 if (NULL == apCntryCode) {
1253 sms_log(pMac, LOGE, "Empty Country Code, nothing to update");
1254 return status;
1255 }
1256
1257 status = csr_set_reg_info(hHal, apCntryCode);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301258 if (!QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001259 sms_log(pMac, LOGE, "csr_set_reg_info failed with status=%d",
1260 status);
1261 }
1262 return status;
1263}
1264
Krunal Sonie3531942016-04-12 17:43:53 -07001265/**
1266 * sme_update_fine_time_measurement_capab() - Update the FTM capabitlies from
1267 * incoming val
1268 * @hal: Handle for Hal layer
1269 * @val: New FTM capability value
1270 *
1271 * Return: None
1272 */
Selvaraj, Sridhar57bb4d02016-08-31 16:14:15 +05301273void sme_update_fine_time_measurement_capab(tHalHandle hal, uint8_t session_id,
1274 uint32_t val)
Krunal Sonie3531942016-04-12 17:43:53 -07001275{
1276 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
1277 mac_ctx->fine_time_meas_cap = val;
1278
Selvaraj, Sridhar57bb4d02016-08-31 16:14:15 +05301279 if (!val) {
Krunal Sonie3531942016-04-12 17:43:53 -07001280 mac_ctx->rrm.rrmPEContext.rrmEnabledCaps.fine_time_meas_rpt = 0;
1281 ((tpRRMCaps)mac_ctx->rrm.rrmSmeContext.
1282 rrmConfig.rm_capability)->fine_time_meas_rpt = 0;
1283 } else {
1284 mac_ctx->rrm.rrmPEContext.rrmEnabledCaps.fine_time_meas_rpt = 1;
1285 ((tpRRMCaps)mac_ctx->rrm.rrmSmeContext.
1286 rrmConfig.rm_capability)->fine_time_meas_rpt = 1;
1287 }
Selvaraj, Sridhar57bb4d02016-08-31 16:14:15 +05301288
1289 /* Inform this RRM IE change to FW */
1290 csr_roam_offload_scan(mac_ctx, session_id,
1291 ROAM_SCAN_OFFLOAD_UPDATE_CFG,
1292 REASON_CONNECT_IES_CHANGED);
Krunal Sonie3531942016-04-12 17:43:53 -07001293}
1294
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001295/*--------------------------------------------------------------------------
1296
1297 \brief sme_update_config() - Change configurations for all SME moduels
1298
1299 The function updates some configuration for modules in SME, CSR, etc
1300 during SMEs close open sequence.
1301
1302 Modules inside SME apply the new configuration at the next transaction.
1303
1304 This is a synchronous call
1305
1306 \param hHal - The handle returned by mac_open.
1307 \Param pSmeConfigParams - a pointer to a caller allocated object of
1308 typedef struct _smeConfigParams.
1309
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301310 \return QDF_STATUS_SUCCESS - SME update the config parameters successfully.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001311
1312 Other status means SME is failed to update the config parameters.
1313 \sa
1314
1315 --------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301316QDF_STATUS sme_update_config(tHalHandle hHal, tpSmeConfigParams pSmeConfigParams)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001317{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301318 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001319 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
1320
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301321 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001322 TRACE_CODE_SME_RX_HDD_MSG_UPDATE_CONFIG, NO_SESSION,
1323 0));
1324 if (NULL == pSmeConfigParams) {
1325 sms_log(pMac, LOGE,
1326 "Empty config param structure for SME, nothing to update");
1327 return status;
1328 }
1329
1330 status =
1331 csr_change_default_config_param(pMac, &pSmeConfigParams->csrConfig);
1332
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301333 if (!QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001334 sms_log(pMac, LOGE,
1335 "csr_change_default_config_param failed with status=%d",
1336 status);
1337 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001338 status =
1339 rrm_change_default_config_param(hHal, &pSmeConfigParams->rrmConfig);
1340
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301341 if (!QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001342 sms_log(pMac, LOGE,
1343 "rrm_change_default_config_param failed with status=%d",
1344 status);
1345 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001346 /* For SOC, CFG is set before start */
1347 /* We don't want to apply global CFG in connect state because that may cause some side affect */
1348 if (csr_is_all_session_disconnected(pMac)) {
1349 csr_set_global_cfgs(pMac);
1350 }
1351
1352 /*
1353 * If scan offload is enabled then lim has allow the sending of
1354 * scan request to firmware even in powersave mode. The firmware has
1355 * to take care of exiting from power save mode
1356 */
1357 status = sme_cfg_set_int(hHal, WNI_CFG_SCAN_IN_POWERSAVE, true);
1358
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301359 if (QDF_STATUS_SUCCESS != status) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301360 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001361 "Could not pass on WNI_CFG_SCAN_IN_POWERSAVE to CFG");
1362 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001363 return status;
1364}
1365
1366/**
1367 * sme_update_roam_params() - Store/Update the roaming params
1368 * @hal: Handle for Hal layer
1369 * @session_id: SME Session ID
1370 * @roam_params_src: The source buffer to copy
1371 * @update_param: Type of parameter to be updated
1372 *
1373 * Return: Return the status of the updation.
1374 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301375QDF_STATUS sme_update_roam_params(tHalHandle hal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001376 uint8_t session_id, struct roam_ext_params roam_params_src,
1377 int update_param)
1378{
1379 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
1380 struct roam_ext_params *roam_params_dst;
1381 uint8_t i;
1382
1383 roam_params_dst = &mac_ctx->roam.configParam.roam_params;
1384 switch (update_param) {
1385 case REASON_ROAM_EXT_SCAN_PARAMS_CHANGED:
1386 roam_params_dst->raise_rssi_thresh_5g =
1387 roam_params_src.raise_rssi_thresh_5g;
1388 roam_params_dst->drop_rssi_thresh_5g =
1389 roam_params_src.drop_rssi_thresh_5g;
1390 roam_params_dst->raise_factor_5g =
1391 roam_params_src.raise_factor_5g;
1392 roam_params_dst->drop_factor_5g =
1393 roam_params_src.drop_factor_5g;
1394 roam_params_dst->max_raise_rssi_5g =
1395 roam_params_src.max_raise_rssi_5g;
1396 roam_params_dst->max_drop_rssi_5g =
1397 roam_params_src.max_drop_rssi_5g;
1398 roam_params_dst->alert_rssi_threshold =
1399 roam_params_src.alert_rssi_threshold;
1400 roam_params_dst->is_5g_pref_enabled = true;
1401 break;
1402 case REASON_ROAM_SET_SSID_ALLOWED:
Anurag Chouhan600c3a02016-03-01 10:33:54 +05301403 qdf_mem_set(&roam_params_dst->ssid_allowed_list, 0,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001404 sizeof(tSirMacSSid) * MAX_SSID_ALLOWED_LIST);
1405 roam_params_dst->num_ssid_allowed_list =
1406 roam_params_src.num_ssid_allowed_list;
1407 for (i = 0; i < roam_params_dst->num_ssid_allowed_list; i++) {
1408 roam_params_dst->ssid_allowed_list[i].length =
1409 roam_params_src.ssid_allowed_list[i].length;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05301410 qdf_mem_copy(roam_params_dst->ssid_allowed_list[i].ssId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001411 roam_params_src.ssid_allowed_list[i].ssId,
1412 roam_params_dst->ssid_allowed_list[i].length);
1413 }
1414 break;
1415 case REASON_ROAM_SET_FAVORED_BSSID:
Anurag Chouhan600c3a02016-03-01 10:33:54 +05301416 qdf_mem_set(&roam_params_dst->bssid_favored, 0,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001417 sizeof(tSirMacAddr) * MAX_BSSID_FAVORED);
1418 roam_params_dst->num_bssid_favored =
1419 roam_params_src.num_bssid_favored;
1420 for (i = 0; i < roam_params_dst->num_bssid_favored; i++) {
Anurag Chouhan600c3a02016-03-01 10:33:54 +05301421 qdf_mem_copy(&roam_params_dst->bssid_favored[i],
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001422 &roam_params_src.bssid_favored[i],
1423 sizeof(tSirMacAddr));
1424 roam_params_dst->bssid_favored_factor[i] =
1425 roam_params_src.bssid_favored_factor[i];
1426 }
1427 break;
1428 case REASON_ROAM_SET_BLACKLIST_BSSID:
Anurag Chouhan600c3a02016-03-01 10:33:54 +05301429 qdf_mem_set(&roam_params_dst->bssid_avoid_list, 0,
Anurag Chouhan6d760662016-02-20 16:05:43 +05301430 QDF_MAC_ADDR_SIZE * MAX_BSSID_AVOID_LIST);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001431 roam_params_dst->num_bssid_avoid_list =
1432 roam_params_src.num_bssid_avoid_list;
1433 for (i = 0; i < roam_params_dst->num_bssid_avoid_list; i++) {
Anurag Chouhanc5548422016-02-24 18:33:27 +05301434 qdf_copy_macaddr(&roam_params_dst->bssid_avoid_list[i],
Srinivas Girigowdab0532392015-11-24 11:50:16 -08001435 &roam_params_src.bssid_avoid_list[i]);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001436 }
1437 break;
1438 case REASON_ROAM_GOOD_RSSI_CHANGED:
1439 roam_params_dst->good_rssi_roam =
1440 roam_params_src.good_rssi_roam;
1441 break;
1442 default:
1443 break;
1444 }
1445 csr_roam_offload_scan(mac_ctx, session_id, ROAM_SCAN_OFFLOAD_UPDATE_CFG,
1446 update_param);
1447 return 0;
1448}
1449
1450#ifdef WLAN_FEATURE_GTK_OFFLOAD
1451void sme_process_get_gtk_info_rsp(tHalHandle hHal,
1452 tpSirGtkOffloadGetInfoRspParams
1453 pGtkOffloadGetInfoRsp)
1454{
1455 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
1456
1457 if (NULL == pMac) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301458 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_FATAL,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001459 "%s: pMac is null", __func__);
1460 return;
1461 }
1462 if (pMac->sme.gtk_offload_get_info_cb == NULL) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301463 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001464 "%s: HDD callback is null", __func__);
1465 return;
1466 }
1467 pMac->sme.gtk_offload_get_info_cb(
1468 pMac->sme.gtk_offload_get_info_cb_context,
1469 pGtkOffloadGetInfoRsp);
1470}
1471#endif
1472
1473/*--------------------------------------------------------------------------
1474
1475 \fn - sme_process_ready_to_suspend
1476 \brief - On getting ready to suspend indication, this function calls
1477 callback registered (HDD callbacks) with SME to inform
1478 ready to suspend indication.
1479
1480 \param hHal - Handle returned by mac_open.
1481 pReadyToSuspend - Parameter received along with ready to suspend
1482 indication from WMA.
1483
1484 \return None
1485
1486 \sa
1487
1488 --------------------------------------------------------------------------*/
1489void sme_process_ready_to_suspend(tHalHandle hHal,
1490 tpSirReadyToSuspendInd pReadyToSuspend)
1491{
1492 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
1493
1494 if (NULL == pMac) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301495 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_FATAL,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001496 "%s: pMac is null", __func__);
1497 return;
1498 }
1499
1500 if (NULL != pMac->readyToSuspendCallback) {
1501 pMac->readyToSuspendCallback(pMac->readyToSuspendContext,
1502 pReadyToSuspend->suspended);
1503 pMac->readyToSuspendCallback = NULL;
1504 }
1505}
1506
1507#ifdef WLAN_FEATURE_EXTWOW_SUPPORT
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001508
Krishna Kumaar Natarajand9131902015-10-19 11:52:47 -07001509/**
1510 * sme_process_ready_to_ext_wow() - inform ready to ExtWoW indication.
1511 * @hHal - Handle returned by mac_open.
1512 * @pReadyToExtWoW - Parameter received along with ready to Ext WoW
1513 * indication from WMA.
1514 *
1515 * On getting ready to Ext WoW indication, this function calls callback
1516 * registered (HDD callback)with SME to inform ready to ExtWoW indication.
1517 *
1518 * Return: None
1519 */
1520void sme_process_ready_to_ext_wow(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001521 tpSirReadyToExtWoWInd pReadyToExtWoW)
1522{
1523 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
1524
1525 if (NULL == pMac) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301526 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_FATAL,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001527 "%s: pMac is null", __func__);
1528 return;
1529 }
1530
1531 if (NULL != pMac->readyToExtWoWCallback) {
1532 pMac->readyToExtWoWCallback(pMac->readyToExtWoWContext,
1533 pReadyToExtWoW->status);
1534 pMac->readyToExtWoWCallback = NULL;
1535 pMac->readyToExtWoWContext = NULL;
1536 }
1537
1538}
1539#endif
1540
1541/* ---------------------------------------------------------------------------
1542 \fn sme_change_config_params
1543 \brief The SME API exposed for HDD to provide config params to SME during
1544 SMEs stop -> start sequence.
1545
1546 If HDD changed the domain that will cause a reset. This function will
1547 provide the new set of 11d information for the new domain. Currrently this
1548 API provides info regarding 11d only at reset but we can extend this for
1549 other params (PMC, QoS) which needs to be initialized again at reset.
1550
1551 This is a synchronous call
1552
1553 \param hHal - The handle returned by mac_open.
1554
1555 \Param
1556 pUpdateConfigParam - a pointer to a structure (tCsrUpdateConfigParam) that
1557 currently provides 11d related information like Country code,
1558 Regulatory domain, valid channel list, Tx power per channel, a
1559 list with active/passive scan allowed per valid channel.
1560
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301561 \return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001562 ---------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301563QDF_STATUS sme_change_config_params(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001564 tCsrUpdateConfigParam *pUpdateConfigParam)
1565{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301566 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001567 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
1568
1569 if (NULL == pUpdateConfigParam) {
1570 sms_log(pMac, LOGE,
1571 "Empty config param structure for SME, nothing to reset");
1572 return status;
1573 }
1574
1575 status = csr_change_config_params(pMac, pUpdateConfigParam);
1576
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301577 if (!QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001578 sms_log(pMac, LOGE, "csrUpdateConfigParam failed with status=%d",
1579 status);
1580 }
1581
1582 return status;
1583
1584}
1585
1586/*--------------------------------------------------------------------------
1587
1588 \brief sme_hdd_ready_ind() - SME sends eWNI_SME_SYS_READY_IND to PE to inform
1589 that the NIC is ready tio run.
1590
1591 The function is called by HDD at the end of initialization stage so PE/HAL can
1592 enable the NIC to running state.
1593
1594 This is a synchronous call
1595 \param hHal - The handle returned by mac_open.
1596
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301597 \return QDF_STATUS_SUCCESS - eWNI_SME_SYS_READY_IND is sent to PE
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001598 successfully.
1599
1600 Other status means SME failed to send the message to PE.
1601 \sa
1602
1603 --------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301604QDF_STATUS sme_hdd_ready_ind(tHalHandle hHal)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001605{
1606 tSirSmeReadyReq Msg;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301607 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001608 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
1609
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301610 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001611 TRACE_CODE_SME_RX_HDD_MSG_HDDREADYIND, NO_SESSION, 0));
1612 do {
1613
1614 Msg.messageType = eWNI_SME_SYS_READY_IND;
1615 Msg.length = sizeof(tSirSmeReadyReq);
1616 Msg.add_bssdescr_cb = csr_scan_process_single_bssdescr;
Varun Reddy Yeturud5939f82015-12-24 18:14:02 -08001617 Msg.csr_roam_synch_cb = csr_roam_synch_callback;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001618
1619
1620 if (eSIR_FAILURE != u_mac_post_ctrl_msg(hHal, (tSirMbMsg *) &Msg)) {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301621 status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001622 } else {
1623 sms_log(pMac, LOGE,
1624 "u_mac_post_ctrl_msg failed to send eWNI_SME_SYS_READY_IND");
1625 break;
1626 }
1627
1628 status = csr_ready(pMac);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301629 if (!QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001630 sms_log(pMac, LOGE,
1631 "csr_ready failed with status=%d",
1632 status);
1633 break;
1634 }
1635
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301636 if (QDF_STATUS_SUCCESS != rrm_ready(hHal)) {
1637 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001638 sms_log(pMac, LOGE, "rrm_ready failed");
1639 break;
1640 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001641 pMac->sme.state = SME_STATE_READY;
1642 } while (0);
1643
1644 return status;
1645}
1646
1647/*--------------------------------------------------------------------------
1648
1649 \brief sme_start() - Put all SME modules at ready state.
1650
1651 The function starts each module in SME, PMC, CSR, etc. . Upon
1652 successfully return, all modules are ready to run.
1653 This is a synchronous call
1654 \param hHal - The handle returned by mac_open.
1655
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301656 \return QDF_STATUS_SUCCESS - SME is ready.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001657
1658 Other status means SME is failed to start
1659 \sa
1660
1661 --------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301662QDF_STATUS sme_start(tHalHandle hHal)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001663{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301664 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001665 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
1666
1667 do {
1668 status = csr_start(pMac);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301669 if (!QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001670 sms_log(pMac, LOGE,
1671 "csr_start failed during smeStart with status=%d",
1672 status);
1673 break;
1674 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001675 pMac->sme.state = SME_STATE_START;
1676 } while (0);
1677
1678 return status;
1679}
1680
1681/**
1682 * sme_handle_scan_req() - Scan request handler
1683 * @mac_ctx: MAC global context
1684 * @msg: message buffer
1685 *
1686 * Scan request message from upper layer is handled as
1687 * part of this API
1688 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301689 * Return: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001690 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301691static QDF_STATUS sme_handle_scan_req(tpAniSirGlobal mac_ctx,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001692 void *msg)
1693{
1694 struct ani_scan_req *scan_msg;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301695 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001696 uint16_t session_id;
1697 csr_scan_completeCallback callback;
1698
1699 scan_msg = msg;
1700 session_id = scan_msg->session_id;
1701 callback = scan_msg->callback;
1702 status = csr_scan_request(mac_ctx, session_id,
1703 scan_msg->scan_param,
1704 callback, scan_msg->ctx);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301705 if (!QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001706 sms_log(mac_ctx, LOGE,
1707 FL("scan request failed. session_id %d"), session_id);
1708 }
1709 csr_scan_free_request(mac_ctx, scan_msg->scan_param);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05301710 qdf_mem_free(scan_msg->scan_param);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001711 return status;
1712}
1713
1714/**
1715 * sme_handle_roc_req() - Roc request handler
1716 * @mac_ctx: MAC global context
1717 * @msg: message buffer
1718 *
1719 * Roc request message from upper layer is handled as
1720 * part of this API
1721 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301722 * Return: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001723 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301724static QDF_STATUS sme_handle_roc_req(tHalHandle hal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001725 void *msg)
1726{
1727 struct ani_roc_req *roc_msg;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301728 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001729 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
1730 remainOnChanCallback callback;
1731
1732 if (msg == NULL) {
1733 sms_log(mac_ctx, LOGE, FL("ROC request is NULL"));
1734 return status;
1735 }
1736
1737 roc_msg = msg;
1738 callback = roc_msg->callback;
1739 status = p2p_remain_on_channel(hal, roc_msg->session_id,
1740 roc_msg->channel, roc_msg->duration, callback,
1741 roc_msg->ctx, roc_msg->is_p2pprobe_allowed,
1742 roc_msg->scan_id);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301743 if (!QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001744 sms_log(mac_ctx, LOGE,
1745 FL("scan request failed. session_id %d scan_id %d"),
1746 roc_msg->session_id, roc_msg->scan_id);
1747 }
1748 return status;
1749}
1750
1751#ifdef WLAN_FEATURE_11W
1752/*------------------------------------------------------------------
1753 *
1754 * Handle the unprotected management frame indication from LIM and
1755 * forward it to HDD.
1756 *
1757 *------------------------------------------------------------------*/
1758
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301759QDF_STATUS sme_unprotected_mgmt_frm_ind(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001760 tpSirSmeUnprotMgmtFrameInd pSmeMgmtFrm)
1761{
1762 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301763 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001764 tCsrRoamInfo pRoamInfo = { 0 };
1765 uint32_t SessionId = pSmeMgmtFrm->sessionId;
1766
1767 pRoamInfo.nFrameLength = pSmeMgmtFrm->frameLen;
1768 pRoamInfo.pbFrames = pSmeMgmtFrm->frameBuf;
1769 pRoamInfo.frameType = pSmeMgmtFrm->frameType;
1770
1771 /* forward the mgmt frame to HDD */
1772 csr_roam_call_callback(pMac, SessionId, &pRoamInfo, 0,
1773 eCSR_ROAM_UNPROT_MGMT_FRAME_IND, 0);
1774
1775 return status;
1776}
1777#endif
1778
1779/*------------------------------------------------------------------
1780 *
1781 * Handle the DFS Radar Event and indicate it to the SAP
1782 *
1783 *------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301784QDF_STATUS dfs_msg_processor(tpAniSirGlobal pMac, uint16_t msgType, void *pMsgBuf)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001785{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301786 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001787 tCsrRoamInfo roamInfo = { 0 };
1788 tSirSmeDfsEventInd *dfs_event;
1789 tSirSmeCSAIeTxCompleteRsp *csaIeTxCompleteRsp;
1790 uint32_t sessionId = 0;
1791 eRoamCmdStatus roamStatus;
1792 eCsrRoamResult roamResult;
1793 int i;
1794
1795 switch (msgType) {
1796 case eWNI_SME_DFS_RADAR_FOUND:
1797 {
1798 /* Radar found !! */
1799 dfs_event = (tSirSmeDfsEventInd *) pMsgBuf;
1800 if (NULL == dfs_event) {
1801 sms_log(pMac, LOGE,
1802 "%s: pMsg is NULL for eWNI_SME_DFS_RADAR_FOUND message",
1803 __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301804 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001805 }
1806 sessionId = dfs_event->sessionId;
1807 roamInfo.dfs_event.sessionId = sessionId;
1808 roamInfo.dfs_event.chan_list.nchannels =
1809 dfs_event->chan_list.nchannels;
1810 for (i = 0; i < dfs_event->chan_list.nchannels; i++) {
1811 roamInfo.dfs_event.chan_list.channels[i] =
1812 dfs_event->chan_list.channels[i];
1813 }
1814
1815 roamInfo.dfs_event.dfs_radar_status =
1816 dfs_event->dfs_radar_status;
1817 roamInfo.dfs_event.use_nol = dfs_event->use_nol;
1818
1819 roamStatus = eCSR_ROAM_DFS_RADAR_IND;
1820 roamResult = eCSR_ROAM_RESULT_DFS_RADAR_FOUND_IND;
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301821 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO_MED,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001822 "sapdfs: Radar indication event occurred");
1823 break;
1824 }
1825 case eWNI_SME_DFS_CSAIE_TX_COMPLETE_IND:
1826 {
1827 csaIeTxCompleteRsp =
1828 (tSirSmeCSAIeTxCompleteRsp *) pMsgBuf;
1829 if (NULL == csaIeTxCompleteRsp) {
1830 sms_log(pMac, LOGE,
1831 "%s: pMsg is NULL for eWNI_SME_DFS_CSAIE_TX_COMPLETE_IND",
1832 __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301833 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001834 }
1835 sessionId = csaIeTxCompleteRsp->sessionId;
1836 roamStatus = eCSR_ROAM_DFS_CHAN_SW_NOTIFY;
1837 roamResult = eCSR_ROAM_RESULT_DFS_CHANSW_UPDATE_SUCCESS;
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301838 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO_MED,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001839 "sapdfs: Received eWNI_SME_DFS_CSAIE_TX_COMPLETE_IND for session id [%d]",
1840 sessionId);
1841 break;
1842 }
1843 default:
1844 {
1845 sms_log(pMac, LOG1, "%s: Invalid DFS message = 0x%x",
1846 __func__, msgType);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301847 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001848 return status;
1849 }
1850 }
1851
1852 /* Indicate Radar Event to SAP */
1853 csr_roam_call_callback(pMac, sessionId, &roamInfo, 0,
1854 roamStatus, roamResult);
1855 return status;
1856}
1857
Abhishek Singh518323d2015-10-19 17:42:01 +05301858/**
1859 * sme_extended_change_channel_ind()- function to indicate ECSA
1860 * action frame is received in lim to SAP
1861 * @mac_ctx: pointer to global mac structure
1862 * @msg_buf: contain new channel and session id.
1863 *
1864 * This function is called to post ECSA action frame
1865 * receive event to SAP.
1866 *
1867 * Return: success if msg indicated to SAP else return failure
1868 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301869static QDF_STATUS sme_extended_change_channel_ind(tpAniSirGlobal mac_ctx,
Abhishek Singh518323d2015-10-19 17:42:01 +05301870 void *msg_buf)
1871{
1872 struct sir_sme_ext_cng_chan_ind *ext_chan_ind;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301873 QDF_STATUS status = QDF_STATUS_SUCCESS;
Abhishek Singh518323d2015-10-19 17:42:01 +05301874 uint32_t session_id = 0;
1875 tCsrRoamInfo roamInfo = {0};
1876 eRoamCmdStatus roam_status;
1877 eCsrRoamResult roam_result;
1878
1879
1880 ext_chan_ind = msg_buf;
1881 if (NULL == ext_chan_ind) {
1882 sms_log(mac_ctx, LOGE,
1883 FL("pMsg is NULL for eWNI_SME_EXT_CHANGE_CHANNEL_IND"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301884 return QDF_STATUS_E_FAILURE;
Abhishek Singh518323d2015-10-19 17:42:01 +05301885 }
1886 session_id = ext_chan_ind->session_id;
1887 roamInfo.target_channel = ext_chan_ind->new_channel;
1888 roam_status = eCSR_ROAM_EXT_CHG_CHNL_IND;
1889 roam_result = eCSR_ROAM_EXT_CHG_CHNL_UPDATE_IND;
1890 sms_log(mac_ctx, LOG1,
1891 FL("sapdfs: Received eWNI_SME_EXT_CHANGE_CHANNEL_IND for session id [%d]"),
1892 session_id);
1893
1894 /* Indicate Ext Channel Change event to SAP */
1895 csr_roam_call_callback(mac_ctx, session_id, &roamInfo, 0,
1896 roam_status, roam_result);
1897 return status;
1898}
1899
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001900/**
1901 * sme_process_fw_mem_dump_rsp - process fw memory dump response from WMA
1902 *
1903 * @mac_ctx: pointer to MAC handle.
1904 * @msg: pointer to received SME msg.
1905 *
1906 * This function process the received SME message and calls the corresponding
1907 * callback which was already registered with SME.
1908 *
1909 * Return: None
1910 */
1911#ifdef WLAN_FEATURE_MEMDUMP
1912static void sme_process_fw_mem_dump_rsp(tpAniSirGlobal mac_ctx, cds_msg_t *msg)
1913{
1914 if (msg->bodyptr) {
1915 if (mac_ctx->sme.fw_dump_callback)
1916 mac_ctx->sme.fw_dump_callback(mac_ctx->hHdd,
1917 (struct fw_dump_rsp *) msg->bodyptr);
1918 qdf_mem_free(msg->bodyptr);
1919 }
1920}
1921#else
1922static void sme_process_fw_mem_dump_rsp(tpAniSirGlobal mac_ctx, cds_msg_t *msg)
1923{
1924}
1925#endif
1926
1927#ifdef FEATURE_WLAN_ESE
1928/**
1929 * sme_update_is_ese_feature_enabled() - enable/disable ESE support at runtime
1930 * @hHal: HAL handle
1931 * @sessionId: session id
1932 * @isEseIniFeatureEnabled: ese ini enabled
1933 *
1934 * It is used at in the REG_DYNAMIC_VARIABLE macro definition of
1935 * isEseIniFeatureEnabled. This is a synchronous call
1936 *
1937 * Return: QDF_STATUS enumeration
1938 */
1939QDF_STATUS sme_update_is_ese_feature_enabled(tHalHandle hHal,
1940 uint8_t sessionId, const bool isEseIniFeatureEnabled)
1941{
1942 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
1943
1944 if (pMac->roam.configParam.isEseIniFeatureEnabled ==
1945 isEseIniFeatureEnabled) {
1946 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO,
1947 "%s: ESE Mode is already enabled or disabled, nothing to do (returning) old(%d) new(%d)",
1948 __func__,
1949 pMac->roam.configParam.isEseIniFeatureEnabled,
1950 isEseIniFeatureEnabled);
1951 return QDF_STATUS_SUCCESS;
1952 }
1953
1954 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO,
1955 "%s: EseEnabled is changed from %d to %d", __func__,
1956 pMac->roam.configParam.isEseIniFeatureEnabled,
1957 isEseIniFeatureEnabled);
1958 pMac->roam.configParam.isEseIniFeatureEnabled = isEseIniFeatureEnabled;
Varun Reddy Yeturuff4feb02016-04-20 12:26:11 -07001959 csr_neighbor_roam_update_fast_roaming_enabled(
1960 pMac, sessionId, isEseIniFeatureEnabled);
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001961
1962 if (true == isEseIniFeatureEnabled)
1963 sme_update_fast_transition_enabled(hHal, true);
1964
1965 if (pMac->roam.configParam.isRoamOffloadScanEnabled)
1966 csr_roam_offload_scan(pMac, sessionId,
1967 ROAM_SCAN_OFFLOAD_UPDATE_CFG,
1968 REASON_ESE_INI_CFG_CHANGED);
1969
1970 return QDF_STATUS_SUCCESS;
1971}
1972
1973/**
1974 * sme_set_plm_request() - set plm request
1975 * @hHal: HAL handle
1976 * @pPlmReq: Pointer to input plm request
1977 *
1978 * Return: QDF_STATUS enumeration
1979 */
1980QDF_STATUS sme_set_plm_request(tHalHandle hHal, tpSirPlmReq pPlmReq)
1981{
1982 QDF_STATUS status;
1983 bool ret = false;
1984 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
1985 uint8_t ch_list[WNI_CFG_VALID_CHANNEL_LIST] = { 0 };
1986 uint8_t count, valid_count = 0;
1987 cds_msg_t msg;
1988 tCsrRoamSession *pSession = CSR_GET_SESSION(pMac, pPlmReq->sessionId);
1989
1990 status = sme_acquire_global_lock(&pMac->sme);
1991 if (!QDF_IS_STATUS_SUCCESS(status))
1992 return status;
1993
1994 if (!pSession) {
1995 sms_log(pMac, LOGE, FL("session %d not found"),
1996 pPlmReq->sessionId);
1997 sme_release_global_lock(&pMac->sme);
1998 return QDF_STATUS_E_FAILURE;
1999 }
2000
2001 if (!pSession->sessionActive) {
2002 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
2003 FL("Invalid Sessionid"));
2004 sme_release_global_lock(&pMac->sme);
2005 return QDF_STATUS_E_FAILURE;
2006 }
2007
2008 if (!pPlmReq->enable)
2009 goto send_plm_start;
2010 /* validating channel numbers */
2011 for (count = 0; count < pPlmReq->plmNumCh; count++) {
2012 ret = csr_is_supported_channel(pMac, pPlmReq->plmChList[count]);
2013 if (ret && pPlmReq->plmChList[count] > 14) {
2014 if (CHANNEL_STATE_DFS == cds_get_channel_state(
2015 pPlmReq->plmChList[count])) {
2016 /* DFS channel is provided, no PLM bursts can be
2017 * transmitted. Ignoring these channels.
2018 */
2019 QDF_TRACE(QDF_MODULE_ID_SME,
2020 QDF_TRACE_LEVEL_INFO,
2021 FL("DFS channel %d ignored for PLM"),
2022 pPlmReq->plmChList[count]);
2023 continue;
2024 }
2025 } else if (!ret) {
2026 /* Not supported, ignore the channel */
2027 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO,
2028 FL("Unsupported channel %d ignored for PLM"),
2029 pPlmReq->plmChList[count]);
2030 continue;
2031 }
2032 ch_list[valid_count] = pPlmReq->plmChList[count];
2033 valid_count++;
2034 } /* End of for () */
2035
2036 /* Copying back the valid channel list to plm struct */
2037 qdf_mem_set((void *)pPlmReq->plmChList,
2038 pPlmReq->plmNumCh, 0);
2039 if (valid_count)
2040 qdf_mem_copy(pPlmReq->plmChList, ch_list,
2041 valid_count);
2042 /* All are invalid channels, FW need to send the PLM
2043 * report with "incapable" bit set.
2044 */
2045 pPlmReq->plmNumCh = valid_count;
2046
2047send_plm_start:
2048 /* PLM START */
2049 msg.type = WMA_SET_PLM_REQ;
2050 msg.reserved = 0;
2051 msg.bodyptr = pPlmReq;
2052
2053 if (!QDF_IS_STATUS_SUCCESS(cds_mq_post_message(QDF_MODULE_ID_WMA,
2054 &msg))) {
2055 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
2056 FL("Not able to post WMA_SET_PLM_REQ to WMA"));
2057 sme_release_global_lock(&pMac->sme);
2058 return QDF_STATUS_E_FAILURE;
2059 }
2060
2061 sme_release_global_lock(&pMac->sme);
2062 return status;
2063}
2064
2065/**
2066 * sme_tsm_ie_ind() - sme tsm ie indication
2067 * @hHal: HAL handle
2068 * @pSmeTsmIeInd: Pointer to tsm ie indication
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002069 *
2070 * Handle the tsm ie indication from LIM and forward it to HDD.
2071 *
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08002072 * Return: QDF_STATUS enumeration
2073 */
2074static QDF_STATUS sme_tsm_ie_ind(tHalHandle hHal, tSirSmeTsmIEInd *pSmeTsmIeInd)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002075{
2076 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302077 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002078 tCsrRoamInfo pRoamInfo = { 0 };
2079 uint32_t SessionId = pSmeTsmIeInd->sessionId;
2080 pRoamInfo.tsmIe.tsid = pSmeTsmIeInd->tsmIe.tsid;
2081 pRoamInfo.tsmIe.state = pSmeTsmIeInd->tsmIe.state;
2082 pRoamInfo.tsmIe.msmt_interval = pSmeTsmIeInd->tsmIe.msmt_interval;
2083 /* forward the tsm ie information to HDD */
2084 csr_roam_call_callback(pMac,
2085 SessionId, &pRoamInfo, 0, eCSR_ROAM_TSM_IE_IND, 0);
2086 return status;
2087}
2088
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08002089/**
2090 * sme_set_cckm_ie() - set cckm ie
2091 * @hHal: HAL handle
2092 * @sessionId: session id
2093 * @pCckmIe: Pointer to CCKM Ie
2094 * @cckmIeLen: Length of @pCckmIe
2095 *
2096 * Function to store the CCKM IE passed from supplicant and use
2097 * it while packing reassociation request.
2098 *
2099 * Return: QDF_STATUS enumeration
2100 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302101QDF_STATUS sme_set_cckm_ie(tHalHandle hHal, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002102 uint8_t *pCckmIe, uint8_t cckmIeLen)
2103{
2104 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302105 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002106 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302107 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002108 csr_set_cckm_ie(pMac, sessionId, pCckmIe, cckmIeLen);
2109 sme_release_global_lock(&pMac->sme);
2110 }
2111 return status;
2112}
2113
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08002114/**
2115 * sme_set_ese_beacon_request() - set ese beacon request
2116 * @hHal: HAL handle
2117 * @sessionId: session id
2118 * @pEseBcnReq: Ese beacon report
2119 *
2120 * function to set ESE beacon request parameters
2121 *
2122 * Return: QDF_STATUS enumeration
2123 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302124QDF_STATUS sme_set_ese_beacon_request(tHalHandle hHal, const uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002125 const tCsrEseBeaconReq *pEseBcnReq)
2126{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302127 QDF_STATUS status = eSIR_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002128 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
2129 tpSirBeaconReportReqInd pSmeBcnReportReq = NULL;
2130 tCsrEseBeaconReqParams *pBeaconReq = NULL;
2131 uint8_t counter = 0;
2132 tCsrRoamSession *pSession = CSR_GET_SESSION(pMac, sessionId);
2133 tpRrmSMEContext pSmeRrmContext = &pMac->rrm.rrmSmeContext;
2134
2135 if (pSmeRrmContext->eseBcnReqInProgress == true) {
2136 sms_log(pMac, LOGE,
2137 "A Beacon Report Req is already in progress");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302138 return QDF_STATUS_E_RESOURCES;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002139 }
2140
2141 /* Store the info in RRM context */
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302142 qdf_mem_copy(&pSmeRrmContext->eseBcnReqInfo, pEseBcnReq,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002143 sizeof(tCsrEseBeaconReq));
2144
2145 /* Prepare the request to send to SME. */
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302146 pSmeBcnReportReq = qdf_mem_malloc(sizeof(tSirBeaconReportReqInd));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002147 if (NULL == pSmeBcnReportReq) {
2148 sms_log(pMac, LOGP,
2149 "Memory Allocation Failure!!! ESE BcnReq Ind to SME");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302150 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002151 }
2152
2153 pSmeRrmContext->eseBcnReqInProgress = true;
2154
2155 sms_log(pMac, LOGE, "Sending Beacon Report Req to SME");
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302156 qdf_mem_zero(pSmeBcnReportReq, sizeof(tSirBeaconReportReqInd));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002157
2158 pSmeBcnReportReq->messageType = eWNI_SME_BEACON_REPORT_REQ_IND;
2159 pSmeBcnReportReq->length = sizeof(tSirBeaconReportReqInd);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302160 qdf_mem_copy(pSmeBcnReportReq->bssId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002161 pSession->connectedProfile.bssid.bytes,
2162 sizeof(tSirMacAddr));
2163 pSmeBcnReportReq->channelInfo.channelNum = 255;
2164 pSmeBcnReportReq->channelList.numChannels = pEseBcnReq->numBcnReqIe;
2165 pSmeBcnReportReq->msgSource = eRRM_MSG_SOURCE_ESE_UPLOAD;
2166
2167 for (counter = 0; counter < pEseBcnReq->numBcnReqIe; counter++) {
2168 pBeaconReq =
2169 (tCsrEseBeaconReqParams *) &pEseBcnReq->bcnReq[counter];
2170 pSmeBcnReportReq->fMeasurementtype[counter] =
2171 pBeaconReq->scanMode;
2172 pSmeBcnReportReq->measurementDuration[counter] =
2173 SYS_TU_TO_MS(pBeaconReq->measurementDuration);
2174 pSmeBcnReportReq->channelList.channelNumber[counter] =
2175 pBeaconReq->channel;
2176 }
2177
2178 status = sme_rrm_process_beacon_report_req_ind(pMac, pSmeBcnReportReq);
2179
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302180 if (status != QDF_STATUS_SUCCESS)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002181 pSmeRrmContext->eseBcnReqInProgress = false;
2182
Hanumanth Reddy Pothula7f7a2712016-09-07 18:44:47 +05302183 qdf_mem_free(pSmeBcnReportReq);
2184
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002185 return status;
2186}
2187
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08002188/**
2189 * sme_get_tsm_stats() - SME get tsm stats
2190 * @hHal: HAL handle
2191 * @callback: SME sends back the requested stats using the callback
2192 * @staId: The station ID for which the stats is requested for
2193 * @bssId: bssid
2194 * @pContext: user context to be passed back along with the callback
2195 * @p_cds_context: CDS context
2196 * @tid: Traffic id
2197 *
2198 * API register a callback to get TSM Stats.
2199 *
2200 * Return: QDF_STATUS enumeration
2201 */
2202QDF_STATUS sme_get_tsm_stats(tHalHandle hHal,
2203 tCsrTsmStatsCallback callback,
2204 uint8_t staId, struct qdf_mac_addr bssId,
2205 void *pContext, void *p_cds_context, uint8_t tid)
2206{
2207 QDF_STATUS status = QDF_STATUS_E_FAILURE;
2208 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
2209
2210 status = sme_acquire_global_lock(&pMac->sme);
2211 if (QDF_IS_STATUS_SUCCESS(status)) {
2212 status = csr_get_tsm_stats(pMac, callback,
2213 staId, bssId, pContext,
2214 p_cds_context, tid);
2215 sme_release_global_lock(&pMac->sme);
2216 }
2217 return status;
2218}
2219
2220/**
2221 * sme_set_ese_roam_scan_channel_list() - To set ese roam scan channel list
2222 * @hHal: pointer HAL handle returned by mac_open
2223 * @sessionId: sme session id
2224 * @pChannelList: Output channel list
2225 * @numChannels: Output number of channels
2226 *
2227 * This routine is called to set ese roam scan channel list.
2228 * This is a synchronous call
2229 *
2230 * Return: QDF_STATUS
2231 */
2232QDF_STATUS sme_set_ese_roam_scan_channel_list(tHalHandle hHal,
2233 uint8_t sessionId,
2234 uint8_t *pChannelList,
2235 uint8_t numChannels)
2236{
2237 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
2238 QDF_STATUS status = QDF_STATUS_SUCCESS;
2239 tpCsrNeighborRoamControlInfo pNeighborRoamInfo
2240 = &pMac->roam.neighborRoamInfo[sessionId];
2241 tpCsrChannelInfo curchnl_list_info
2242 = &pNeighborRoamInfo->roamChannelInfo.currentChannelListInfo;
2243 uint8_t oldChannelList[WNI_CFG_VALID_CHANNEL_LIST_LEN * 2] = { 0 };
2244 uint8_t newChannelList[128] = { 0 };
2245 uint8_t i = 0, j = 0;
2246
2247 status = sme_acquire_global_lock(&pMac->sme);
2248 if (!QDF_IS_STATUS_SUCCESS(status)) {
2249 if (pMac->roam.configParam.isRoamOffloadScanEnabled)
2250 csr_roam_offload_scan(pMac, sessionId,
2251 ROAM_SCAN_OFFLOAD_UPDATE_CFG,
2252 REASON_CHANNEL_LIST_CHANGED);
2253 return status;
2254 }
2255 if (NULL != curchnl_list_info->ChannelList) {
2256 for (i = 0; i < curchnl_list_info->numOfChannels; i++) {
2257 j += snprintf(oldChannelList + j,
2258 sizeof(oldChannelList) - j, "%d",
2259 curchnl_list_info->ChannelList[i]);
2260 }
2261 }
2262 status = csr_create_roam_scan_channel_list(pMac, sessionId,
2263 pChannelList, numChannels,
2264 csr_get_current_band(hHal));
2265 if (QDF_IS_STATUS_SUCCESS(status)) {
2266 if (NULL != curchnl_list_info->ChannelList) {
2267 j = 0;
2268 for (i = 0; i < curchnl_list_info->numOfChannels; i++) {
2269 j += snprintf(newChannelList + j,
2270 sizeof(newChannelList) - j, "%d",
2271 curchnl_list_info->ChannelList[i]);
2272 }
2273 }
2274 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
2275 "ESE roam scan chnl list successfully set to %s-old value is %s-roam state is %d",
2276 newChannelList, oldChannelList,
2277 pNeighborRoamInfo->neighborRoamState);
2278 }
2279 sme_release_global_lock(&pMac->sme);
2280 if (pMac->roam.configParam.isRoamOffloadScanEnabled)
2281 csr_roam_offload_scan(pMac, sessionId,
2282 ROAM_SCAN_OFFLOAD_UPDATE_CFG,
2283 REASON_CHANNEL_LIST_CHANGED);
2284 return status;
2285}
2286
2287#endif /* FEATURE_WLAN_ESE */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002288
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08002289QDF_STATUS sme_ibss_peer_info_response_handleer(tHalHandle hHal,
2290 tpSirIbssGetPeerInfoRspParams
2291 pIbssPeerInfoParams)
2292{
2293 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
2294
2295 if (NULL == pMac) {
2296 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_FATAL,
2297 "%s: pMac is null", __func__);
2298 return QDF_STATUS_E_FAILURE;
2299 }
2300 if (pMac->sme.peerInfoParams.peerInfoCbk == NULL) {
2301 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
2302 "%s: HDD callback is null", __func__);
2303 return QDF_STATUS_E_FAILURE;
2304 }
2305 pMac->sme.peerInfoParams.peerInfoCbk(pMac->sme.peerInfoParams.pUserData,
2306 &pIbssPeerInfoParams->
2307 ibssPeerInfoRspParams);
2308 return QDF_STATUS_SUCCESS;
2309}
2310
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002311/**
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002312 * sme_process_dual_mac_config_resp() - Process set Dual mac config response
2313 * @mac: Global MAC pointer
2314 * @msg: Dual mac config response
2315 *
2316 * Processes the dual mac configuration response and invokes the HDD callback
2317 * to process further
2318 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302319static QDF_STATUS sme_process_dual_mac_config_resp(tpAniSirGlobal mac,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002320 uint8_t *msg)
2321{
2322 tListElem *entry = NULL;
2323 tSmeCmd *command = NULL;
2324 bool found;
2325 dual_mac_cb callback = NULL;
2326 struct sir_dual_mac_config_resp *param;
2327
2328 param = (struct sir_dual_mac_config_resp *)msg;
2329 if (!param) {
2330 sms_log(mac, LOGE, FL("Dual mac config resp param is NULL"));
2331 /* Not returning. Need to check if active command list
2332 * needs to be freed
2333 */
2334 }
2335
2336 entry = csr_ll_peek_head(&mac->sme.smeCmdActiveList,
2337 LL_ACCESS_LOCK);
2338 if (!entry) {
2339 sms_log(mac, LOGE, FL("No cmd found in active list"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302340 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002341 }
2342
2343 command = GET_BASE_ADDR(entry, tSmeCmd, Link);
2344 if (!command) {
2345 sms_log(mac, LOGE, FL("Base address is NULL"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302346 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002347 }
2348
2349 if (e_sme_command_set_dual_mac_config != command->command) {
2350 sms_log(mac, LOGE, FL("Command mismatch!"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302351 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002352 }
2353
2354 callback = command->u.set_dual_mac_cmd.set_dual_mac_cb;
2355 if (callback) {
2356 if (!param) {
2357 sms_log(mac, LOGE,
2358 FL("Callback failed-Dual mac config is NULL"));
2359 } else {
2360 sms_log(mac, LOG1,
2361 FL("Calling HDD callback for Dual mac config"));
2362 callback(param->status,
2363 command->u.set_dual_mac_cmd.scan_config,
2364 command->u.set_dual_mac_cmd.fw_mode_config);
2365 }
2366 } else {
2367 sms_log(mac, LOGE, FL("Callback does not exist"));
2368 }
2369
2370 found = csr_ll_remove_entry(&mac->sme.smeCmdActiveList, entry,
2371 LL_ACCESS_LOCK);
2372 if (found)
2373 /* Now put this command back on the available command list */
2374 sme_release_command(mac, command);
2375
2376 sme_process_pending_queue(mac);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302377 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002378}
2379
Archana Ramachandrana20ef812015-11-13 16:12:13 -08002380/**
2381 * sme_process_antenna_mode_resp() - Process set antenna mode
2382 * response
2383 * @mac: Global MAC pointer
2384 * @msg: antenna mode response
2385 *
2386 * Processes the antenna mode response and invokes the HDD
2387 * callback to process further
2388 */
2389static QDF_STATUS sme_process_antenna_mode_resp(tpAniSirGlobal mac,
2390 uint8_t *msg)
2391{
2392 tListElem *entry;
2393 tSmeCmd *command;
2394 bool found;
2395 antenna_mode_cb callback;
2396 struct sir_antenna_mode_resp *param;
2397
2398 param = (struct sir_antenna_mode_resp *)msg;
2399 if (!param) {
2400 sms_log(mac, LOGE, FL("set antenna mode resp is NULL"));
2401 /* Not returning. Need to check if active command list
2402 * needs to be freed
2403 */
2404 }
2405
2406 entry = csr_ll_peek_head(&mac->sme.smeCmdActiveList,
2407 LL_ACCESS_LOCK);
2408 if (!entry) {
2409 sms_log(mac, LOGE, FL("No cmd found in active list"));
2410 return QDF_STATUS_E_FAILURE;
2411 }
2412
2413 command = GET_BASE_ADDR(entry, tSmeCmd, Link);
2414 if (!command) {
2415 sms_log(mac, LOGE, FL("Base address is NULL"));
2416 return QDF_STATUS_E_FAILURE;
2417 }
2418
2419 if (e_sme_command_set_antenna_mode != command->command) {
2420 sms_log(mac, LOGE, FL("Command mismatch!"));
2421 return QDF_STATUS_E_FAILURE;
2422 }
2423
2424 callback =
2425 command->u.set_antenna_mode_cmd.set_antenna_mode_resp;
2426 if (callback) {
2427 if (!param) {
2428 sms_log(mac, LOGE,
2429 FL("Set antenna mode call back is NULL"));
2430 } else {
2431 sms_log(mac, LOG1,
2432 FL("HDD callback for set antenna mode"));
2433 callback(param->status);
2434 }
2435 } else {
2436 sms_log(mac, LOGE, FL("Callback does not exist"));
2437 }
2438
2439 found = csr_ll_remove_entry(&mac->sme.smeCmdActiveList, entry,
2440 LL_ACCESS_LOCK);
2441 if (found)
2442 /* Now put this command back on the available command list */
2443 sme_release_command(mac, command);
2444
2445 sme_process_pending_queue(mac);
2446 return QDF_STATUS_SUCCESS;
2447}
2448
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002449/*--------------------------------------------------------------------------
2450
2451 \brief sme_process_msg() - The main message processor for SME.
2452
2453 The function is called by a message dispatcher when to process a message
2454 targeted for SME.
2455
2456 This is a synchronous call
2457 \param hHal - The handle returned by mac_open.
2458 \param pMsg - A pointer to a caller allocated object of tSirMsgQ.
2459
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302460 \return QDF_STATUS_SUCCESS - SME successfully process the message.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002461
2462 Other status means SME failed to process the message to HAL.
2463 \sa
2464
2465 --------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302466QDF_STATUS sme_process_msg(tHalHandle hHal, cds_msg_t *pMsg)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002467{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302468 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002469 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
2470
2471 if (pMsg == NULL) {
2472 sms_log(pMac, LOGE, "Empty message for SME");
2473 return status;
2474 }
2475 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302476 if (!QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002477 sms_log(pMac, LOGW, FL("Locking failed, bailing out"));
2478 if (pMsg->bodyptr)
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302479 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002480 return status;
2481 }
2482 if (!SME_IS_START(pMac)) {
2483 sms_log(pMac, LOGW, FL("message type %d in stop state ignored"),
2484 pMsg->type);
2485 if (pMsg->bodyptr)
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302486 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002487 goto release_lock;
2488 }
2489 switch (pMsg->type) {
2490#ifdef WLAN_FEATURE_ROAM_OFFLOAD
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002491 case eWNI_SME_HO_FAIL_IND:
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302492 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002493 FL("LFR3: Rcvd eWNI_SME_HO_FAIL_IND"));
2494 csr_process_ho_fail_ind(pMac, pMsg->bodyptr);
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_PMC_SMPS_STATE_IND:
2499 break;
2500 case WNI_CFG_SET_CNF:
2501 case WNI_CFG_DNLD_CNF:
2502 case WNI_CFG_GET_RSP:
2503 case WNI_CFG_ADD_GRP_ADDR_CNF:
2504 case WNI_CFG_DEL_GRP_ADDR_CNF:
2505 break;
2506 case eWNI_SME_ADDTS_RSP:
2507 case eWNI_SME_DELTS_RSP:
2508 case eWNI_SME_DELTS_IND:
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002509 case eWNI_SME_FT_AGGR_QOS_RSP:
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002510 /* QoS */
2511 if (pMsg->bodyptr) {
2512#ifndef WLAN_MDM_CODE_REDUCTION_OPT
2513 status = sme_qos_msg_processor(pMac, pMsg->type,
2514 pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302515 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002516#endif
2517 } else {
2518 sms_log(pMac, LOGE, FL("Empty message for %d"),
2519 pMsg->type);
2520 }
2521 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002522 case eWNI_SME_NEIGHBOR_REPORT_IND:
2523 case eWNI_SME_BEACON_REPORT_REQ_IND:
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002524 if (pMsg->bodyptr) {
2525 status = sme_rrm_msg_processor(pMac, pMsg->type,
2526 pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302527 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002528 } else {
2529 sms_log(pMac, LOGE, FL("Empty message for %d"),
2530 pMsg->type);
2531 }
2532 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002533 case eWNI_SME_ADD_STA_SELF_RSP:
2534 if (pMsg->bodyptr) {
2535 status = csr_process_add_sta_session_rsp(pMac,
2536 pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302537 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002538 } else {
2539 sms_log(pMac, LOGE, FL("Empty message for %d"),
2540 pMsg->type);
2541 }
2542 break;
2543 case eWNI_SME_DEL_STA_SELF_RSP:
2544 if (pMsg->bodyptr) {
2545 status = csr_process_del_sta_session_rsp(pMac,
2546 pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302547 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002548 } else {
2549 sms_log(pMac, LOGE, FL("Empty message for %d"),
2550 pMsg->type);
2551 }
2552 break;
2553 case eWNI_SME_REMAIN_ON_CHN_RSP:
2554 if (pMsg->bodyptr) {
2555 status = sme_remain_on_chn_rsp(pMac, pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302556 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002557 } else {
2558 sms_log(pMac, LOGE, FL("Empty message for %d"),
2559 pMsg->type);
2560 }
2561 break;
2562 case eWNI_SME_REMAIN_ON_CHN_RDY_IND:
2563 if (pMsg->bodyptr) {
2564 status = sme_remain_on_chn_ready(pMac, pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302565 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002566 } else {
2567 sms_log(pMac, LOGE, FL("Empty message for %d"),
2568 pMsg->type);
2569 }
2570 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002571#ifdef FEATURE_WLAN_SCAN_PNO
2572 case eWNI_SME_PREF_NETWORK_FOUND_IND:
Sreelakshmi Konamki6a065362016-05-31 16:05:01 +05302573 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_RX_WMA_MSG,
2574 NO_SESSION, pMsg->type));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002575 if (pMsg->bodyptr) {
2576 status = sme_preferred_network_found_ind((void *)pMac,
2577 pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302578 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002579 } else {
2580 sms_log(pMac, LOGE, FL("Empty message for %d"),
2581 pMsg->type);
2582 }
2583 break;
2584#endif /* FEATURE_WLAN_SCAN_PNO */
2585 case eWNI_SME_CHANGE_COUNTRY_CODE:
2586 if (pMsg->bodyptr) {
2587 status = sme_handle_change_country_code((void *)pMac,
2588 pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302589 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002590 } else {
2591 sms_log(pMac, LOGE, FL("Empty message for %d"),
2592 pMsg->type);
2593 }
2594 break;
2595 case eWNI_SME_GENERIC_CHANGE_COUNTRY_CODE:
2596 if (pMsg->bodyptr) {
2597 status = sme_handle_generic_change_country_code(
2598 (void *)pMac, pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302599 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002600 } else {
2601 sms_log(pMac, LOGE, FL("Empty message for %d"),
2602 pMsg->type);
2603 }
2604 break;
2605 case eWNI_SME_SCAN_CMD:
2606 if (pMsg->bodyptr) {
2607 status = sme_handle_scan_req(pMac, pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302608 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002609 } else {
2610 sms_log(pMac, LOGE, FL("Empty message for %d"),
2611 pMsg->type);
2612 }
2613 break;
2614 case eWNI_SME_ROC_CMD:
2615 if (pMsg->bodyptr) {
2616 status = sme_handle_roc_req(hHal, pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302617 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002618 } else {
2619 sms_log(pMac, LOGE, FL("Empty message for %d"),
2620 pMsg->type);
2621 }
2622 break;
2623#ifdef FEATURE_WLAN_TDLS
2624 /*
2625 * command rescived from PE, SME tdls msg processor shall be called
2626 * to process commands recieved from PE
2627 */
2628 case eWNI_SME_TDLS_SEND_MGMT_RSP:
2629 case eWNI_SME_TDLS_ADD_STA_RSP:
2630 case eWNI_SME_TDLS_DEL_STA_RSP:
2631 case eWNI_SME_TDLS_DEL_STA_IND:
2632 case eWNI_SME_TDLS_DEL_ALL_PEER_IND:
2633 case eWNI_SME_MGMT_FRM_TX_COMPLETION_IND:
2634 case eWNI_SME_TDLS_LINK_ESTABLISH_RSP:
2635 case eWNI_SME_TDLS_SHOULD_DISCOVER:
2636 case eWNI_SME_TDLS_SHOULD_TEARDOWN:
2637 case eWNI_SME_TDLS_PEER_DISCONNECTED:
2638 if (pMsg->bodyptr) {
2639 status = tdls_msg_processor(pMac, pMsg->type,
2640 pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302641 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002642 } else {
2643 sms_log(pMac, LOGE, FL("Empty message for %d"),
2644 pMsg->type);
2645 }
2646 break;
2647#endif
2648#ifdef WLAN_FEATURE_11W
2649 case eWNI_SME_UNPROT_MGMT_FRM_IND:
2650 if (pMsg->bodyptr) {
2651 sme_unprotected_mgmt_frm_ind(pMac, pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302652 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002653 } else {
2654 sms_log(pMac, LOGE, FL("Empty message for %d"),
2655 pMsg->type);
2656 }
2657 break;
2658#endif
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08002659#ifdef FEATURE_WLAN_ESE
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002660 case eWNI_SME_TSM_IE_IND:
2661 if (pMsg->bodyptr) {
2662 sme_tsm_ie_ind(pMac, pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302663 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002664 } else {
2665 sms_log(pMac, LOGE, FL("Empty message for %d"),
2666 pMsg->type);
2667 }
2668 break;
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08002669#endif /* FEATURE_WLAN_ESE */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002670 case eWNI_SME_ROAM_SCAN_OFFLOAD_RSP:
2671 status = csr_roam_offload_scan_rsp_hdlr((void *)pMac,
2672 pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302673 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002674 break;
2675#ifdef WLAN_FEATURE_GTK_OFFLOAD
2676 case eWNI_PMC_GTK_OFFLOAD_GETINFO_RSP:
Sreelakshmi Konamki6a065362016-05-31 16:05:01 +05302677 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_RX_WMA_MSG,
2678 NO_SESSION, pMsg->type));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002679 if (pMsg->bodyptr) {
2680 sme_process_get_gtk_info_rsp(pMac, pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302681 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002682 } else {
2683 sms_log(pMac, LOGE, FL("Empty message for %d"),
2684 pMsg->type);
2685 }
2686 break;
2687#endif
2688#ifdef FEATURE_WLAN_LPHB
2689 /* LPHB timeout indication arrived, send IND to client */
2690 case eWNI_SME_LPHB_IND:
Sreelakshmi Konamki6a065362016-05-31 16:05:01 +05302691 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_RX_WMA_MSG,
2692 NO_SESSION, pMsg->type));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002693 if (pMac->sme.pLphbIndCb)
2694 pMac->sme.pLphbIndCb(pMac->hHdd, pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302695 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002696 break;
2697#endif /* FEATURE_WLAN_LPHB */
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08002698 case eWNI_SME_IBSS_PEER_INFO_RSP:
2699 if (pMsg->bodyptr) {
2700 sme_ibss_peer_info_response_handleer(pMac,
2701 pMsg->
2702 bodyptr);
2703 qdf_mem_free(pMsg->bodyptr);
2704 } else {
2705 sms_log(pMac, LOGE, FL("Empty message for %d"),
2706 pMsg->type);
2707 }
2708 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002709 case eWNI_SME_READY_TO_SUSPEND_IND:
2710 if (pMsg->bodyptr) {
2711 sme_process_ready_to_suspend(pMac, pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302712 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002713 } else {
2714 sms_log(pMac, LOGE, FL("Empty message for %d"),
2715 pMsg->type);
2716 }
2717 break;
2718#ifdef WLAN_FEATURE_EXTWOW_SUPPORT
2719 case eWNI_SME_READY_TO_EXTWOW_IND:
2720 if (pMsg->bodyptr) {
Krishna Kumaar Natarajand9131902015-10-19 11:52:47 -07002721 sme_process_ready_to_ext_wow(pMac, pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302722 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002723 } else {
2724 sms_log(pMac, LOGE, FL("Empty message for %d"),
2725 pMsg->type);
2726 }
2727 break;
2728#endif
2729#ifdef FEATURE_WLAN_CH_AVOID
2730 /* channel avoid message arrived, send IND to client */
2731 case eWNI_SME_CH_AVOID_IND:
Sreelakshmi Konamki6a065362016-05-31 16:05:01 +05302732 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_RX_WMA_MSG,
2733 NO_SESSION, pMsg->type));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002734 if (pMac->sme.pChAvoidNotificationCb) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302735 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002736 FL("CH avoid notification"));
2737 pMac->sme.pChAvoidNotificationCb(pMac->hHdd,
2738 pMsg->bodyptr);
2739 }
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302740 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002741 break;
2742#endif /* FEATURE_WLAN_CH_AVOID */
2743#ifdef FEATURE_WLAN_AUTO_SHUTDOWN
2744 case eWNI_SME_AUTO_SHUTDOWN_IND:
2745 if (pMac->sme.pAutoShutdownNotificationCb) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302746 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002747 FL("Auto shutdown notification"));
2748 pMac->sme.pAutoShutdownNotificationCb();
2749 }
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302750 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002751 break;
2752#endif
2753 case eWNI_SME_DFS_RADAR_FOUND:
2754 case eWNI_SME_DFS_CSAIE_TX_COMPLETE_IND:
2755 status = dfs_msg_processor(pMac, pMsg->type, pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302756 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002757 break;
2758 case eWNI_SME_CHANNEL_CHANGE_RSP:
2759 if (pMsg->bodyptr) {
2760 status = sme_process_channel_change_resp(pMac,
2761 pMsg->type,
2762 pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302763 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002764 } else {
2765 sms_log(pMac, LOGE, FL("Empty message for %d"),
2766 pMsg->type);
2767 }
2768 break;
2769#ifdef WLAN_FEATURE_STATS_EXT
2770 case eWNI_SME_STATS_EXT_EVENT:
2771 if (pMsg->bodyptr) {
2772 status = sme_stats_ext_event(hHal, pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302773 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002774 } else {
2775 sms_log(pMac, LOGE, FL("Empty message for %d"),
2776 pMsg->type);
2777 }
2778 break;
2779#endif
2780 case eWNI_SME_LINK_SPEED_IND:
2781 if (pMac->sme.pLinkSpeedIndCb)
2782 pMac->sme.pLinkSpeedIndCb(pMsg->bodyptr,
2783 pMac->sme.pLinkSpeedCbContext);
2784 if (pMsg->bodyptr)
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302785 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002786 break;
2787 case eWNI_SME_CSA_OFFLOAD_EVENT:
2788 if (pMsg->bodyptr) {
2789 csr_scan_flush_bss_entry(pMac, pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302790 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002791 }
2792 break;
Manikandan Mohandcc21ba2016-03-15 14:31:56 -07002793 case eWNI_SME_TSF_EVENT:
2794 if (pMac->sme.get_tsf_cb) {
2795 pMac->sme.get_tsf_cb(pMac->sme.get_tsf_cxt,
2796 (struct stsf *)pMsg->bodyptr);
2797 }
2798 if (pMsg->bodyptr)
2799 qdf_mem_free(pMsg->bodyptr);
2800 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002801#ifdef WLAN_FEATURE_NAN
2802 case eWNI_SME_NAN_EVENT:
Sreelakshmi Konamki6a065362016-05-31 16:05:01 +05302803 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_RX_WMA_MSG,
2804 NO_SESSION, pMsg->type));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002805 if (pMsg->bodyptr) {
2806 sme_nan_event(hHal, pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302807 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002808 }
2809 break;
2810#endif /* WLAN_FEATURE_NAN */
2811 case eWNI_SME_LINK_STATUS_IND:
2812 {
2813 tAniGetLinkStatus *pLinkStatus =
2814 (tAniGetLinkStatus *) pMsg->bodyptr;
2815 if (pLinkStatus) {
2816 if (pMac->sme.linkStatusCallback) {
2817 pMac->sme.linkStatusCallback(
2818 pLinkStatus->linkStatus,
2819 pMac->sme.linkStatusContext);
2820 }
2821 pMac->sme.linkStatusCallback = NULL;
2822 pMac->sme.linkStatusContext = NULL;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302823 qdf_mem_free(pLinkStatus);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002824 }
2825 break;
2826 }
2827 case eWNI_SME_MSG_GET_TEMPERATURE_IND:
2828 if (pMac->sme.pGetTemperatureCb) {
2829 pMac->sme.pGetTemperatureCb(pMsg->bodyval,
2830 pMac->sme.pTemperatureCbContext);
2831 }
2832 break;
2833 case eWNI_SME_SNR_IND:
2834 {
2835 tAniGetSnrReq *pSnrReq = (tAniGetSnrReq *) pMsg->bodyptr;
2836 if (pSnrReq) {
2837 if (pSnrReq->snrCallback) {
2838 ((tCsrSnrCallback)
2839 (pSnrReq->snrCallback))
2840 (pSnrReq->snr, pSnrReq->staId,
2841 pSnrReq->pDevContext);
2842 }
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302843 qdf_mem_free(pSnrReq);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002844 }
2845 break;
2846 }
2847#ifdef FEATURE_WLAN_EXTSCAN
2848 case eWNI_SME_EXTSCAN_FULL_SCAN_RESULT_IND:
2849 if (pMac->sme.pExtScanIndCb)
2850 pMac->sme.pExtScanIndCb(pMac->hHdd,
2851 eSIR_EXTSCAN_FULL_SCAN_RESULT_IND,
2852 pMsg->bodyptr);
2853 else
2854 sms_log(pMac, LOGE,
2855 FL("callback not registered to process %d"),
2856 pMsg->type);
2857
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302858 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002859 break;
2860 case eWNI_SME_EPNO_NETWORK_FOUND_IND:
2861 if (pMac->sme.pExtScanIndCb)
2862 pMac->sme.pExtScanIndCb(pMac->hHdd,
2863 eSIR_EPNO_NETWORK_FOUND_IND,
2864 pMsg->bodyptr);
2865 else
2866 sms_log(pMac, LOGE,
2867 FL("callback not registered to process %d"),
2868 pMsg->type);
2869
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302870 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002871 break;
2872#endif
2873 case eWNI_SME_FW_DUMP_IND:
2874 sme_process_fw_mem_dump_rsp(pMac, pMsg);
2875 break;
2876 case eWNI_SME_SET_HW_MODE_RESP:
2877 if (pMsg->bodyptr) {
2878 status = sme_process_set_hw_mode_resp(pMac,
2879 pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302880 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002881 } else {
2882 sms_log(pMac, LOGE, FL("Empty message for %d"),
2883 pMsg->type);
2884 }
2885 break;
2886 case eWNI_SME_HW_MODE_TRANS_IND:
2887 if (pMsg->bodyptr) {
2888 status = sme_process_hw_mode_trans_ind(pMac,
2889 pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302890 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002891 } else {
2892 sms_log(pMac, LOGE, FL("Empty message for %d"),
2893 pMsg->type);
2894 }
2895 break;
2896 case eWNI_SME_NSS_UPDATE_RSP:
2897 if (pMsg->bodyptr) {
2898 status = sme_process_nss_update_resp(pMac,
2899 pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302900 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002901 } else {
2902 sms_log(pMac, LOGE, FL("Empty message for %d"),
2903 pMsg->type);
2904 }
2905 break;
2906 case eWNI_SME_OCB_SET_CONFIG_RSP:
2907 if (pMac->sme.ocb_set_config_callback) {
2908 pMac->sme.ocb_set_config_callback(
2909 pMac->sme.ocb_set_config_context,
2910 pMsg->bodyptr);
2911 } else {
2912 sms_log(pMac, LOGE, FL(
2913 "Message error. The callback is NULL."));
2914 }
2915 pMac->sme.ocb_set_config_callback = NULL;
2916 pMac->sme.ocb_set_config_context = NULL;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302917 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002918 break;
2919 case eWNI_SME_OCB_GET_TSF_TIMER_RSP:
2920 if (pMac->sme.ocb_get_tsf_timer_callback) {
2921 pMac->sme.ocb_get_tsf_timer_callback(
2922 pMac->sme.ocb_get_tsf_timer_context,
2923 pMsg->bodyptr);
2924 } else {
2925 sms_log(pMac, LOGE, FL(
2926 "Message error. The callback is NULL."));
2927 }
2928 pMac->sme.ocb_get_tsf_timer_callback = NULL;
2929 pMac->sme.ocb_get_tsf_timer_context = NULL;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302930 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002931 break;
2932 case eWNI_SME_DCC_GET_STATS_RSP:
2933 if (pMac->sme.dcc_get_stats_callback) {
2934 pMac->sme.dcc_get_stats_callback(
2935 pMac->sme.dcc_get_stats_context,
2936 pMsg->bodyptr);
2937 } else {
2938 sms_log(pMac, LOGE, FL(
2939 "Message error. The callback is NULL."));
2940 }
2941 pMac->sme.dcc_get_stats_callback = NULL;
2942 pMac->sme.dcc_get_stats_context = NULL;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302943 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002944 break;
2945 case eWNI_SME_DCC_UPDATE_NDL_RSP:
2946 if (pMac->sme.dcc_update_ndl_callback) {
2947 pMac->sme.dcc_update_ndl_callback(
2948 pMac->sme.dcc_update_ndl_context,
2949 pMsg->bodyptr);
2950 } else {
2951 sms_log(pMac, LOGE, FL(
2952 "Message error. The callback is NULL."));
2953 }
2954 pMac->sme.dcc_update_ndl_callback = NULL;
2955 pMac->sme.dcc_update_ndl_context = NULL;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302956 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002957 break;
2958 case eWNI_SME_DCC_STATS_EVENT:
2959 if (pMac->sme.dcc_stats_event_callback) {
2960 pMac->sme.dcc_stats_event_callback(
2961 pMac->sme.dcc_stats_event_context,
2962 pMsg->bodyptr);
2963 } else {
2964 sms_log(pMac, LOGE, FL(
2965 "Message error. The callback is NULL."));
2966 }
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302967 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002968 break;
2969 case eWNI_SME_SET_DUAL_MAC_CFG_RESP:
2970 if (pMsg->bodyptr) {
2971 status = sme_process_dual_mac_config_resp(pMac,
2972 pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302973 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002974 } else {
2975 sms_log(pMac, LOGE, FL("Empty message for %d"),
2976 pMsg->type);
2977 }
2978 case eWNI_SME_SET_THERMAL_LEVEL_IND:
2979 if (pMac->sme.set_thermal_level_cb)
2980 pMac->sme.set_thermal_level_cb(pMac->hHdd,
2981 pMsg->bodyval);
2982 break;
Abhishek Singh518323d2015-10-19 17:42:01 +05302983 case eWNI_SME_EXT_CHANGE_CHANNEL_IND:
2984 status = sme_extended_change_channel_ind(pMac, pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302985 qdf_mem_free(pMsg->bodyptr);
Abhishek Singh518323d2015-10-19 17:42:01 +05302986 break;
Archana Ramachandrana20ef812015-11-13 16:12:13 -08002987 case eWNI_SME_SET_ANTENNA_MODE_RESP:
2988 if (pMsg->bodyptr) {
2989 status = sme_process_antenna_mode_resp(pMac,
2990 pMsg->bodyptr);
2991 qdf_mem_free(pMsg->bodyptr);
2992 } else {
2993 sms_log(pMac, LOGE, FL("Empty message for %d"),
2994 pMsg->type);
2995 }
2996 break;
Deepak Dhamdhere0f076bd2016-06-02 11:29:21 -07002997 case eWNI_SME_NDP_CONFIRM_IND:
2998 case eWNI_SME_NDP_NEW_PEER_IND:
2999 case eWNI_SME_NDP_INITIATOR_RSP:
Abhishek Singh4fef7472016-06-06 11:36:03 -07003000 case eWNI_SME_NDP_INDICATION:
3001 case eWNI_SME_NDP_RESPONDER_RSP:
Naveen Rawatf28315c2016-06-29 18:06:02 -07003002 case eWNI_SME_NDP_END_RSP:
Deepak Dhamdherea6d2f4c2016-06-04 00:24:52 -07003003 case eWNI_SME_NDP_END_IND:
3004 case eWNI_SME_NDP_PEER_DEPARTED_IND:
Deepak Dhamdhere0f076bd2016-06-02 11:29:21 -07003005 sme_ndp_msg_processor(pMac, pMsg);
3006 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003007 default:
3008
3009 if ((pMsg->type >= eWNI_SME_MSG_TYPES_BEGIN)
3010 && (pMsg->type <= eWNI_SME_MSG_TYPES_END)) {
3011 /* CSR */
3012 if (pMsg->bodyptr) {
3013 status = csr_msg_processor(hHal, pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303014 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003015 } else {
3016 sms_log(pMac, LOGE, FL("Empty message for %d"),
3017 pMsg->type);
3018 }
3019 } else {
3020 sms_log(pMac, LOGW, FL("Unknown message type %d"),
3021 pMsg->type);
3022 if (pMsg->bodyptr)
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303023 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003024 }
3025 } /* switch */
3026release_lock:
3027 sme_release_global_lock(&pMac->sme);
3028 return status;
3029}
3030
3031/**
3032 * sme_process_nss_update_resp() - Process nss update response
3033 * @mac: Global MAC pointer
3034 * @msg: nss update response
3035 *
3036 * Processes the nss update response and invokes the HDD
3037 * callback to process further
3038 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303039QDF_STATUS sme_process_nss_update_resp(tpAniSirGlobal mac, uint8_t *msg)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003040{
3041 tListElem *entry = NULL;
3042 tSmeCmd *command = NULL;
3043 bool found;
3044 nss_update_cb callback = NULL;
3045 struct sir_beacon_tx_complete_rsp *param;
3046
3047 param = (struct sir_beacon_tx_complete_rsp *)msg;
3048 if (!param) {
3049 sms_log(mac, LOGE, FL("nss update resp param is NULL"));
3050 /* Not returning. Need to check if active command list
3051 * needs to be freed
3052 */
3053 }
3054
3055 entry = csr_ll_peek_head(&mac->sme.smeCmdActiveList,
3056 LL_ACCESS_LOCK);
3057 if (!entry) {
3058 sms_log(mac, LOGE, FL("No cmd found in active list"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303059 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003060 }
3061
3062 command = GET_BASE_ADDR(entry, tSmeCmd, Link);
3063 if (!command) {
3064 sms_log(mac, LOGE, FL("Base address is NULL"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303065 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003066 }
3067
3068 if (e_sme_command_nss_update != command->command) {
3069 sms_log(mac, LOGE, FL("Command mismatch!"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303070 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003071 }
3072
3073 callback = command->u.nss_update_cmd.nss_update_cb;
3074 if (callback) {
3075 if (!param) {
3076 sms_log(mac, LOGE,
3077 FL("Callback failed since nss update params is NULL"));
3078 } else {
3079 sms_log(mac, LOGE,
3080 FL("Calling HDD callback for nss update response"));
3081 callback(command->u.nss_update_cmd.context,
3082 param->tx_status,
3083 param->session_id,
Chandrasekaran, Manishekarce2172e2016-02-18 16:12:43 +05303084 command->u.nss_update_cmd.next_action,
3085 command->u.nss_update_cmd.reason);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003086 }
3087 } else {
3088 sms_log(mac, LOGE, FL("Callback does not exisit"));
3089 }
3090
3091 found = csr_ll_remove_entry(&mac->sme.smeCmdActiveList, entry,
3092 LL_ACCESS_LOCK);
3093 if (found) {
3094 /* Now put this command back on the avilable command list */
3095 sme_release_command(mac, command);
3096 }
3097 sme_process_pending_queue(mac);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303098 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003099}
3100
3101/* No need to hold the global lock here because this function can only be called */
3102/* after sme_stop. */
3103void sme_free_msg(tHalHandle hHal, cds_msg_t *pMsg)
3104{
3105 if (pMsg) {
3106 if (pMsg->bodyptr) {
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303107 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003108 }
3109 }
3110
3111}
3112
3113/*--------------------------------------------------------------------------
3114
3115 \brief sme_stop() - Stop all SME modules and put them at idle state
3116
3117 The function stops each module in SME, PMC, CSR, etc. . Upon
3118 return, all modules are at idle state ready to start.
3119
3120 This is a synchronous call
3121 \param hHal - The handle returned by mac_open
3122 \param tHalStopType - reason for stopping
3123
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303124 \return QDF_STATUS_SUCCESS - SME is stopped.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003125
3126 Other status means SME is failed to stop but caller should still
3127 consider SME is stopped.
3128 \sa
3129
3130 --------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303131QDF_STATUS sme_stop(tHalHandle hHal, tHalStopType stopType)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003132{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303133 QDF_STATUS status = QDF_STATUS_E_FAILURE;
3134 QDF_STATUS fail_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003135 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
3136
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003137 p2p_stop(hHal);
3138
3139 status = csr_stop(pMac, stopType);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303140 if (!QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003141 sms_log(pMac, LOGE,
3142 "csr_stop failed during smeStop with status=%d", status);
3143 fail_status = status;
3144 }
3145
3146 purge_sme_cmd_list(pMac);
3147
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303148 if (!QDF_IS_STATUS_SUCCESS(fail_status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003149 status = fail_status;
3150 }
3151
3152 pMac->sme.state = SME_STATE_STOP;
3153
3154 return status;
3155}
3156
3157/*--------------------------------------------------------------------------
3158
3159 \brief sme_close() - Release all SME modules and their resources.
3160
3161 The function release each module in SME, PMC, CSR, etc. . Upon
3162 return, all modules are at closed state.
3163
3164 No SME APIs can be involved after smeClose except smeOpen.
3165 smeClose must be called before mac_close.
3166 This is a synchronous call
3167 \param hHal - The handle returned by mac_open
3168
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303169 \return QDF_STATUS_SUCCESS - SME is successfully close.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003170
3171 Other status means SME is failed to be closed but caller still cannot
3172 call any other SME functions except smeOpen.
3173 \sa
3174
3175 --------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303176QDF_STATUS sme_close(tHalHandle hHal)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003177{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303178 QDF_STATUS status = QDF_STATUS_E_FAILURE;
3179 QDF_STATUS fail_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003180 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
3181
3182 if (!pMac)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303183 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003184
3185 /* Note: pSession will be invalid from here on, do not access */
3186 status = csr_close(pMac);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303187 if (!QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003188 sms_log(pMac, LOGE,
3189 "csr_close failed during sme close with status=%d",
3190 status);
3191 fail_status = status;
3192 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003193#ifndef WLAN_MDM_CODE_REDUCTION_OPT
3194 status = sme_qos_close(pMac);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303195 if (!QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003196 sms_log(pMac, LOGE,
3197 "Qos close failed during sme close with status=%d",
3198 status);
3199 fail_status = status;
3200 }
3201#endif
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003202 status = sme_ps_close(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303203 if (!QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003204 sms_log(pMac, LOGE,
3205 "sme_ps_close failed during smeClose status=%d",
3206 status);
3207 fail_status = status;
3208 }
3209
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003210 status = rrm_close(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303211 if (!QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003212 sms_log(pMac, LOGE,
3213 "RRM close failed during sme close with status=%d",
3214 status);
3215 fail_status = status;
3216 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003217
3218 sme_p2p_close(hHal);
3219
3220 free_sme_cmd_list(pMac);
3221
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303222 if (!QDF_IS_STATUS_SUCCESS
Anurag Chouhana37b5b72016-02-21 14:53:42 +05303223 (qdf_mutex_destroy(&pMac->sme.lkSmeGlobalLock))) {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303224 fail_status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003225 }
3226
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303227 if (!QDF_IS_STATUS_SUCCESS(fail_status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003228 status = fail_status;
3229 }
3230
3231 pMac->sme.state = SME_STATE_STOP;
3232
3233 return status;
3234}
3235
3236/**
Abhishek Singhc9941602016-08-09 16:06:22 +05303237 * sme_remove_bssid_from_scan_list() - wrapper to remove the bssid from
3238 * scan list
3239 * @hal: hal context.
3240 * @bssid: bssid to be removed
3241 *
3242 * This function remove the given bssid from scan list.
3243 *
3244 * Return: QDF status.
3245 */
3246QDF_STATUS sme_remove_bssid_from_scan_list(tHalHandle hal,
3247 tSirMacAddr bssid)
3248{
3249 QDF_STATUS status = QDF_STATUS_E_FAILURE;
3250 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
3251
3252 status = sme_acquire_global_lock(&mac_ctx->sme);
3253 if (QDF_IS_STATUS_SUCCESS(status)) {
3254 csr_remove_bssid_from_scan_list(mac_ctx, bssid);
3255 sme_release_global_lock(&mac_ctx->sme);
3256 }
3257
3258 return status;
3259}
3260
3261/**
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003262 * sme_scan_request() - wrapper function to Request a 11d or full scan from CSR.
3263 * @hal: hal global context
3264 * @session_id: session id
3265 * @scan_req: scan req
3266 * @callback: a callback function that scan calls upon finish, will not
3267 * be called if csr_scan_request returns error
3268 * @ctx: a pointer passed in for the callback
3269 *
3270 * This is a wrapper function to Request a 11d or full scan from CSR. This is
3271 * an asynchronous call
3272 *
3273 * Return: Status of operation
3274 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303275QDF_STATUS sme_scan_request(tHalHandle hal, uint8_t session_id,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003276 tCsrScanRequest *scan_req,
3277 csr_scan_completeCallback callback, void *ctx)
3278{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303279 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003280 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
3281 struct ani_scan_req *scan_msg;
3282 cds_msg_t msg;
3283 uint32_t scan_req_id, scan_count;
3284
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303285 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003286 TRACE_CODE_SME_RX_HDD_MSG_SCAN_REQ, session_id,
3287 scan_req->scanType));
Chandrasekaran, Manishekar2859de42016-02-11 16:17:38 +05303288
3289 if (!CSR_IS_SESSION_VALID(mac_ctx, session_id)) {
3290 sms_log(mac_ctx, LOGE, FL("Invalid session id:%d"),
3291 session_id);
3292 return status;
3293 }
3294
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003295 if (!mac_ctx->scan.fScanEnable) {
3296 sms_log(mac_ctx, LOGE, FL("fScanEnable false"));
3297 return status;
3298 }
3299
3300 scan_count = csr_ll_count(&mac_ctx->sme.smeScanCmdActiveList);
3301 if (scan_count >= mac_ctx->scan.max_scan_count) {
3302 sms_log(mac_ctx, LOGE, FL("Max scan reached"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303303 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003304 }
3305 wma_get_scan_id(&scan_req_id);
3306 scan_req->scan_id = scan_req_id;
3307
3308 status = sme_acquire_global_lock(&mac_ctx->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303309 if (!QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003310 sms_log(mac_ctx, LOGE, FL("Unable to acquire lock"));
3311 return status;
3312 }
3313 sms_log(mac_ctx, LOG1, FL(" called"));
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303314 scan_msg = qdf_mem_malloc(sizeof(struct ani_scan_req));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003315 if (NULL == scan_msg) {
3316 sms_log(mac_ctx, LOGE,
3317 " scan_req: failed to allocate mem for msg");
3318 sme_release_global_lock(&mac_ctx->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303319 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003320 }
3321 scan_msg->msg_type = eWNI_SME_SCAN_CMD;
3322 scan_msg->msg_len = (uint16_t) sizeof(struct ani_scan_req);
3323 scan_msg->session_id = session_id;
3324 scan_msg->callback = callback;
3325 scan_msg->ctx = ctx;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303326 scan_msg->scan_param = qdf_mem_malloc(sizeof(tCsrScanRequest));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003327 if (NULL == scan_msg->scan_param) {
3328 sms_log(mac_ctx, LOGE,
3329 "scan_req:failed to allocate mem for scanreq");
3330 sme_release_global_lock(&mac_ctx->sme);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303331 qdf_mem_free(scan_msg);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303332 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003333 }
3334 csr_scan_copy_request(mac_ctx, scan_msg->scan_param, scan_req);
3335 msg.type = eWNI_SME_SCAN_CMD;
3336 msg.bodyptr = scan_msg;
3337 msg.reserved = 0;
3338 msg.bodyval = 0;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303339 if (QDF_STATUS_SUCCESS !=
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003340 cds_mq_post_message(CDS_MQ_ID_SME, &msg)) {
3341 sms_log(mac_ctx, LOGE,
3342 " sme_scan_req failed to post msg");
3343 csr_scan_free_request(mac_ctx, scan_msg->scan_param);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303344 qdf_mem_free(scan_msg->scan_param);
3345 qdf_mem_free(scan_msg);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303346 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003347 }
3348 sme_release_global_lock(&mac_ctx->sme);
3349 return status;
3350}
3351
3352/* ---------------------------------------------------------------------------
3353 \fn sme_scan_get_result
3354 \brief a wrapper function to request scan results from CSR.
3355 This is a synchronous call
3356 \param pFilter - If pFilter is NULL, all cached results are returned
3357 \param phResult - an object for the result.
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303358 \return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003359 ---------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303360QDF_STATUS sme_scan_get_result(tHalHandle hHal, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003361 tCsrScanResultFilter *pFilter,
3362 tScanResultHandle *phResult)
3363{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303364 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003365 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
3366
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303367 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003368 TRACE_CODE_SME_RX_HDD_MSG_SCAN_GET_RESULTS, sessionId,
3369 0));
3370 sms_log(pMac, LOG2, FL("enter"));
3371 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303372 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003373 status = csr_scan_get_result(hHal, pFilter, phResult);
3374 sme_release_global_lock(&pMac->sme);
3375 }
3376 sms_log(pMac, LOG2, FL("exit status %d"), status);
3377
3378 return status;
3379}
3380
3381/**
3382 * sme_get_ap_channel_from_scan_cache() - a wrapper function to get AP's
3383 * channel id from CSR by filtering the
3384 * result which matches our roam profile.
3385 * @profile: SAP adapter
3386 * @ap_chnl_id: pointer to channel id of SAP. Fill the value after finding the
3387 * best ap from scan cache.
3388 *
3389 * This function is written to get AP's channel id from CSR by filtering
3390 * the result which matches our roam profile. This is a synchronous call.
3391 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303392 * Return: QDF_STATUS.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003393 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303394QDF_STATUS sme_get_ap_channel_from_scan_cache(tHalHandle hal_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003395 tCsrRoamProfile *profile,
3396 tScanResultHandle *scan_cache,
3397 uint8_t *ap_chnl_id)
3398{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303399 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003400 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal_handle);
3401 tCsrScanResultFilter *scan_filter = NULL;
3402 tScanResultHandle filtered_scan_result = NULL;
3403 tSirBssDescription first_ap_profile;
3404
3405 if (NULL == mac_ctx) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303406 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003407 FL("mac_ctx is NULL"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303408 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003409 }
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303410 scan_filter = qdf_mem_malloc(sizeof(tCsrScanResultFilter));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003411 if (NULL == scan_filter) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303412 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003413 FL("scan_filter mem alloc failed"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303414 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003415 } else {
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303416 qdf_mem_set(scan_filter, sizeof(tCsrScanResultFilter), 0);
3417 qdf_mem_set(&first_ap_profile, sizeof(tSirBssDescription), 0);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003418
3419 if (NULL == profile) {
3420 scan_filter->EncryptionType.numEntries = 1;
3421 scan_filter->EncryptionType.encryptionType[0]
3422 = eCSR_ENCRYPT_TYPE_NONE;
3423 } else {
3424 /* Here is the profile we need to connect to */
3425 status = csr_roam_prepare_filter_from_profile(mac_ctx,
3426 profile,
3427 scan_filter);
3428 }
3429
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303430 if (QDF_STATUS_SUCCESS == status) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003431 /* Save the WPS info */
3432 if (NULL != profile) {
3433 scan_filter->bWPSAssociation =
3434 profile->bWPSAssociation;
3435 scan_filter->bOSENAssociation =
3436 profile->bOSENAssociation;
3437 } else {
3438 scan_filter->bWPSAssociation = 0;
3439 scan_filter->bOSENAssociation = 0;
3440 }
3441 } else {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303442 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003443 FL("Preparing the profile filter failed"));
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303444 qdf_mem_free(scan_filter);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303445 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003446 }
3447 }
3448 status = sme_acquire_global_lock(&mac_ctx->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303449 if (QDF_STATUS_SUCCESS == status) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003450 status = csr_scan_get_result(hal_handle, scan_filter,
3451 &filtered_scan_result);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303452 if (QDF_STATUS_SUCCESS == status) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003453 csr_get_bssdescr_from_scan_handle(filtered_scan_result,
3454 &first_ap_profile);
3455 *scan_cache = filtered_scan_result;
3456 if (0 != first_ap_profile.channelId) {
3457 *ap_chnl_id = first_ap_profile.channelId;
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303458 QDF_TRACE(QDF_MODULE_ID_SME,
3459 QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003460 FL("Found best AP & its on chnl[%d]"),
3461 first_ap_profile.channelId);
3462 } else {
3463 /*
3464 * This means scan result is empty
3465 * so set the channel to zero, caller should
3466 * take of zero channel id case.
3467 */
3468 *ap_chnl_id = 0;
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303469 QDF_TRACE(QDF_MODULE_ID_SME,
3470 QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003471 FL("Scan is empty, set chnl to 0"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303472 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003473 }
3474 } else {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303475 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003476 FL("Failed to get scan get result"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303477 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003478 }
3479 csr_free_scan_filter(mac_ctx, scan_filter);
3480 sme_release_global_lock(&mac_ctx->sme);
3481 } else {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303482 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003483 FL("Aquiring lock failed"));
Krunal Sonif9882222016-01-22 17:16:50 -08003484 csr_free_scan_filter(mac_ctx, scan_filter);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303485 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003486 }
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303487 qdf_mem_free(scan_filter);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003488 return status;
3489}
3490
3491/**
3492 * sme_store_joinreq_param() - This function will pass station's join
3493 * request to store to csr.
3494 * @hal_handle: pointer to hal context.
3495 * @profile: pointer to station's roam profile.
3496 * @scan_cache: pointer to station's scan cache.
3497 * @roam_id: reference to roam_id variable being passed.
3498 * @session_id: station's session id.
3499 *
3500 * This function will pass station's join request further down to csr
3501 * to store it. this stored parameter will be used later.
3502 *
3503 * Return: true or false based on function's overall success.
3504 **/
3505bool sme_store_joinreq_param(tHalHandle hal_handle,
3506 tCsrRoamProfile *profile,
3507 tScanResultHandle scan_cache,
3508 uint32_t *roam_id,
3509 uint32_t session_id)
3510{
3511 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal_handle);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303512 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003513 bool ret_status = true;
3514
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303515 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003516 TRACE_CODE_SME_RX_HDD_STORE_JOIN_REQ,
3517 session_id, 0));
3518 status = sme_acquire_global_lock(&mac_ctx->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303519 if (QDF_STATUS_SUCCESS == status) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003520 if (false == csr_store_joinreq_param(mac_ctx, profile,
3521 scan_cache, roam_id, session_id)) {
3522 ret_status = false;
3523 }
3524 sme_release_global_lock(&mac_ctx->sme);
3525 } else {
3526 ret_status = false;
3527 }
3528
3529 return ret_status;
3530}
3531
3532/**
3533 * sme_clear_joinreq_param() - This function will pass station's clear
3534 * the join request to csr.
3535 * @hal_handle: pointer to hal context.
3536 * @session_id: station's session id.
3537 *
3538 * This function will pass station's clear join request further down to csr
3539 * to cleanup.
3540 *
3541 * Return: true or false based on function's overall success.
3542 **/
3543bool sme_clear_joinreq_param(tHalHandle hal_handle,
3544 uint32_t session_id)
3545{
3546 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal_handle);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303547 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003548 bool ret_status = true;
3549
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303550 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003551 TRACE_CODE_SME_RX_HDD_CLEAR_JOIN_REQ,
3552 session_id, 0));
3553 status = sme_acquire_global_lock(&mac_ctx->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303554 if (QDF_STATUS_SUCCESS == status) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003555 if (false == csr_clear_joinreq_param(mac_ctx,
3556 session_id)) {
3557 ret_status = false;
3558 }
3559 sme_release_global_lock(&mac_ctx->sme);
3560 } else {
3561 ret_status = false;
3562 }
3563
3564 return ret_status;
3565}
3566
3567/**
3568 * sme_issue_stored_joinreq() - This function will issues station's stored
3569 * the join request to csr.
3570 * @hal_handle: pointer to hal context.
3571 * @roam_id: reference to roam_id variable being passed.
3572 * @session_id: station's session id.
3573 *
3574 * This function will issue station's stored join request further down to csr
3575 * to proceed forward.
3576 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303577 * Return: QDF_STATUS_SUCCESS or QDF_STATUS_E_FAILURE.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003578 **/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303579QDF_STATUS sme_issue_stored_joinreq(tHalHandle hal_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003580 uint32_t *roam_id,
3581 uint32_t session_id)
3582{
3583 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal_handle);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303584 QDF_STATUS status = QDF_STATUS_E_FAILURE;
3585 QDF_STATUS ret_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003586
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303587 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003588 TRACE_CODE_SME_RX_HDD_ISSUE_JOIN_REQ,
3589 session_id, 0));
3590 status = sme_acquire_global_lock(&mac_ctx->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303591 if (QDF_STATUS_SUCCESS == status) {
3592 if (QDF_STATUS_SUCCESS != csr_issue_stored_joinreq(mac_ctx,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003593 roam_id,
3594 session_id)) {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303595 ret_status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003596 }
3597 sme_release_global_lock(&mac_ctx->sme);
3598 } else {
3599 csr_clear_joinreq_param(mac_ctx, session_id);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303600 ret_status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003601 }
3602 return ret_status;
3603}
3604
3605/* ---------------------------------------------------------------------------
3606 \fn sme_scan_flush_result
3607 \brief a wrapper function to request CSR to clear scan results.
3608 This is a synchronous call
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303609 \return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003610 ---------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303611QDF_STATUS sme_scan_flush_result(tHalHandle hHal)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003612{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303613 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003614 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
3615
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303616 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003617 TRACE_CODE_SME_RX_HDD_MSG_SCAN_FLUSH_RESULTS,
3618 0, 0));
3619 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303620 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003621 status = csr_scan_flush_result(hHal);
3622 sme_release_global_lock(&pMac->sme);
3623 }
3624
3625 return status;
3626}
3627
3628/* ---------------------------------------------------------------------------
3629 \fn sme_filter_scan_results
3630 \brief a wrapper function to request CSR to clear scan results.
3631 This is a synchronous call
3632 \param tHalHandle - HAL context handle
3633 \param sessionId - session id
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303634 \return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003635 ---------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303636QDF_STATUS sme_filter_scan_results(tHalHandle hHal, uint8_t sessionId)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003637{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303638 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003639 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
3640
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303641 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003642 TRACE_CODE_SME_RX_HDD_MSG_SCAN_FLUSH_RESULTS,
3643 sessionId, 0));
3644 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303645 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003646 csr_scan_filter_results(pMac);
3647 sme_release_global_lock(&pMac->sme);
3648 }
3649
3650 return status;
3651}
3652
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303653QDF_STATUS sme_scan_flush_p2p_result(tHalHandle hHal, uint8_t sessionId)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003654{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303655 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003656 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
3657
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303658 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003659 TRACE_CODE_SME_RX_HDD_MSG_SCAN_FLUSH_P2PRESULTS,
3660 sessionId, 0));
3661 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303662 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003663 status = csr_scan_flush_selective_result(hHal, true);
3664 sme_release_global_lock(&pMac->sme);
3665 }
3666
3667 return status;
3668}
3669
3670/* ---------------------------------------------------------------------------
3671 \fn sme_scan_result_get_first
3672 \brief a wrapper function to request CSR to returns the first element of
3673 scan result.
3674 This is a synchronous call
3675 \param hScanResult - returned from csr_scan_get_result
3676 \return tCsrScanResultInfo * - NULL if no result
3677 ---------------------------------------------------------------------------*/
3678tCsrScanResultInfo *sme_scan_result_get_first(tHalHandle hHal,
3679 tScanResultHandle hScanResult)
3680{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303681 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003682 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
3683 tCsrScanResultInfo *pRet = NULL;
3684
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303685 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003686 TRACE_CODE_SME_RX_HDD_MSG_SCAN_RESULT_GETFIRST,
3687 NO_SESSION, 0));
3688 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303689 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003690 pRet = csr_scan_result_get_first(pMac, hScanResult);
3691 sme_release_global_lock(&pMac->sme);
3692 }
3693
3694 return pRet;
3695}
3696
3697/* ---------------------------------------------------------------------------
3698 \fn sme_scan_result_get_next
3699 \brief a wrapper function to request CSR to returns the next element of
3700 scan result. It can be called without calling csr_scan_result_get_first
3701 first
3702 This is a synchronous call
3703 \param hScanResult - returned from csr_scan_get_result
3704 \return Null if no result or reach the end
3705 ---------------------------------------------------------------------------*/
3706tCsrScanResultInfo *sme_scan_result_get_next(tHalHandle hHal,
3707 tScanResultHandle hScanResult)
3708{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303709 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003710 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
3711 tCsrScanResultInfo *pRet = NULL;
3712
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003713 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303714 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003715 pRet = csr_scan_result_get_next(pMac, hScanResult);
3716 sme_release_global_lock(&pMac->sme);
3717 }
3718
3719 return pRet;
3720}
3721
3722/* ---------------------------------------------------------------------------
3723 \fn sme_scan_result_purge
3724 \brief a wrapper function to request CSR to remove all items(tCsrScanResult)
3725 in the list and free memory for each item
3726 This is a synchronous call
3727 \param hScanResult - returned from csr_scan_get_result. hScanResult is
3728 considered gone by
3729 calling this function and even before this function reutrns.
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303730 \return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003731 ---------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303732QDF_STATUS sme_scan_result_purge(tHalHandle hHal, tScanResultHandle hScanResult)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003733{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303734 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003735 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
3736
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303737 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003738 TRACE_CODE_SME_RX_HDD_MSG_SCAN_RESULT_PURGE,
3739 NO_SESSION, 0));
3740 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303741 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003742 status = csr_scan_result_purge(hHal, hScanResult);
3743 sme_release_global_lock(&pMac->sme);
3744 }
3745
3746 return status;
3747}
3748
3749/* ---------------------------------------------------------------------------
3750 \fn sme_scan_get_pmkid_candidate_list
3751 \brief a wrapper function to return the PMKID candidate list
3752 This is a synchronous call
3753 \param pPmkidList - caller allocated buffer point to an array of
3754 tPmkidCandidateInfo
3755 \param pNumItems - pointer to a variable that has the number of
3756 tPmkidCandidateInfo allocated when retruning, this is
3757 either the number needed or number of items put into
3758 pPmkidList
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303759 \return QDF_STATUS - when fail, it usually means the buffer allocated is not
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003760 big enough and pNumItems
3761 has the number of tPmkidCandidateInfo.
3762 \Note: pNumItems is a number of tPmkidCandidateInfo,
3763 not sizeof(tPmkidCandidateInfo) * something
3764 ---------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303765QDF_STATUS sme_scan_get_pmkid_candidate_list(tHalHandle hHal, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003766 tPmkidCandidateInfo *pPmkidList,
3767 uint32_t *pNumItems)
3768{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303769 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003770 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
3771
3772 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303773 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003774 status =
3775 csr_scan_get_pmkid_candidate_list(pMac, sessionId,
3776 pPmkidList,
3777 pNumItems);
3778 sme_release_global_lock(&pMac->sme);
3779 }
3780
3781 return status;
3782}
3783
3784eCsrPhyMode sme_get_phy_mode(tHalHandle hHal)
3785{
3786 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
3787 return pMac->roam.configParam.phyMode;
3788}
3789
3790/* ---------------------------------------------------------------------------
3791 \fn sme_get_channel_bonding_mode5_g
3792 \brief get the channel bonding mode for 5G band
3793 \param hHal - HAL handle
3794 \return channel bonding mode for 5G
3795 ---------------------------------------------------------------------------*/
3796uint32_t sme_get_channel_bonding_mode5_g(tHalHandle hHal)
3797{
3798 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
3799 tSmeConfigParams smeConfig;
3800
3801 sme_get_config_param(pMac, &smeConfig);
3802
3803 return smeConfig.csrConfig.channelBondingMode5GHz;
3804}
3805
3806/* ---------------------------------------------------------------------------
3807 \fn sme_get_channel_bonding_mode24_g
3808 \brief get the channel bonding mode for 2.4G band
3809 \param hHal - HAL handle
3810 \return channel bonding mode for 2.4G
3811 ---------------------------------------------------------------------------*/
3812uint32_t sme_get_channel_bonding_mode24_g(tHalHandle hHal)
3813{
3814 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
3815 tSmeConfigParams smeConfig;
3816
3817 sme_get_config_param(pMac, &smeConfig);
3818
3819 return smeConfig.csrConfig.channelBondingMode24GHz;
3820}
3821
3822/* ---------------------------------------------------------------------------
3823 \fn sme_roam_connect
3824 \brief a wrapper function to request CSR to inititiate an association
3825 This is an asynchronous call.
3826 \param sessionId - the sessionId returned by sme_open_session.
3827 \param pProfile - description of the network to which to connect
3828 \param hBssListIn - a list of BSS descriptor to roam to. It is returned
3829 from csr_scan_get_result
3830 \param pRoamId - to get back the request ID
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303831 \return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003832 ---------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303833QDF_STATUS sme_roam_connect(tHalHandle hHal, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003834 tCsrRoamProfile *pProfile, uint32_t *pRoamId)
3835{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303836 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003837 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
3838
3839 if (!pMac) {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303840 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003841 }
3842
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303843 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003844 TRACE_CODE_SME_RX_HDD_MSG_CONNECT, sessionId, 0));
3845 sms_log(pMac, LOG2, FL("enter"));
3846 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303847 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003848 if (CSR_IS_SESSION_VALID(pMac, sessionId)) {
3849 status =
3850 csr_roam_connect(pMac, sessionId, pProfile,
3851 pRoamId);
3852 } else {
3853 sms_log(pMac, LOGE, FL("invalid sessionID %d"),
3854 sessionId);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303855 status = QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003856 }
3857 sme_release_global_lock(&pMac->sme);
3858 } else {
3859 sms_log(pMac, LOGE, FL("sme_acquire_global_lock failed"));
3860 }
3861
3862 return status;
3863}
3864
3865/* ---------------------------------------------------------------------------
3866
3867 \fn sme_set_phy_mode
3868
3869 \brief Changes the PhyMode.
3870
3871 \param hHal - The handle returned by mac_open.
3872
3873 \param phyMode new phyMode which is to set
3874
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303875 \return QDF_STATUS SUCCESS.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003876
3877 -------------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303878QDF_STATUS sme_set_phy_mode(tHalHandle hHal, eCsrPhyMode phyMode)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003879{
3880 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
3881
3882 if (NULL == pMac) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303883 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003884 "%s: invalid context", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303885 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003886 }
3887
3888 pMac->roam.configParam.phyMode = phyMode;
3889 pMac->roam.configParam.uCfgDot11Mode =
3890 csr_get_cfg_dot11_mode_from_csr_phy_mode(NULL,
3891 pMac->roam.configParam.phyMode,
3892 pMac->roam.configParam.
3893 ProprietaryRatesEnabled);
3894
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303895 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003896}
3897
3898/* ---------------------------------------------------------------------------
3899 \fn sme_roam_reassoc
3900 \brief a wrapper function to request CSR to inititiate a re-association
3901 \param pProfile - can be NULL to join the currently connected AP. In that
3902 case modProfileFields should carry the modified field(s) which could trigger
3903 reassoc
3904 \param modProfileFields - fields which are part of tCsrRoamConnectedProfile
3905 that might need modification dynamically once STA is up & running and this
3906 could trigger a reassoc
3907 \param pRoamId - to get back the request ID
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303908 \return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003909 -------------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303910QDF_STATUS sme_roam_reassoc(tHalHandle hHal, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003911 tCsrRoamProfile *pProfile,
3912 tCsrRoamModifyProfileFields modProfileFields,
3913 uint32_t *pRoamId, bool fForce)
3914{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303915 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003916 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
3917
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303918 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003919 TRACE_CODE_SME_RX_HDD_ROAM_REASSOC, sessionId, 0));
3920 sms_log(pMac, LOG2, FL("enter"));
3921 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303922 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003923 if (CSR_IS_SESSION_VALID(pMac, sessionId)) {
3924 if ((NULL == pProfile) && (fForce == 1)) {
3925 status =
3926 csr_reassoc(pMac, sessionId,
3927 &modProfileFields, pRoamId,
3928 fForce);
3929 } else {
3930 status =
3931 csr_roam_reassoc(pMac, sessionId, pProfile,
3932 modProfileFields, pRoamId);
3933 }
3934 } else {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303935 status = QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003936 }
3937 sme_release_global_lock(&pMac->sme);
3938 }
3939
3940 return status;
3941}
3942
3943/* ---------------------------------------------------------------------------
3944 \fn sme_roam_connect_to_last_profile
3945 \brief a wrapper function to request CSR to disconnect and reconnect with
3946 the same profile
3947 This is an asynchronous call.
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303948 \return QDF_STATUS. It returns fail if currently connected
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003949 ---------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303950QDF_STATUS sme_roam_connect_to_last_profile(tHalHandle hHal, uint8_t sessionId)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003951{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303952 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003953 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
3954
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303955 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003956 TRACE_CODE_SME_RX_HDD_ROAM_GET_CONNECTPROFILE,
3957 sessionId, 0));
3958 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303959 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003960 if (CSR_IS_SESSION_VALID(pMac, sessionId)) {
3961 status = csr_roam_connect_to_last_profile(pMac, sessionId);
3962 } else {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303963 status = QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003964 }
3965 sme_release_global_lock(&pMac->sme);
3966 }
3967
3968 return status;
3969}
3970
3971/* ---------------------------------------------------------------------------
3972 \fn sme_roam_disconnect
3973 \brief a wrapper function to request CSR to disconnect from a network
3974 This is an asynchronous call.
3975 \param reason -- To indicate the reason for disconnecting. Currently, only
3976 eCSR_DISCONNECT_REASON_MIC_ERROR is meanful.
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303977 \return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003978 ---------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303979QDF_STATUS sme_roam_disconnect(tHalHandle hHal, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003980 eCsrRoamDisconnectReason reason)
3981{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303982 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003983 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
3984
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303985 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003986 TRACE_CODE_SME_RX_HDD_ROAM_DISCONNECT, sessionId,
3987 reason));
3988 sms_log(pMac, LOG2, FL("enter"));
3989 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303990 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003991 if (CSR_IS_SESSION_VALID(pMac, sessionId)) {
3992 status = csr_roam_disconnect(pMac, sessionId, reason);
3993 } else {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303994 status = QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003995 }
3996 sme_release_global_lock(&pMac->sme);
3997 }
3998
3999 return status;
4000}
4001
Abhishek Singhca408032016-09-13 15:26:12 +05304002/* sme_dhcp_done_ind() - send dhcp done ind
4003 * @hal: hal context
4004 * @session_id: session id
4005 *
4006 * Return: void.
4007 */
4008void sme_dhcp_done_ind(tHalHandle hal, uint8_t session_id)
4009{
4010 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
4011 tCsrRoamSession *session;
4012
4013 if (!mac_ctx)
4014 return;
4015
4016 session = CSR_GET_SESSION(mac_ctx, session_id);
4017 if (!session) {
4018 sms_log(mac_ctx, LOGE,
4019 FL("session %d not found"), session_id);
4020 return;
4021 }
4022 session->dhcp_done = true;
4023}
4024
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004025/* ---------------------------------------------------------------------------
4026 \fn sme_roam_stop_bss
4027 \brief To stop BSS for Soft AP. This is an asynchronous API.
4028 \param hHal - Global structure
4029 \param sessionId - sessionId of SoftAP
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304030 \return QDF_STATUS SUCCESS Roam callback will be called to indicate actual results
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004031 -------------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304032QDF_STATUS sme_roam_stop_bss(tHalHandle hHal, uint8_t sessionId)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004033{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304034 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004035 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
4036
4037 sms_log(pMac, LOG2, FL("enter"));
4038 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304039 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004040 if (CSR_IS_SESSION_VALID(pMac, sessionId)) {
4041 status = csr_roam_issue_stop_bss_cmd(pMac, sessionId, true);
4042 } else {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304043 status = QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004044 }
4045 sme_release_global_lock(&pMac->sme);
4046 }
4047
4048 return status;
4049}
4050
Deepthi Gowrib3bfefd2016-09-13 15:14:34 +05304051/**
4052 * sme_roam_disconnect_sta() - disassociate a station
4053 * @hHal: Global structure
4054 * @sessionId: SessionId of SoftAP
4055 * @p_del_sta_params: Pointer to parameters of the station to disassoc
4056 *
4057 * To disassociate a station. This is an asynchronous API.
4058 *
4059 * Return: QDF_STATUS_SUCCESS on success.Roam callback will
4060 * be called to indicate actual result.
4061 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304062QDF_STATUS sme_roam_disconnect_sta(tHalHandle hHal, uint8_t sessionId,
Deepthi Gowrib3bfefd2016-09-13 15:14:34 +05304063 struct tagCsrDelStaParams *p_del_sta_params)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004064{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304065 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004066 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
4067
4068 if (NULL == pMac) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05304069 QDF_ASSERT(0);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004070 return status;
4071 }
4072
4073 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304074 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004075 if (CSR_IS_SESSION_VALID(pMac, sessionId)) {
4076 status = csr_roam_issue_disassociate_sta_cmd(pMac,
Deepthi Gowrib3bfefd2016-09-13 15:14:34 +05304077 sessionId, p_del_sta_params);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004078 } else {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304079 status = QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004080 }
4081 sme_release_global_lock(&pMac->sme);
4082 }
4083
4084 return status;
4085}
4086
4087/**
4088 * sme_roam_deauth_sta() - deauthenticate a station
4089 * @hHal: Global structure
4090 * @sessionId: SessionId of SoftAP
4091 * @pDelStaParams: Pointer to parameters of the station to deauthenticate
4092 *
4093 * To disassociate a station. This is an asynchronous API.
4094 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304095 * Return: QDF_STATUS_SUCCESS on success or another QDF_STATUS error
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004096 * code on error. Roam callback will be called to indicate actual
4097 * result
4098 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304099QDF_STATUS sme_roam_deauth_sta(tHalHandle hHal, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004100 struct tagCsrDelStaParams *pDelStaParams)
4101{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304102 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004103 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
4104
4105 if (NULL == pMac) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05304106 QDF_ASSERT(0);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004107 return status;
4108 }
4109
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05304110 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Sreelakshmi Konamki6744cff2015-09-07 12:10:39 +05304111 TRACE_CODE_SME_RX_HDD_MSG_DEAUTH_STA,
4112 sessionId, pDelStaParams->reason_code));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004113 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304114 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004115 if (CSR_IS_SESSION_VALID(pMac, sessionId)) {
4116 status =
4117 csr_roam_issue_deauth_sta_cmd(pMac, sessionId,
4118 pDelStaParams);
4119 } else {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304120 status = QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004121 }
4122 sme_release_global_lock(&pMac->sme);
4123 }
4124
4125 return status;
4126}
4127
4128/* ---------------------------------------------------------------------------
4129 \fn sme_roam_tkip_counter_measures
4130 \brief To start or stop TKIP counter measures. This is an asynchronous API.
4131 \param sessionId - sessionId of SoftAP
4132 \param pPeerMacAddr - Caller allocated memory filled with peer MAC address (6 bytes)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304133 \return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004134 -------------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304135QDF_STATUS sme_roam_tkip_counter_measures(tHalHandle hHal, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004136 bool bEnable)
4137{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304138 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004139 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
4140
4141 if (NULL == pMac) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05304142 QDF_ASSERT(0);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004143 return status;
4144 }
4145
4146 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304147 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004148 if (CSR_IS_SESSION_VALID(pMac, sessionId)) {
4149 status =
4150 csr_roam_issue_tkip_counter_measures(pMac, sessionId,
4151 bEnable);
4152 } else {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304153 status = QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004154 }
4155 sme_release_global_lock(&pMac->sme);
4156 }
4157
4158 return status;
4159}
4160
4161/* ---------------------------------------------------------------------------
4162 \fn sme_roam_get_associated_stas
4163 \brief To probe the list of associated stations from various modules
4164 of CORE stack.
4165 \This is an asynchronous API.
4166 \param sessionId - sessionId of SoftAP
4167 \param modId - Module from whom list of associtated stations is
4168 to be probed. If an invalid module is passed then
Anurag Chouhan6d760662016-02-20 16:05:43 +05304169 by default QDF_MODULE_ID_PE will be probed.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004170 \param pUsrContext - Opaque HDD context
4171 \param pfnSapEventCallback - Sap event callback in HDD
4172 \param pAssocBuf - Caller allocated memory to be filled with associatd
4173 stations info
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304174 \return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004175 -------------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304176QDF_STATUS sme_roam_get_associated_stas(tHalHandle hHal, uint8_t sessionId,
Anurag Chouhan6d760662016-02-20 16:05:43 +05304177 QDF_MODULE_ID modId, void *pUsrContext,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004178 void *pfnSapEventCallback,
4179 uint8_t *pAssocStasBuf)
4180{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304181 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004182 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
4183
4184 if (NULL == pMac) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05304185 QDF_ASSERT(0);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004186 return status;
4187 }
4188
4189 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304190 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004191 if (CSR_IS_SESSION_VALID(pMac, sessionId)) {
4192 status =
4193 csr_roam_get_associated_stas(pMac, sessionId, modId,
4194 pUsrContext,
4195 pfnSapEventCallback,
4196 pAssocStasBuf);
4197 } else {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304198 status = QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004199 }
4200 sme_release_global_lock(&pMac->sme);
4201 }
4202
4203 return status;
4204}
4205
4206/* ---------------------------------------------------------------------------
4207 \fn sme_roam_get_wps_session_overlap
4208 \brief To get the WPS PBC session overlap information.
4209 \This is an asynchronous API.
4210 \param sessionId - sessionId of SoftAP
4211 \param pUsrContext - Opaque HDD context
4212 \param pfnSapEventCallback - Sap event callback in HDD
4213 \pRemoveMac - pointer to Mac address which needs to be removed from session
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304214 \return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004215 -------------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304216QDF_STATUS sme_roam_get_wps_session_overlap(tHalHandle hHal, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004217 void *pUsrContext, void
4218 *pfnSapEventCallback,
Anurag Chouhan6d760662016-02-20 16:05:43 +05304219 struct qdf_mac_addr pRemoveMac)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004220{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304221 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004222 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
4223
4224 if (NULL == pMac) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05304225 QDF_ASSERT(0);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004226 return status;
4227 }
4228
4229 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304230 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004231 if (CSR_IS_SESSION_VALID(pMac, sessionId)) {
4232 status =
4233 csr_roam_get_wps_session_overlap(pMac, sessionId,
4234 pUsrContext,
4235 pfnSapEventCallback,
4236 pRemoveMac);
4237 } else {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304238 status = QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004239 }
4240 sme_release_global_lock(&pMac->sme);
4241 }
4242
4243 return status;
4244}
4245
4246/* ---------------------------------------------------------------------------
4247 \fn sme_roam_get_connect_state
4248 \brief a wrapper function to request CSR to return the current connect state
4249 of Roaming
4250 This is a synchronous call.
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304251 \return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004252 ---------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304253QDF_STATUS sme_roam_get_connect_state(tHalHandle hHal, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004254 eCsrConnectState *pState)
4255{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304256 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004257 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
4258
4259 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304260 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004261 if (CSR_IS_SESSION_VALID(pMac, sessionId)) {
4262 status =
4263 csr_roam_get_connect_state(pMac, sessionId, pState);
4264 } else {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304265 status = QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004266 }
4267 sme_release_global_lock(&pMac->sme);
4268 }
4269
4270 return status;
4271}
4272
4273/* ---------------------------------------------------------------------------
4274 \fn sme_roam_get_connect_profile
4275 \brief a wrapper function to request CSR to return the current connect
4276 profile. Caller must call csr_roam_free_connect_profile after it is done
4277 and before reuse for another csr_roam_get_connect_profile call.
4278 This is a synchronous call.
4279 \param pProfile - pointer to a caller allocated structure
4280 tCsrRoamConnectedProfile
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304281 \return QDF_STATUS. Failure if not connected
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004282 ---------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304283QDF_STATUS sme_roam_get_connect_profile(tHalHandle hHal, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004284 tCsrRoamConnectedProfile *pProfile)
4285{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304286 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004287 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
4288
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05304289 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004290 TRACE_CODE_SME_RX_HDD_ROAM_GET_CONNECTPROFILE,
4291 sessionId, 0));
4292 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304293 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004294 if (CSR_IS_SESSION_VALID(pMac, sessionId)) {
4295 status =
4296 csr_roam_get_connect_profile(pMac, sessionId, pProfile);
4297 } else {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304298 status = QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004299 }
4300 sme_release_global_lock(&pMac->sme);
4301 }
4302
4303 return status;
4304}
4305
Naveen Rawatdf0a7e72016-01-06 18:35:53 -08004306/**
4307 * sme_roam_free_connect_profile - a wrapper function to request CSR to free and
4308 * reinitialize the profile returned previously by csr_roam_get_connect_profile.
4309 *
4310 * @profile - pointer to a caller allocated structure tCsrRoamConnectedProfile
4311 *
4312 * Return: none
4313 */
4314void sme_roam_free_connect_profile(tCsrRoamConnectedProfile *profile)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004315{
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05304316 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004317 TRACE_CODE_SME_RX_HDD_ROAM_FREE_CONNECTPROFILE,
4318 NO_SESSION, 0));
Naveen Rawatdf0a7e72016-01-06 18:35:53 -08004319 csr_roam_free_connect_profile(profile);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004320}
4321
4322/* ---------------------------------------------------------------------------
4323 \fn sme_roam_set_pmkid_cache
4324 \brief a wrapper function to request CSR to return the PMKID candidate list
4325 This is a synchronous call.
4326 \param pPMKIDCache - caller allocated buffer point to an array of
4327 tPmkidCacheInfo
4328 \param numItems - a variable that has the number of tPmkidCacheInfo
4329 allocated when retruning, this is either the number needed
4330 or number of items put into pPMKIDCache
4331 \param update_entire_cache - this bool value specifies if the entire pmkid
4332 cache should be overwritten or should it be
4333 updated entry by entry.
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304334 \return QDF_STATUS - when fail, it usually means the buffer allocated is not
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004335 big enough and pNumItems has the number of
4336 tPmkidCacheInfo.
4337 \Note: pNumItems is a number of tPmkidCacheInfo,
4338 not sizeof(tPmkidCacheInfo) * something
4339 ---------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304340QDF_STATUS sme_roam_set_pmkid_cache(tHalHandle hHal, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004341 tPmkidCacheInfo *pPMKIDCache,
4342 uint32_t numItems, bool update_entire_cache)
4343{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304344 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004345 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
4346
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05304347 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004348 TRACE_CODE_SME_RX_HDD_ROAM_SET_PMKIDCACHE, sessionId,
4349 numItems));
4350 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304351 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004352 if (CSR_IS_SESSION_VALID(pMac, sessionId)) {
4353 status =
4354 csr_roam_set_pmkid_cache(pMac, sessionId, pPMKIDCache,
4355 numItems, update_entire_cache);
4356 } else {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304357 status = QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004358 }
4359 sme_release_global_lock(&pMac->sme);
4360 }
4361
4362 return status;
4363}
4364
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304365QDF_STATUS sme_roam_del_pmkid_from_cache(tHalHandle hHal, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004366 const uint8_t *pBSSId, bool flush_cache)
4367{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304368 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004369 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Sreelakshmi Konamki6744cff2015-09-07 12:10:39 +05304370
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05304371 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Sreelakshmi Konamki6744cff2015-09-07 12:10:39 +05304372 TRACE_CODE_SME_RX_HDD_ROAM_DEL_PMKIDCACHE,
4373 sessionId, flush_cache));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004374 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304375 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004376 if (CSR_IS_SESSION_VALID(pMac, sessionId)) {
4377 status = csr_roam_del_pmkid_from_cache(pMac, sessionId,
4378 pBSSId, flush_cache);
4379 } else {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304380 status = QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004381 }
4382 sme_release_global_lock(&pMac->sme);
4383 }
4384 return status;
4385}
4386
4387#ifdef WLAN_FEATURE_ROAM_OFFLOAD
4388/* ---------------------------------------------------------------------------
4389 * \fn sme_roam_set_psk_pmk
4390 * \brief a wrapper function to request CSR to save PSK/PMK
4391 * This is a synchronous call.
4392 * \param hHal - Global structure
4393 * \param sessionId - SME sessionId
4394 * \param pPSK_PMK - pointer to an array of Psk[]/Pmk
4395 * \param pmk_len - Length could be only 16 bytes in case if LEAP
4396 * connections. Need to pass this information to
4397 * firmware.
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304398 * \return QDF_STATUS -status whether PSK/PMK is set or not
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004399 *---------------------------------------------------------------------------
4400 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304401QDF_STATUS sme_roam_set_psk_pmk(tHalHandle hHal, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004402 uint8_t *pPSK_PMK, size_t pmk_len)
4403{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304404 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004405 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
4406 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304407 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004408 if (CSR_IS_SESSION_VALID(pMac, sessionId)) {
4409 status =
4410 csr_roam_set_psk_pmk(pMac, sessionId, pPSK_PMK,
4411 pmk_len);
4412 } else {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304413 status = QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004414 }
4415 sme_release_global_lock(&pMac->sme);
4416 }
4417 return status;
4418}
4419#endif
4420/* ---------------------------------------------------------------------------
4421 \fn sme_roam_get_security_req_ie
4422 \brief a wrapper function to request CSR to return the WPA or RSN or WAPI IE CSR
4423 passes to PE to JOIN request or START_BSS request
4424 This is a synchronous call.
4425 \param pLen - caller allocated memory that has the length of pBuf as input.
4426 Upon returned, *pLen has the needed or IE length in pBuf.
4427 \param pBuf - Caller allocated memory that contain the IE field, if any,
4428 upon return
4429 \param secType - Specifies whether looking for WPA/WPA2/WAPI IE
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304430 \return QDF_STATUS - when fail, it usually means the buffer allocated is not
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004431 big enough
4432 ---------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304433QDF_STATUS sme_roam_get_security_req_ie(tHalHandle hHal, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004434 uint32_t *pLen, uint8_t *pBuf,
4435 eCsrSecurityType secType)
4436{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304437 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004438 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
4439
4440 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304441 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004442 if (CSR_IS_SESSION_VALID(pMac, sessionId)) {
4443 status =
4444 csr_roam_get_wpa_rsn_req_ie(hHal, sessionId, pLen, pBuf);
4445 } else {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304446 status = QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004447 }
4448 sme_release_global_lock(&pMac->sme);
4449 }
4450
4451 return status;
4452}
4453
4454/* ---------------------------------------------------------------------------
4455 \fn sme_roam_get_security_rsp_ie
4456 \brief a wrapper function to request CSR to return the WPA or RSN or
4457 WAPI IE from the beacon or probe rsp if connected
4458 This is a synchronous call.
4459 \param pLen - caller allocated memory that has the length of pBuf as input.
4460 Upon returned, *pLen has the needed or IE length in pBuf.
4461 \param pBuf - Caller allocated memory that contain the IE field, if any,
4462 upon return
4463 \param secType - Specifies whether looking for WPA/WPA2/WAPI IE
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304464 \return QDF_STATUS - when fail, it usually means the buffer allocated is not
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004465 big enough
4466 ---------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304467QDF_STATUS sme_roam_get_security_rsp_ie(tHalHandle hHal, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004468 uint32_t *pLen, uint8_t *pBuf,
4469 eCsrSecurityType secType)
4470{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304471 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004472 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
4473
4474 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304475 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004476 if (CSR_IS_SESSION_VALID(pMac, sessionId)) {
4477 status =
4478 csr_roam_get_wpa_rsn_rsp_ie(pMac, sessionId, pLen, pBuf);
4479 } else {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304480 status = QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004481 }
4482 sme_release_global_lock(&pMac->sme);
4483 }
4484
4485 return status;
4486
4487}
4488
4489/* ---------------------------------------------------------------------------
4490 \fn sme_roam_get_num_pmkid_cache
4491 \brief a wrapper function to request CSR to return number of PMKID cache
4492 entries
4493 This is a synchronous call.
4494 \return uint32_t - the number of PMKID cache entries
4495 ---------------------------------------------------------------------------*/
4496uint32_t sme_roam_get_num_pmkid_cache(tHalHandle hHal, uint8_t sessionId)
4497{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304498 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004499 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
4500 uint32_t numPmkidCache = 0;
4501
4502 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304503 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004504 if (CSR_IS_SESSION_VALID(pMac, sessionId)) {
4505 numPmkidCache =
4506 csr_roam_get_num_pmkid_cache(pMac, sessionId);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304507 status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004508 } else {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304509 status = QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004510 }
4511 sme_release_global_lock(&pMac->sme);
4512 }
4513
4514 return numPmkidCache;
4515}
4516
4517/* ---------------------------------------------------------------------------
4518 \fn sme_roam_get_pmkid_cache
4519 \brief a wrapper function to request CSR to return PMKID cache from CSR
4520 This is a synchronous call.
4521 \param pNum - caller allocated memory that has the space of the number of
4522 pBuf tPmkidCacheInfo as input. Upon returned, *pNum has the
4523 needed or actually number in tPmkidCacheInfo.
4524 \param pPmkidCache - Caller allocated memory that contains PMKID cache, if
4525 any, upon return
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304526 \return QDF_STATUS - when fail, it usually means the buffer allocated is not
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004527 big enough
4528 ---------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304529QDF_STATUS sme_roam_get_pmkid_cache(tHalHandle hHal, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004530 uint32_t *pNum, tPmkidCacheInfo *pPmkidCache)
4531{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304532 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004533 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
4534
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05304535 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004536 TRACE_CODE_SME_RX_HDD_ROAM_GET_PMKIDCACHE, sessionId,
4537 0));
4538 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304539 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004540 if (CSR_IS_SESSION_VALID(pMac, sessionId)) {
4541 status =
4542 csr_roam_get_pmkid_cache(pMac, sessionId, pNum,
4543 pPmkidCache);
4544 } else {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304545 status = QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004546 }
4547 sme_release_global_lock(&pMac->sme);
4548 }
4549
4550 return status;
4551}
4552
4553/* ---------------------------------------------------------------------------
4554 \fn sme_get_config_param
4555 \brief a wrapper function that HDD calls to get the global settings
4556 currently maintained by CSR.
4557 This is a synchronous call.
4558 \param pParam - caller allocated memory
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304559 \return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004560 ---------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304561QDF_STATUS sme_get_config_param(tHalHandle hHal, tSmeConfigParams *pParam)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004562{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304563 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004564 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
4565
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05304566 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004567 TRACE_CODE_SME_RX_HDD_GET_CONFIGPARAM, NO_SESSION, 0));
4568 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304569 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004570 status = csr_get_config_param(pMac, &pParam->csrConfig);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304571 if (status != QDF_STATUS_SUCCESS) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004572 sms_log(pMac, LOGE, "%s csr_get_config_param failed",
4573 __func__);
4574 sme_release_global_lock(&pMac->sme);
4575 return status;
4576 }
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304577 qdf_mem_copy(&pParam->rrmConfig,
Krunal Soni1878d3a2016-01-14 13:00:44 -08004578 &pMac->rrm.rrmSmeContext.rrmConfig,
4579 sizeof(pMac->rrm.rrmSmeContext.rrmConfig));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004580 sme_release_global_lock(&pMac->sme);
4581 }
4582
4583 return status;
4584}
4585
4586/**
4587 * sme_cfg_set_int() - Sets the cfg parameter value.
4588 * @hal: Handle to hal.
4589 * @cfg_id: Configuration parameter ID.
4590 * @value: value to be saved in the cfg parameter.
4591 *
4592 * This function sets the string value in cfg parameter.
4593 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304594 * Return: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004595 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304596QDF_STATUS sme_cfg_set_int(tHalHandle hal, uint16_t cfg_id, uint32_t value)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004597{
4598 tpAniSirGlobal pmac = PMAC_STRUCT(hal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304599 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004600
4601 if (eSIR_SUCCESS != cfg_set_int(pmac, cfg_id, value))
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304602 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004603
4604 return status;
4605}
4606
4607/**
4608 * sme_cfg_set_str() - Sets the cfg parameter string.
4609 * @hal: Handle to hal.
4610 * @cfg_id: Configuration parameter ID.
4611 * @str: Pointer to the string buffer.
4612 * @length: Length of the string.
4613 *
4614 * This function sets the string value in cfg parameter.
4615 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304616 * Return: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004617 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304618QDF_STATUS sme_cfg_set_str(tHalHandle hal, uint16_t cfg_id, uint8_t *str,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004619 uint32_t length)
4620{
4621 tpAniSirGlobal pmac = PMAC_STRUCT(hal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304622 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004623
4624 if (eSIR_SUCCESS != cfg_set_str(pmac, cfg_id, str, length))
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304625 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004626
4627 return status;
4628}
4629
4630/**
4631 * sme_cfg_get_int() - Gets the cfg parameter value.
4632 * @hal: Handle to hal.
4633 * @cfg_id: Configuration parameter ID.
4634 * @cfg_value: Pointer to variable in which cfg value
4635 * will be saved.
4636 *
4637 * This function gets the value of the cfg parameter.
4638 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304639 * Return: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004640 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304641QDF_STATUS sme_cfg_get_int(tHalHandle hal, uint16_t cfg_id, uint32_t *cfg_value)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004642{
4643 tpAniSirGlobal pmac = PMAC_STRUCT(hal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304644 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004645
4646 if (eSIR_SUCCESS != wlan_cfg_get_int(pmac, cfg_id, cfg_value))
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304647 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004648
4649 return status;
4650}
4651
4652/**
4653 * sme_cfg_get_str() - Gets the cfg parameter string.
4654 * @hal: Handle to hal.
4655 * @cfg_id: Configuration parameter ID.
4656 * @str: Pointer to the string buffer.
4657 * @length: Pointer to length of the string.
4658 *
4659 * This function gets the string value of the cfg parameter.
4660 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304661 * Return: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004662 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304663QDF_STATUS sme_cfg_get_str(tHalHandle hal, uint16_t cfg_id, uint8_t *str,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004664 uint32_t *length)
4665{
4666 tpAniSirGlobal pmac = PMAC_STRUCT(hal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304667 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004668
4669 if (eSIR_SUCCESS != wlan_cfg_get_str(pmac, cfg_id, str, length))
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304670 status = QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004671
4672 return status;
4673}
4674
4675/* ---------------------------------------------------------------------------
4676 \fn sme_get_modify_profile_fields
4677 \brief HDD or SME - QOS calls this function to get the current values of
4678 connected profile fields, changing which can cause reassoc.
4679 This function must be called after CFG is downloaded and STA is in connected
4680 state. Also, make sure to call this function to get the current profile
4681 fields before calling the reassoc. So that pModifyProfileFields will have
4682 all the latest values plus the one(s) has been updated as part of reassoc
4683 request.
4684 \param pModifyProfileFields - pointer to the connected profile fields
4685 changing which can cause reassoc
4686
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304687 \return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004688 -------------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304689QDF_STATUS sme_get_modify_profile_fields(tHalHandle hHal, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004690 tCsrRoamModifyProfileFields *
4691 pModifyProfileFields)
4692{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304693 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004694 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
4695
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05304696 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004697 TRACE_CODE_SME_RX_HDD_GET_MODPROFFIELDS, sessionId,
4698 0));
4699 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304700 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004701 if (CSR_IS_SESSION_VALID(pMac, sessionId)) {
4702 status =
4703 csr_get_modify_profile_fields(pMac, sessionId,
4704 pModifyProfileFields);
4705 } else {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304706 status = QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004707 }
4708 sme_release_global_lock(&pMac->sme);
4709 }
4710
4711 return status;
4712}
4713
4714/* ---------------------------------------------------------------------------
4715 \fn sme_set_dhcp_till_power_active_flag
4716 \brief Sets/Clears DHCP related flag to disable/enable auto PS
4717 \param hal - The handle returned by mac_open.
4718 ---------------------------------------------------------------------------*/
4719void sme_set_dhcp_till_power_active_flag(tHalHandle hal, uint8_t flag)
4720{
4721 tpAniSirGlobal mac = PMAC_STRUCT(hal);
4722 struct ps_global_info *ps_global_info = &mac->sme.ps_global_info;
4723
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05304724 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004725 TRACE_CODE_SME_RX_HDD_SET_DHCP_FLAG, NO_SESSION,
4726 flag));
4727 /* Set/Clear the DHCP flag which will disable/enable auto PS */
4728 ps_global_info->remain_in_power_active_till_dhcp = flag;
4729}
4730
4731/* ---------------------------------------------------------------------------
4732 \fn sme_register11d_scan_done_callback
4733 \brief Register a routine of type csr_scan_completeCallback which is
4734 called whenever an 11d scan is done
4735 \param hHal - The handle returned by mac_open.
4736 \param callback - 11d scan complete routine to be registered
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304737 \return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004738 ---------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304739QDF_STATUS sme_register11d_scan_done_callback(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004740 csr_scan_completeCallback callback)
4741{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304742 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004743 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
4744
4745 pMac->scan.callback11dScanDone = callback;
4746
4747 return status;
4748}
4749
Arun Khandavalli4b55da72016-07-19 19:55:01 +05304750/**
4751 * sme_deregister11d_scan_done_callback() - De-register scandone callback
4752 * @h_hal: Handler return by mac_open
4753 *
4754 * This function De-registers the scandone callback to SME
4755 *
4756 * Return: None
4757 */
4758void sme_deregister11d_scan_done_callback(tHalHandle h_hal)
4759{
4760 tpAniSirGlobal pmac;
4761
4762 if (!h_hal) {
4763 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
4764 FL("hHal is not valid"));
4765 return;
4766 }
4767
4768 pmac = PMAC_STRUCT(h_hal);
4769 pmac->scan.callback11dScanDone = NULL;
4770}
4771
4772
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004773#ifdef FEATURE_OEM_DATA_SUPPORT
4774/**
4775 * sme_register_oem_data_rsp_callback() - Register a routine of
4776 * type send_oem_data_rsp_msg
4777 * @h_hal: Handle returned by mac_open.
4778 * @callback: Callback to send response
4779 * to oem application.
4780 *
4781 * sme_oem_data_rsp_callback is used to register sme_send_oem_data_rsp_msg
4782 * callback function.
4783 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304784 * Return: QDF_STATUS.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004785 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304786QDF_STATUS sme_register_oem_data_rsp_callback(tHalHandle h_hal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004787 sme_send_oem_data_rsp_msg callback)
4788{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304789 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004790 tpAniSirGlobal pmac = PMAC_STRUCT(h_hal);
4791
Krishna Kumaar Natarajanbbbf2ef2016-08-03 14:06:26 -07004792 pmac->sme.oem_data_rsp_callback = callback;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004793
4794 return status;
4795
4796}
Arun Khandavalli4b55da72016-07-19 19:55:01 +05304797
4798/**
4799 * sme_deregister_oem_data_rsp_callback() - De-register OEM datarsp callback
4800 * @h_hal: Handler return by mac_open
4801 * This function De-registers the OEM data response callback to SME
4802 *
4803 * Return: None
4804 */
4805void sme_deregister_oem_data_rsp_callback(tHalHandle h_hal)
4806{
4807 tpAniSirGlobal pmac;
4808
4809 if (!h_hal) {
4810 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
4811 FL("hHal is not valid"));
4812 return;
4813 }
4814 pmac = PMAC_STRUCT(h_hal);
4815
Krishna Kumaar Natarajanbbbf2ef2016-08-03 14:06:26 -07004816 pmac->sme.oem_data_rsp_callback = NULL;
Arun Khandavalli4b55da72016-07-19 19:55:01 +05304817}
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004818#endif
4819
4820/**
Krishna Kumaar Natarajan53ca2902015-12-04 14:01:46 -08004821 * sme_oem_update_capability() - update UMAC's oem related capability.
4822 * @hal: Handle returned by mac_open
4823 * @oem_cap: pointer to oem_capability
4824 *
4825 * This function updates OEM capability to UMAC. Currently RTT
4826 * related capabilities are updated. More capabilities can be
4827 * added in future.
4828 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304829 * Return: QDF_STATUS
Krishna Kumaar Natarajan53ca2902015-12-04 14:01:46 -08004830 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304831QDF_STATUS sme_oem_update_capability(tHalHandle hal,
Krishna Kumaar Natarajan53ca2902015-12-04 14:01:46 -08004832 struct sme_oem_capability *cap)
4833{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304834 QDF_STATUS status = QDF_STATUS_SUCCESS;
Krishna Kumaar Natarajan53ca2902015-12-04 14:01:46 -08004835 tpAniSirGlobal pmac = PMAC_STRUCT(hal);
4836 uint8_t *bytes;
4837
4838 bytes = pmac->rrm.rrmSmeContext.rrmConfig.rm_capability;
4839
4840 if (cap->ftm_rr)
4841 bytes[4] |= RM_CAP_FTM_RANGE_REPORT;
4842 if (cap->lci_capability)
4843 bytes[4] |= RM_CAP_CIVIC_LOC_MEASUREMENT;
4844
4845 return status;
4846}
4847
4848/**
4849 * sme_oem_get_capability() - get oem capability
4850 * @hal: Handle returned by mac_open
4851 * @oem_cap: pointer to oem_capability
4852 *
4853 * This function is used to get the OEM capability from UMAC.
4854 * Currently RTT related capabilities are received. More
4855 * capabilities can be added in future.
4856 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304857 * Return: QDF_STATUS
Krishna Kumaar Natarajan53ca2902015-12-04 14:01:46 -08004858 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304859QDF_STATUS sme_oem_get_capability(tHalHandle hal,
Krishna Kumaar Natarajan53ca2902015-12-04 14:01:46 -08004860 struct sme_oem_capability *cap)
4861{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304862 QDF_STATUS status = QDF_STATUS_SUCCESS;
Krishna Kumaar Natarajan53ca2902015-12-04 14:01:46 -08004863 tpAniSirGlobal pmac = PMAC_STRUCT(hal);
4864 uint8_t *bytes;
4865
4866 bytes = pmac->rrm.rrmSmeContext.rrmConfig.rm_capability;
4867
4868 cap->ftm_rr = bytes[4] & RM_CAP_FTM_RANGE_REPORT;
4869 cap->lci_capability = bytes[4] & RM_CAP_CIVIC_LOC_MEASUREMENT;
4870
4871 return status;
4872}
4873
4874/**
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004875 * sme_register_ftm_msg_processor() - registers hdd ftm message processor
4876 * function to MAC/SYS
4877 *
4878 * @hal: hal handle
4879 * @callback: hdd function that has to be registered
4880 *
4881 * Return: void
4882 */
4883void sme_register_ftm_msg_processor(tHalHandle hal,
4884 hdd_ftm_msg_processor callback)
4885{
4886 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
4887
4888 if (mac_ctx == NULL) {
Naveen Rawatcf684762016-06-27 15:30:24 -07004889 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
4890 FL("mac ctx is NULL"));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004891 return;
4892 }
Naveen Rawatcf684762016-06-27 15:30:24 -07004893
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004894 mac_ctx->ftm_msg_processor_callback = callback;
4895 return;
4896}
4897
4898/**
4899 * sme_wow_add_pattern() - add a wow pattern in fw
4900 * @hHal: handle returned by mac_open
4901 * @pattern: pointer to input pattern
4902 *
4903 * Add a pattern for Pattern Byte Matching in WoW mode. Firmware will
4904 * do a pattern match on these patterns when WoW is enabled during system
4905 * suspend.
4906 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304907 * Return: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004908 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304909QDF_STATUS sme_wow_add_pattern(tHalHandle hal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004910 struct wow_add_pattern *pattern,
4911 uint8_t session_id)
4912{
4913 tpAniSirGlobal pMac = PMAC_STRUCT(hal);
4914 struct wow_add_pattern *ptrn;
4915 tSirRetStatus ret_code = eSIR_SUCCESS;
4916 tSirMsgQ msg_q;
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05304917 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004918 TRACE_CODE_SME_RX_HDD_WOWL_ADDBCAST_PATTERN, session_id,
4919 0));
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304920 ptrn = qdf_mem_malloc(sizeof(*ptrn));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004921 if (NULL == ptrn) {
4922 sms_log(pMac, LOGP,
4923 FL("Fail to allocate memory for WoWLAN Add Bcast Pattern "));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304924 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004925 }
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304926 (void)qdf_mem_copy(ptrn, pattern, sizeof(*ptrn));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004927
4928 msg_q.type = WMA_WOW_ADD_PTRN;
4929 msg_q.reserved = 0;
4930 msg_q.bodyptr = ptrn;
4931 msg_q.bodyval = 0;
4932
4933 sms_log(pMac, LOG1, FL("Sending WMA_WOWL_ADD_BCAST_PTRN to HAL"));
4934 ret_code = wma_post_ctrl_msg(pMac, &msg_q);
4935 if (eSIR_SUCCESS != ret_code) {
4936 sms_log(pMac, LOGE,
4937 FL("Posting WMA_WOWL_ADD_BCAST_PTRN failed, reason=%X"),
4938 ret_code);
4939 }
4940 return ret_code;
4941}
4942
4943/**
4944 * sme_wow_delete_pattern() - delete user configured wow pattern in target
4945 * @hHal: handle returned by mac_open.
4946 * @pattern: pointer to delete pattern parameter
4947 * @sessionId: session id
4948 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304949 * Return: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004950 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304951QDF_STATUS sme_wow_delete_pattern(tHalHandle hal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004952 struct wow_delete_pattern *pattern, uint8_t sessionId)
4953{
4954 tpAniSirGlobal pMac = PMAC_STRUCT(hal);
4955 struct wow_delete_pattern *delete_ptrn;
4956 tSirRetStatus ret_code = eSIR_SUCCESS;
4957 tSirMsgQ msg_q;
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05304958 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004959 TRACE_CODE_SME_RX_HDD_WOWL_DELBCAST_PATTERN, sessionId,
4960 0));
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304961 delete_ptrn = qdf_mem_malloc(sizeof(*delete_ptrn));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004962 if (NULL == delete_ptrn) {
4963 sms_log(pMac, LOGP,
4964 FL("Fail to allocate memory for WoWLAN Delete Bcast Pattern "));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304965 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004966 }
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304967 (void)qdf_mem_copy(delete_ptrn, pattern, sizeof(*delete_ptrn));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004968 msg_q.type = WMA_WOW_DEL_PTRN;
4969 msg_q.reserved = 0;
4970 msg_q.bodyptr = delete_ptrn;
4971 msg_q.bodyval = 0;
4972
4973 sms_log(pMac, LOG1, FL("Sending WMA_WOWL_DEL_BCAST_PTRN"));
4974
4975 ret_code = wma_post_ctrl_msg(pMac, &msg_q);
4976 if (eSIR_SUCCESS != ret_code) {
4977 sms_log(pMac, LOGE,
4978 FL("Posting WMA_WOWL_DEL_BCAST_PTRN failed, reason=%X"),
4979 ret_code);
4980 }
4981 return ret_code;
4982}
4983
4984/**
4985 * sme_enter_wowl(): SME API exposed to HDD to request enabling of WOWL mode.
4986 * @hal_ctx - The handle returned by mac_open.
4987 * @enter_wowl_callback_routine - Callback routine provided by HDD.
4988 * Used for success/failure notification by SME
4989 * @enter_wowl_callback_context - A cookie passed by HDD, that is passed
4990 * back to HDD at the time of callback.
4991 * @wake_reason_ind_cb - Callback routine provided by HDD.
4992 * Used for Wake Reason Indication by SME
4993 * @wake_reason_ind_cb_ctx - A cookie passed by HDD, that is passed
4994 * back to HDD at the time of callback.
4995 *
4996 * WoWLAN works on top of BMPS mode.
4997 * If the device is not in BMPS mode,
4998 * SME will will cache the information that
4999 * WOWL has been enabled and attempt to put the device
5000 * in BMPS. On entry into BMPS, SME will enable the
5001 * WOWL mode.
5002 * Note 1: If we exit BMPS mode (someone requests full power),
5003 * we will NOT resume WOWL when we go back to BMPS again.
5004 * Request for full power (while in WOWL mode) means disable
5005 * WOWL and go to full power.
5006 * Note 2: Both UAPSD and WOWL work on top of BMPS.
5007 * On entry into BMPS, SME will give priority to UAPSD and
5008 * enable only UAPSD if both UAPSD and WOWL are required.
5009 * Currently there is no requirement or use case to support
5010 * UAPSD and WOWL at the same time.
5011 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305012 * Return: QDF_STATUS
5013 * QDF_STATUS_SUCCESS Device is already in WoWLAN mode
5014 * QDF_STATUS_E_FAILURE Device cannot enter WoWLAN mode.
5015 * QDF_STATUS_PMC_PENDING Request accepted. SME will enable
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005016 * WOWL after BMPS mode is entered.
5017 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305018QDF_STATUS sme_enter_wowl(tHalHandle hal_ctx,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005019 void (*enter_wowl_callback_routine)(void
5020 *callback_context,
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305021 QDF_STATUS status),
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005022 void *enter_wowl_callback_context,
5023#ifdef WLAN_WAKEUP_EVENTS
5024 void (*wakeIndicationCB)(void *callback_context,
5025 tpSirWakeReasonInd
5026 wake_reason_ind),
5027 void *wakeIndicationCBContext,
5028#endif /* WLAN_WAKEUP_EVENTS */
5029 tpSirSmeWowlEnterParams wowl_enter_params,
5030 uint8_t session_id)
5031{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305032 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005033 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal_ctx);
5034 struct ps_global_info *ps_global_info = &mac_ctx->sme.ps_global_info;
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05305035 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005036 TRACE_CODE_SME_RX_HDD_ENTER_WOWL, session_id, 0));
5037
5038 /* cache the WOWL information */
5039 ps_global_info->ps_params[session_id].wowl_enter_params =
5040 *wowl_enter_params;
5041 ps_global_info->ps_params[session_id].enter_wowl_callback_routine =
5042 enter_wowl_callback_routine;
5043 ps_global_info->ps_params[session_id].enter_wowl_callback_context =
5044 enter_wowl_callback_context;
5045#ifdef WLAN_WAKEUP_EVENTS
5046 /* Cache the Wake Reason Indication callback information */
5047 ps_global_info->ps_params[session_id].wake_reason_ind_cb =
5048 wakeIndicationCB;
5049 ps_global_info->ps_params[session_id].wake_reason_ind_cb_ctx =
5050 wakeIndicationCBContext;
5051#endif /* WLAN_WAKEUP_EVENTS */
5052
5053 status = sme_ps_process_command(mac_ctx, session_id, SME_PS_WOWL_ENTER);
5054 return status;
5055}
5056/**
5057 *sme_exit_wowl(): SME API exposed to HDD to request exit from WoWLAN mode.
5058 * @hal_ctx - The handle returned by mac_open.
5059 * @wowl_exit_params - Carries info on which smesession
5060 * wowl exit is requested.
5061 *
5062 * SME will initiate exit from WoWLAN mode and device will be
5063 * put in BMPS mode.
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305064 * Return QDF_STATUS
5065 * QDF_STATUS_E_FAILURE Device cannot exit WoWLAN mode.
5066 * QDF_STATUS_SUCCESS Request accepted to exit WoWLAN mode.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005067 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305068QDF_STATUS sme_exit_wowl(tHalHandle hal_ctx,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005069 tpSirSmeWowlExitParams wowl_exit_params)
5070{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305071 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005072 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal_ctx);
5073 uint8_t session_id;
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05305074 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005075 TRACE_CODE_SME_RX_HDD_EXIT_WOWL, NO_SESSION, 0));
5076 session_id = wowl_exit_params->sessionId;
5077 status = sme_ps_process_command(mac_ctx, session_id, SME_PS_WOWL_EXIT);
5078 return status;
5079}
5080
5081/**
5082 * sme_roam_set_key() - To set encryption key.
5083 * @hal: hal global context
5084 * @session_id: session id
5085 * @set_key: pointer to a caller allocated object of tCsrSetContextInfo
5086 * @ptr_roam_id: Upon success return, this is the id caller can use to
5087 * identify the request in roamcallback
5088 *
5089 * This function should be called only when connected. This is an asynchronous
5090 * API.
5091 *
5092 * Return: Status of operation
5093 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305094QDF_STATUS sme_roam_set_key(tHalHandle hal, uint8_t session_id,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005095 tCsrRoamSetKey *set_key, uint32_t *ptr_roam_id)
5096{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305097 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005098 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
5099 uint32_t roam_id;
5100 uint32_t i;
5101 tCsrRoamSession *session = NULL;
5102 struct ps_global_info *ps_global_info = &mac_ctx->sme.ps_global_info;
5103
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05305104 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_RX_HDD_SET_KEY,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005105 session_id, 0));
5106 if (set_key->keyLength > CSR_MAX_KEY_LEN) {
5107 sms_log(mac_ctx, LOGE, FL("Invalid key length %d"),
5108 set_key->keyLength);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305109 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005110 }
5111 /*Once Setkey is done, we can go in BMPS */
5112 if (set_key->keyLength)
5113 ps_global_info->remain_in_power_active_till_dhcp = false;
5114
5115 status = sme_acquire_global_lock(&mac_ctx->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305116 if (!QDF_IS_STATUS_SUCCESS(status))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005117 return status;
5118
5119 roam_id = GET_NEXT_ROAM_ID(&mac_ctx->roam);
5120 if (ptr_roam_id)
5121 *ptr_roam_id = roam_id;
5122
5123 sms_log(mac_ctx, LOG2, FL("keyLength %d"), set_key->keyLength);
5124 for (i = 0; i < set_key->keyLength; i++)
5125 sms_log(mac_ctx, LOG2, FL("%02x"), set_key->Key[i]);
5126
5127 sms_log(mac_ctx, LOG2, "\n session_id=%d roam_id=%d", session_id,
5128 roam_id);
5129 session = CSR_GET_SESSION(mac_ctx, session_id);
5130 if (!session) {
5131 sms_log(mac_ctx, LOGE, FL("session %d not found"), session_id);
5132 sme_release_global_lock(&mac_ctx->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305133 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005134 }
5135 if (CSR_IS_INFRA_AP(&session->connectedProfile)
5136 && set_key->keyDirection == eSIR_TX_DEFAULT) {
5137 if ((eCSR_ENCRYPT_TYPE_WEP40 == set_key->encType)
5138 || (eCSR_ENCRYPT_TYPE_WEP40_STATICKEY ==
5139 set_key->encType)) {
5140 session->pCurRoamProfile->negotiatedUCEncryptionType =
5141 eCSR_ENCRYPT_TYPE_WEP40_STATICKEY;
5142 }
5143 if ((eCSR_ENCRYPT_TYPE_WEP104 == set_key->encType)
5144 || (eCSR_ENCRYPT_TYPE_WEP104_STATICKEY ==
5145 set_key->encType)) {
5146 session->pCurRoamProfile->negotiatedUCEncryptionType =
5147 eCSR_ENCRYPT_TYPE_WEP104_STATICKEY;
5148 }
5149 }
5150 status = csr_roam_set_key(mac_ctx, session_id, set_key, roam_id);
5151 sme_release_global_lock(&mac_ctx->sme);
5152 return status;
5153}
5154
Masti, Narayanraddiab712a72016-08-04 11:59:11 +05305155/**
5156 * sme_roam_set_default_key_index - To set default wep key idx
5157 * @hal: pointer to hal handler
5158 * @session_id: session id
5159 * @default_idx: default wep key index
5160 *
5161 * This function prepares a message and post to WMA to set wep default
5162 * key index
5163 *
5164 * Return: Success:QDF_STATUS_SUCCESS Failure: Error value
5165 */
5166QDF_STATUS sme_roam_set_default_key_index(tHalHandle hal, uint8_t session_id,
5167 uint8_t default_idx)
5168{
5169 cds_msg_t msg;
5170 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
5171 struct wep_update_default_key_idx *update_key;
5172
5173 update_key = qdf_mem_malloc(sizeof(*update_key));
5174 if (!update_key) {
5175 sms_log(mac_ctx, LOGE,
5176 FL("Failed to allocate memory for update key"));
5177 return QDF_STATUS_E_NOMEM;
5178 }
5179
5180 update_key->session_id = session_id;
5181 update_key->default_idx = default_idx;
5182
5183 msg.type = WMA_UPDATE_WEP_DEFAULT_KEY;
5184 msg.reserved = 0;
5185 msg.bodyptr = (void *)update_key;
5186
5187 if (QDF_STATUS_SUCCESS !=
5188 cds_mq_post_message(QDF_MODULE_ID_WMA, &msg)) {
5189 sms_log(mac_ctx, LOGE,
5190 FL("Failed to post WMA_UPDATE_WEP_DEFAULT_KEY to WMA"));
5191 qdf_mem_free(update_key);
5192 return QDF_STATUS_E_FAILURE;
5193 }
5194
5195 return QDF_STATUS_SUCCESS;
5196}
5197
5198
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005199/* ---------------------------------------------------------------------------
5200 \fn sme_get_rssi
5201 \brief a wrapper function that client calls to register a callback to get
5202 RSSI
5203
5204 \param hHal - HAL handle for device
5205 \param callback - SME sends back the requested stats using the callback
5206 \param staId - The station ID for which the stats is requested for
5207 \param bssid - The bssid of the connected session
5208 \param lastRSSI - RSSI value at time of request. In case fw cannot provide
5209 RSSI, do not hold up but return this value.
5210 \param pContext - user context to be passed back along with the callback
5211 \param p_cds_context - cds context
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305212 \return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005213 ---------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305214QDF_STATUS sme_get_rssi(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005215 tCsrRssiCallback callback,
Anurag Chouhan6d760662016-02-20 16:05:43 +05305216 uint8_t staId, struct qdf_mac_addr bssId, int8_t lastRSSI,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005217 void *pContext, void *p_cds_context)
5218{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305219 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005220 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
5221
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05305222 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005223 TRACE_CODE_SME_RX_HDD_GET_RSSI, NO_SESSION, 0));
5224 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305225 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005226 status = csr_get_rssi(pMac, callback,
5227 staId, bssId, lastRSSI,
5228 pContext, p_cds_context);
5229 sme_release_global_lock(&pMac->sme);
5230 }
5231 return status;
5232}
5233
5234/* ---------------------------------------------------------------------------
5235 \fn sme_get_snr
5236 \brief a wrapper function that client calls to register a callback to
5237 get SNR
5238
5239 \param callback - SME sends back the requested stats using the callback
5240 \param staId - The station ID for which the stats is requested for
5241 \param pContext - user context to be passed back along with the callback
5242 \param p_cds_context - cds context
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305243 \return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005244 ---------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305245QDF_STATUS sme_get_snr(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005246 tCsrSnrCallback callback,
Anurag Chouhan6d760662016-02-20 16:05:43 +05305247 uint8_t staId, struct qdf_mac_addr bssId, void *pContext)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005248{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305249 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005250 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
5251
5252 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305253 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005254 status = csr_get_snr(pMac, callback, staId, bssId, pContext);
5255 sme_release_global_lock(&pMac->sme);
5256 }
5257 return status;
5258}
5259
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005260/* ---------------------------------------------------------------------------
5261 \fn sme_get_statistics
5262 \brief a wrapper function that client calls to register a callback to get
5263 different PHY level statistics from CSR.
5264
5265 \param requesterId - different client requesting for statistics,
5266 HDD, UMA/GAN etc
5267 \param statsMask - The different category/categories of stats requester
5268 is looking for
5269 \param callback - SME sends back the requested stats using the callback
5270 \param periodicity - If requester needs periodic update in millisec, 0 means
5271 it's an one time request
5272 \param cache - If requester is happy with cached stats
5273 \param staId - The station ID for which the stats is requested for
5274 \param pContext - user context to be passed back along with the callback
5275 \param sessionId - sme session interface
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305276 \return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005277 ---------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305278QDF_STATUS sme_get_statistics(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005279 eCsrStatsRequesterType requesterId,
5280 uint32_t statsMask, tCsrStatsCallback callback,
5281 uint32_t periodicity, bool cache, uint8_t staId,
5282 void *pContext, uint8_t sessionId)
5283{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305284 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005285 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
5286
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05305287 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005288 TRACE_CODE_SME_RX_HDD_GET_STATS, NO_SESSION,
5289 periodicity));
5290 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305291 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005292 status =
5293 csr_get_statistics(pMac, requesterId, statsMask, callback,
5294 periodicity, cache, staId, pContext,
5295 sessionId);
5296 sme_release_global_lock(&pMac->sme);
5297 }
5298
5299 return status;
5300
5301}
5302
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305303QDF_STATUS sme_get_link_status(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005304 tCsrLinkStatusCallback callback,
5305 void *pContext, uint8_t sessionId)
5306{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305307 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005308 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
5309 tAniGetLinkStatus *pMsg;
5310 cds_msg_t cds_message;
5311
5312 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305313 if (QDF_IS_STATUS_SUCCESS(status)) {
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305314 pMsg = qdf_mem_malloc(sizeof(tAniGetLinkStatus));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005315 if (NULL == pMsg) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05305316 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005317 "%s: Not able to allocate memory for link status",
5318 __func__);
5319 sme_release_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305320 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005321 }
5322
5323 pMsg->msgType = WMA_LINK_STATUS_GET_REQ;
5324 pMsg->msgLen = (uint16_t) sizeof(tAniGetLinkStatus);
5325 pMsg->sessionId = sessionId;
5326 pMac->sme.linkStatusContext = pContext;
5327 pMac->sme.linkStatusCallback = callback;
5328
5329 cds_message.type = WMA_LINK_STATUS_GET_REQ;
5330 cds_message.bodyptr = pMsg;
5331 cds_message.reserved = 0;
5332
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305333 if (!QDF_IS_STATUS_SUCCESS
Anurag Chouhan6d760662016-02-20 16:05:43 +05305334 (cds_mq_post_message(QDF_MODULE_ID_WMA, &cds_message))) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05305335 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005336 "%s: Post LINK STATUS MSG fail", __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305337 qdf_mem_free(pMsg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005338 pMac->sme.linkStatusContext = NULL;
5339 pMac->sme.linkStatusCallback = NULL;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305340 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005341 }
5342
5343 sme_release_global_lock(&pMac->sme);
5344 }
5345
5346 return status;
5347}
5348
5349/* ---------------------------------------------------------------------------
5350
5351 \fn sme_get_country_code
5352
5353 \brief To return the current country code. If no country code is applied,
5354 default country code is used to fill the buffer.
5355 If 11d supported is turned off, an error is return and the last
5356 applied/default country code is used.
5357 This is a synchronous API.
5358
5359 \param pBuf - pointer to a caller allocated buffer for returned country code.
5360
5361 \param pbLen For input, this parameter indicates how big is the buffer.
5362 Upon return, this parameter has the number of bytes for
5363 country. If pBuf doesn't have enough space, this function
5364 returns fail status and this parameter contains the number
5365 that is needed.
5366
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305367 \return QDF_STATUS SUCCESS.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005368
5369 FAILURE or RESOURCES The API finished and failed.
5370
5371 -------------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305372QDF_STATUS sme_get_country_code(tHalHandle hHal, uint8_t *pBuf, uint8_t *pbLen)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005373{
5374 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
5375
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05305376 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005377 TRACE_CODE_SME_RX_HDD_GET_CNTRYCODE, NO_SESSION, 0));
5378
5379 return csr_get_country_code(pMac, pBuf, pbLen);
5380}
5381
5382/**
5383 * sme_apply_channel_power_info_to_fw() - sends channel info to fw
5384 * @hHal: hal handle
5385 *
5386 * This function sends the channel power info to firmware
5387 *
5388 * Return: none
5389 */
5390void sme_apply_channel_power_info_to_fw(tHalHandle hHal)
5391{
5392 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
5393
5394 csr_apply_channel_power_info_wrapper(pMac);
5395}
5396
5397/* some support functions */
5398bool sme_is11d_supported(tHalHandle hHal)
5399{
5400 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
5401
5402 return csr_is11d_supported(pMac);
5403}
5404
5405bool sme_is11h_supported(tHalHandle hHal)
5406{
5407 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
5408
5409 return csr_is11h_supported(pMac);
5410}
5411
5412bool sme_is_wmm_supported(tHalHandle hHal)
5413{
5414 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
5415
5416 return csr_is_wmm_supported(pMac);
5417}
5418
5419/* ---------------------------------------------------------------------------
5420
5421 \fn sme_change_country_code
5422
5423 \brief Change Country code from upperlayer during WLAN driver operation.
5424 This is a synchronous API.
5425
5426 \param hHal - The handle returned by mac_open.
5427
5428 \param pCountry New Country Code String
5429
5430 \param sendRegHint If we want to send reg hint to nl80211
5431
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305432 \return QDF_STATUS SUCCESS.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005433
5434 FAILURE or RESOURCES The API finished and failed.
5435
5436 -------------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305437QDF_STATUS sme_change_country_code(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005438 tSmeChangeCountryCallback callback,
5439 uint8_t *pCountry,
5440 void *pContext,
5441 void *p_cds_context,
5442 tAniBool countryFromUserSpace,
5443 tAniBool sendRegHint)
5444{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305445 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005446 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
5447 cds_msg_t msg;
5448 tAniChangeCountryCodeReq *pMsg;
5449
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05305450 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005451 TRACE_CODE_SME_RX_HDD_CHANGE_CNTRYCODE, NO_SESSION,
5452 0));
5453 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305454 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005455 sms_log(pMac, LOG1, FL(" called"));
5456
5457 if ((pMac->roam.configParam.Is11dSupportEnabledOriginal == true)
5458 && (!pMac->roam.configParam.
5459 fSupplicantCountryCodeHasPriority)) {
5460
5461 sms_log(pMac, LOGW,
5462 "Set Country Code Fail since the STA is associated and userspace does not have priority ");
5463
5464 sme_release_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305465 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005466 return status;
5467 }
5468
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305469 pMsg = qdf_mem_malloc(sizeof(tAniChangeCountryCodeReq));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005470 if (NULL == pMsg) {
5471 sms_log(pMac, LOGE,
5472 " csrChangeCountryCode: failed to allocate mem for req");
5473 sme_release_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305474 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005475 }
5476
5477 pMsg->msgType = eWNI_SME_CHANGE_COUNTRY_CODE;
5478 pMsg->msgLen = (uint16_t) sizeof(tAniChangeCountryCodeReq);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305479 qdf_mem_copy(pMsg->countryCode, pCountry, 3);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005480 pMsg->countryFromUserSpace = countryFromUserSpace;
5481 pMsg->sendRegHint = sendRegHint;
5482 pMsg->changeCCCallback = callback;
5483 pMsg->pDevContext = pContext;
5484 pMsg->p_cds_context = p_cds_context;
5485
5486 msg.type = eWNI_SME_CHANGE_COUNTRY_CODE;
5487 msg.bodyptr = pMsg;
5488 msg.reserved = 0;
5489
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305490 if (QDF_STATUS_SUCCESS !=
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005491 cds_mq_post_message(CDS_MQ_ID_SME, &msg)) {
5492 sms_log(pMac, LOGE,
5493 " sme_change_country_code failed to post msg to self ");
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305494 qdf_mem_free((void *)pMsg);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305495 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005496 }
5497 sms_log(pMac, LOG1, FL(" returned"));
5498 sme_release_global_lock(&pMac->sme);
5499 }
5500
5501 return status;
5502}
5503
5504/*--------------------------------------------------------------------------
5505
5506 \fn sme_generic_change_country_code
5507
5508 \brief Change Country code from upperlayer during WLAN driver operation.
5509 This is a synchronous API.
5510
5511 \param hHal - The handle returned by mac_open.
5512
5513 \param pCountry New Country Code String
5514
5515 \param reg_domain regulatory domain
5516
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305517 \return QDF_STATUS SUCCESS.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005518
5519 FAILURE or RESOURCES The API finished and failed.
5520
5521 -----------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305522QDF_STATUS sme_generic_change_country_code(tHalHandle hHal,
Amar Singhal7f1f3ec2015-10-13 17:14:08 -07005523 uint8_t *pCountry)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005524{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305525 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005526 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
5527 cds_msg_t msg;
5528 tAniGenericChangeCountryCodeReq *pMsg;
5529
5530 if (NULL == pMac) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05305531 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_FATAL,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005532 "%s: pMac is null", __func__);
5533 return status;
5534 }
5535
5536 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305537 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005538 sms_log(pMac, LOG1, FL(" called"));
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305539 pMsg = qdf_mem_malloc(sizeof(tAniGenericChangeCountryCodeReq));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005540
5541 if (NULL == pMsg) {
5542 sms_log(pMac, LOGE,
5543 " sme_generic_change_country_code: failed to allocate mem for req");
5544 sme_release_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305545 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005546 }
5547
5548 pMsg->msgType = eWNI_SME_GENERIC_CHANGE_COUNTRY_CODE;
5549 pMsg->msgLen =
5550 (uint16_t) sizeof(tAniGenericChangeCountryCodeReq);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305551 qdf_mem_copy(pMsg->countryCode, pCountry, 2);
Amar Singhal7f1f3ec2015-10-13 17:14:08 -07005552 pMsg->countryCode[2] = ' ';
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005553
5554 msg.type = eWNI_SME_GENERIC_CHANGE_COUNTRY_CODE;
5555 msg.bodyptr = pMsg;
5556 msg.reserved = 0;
5557
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305558 if (QDF_STATUS_SUCCESS !=
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005559 cds_mq_post_message(CDS_MQ_ID_SME, &msg)) {
5560 sms_log(pMac, LOGE,
5561 "sme_generic_change_country_code failed to post msg to self");
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305562 qdf_mem_free(pMsg);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305563 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005564 }
5565 sms_log(pMac, LOG1, FL(" returned"));
5566 sme_release_global_lock(&pMac->sme);
5567 }
5568
5569 return status;
5570}
5571
5572/* ---------------------------------------------------------------------------
5573
5574 \fn sme_dhcp_start_ind
5575
5576 \brief API to signal the FW about the DHCP Start event.
5577
5578 \param hHal - HAL handle for device.
5579
5580 \param device_mode - mode(AP,SAP etc) of the device.
5581
5582 \param macAddr - MAC address of the adapter.
5583
5584 \param sessionId - session ID.
5585
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305586 \return QDF_STATUS SUCCESS.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005587
5588 FAILURE or RESOURCES The API finished and failed.
5589 --------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305590QDF_STATUS sme_dhcp_start_ind(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005591 uint8_t device_mode,
5592 uint8_t *macAddr, uint8_t sessionId)
5593{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305594 QDF_STATUS status;
5595 QDF_STATUS qdf_status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005596 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
5597 cds_msg_t cds_message;
5598 tAniDHCPInd *pMsg;
5599 tCsrRoamSession *pSession;
5600
5601 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305602 if (QDF_STATUS_SUCCESS == status) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005603 pSession = CSR_GET_SESSION(pMac, sessionId);
5604
5605 if (!pSession) {
5606 sms_log(pMac, LOGE, FL("session %d not found "),
5607 sessionId);
5608 sme_release_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305609 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005610 }
5611
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305612 pMsg = (tAniDHCPInd *) qdf_mem_malloc(sizeof(tAniDHCPInd));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005613 if (NULL == pMsg) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05305614 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005615 "%s: Not able to allocate memory for dhcp start",
5616 __func__);
5617 sme_release_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305618 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005619 }
5620 pMsg->msgType = WMA_DHCP_START_IND;
5621 pMsg->msgLen = (uint16_t) sizeof(tAniDHCPInd);
5622 pMsg->device_mode = device_mode;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305623 qdf_mem_copy(pMsg->adapterMacAddr.bytes, macAddr,
Anurag Chouhan6d760662016-02-20 16:05:43 +05305624 QDF_MAC_ADDR_SIZE);
Anurag Chouhanc5548422016-02-24 18:33:27 +05305625 qdf_copy_macaddr(&pMsg->peerMacAddr,
Srinivas Girigowda296105a2015-09-24 16:31:16 -07005626 &pSession->connectedProfile.bssid);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005627
5628 cds_message.type = WMA_DHCP_START_IND;
5629 cds_message.bodyptr = pMsg;
5630 cds_message.reserved = 0;
Sreelakshmi Konamki6a065362016-05-31 16:05:01 +05305631 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
5632 sessionId, cds_message.type));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305633 qdf_status = cds_mq_post_message(CDS_MQ_ID_WMA, &cds_message);
5634 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05305635 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005636 "%s: Post DHCP Start MSG fail", __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305637 qdf_mem_free(pMsg);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305638 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005639 }
5640 sme_release_global_lock(&pMac->sme);
5641 }
5642 return status;
5643}
5644
5645/* ---------------------------------------------------------------------------
5646 \fn sme_dhcp_stop_ind
5647
5648 \brief API to signal the FW about the DHCP complete event.
5649
5650 \param hHal - HAL handle for device.
5651
5652 \param device_mode - mode(AP, SAP etc) of the device.
5653
5654 \param macAddr - MAC address of the adapter.
5655
5656 \param sessionId - session ID.
5657
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305658 \return QDF_STATUS SUCCESS.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005659 FAILURE or RESOURCES The API finished and failed.
5660 --------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305661QDF_STATUS sme_dhcp_stop_ind(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005662 uint8_t device_mode,
5663 uint8_t *macAddr, uint8_t sessionId)
5664{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305665 QDF_STATUS status;
5666 QDF_STATUS qdf_status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005667 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
5668 cds_msg_t cds_message;
5669 tAniDHCPInd *pMsg;
5670 tCsrRoamSession *pSession;
5671
5672 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305673 if (QDF_STATUS_SUCCESS == status) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005674 pSession = CSR_GET_SESSION(pMac, sessionId);
5675
5676 if (!pSession) {
5677 sms_log(pMac, LOGE, FL("session %d not found "),
5678 sessionId);
5679 sme_release_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305680 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005681 }
5682
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305683 pMsg = (tAniDHCPInd *) qdf_mem_malloc(sizeof(tAniDHCPInd));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005684 if (NULL == pMsg) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05305685 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005686 "%s: Not able to allocate memory for dhcp stop",
5687 __func__);
5688 sme_release_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305689 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005690 }
5691
5692 pMsg->msgType = WMA_DHCP_STOP_IND;
5693 pMsg->msgLen = (uint16_t) sizeof(tAniDHCPInd);
5694 pMsg->device_mode = device_mode;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305695 qdf_mem_copy(pMsg->adapterMacAddr.bytes, macAddr,
Anurag Chouhan6d760662016-02-20 16:05:43 +05305696 QDF_MAC_ADDR_SIZE);
Anurag Chouhanc5548422016-02-24 18:33:27 +05305697 qdf_copy_macaddr(&pMsg->peerMacAddr,
Srinivas Girigowda296105a2015-09-24 16:31:16 -07005698 &pSession->connectedProfile.bssid);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005699
5700 cds_message.type = WMA_DHCP_STOP_IND;
5701 cds_message.bodyptr = pMsg;
5702 cds_message.reserved = 0;
Sreelakshmi Konamki6a065362016-05-31 16:05:01 +05305703 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
5704 sessionId, cds_message.type));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305705 qdf_status = cds_mq_post_message(CDS_MQ_ID_WMA, &cds_message);
5706 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05305707 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005708 "%s: Post DHCP Stop MSG fail", __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305709 qdf_mem_free(pMsg);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305710 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005711 }
5712
5713 sme_release_global_lock(&pMac->sme);
5714 }
5715 return status;
5716}
5717
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08005718/*---------------------------------------------------------------------------
5719
5720 \fn sme_TXFailMonitorStopInd
5721
5722 \brief API to signal the FW to start monitoring TX failures
5723
5724 \return QDF_STATUS SUCCESS.
5725
5726 FAILURE or RESOURCES The API finished and failed.
5727 --------------------------------------------------------------------------*/
5728QDF_STATUS sme_tx_fail_monitor_start_stop_ind(tHalHandle hHal, uint8_t tx_fail_count,
5729 void *txFailIndCallback)
5730{
5731 QDF_STATUS status;
5732 QDF_STATUS qdf_status;
5733 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
5734 cds_msg_t cds_message;
5735 tAniTXFailMonitorInd *pMsg;
5736
5737 status = sme_acquire_global_lock(&pMac->sme);
5738 if (QDF_STATUS_SUCCESS == status) {
5739 pMsg = (tAniTXFailMonitorInd *)
5740 qdf_mem_malloc(sizeof(tAniTXFailMonitorInd));
5741 if (NULL == pMsg) {
5742 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
5743 "%s: Failed to allocate memory", __func__);
5744 sme_release_global_lock(&pMac->sme);
5745 return QDF_STATUS_E_NOMEM;
5746 }
5747
5748 pMsg->msgType = WMA_TX_FAIL_MONITOR_IND;
5749 pMsg->msgLen = (uint16_t) sizeof(tAniTXFailMonitorInd);
5750
5751 /* tx_fail_count = 0 should disable the Monitoring in FW */
5752 pMsg->tx_fail_count = tx_fail_count;
5753 pMsg->txFailIndCallback = txFailIndCallback;
5754
5755 cds_message.type = WMA_TX_FAIL_MONITOR_IND;
5756 cds_message.bodyptr = pMsg;
5757 cds_message.reserved = 0;
5758
5759 qdf_status = cds_mq_post_message(CDS_MQ_ID_WMA, &cds_message);
5760 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
5761 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
5762 "%s: Post TX Fail monitor Start MSG fail",
5763 __func__);
5764 qdf_mem_free(pMsg);
5765 status = QDF_STATUS_E_FAILURE;
5766 }
5767 sme_release_global_lock(&pMac->sme);
5768 }
5769 return status;
5770}
5771
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005772/* ---------------------------------------------------------------------------
5773 \fn sme_set_cfg_privacy
5774 \brief API to set configure privacy parameters
5775 \param hHal - The handle returned by mac_open.
5776 \param pProfile - Pointer CSR Roam profile.
5777 \param fPrivacy - This parameter indicates status of privacy
5778
5779 \return void
5780 ---------------------------------------------------------------------------*/
5781void sme_set_cfg_privacy(tHalHandle hHal,
5782 tCsrRoamProfile *pProfile, bool fPrivacy)
5783{
5784 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05305785 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005786 TRACE_CODE_SME_RX_HDD_SET_CFGPRIVACY, NO_SESSION, 0));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305787 if (QDF_STATUS_SUCCESS == sme_acquire_global_lock(&pMac->sme)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005788 csr_set_cfg_privacy(pMac, pProfile, fPrivacy);
5789 sme_release_global_lock(&pMac->sme);
5790 }
5791}
5792
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005793/* ---------------------------------------------------------------------------
5794 \fn sme_neighbor_report_request
5795 \brief API to request neighbor report.
5796 \param hHal - The handle returned by mac_open.
5797 \param pRrmNeighborReq - Pointer to a caller allocated object of type
5798 tRrmNeighborReq. Caller owns the memory and is
5799 responsible for freeing it.
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305800 \return QDF_STATUS
5801 QDF_STATUS_E_FAILURE - failure
5802 QDF_STATUS_SUCCESS success
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005803 ---------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305804QDF_STATUS sme_neighbor_report_request(tHalHandle hHal, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005805 tpRrmNeighborReq pRrmNeighborReq,
5806 tpRrmNeighborRspCallbackInfo callbackInfo)
5807{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305808 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005809 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05305810 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005811 TRACE_CODE_SME_RX_HDD_NEIGHBOR_REPORTREQ, NO_SESSION,
5812 0));
5813
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305814 if (QDF_STATUS_SUCCESS == sme_acquire_global_lock(&pMac->sme)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005815 status =
5816 sme_rrm_neighbor_report_request(hHal, sessionId,
5817 pRrmNeighborReq, callbackInfo);
5818 sme_release_global_lock(&pMac->sme);
5819 }
5820
5821 return status;
5822}
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005823
5824void sms_log(tpAniSirGlobal pMac, uint32_t loglevel, const char *pString, ...)
5825{
5826#ifdef WLAN_DEBUG
5827 /* Verify against current log level */
5828 if (loglevel >
5829 pMac->utils.gLogDbgLevel[LOG_INDEX_FOR_MODULE(SIR_SMS_MODULE_ID)])
5830 return;
5831 else {
5832 va_list marker;
5833
5834 va_start(marker, pString); /* Initialize variable arguments. */
5835
5836 log_debug(pMac, SIR_SMS_MODULE_ID, loglevel, pString, marker);
5837
5838 va_end(marker); /* Reset variable arguments. */
5839 }
5840#endif
5841}
5842
5843/* ---------------------------------------------------------------------------
5844 \fn sme_get_wcnss_wlan_compiled_version
5845 \brief This API returns the version of the WCNSS WLAN API with
5846 which the HOST driver was built
5847 \param hHal - The handle returned by mac_open.
5848 \param pVersion - Points to the Version structure to be filled
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305849 \return QDF_STATUS
5850 QDF_STATUS_E_INVAL - failure
5851 QDF_STATUS_SUCCESS success
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005852 ---------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305853QDF_STATUS sme_get_wcnss_wlan_compiled_version(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005854 tSirVersionType *pVersion)
5855{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305856 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005857 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
5858
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305859 if (QDF_STATUS_SUCCESS == sme_acquire_global_lock(&pMac->sme)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005860 if (pVersion != NULL)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305861 status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005862 else
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305863 status = QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005864
5865 sme_release_global_lock(&pMac->sme);
5866 }
5867
5868 return status;
5869}
5870
5871/* ---------------------------------------------------------------------------
5872 \fn sme_get_wcnss_wlan_reported_version
5873 \brief This API returns the version of the WCNSS WLAN API with
5874 which the WCNSS driver reports it was built
5875 \param hHal - The handle returned by mac_open.
5876 \param pVersion - Points to the Version structure to be filled
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305877 \return QDF_STATUS
5878 QDF_STATUS_E_INVAL - failure
5879 QDF_STATUS_SUCCESS success
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005880 ---------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305881QDF_STATUS sme_get_wcnss_wlan_reported_version(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005882 tSirVersionType *pVersion)
5883{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305884 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005885 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
5886
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305887 if (QDF_STATUS_SUCCESS == sme_acquire_global_lock(&pMac->sme)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005888 if (pVersion != NULL)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305889 status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005890 else
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305891 status = QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005892
5893 sme_release_global_lock(&pMac->sme);
5894 }
5895
5896 return status;
5897}
5898
5899/* ---------------------------------------------------------------------------
5900 \fn sme_get_wcnss_software_version
5901 \brief This API returns the version string of the WCNSS driver
5902 \param hHal - The handle returned by mac_open.
5903 \param pVersion - Points to the Version string buffer to be filled
5904 \param versionBufferSize - THe size of the Version string buffer
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305905 \return QDF_STATUS
5906 QDF_STATUS_E_INVAL - failure
5907 QDF_STATUS_SUCCESS success
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005908 ---------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305909QDF_STATUS sme_get_wcnss_software_version(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005910 uint8_t *pVersion,
5911 uint32_t versionBufferSize)
5912{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305913 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005914 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
5915 v_CONTEXT_t cds_context = cds_get_global_context();
5916
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305917 if (QDF_STATUS_SUCCESS == sme_acquire_global_lock(&pMac->sme)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005918 if (pVersion != NULL) {
5919 status =
5920 wma_get_wcnss_software_version(cds_context,
5921 pVersion,
5922 versionBufferSize);
5923 } else {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305924 status = QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005925 }
5926 sme_release_global_lock(&pMac->sme);
5927 }
5928
5929 return status;
5930}
5931
5932/* ---------------------------------------------------------------------------
5933 \fn sme_get_wcnss_hardware_version
5934 \brief This API returns the version string of the WCNSS hardware
5935 \param hHal - The handle returned by mac_open.
5936 \param pVersion - Points to the Version string buffer to be filled
5937 \param versionBufferSize - THe size of the Version string buffer
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305938 \return QDF_STATUS
5939 QDF_STATUS_E_INVAL - failure
5940 QDF_STATUS_SUCCESS success
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005941 ---------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305942QDF_STATUS sme_get_wcnss_hardware_version(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005943 uint8_t *pVersion,
5944 uint32_t versionBufferSize)
5945{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305946 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005947 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
5948
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305949 if (QDF_STATUS_SUCCESS == sme_acquire_global_lock(&pMac->sme)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005950 if (pVersion != NULL)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305951 status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005952 else
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305953 status = QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005954
5955 sme_release_global_lock(&pMac->sme);
5956 }
5957
5958 return status;
5959}
5960
5961#ifdef FEATURE_WLAN_WAPI
5962
5963/* ---------------------------------------------------------------------------
5964 \fn sme_scan_get_bkid_candidate_list
5965 \brief a wrapper function to return the BKID candidate list
5966 \param pBkidList - caller allocated buffer point to an array of
5967 tBkidCandidateInfo
5968 \param pNumItems - pointer to a variable that has the number of
5969 tBkidCandidateInfo allocated when retruning, this is
5970 either the number needed or number of items put into
5971 pPmkidList
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305972 \return QDF_STATUS - when fail, it usually means the buffer allocated is not
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005973 big enough and pNumItems
5974 has the number of tBkidCandidateInfo.
5975 \Note: pNumItems is a number of tBkidCandidateInfo,
5976 not sizeof(tBkidCandidateInfo) * something
5977 ---------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305978QDF_STATUS sme_scan_get_bkid_candidate_list(tHalHandle hHal, uint32_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005979 tBkidCandidateInfo *pBkidList,
5980 uint32_t *pNumItems)
5981{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305982 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005983 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
5984
5985 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305986 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005987 status =
5988 csr_scan_get_bkid_candidate_list(pMac, sessionId, pBkidList,
5989 pNumItems);
5990 sme_release_global_lock(&pMac->sme);
5991 }
5992
5993 return status;
5994}
5995#endif /* FEATURE_WLAN_WAPI */
5996
5997#ifdef FEATURE_OEM_DATA_SUPPORT
Krishna Kumaar Natarajanc5e06ac2016-06-30 16:49:19 -07005998/**
5999 * sme_oem_data_req() - send oem data request to WMA
6000 * @hal: HAL handle
6001 * @hdd_oem_req: OEM data request from HDD
6002 *
6003 * Return: QDF_STATUS
6004 */
Krishna Kumaar Natarajanc1fa17d2016-08-03 14:19:20 -07006005QDF_STATUS sme_oem_data_req(tHalHandle hal, struct oem_data_req *hdd_oem_req)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006006{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306007 QDF_STATUS status = QDF_STATUS_SUCCESS;
Krishna Kumaar Natarajanc5e06ac2016-06-30 16:49:19 -07006008 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
Krishna Kumaar Natarajanc1fa17d2016-08-03 14:19:20 -07006009 struct oem_data_req *oem_data_req;
Krishna Kumaar Natarajanc5e06ac2016-06-30 16:49:19 -07006010 void *wma_handle;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006011
Krishna Kumaar Natarajanc5e06ac2016-06-30 16:49:19 -07006012 sms_log(mac_ctx, LOG1, FL("enter"));
6013 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
6014 if (!wma_handle) {
6015 sms_log(mac_ctx, LOGE, FL("wma_handle is NULL"));
6016 return QDF_STATUS_E_FAILURE;
6017 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006018
Krishna Kumaar Natarajanc5e06ac2016-06-30 16:49:19 -07006019 oem_data_req = qdf_mem_malloc(sizeof(*oem_data_req));
6020 if (!oem_data_req) {
6021 sms_log(mac_ctx, LOGE, FL("mem alloc failed"));
6022 return QDF_STATUS_E_NOMEM;
6023 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006024
Krishna Kumaar Natarajanc5e06ac2016-06-30 16:49:19 -07006025 oem_data_req->data_len = hdd_oem_req->data_len;
6026 oem_data_req->data = qdf_mem_malloc(oem_data_req->data_len);
6027 if (!oem_data_req->data) {
6028 sms_log(mac_ctx, LOGE, FL("mem alloc failed"));
6029 return QDF_STATUS_E_NOMEM;
6030 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006031
Krishna Kumaar Natarajanc5e06ac2016-06-30 16:49:19 -07006032 qdf_mem_copy(oem_data_req->data, hdd_oem_req->data,
6033 oem_data_req->data_len);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006034
Krishna Kumaar Natarajanc5e06ac2016-06-30 16:49:19 -07006035 status = wma_start_oem_data_req(wma_handle, oem_data_req);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006036
Krishna Kumaar Natarajanc5e06ac2016-06-30 16:49:19 -07006037 if (!QDF_IS_STATUS_SUCCESS(status)) {
6038 sms_log(mac_ctx, LOGE, FL("Post oem data request msg fail"));
6039 } else {
6040 sms_log(mac_ctx, LOG1,
6041 FL("OEM request(length: %d) sent to WMA"),
6042 oem_data_req->data_len);
6043 }
6044
6045 if (oem_data_req->data_len)
6046 qdf_mem_free(oem_data_req->data);
6047 qdf_mem_free(oem_data_req);
6048
6049 sms_log(mac_ctx, LOG1, FL("exit"));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006050 return status;
6051}
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006052#endif /*FEATURE_OEM_DATA_SUPPORT */
6053
6054/*--------------------------------------------------------------------------
6055
6056 \brief sme_open_session() - Open a session for scan/roam operation.
6057
6058 This is a synchronous API.
6059
6060 \param hHal - The handle returned by mac_open.
6061 \param callback - A pointer to the function caller specifies for
6062 roam/connect status indication
6063 \param pContext - The context passed with callback
6064 \param pSelfMacAddr - Caller allocated memory filled with self MAC address
6065 (6 bytes)
6066 \param pbSessionId - pointer to a caller allocated buffer for returned session ID
6067
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306068 \return QDF_STATUS_SUCCESS - session is opened. sessionId returned.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006069
6070 Other status means SME is failed to open the session.
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306071 QDF_STATUS_E_RESOURCES - no more session available.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006072 \sa
6073
6074 --------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306075QDF_STATUS sme_open_session(tHalHandle hHal, csr_roam_completeCallback callback,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006076 void *pContext,
6077 uint8_t *pSelfMacAddr, uint8_t *pbSessionId,
6078 uint32_t type, uint32_t subType)
6079{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306080 QDF_STATUS status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006081 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
6082
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05306083 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_HIGH,
Peng Xu66162de2016-02-11 17:01:20 -08006084 "%s: type=%d, subType=%d addr:%pM",
6085 __func__, type, subType, pSelfMacAddr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006086
6087 if (NULL == pbSessionId) {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306088 status = QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006089 } else {
6090 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306091 if (QDF_IS_STATUS_SUCCESS(status)) {
Peng Xu66162de2016-02-11 17:01:20 -08006092 status = csr_roam_open_session(pMac, callback, pContext,
6093 pSelfMacAddr,
6094 pbSessionId, type,
6095 subType);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006096
6097 sme_release_global_lock(&pMac->sme);
6098 }
6099 }
6100 if (NULL != pbSessionId)
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05306101 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006102 TRACE_CODE_SME_RX_HDD_OPEN_SESSION,
6103 *pbSessionId, 0));
6104
6105 return status;
6106}
6107
6108/*--------------------------------------------------------------------------
6109
6110 \brief sme_close_session() - Open a session for scan/roam operation.
6111
6112 This is a synchronous API.
6113
6114 \param hHal - The handle returned by mac_open.
6115
6116 \param sessionId - A previous opened session's ID.
6117
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306118 \return QDF_STATUS_SUCCESS - session is closed.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006119
6120 Other status means SME is failed to open the session.
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306121 QDF_STATUS_E_INVAL - session is not opened.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006122 \sa
6123
6124 --------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306125QDF_STATUS sme_close_session(tHalHandle hHal, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006126 csr_roamSessionCloseCallback callback,
6127 void *pContext)
6128{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306129 QDF_STATUS status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006130 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
6131
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05306132 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006133 TRACE_CODE_SME_RX_HDD_CLOSE_SESSION, sessionId, 0));
6134 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306135 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006136 status = csr_roam_close_session(pMac, sessionId, false,
6137 callback, pContext);
6138
6139 sme_release_global_lock(&pMac->sme);
6140 }
6141
6142 return status;
6143}
6144
6145/* ---------------------------------------------------------------------------
6146
6147 \fn sme_roam_update_apwpsie
6148
6149 \brief To update AP's WPS IE. This function should be called after SME AP session is created
6150 This is an asynchronous API.
6151
6152 \param pAPWPSIES - pointer to a caller allocated object of tSirAPWPSIEs
6153
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306154 \return QDF_STATUS – SUCCESS –
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006155
6156 FAILURE or RESOURCES – The API finished and failed.
6157
6158 -------------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306159QDF_STATUS sme_roam_update_apwpsie(tHalHandle hHal, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006160 tSirAPWPSIEs *pAPWPSIES)
6161{
6162
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306163 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006164 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
6165
6166 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306167 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006168
6169 status = csr_roam_update_apwpsie(pMac, sessionId, pAPWPSIES);
6170
6171 sme_release_global_lock(&pMac->sme);
6172 }
6173
6174 return status;
6175}
6176
6177/* ---------------------------------------------------------------------------
6178
6179 \fn sme_roam_update_apwparsni_es
6180
6181 \brief To update AP's WPA/RSN IEs. This function should be called after SME AP session is created
6182 This is an asynchronous API.
6183
6184 \param pAPSirRSNie - pointer to a caller allocated object of tSirRSNie with WPS/RSN IEs
6185
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306186 \return QDF_STATUS – SUCCESS –
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006187
6188 FAILURE or RESOURCES – The API finished and failed.
6189
6190 -------------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306191QDF_STATUS sme_roam_update_apwparsni_es(tHalHandle hHal, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006192 tSirRSNie *pAPSirRSNie)
6193{
6194
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306195 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006196 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
6197
6198 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306199 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006200
6201 status = csr_roam_update_wparsni_es(pMac, sessionId, pAPSirRSNie);
6202
6203 sme_release_global_lock(&pMac->sme);
6204 }
6205
6206 return status;
6207}
6208
6209/* ---------------------------------------------------------------------------
6210
6211 \fn sme_change_mcc_beacon_interval
6212
6213 \brief To update P2P-GO beaconInterval. This function should be called after
6214 disassociating all the station is done
6215 This is an asynchronous API.
6216
6217 \param
6218
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306219 \return QDF_STATUS SUCCESS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006220 FAILURE or RESOURCES
6221 The API finished and failed.
6222
6223 -------------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306224QDF_STATUS sme_change_mcc_beacon_interval(tHalHandle hHal, uint8_t sessionId)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006225{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306226 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006227 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
6228
6229 sms_log(pMac, LOG1, FL("Update Beacon PARAMS "));
6230 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306231 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006232 status = csr_send_chng_mcc_beacon_interval(pMac, sessionId);
6233 sme_release_global_lock(&pMac->sme);
6234 }
6235 return status;
6236}
6237
6238/**
6239 * sme_set_host_offload(): API to set the host offload feature.
6240 * @hHal: The handle returned by mac_open.
6241 * @sessionId: Session Identifier
6242 * @request: Pointer to the offload request.
6243 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306244 * Return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006245 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306246QDF_STATUS sme_set_host_offload(tHalHandle hHal, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006247 tpSirHostOffloadReq request)
6248{
6249 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306250 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006251
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05306252 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006253 TRACE_CODE_SME_RX_HDD_SET_HOSTOFFLOAD, sessionId, 0));
6254 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306255 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006256#ifdef WLAN_NS_OFFLOAD
6257 if (SIR_IPV6_NS_OFFLOAD == request->offloadType) {
6258 status = sme_set_ps_ns_offload(hHal, request,
6259 sessionId);
6260 } else
6261#endif /* WLAN_NS_OFFLOAD */
6262 {
6263 status = sme_set_ps_host_offload(hHal, request,
6264 sessionId);
6265 }
6266 sme_release_global_lock(&pMac->sme);
6267 }
6268
6269 return status;
6270}
6271
6272#ifdef WLAN_FEATURE_GTK_OFFLOAD
6273/**
6274 * sme_set_gtk_offload(): API to set GTK offload information.
6275 * @hHal: The handle returned by mac_open.
6276 * @sessionId: Session Identifier
6277 * @pGtkOffload: Pointer to the GTK offload request..
6278 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306279 * Return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006280 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306281QDF_STATUS sme_set_gtk_offload(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006282 tpSirGtkOffloadParams pGtkOffload,
6283 uint8_t sessionId)
6284{
6285 tpSirGtkOffloadParams request_buf;
6286 cds_msg_t msg;
6287 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
6288 tCsrRoamSession *pSession = CSR_GET_SESSION(pMac, sessionId);
6289
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05306290 QDF_TRACE(QDF_MODULE_ID_HDD, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006291 "%s: KeyReplayCounter: %lld", __func__,
6292 pGtkOffload->ullKeyReplayCounter);
6293
6294 if (NULL == pSession) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05306295 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006296 "%s: Session not found ", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306297 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006298 }
6299
Anurag Chouhan600c3a02016-03-01 10:33:54 +05306300 request_buf = qdf_mem_malloc(sizeof(*request_buf));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006301 if (NULL == request_buf) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05306302 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006303 FL("Not able to allocate memory for GTK offload request"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306304 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006305 }
6306
Anurag Chouhanc5548422016-02-24 18:33:27 +05306307 qdf_copy_macaddr(&pGtkOffload->bssid,
Srinivas Girigowda2213b1d2015-11-20 17:10:11 -08006308 &pSession->connectedProfile.bssid);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006309
6310 *request_buf = *pGtkOffload;
6311
6312 msg.type = WMA_GTK_OFFLOAD_REQ;
6313 msg.reserved = 0;
6314 msg.bodyptr = request_buf;
Sreelakshmi Konamki6a065362016-05-31 16:05:01 +05306315 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
6316 sessionId, msg.type));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306317 if (!QDF_IS_STATUS_SUCCESS
Anurag Chouhan6d760662016-02-20 16:05:43 +05306318 (cds_mq_post_message(QDF_MODULE_ID_WMA, &msg))) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05306319 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006320 FL("Not able to post SIR_HAL_SET_GTK_OFFLOAD message to HAL"));
Anurag Chouhan600c3a02016-03-01 10:33:54 +05306321 qdf_mem_free(request_buf);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306322 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006323 }
6324
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306325 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006326}
6327
6328/**
6329 * sme_get_gtk_offload(): API to get GTK offload information
6330 * @hHal: The handle returned by mac_open.
6331 * @callback_routine: callback_routine.
6332 * @sessionId: Session Identifier.
6333 * callback_context: callback_context.
6334 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306335 * Return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006336 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306337QDF_STATUS sme_get_gtk_offload(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006338 gtk_offload_get_info_callback callback_routine,
6339 void *callback_context, uint8_t session_id)
6340{
6341 tpSirGtkOffloadGetInfoRspParams request_buf;
6342 cds_msg_t msg;
6343 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
6344 tCsrRoamSession *pSession = CSR_GET_SESSION(pMac, session_id);
6345
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05306346 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO, "%s: Entered",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006347 __func__);
6348
6349 if (NULL == pSession) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05306350 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Srinivas Girigowda2213b1d2015-11-20 17:10:11 -08006351 "%s: Session not found", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306352 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006353 }
6354
Anurag Chouhan600c3a02016-03-01 10:33:54 +05306355 request_buf = qdf_mem_malloc(sizeof(*request_buf));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006356 if (NULL == request_buf) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05306357 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006358 FL("Not able to allocate memory for Get GTK offload request"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306359 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006360 }
6361
Anurag Chouhanc5548422016-02-24 18:33:27 +05306362 qdf_copy_macaddr(&request_buf->bssid,
Srinivas Girigowda2213b1d2015-11-20 17:10:11 -08006363 &pSession->connectedProfile.bssid);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006364
6365 msg.type = WMA_GTK_OFFLOAD_GETINFO_REQ;
6366 msg.reserved = 0;
6367 msg.bodyptr = request_buf;
6368
6369 /* Cache the Get GTK Offload callback information */
6370 if (NULL != pMac->sme.gtk_offload_get_info_cb) {
6371
6372 /* Do we need to check if the callback is in use? */
6373 /* Because we are not sending the same message again
6374 * when it is pending,
6375 * the only case when the callback is not NULL is that
6376 * the previous message was timed out or failed.
6377 * So, it will be safe to set the callback in this case.
6378 */
6379 }
6380
6381 pMac->sme.gtk_offload_get_info_cb = callback_routine;
6382 pMac->sme.gtk_offload_get_info_cb_context = callback_context;
Sreelakshmi Konamki6a065362016-05-31 16:05:01 +05306383 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
6384 session_id, msg.type));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306385 if (!QDF_IS_STATUS_SUCCESS
Anurag Chouhan6d760662016-02-20 16:05:43 +05306386 (cds_mq_post_message(QDF_MODULE_ID_WMA, &msg))) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05306387 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006388 FL("Not able to post WMA_GTK_OFFLOAD_GETINFO_REQ message to WMA"));
Anurag Chouhan600c3a02016-03-01 10:33:54 +05306389 qdf_mem_free(request_buf);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306390 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006391 }
6392
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306393 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006394}
6395#endif /* WLAN_FEATURE_GTK_OFFLOAD */
6396
6397/* ---------------------------------------------------------------------------
6398 \fn sme_set_keep_alive
6399 \brief API to set the Keep Alive feature.
6400 \param hHal - The handle returned by mac_open.
6401 \param request - Pointer to the Keep Alive request.
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306402 \return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006403 ---------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306404QDF_STATUS sme_set_keep_alive(tHalHandle hHal, uint8_t session_id,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006405 tpSirKeepAliveReq request)
6406{
6407 tpSirKeepAliveReq request_buf;
6408 cds_msg_t msg;
6409 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
6410 tCsrRoamSession *pSession = CSR_GET_SESSION(pMac, session_id);
6411
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05306412 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO_LOW,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006413 FL("WMA_SET_KEEP_ALIVE message"));
6414
6415 if (pSession == NULL) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05306416 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006417 FL("Session not Found"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306418 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006419 }
Anurag Chouhan600c3a02016-03-01 10:33:54 +05306420 request_buf = qdf_mem_malloc(sizeof(tSirKeepAliveReq));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006421 if (NULL == request_buf) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05306422 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006423 FL("Not able to allocate memory for keep alive request"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306424 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006425 }
6426
Anurag Chouhanc5548422016-02-24 18:33:27 +05306427 qdf_copy_macaddr(&request->bssid, &pSession->connectedProfile.bssid);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05306428 qdf_mem_copy(request_buf, request, sizeof(tSirKeepAliveReq));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006429
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05306430 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO_LOW,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006431 "buff TP %d input TP %d ", request_buf->timePeriod,
6432 request->timePeriod);
6433 request_buf->sessionId = session_id;
6434
6435 msg.type = WMA_SET_KEEP_ALIVE;
6436 msg.reserved = 0;
6437 msg.bodyptr = request_buf;
Sreelakshmi Konamki6a065362016-05-31 16:05:01 +05306438 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
6439 session_id, msg.type));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306440 if (QDF_STATUS_SUCCESS !=
Anurag Chouhan6d760662016-02-20 16:05:43 +05306441 cds_mq_post_message(QDF_MODULE_ID_WMA, &msg)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05306442 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006443 FL("Not able to post WMA_SET_KEEP_ALIVE message to WMA"));
Anurag Chouhan600c3a02016-03-01 10:33:54 +05306444 qdf_mem_free(request_buf);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306445 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006446 }
6447
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306448 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006449}
6450
6451#ifdef FEATURE_WLAN_SCAN_PNO
6452/* ---------------------------------------------------------------------------
6453 \fn sme_set_preferred_network_list
6454 \brief API to set the Preferred Network List Offload feature.
6455 \param hHal - The handle returned by mac_open.
6456 \param request - Pointer to the offload request.
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306457 \return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006458 ---------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306459QDF_STATUS sme_set_preferred_network_list(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006460 tpSirPNOScanReq request,
6461 uint8_t sessionId,
6462 void (*callback_routine)(void *callback_context,
6463 tSirPrefNetworkFoundInd
6464 *pPrefNetworkFoundInd),
6465 void *callback_context)
6466{
6467 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306468 QDF_STATUS status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006469
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05306470 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Sreelakshmi Konamki6744cff2015-09-07 12:10:39 +05306471 TRACE_CODE_SME_RX_HDD_PREF_NET_LIST,
6472 sessionId, request->ucNetworksCount));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006473 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306474 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006475 sme_set_ps_preferred_network_list(hHal, request, sessionId,
6476 callback_routine, callback_context);
6477 sme_release_global_lock(&pMac->sme);
6478 }
6479
6480 return status;
6481}
6482
6483#endif /* FEATURE_WLAN_SCAN_PNO */
6484
6485/* ---------------------------------------------------------------------------
6486 \fn sme_abort_mac_scan
6487 \brief API to cancel MAC scan.
6488 \param hHal - The handle returned by mac_open.
6489 \param sessionId - sessionId on which we need to abort scan.
6490 \param reason - Reason to abort the scan.
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306491 \return QDF_STATUS
6492 QDF_STATUS_E_FAILURE - failure
6493 QDF_STATUS_SUCCESS success
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006494 ---------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306495QDF_STATUS sme_abort_mac_scan(tHalHandle hHal, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006496 eCsrAbortReason reason)
6497{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306498 QDF_STATUS status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006499 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
6500
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05306501 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006502 TRACE_CODE_SME_RX_HDD_ABORT_MACSCAN, NO_SESSION, 0));
6503 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306504 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006505 status = csr_scan_abort_mac_scan(pMac, sessionId, reason);
6506
6507 sme_release_global_lock(&pMac->sme);
6508 }
6509
6510 return status;
6511}
6512
6513/* ----------------------------------------------------------------------------
6514 \fn sme_get_operation_channel
6515 \brief API to get current channel on which STA is parked
6516 this function gives channel information only of infra station or IBSS station
6517 \param hHal, pointer to memory location and sessionId
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306518 \returns QDF_STATUS_SUCCESS
6519 QDF_STATUS_E_FAILURE
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006520 -------------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306521QDF_STATUS sme_get_operation_channel(tHalHandle hHal, uint32_t *pChannel,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006522 uint8_t sessionId)
6523{
6524 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
6525 tCsrRoamSession *pSession;
6526
6527 if (CSR_IS_SESSION_VALID(pMac, sessionId)) {
6528 pSession = CSR_GET_SESSION(pMac, sessionId);
6529
6530 if ((pSession->connectedProfile.BSSType ==
6531 eCSR_BSS_TYPE_INFRASTRUCTURE)
6532 || (pSession->connectedProfile.BSSType ==
6533 eCSR_BSS_TYPE_IBSS)
6534 || (pSession->connectedProfile.BSSType ==
6535 eCSR_BSS_TYPE_INFRA_AP)
6536 || (pSession->connectedProfile.BSSType ==
6537 eCSR_BSS_TYPE_START_IBSS)) {
6538 *pChannel = pSession->connectedProfile.operationChannel;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306539 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006540 }
6541 }
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306542 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006543} /* sme_get_operation_channel ends here */
6544
Abhishek Singh7996eb72015-12-30 17:24:02 +05306545/**
Selvaraj, Sridhar4577a9b2016-09-04 15:17:07 +05306546 * sme_register_p2p_ack_ind_callback() - p2p ack indication callback
6547 * @hal: hal pointer
6548 * @callback: callback pointer to be registered
6549 *
6550 * This function is used to register a callback to PE for p2p ack
6551 * indication
6552 *
6553 * Return: Success if msg is posted to PE else Failure.
6554 */
6555QDF_STATUS sme_register_p2p_ack_ind_callback(tHalHandle hal,
6556 sir_p2p_ack_ind_callback callback)
6557{
6558 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
6559 struct sir_sme_p2p_ack_ind_cb_req *msg;
6560 QDF_STATUS status = QDF_STATUS_SUCCESS;
6561 sms_log(mac_ctx, LOG1, FL(": ENTER"));
6562 status = sme_acquire_global_lock(&mac_ctx->sme);
6563 if (QDF_IS_STATUS_SUCCESS(status)) {
6564 msg = qdf_mem_malloc(sizeof(*msg));
6565 if (NULL == msg) {
6566 sms_log(mac_ctx, LOGE,
6567 FL("Failed to allocate memory"));
6568 sme_release_global_lock(&mac_ctx->sme);
6569 return QDF_STATUS_E_NOMEM;
6570 }
6571 qdf_mem_zero(msg, sizeof(*msg));
6572 msg->message_type = eWNI_SME_REGISTER_P2P_ACK_CB;
6573 msg->length = sizeof(*msg);
6574
6575 msg->callback = callback;
6576 status = cds_send_mb_message_to_mac(msg);
6577 sme_release_global_lock(&mac_ctx->sme);
6578 return status;
6579 }
6580 return status;
6581}
6582
6583/**
Abhishek Singh7996eb72015-12-30 17:24:02 +05306584 * sme_register_mgmt_frame_ind_callback() - Register a callback for
6585 * management frame indication to PE.
6586 *
6587 * @hal: hal pointer
6588 * @callback: callback pointer to be registered
6589 *
6590 * This function is used to register a callback for management
6591 * frame indication to PE.
6592 *
6593 * Return: Success if msg is posted to PE else Failure.
6594 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306595QDF_STATUS sme_register_mgmt_frame_ind_callback(tHalHandle hal,
Abhishek Singh7996eb72015-12-30 17:24:02 +05306596 sir_mgmt_frame_ind_callback callback)
6597{
6598 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
6599 struct sir_sme_mgmt_frame_cb_req *msg;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306600 QDF_STATUS status = QDF_STATUS_SUCCESS;
Abhishek Singh7996eb72015-12-30 17:24:02 +05306601
6602 sms_log(mac_ctx, LOG1, FL(": ENTER"));
6603
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306604 if (QDF_STATUS_SUCCESS ==
Abhishek Singh7996eb72015-12-30 17:24:02 +05306605 sme_acquire_global_lock(&mac_ctx->sme)) {
Anurag Chouhan600c3a02016-03-01 10:33:54 +05306606 msg = qdf_mem_malloc(sizeof(*msg));
Abhishek Singh7996eb72015-12-30 17:24:02 +05306607 if (NULL == msg) {
6608 sms_log(mac_ctx, LOGE,
6609 FL("Not able to allocate memory for eWNI_SME_REGISTER_MGMT_FRAME_CB"));
6610 sme_release_global_lock(&mac_ctx->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306611 return QDF_STATUS_E_NOMEM;
Abhishek Singh7996eb72015-12-30 17:24:02 +05306612 }
Anurag Chouhan600c3a02016-03-01 10:33:54 +05306613 qdf_mem_set(msg, sizeof(*msg), 0);
Abhishek Singh7996eb72015-12-30 17:24:02 +05306614 msg->message_type = eWNI_SME_REGISTER_MGMT_FRAME_CB;
6615 msg->length = sizeof(*msg);
6616
6617 msg->callback = callback;
6618 status = cds_send_mb_message_to_mac(msg);
6619 sme_release_global_lock(&mac_ctx->sme);
6620 return status;
6621 }
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306622 return QDF_STATUS_E_FAILURE;
Abhishek Singh7996eb72015-12-30 17:24:02 +05306623}
6624
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006625/* ---------------------------------------------------------------------------
6626
6627 \fn sme_RegisterMgtFrame
6628
6629 \brief To register managment frame of specified type and subtype.
6630 \param frameType - type of the frame that needs to be passed to HDD.
6631 \param matchData - data which needs to be matched before passing frame
6632 to HDD.
6633 \param matchDataLen - Length of matched data.
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306634 \return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006635 -------------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306636QDF_STATUS sme_register_mgmt_frame(tHalHandle hHal, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006637 uint16_t frameType, uint8_t *matchData,
6638 uint16_t matchLen)
6639{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306640 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006641 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
6642
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05306643 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006644 TRACE_CODE_SME_RX_HDD_REGISTER_MGMTFR, sessionId, 0));
6645 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306646 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006647 tSirRegisterMgmtFrame *pMsg;
6648 uint16_t len;
6649 tCsrRoamSession *pSession = CSR_GET_SESSION(pMac, sessionId);
6650
6651 if (!CSR_IS_SESSION_ANY(sessionId) && !pSession) {
6652 sms_log(pMac, LOGE, FL(" session %d not found "),
6653 sessionId);
6654 sme_release_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306655 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006656 }
6657
6658 if (!CSR_IS_SESSION_ANY(sessionId) && !pSession->sessionActive) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05306659 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006660 "%s Invalid Sessionid", __func__);
6661 sme_release_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306662 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006663 }
6664
6665 len = sizeof(tSirRegisterMgmtFrame) + matchLen;
6666
Anurag Chouhan600c3a02016-03-01 10:33:54 +05306667 pMsg = qdf_mem_malloc(len);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006668 if (NULL == pMsg)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306669 status = QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006670 else {
Anurag Chouhan600c3a02016-03-01 10:33:54 +05306671 qdf_mem_set(pMsg, len, 0);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006672 pMsg->messageType = eWNI_SME_REGISTER_MGMT_FRAME_REQ;
6673 pMsg->length = len;
6674 pMsg->sessionId = sessionId;
6675 pMsg->registerFrame = true;
6676 pMsg->frameType = frameType;
6677 pMsg->matchLen = matchLen;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05306678 qdf_mem_copy(pMsg->matchData, matchData, matchLen);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006679 status = cds_send_mb_message_to_mac(pMsg);
6680 }
6681 sme_release_global_lock(&pMac->sme);
6682 }
6683 return status;
6684}
6685
6686/* ---------------------------------------------------------------------------
6687
6688 \fn sme_DeregisterMgtFrame
6689
6690 \brief To De-register managment frame of specified type and subtype.
6691 \param frameType - type of the frame that needs to be passed to HDD.
6692 \param matchData - data which needs to be matched before passing frame
6693 to HDD.
6694 \param matchDataLen - Length of matched data.
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306695 \return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006696 -------------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306697QDF_STATUS sme_deregister_mgmt_frame(tHalHandle hHal, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006698 uint16_t frameType, uint8_t *matchData,
6699 uint16_t matchLen)
6700{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306701 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006702 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
6703
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05306704 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006705 TRACE_CODE_SME_RX_HDD_DEREGISTER_MGMTFR, sessionId,
6706 0));
6707 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306708 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006709 tSirRegisterMgmtFrame *pMsg;
6710 uint16_t len;
6711 tCsrRoamSession *pSession = CSR_GET_SESSION(pMac, sessionId);
6712
6713 if (!CSR_IS_SESSION_ANY(sessionId) && !pSession) {
6714 sms_log(pMac, LOGE, FL(" session %d not found "),
6715 sessionId);
6716 sme_release_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306717 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006718 }
6719
6720 if (!CSR_IS_SESSION_ANY(sessionId) && !pSession->sessionActive) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05306721 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006722 "%s Invalid Sessionid", __func__);
6723 sme_release_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306724 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006725 }
6726
6727 len = sizeof(tSirRegisterMgmtFrame) + matchLen;
6728
Anurag Chouhan600c3a02016-03-01 10:33:54 +05306729 pMsg = qdf_mem_malloc(len);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006730 if (NULL == pMsg)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306731 status = QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006732 else {
Anurag Chouhan600c3a02016-03-01 10:33:54 +05306733 qdf_mem_set(pMsg, len, 0);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006734 pMsg->messageType = eWNI_SME_REGISTER_MGMT_FRAME_REQ;
6735 pMsg->length = len;
6736 pMsg->registerFrame = false;
6737 pMsg->frameType = frameType;
6738 pMsg->matchLen = matchLen;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05306739 qdf_mem_copy(pMsg->matchData, matchData, matchLen);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006740 status = cds_send_mb_message_to_mac(pMsg);
6741 }
6742 sme_release_global_lock(&pMac->sme);
6743 }
6744 return status;
6745}
6746
6747/**
6748 * sme_remain_on_channel - API to request remain on channel for 'x' duration
6749 *
6750 * @hHal: pointer to MAC handle
6751 * @session_id: Session identifier
6752 * @channel: channel information
6753 * @duration: duration in ms
6754 * @callback: HDD registered callback to process reaminOnChannelRsp
6755 * @context: HDD Callback param
6756 * @scan_id: scan identifier
6757 *
6758 * This function process the roc request and generates scan identifier.s
6759 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306760 * Return: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006761 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306762QDF_STATUS sme_remain_on_channel(tHalHandle hHal, uint8_t session_id,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006763 uint8_t channel, uint32_t duration,
6764 remainOnChanCallback callback,
6765 void *pContext, uint8_t isP2PProbeReqAllowed,
6766 uint32_t *scan_id)
6767{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306768 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006769 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hHal);
6770 uint32_t san_req_id, scan_count;
6771 struct ani_roc_req *roc_msg;
6772 cds_msg_t msg;
6773
6774
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05306775 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006776 TRACE_CODE_SME_RX_HDD_REMAIN_ONCHAN, session_id, 0));
6777
6778 scan_count = csr_ll_count(&mac_ctx->sme.smeScanCmdActiveList);
6779 if (scan_count >= mac_ctx->scan.max_scan_count) {
6780 sms_log(mac_ctx, LOGE, FL("Max scan reached"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306781 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006782 }
6783
6784 wma_get_scan_id(&san_req_id);
6785 *scan_id = san_req_id;
6786 status = sme_acquire_global_lock(&mac_ctx->sme);
6787
6788 sms_log(mac_ctx, LOG1, FL(" called"));
Anurag Chouhan600c3a02016-03-01 10:33:54 +05306789 roc_msg = qdf_mem_malloc(sizeof(struct ani_roc_req));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006790 if (NULL == roc_msg) {
6791 sms_log(mac_ctx, LOGE,
6792 " scan_req: failed to allocate mem for msg");
6793 sme_release_global_lock(&mac_ctx->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306794 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006795 }
6796 roc_msg->msg_type = eWNI_SME_ROC_CMD;
6797 roc_msg->msg_len = (uint16_t) sizeof(struct ani_roc_req);
6798 roc_msg->session_id = session_id;
6799 roc_msg->callback = callback;
6800 roc_msg->duration = duration;
6801 roc_msg->channel = channel;
6802 roc_msg->is_p2pprobe_allowed = isP2PProbeReqAllowed;
6803 roc_msg->ctx = pContext;
6804 roc_msg->scan_id = *scan_id;
6805 msg.type = eWNI_SME_ROC_CMD;
6806 msg.bodyptr = roc_msg;
6807 msg.reserved = 0;
6808 msg.bodyval = 0;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306809 if (QDF_STATUS_SUCCESS !=
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006810 cds_mq_post_message(CDS_MQ_ID_SME, &msg)) {
6811 sms_log(mac_ctx, LOGE,
6812 " sme_scan_req failed to post msg");
Anurag Chouhan600c3a02016-03-01 10:33:54 +05306813 qdf_mem_free(roc_msg);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306814 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006815 }
6816 sme_release_global_lock(&mac_ctx->sme);
6817 return status;
6818}
6819
6820/* ---------------------------------------------------------------------------
6821 \fn sme_report_probe_req
6822 \brief API to enable/disable forwarding of probeReq to apps in p2p.
6823 \param hHal - The handle returned by mac_open.
6824 \param falg: to set the Probe request forarding to wpa_supplicant in listen state in p2p
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306825 \return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006826 ---------------------------------------------------------------------------*/
6827
6828#ifndef WLAN_FEATURE_CONCURRENT_P2P
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306829QDF_STATUS sme_report_probe_req(tHalHandle hHal, uint8_t flag)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006830{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306831 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006832 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
6833
6834 do {
6835 /* acquire the lock for the sme object */
6836 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306837 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006838 /* call set in context */
6839 pMac->p2pContext.probeReqForwarding = flag;
6840 /* release the lock for the sme object */
6841 sme_release_global_lock(&pMac->sme);
6842 }
6843 } while (0);
6844
6845 sms_log(pMac, LOGW, "exiting function %s", __func__);
6846
6847 return status;
6848}
6849
6850/* ---------------------------------------------------------------------------
6851 \fn sme_update_p2p_ie
6852 \brief API to set the P2p Ie in p2p context
6853 \param hHal - The handle returned by mac_open.
6854 \param p2pIe - Ptr to p2pIe from HDD.
6855 \param p2pIeLength: length of p2pIe
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306856 \return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006857 ---------------------------------------------------------------------------*/
6858
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306859QDF_STATUS sme_update_p2p_ie(tHalHandle hHal, void *p2pIe, uint32_t p2pIeLength)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006860{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306861 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006862 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
6863
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05306864 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006865 TRACE_CODE_SME_RX_HDD_UPDATE_P2P_IE, NO_SESSION, 0));
6866 /* acquire the lock for the sme object */
6867 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306868 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006869 if (NULL != pMac->p2pContext.probeRspIe) {
Anurag Chouhan600c3a02016-03-01 10:33:54 +05306870 qdf_mem_free(pMac->p2pContext.probeRspIe);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006871 pMac->p2pContext.probeRspIeLength = 0;
6872 }
6873
Anurag Chouhan600c3a02016-03-01 10:33:54 +05306874 pMac->p2pContext.probeRspIe = qdf_mem_malloc(p2pIeLength);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006875 if (NULL == pMac->p2pContext.probeRspIe) {
6876 sms_log(pMac, LOGE, "%s: Unable to allocate P2P IE",
6877 __func__);
6878 pMac->p2pContext.probeRspIeLength = 0;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306879 status = QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006880 } else {
6881 pMac->p2pContext.probeRspIeLength = p2pIeLength;
6882
6883 sir_dump_buf(pMac, SIR_LIM_MODULE_ID, LOG2,
6884 pMac->p2pContext.probeRspIe,
6885 pMac->p2pContext.probeRspIeLength);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05306886 qdf_mem_copy((uint8_t *) pMac->p2pContext.probeRspIe,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006887 p2pIe, p2pIeLength);
6888 }
6889
6890 /* release the lock for the sme object */
6891 sme_release_global_lock(&pMac->sme);
6892 }
6893
6894 sms_log(pMac, LOG2, "exiting function %s", __func__);
6895
6896 return status;
6897}
6898#endif
6899
6900/* ---------------------------------------------------------------------------
6901 \fn sme_send_action
6902 \brief API to send action frame from supplicant.
6903 \param hHal - The handle returned by mac_open.
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306904 \return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006905 ---------------------------------------------------------------------------*/
6906
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306907QDF_STATUS sme_send_action(tHalHandle hHal, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006908 const uint8_t *pBuf, uint32_t len,
6909 uint16_t wait, bool noack,
6910 uint16_t channel_freq)
6911{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306912 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006913 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
6914
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05306915 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006916 TRACE_CODE_SME_RX_HDD_SEND_ACTION, sessionId, 0));
6917 /* acquire the lock for the sme object */
6918 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306919 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006920 p2p_send_action(hHal, sessionId, pBuf, len, wait, noack,
6921 channel_freq);
6922 /* release the lock for the sme object */
6923 sme_release_global_lock(&pMac->sme);
6924 }
6925
6926 sms_log(pMac, LOGW, "exiting function %s", __func__);
6927
6928 return status;
6929}
6930
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306931QDF_STATUS sme_cancel_remain_on_channel(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006932 uint8_t sessionId, uint32_t scan_id)
6933{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306934 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006935 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
6936
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05306937 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006938 TRACE_CODE_SME_RX_HDD_CANCEL_REMAIN_ONCHAN, sessionId,
6939 0));
6940 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306941 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006942 status = p2p_cancel_remain_on_channel(hHal, sessionId, scan_id);
6943 sme_release_global_lock(&pMac->sme);
6944 }
6945 return status;
6946}
6947
6948/* Power Save Related */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306949QDF_STATUS sme_p2p_set_ps(tHalHandle hHal, tP2pPsConfig *data)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006950{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306951 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006952 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
6953
6954 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306955 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006956 status = p2p_set_ps(hHal, data);
6957 sme_release_global_lock(&pMac->sme);
6958 }
6959 return status;
6960}
6961
6962/* ---------------------------------------------------------------------------
6963
6964 \fn sme_configure_rxp_filter
6965
6966 \brief
6967 SME will pass this request to lower mac to set/reset the filter on RXP for
6968 multicast & broadcast traffic.
6969
6970 \param
6971
6972 hHal - The handle returned by mac_open.
6973
6974 filterMask- Currently the API takes a 1 or 0 (set or reset) as filter.
6975 Basically to enable/disable the filter (to filter "all" mcbc traffic) based
6976 on this param. In future we can use this as a mask to set various types of
6977 filters as suggested below:
6978 FILTER_ALL_MULTICAST:
6979 FILTER_ALL_BROADCAST:
6980 FILTER_ALL_MULTICAST_BROADCAST:
6981
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306982 \return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006983
6984 --------------------------------------------------------------------------- */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306985QDF_STATUS sme_configure_rxp_filter(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006986 tpSirWlanSetRxpFilters wlanRxpFilterParam)
6987{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306988 QDF_STATUS status = QDF_STATUS_SUCCESS;
6989 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006990 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
6991 cds_msg_t cds_message;
6992
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05306993 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006994 TRACE_CODE_SME_RX_HDD_CONFIG_RXPFIL, NO_SESSION, 0));
6995 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306996 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006997 /* serialize the req through MC thread */
6998 cds_message.bodyptr = wlanRxpFilterParam;
6999 cds_message.type = WMA_CFG_RXP_FILTER_REQ;
Sreelakshmi Konamki6a065362016-05-31 16:05:01 +05307000 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
7001 NO_SESSION, cds_message.type));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307002 qdf_status = cds_mq_post_message(CDS_MQ_ID_WMA, &cds_message);
7003 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
7004 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007005 }
7006 sme_release_global_lock(&pMac->sme);
7007 }
7008 return status;
7009}
7010
7011/* ---------------------------------------------------------------------------
7012
7013 \fn sme_configure_suspend_ind
7014
7015 \brief
7016 SME will pass this request to lower mac to Indicate that the wlan needs to
7017 be suspended
7018
7019 \param
7020
7021 hHal - The handle returned by mac_open.
7022
7023 wlanSuspendParam- Depicts the wlan suspend params
7024
7025 csr_readyToSuspendCallback - Callback to be called when ready to suspend
7026 event is received.
7027 callback_context - Context associated with csr_readyToSuspendCallback.
7028
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307029 \return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007030
7031 --------------------------------------------------------------------------- */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307032QDF_STATUS sme_configure_suspend_ind(tHalHandle hHal,
Houston Hoffman7260ecb2015-10-05 18:43:07 -07007033 uint32_t conn_state_mask,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007034 csr_readyToSuspendCallback callback,
7035 void *callback_context)
7036{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307037 QDF_STATUS status = QDF_STATUS_SUCCESS;
7038 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007039 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
7040 cds_msg_t cds_message;
7041
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05307042 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007043 TRACE_CODE_SME_RX_HDD_CONFIG_SUSPENDIND, NO_SESSION,
7044 0));
7045
7046 pMac->readyToSuspendCallback = callback;
7047 pMac->readyToSuspendContext = callback_context;
7048
7049 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307050 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007051 /* serialize the req through MC thread */
Houston Hoffman7260ecb2015-10-05 18:43:07 -07007052 cds_message.bodyval = conn_state_mask;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007053 cds_message.type = WMA_WLAN_SUSPEND_IND;
Sreelakshmi Konamki6a065362016-05-31 16:05:01 +05307054 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
7055 NO_SESSION, cds_message.type));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307056 qdf_status = cds_mq_post_message(CDS_MQ_ID_WMA, &cds_message);
7057 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007058 pMac->readyToSuspendCallback = NULL;
7059 pMac->readyToSuspendContext = NULL;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307060 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007061 }
7062 sme_release_global_lock(&pMac->sme);
7063 }
7064
7065 return status;
7066}
7067
7068/* ---------------------------------------------------------------------------
7069
7070 \fn sme_configure_resume_req
7071
7072 \brief
7073 SME will pass this request to lower mac to Indicate that the wlan needs to
7074 be Resumed
7075
7076 \param
7077
7078 hHal - The handle returned by mac_open.
7079
7080 wlanResumeParam- Depicts the wlan resume params
7081
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307082 \return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007083
7084 --------------------------------------------------------------------------- */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307085QDF_STATUS sme_configure_resume_req(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007086 tpSirWlanResumeParam wlanResumeParam)
7087{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307088 QDF_STATUS status = QDF_STATUS_SUCCESS;
7089 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007090 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
7091 cds_msg_t cds_message;
7092
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05307093 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007094 TRACE_CODE_SME_RX_HDD_CONFIG_RESUMEREQ, NO_SESSION,
7095 0));
7096 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307097 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007098 /* serialize the req through MC thread */
7099 cds_message.bodyptr = wlanResumeParam;
7100 cds_message.type = WMA_WLAN_RESUME_REQ;
Sreelakshmi Konamki6a065362016-05-31 16:05:01 +05307101 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
7102 NO_SESSION, cds_message.type));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307103 qdf_status = cds_mq_post_message(CDS_MQ_ID_WMA, &cds_message);
7104 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
7105 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007106 }
7107 sme_release_global_lock(&pMac->sme);
7108 }
7109 return status;
7110}
7111
7112#ifdef WLAN_FEATURE_EXTWOW_SUPPORT
Krishna Kumaar Natarajand9131902015-10-19 11:52:47 -07007113/**
7114 * sme_configure_ext_wow() - configure Extr WoW
7115 * @hHal - The handle returned by mac_open.
7116 * @wlanExtParams - Depicts the wlan Ext params.
7117 * @callback - ext_wow callback to be registered.
7118 * @callback_context - ext_wow callback context
7119 *
7120 * SME will pass this request to lower mac to configure Extr WoW
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307121 * Return: QDF_STATUS
Krishna Kumaar Natarajand9131902015-10-19 11:52:47 -07007122 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307123QDF_STATUS sme_configure_ext_wow(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007124 tpSirExtWoWParams wlanExtParams,
7125 csr_readyToExtWoWCallback callback,
7126 void *callback_context)
7127{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307128 QDF_STATUS status = QDF_STATUS_SUCCESS;
7129 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007130 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
7131 cds_msg_t cds_message;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05307132 tpSirExtWoWParams MsgPtr = qdf_mem_malloc(sizeof(*MsgPtr));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007133
7134 if (!MsgPtr)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307135 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007136
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05307137 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007138 TRACE_CODE_SME_RX_HDD_CONFIG_EXTWOW, NO_SESSION, 0));
7139
7140 pMac->readyToExtWoWCallback = callback;
7141 pMac->readyToExtWoWContext = callback_context;
7142
7143 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307144 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007145
7146 /* serialize the req through MC thread */
Anurag Chouhan600c3a02016-03-01 10:33:54 +05307147 qdf_mem_copy(MsgPtr, wlanExtParams, sizeof(*MsgPtr));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007148 cds_message.bodyptr = MsgPtr;
7149 cds_message.type = WMA_WLAN_EXT_WOW;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307150 qdf_status = cds_mq_post_message(CDS_MQ_ID_WMA, &cds_message);
7151 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007152 pMac->readyToExtWoWCallback = NULL;
7153 pMac->readyToExtWoWContext = NULL;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05307154 qdf_mem_free(MsgPtr);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307155 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007156 }
7157 sme_release_global_lock(&pMac->sme);
7158 } else {
7159 pMac->readyToExtWoWCallback = NULL;
7160 pMac->readyToExtWoWContext = NULL;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05307161 qdf_mem_free(MsgPtr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007162 }
7163
7164 return status;
7165}
7166
7167/* ---------------------------------------------------------------------------
7168
7169 \fn sme_configure_app_type1_params
7170
7171 \brief
7172 SME will pass this request to lower mac to configure Indoor WoW parameters.
7173
7174 \param
7175
7176 hHal - The handle returned by mac_open.
7177
7178 wlanAppType1Params- Depicts the wlan App Type 1(Indoor) params
7179
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307180 \return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007181
7182 --------------------------------------------------------------------------- */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307183QDF_STATUS sme_configure_app_type1_params(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007184 tpSirAppType1Params wlanAppType1Params)
7185{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307186 QDF_STATUS status = QDF_STATUS_SUCCESS;
7187 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007188 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
7189 cds_msg_t cds_message;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05307190 tpSirAppType1Params MsgPtr = qdf_mem_malloc(sizeof(*MsgPtr));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007191
7192 if (!MsgPtr)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307193 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007194
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05307195 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007196 TRACE_CODE_SME_RX_HDD_CONFIG_APP_TYPE1, NO_SESSION,
7197 0));
7198
7199 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307200 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007201 /* serialize the req through MC thread */
Anurag Chouhan600c3a02016-03-01 10:33:54 +05307202 qdf_mem_copy(MsgPtr, wlanAppType1Params, sizeof(*MsgPtr));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007203 cds_message.bodyptr = MsgPtr;
7204 cds_message.type = WMA_WLAN_SET_APP_TYPE1_PARAMS;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307205 qdf_status = cds_mq_post_message(CDS_MQ_ID_WMA, &cds_message);
7206 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
Anurag Chouhan600c3a02016-03-01 10:33:54 +05307207 qdf_mem_free(MsgPtr);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307208 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007209 }
7210 sme_release_global_lock(&pMac->sme);
7211 } else {
Anurag Chouhan600c3a02016-03-01 10:33:54 +05307212 qdf_mem_free(MsgPtr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007213 }
7214
7215 return status;
7216}
7217
7218/* ---------------------------------------------------------------------------
7219
7220 \fn sme_configure_app_type2_params
7221
7222 \brief
7223 SME will pass this request to lower mac to configure Indoor WoW parameters.
7224
7225 \param
7226
7227 hHal - The handle returned by mac_open.
7228
7229 wlanAppType2Params- Depicts the wlan App Type 2 (Outdoor) params
7230
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307231 \return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007232
7233 --------------------------------------------------------------------------- */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307234QDF_STATUS sme_configure_app_type2_params(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007235 tpSirAppType2Params wlanAppType2Params)
7236{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307237 QDF_STATUS status = QDF_STATUS_SUCCESS;
7238 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007239 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
7240 cds_msg_t cds_message;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05307241 tpSirAppType2Params MsgPtr = qdf_mem_malloc(sizeof(*MsgPtr));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007242
7243 if (!MsgPtr)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307244 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007245
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05307246 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007247 TRACE_CODE_SME_RX_HDD_CONFIG_APP_TYPE2, NO_SESSION,
7248 0));
7249
7250 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307251 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007252 /* serialize the req through MC thread */
Anurag Chouhan600c3a02016-03-01 10:33:54 +05307253 qdf_mem_copy(MsgPtr, wlanAppType2Params, sizeof(*MsgPtr));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007254 cds_message.bodyptr = MsgPtr;
7255 cds_message.type = WMA_WLAN_SET_APP_TYPE2_PARAMS;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307256 qdf_status = cds_mq_post_message(CDS_MQ_ID_WMA, &cds_message);
7257 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
Anurag Chouhan600c3a02016-03-01 10:33:54 +05307258 qdf_mem_free(MsgPtr);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307259 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007260 }
7261 sme_release_global_lock(&pMac->sme);
7262 } else {
Anurag Chouhan600c3a02016-03-01 10:33:54 +05307263 qdf_mem_free(MsgPtr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007264 }
7265
7266 return status;
7267}
7268#endif
7269
7270/* ---------------------------------------------------------------------------
7271
7272 \fn sme_get_infra_session_id
7273
7274 \brief To get the session ID for infra session, if connected
7275 This is a synchronous API.
7276
7277 \param hHal - The handle returned by mac_open.
7278
7279 \return sessionid, -1 if infra session is not connected
7280
7281 -------------------------------------------------------------------------------*/
7282int8_t sme_get_infra_session_id(tHalHandle hHal)
7283{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307284 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007285 int8_t sessionid = -1;
7286 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
7287
7288 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307289 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007290
7291 sessionid = csr_get_infra_session_id(pMac);
7292
7293 sme_release_global_lock(&pMac->sme);
7294 }
7295
7296 return sessionid;
7297}
7298
7299/* ---------------------------------------------------------------------------
7300
7301 \fn sme_get_infra_operation_channel
7302
7303 \brief To get the operating channel for infra session, if connected
7304 This is a synchronous API.
7305
7306 \param hHal - The handle returned by mac_open.
7307 \param sessionId - the sessionId returned by sme_open_session.
7308
7309 \return operating channel, 0 if infra session is not connected
7310
7311 -------------------------------------------------------------------------------*/
7312uint8_t sme_get_infra_operation_channel(tHalHandle hHal, uint8_t sessionId)
7313{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307314 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007315 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
7316 uint8_t channel = 0;
7317 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307318 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007319
7320 channel = csr_get_infra_operation_channel(pMac, sessionId);
7321
7322 sme_release_global_lock(&pMac->sme);
7323 }
7324
7325 return channel;
7326}
7327
7328/* This routine will return poerating channel on which other BSS is operating to be used for concurrency mode. */
7329/* If other BSS is not up or not connected it will return 0 */
7330uint8_t sme_get_concurrent_operation_channel(tHalHandle hHal)
7331{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307332 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007333 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
7334 uint8_t channel = 0;
7335 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307336 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007337
7338 channel = csr_get_concurrent_operation_channel(pMac);
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05307339 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO_HIGH, "%s: "
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007340 " Other Concurrent Channel = %d", __func__, channel);
7341 sme_release_global_lock(&pMac->sme);
7342 }
7343
7344 return channel;
7345}
7346
7347#ifdef FEATURE_WLAN_MCC_TO_SCC_SWITCH
7348uint16_t sme_check_concurrent_channel_overlap(tHalHandle hHal, uint16_t sap_ch,
7349 eCsrPhyMode sapPhyMode,
7350 uint8_t cc_switch_mode)
7351{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307352 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007353 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
7354 uint16_t channel = 0;
7355
7356 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307357 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007358 channel =
7359 csr_check_concurrent_channel_overlap(pMac, sap_ch, sapPhyMode,
7360 cc_switch_mode);
7361 sme_release_global_lock(&pMac->sme);
7362 }
7363
7364 return channel;
7365}
7366#endif
7367
7368#ifdef FEATURE_WLAN_SCAN_PNO
Varun Reddy Yeturub43fda12015-09-10 18:16:21 -07007369/**
7370 * sme_update_roam_pno_channel_prediction_config() - Update PNO config
Krunal Soni1878d3a2016-01-14 13:00:44 -08007371 * @csr_config: config from SME context
Varun Reddy Yeturub43fda12015-09-10 18:16:21 -07007372 * @hal: Global Hal handle
7373 * @copy_from_to: Used to specify the source and destination
7374 *
7375 * Copy the PNO channel prediction configuration parameters from
7376 * SME context to MAC context or vice-versa
7377 *
7378 * Return: None
7379 */
7380void sme_update_roam_pno_channel_prediction_config(
Krunal Soni1878d3a2016-01-14 13:00:44 -08007381 tHalHandle hal, tCsrConfigParam *csr_config,
Varun Reddy Yeturub43fda12015-09-10 18:16:21 -07007382 uint8_t copy_from_to)
7383{
7384 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
7385 if (copy_from_to == SME_CONFIG_TO_ROAM_CONFIG) {
7386 mac_ctx->roam.configParam.pno_channel_prediction =
Krunal Soni1878d3a2016-01-14 13:00:44 -08007387 csr_config->pno_channel_prediction;
Varun Reddy Yeturub43fda12015-09-10 18:16:21 -07007388 mac_ctx->roam.configParam.top_k_num_of_channels =
Krunal Soni1878d3a2016-01-14 13:00:44 -08007389 csr_config->top_k_num_of_channels;
Varun Reddy Yeturub43fda12015-09-10 18:16:21 -07007390 mac_ctx->roam.configParam.stationary_thresh =
Krunal Soni1878d3a2016-01-14 13:00:44 -08007391 csr_config->stationary_thresh;
Varun Reddy Yeturub43fda12015-09-10 18:16:21 -07007392 mac_ctx->roam.configParam.channel_prediction_full_scan =
Krunal Soni1878d3a2016-01-14 13:00:44 -08007393 csr_config->channel_prediction_full_scan;
Gupta, Kapil96c7f2f2016-04-25 19:13:41 +05307394 mac_ctx->roam.configParam.pnoscan_adaptive_dwell_mode =
7395 csr_config->pnoscan_adaptive_dwell_mode;
Varun Reddy Yeturub43fda12015-09-10 18:16:21 -07007396 } else if (copy_from_to == ROAM_CONFIG_TO_SME_CONFIG) {
Krunal Soni1878d3a2016-01-14 13:00:44 -08007397 csr_config->pno_channel_prediction =
Varun Reddy Yeturub43fda12015-09-10 18:16:21 -07007398 mac_ctx->roam.configParam.pno_channel_prediction;
Krunal Soni1878d3a2016-01-14 13:00:44 -08007399 csr_config->top_k_num_of_channels =
Varun Reddy Yeturub43fda12015-09-10 18:16:21 -07007400 mac_ctx->roam.configParam.top_k_num_of_channels;
Krunal Soni1878d3a2016-01-14 13:00:44 -08007401 csr_config->stationary_thresh =
Varun Reddy Yeturub43fda12015-09-10 18:16:21 -07007402 mac_ctx->roam.configParam.stationary_thresh;
Krunal Soni1878d3a2016-01-14 13:00:44 -08007403 csr_config->channel_prediction_full_scan =
Varun Reddy Yeturub43fda12015-09-10 18:16:21 -07007404 mac_ctx->roam.configParam.channel_prediction_full_scan;
Gupta, Kapil96c7f2f2016-04-25 19:13:41 +05307405 csr_config->pnoscan_adaptive_dwell_mode =
7406 mac_ctx->roam.configParam.pnoscan_adaptive_dwell_mode;
Varun Reddy Yeturub43fda12015-09-10 18:16:21 -07007407 }
7408
7409}
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007410/******************************************************************************
7411*
7412* Name: sme_preferred_network_found_ind
7413*
7414* Description:
7415* Invoke Preferred Network Found Indication
7416*
7417* Parameters:
7418* hHal - HAL handle for device
7419* pMsg - found network description
7420*
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307421* Returns: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007422*
7423******************************************************************************/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307424QDF_STATUS sme_preferred_network_found_ind(tHalHandle hHal, void *pMsg)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007425{
7426 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307427 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007428 tSirPrefNetworkFoundInd *pPrefNetworkFoundInd =
7429 (tSirPrefNetworkFoundInd *) pMsg;
7430 uint8_t dumpSsId[SIR_MAC_MAX_SSID_LENGTH + 1];
7431 uint8_t ssIdLength = 0;
7432
7433 if (NULL == pMsg) {
7434 sms_log(pMac, LOGE, "in %s msg ptr is NULL", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307435 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007436 }
7437
7438 if (pMac->pnoOffload) {
7439 /* Call Preferred Network Found Indication callback routine. */
7440 if (pMac->sme.pref_netw_found_cb != NULL) {
7441 pMac->sme.pref_netw_found_cb(pMac->sme.
7442 preferred_network_found_ind_cb_ctx,
7443 pPrefNetworkFoundInd);
7444 }
7445 return status;
7446 }
7447
7448 if (pPrefNetworkFoundInd->ssId.length > 0) {
7449 ssIdLength = CSR_MIN(SIR_MAC_MAX_SSID_LENGTH,
7450 pPrefNetworkFoundInd->ssId.length);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05307451 qdf_mem_copy(dumpSsId, pPrefNetworkFoundInd->ssId.ssId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007452 ssIdLength);
7453 dumpSsId[ssIdLength] = 0;
7454 sms_log(pMac, LOG2, "%s:SSID=%s frame length %d",
7455 __func__, dumpSsId, pPrefNetworkFoundInd->frameLength);
7456
7457 /* Flush scan results, So as to avoid indication/updation of
7458 * stale entries, which may not have aged out during APPS collapse
7459 */
7460 sme_scan_flush_result(hHal);
7461
7462 /* Save the frame to scan result */
7463 if (pPrefNetworkFoundInd->mesgLen >
7464 sizeof(tSirPrefNetworkFoundInd)) {
7465 /* we may have a frame */
7466 status = csr_scan_save_preferred_network_found(pMac,
7467 pPrefNetworkFoundInd);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307468 if (!QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007469 sms_log(pMac, LOGE,
7470 FL(" fail to save preferred network"));
7471 }
7472 } else {
7473 sms_log(pMac, LOGE,
7474 FL(" not enough data length %d needed %zu"),
7475 pPrefNetworkFoundInd->mesgLen,
7476 sizeof(tSirPrefNetworkFoundInd));
7477 }
7478
7479 /* Call Preferred Netowrk Found Indication callback routine. */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307480 if (QDF_IS_STATUS_SUCCESS(status)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007481 && (pMac->sme.pref_netw_found_cb != NULL)) {
7482 pMac->sme.pref_netw_found_cb(pMac->sme.
7483 preferred_network_found_ind_cb_ctx,
7484 pPrefNetworkFoundInd);
7485 }
7486 } else {
7487 sms_log(pMac, LOGE, "%s: callback failed - SSID is NULL",
7488 __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307489 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007490 }
7491
7492 return status;
7493}
7494
7495#endif /* FEATURE_WLAN_SCAN_PNO */
7496
Arun Khandavalli4b55da72016-07-19 19:55:01 +05307497/**
Manikandan Mohandcc21ba2016-03-15 14:31:56 -07007498 * sme_set_tsfcb() - Set callback for TSF capture
Manikandan Mohan976e7562016-03-15 16:33:31 -07007499 * @h_hal: Handler return by mac_open
Manikandan Mohandcc21ba2016-03-15 14:31:56 -07007500 * @cb_fn: Callback function pointer
7501 * @db_ctx: Callback data
7502 *
7503 * Return: QDF_STATUS
7504 */
Manikandan Mohan976e7562016-03-15 16:33:31 -07007505QDF_STATUS sme_set_tsfcb(tHalHandle h_hal,
Manikandan Mohandcc21ba2016-03-15 14:31:56 -07007506 int (*cb_fn)(void *cb_ctx, struct stsf *ptsf), void *cb_ctx)
7507{
Manikandan Mohan976e7562016-03-15 16:33:31 -07007508 tpAniSirGlobal mac = PMAC_STRUCT(h_hal);
Manikandan Mohandcc21ba2016-03-15 14:31:56 -07007509 QDF_STATUS status;
7510
Manikandan Mohan976e7562016-03-15 16:33:31 -07007511 status = sme_acquire_global_lock(&mac->sme);
Manikandan Mohandcc21ba2016-03-15 14:31:56 -07007512 if (QDF_IS_STATUS_SUCCESS(status)) {
Manikandan Mohan976e7562016-03-15 16:33:31 -07007513 mac->sme.get_tsf_cb = cb_fn;
7514 mac->sme.get_tsf_cxt = cb_ctx;
7515 sme_release_global_lock(&mac->sme);
Manikandan Mohandcc21ba2016-03-15 14:31:56 -07007516 }
7517 return status;
7518}
7519
Arun Khandavalli4b55da72016-07-19 19:55:01 +05307520/**
7521 * sme_reset_tsfcb() - Reset callback for TSF capture
7522 * @h_hal: Handler return by mac_open
7523 *
7524 * This function reset the tsf capture callback to SME
7525 *
7526 * Return: QDF_STATUS
7527 */
7528QDF_STATUS sme_reset_tsfcb(tHalHandle h_hal)
7529{
7530 tpAniSirGlobal mac;
7531 QDF_STATUS status;
7532
7533 if (!h_hal) {
7534 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
7535 FL("h_hal is not valid"));
7536 return QDF_STATUS_E_INVAL;
7537 }
7538 mac = PMAC_STRUCT(h_hal);
7539
7540 status = sme_acquire_global_lock(&mac->sme);
7541 if (QDF_IS_STATUS_SUCCESS(status)) {
7542 mac->sme.get_tsf_cb = NULL;
7543 mac->sme.get_tsf_cxt = NULL;
7544 sme_release_global_lock(&mac->sme);
7545 }
7546 return status;
7547}
7548
Manikandan Mohan976e7562016-03-15 16:33:31 -07007549#ifdef WLAN_FEATURE_TSF
7550/*
7551 * sme_set_tsf_gpio() - set gpio pin that be toggled when capture tef
7552 * @h_hal: Handler return by mac_open
7553 * @pinvalue: gpio pin id
7554 *
7555 * Return: QDF_STATUS
7556 */
7557QDF_STATUS sme_set_tsf_gpio(tHalHandle h_hal, uint32_t pinvalue)
7558{
7559 QDF_STATUS status;
7560 cds_msg_t tsf_msg = {0};
7561 tpAniSirGlobal mac = PMAC_STRUCT(h_hal);
7562
7563 status = sme_acquire_global_lock(&mac->sme);
7564 if (QDF_IS_STATUS_SUCCESS(status)) {
7565 tsf_msg.type = WMA_TSF_GPIO_PIN;
7566 tsf_msg.reserved = 0;
7567 tsf_msg.bodyval = pinvalue;
7568
7569 status = cds_mq_post_message(CDS_MQ_ID_WMA, &tsf_msg);
7570 if (!QDF_IS_STATUS_SUCCESS(status)) {
7571 sms_log(mac, LOGE, "Unable to post WMA_TSF_GPIO_PIN");
7572 status = QDF_STATUS_E_FAILURE;
7573 }
7574 sme_release_global_lock(&mac->sme);
7575 }
7576 return status;
7577}
7578#endif
7579
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307580QDF_STATUS sme_get_cfg_valid_channels(tHalHandle hHal, uint8_t *aValidChannels,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007581 uint32_t *len)
7582{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307583 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007584 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
7585
7586 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307587 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007588 status = csr_get_cfg_valid_channels(pMac, aValidChannels, len);
7589 sme_release_global_lock(&pMac->sme);
7590 }
7591
7592 return status;
7593}
7594
7595/* ---------------------------------------------------------------------------
7596
7597 \fn sme_handle_change_country_code
7598
7599 \brief Change Country code, Reg Domain and channel list
7600
7601 \details Country Code Priority
7602 If Supplicant country code is priority than 11d is disabled.
7603 If 11D is enabled, we update the country code after every scan.
7604 Hence when Supplicant country code is priority, we don't need 11D info.
7605 Country code from Supplicant is set as current courtry code.
7606 User can send reset command XX (instead of country code) to reset the
7607 country code to default values.
7608 If 11D is priority,
7609 Than Supplicant country code code is set to default code. But 11D code is set as current country code
7610
7611 \param pMac - The handle returned by mac_open.
7612 \param pMsgBuf - MSG Buffer
7613
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307614 \return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007615
7616 -------------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307617QDF_STATUS sme_handle_change_country_code(tpAniSirGlobal pMac, void *pMsgBuf)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007618{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307619 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007620 tAniChangeCountryCodeReq *pMsg;
7621 v_REGDOMAIN_t domainIdIoctl;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307622 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Amar Singhala297bfa2015-10-15 15:07:29 -07007623 static uint8_t default_country[CDS_COUNTRY_CODE_LEN + 1];
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007624 pMsg = (tAniChangeCountryCodeReq *) pMsgBuf;
7625
7626 /*
7627 * if the reset Supplicant country code command is triggered,
7628 * enable 11D, reset the country code and return
7629 */
Ankit Guptaa5076012016-09-14 11:32:19 -07007630 if (!qdf_mem_cmp(pMsg->countryCode, SME_INVALID_COUNTRY_CODE, 2)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007631 pMac->roam.configParam.Is11dSupportEnabled =
7632 pMac->roam.configParam.Is11dSupportEnabledOriginal;
7633
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307634 qdf_status = cds_read_default_country(default_country);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007635
7636 /* read the country code and use it */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307637 if (QDF_IS_STATUS_SUCCESS(qdf_status)) {
Anurag Chouhan600c3a02016-03-01 10:33:54 +05307638 qdf_mem_copy(pMsg->countryCode,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007639 default_country,
7640 WNI_CFG_COUNTRY_CODE_LEN);
7641 } else {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307642 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007643 return status;
7644 }
7645 /*
7646 * Update the 11d country to default country so that when
7647 * callback is received for this default country, driver will
7648 * not disable the 11d taking it as valid country by user.
7649 */
7650 sms_log(pMac, LOG1,
7651 FL("Set default country code (%c%c) as invalid country received"),
7652 pMsg->countryCode[0], pMsg->countryCode[1]);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05307653 qdf_mem_copy(pMac->scan.countryCode11d,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007654 pMsg->countryCode,
7655 WNI_CFG_COUNTRY_CODE_LEN);
7656 } else {
7657 /* if Supplicant country code has priority, disable 11d */
7658 if (pMac->roam.configParam.fSupplicantCountryCodeHasPriority &&
7659 pMsg->countryFromUserSpace) {
7660 pMac->roam.configParam.Is11dSupportEnabled = false;
7661 }
7662 }
7663
7664 if (pMac->roam.configParam.Is11dSupportEnabled)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307665 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007666
7667 /* Set Current Country code and Current Regulatory domain */
7668 status = csr_set_country_code(pMac, pMsg->countryCode);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307669 if (QDF_STATUS_SUCCESS != status) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007670 /* Supplicant country code failed. So give 11D priority */
7671 pMac->roam.configParam.Is11dSupportEnabled =
7672 pMac->roam.configParam.Is11dSupportEnabledOriginal;
7673 sms_log(pMac, LOGE, "Set Country Code Fail %d", status);
7674 return status;
7675 }
7676
7677 /* overwrite the defualt country code */
Anurag Chouhan600c3a02016-03-01 10:33:54 +05307678 qdf_mem_copy(pMac->scan.countryCodeDefault,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007679 pMac->scan.countryCodeCurrent, WNI_CFG_COUNTRY_CODE_LEN);
7680
7681 /* Get Domain ID from country code */
7682 status = csr_get_regulatory_domain_for_country(pMac,
7683 pMac->scan.countryCodeCurrent,
7684 (v_REGDOMAIN_t *) &
Amar Singhala297bfa2015-10-15 15:07:29 -07007685 domainIdIoctl,
7686 SOURCE_QUERY);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307687 if (status != QDF_STATUS_SUCCESS) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007688 sms_log(pMac, LOGE, FL(" fail to get regId %d"), domainIdIoctl);
7689 return status;
7690 } else if (REGDOMAIN_WORLD == domainIdIoctl) {
7691 /* Supplicant country code is invalid, so we are on world mode now. So
7692 give 11D chance to update */
7693 pMac->roam.configParam.Is11dSupportEnabled =
7694 pMac->roam.configParam.Is11dSupportEnabledOriginal;
7695 sms_log(pMac, LOG1, FL("Country Code unrecognized by driver"));
7696 }
7697
7698 status = wma_set_reg_domain(pMac, domainIdIoctl);
7699
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307700 if (status != QDF_STATUS_SUCCESS) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007701 sms_log(pMac, LOGE, FL(" fail to set regId %d"), domainIdIoctl);
7702 return status;
7703 } else {
7704 /* if 11d has priority, clear currentCountryBssid & countryCode11d to get */
7705 /* set again if we find AP with 11d info during scan */
7706 if (!pMac->roam.configParam.fSupplicantCountryCodeHasPriority) {
7707 sms_log(pMac, LOGW,
7708 FL
7709 ("Clearing currentCountryBssid, countryCode11d"));
Anurag Chouhan600c3a02016-03-01 10:33:54 +05307710 qdf_mem_zero(&pMac->scan.currentCountryBssid,
Anurag Chouhan6d760662016-02-20 16:05:43 +05307711 sizeof(struct qdf_mac_addr));
Anurag Chouhan600c3a02016-03-01 10:33:54 +05307712 qdf_mem_zero(pMac->scan.countryCode11d,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007713 sizeof(pMac->scan.countryCode11d));
7714 }
7715 }
7716
7717 if (pMsg->changeCCCallback) {
7718 ((tSmeChangeCountryCallback) (pMsg->changeCCCallback))((void *)
7719 pMsg->
7720 pDevContext);
7721 }
7722
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307723 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007724}
7725
7726/**
Amar Singhal7f1f3ec2015-10-13 17:14:08 -07007727 * sme_handle_generic_change_country_code() - handles country ch req
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007728 * @mac_ctx: mac global context
7729 * @msg: request msg packet
7730 *
7731 * If Supplicant country code is priority than 11d is disabled.
7732 * If 11D is enabled, we update the country code after every scan.
7733 * Hence when Supplicant country code is priority, we don't need 11D info.
7734 * Country code from Supplicant is set as current country code.
7735 *
7736 * Return: status of operation
7737 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307738QDF_STATUS
Amar Singhal7f1f3ec2015-10-13 17:14:08 -07007739sme_handle_generic_change_country_code(tpAniSirGlobal mac_ctx,
7740 void *pMsgBuf)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007741{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307742 QDF_STATUS status = QDF_STATUS_SUCCESS;
Amar Singhal7f1f3ec2015-10-13 17:14:08 -07007743 v_REGDOMAIN_t reg_domain_id = 0;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007744 bool is_11d_country = false;
7745 bool supplicant_priority =
7746 mac_ctx->roam.configParam.fSupplicantCountryCodeHasPriority;
Amar Singhal7f1f3ec2015-10-13 17:14:08 -07007747 tAniGenericChangeCountryCodeReq *msg = pMsgBuf;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007748
7749 sms_log(mac_ctx, LOG1, FL(" called"));
Amar Singhal7f1f3ec2015-10-13 17:14:08 -07007750
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007751 if (memcmp(msg->countryCode, mac_ctx->scan.countryCode11d,
7752 CDS_COUNTRY_CODE_LEN) == 0) {
7753 is_11d_country = true;
7754 }
7755 /* Set the country code given by userspace when 11dOriginal is false
7756 * when 11doriginal is True,is_11d_country =0 and
7757 * fSupplicantCountryCodeHasPriority = 0, then revert the country code,
7758 * and return failure
7759 */
7760 if (mac_ctx->roam.configParam.Is11dSupportEnabledOriginal == true
7761 && !is_11d_country && !supplicant_priority) {
7762 sms_log(mac_ctx, LOGW,
7763 FL("Incorrect country req, nullify this"));
7764
7765 /* we have got a request for a country that should not have been
7766 * added since the STA is associated; nullify this request. If
7767 * both countryCode11d[0] and countryCode11d[1] are zero, revert
7768 * it to World domain to avoid from causing cfg80211 call trace.
7769 */
7770 if ((mac_ctx->scan.countryCode11d[0] == 0)
7771 && (mac_ctx->scan.countryCode11d[1] == 0))
7772 status = csr_get_regulatory_domain_for_country(mac_ctx,
7773 "00", (v_REGDOMAIN_t *) &reg_domain_id,
Amar Singhala297bfa2015-10-15 15:07:29 -07007774 SOURCE_11D);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007775 else
7776 status = csr_get_regulatory_domain_for_country(mac_ctx,
7777 mac_ctx->scan.countryCode11d,
7778 (v_REGDOMAIN_t *) &reg_domain_id,
Amar Singhala297bfa2015-10-15 15:07:29 -07007779 SOURCE_11D);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007780
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307781 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007782 }
Amar Singhal7f1f3ec2015-10-13 17:14:08 -07007783
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007784 /* if Supplicant country code has priority, disable 11d */
7785 if (!is_11d_country && supplicant_priority)
7786 mac_ctx->roam.configParam.Is11dSupportEnabled = false;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05307787 qdf_mem_copy(mac_ctx->scan.countryCodeCurrent, msg->countryCode,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007788 WNI_CFG_COUNTRY_CODE_LEN);
7789 status = wma_set_reg_domain(mac_ctx, reg_domain_id);
7790 if (false == is_11d_country) {
7791 /* overwrite the defualt country code */
Anurag Chouhan600c3a02016-03-01 10:33:54 +05307792 qdf_mem_copy(mac_ctx->scan.countryCodeDefault,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007793 mac_ctx->scan.countryCodeCurrent,
7794 WNI_CFG_COUNTRY_CODE_LEN);
7795 /* set to default domain ID */
7796 mac_ctx->scan.domainIdDefault = mac_ctx->scan.domainIdCurrent;
7797 }
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307798 if (status != QDF_STATUS_SUCCESS) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007799 sms_log(mac_ctx, LOGE, FL("fail to set regId %d"),
7800 reg_domain_id);
7801 return status;
7802 } else {
7803 /* if 11d has priority, clear currentCountryBssid &
7804 * countryCode11d to get set again if we find AP with 11d info
7805 * during scan
7806 */
7807 if (!supplicant_priority && (false == is_11d_country)) {
7808 sms_log(mac_ctx, LOGW,
7809 FL("Clearing currentCountryBssid, countryCode11d"));
Anurag Chouhan600c3a02016-03-01 10:33:54 +05307810 qdf_mem_zero(&mac_ctx->scan.currentCountryBssid,
Anurag Chouhan6d760662016-02-20 16:05:43 +05307811 sizeof(struct qdf_mac_addr));
Anurag Chouhan600c3a02016-03-01 10:33:54 +05307812 qdf_mem_zero(mac_ctx->scan.countryCode11d,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007813 sizeof(mac_ctx->scan.countryCode11d));
7814 }
7815 }
7816 /* get the channels based on new cc */
7817 status = csr_get_channel_and_power_list(mac_ctx);
7818
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307819 if (status != QDF_STATUS_SUCCESS) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007820 sms_log(mac_ctx, LOGE, FL("fail to get Channels"));
7821 return status;
7822 }
7823 /* reset info based on new cc, and we are done */
7824 csr_apply_channel_power_info_wrapper(mac_ctx);
7825
7826 /* Country code Changed, Purge Only scan result
7827 * which does not have channel number belong to 11d
7828 * channel list
7829 */
7830 csr_scan_filter_results(mac_ctx);
7831 /* Do active scans after the country is set by User hints or
7832 * Country IE
7833 */
7834 mac_ctx->scan.curScanType = eSIR_ACTIVE_SCAN;
7835 sme_disconnect_connected_sessions(mac_ctx);
7836 sms_log(mac_ctx, LOG1, FL(" returned"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307837 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007838}
7839
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007840static bool
7841sme_search_in_base_ch_lst(tpAniSirGlobal mac_ctx, uint8_t curr_ch)
7842{
7843 uint8_t i;
7844 tCsrChannel *ch_lst_info;
7845 ch_lst_info = &mac_ctx->scan.base_channels;
7846 for (i = 0; i < ch_lst_info->numChannels; i++) {
7847 if (ch_lst_info->channelList[i] == curr_ch)
7848 return true;
7849 }
7850
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007851 return false;
7852}
7853/**
7854 * sme_disconnect_connected_sessions() - Disconnect STA and P2P client session
7855 * if channel is not supported
7856 * @mac_ctx: mac global context
7857 *
7858 * If new country code does not support the channel on which STA/P2P client
7859 * is connetced, it sends the disconnect to the AP/P2P GO
7860 *
7861 * Return: void
7862 */
7863void sme_disconnect_connected_sessions(tpAniSirGlobal mac_ctx)
7864{
7865 uint8_t session_id, found = false;
7866 uint8_t curr_ch;
7867
7868 for (session_id = 0; session_id < CSR_ROAM_SESSION_MAX; session_id++) {
7869 if (!csr_is_session_client_and_connected(mac_ctx, session_id))
7870 continue;
7871 found = false;
7872 /* Session is connected.Check the channel */
7873 curr_ch = csr_get_infra_operation_channel(mac_ctx,
7874 session_id);
7875 sms_log(mac_ctx, LOGW,
7876 FL("Current Operating channel : %d, session :%d"),
7877 curr_ch, session_id);
7878 found = sme_search_in_base_ch_lst(mac_ctx, curr_ch);
7879 if (!found) {
7880 sms_log(mac_ctx, LOGW, FL("Disconnect Session :%d"),
7881 session_id);
7882 csr_roam_disconnect(mac_ctx, session_id,
7883 eCSR_DISCONNECT_REASON_UNSPECIFIED);
7884 }
7885 }
7886}
7887
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007888#ifdef WLAN_FEATURE_PACKET_FILTERING
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307889QDF_STATUS sme_8023_multicast_list(tHalHandle hHal, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007890 tpSirRcvFltMcAddrList pMulticastAddrs)
7891{
7892 tpSirRcvFltMcAddrList request_buf;
7893 cds_msg_t msg;
7894 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
7895 tCsrRoamSession *pSession = NULL;
7896
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05307897 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO, "%s: "
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007898 "ulMulticastAddrCnt=%d, multicastAddr[0]=%p", __func__,
7899 pMulticastAddrs->ulMulticastAddrCnt,
Srinivas Girigowda98530492015-11-20 17:39:24 -08007900 pMulticastAddrs->multicastAddr[0].bytes);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007901
Ravi Joshi4f447cb2016-07-19 13:42:01 -07007902 /* Find the connected Infra / P2P_client connected session */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007903 if (CSR_IS_SESSION_VALID(pMac, sessionId) &&
Ravi Joshi4f447cb2016-07-19 13:42:01 -07007904 (csr_is_conn_state_infra(pMac, sessionId) ||
7905 csr_is_ndi_started(pMac, sessionId))) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007906 pSession = CSR_GET_SESSION(pMac, sessionId);
7907 }
7908
7909 if (pSession == NULL) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05307910 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_WARN,
Srinivas Girigowdaf2599dd2015-11-16 18:20:46 -08007911 "%s: Unable to find the session Id: %d", __func__,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007912 sessionId);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307913 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007914 }
7915
Anurag Chouhan600c3a02016-03-01 10:33:54 +05307916 request_buf = qdf_mem_malloc(sizeof(tSirRcvFltMcAddrList));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007917 if (NULL == request_buf) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05307918 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007919 "%s: Not able to "
7920 "allocate memory for 8023 Multicast List request",
7921 __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307922 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007923 }
7924
Ravi Joshi4f447cb2016-07-19 13:42:01 -07007925 if (!csr_is_conn_state_connected_infra(pMac, sessionId) &&
7926 !csr_is_ndi_started(pMac, sessionId)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05307927 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Ravi Joshi4f447cb2016-07-19 13:42:01 -07007928 "%s: Request ignored, session %d is not connected or started",
7929 __func__, sessionId);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05307930 qdf_mem_free(request_buf);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307931 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007932 }
7933
Anurag Chouhan600c3a02016-03-01 10:33:54 +05307934 qdf_mem_copy(request_buf, pMulticastAddrs,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007935 sizeof(tSirRcvFltMcAddrList));
7936
Anurag Chouhanc5548422016-02-24 18:33:27 +05307937 qdf_copy_macaddr(&request_buf->self_macaddr, &pSession->selfMacAddr);
7938 qdf_copy_macaddr(&request_buf->bssid,
Srinivas Girigowda98530492015-11-20 17:39:24 -08007939 &pSession->connectedProfile.bssid);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007940
7941 msg.type = WMA_8023_MULTICAST_LIST_REQ;
7942 msg.reserved = 0;
7943 msg.bodyptr = request_buf;
Sreelakshmi Konamki6a065362016-05-31 16:05:01 +05307944 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
7945 sessionId, msg.type));
Anurag Chouhan6d760662016-02-20 16:05:43 +05307946 if (QDF_STATUS_SUCCESS != cds_mq_post_message(QDF_MODULE_ID_WMA, &msg)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05307947 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007948 "%s: Not able to "
7949 "post WMA_8023_MULTICAST_LIST message to WMA",
7950 __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05307951 qdf_mem_free(request_buf);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307952 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007953 }
7954
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307955 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007956}
7957
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307958QDF_STATUS sme_receive_filter_set_filter(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007959 tpSirRcvPktFilterCfgType pRcvPktFilterCfg,
7960 uint8_t sessionId)
7961{
7962 tpSirRcvPktFilterCfgType request_buf;
7963 int32_t allocSize;
7964 cds_msg_t msg;
7965 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
7966 tCsrRoamSession *pSession = CSR_GET_SESSION(pMac, sessionId);
7967 uint8_t idx = 0;
7968
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05307969 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO, "%s: filterType=%d, "
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007970 "filterId = %d", __func__,
7971 pRcvPktFilterCfg->filterType, pRcvPktFilterCfg->filterId);
7972
7973 allocSize = sizeof(tSirRcvPktFilterCfgType);
7974
Anurag Chouhan600c3a02016-03-01 10:33:54 +05307975 request_buf = qdf_mem_malloc(allocSize);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007976
7977 if (NULL == request_buf) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05307978 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007979 "%s: Not able to "
7980 "allocate memory for Receive Filter Set Filter request",
7981 __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307982 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007983 }
7984
7985 if (NULL == pSession) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05307986 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007987 "%s: Session Not found ", __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05307988 qdf_mem_free(request_buf);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307989 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007990 }
7991
Anurag Chouhanc5548422016-02-24 18:33:27 +05307992 qdf_copy_macaddr(&pRcvPktFilterCfg->self_macaddr,
Srinivas Girigowda98530492015-11-20 17:39:24 -08007993 &pSession->selfMacAddr);
Anurag Chouhanc5548422016-02-24 18:33:27 +05307994 qdf_copy_macaddr(&pRcvPktFilterCfg->bssid,
Srinivas Girigowda98530492015-11-20 17:39:24 -08007995 &pSession->connectedProfile.bssid);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05307996 qdf_mem_copy(request_buf, pRcvPktFilterCfg, allocSize);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007997
7998 msg.type = WMA_RECEIVE_FILTER_SET_FILTER_REQ;
7999 msg.reserved = 0;
8000 msg.bodyptr = request_buf;
Sreelakshmi Konamki6a065362016-05-31 16:05:01 +05308001 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
8002 sessionId, msg.type));
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308003 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO, "Pkt Flt Req : "
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008004 "FT %d FID %d ",
8005 request_buf->filterType, request_buf->filterId);
8006
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308007 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO, "Pkt Flt Req : "
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008008 "params %d CT %d",
8009 request_buf->numFieldParams, request_buf->coalesceTime);
8010
8011 for (idx = 0; idx < request_buf->numFieldParams; idx++) {
8012
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308013 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008014 "Proto %d Comp Flag %d ",
8015 request_buf->paramsData[idx].protocolLayer,
8016 request_buf->paramsData[idx].cmpFlag);
8017
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308018 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008019 "Data Offset %d Data Len %d",
8020 request_buf->paramsData[idx].dataOffset,
8021 request_buf->paramsData[idx].dataLength);
8022
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308023 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008024 "CData: %d:%d:%d:%d:%d:%d",
8025 request_buf->paramsData[idx].compareData[0],
8026 request_buf->paramsData[idx].compareData[1],
8027 request_buf->paramsData[idx].compareData[2],
8028 request_buf->paramsData[idx].compareData[3],
8029 request_buf->paramsData[idx].compareData[4],
8030 request_buf->paramsData[idx].compareData[5]);
8031
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308032 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008033 "MData: %d:%d:%d:%d:%d:%d",
8034 request_buf->paramsData[idx].dataMask[0],
8035 request_buf->paramsData[idx].dataMask[1],
8036 request_buf->paramsData[idx].dataMask[2],
8037 request_buf->paramsData[idx].dataMask[3],
8038 request_buf->paramsData[idx].dataMask[4],
8039 request_buf->paramsData[idx].dataMask[5]);
8040
8041 }
8042
Anurag Chouhan6d760662016-02-20 16:05:43 +05308043 if (QDF_STATUS_SUCCESS != cds_mq_post_message(QDF_MODULE_ID_WMA, &msg)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308044 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008045 "%s: Not able to post "
8046 "WMA_RECEIVE_FILTER_SET_FILTER message to WMA",
8047 __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308048 qdf_mem_free(request_buf);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308049 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008050 }
8051
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308052 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008053}
8054
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308055QDF_STATUS sme_receive_filter_clear_filter(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008056 tpSirRcvFltPktClearParam
8057 pRcvFltPktClearParam, uint8_t sessionId)
8058{
8059 tpSirRcvFltPktClearParam request_buf;
8060 cds_msg_t msg;
8061 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
8062 tCsrRoamSession *pSession = CSR_GET_SESSION(pMac, sessionId);
8063
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308064 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO, "%s: filterId = %d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008065 __func__, pRcvFltPktClearParam->filterId);
8066
Srinivas Girigowda98530492015-11-20 17:39:24 -08008067 if (NULL == pSession) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308068 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Srinivas Girigowda98530492015-11-20 17:39:24 -08008069 "%s: Session Not found", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308070 return QDF_STATUS_E_FAILURE;
Srinivas Girigowda98530492015-11-20 17:39:24 -08008071 }
8072
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308073 request_buf = qdf_mem_malloc(sizeof(tSirRcvFltPktClearParam));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008074 if (NULL == request_buf) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308075 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008076 "%s: Not able to allocate memory for Receive Filter "
8077 "Clear Filter request", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308078 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008079 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008080
Anurag Chouhanc5548422016-02-24 18:33:27 +05308081 qdf_copy_macaddr(&pRcvFltPktClearParam->self_macaddr,
Srinivas Girigowda98530492015-11-20 17:39:24 -08008082 &pSession->selfMacAddr);
Anurag Chouhanc5548422016-02-24 18:33:27 +05308083 qdf_copy_macaddr(&pRcvFltPktClearParam->bssid,
Srinivas Girigowda98530492015-11-20 17:39:24 -08008084 &pSession->connectedProfile.bssid);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008085
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308086 qdf_mem_copy(request_buf, pRcvFltPktClearParam,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008087 sizeof(tSirRcvFltPktClearParam));
8088
8089 msg.type = WMA_RECEIVE_FILTER_CLEAR_FILTER_REQ;
8090 msg.reserved = 0;
8091 msg.bodyptr = request_buf;
Sreelakshmi Konamki6a065362016-05-31 16:05:01 +05308092 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
8093 sessionId, msg.type));
Anurag Chouhan6d760662016-02-20 16:05:43 +05308094 if (QDF_STATUS_SUCCESS != cds_mq_post_message(QDF_MODULE_ID_WMA, &msg)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308095 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008096 "%s: Not able to post "
8097 "WMA_RECEIVE_FILTER_CLEAR_FILTER message to WMA",
8098 __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308099 qdf_mem_free(request_buf);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308100 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008101 }
8102
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308103 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008104}
8105#endif /* WLAN_FEATURE_PACKET_FILTERING */
8106
8107/* ---------------------------------------------------------------------------
8108
8109 \fn sme_is_channel_valid
8110
8111 \brief To check if the channel is valid for currently established domain
8112 This is a synchronous API.
8113
8114 \param hHal - The handle returned by mac_open.
8115 \param channel - channel to verify
8116
8117 \return true/false, true if channel is valid
8118
8119 -------------------------------------------------------------------------------*/
8120bool sme_is_channel_valid(tHalHandle hHal, uint8_t channel)
8121{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308122 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008123 bool valid = false;
8124 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
8125
8126 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308127 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008128
8129 valid = csr_roam_is_channel_valid(pMac, channel);
8130
8131 sme_release_global_lock(&pMac->sme);
8132 }
8133
8134 return valid;
8135}
8136
8137/* ---------------------------------------------------------------------------
8138 \fn sme_set_freq_band
8139 \brief Used to set frequency band.
8140 \param hHal
8141 \param sessionId - Session Identifier
8142 \eBand band value to be configured
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308143 \- return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008144 -------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308145QDF_STATUS sme_set_freq_band(tHalHandle hHal, uint8_t sessionId, eCsrBand eBand)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008146{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308147 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008148 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
8149
8150 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308151 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008152 status = csr_set_band(hHal, sessionId, eBand);
8153 sme_release_global_lock(&pMac->sme);
8154 }
8155 return status;
8156}
8157
8158/* ---------------------------------------------------------------------------
8159 \fn sme_get_freq_band
8160 \brief Used to get the current band settings.
8161 \param hHal
8162 \pBand pointer to hold band value
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308163 \- return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008164 -------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308165QDF_STATUS sme_get_freq_band(tHalHandle hHal, eCsrBand *pBand)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008166{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308167 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008168 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
8169
8170 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308171 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008172 *pBand = csr_get_current_band(hHal);
8173 sme_release_global_lock(&pMac->sme);
8174 }
8175 return status;
8176}
8177
8178/* ---------------------------------------------------------------------------
8179 \fn sme_set_max_tx_power_per_band
8180
8181 \brief Set the Maximum Transmit Power specific to band dynamically.
8182 Note: this setting will not persist over reboots.
8183
8184 \param band
8185 \param power to set in dB
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308186 \- return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008187
8188 ----------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308189QDF_STATUS sme_set_max_tx_power_per_band(eCsrBand band, int8_t dB)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008190{
8191 cds_msg_t msg;
8192 tpMaxTxPowerPerBandParams pMaxTxPowerPerBandParams = NULL;
8193
8194 pMaxTxPowerPerBandParams =
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308195 qdf_mem_malloc(sizeof(tMaxTxPowerPerBandParams));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008196 if (NULL == pMaxTxPowerPerBandParams) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308197 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008198 "%s:Not able to allocate memory for pMaxTxPowerPerBandParams",
8199 __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308200 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008201 }
8202
8203 pMaxTxPowerPerBandParams->power = dB;
8204 pMaxTxPowerPerBandParams->bandInfo = band;
8205
8206 msg.type = WMA_SET_MAX_TX_POWER_PER_BAND_REQ;
8207 msg.reserved = 0;
8208 msg.bodyptr = pMaxTxPowerPerBandParams;
Sreelakshmi Konamki6a065362016-05-31 16:05:01 +05308209 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
8210 NO_SESSION, msg.type));
Anurag Chouhan6d760662016-02-20 16:05:43 +05308211 if (QDF_STATUS_SUCCESS != cds_mq_post_message(QDF_MODULE_ID_WMA, &msg)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308212 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008213 "%s:Not able to post WMA_SET_MAX_TX_POWER_PER_BAND_REQ",
8214 __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308215 qdf_mem_free(pMaxTxPowerPerBandParams);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308216 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008217 }
8218
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308219 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008220}
8221
8222/* ---------------------------------------------------------------------------
8223
8224 \fn sme_set_max_tx_power
8225
8226 \brief Set the Maximum Transmit Power dynamically. Note: this setting will
8227 not persist over reboots.
8228
8229 \param hHal
8230 \param pBssid BSSID to set the power cap for
8231 \param pBssid pSelfMacAddress self MAC Address
8232 \param pBssid power to set in dB
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308233 \- return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008234
8235 -------------------------------------------------------------------------------*/
Anurag Chouhan6d760662016-02-20 16:05:43 +05308236QDF_STATUS sme_set_max_tx_power(tHalHandle hHal, struct qdf_mac_addr pBssid,
8237 struct qdf_mac_addr pSelfMacAddress, int8_t dB)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008238{
8239 cds_msg_t msg;
8240 tpMaxTxPowerParams pMaxTxParams = NULL;
8241
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308242 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008243 TRACE_CODE_SME_RX_HDD_SET_MAXTXPOW, NO_SESSION, 0));
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308244 pMaxTxParams = qdf_mem_malloc(sizeof(tMaxTxPowerParams));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008245 if (NULL == pMaxTxParams) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308246 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008247 "%s: Not able to allocate memory for pMaxTxParams",
8248 __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308249 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008250 }
8251
Anurag Chouhanc5548422016-02-24 18:33:27 +05308252 qdf_copy_macaddr(&pMaxTxParams->bssId, &pBssid);
8253 qdf_copy_macaddr(&pMaxTxParams->selfStaMacAddr, &pSelfMacAddress);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008254 pMaxTxParams->power = dB;
8255
8256 msg.type = WMA_SET_MAX_TX_POWER_REQ;
8257 msg.reserved = 0;
8258 msg.bodyptr = pMaxTxParams;
8259
Anurag Chouhan6d760662016-02-20 16:05:43 +05308260 if (QDF_STATUS_SUCCESS != cds_mq_post_message(QDF_MODULE_ID_WMA, &msg)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308261 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008262 "%s: Not able to post WMA_SET_MAX_TX_POWER_REQ message to WMA",
8263 __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308264 qdf_mem_free(pMaxTxParams);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308265 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008266 }
8267
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308268 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008269}
8270
8271/* ---------------------------------------------------------------------------
8272
8273 \fn sme_set_custom_mac_addr
8274
8275 \brief Set the customer Mac Address.
8276
8277 \param customMacAddr customer MAC Address
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308278 \- return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008279
8280 ---------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308281QDF_STATUS sme_set_custom_mac_addr(tSirMacAddr customMacAddr)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008282{
8283 cds_msg_t msg;
8284 tSirMacAddr *pBaseMacAddr;
8285
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308286 pBaseMacAddr = qdf_mem_malloc(sizeof(tSirMacAddr));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008287 if (NULL == pBaseMacAddr) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308288 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008289 FL("Not able to allocate memory for pBaseMacAddr"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308290 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008291 }
8292
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308293 qdf_mem_copy(*pBaseMacAddr, customMacAddr, sizeof(tSirMacAddr));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008294
8295 msg.type = SIR_HAL_SET_BASE_MACADDR_IND;
8296 msg.reserved = 0;
8297 msg.bodyptr = pBaseMacAddr;
8298
Anurag Chouhan6d760662016-02-20 16:05:43 +05308299 if (QDF_STATUS_SUCCESS != cds_mq_post_message(QDF_MODULE_ID_WMA, &msg)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308300 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008301 FL
8302 ("Not able to post SIR_HAL_SET_BASE_MACADDR_IND message to WMA"));
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308303 qdf_mem_free(pBaseMacAddr);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308304 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008305 }
8306
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308307 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008308}
8309
8310/* ----------------------------------------------------------------------------
8311 \fn sme_set_tx_power
8312 \brief Set Transmit Power dynamically.
8313 \param hHal
8314 \param sessionId Target Session ID
8315 \pBSSId BSSID
8316 \dev_mode dev_mode such as station, P2PGO, SAP
8317 \param dBm power to set
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308318 \- return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008319 ---------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308320QDF_STATUS sme_set_tx_power(tHalHandle hHal, uint8_t sessionId,
Anurag Chouhan6d760662016-02-20 16:05:43 +05308321 struct qdf_mac_addr pBSSId,
8322 enum tQDF_ADAPTER_MODE dev_mode, int dBm)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008323{
8324 cds_msg_t msg;
8325 tpMaxTxPowerParams pTxParams = NULL;
8326 int8_t power = (int8_t) dBm;
8327
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308328 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008329 TRACE_CODE_SME_RX_HDD_SET_TXPOW, sessionId, 0));
8330
8331 /* make sure there is no overflow */
8332 if ((int)power != dBm) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308333 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008334 "%s: error, invalid power = %d", __func__, dBm);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308335 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008336 }
8337
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308338 pTxParams = qdf_mem_malloc(sizeof(tMaxTxPowerParams));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008339 if (NULL == pTxParams) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308340 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008341 "%s: Not able to allocate memory for pTxParams",
8342 __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308343 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008344 }
8345
Anurag Chouhanc5548422016-02-24 18:33:27 +05308346 qdf_copy_macaddr(&pTxParams->bssId, &pBSSId);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008347 pTxParams->power = power; /* unit is dBm */
8348 pTxParams->dev_mode = dev_mode;
8349 msg.type = WMA_SET_TX_POWER_REQ;
8350 msg.reserved = 0;
8351 msg.bodyptr = pTxParams;
8352
Anurag Chouhan6d760662016-02-20 16:05:43 +05308353 if (QDF_STATUS_SUCCESS != cds_mq_post_message(QDF_MODULE_ID_WMA, &msg)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308354 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008355 "%s: failed to post WMA_SET_TX_POWER_REQ to WMA",
8356 __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308357 qdf_mem_free(pTxParams);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308358 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008359 }
8360
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308361 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008362}
8363
Selvaraj, Sridhar7231c5f2016-09-28 12:42:33 +05308364QDF_STATUS sme_update_session_param(tHalHandle hal, uint8_t session_id,
8365 uint32_t param_type, uint32_t param_val)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008366{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308367 QDF_STATUS status = QDF_STATUS_SUCCESS;
Selvaraj, Sridhar7231c5f2016-09-28 12:42:33 +05308368 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008369 uint16_t len;
8370
Selvaraj, Sridhar7231c5f2016-09-28 12:42:33 +05308371 status = sme_acquire_global_lock(&mac_ctx->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308372 if (QDF_IS_STATUS_SUCCESS(status)) {
Selvaraj, Sridhar7231c5f2016-09-28 12:42:33 +05308373 struct sir_update_session_param *msg;
8374 tCsrRoamSession *session = CSR_GET_SESSION(mac_ctx, session_id);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008375
Selvaraj, Sridhar7231c5f2016-09-28 12:42:33 +05308376 if (!session) {
8377 sms_log(mac_ctx, LOGE, FL("session %d not found"),
8378 session_id);
8379 sme_release_global_lock(&mac_ctx->sme);
8380 return status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008381 }
8382
Selvaraj, Sridhar7231c5f2016-09-28 12:42:33 +05308383 if (!session->sessionActive)
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308384 QDF_ASSERT(0);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008385
Selvaraj, Sridhar7231c5f2016-09-28 12:42:33 +05308386 len = sizeof(*msg);
8387 msg = qdf_mem_malloc(len);
8388 if (!msg)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308389 status = QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008390 else {
Selvaraj, Sridhar7231c5f2016-09-28 12:42:33 +05308391 msg->message_type = eWNI_SME_SESSION_UPDATE_PARAM;
8392 msg->length = len;
8393 msg->session_id = session_id;
8394 msg->param_type = param_type;
8395 msg->param_val = param_val;
8396 status = cds_send_mb_message_to_mac(msg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008397 }
Selvaraj, Sridhar7231c5f2016-09-28 12:42:33 +05308398 sme_release_global_lock(&mac_ctx->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008399 }
8400 return status;
8401}
8402
8403/* ---------------------------------------------------------------------------
8404
8405 \fn sme_set_tm_level
8406 \brief Set Thermal Mitigation Level to RIVA
8407 \param hHal - The handle returned by mac_open.
8408 \param newTMLevel - new Thermal Mitigation Level
8409 \param tmMode - Thermal Mitigation handle mode, default 0
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308410 \return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008411 ---------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308412QDF_STATUS sme_set_tm_level(tHalHandle hHal, uint16_t newTMLevel, uint16_t tmMode)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008413{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308414 QDF_STATUS status = QDF_STATUS_SUCCESS;
8415 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008416 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
8417 cds_msg_t cds_message;
8418 tAniSetTmLevelReq *setTmLevelReq = NULL;
8419
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308420 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008421 TRACE_CODE_SME_RX_HDD_SET_TMLEVEL, NO_SESSION, 0));
8422 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308423 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008424 setTmLevelReq =
8425 (tAniSetTmLevelReq *)
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308426 qdf_mem_malloc(sizeof(tAniSetTmLevelReq));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008427 if (NULL == setTmLevelReq) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308428 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008429 "%s: Not able to allocate memory for sme_set_tm_level",
8430 __func__);
8431 sme_release_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308432 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008433 }
8434
8435 setTmLevelReq->tmMode = tmMode;
8436 setTmLevelReq->newTmLevel = newTMLevel;
8437
8438 /* serialize the req through MC thread */
8439 cds_message.bodyptr = setTmLevelReq;
8440 cds_message.type = WMA_SET_TM_LEVEL_REQ;
Sreelakshmi Konamki6a065362016-05-31 16:05:01 +05308441 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
8442 NO_SESSION, cds_message.type));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308443 qdf_status = cds_mq_post_message(CDS_MQ_ID_WMA, &cds_message);
8444 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308445 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008446 "%s: Post Set TM Level MSG fail", __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308447 qdf_mem_free(setTmLevelReq);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308448 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008449 }
8450 sme_release_global_lock(&pMac->sme);
8451 }
8452 return status;
8453}
8454
8455/*---------------------------------------------------------------------------
8456
8457 \brief sme_feature_caps_exchange() - SME interface to exchange capabilities between
8458 Host and FW.
8459
8460 \param hHal - HAL handle for device
8461
8462 \return NONE
8463
8464 ---------------------------------------------------------------------------*/
8465void sme_feature_caps_exchange(tHalHandle hHal)
8466{
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308467 MTRACE(qdf_trace
Anurag Chouhan6d760662016-02-20 16:05:43 +05308468 (QDF_MODULE_ID_SME, TRACE_CODE_SME_RX_HDD_CAPS_EXCH, NO_SESSION,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008469 0));
8470}
8471
8472/*---------------------------------------------------------------------------
8473
8474 \brief sme_disable_feature_capablity() - SME interface to disable Active mode offload capablity
8475 in Host.
8476
8477 \param hHal - HAL handle for device
8478
8479 \return NONE
8480
8481 ---------------------------------------------------------------------------*/
8482void sme_disable_feature_capablity(uint8_t feature_index)
8483{
8484}
8485
8486/* ---------------------------------------------------------------------------
8487 \fn sme_reset_power_values_for5_g
8488 \brief Reset the power values for 5G band with default power values.
8489 \param hHal - HAL handle for device
8490 \- return NONE
8491 -------------------------------------------------------------------------*/
8492void sme_reset_power_values_for5_g(tHalHandle hHal)
8493{
8494 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308495 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008496 TRACE_CODE_SME_RX_HDD_RESET_PW5G, NO_SESSION, 0));
8497 csr_save_channel_power_for_band(pMac, true);
8498 csr_apply_power2_current(pMac); /* Store the channel+power info in the global place: Cfg */
8499}
8500
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008501/* ---------------------------------------------------------------------------
8502 \fn sme_update_roam_prefer5_g_hz
8503 \brief enable/disable Roam prefer 5G runtime option
8504 This function is called through dynamic setConfig callback function
8505 to configure the Roam prefer 5G runtime option
8506 \param hHal - HAL handle for device
8507 \param nRoamPrefer5GHz Enable/Disable Roam prefer 5G runtime option
8508 \- return Success or failure
8509 -------------------------------------------------------------------------*/
8510
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308511QDF_STATUS sme_update_roam_prefer5_g_hz(tHalHandle hHal, bool nRoamPrefer5GHz)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008512{
8513 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308514 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008515
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308516 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008517 TRACE_CODE_SME_RX_HDD_UPDATE_RP5G, NO_SESSION, 0));
8518 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308519 if (QDF_IS_STATUS_SUCCESS(status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308520 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008521 "%s: gRoamPrefer5GHz is changed from %d to %d",
8522 __func__, pMac->roam.configParam.nRoamPrefer5GHz,
8523 nRoamPrefer5GHz);
8524 pMac->roam.configParam.nRoamPrefer5GHz = nRoamPrefer5GHz;
8525 sme_release_global_lock(&pMac->sme);
8526 }
8527
8528 return status;
8529}
8530
8531/* ---------------------------------------------------------------------------
8532 \fn sme_set_roam_intra_band
8533 \brief enable/disable Intra band roaming
8534 This function is called through dynamic setConfig callback function
8535 to configure the intra band roaming
8536 \param hHal - HAL handle for device
8537 \param nRoamIntraBand Enable/Disable Intra band roaming
8538 \- return Success or failure
8539 -------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308540QDF_STATUS sme_set_roam_intra_band(tHalHandle hHal, const bool nRoamIntraBand)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008541{
8542 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308543 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008544
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308545 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008546 TRACE_CODE_SME_RX_HDD_SET_ROAMIBAND, NO_SESSION, 0));
8547 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308548 if (QDF_IS_STATUS_SUCCESS(status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308549 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008550 "%s: gRoamIntraBand is changed from %d to %d",
8551 __func__, pMac->roam.configParam.nRoamIntraBand,
8552 nRoamIntraBand);
8553 pMac->roam.configParam.nRoamIntraBand = nRoamIntraBand;
8554 sme_release_global_lock(&pMac->sme);
8555 }
8556
8557 return status;
8558}
8559
8560/* ---------------------------------------------------------------------------
8561 \fn sme_update_roam_scan_n_probes
8562 \brief function to update roam scan N probes
8563 This function is called through dynamic setConfig callback function
8564 to update roam scan N probes
8565 \param hHal - HAL handle for device
8566 \param sessionId - Session Identifier
8567 \param nProbes number of probe requests to be sent out
8568 \- return Success or failure
8569 -------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308570QDF_STATUS sme_update_roam_scan_n_probes(tHalHandle hHal, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008571 const uint8_t nProbes)
8572{
8573 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308574 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008575
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308576 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008577 TRACE_CODE_SME_RX_HDD_UPDATE_ROAM_SCAN_N_PROBES,
8578 NO_SESSION, 0));
8579 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308580 if (QDF_IS_STATUS_SUCCESS(status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308581 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008582 "%s: gRoamScanNProbes is changed from %d to %d",
8583 __func__, pMac->roam.configParam.nProbes, nProbes);
8584 pMac->roam.configParam.nProbes = nProbes;
8585 sme_release_global_lock(&pMac->sme);
8586 }
8587 if (pMac->roam.configParam.isRoamOffloadScanEnabled) {
8588 csr_roam_offload_scan(pMac, sessionId,
8589 ROAM_SCAN_OFFLOAD_UPDATE_CFG,
8590 REASON_NPROBES_CHANGED);
8591 }
8592 return status;
8593}
8594
8595/* ---------------------------------------------------------------------------
8596 \fn sme_update_roam_scan_home_away_time
8597 \brief function to update roam scan Home away time
8598 This function is called through dynamic setConfig callback function
8599 to update roam scan home away time
8600 \param hHal - HAL handle for device
8601 \param sessionId - Session Identifier
8602 \param nRoamScanAwayTime Scan home away time
8603 \param bSendOffloadCmd If true then send offload command to firmware
8604 If false then command is not sent to firmware
8605 \- return Success or failure
8606 -------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308607QDF_STATUS sme_update_roam_scan_home_away_time(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008608 uint8_t sessionId,
8609 const uint16_t nRoamScanHomeAwayTime,
8610 const bool bSendOffloadCmd)
8611{
8612 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308613 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008614
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308615 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008616 TRACE_CODE_SME_RX_HDD_UPDATE_ROAM_SCAN_HOME_AWAY_TIME,
8617 NO_SESSION, 0));
8618 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308619 if (QDF_IS_STATUS_SUCCESS(status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308620 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008621 "%s: gRoamScanHomeAwayTime is changed from %d to %d",
8622 __func__,
8623 pMac->roam.configParam.nRoamScanHomeAwayTime,
8624 nRoamScanHomeAwayTime);
8625 pMac->roam.configParam.nRoamScanHomeAwayTime =
8626 nRoamScanHomeAwayTime;
8627 sme_release_global_lock(&pMac->sme);
8628 }
8629 if (pMac->roam.configParam.isRoamOffloadScanEnabled && bSendOffloadCmd) {
8630 csr_roam_offload_scan(pMac, sessionId,
8631 ROAM_SCAN_OFFLOAD_UPDATE_CFG,
8632 REASON_HOME_AWAY_TIME_CHANGED);
8633 }
8634 return status;
8635}
8636
Abhishek Singh518323d2015-10-19 17:42:01 +05308637/**
8638 * sme_ext_change_channel()- function to post send ECSA
8639 * action frame to csr.
8640 * @hHal: Hal context
8641 * @channel: new channel to switch
8642 * @session_id: senssion it should be sent on.
8643 *
8644 * This function is called to post ECSA frame to csr.
8645 *
8646 * Return: success if msg is sent else return failure
8647 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308648QDF_STATUS sme_ext_change_channel(tHalHandle h_hal, uint32_t channel,
Abhishek Singh518323d2015-10-19 17:42:01 +05308649 uint8_t session_id)
8650{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308651 QDF_STATUS status = QDF_STATUS_SUCCESS;
Abhishek Singh518323d2015-10-19 17:42:01 +05308652 tpAniSirGlobal mac_ctx = PMAC_STRUCT(h_hal);
8653 uint8_t channel_state;
8654
8655 sms_log(mac_ctx, LOGE, FL(" Set Channel %d "), channel);
8656 channel_state =
8657 cds_get_channel_state(channel);
8658
8659 if (CHANNEL_STATE_DISABLE == channel_state) {
8660 sms_log(mac_ctx, LOGE, FL(" Invalid channel %d "), channel);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308661 return QDF_STATUS_E_INVAL;
Abhishek Singh518323d2015-10-19 17:42:01 +05308662 }
8663
8664 status = sme_acquire_global_lock(&mac_ctx->sme);
8665
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308666 if (QDF_STATUS_SUCCESS == status) {
Abhishek Singh518323d2015-10-19 17:42:01 +05308667 /* update the channel list to the firmware */
8668 status = csr_send_ext_change_channel(mac_ctx,
8669 channel, session_id);
8670 sme_release_global_lock(&mac_ctx->sme);
8671 }
8672
8673 return status;
8674}
8675
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008676/* ---------------------------------------------------------------------------
8677 \fn sme_get_roam_intra_band
8678 \brief get Intra band roaming
8679 \param hHal - HAL handle for device
8680 \- return Success or failure
8681 -------------------------------------------------------------------------*/
8682bool sme_get_roam_intra_band(tHalHandle hHal)
8683{
8684 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308685 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008686 TRACE_CODE_SME_RX_HDD_GET_ROAMIBAND, NO_SESSION, 0));
8687 return pMac->roam.configParam.nRoamIntraBand;
8688}
8689
8690/* ---------------------------------------------------------------------------
8691 \fn sme_get_roam_scan_n_probes
8692 \brief get N Probes
8693 \param hHal - HAL handle for device
8694 \- return Success or failure
8695 -------------------------------------------------------------------------*/
8696uint8_t sme_get_roam_scan_n_probes(tHalHandle hHal)
8697{
8698 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
8699 return pMac->roam.configParam.nProbes;
8700}
8701
8702/* ---------------------------------------------------------------------------
8703 \fn sme_get_roam_scan_home_away_time
8704 \brief get Roam scan home away time
8705 \param hHal - HAL handle for device
8706 \- return Success or failure
8707 -------------------------------------------------------------------------*/
8708uint16_t sme_get_roam_scan_home_away_time(tHalHandle hHal)
8709{
8710 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
8711 return pMac->roam.configParam.nRoamScanHomeAwayTime;
8712}
8713
8714/* ---------------------------------------------------------------------------
8715 \fn sme_update_roam_rssi_diff
8716 \brief Update RoamRssiDiff
8717 This function is called through dynamic setConfig callback function
8718 to configure RoamRssiDiff
8719 Usage: adb shell iwpriv wlan0 setConfig RoamRssiDiff=[0 .. 125]
8720 \param hHal - HAL handle for device
8721 \param sessionId - Session Identifier
8722 \param RoamRssiDiff - minimum rssi difference between potential
8723 candidate and current AP.
8724 \- return Success or failure
8725 -------------------------------------------------------------------------*/
8726
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308727QDF_STATUS sme_update_roam_rssi_diff(tHalHandle hHal, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008728 uint8_t RoamRssiDiff)
8729{
8730 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308731 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008732
8733 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308734 if (QDF_IS_STATUS_SUCCESS(status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308735 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008736 "LFR runtime successfully set roam rssi diff to %d - old value is %d - roam state is %s",
8737 RoamRssiDiff,
8738 pMac->roam.configParam.RoamRssiDiff,
8739 mac_trace_get_neighbour_roam_state(pMac->roam.
8740 neighborRoamInfo
8741 [sessionId].
8742 neighborRoamState));
8743 pMac->roam.configParam.RoamRssiDiff = RoamRssiDiff;
8744 sme_release_global_lock(&pMac->sme);
8745 }
8746 if (pMac->roam.configParam.isRoamOffloadScanEnabled) {
8747 csr_roam_offload_scan(pMac, sessionId,
8748 ROAM_SCAN_OFFLOAD_UPDATE_CFG,
8749 REASON_RSSI_DIFF_CHANGED);
8750 }
8751 return status;
8752}
8753
8754/*--------------------------------------------------------------------------
8755 \brief sme_update_fast_transition_enabled() - enable/disable Fast Transition
8756 support at runtime
8757 It is used at in the REG_DYNAMIC_VARIABLE macro definition of
8758 isFastTransitionEnabled.
8759 This is a synchronous call
8760 \param hHal - The handle returned by mac_open.
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308761 \return QDF_STATUS_SUCCESS - SME update isFastTransitionEnabled config
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008762 successfully.
8763 Other status means SME is failed to update isFastTransitionEnabled.
8764 \sa
8765 --------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308766QDF_STATUS sme_update_fast_transition_enabled(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008767 bool isFastTransitionEnabled)
8768{
8769 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308770 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008771
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308772 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008773 TRACE_CODE_SME_RX_HDD_UPDATE_FTENABLED, NO_SESSION,
8774 0));
8775 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308776 if (QDF_IS_STATUS_SUCCESS(status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308777 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008778 "%s: FastTransitionEnabled is changed from %d to %d",
8779 __func__,
8780 pMac->roam.configParam.isFastTransitionEnabled,
8781 isFastTransitionEnabled);
8782 pMac->roam.configParam.isFastTransitionEnabled =
8783 isFastTransitionEnabled;
8784 sme_release_global_lock(&pMac->sme);
8785 }
8786
8787 return status;
8788}
8789
8790/* ---------------------------------------------------------------------------
8791 \fn sme_update_wes_mode
8792 \brief Update WES Mode
8793 This function is called through dynamic setConfig callback function
8794 to configure isWESModeEnabled
8795 \param hHal - HAL handle for device
8796 \param isWESModeEnabled - WES mode
8797 \param sessionId - Session Identifier
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308798 \return QDF_STATUS_SUCCESS - SME update isWESModeEnabled config successfully.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008799 Other status means SME is failed to update isWESModeEnabled.
8800 -------------------------------------------------------------------------*/
8801
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308802QDF_STATUS sme_update_wes_mode(tHalHandle hHal, bool isWESModeEnabled,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008803 uint8_t sessionId)
8804{
8805 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308806 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008807
8808 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308809 if (QDF_IS_STATUS_SUCCESS(status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308810 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008811 "LFR runtime successfully set WES Mode to %d - old value is %d - roam state is %s",
8812 isWESModeEnabled,
8813 pMac->roam.configParam.isWESModeEnabled,
8814 mac_trace_get_neighbour_roam_state(pMac->roam.
8815 neighborRoamInfo
8816 [sessionId].
8817 neighborRoamState));
8818 pMac->roam.configParam.isWESModeEnabled = isWESModeEnabled;
8819 sme_release_global_lock(&pMac->sme);
8820 }
8821
8822 return status;
8823}
8824
8825/* ---------------------------------------------------------------------------
8826 \fn sme_set_roam_scan_control
8827 \brief Set roam scan control
8828 This function is called to set roam scan control
8829 if roam scan control is set to 0, roaming scan cache is cleared
8830 any value other than 0 is treated as invalid value
8831 \param hHal - HAL handle for device
8832 \param sessionId - Session Identifier
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308833 \return QDF_STATUS_SUCCESS - SME update config successfully.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008834 Other status means SME failure to update
8835 -------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308836QDF_STATUS sme_set_roam_scan_control(tHalHandle hHal, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008837 bool roamScanControl)
8838{
8839 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308840 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008841
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308842 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008843 TRACE_CODE_SME_RX_HDD_SET_SCANCTRL, NO_SESSION, 0));
8844 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308845 if (QDF_IS_STATUS_SUCCESS(status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308846 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008847 "LFR runtime successfully set roam scan control to %d - old value is %d - roam state is %s",
8848 roamScanControl,
8849 pMac->roam.configParam.nRoamScanControl,
8850 mac_trace_get_neighbour_roam_state(pMac->roam.
8851 neighborRoamInfo
8852 [sessionId].
8853 neighborRoamState));
8854 pMac->roam.configParam.nRoamScanControl = roamScanControl;
8855 if (0 == roamScanControl) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308856 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008857 "LFR runtime successfully cleared roam scan cache");
8858 csr_flush_cfg_bg_scan_roam_channel_list(pMac, sessionId);
8859 if (pMac->roam.configParam.isRoamOffloadScanEnabled) {
8860 csr_roam_offload_scan(pMac, sessionId,
8861 ROAM_SCAN_OFFLOAD_UPDATE_CFG,
8862 REASON_FLUSH_CHANNEL_LIST);
8863 }
8864 }
8865 sme_release_global_lock(&pMac->sme);
8866 }
8867 return status;
8868}
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008869
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008870/*--------------------------------------------------------------------------
8871 \brief sme_update_is_fast_roam_ini_feature_enabled() - enable/disable LFR
8872 support at runtime
8873 It is used at in the REG_DYNAMIC_VARIABLE macro definition of
8874 isFastRoamIniFeatureEnabled.
8875 This is a synchronous call
8876 \param hHal - The handle returned by mac_open.
8877 \param sessionId - Session Identifier
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308878 \return QDF_STATUS_SUCCESS - SME update isFastRoamIniFeatureEnabled config
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008879 successfully.
8880 Other status means SME is failed to update isFastRoamIniFeatureEnabled.
8881 \sa
8882 --------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308883QDF_STATUS sme_update_is_fast_roam_ini_feature_enabled
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008884 (tHalHandle hHal,
8885 uint8_t sessionId, const bool isFastRoamIniFeatureEnabled) {
8886 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
8887
8888 if (pMac->roam.configParam.isFastRoamIniFeatureEnabled ==
8889 isFastRoamIniFeatureEnabled) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308890 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008891 "%s: FastRoam is already enabled or disabled, nothing to do (returning) old(%d) new(%d)",
8892 __func__,
8893 pMac->roam.configParam.isFastRoamIniFeatureEnabled,
8894 isFastRoamIniFeatureEnabled);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308895 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008896 }
8897
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308898 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008899 "%s: FastRoamEnabled is changed from %d to %d", __func__,
8900 pMac->roam.configParam.isFastRoamIniFeatureEnabled,
8901 isFastRoamIniFeatureEnabled);
8902 pMac->roam.configParam.isFastRoamIniFeatureEnabled =
8903 isFastRoamIniFeatureEnabled;
8904 csr_neighbor_roam_update_fast_roaming_enabled(pMac, sessionId,
8905 isFastRoamIniFeatureEnabled);
8906
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308907 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008908}
8909
Mukul Sharma69c44cd2016-09-12 18:33:57 +05308910/**
8911 * sme_config_fast_roaming() - enable/disable LFR support at runtime
8912 * @hal - The handle returned by macOpen.
8913 * @session_id - Session Identifier
8914 * @is_fast_roam_enabled - flag to enable/disable roaming
8915 *
8916 * When Supplicant issues enabled/disable fast roaming on the basis
8917 * of the Bssid modification in network block (e.g. AutoJoin mode N/W block)
8918 *
8919 * Return: QDF_STATUS
8920 */
8921
8922QDF_STATUS sme_config_fast_roaming(tHalHandle hal, uint8_t session_id,
8923 const bool is_fast_roam_enabled)
8924{
8925 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
Sreelakshmi Konamkibda5bbf2016-09-12 18:38:10 +05308926 tCsrRoamSession *session = CSR_GET_SESSION(mac_ctx, session_id);
Mukul Sharma69c44cd2016-09-12 18:33:57 +05308927 QDF_STATUS status;
8928
8929 if (!mac_ctx->roam.configParam.isFastRoamIniFeatureEnabled) {
8930 sms_log(mac_ctx, LOGE, FL("Fast roam is disabled through ini"));
8931 if (!is_fast_roam_enabled)
8932 return QDF_STATUS_SUCCESS;
8933 return QDF_STATUS_E_FAILURE;
8934 }
Sreelakshmi Konamkibda5bbf2016-09-12 18:38:10 +05308935
8936 if (is_fast_roam_enabled && session && session->pCurRoamProfile)
8937 session->pCurRoamProfile->do_not_roam = false;
8938
Mukul Sharma69c44cd2016-09-12 18:33:57 +05308939 status = csr_neighbor_roam_update_fast_roaming_enabled(mac_ctx,
8940 session_id, is_fast_roam_enabled);
8941 if (!QDF_IS_STATUS_SUCCESS(status)) {
8942 sms_log(mac_ctx, LOGE,
8943 FL("csr_neighbor_roam_update_fast_roaming_enabled failed"));
8944 return QDF_STATUS_E_FAILURE;
8945 }
8946
8947 return QDF_STATUS_SUCCESS;
8948}
8949
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008950/*--------------------------------------------------------------------------
8951 \brief sme_update_is_mawc_ini_feature_enabled() -
8952 Enable/disable LFR MAWC support at runtime
8953 It is used at in the REG_DYNAMIC_VARIABLE macro definition of
8954 isMAWCIniFeatureEnabled.
8955 This is a synchronous call
8956 \param hHal - The handle returned by mac_open.
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308957 \return QDF_STATUS_SUCCESS - SME update MAWCEnabled config successfully.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008958 Other status means SME is failed to update MAWCEnabled.
8959 \sa
8960 --------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308961QDF_STATUS sme_update_is_mawc_ini_feature_enabled(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008962 const bool MAWCEnabled)
8963{
8964 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308965 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008966
8967 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308968 if (QDF_IS_STATUS_SUCCESS(status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308969 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008970 "%s: MAWCEnabled is changed from %d to %d", __func__,
8971 pMac->roam.configParam.MAWCEnabled, MAWCEnabled);
8972 pMac->roam.configParam.MAWCEnabled = MAWCEnabled;
8973 sme_release_global_lock(&pMac->sme);
8974 }
8975
8976 return status;
8977
8978}
8979
8980/*--------------------------------------------------------------------------
8981 \brief sme_stop_roaming() - Stop roaming for a given sessionId
8982 This is a synchronous call
8983 \param hHal - The handle returned by mac_open
8984 \param sessionId - Session Identifier
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308985 \return QDF_STATUS_SUCCESS on success
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008986 Other status on failure
8987 \sa
8988 --------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308989QDF_STATUS sme_stop_roaming(tHalHandle hHal, uint8_t sessionId, uint8_t reason)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008990{
8991 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308992 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008993
8994 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308995 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008996 csr_roam_offload_scan(pMac, sessionId, ROAM_SCAN_OFFLOAD_STOP,
8997 reason);
8998 sme_release_global_lock(&pMac->sme);
8999 }
9000
9001 return status;
9002}
9003
9004/*--------------------------------------------------------------------------
9005 \brief sme_start_roaming() - Start roaming for a given sessionId
9006 This is a synchronous call
9007 \param hHal - The handle returned by mac_open
9008 \param sessionId - Session Identifier
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309009 \return QDF_STATUS_SUCCESS on success
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009010 Other status on failure
9011 \sa
9012 --------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309013QDF_STATUS sme_start_roaming(tHalHandle hHal, uint8_t sessionId, uint8_t reason)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009014{
9015 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309016 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009017
9018 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309019 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009020 csr_roam_offload_scan(pMac, sessionId, ROAM_SCAN_OFFLOAD_START,
9021 reason);
9022 sme_release_global_lock(&pMac->sme);
9023 }
9024
9025 return status;
9026}
9027
9028/*--------------------------------------------------------------------------
9029 \brief sme_update_enable_fast_roam_in_concurrency() - enable/disable LFR if
9030 Concurrent session exists
9031 This is a synchronuous call
9032 \param hHal - The handle returned by mac_open.
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309033 \return QDF_STATUS_SUCCESS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009034 Other status means SME is failed
9035 \sa
9036 --------------------------------------------------------------------------*/
9037
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309038QDF_STATUS sme_update_enable_fast_roam_in_concurrency(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009039 bool
9040 bFastRoamInConIniFeatureEnabled)
9041{
9042
9043 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309044 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009045
9046 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309047 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009048 pMac->roam.configParam.bFastRoamInConIniFeatureEnabled =
9049 bFastRoamInConIniFeatureEnabled;
9050 if (0 == pMac->roam.configParam.isRoamOffloadScanEnabled) {
9051 pMac->roam.configParam.bFastRoamInConIniFeatureEnabled =
9052 0;
9053 }
9054 sme_release_global_lock(&pMac->sme);
9055 }
9056
9057 return status;
9058}
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009059
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009060/*--------------------------------------------------------------------------
9061 \brief sme_update_config_fw_rssi_monitoring() - enable/disable firmware RSSI
9062 Monitoring at runtime
9063 It is used at in the REG_DYNAMIC_VARIABLE macro definition of
9064 fEnableFwRssiMonitoring.
9065 This is a synchronous call
9066 \param hHal - The handle returned by mac_open.
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309067 \return QDF_STATUS_SUCCESS - SME update fEnableFwRssiMonitoring.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009068 config successfully.
9069 Other status means SME is failed to update fEnableFwRssiMonitoring.
9070 \sa
9071 --------------------------------------------------------------------------*/
9072
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309073QDF_STATUS sme_update_config_fw_rssi_monitoring(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009074 bool fEnableFwRssiMonitoring)
9075{
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05309076 QDF_STATUS qdf_ret_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009077
9078 if (sme_cfg_set_int (hHal, WNI_CFG_PS_ENABLE_RSSI_MONITOR,
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309079 fEnableFwRssiMonitoring) == QDF_STATUS_E_FAILURE) {
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05309080 qdf_ret_status = QDF_STATUS_E_FAILURE;
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05309081 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009082 "Could not pass on WNI_CFG_PS_RSSI_MONITOR to CFG");
9083 }
9084
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05309085 return qdf_ret_status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009086}
9087
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009088/* ---------------------------------------------------------------------------
9089 \fn sme_set_roam_opportunistic_scan_threshold_diff
9090 \brief Update Opportunistic Scan threshold diff
9091 This function is called through dynamic setConfig callback function
9092 to configure nOpportunisticThresholdDiff
9093 \param hHal - HAL handle for device
9094 \param sessionId - Session Identifier
9095 \param nOpportunisticThresholdDiff - Opportunistic Scan threshold diff
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309096 \return QDF_STATUS_SUCCESS - SME update nOpportunisticThresholdDiff config
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009097 successfully.
9098 else SME is failed to update nOpportunisticThresholdDiff.
9099 -------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309100QDF_STATUS sme_set_roam_opportunistic_scan_threshold_diff(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009101 uint8_t sessionId,
9102 const uint8_t
9103 nOpportunisticThresholdDiff)
9104{
9105 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309106 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009107
9108 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309109 if (QDF_IS_STATUS_SUCCESS(status)) {
Varun Reddy Yeturuff4feb02016-04-20 12:26:11 -07009110 status = csr_neighbor_roam_update_config(pMac, sessionId,
9111 nOpportunisticThresholdDiff,
9112 REASON_OPPORTUNISTIC_THRESH_DIFF_CHANGED);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309113 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009114 pMac->roam.configParam.neighborRoamConfig.
9115 nOpportunisticThresholdDiff =
9116 nOpportunisticThresholdDiff;
9117 }
9118 sme_release_global_lock(&pMac->sme);
9119 }
9120 return status;
9121}
9122
9123/*--------------------------------------------------------------------------
9124 \fn sme_get_roam_opportunistic_scan_threshold_diff()
9125 \brief gets Opportunistic Scan threshold diff
9126 This is a synchronous call
9127 \param hHal - The handle returned by mac_open
9128 \return uint8_t - nOpportunisticThresholdDiff
9129 \sa
9130 --------------------------------------------------------------------------*/
9131uint8_t sme_get_roam_opportunistic_scan_threshold_diff(tHalHandle hHal)
9132{
9133 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
9134 return pMac->roam.configParam.neighborRoamConfig.
9135 nOpportunisticThresholdDiff;
9136}
9137
9138/* ---------------------------------------------------------------------------
9139 \fn sme_set_roam_rescan_rssi_diff
9140 \brief Update roam rescan rssi diff
9141 This function is called through dynamic setConfig callback function
9142 to configure nRoamRescanRssiDiff
9143 \param hHal - HAL handle for device
9144 \param sessionId - Session Identifier
9145 \param nRoamRescanRssiDiff - roam rescan rssi diff
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309146 \return QDF_STATUS_SUCCESS - SME update nRoamRescanRssiDiff config
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009147 successfully.
9148 else SME is failed to update nRoamRescanRssiDiff.
9149 -------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309150QDF_STATUS sme_set_roam_rescan_rssi_diff(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009151 uint8_t sessionId,
9152 const uint8_t nRoamRescanRssiDiff)
9153{
9154 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309155 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009156
9157 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309158 if (QDF_IS_STATUS_SUCCESS(status)) {
Varun Reddy Yeturuff4feb02016-04-20 12:26:11 -07009159 status = csr_neighbor_roam_update_config(pMac, sessionId,
9160 nRoamRescanRssiDiff,
9161 REASON_ROAM_RESCAN_RSSI_DIFF_CHANGED);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309162 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009163 pMac->roam.configParam.neighborRoamConfig.
9164 nRoamRescanRssiDiff = nRoamRescanRssiDiff;
9165 }
9166 sme_release_global_lock(&pMac->sme);
9167 }
9168 return status;
9169}
9170
9171/*--------------------------------------------------------------------------
9172 \fn sme_get_roam_rescan_rssi_diff
9173 \brief gets roam rescan rssi diff
9174 This is a synchronous call
9175 \param hHal - The handle returned by mac_open
9176 \return int8_t - nRoamRescanRssiDiff
9177 \sa
9178 --------------------------------------------------------------------------*/
9179uint8_t sme_get_roam_rescan_rssi_diff(tHalHandle hHal)
9180{
9181 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
9182 return pMac->roam.configParam.neighborRoamConfig.nRoamRescanRssiDiff;
9183}
9184
9185/* ---------------------------------------------------------------------------
9186 \fn sme_set_roam_bmiss_first_bcnt
9187 \brief Update Roam count for first beacon miss
9188 This function is called through dynamic setConfig callback function
9189 to configure nRoamBmissFirstBcnt
9190 \param hHal - HAL handle for device
9191 \param sessionId - Session Identifier
9192 \param nRoamBmissFirstBcnt - Roam first bmiss count
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309193 \return QDF_STATUS_SUCCESS - SME update nRoamBmissFirstBcnt
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009194 successfully.
9195 else SME is failed to update nRoamBmissFirstBcnt
9196 -------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309197QDF_STATUS sme_set_roam_bmiss_first_bcnt(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009198 uint8_t sessionId,
9199 const uint8_t nRoamBmissFirstBcnt)
9200{
9201 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309202 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009203
9204 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309205 if (QDF_IS_STATUS_SUCCESS(status)) {
Varun Reddy Yeturuff4feb02016-04-20 12:26:11 -07009206 status = csr_neighbor_roam_update_config(pMac, sessionId,
9207 nRoamBmissFirstBcnt,
9208 REASON_ROAM_BMISS_FIRST_BCNT_CHANGED);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309209 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009210 pMac->roam.configParam.neighborRoamConfig.
9211 nRoamBmissFirstBcnt = nRoamBmissFirstBcnt;
9212 }
9213 sme_release_global_lock(&pMac->sme);
9214 }
9215 return status;
9216}
9217
9218/* ---------------------------------------------------------------------------
9219 \fn sme_get_roam_bmiss_first_bcnt
9220 \brief get neighbor roam beacon miss first count
9221 \param hHal - The handle returned by mac_open.
9222 \return uint8_t - neighbor roam beacon miss first count
9223 -------------------------------------------------------------------------*/
9224uint8_t sme_get_roam_bmiss_first_bcnt(tHalHandle hHal)
9225{
9226 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
9227 return pMac->roam.configParam.neighborRoamConfig.nRoamBmissFirstBcnt;
9228}
9229
9230/* ---------------------------------------------------------------------------
9231 \fn sme_set_roam_bmiss_final_bcnt
9232 \brief Update Roam count for final beacon miss
9233 This function is called through dynamic setConfig callback function
9234 to configure nRoamBmissFinalBcnt
9235 \param hHal - HAL handle for device
9236 \param sessionId - Session Identifier
9237 \param nRoamBmissFinalBcnt - Roam final bmiss count
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309238 \return QDF_STATUS_SUCCESS - SME update nRoamBmissFinalBcnt
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009239 successfully.
9240 else SME is failed to update nRoamBmissFinalBcnt
9241 -------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309242QDF_STATUS sme_set_roam_bmiss_final_bcnt(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009243 uint8_t sessionId,
9244 const uint8_t nRoamBmissFinalBcnt)
9245{
9246 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309247 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009248
9249 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309250 if (QDF_IS_STATUS_SUCCESS(status)) {
Varun Reddy Yeturuff4feb02016-04-20 12:26:11 -07009251 status = csr_neighbor_roam_update_config(pMac, sessionId,
9252 nRoamBmissFinalBcnt,
9253 REASON_ROAM_BMISS_FINAL_BCNT_CHANGED);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309254 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009255 pMac->roam.configParam.neighborRoamConfig.
9256 nRoamBmissFinalBcnt = nRoamBmissFinalBcnt;
9257 }
9258 sme_release_global_lock(&pMac->sme);
9259 }
9260 return status;
9261}
9262
9263/*--------------------------------------------------------------------------
9264 \fn sme_get_roam_bmiss_final_bcnt
9265 \brief gets Roam count for final beacon miss
9266 This is a synchronous call
9267 \param hHal - The handle returned by mac_open
9268 \return uint8_t - nRoamBmissFinalBcnt
9269 \sa
9270 --------------------------------------------------------------------------*/
9271uint8_t sme_get_roam_bmiss_final_bcnt(tHalHandle hHal)
9272{
9273 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
9274 return pMac->roam.configParam.neighborRoamConfig.nRoamBmissFinalBcnt;
9275}
9276
9277/* ---------------------------------------------------------------------------
9278 \fn sme_set_roam_beacon_rssi_weight
9279 \brief Update Roam beacon rssi weight
9280 This function is called through dynamic setConfig callback function
9281 to configure nRoamBeaconRssiWeight
9282 \param hHal - HAL handle for device
9283 \param sessionId - Session Identifier
9284 \param nRoamBeaconRssiWeight - Roam beacon rssi weight
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309285 \return QDF_STATUS_SUCCESS - SME update nRoamBeaconRssiWeight config
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009286 successfully.
9287 else SME is failed to update nRoamBeaconRssiWeight
9288 -------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309289QDF_STATUS sme_set_roam_beacon_rssi_weight(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009290 uint8_t sessionId,
9291 const uint8_t nRoamBeaconRssiWeight)
9292{
9293 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309294 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009295
9296 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309297 if (QDF_IS_STATUS_SUCCESS(status)) {
Varun Reddy Yeturuff4feb02016-04-20 12:26:11 -07009298 status = csr_neighbor_roam_update_config(pMac, sessionId,
9299 nRoamBeaconRssiWeight,
9300 REASON_ROAM_BEACON_RSSI_WEIGHT_CHANGED);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309301 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009302 pMac->roam.configParam.neighborRoamConfig.
9303 nRoamBeaconRssiWeight = nRoamBeaconRssiWeight;
9304 }
9305 sme_release_global_lock(&pMac->sme);
9306 }
9307 return status;
9308}
9309
9310/*--------------------------------------------------------------------------
9311 \fn sme_get_roam_beacon_rssi_weight
9312 \brief gets Roam beacon rssi weight
9313 This is a synchronous call
9314 \param hHal - The handle returned by mac_open
9315 \return uint8_t - nRoamBeaconRssiWeight
9316 \sa
9317 --------------------------------------------------------------------------*/
9318uint8_t sme_get_roam_beacon_rssi_weight(tHalHandle hHal)
9319{
9320 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
9321 return pMac->roam.configParam.neighborRoamConfig.nRoamBeaconRssiWeight;
9322}
9323
9324/*--------------------------------------------------------------------------
9325 \brief sme_set_neighbor_lookup_rssi_threshold() - update neighbor lookup
9326 rssi threshold
9327 This is a synchronous call
9328 \param hHal - The handle returned by mac_open.
9329 \param sessionId - Session Identifier
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309330 \return QDF_STATUS_SUCCESS - SME update config successful.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009331 Other status means SME is failed to update
9332 \sa
9333 --------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309334QDF_STATUS sme_set_neighbor_lookup_rssi_threshold
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009335 (tHalHandle hHal, uint8_t sessionId, uint8_t neighborLookupRssiThreshold) {
9336 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309337 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009338
9339 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309340 if (QDF_IS_STATUS_SUCCESS(status)) {
Varun Reddy Yeturuff4feb02016-04-20 12:26:11 -07009341 status = csr_neighbor_roam_update_config(pMac,
9342 sessionId, neighborLookupRssiThreshold,
9343 REASON_LOOKUP_THRESH_CHANGED);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309344 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009345 pMac->roam.configParam.neighborRoamConfig.
9346 nNeighborLookupRssiThreshold =
9347 neighborLookupRssiThreshold;
9348 }
9349 sme_release_global_lock(&pMac->sme);
9350 }
9351 return status;
9352}
9353
9354/*--------------------------------------------------------------------------
9355 \brief sme_set_delay_before_vdev_stop() - update delay before VDEV_STOP
9356 This is a synchronous call
9357 \param hal - The handle returned by macOpen.
9358 \param session_id - Session Identifier
9359 \param delay_before_vdev_stop - value to be set
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309360 \return QDF_STATUS_SUCCESS - SME update config successful.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009361 Other status means SME is failed to update
9362 \sa
9363 --------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309364QDF_STATUS sme_set_delay_before_vdev_stop(tHalHandle hal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009365 uint8_t session_id,
9366 uint8_t delay_before_vdev_stop)
9367{
9368 tpAniSirGlobal pMac = PMAC_STRUCT(hal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309369 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009370 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309371 if (QDF_IS_STATUS_SUCCESS(status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05309372 QDF_TRACE(QDF_MODULE_ID_SME,
9373 QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009374 FL("LFR param delay_before_vdev_stop changed from %d to %d"),
9375 pMac->roam.configParam.neighborRoamConfig.
9376 delay_before_vdev_stop,
9377 delay_before_vdev_stop);
9378 pMac->roam.neighborRoamInfo[session_id].cfgParams.
9379 delay_before_vdev_stop = delay_before_vdev_stop;
9380 pMac->roam.configParam.neighborRoamConfig.
9381 delay_before_vdev_stop = delay_before_vdev_stop;
9382 sme_release_global_lock(&pMac->sme);
9383 }
9384 return status;
9385}
9386
9387/*--------------------------------------------------------------------------
9388 \brief sme_get_neighbor_lookup_rssi_threshold() - get neighbor lookup
9389 rssi threshold
9390 This is a synchronous call
9391 \param hHal - The handle returned by mac_open.
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309392 \return QDF_STATUS_SUCCESS - SME update config successful.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009393 Other status means SME is failed to update
9394 \sa
9395 --------------------------------------------------------------------------*/
9396uint8_t sme_get_neighbor_lookup_rssi_threshold(tHalHandle hHal)
9397{
9398 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
9399 return pMac->roam.configParam.neighborRoamConfig.
9400 nNeighborLookupRssiThreshold;
9401}
9402
9403/*--------------------------------------------------------------------------
9404 \brief sme_set_neighbor_scan_refresh_period() - set neighbor scan results
9405 refresh period
9406 This is a synchronous call
9407 \param hHal - The handle returned by mac_open.
9408 \param sessionId - Session Identifier
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309409 \return QDF_STATUS_SUCCESS - SME update config successful.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009410 Other status means SME is failed to update
9411 \sa
9412 --------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309413QDF_STATUS sme_set_neighbor_scan_refresh_period
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009414 (tHalHandle hHal,
9415 uint8_t sessionId, uint16_t neighborScanResultsRefreshPeriod) {
9416 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309417 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009418 tCsrNeighborRoamConfig *pNeighborRoamConfig = NULL;
9419 tpCsrNeighborRoamControlInfo pNeighborRoamInfo = NULL;
9420
9421 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309422 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009423 pNeighborRoamConfig =
9424 &pMac->roam.configParam.neighborRoamConfig;
9425 pNeighborRoamInfo = &pMac->roam.neighborRoamInfo[sessionId];
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05309426 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009427 "LFR runtime successfully set roam scan refresh period to %d- old value is %d - roam state is %s",
9428 neighborScanResultsRefreshPeriod,
9429 pMac->roam.configParam.neighborRoamConfig.
9430 nNeighborResultsRefreshPeriod,
9431 mac_trace_get_neighbour_roam_state(pMac->roam.
9432 neighborRoamInfo
9433 [sessionId].
9434 neighborRoamState));
9435 pNeighborRoamConfig->nNeighborResultsRefreshPeriod =
9436 neighborScanResultsRefreshPeriod;
9437 pNeighborRoamInfo->cfgParams.neighborResultsRefreshPeriod =
9438 neighborScanResultsRefreshPeriod;
9439
9440 sme_release_global_lock(&pMac->sme);
9441 }
9442 if (pMac->roam.configParam.isRoamOffloadScanEnabled) {
9443 csr_roam_offload_scan(pMac, sessionId,
9444 ROAM_SCAN_OFFLOAD_UPDATE_CFG,
9445 REASON_NEIGHBOR_SCAN_REFRESH_PERIOD_CHANGED);
9446 }
9447 return status;
9448}
9449
9450/*--------------------------------------------------------------------------
9451 \brief sme_update_roam_scan_offload_enabled() - enable/disable roam scan
9452 offload feaure
9453 It is used at in the REG_DYNAMIC_VARIABLE macro definition of
9454 gRoamScanOffloadEnabled.
9455 This is a synchronous call
9456 \param hHal - The handle returned by mac_open.
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309457 \return QDF_STATUS_SUCCESS - SME update config successfully.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009458 Other status means SME is failed to update.
9459 \sa
9460 --------------------------------------------------------------------------*/
9461
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309462QDF_STATUS sme_update_roam_scan_offload_enabled(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009463 bool nRoamScanOffloadEnabled)
9464{
9465 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309466 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009467
9468 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309469 if (QDF_IS_STATUS_SUCCESS(status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05309470 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009471 FL
9472 ("gRoamScanOffloadEnabled is changed from %d to %d"),
9473 pMac->roam.configParam.isRoamOffloadScanEnabled,
9474 nRoamScanOffloadEnabled);
9475 pMac->roam.configParam.isRoamOffloadScanEnabled =
9476 nRoamScanOffloadEnabled;
9477 sme_release_global_lock(&pMac->sme);
9478 }
9479
9480 return status;
9481}
9482
9483/*--------------------------------------------------------------------------
9484 \brief sme_get_neighbor_scan_refresh_period() - get neighbor scan results
9485 refresh period
9486 This is a synchronous call
9487 \param hHal - The handle returned by mac_open.
9488 \return uint16_t - Neighbor scan results refresh period value
9489 \sa
9490 --------------------------------------------------------------------------*/
9491uint16_t sme_get_neighbor_scan_refresh_period(tHalHandle hHal)
9492{
9493 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
9494 return pMac->roam.configParam.neighborRoamConfig.
9495 nNeighborResultsRefreshPeriod;
9496}
9497
9498/*--------------------------------------------------------------------------
9499 \brief sme_get_empty_scan_refresh_period() - get empty scan refresh period
9500 This is a synchronuous call
9501 \param hHal - The handle returned by mac_open.
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309502 \return QDF_STATUS_SUCCESS - SME update config successful.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009503 Other status means SME is failed to update
9504 \sa
9505 --------------------------------------------------------------------------*/
9506uint16_t sme_get_empty_scan_refresh_period(tHalHandle hHal)
9507{
9508 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
9509 return pMac->roam.configParam.neighborRoamConfig.
9510 nEmptyScanRefreshPeriod;
9511}
9512
9513/* ---------------------------------------------------------------------------
9514 \fn sme_update_empty_scan_refresh_period
9515 \brief Update nEmptyScanRefreshPeriod
9516 This function is called through dynamic setConfig callback function
9517 to configure nEmptyScanRefreshPeriod
9518 Usage: adb shell iwpriv wlan0 setConfig
9519 nEmptyScanRefreshPeriod=[0 .. 60]
9520 \param hHal - HAL handle for device
9521 \param sessionId - Session Identifier
9522 \param nEmptyScanRefreshPeriod - scan period following empty scan results.
9523 \- return Success or failure
9524 -------------------------------------------------------------------------*/
9525
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309526QDF_STATUS sme_update_empty_scan_refresh_period(tHalHandle hHal, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009527 uint16_t nEmptyScanRefreshPeriod)
9528{
9529 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309530 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009531 tCsrNeighborRoamConfig *pNeighborRoamConfig = NULL;
9532 tpCsrNeighborRoamControlInfo pNeighborRoamInfo = NULL;
9533
9534 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309535 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009536 pNeighborRoamConfig =
9537 &pMac->roam.configParam.neighborRoamConfig;
9538 pNeighborRoamInfo = &pMac->roam.neighborRoamInfo[sessionId];
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05309539 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009540 "LFR runtime successfully set roam scan period to %d -old value is %d - roam state is %s",
9541 nEmptyScanRefreshPeriod,
9542 pMac->roam.configParam.neighborRoamConfig.
9543 nEmptyScanRefreshPeriod,
9544 mac_trace_get_neighbour_roam_state(pMac->roam.
9545 neighborRoamInfo
9546 [sessionId].
9547 neighborRoamState));
9548 pNeighborRoamConfig->nEmptyScanRefreshPeriod =
9549 nEmptyScanRefreshPeriod;
9550 pNeighborRoamInfo->cfgParams.emptyScanRefreshPeriod =
9551 nEmptyScanRefreshPeriod;
9552 sme_release_global_lock(&pMac->sme);
9553 }
9554 if (pMac->roam.configParam.isRoamOffloadScanEnabled) {
9555 csr_roam_offload_scan(pMac, sessionId,
9556 ROAM_SCAN_OFFLOAD_UPDATE_CFG,
9557 REASON_EMPTY_SCAN_REF_PERIOD_CHANGED);
9558 }
9559 return status;
9560}
9561
9562/* ---------------------------------------------------------------------------
9563 \fn sme_set_neighbor_scan_min_chan_time
9564 \brief Update nNeighborScanMinChanTime
9565 This function is called through dynamic setConfig callback function
9566 to configure gNeighborScanChannelMinTime
9567 Usage: adb shell iwpriv wlan0 setConfig
9568 gNeighborScanChannelMinTime=[0 .. 60]
9569 \param hHal - HAL handle for device
9570 \param nNeighborScanMinChanTime - Channel minimum dwell time
9571 \param sessionId - Session Identifier
9572 \- return Success or failure
9573 -------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309574QDF_STATUS sme_set_neighbor_scan_min_chan_time(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009575 const uint16_t
9576 nNeighborScanMinChanTime,
9577 uint8_t sessionId)
9578{
9579 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309580 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009581
9582 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309583 if (QDF_IS_STATUS_SUCCESS(status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05309584 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009585 "LFR runtime successfully set channel min dwell time to %d - old value is %d - roam state is %s",
9586 nNeighborScanMinChanTime,
9587 pMac->roam.configParam.neighborRoamConfig.
9588 nNeighborScanMinChanTime,
9589 mac_trace_get_neighbour_roam_state(pMac->roam.
9590 neighborRoamInfo
9591 [sessionId].
9592 neighborRoamState));
9593
9594 pMac->roam.configParam.neighborRoamConfig.
9595 nNeighborScanMinChanTime = nNeighborScanMinChanTime;
9596 pMac->roam.neighborRoamInfo[sessionId].cfgParams.
9597 minChannelScanTime = nNeighborScanMinChanTime;
9598 sme_release_global_lock(&pMac->sme);
9599 }
9600
9601 return status;
9602}
9603
9604/* ---------------------------------------------------------------------------
9605 \fn sme_set_neighbor_scan_max_chan_time
9606 \brief Update nNeighborScanMaxChanTime
9607 This function is called through dynamic setConfig callback function
9608 to configure gNeighborScanChannelMaxTime
9609 Usage: adb shell iwpriv wlan0 setConfig
9610 gNeighborScanChannelMaxTime=[0 .. 60]
9611 \param hHal - HAL handle for device
9612 \param sessionId - Session Identifier
9613 \param nNeighborScanMinChanTime - Channel maximum dwell time
9614 \- return Success or failure
9615 -------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309616QDF_STATUS sme_set_neighbor_scan_max_chan_time(tHalHandle hHal, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009617 const uint16_t
9618 nNeighborScanMaxChanTime)
9619{
9620 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309621 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009622 tCsrNeighborRoamConfig *pNeighborRoamConfig = NULL;
9623 tpCsrNeighborRoamControlInfo pNeighborRoamInfo = NULL;
9624
9625 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309626 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009627 pNeighborRoamConfig =
9628 &pMac->roam.configParam.neighborRoamConfig;
9629 pNeighborRoamInfo = &pMac->roam.neighborRoamInfo[sessionId];
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05309630 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009631 "LFR runtime successfully set channel max dwell time to %d - old value is %d - roam state is %s",
9632 nNeighborScanMaxChanTime,
9633 pMac->roam.configParam.neighborRoamConfig.
9634 nNeighborScanMaxChanTime,
9635 mac_trace_get_neighbour_roam_state(pMac->roam.
9636 neighborRoamInfo
9637 [sessionId].
9638 neighborRoamState));
9639 pNeighborRoamConfig->nNeighborScanMaxChanTime =
9640 nNeighborScanMaxChanTime;
9641 pNeighborRoamInfo->cfgParams.maxChannelScanTime =
9642 nNeighborScanMaxChanTime;
9643 sme_release_global_lock(&pMac->sme);
9644 }
9645 if (pMac->roam.configParam.isRoamOffloadScanEnabled) {
9646 csr_roam_offload_scan(pMac, sessionId,
9647 ROAM_SCAN_OFFLOAD_UPDATE_CFG,
9648 REASON_SCAN_CH_TIME_CHANGED);
9649 }
9650
9651 return status;
9652}
9653
9654/* ---------------------------------------------------------------------------
9655 \fn sme_get_neighbor_scan_min_chan_time
9656 \brief get neighbor scan min channel time
9657 \param hHal - The handle returned by mac_open.
9658 \param sessionId - Session Identifier
9659 \return uint16_t - channel min time value
9660 -------------------------------------------------------------------------*/
9661uint16_t sme_get_neighbor_scan_min_chan_time(tHalHandle hHal, uint8_t sessionId)
9662{
9663 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
9664 return pMac->roam.neighborRoamInfo[sessionId].cfgParams.
9665 minChannelScanTime;
9666}
9667
9668/* ---------------------------------------------------------------------------
9669 \fn sme_get_neighbor_roam_state
9670 \brief get neighbor roam state
9671 \param hHal - The handle returned by mac_open.
9672 \param sessionId - Session Identifier
9673 \return uint32_t - neighbor roam state
9674 -------------------------------------------------------------------------*/
9675uint32_t sme_get_neighbor_roam_state(tHalHandle hHal, uint8_t sessionId)
9676{
9677 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
9678 return pMac->roam.neighborRoamInfo[sessionId].neighborRoamState;
9679}
9680
9681/* ---------------------------------------------------------------------------
9682 \fn sme_get_current_roam_state
9683 \brief get current roam state
9684 \param hHal - The handle returned by mac_open.
9685 \param sessionId - Session Identifier
9686 \return uint32_t - current roam state
9687 -------------------------------------------------------------------------*/
9688uint32_t sme_get_current_roam_state(tHalHandle hHal, uint8_t sessionId)
9689{
9690 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
9691 return pMac->roam.curState[sessionId];
9692}
9693
9694/* ---------------------------------------------------------------------------
9695 \fn sme_get_current_roam_sub_state
9696 \brief get neighbor roam sub state
9697 \param hHal - The handle returned by mac_open.
9698 \param sessionId - Session Identifier
9699 \return uint32_t - current roam sub state
9700 -------------------------------------------------------------------------*/
9701uint32_t sme_get_current_roam_sub_state(tHalHandle hHal, uint8_t sessionId)
9702{
9703 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
9704 return pMac->roam.curSubState[sessionId];
9705}
9706
9707/* ---------------------------------------------------------------------------
9708 \fn sme_get_lim_sme_state
9709 \brief get Lim Sme state
9710 \param hHal - The handle returned by mac_open.
9711 \return uint32_t - Lim Sme state
9712 -------------------------------------------------------------------------*/
9713uint32_t sme_get_lim_sme_state(tHalHandle hHal)
9714{
9715 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
9716 return pMac->lim.gLimSmeState;
9717}
9718
9719/* ---------------------------------------------------------------------------
9720 \fn sme_get_lim_mlm_state
9721 \brief get Lim Mlm state
9722 \param hHal - The handle returned by mac_open.
9723 \return uint32_t - Lim Mlm state
9724 -------------------------------------------------------------------------*/
9725uint32_t sme_get_lim_mlm_state(tHalHandle hHal)
9726{
9727 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
9728 return pMac->lim.gLimMlmState;
9729}
9730
9731/* ---------------------------------------------------------------------------
9732 \fn sme_is_lim_session_valid
9733 \brief is Lim session valid
9734 \param hHal - The handle returned by mac_open.
9735 \param sessionId - Session Identifier
9736 \return bool - true or false
9737 -------------------------------------------------------------------------*/
9738bool sme_is_lim_session_valid(tHalHandle hHal, uint8_t sessionId)
9739{
9740 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Hanumantha Reddy Pothula589fd702015-11-17 15:25:16 +05309741
9742 if (sessionId > pMac->lim.maxBssId)
9743 return false;
9744
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009745 return pMac->lim.gpSession[sessionId].valid;
9746}
9747
9748/* ---------------------------------------------------------------------------
9749 \fn sme_get_lim_sme_session_state
9750 \brief get Lim Sme session state
9751 \param hHal - The handle returned by mac_open.
9752 \param sessionId - Session Identifier
9753 \return uint32_t - Lim Sme session state
9754 -------------------------------------------------------------------------*/
9755uint32_t sme_get_lim_sme_session_state(tHalHandle hHal, uint8_t sessionId)
9756{
9757 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
9758 return pMac->lim.gpSession[sessionId].limSmeState;
9759}
9760
9761/* ---------------------------------------------------------------------------
9762 \fn sme_get_lim_mlm_session_state
9763 \brief get Lim Mlm session state
9764 \param hHal - The handle returned by mac_open.
9765 \param sessionId - Session Identifier
9766 \return uint32_t - Lim Mlm session state
9767 -------------------------------------------------------------------------*/
9768uint32_t sme_get_lim_mlm_session_state(tHalHandle hHal, uint8_t sessionId)
9769{
9770 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
9771 return pMac->lim.gpSession[sessionId].limMlmState;
9772}
9773
9774/* ---------------------------------------------------------------------------
9775 \fn sme_get_neighbor_scan_max_chan_time
9776 \brief get neighbor scan max channel time
9777 \param hHal - The handle returned by mac_open.
9778 \param sessionId - Session Identifier
9779 \return uint16_t - channel max time value
9780 -------------------------------------------------------------------------*/
9781uint16_t sme_get_neighbor_scan_max_chan_time(tHalHandle hHal, uint8_t sessionId)
9782{
9783 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
9784 return pMac->roam.neighborRoamInfo[sessionId].cfgParams.
9785 maxChannelScanTime;
9786}
9787
9788/* ---------------------------------------------------------------------------
9789 \fn sme_set_neighbor_scan_period
9790 \brief Update nNeighborScanPeriod
9791 This function is called through dynamic setConfig callback function
9792 to configure nNeighborScanPeriod
9793 Usage: adb shell iwpriv wlan0 setConfig
9794 nNeighborScanPeriod=[0 .. 1000]
9795 \param hHal - HAL handle for device
9796 \param sessionId - Session Identifier
9797 \param nNeighborScanPeriod - neighbor scan period
9798 \- return Success or failure
9799 -------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309800QDF_STATUS sme_set_neighbor_scan_period(tHalHandle hHal, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009801 const uint16_t nNeighborScanPeriod)
9802{
9803 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309804 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009805 tCsrNeighborRoamConfig *pNeighborRoamConfig = NULL;
9806 tpCsrNeighborRoamControlInfo pNeighborRoamInfo = NULL;
9807
9808 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309809 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009810 pNeighborRoamConfig =
9811 &pMac->roam.configParam.neighborRoamConfig;
9812 pNeighborRoamInfo = &pMac->roam.neighborRoamInfo[sessionId];
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05309813 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009814 "LFR runtime successfully set neighbor scan period to %d"
9815 " - old value is %d - roam state is %s",
9816 nNeighborScanPeriod,
9817 pMac->roam.configParam.neighborRoamConfig.
9818 nNeighborScanTimerPeriod,
9819 mac_trace_get_neighbour_roam_state(pMac->roam.
9820 neighborRoamInfo
9821 [sessionId].
9822 neighborRoamState));
9823 pNeighborRoamConfig->nNeighborScanTimerPeriod =
9824 nNeighborScanPeriod;
9825 pNeighborRoamInfo->cfgParams.neighborScanPeriod =
9826 nNeighborScanPeriod;
9827 sme_release_global_lock(&pMac->sme);
9828 }
9829 if (pMac->roam.configParam.isRoamOffloadScanEnabled) {
9830 csr_roam_offload_scan(pMac, sessionId,
9831 ROAM_SCAN_OFFLOAD_UPDATE_CFG,
9832 REASON_SCAN_HOME_TIME_CHANGED);
9833 }
9834
9835 return status;
9836}
9837
9838/* ---------------------------------------------------------------------------
9839 \fn sme_get_neighbor_scan_period
9840 \brief get neighbor scan period
9841 \param hHal - The handle returned by mac_open.
9842 \param sessionId - Session Identifier
9843 \return uint16_t - neighbor scan period
9844 -------------------------------------------------------------------------*/
9845uint16_t sme_get_neighbor_scan_period(tHalHandle hHal, uint8_t sessionId)
9846{
9847 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
9848 return pMac->roam.neighborRoamInfo[sessionId].cfgParams.
9849 neighborScanPeriod;
9850}
9851
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009852
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009853
9854/*--------------------------------------------------------------------------
9855 \brief sme_get_roam_rssi_diff() - get Roam rssi diff
9856 This is a synchronous call
9857 \param hHal - The handle returned by mac_open.
9858 \return uint16_t - Rssi diff value
9859 \sa
9860 --------------------------------------------------------------------------*/
9861uint8_t sme_get_roam_rssi_diff(tHalHandle hHal)
9862{
9863 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
9864 return pMac->roam.configParam.RoamRssiDiff;
9865}
9866
9867/**
9868 * sme_change_roam_scan_channel_list() - to change scan channel list
9869 * @hHal: pointer HAL handle returned by mac_open
9870 * @sessionId: sme session id
9871 * @pChannelList: Output channel list
9872 * @numChannels: Output number of channels
9873 *
9874 * This routine is called to Change roam scan channel list.
9875 * This is a synchronous call
9876 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309877 * Return: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009878 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309879QDF_STATUS sme_change_roam_scan_channel_list(tHalHandle hHal, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009880 uint8_t *pChannelList,
9881 uint8_t numChannels)
9882{
9883 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309884 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009885 tpCsrNeighborRoamControlInfo pNeighborRoamInfo =
9886 &pMac->roam.neighborRoamInfo[sessionId];
9887 uint8_t oldChannelList[WNI_CFG_VALID_CHANNEL_LIST_LEN * 2] = { 0 };
9888 uint8_t newChannelList[WNI_CFG_VALID_CHANNEL_LIST_LEN * 2] = { 0 };
9889 uint8_t i = 0, j = 0;
9890 tCsrChannelInfo *chan_info;
9891
9892
9893 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309894 if (!QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009895 if (pMac->roam.configParam.isRoamOffloadScanEnabled)
9896 csr_roam_offload_scan(pMac, sessionId,
9897 ROAM_SCAN_OFFLOAD_UPDATE_CFG,
9898 REASON_CHANNEL_LIST_CHANGED);
9899 return status;
9900 }
9901 chan_info = &pNeighborRoamInfo->cfgParams.channelInfo;
9902
9903 if (NULL != chan_info->ChannelList) {
9904 for (i = 0; i < chan_info->numOfChannels; i++) {
9905 if (j < sizeof(oldChannelList))
9906 j += snprintf(oldChannelList + j,
9907 sizeof(oldChannelList) -
9908 j, "%d",
9909 chan_info->ChannelList[i]);
9910 else
9911 break;
9912 }
9913 }
9914 csr_flush_cfg_bg_scan_roam_channel_list(pMac, sessionId);
9915 csr_create_bg_scan_roam_channel_list(pMac, sessionId, pChannelList,
9916 numChannels);
9917 sme_set_roam_scan_control(hHal, sessionId, 1);
9918 if (NULL != chan_info->ChannelList) {
9919 j = 0;
9920 for (i = 0; i < chan_info->numOfChannels; i++) {
9921 if (j < sizeof(newChannelList))
9922 j += snprintf(newChannelList + j,
9923 sizeof(newChannelList) -
9924 j, " %d",
9925 chan_info->ChannelList[i]);
9926 else
9927 break;
9928 }
9929 }
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05309930 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009931 FL("LFR runtime successfully set roam scan channels to %s - old value is %s - roam state is %d"),
9932 newChannelList, oldChannelList,
9933 pMac->roam.neighborRoamInfo[sessionId].neighborRoamState);
9934 sme_release_global_lock(&pMac->sme);
9935
9936 if (pMac->roam.configParam.isRoamOffloadScanEnabled)
9937 csr_roam_offload_scan(pMac, sessionId,
9938 ROAM_SCAN_OFFLOAD_UPDATE_CFG,
9939 REASON_CHANNEL_LIST_CHANGED);
9940 return status;
9941}
9942
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009943/**
9944 * sme_get_roam_scan_channel_list() - To get roam scan channel list
9945 * @hHal: HAL pointer
9946 * @pChannelList: Output channel list
9947 * @pNumChannels: Output number of channels
9948 * @sessionId: Session Identifier
9949 *
9950 * To get roam scan channel list This is a synchronous call
9951 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309952 * Return: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009953 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309954QDF_STATUS sme_get_roam_scan_channel_list(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009955 uint8_t *pChannelList, uint8_t *pNumChannels,
9956 uint8_t sessionId)
9957{
9958 int i = 0;
9959 uint8_t *pOutPtr = pChannelList;
9960 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
9961 tpCsrNeighborRoamControlInfo pNeighborRoamInfo =
9962 &pMac->roam.neighborRoamInfo[sessionId];
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309963 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009964
9965 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309966 if (!QDF_IS_STATUS_SUCCESS(status))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009967 return status;
9968 if (NULL == pNeighborRoamInfo->cfgParams.channelInfo.ChannelList) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05309969 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_WARN,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009970 FL("Roam Scan channel list is NOT yet initialized"));
9971 *pNumChannels = 0;
9972 sme_release_global_lock(&pMac->sme);
9973 return status;
9974 }
9975
9976 *pNumChannels = pNeighborRoamInfo->cfgParams.channelInfo.numOfChannels;
9977 for (i = 0; i < (*pNumChannels); i++) {
9978 pOutPtr[i] =
9979 pNeighborRoamInfo->cfgParams.channelInfo.ChannelList[i];
9980 }
9981 pOutPtr[i] = '\0';
9982 sme_release_global_lock(&pMac->sme);
9983 return status;
9984}
9985
9986/*--------------------------------------------------------------------------
9987 \brief sme_get_is_ese_feature_enabled() - get ESE feature enabled or not
9988 This is a synchronuous call
9989 \param hHal - The handle returned by mac_open.
9990 \return true (1) - if the ESE feature is enabled
9991 false (0) - if feature is disabled (compile or runtime)
9992 \sa
9993 --------------------------------------------------------------------------*/
9994bool sme_get_is_ese_feature_enabled(tHalHandle hHal)
9995{
9996#ifdef FEATURE_WLAN_ESE
9997 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
9998 return csr_roam_is_ese_ini_feature_enabled(pMac);
9999#else
10000 return false;
10001#endif
10002}
10003
10004/*--------------------------------------------------------------------------
10005 \brief sme_get_wes_mode() - get WES Mode
10006 This is a synchronous call
10007 \param hHal - The handle returned by mac_open
10008 \return uint8_t - WES Mode Enabled(1)/Disabled(0)
10009 \sa
10010 --------------------------------------------------------------------------*/
10011bool sme_get_wes_mode(tHalHandle hHal)
10012{
10013 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
10014 return pMac->roam.configParam.isWESModeEnabled;
10015}
10016
10017/*--------------------------------------------------------------------------
10018 \brief sme_get_roam_scan_control() - get scan control
10019 This is a synchronous call
10020 \param hHal - The handle returned by mac_open.
10021 \return bool - Enabled(1)/Disabled(0)
10022 \sa
10023 --------------------------------------------------------------------------*/
10024bool sme_get_roam_scan_control(tHalHandle hHal)
10025{
10026 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
10027 return pMac->roam.configParam.nRoamScanControl;
10028}
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010029
10030/*--------------------------------------------------------------------------
10031 \brief sme_get_is_lfr_feature_enabled() - get LFR feature enabled or not
10032 This is a synchronuous call
10033 \param hHal - The handle returned by mac_open.
10034 \return true (1) - if the feature is enabled
10035 false (0) - if feature is disabled (compile or runtime)
10036 \sa
10037 --------------------------------------------------------------------------*/
10038bool sme_get_is_lfr_feature_enabled(tHalHandle hHal)
10039{
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010040 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
10041 return pMac->roam.configParam.isFastRoamIniFeatureEnabled;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010042}
10043
10044/*--------------------------------------------------------------------------
10045 \brief sme_get_is_ft_feature_enabled() - get FT feature enabled or not
10046 This is a synchronuous call
10047 \param hHal - The handle returned by mac_open.
10048 \return true (1) - if the feature is enabled
10049 false (0) - if feature is disabled (compile or runtime)
10050 \sa
10051 --------------------------------------------------------------------------*/
10052bool sme_get_is_ft_feature_enabled(tHalHandle hHal)
10053{
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010054 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
10055 return pMac->roam.configParam.isFastTransitionEnabled;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010056}
10057
10058/* ---------------------------------------------------------------------------
10059 \fn sme_is_feature_supported_by_fw
10060 \brief Check if an feature is enabled by FW
10061
10062 \param feattEnumValue - Enumeration value from placeHolderInCapBitmap
10063 \- return 1/0 (true/false)
10064 -------------------------------------------------------------------------*/
10065uint8_t sme_is_feature_supported_by_fw(uint8_t featEnumValue)
10066{
10067 return IS_FEATURE_SUPPORTED_BY_FW(featEnumValue);
10068}
10069
10070#ifdef FEATURE_WLAN_TDLS
10071
10072/* ---------------------------------------------------------------------------
10073 \fn sme_send_tdls_link_establish_params
10074 \brief API to send TDLS Peer Link Establishment Parameters.
10075
10076 \param peerMac - peer's Mac Adress.
10077 \param tdlsLinkEstablishParams - TDLS Peer Link Establishment Parameters
Anurag Chouhanf04e84f2016-03-03 10:12:12 +053010078 \- return QDF_STATUS_SUCCES
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010079 -------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010080QDF_STATUS sme_send_tdls_link_establish_params(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010081 uint8_t sessionId,
10082 const tSirMacAddr peerMac,
10083 tCsrTdlsLinkEstablishParams *
10084 tdlsLinkEstablishParams)
10085{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010086 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010087 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
10088
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053010089 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Sreelakshmi Konamki6744cff2015-09-07 12:10:39 +053010090 TRACE_CODE_SME_RX_HDD_TDLS_LINK_ESTABLISH_PARAM,
10091 sessionId,
10092 tdlsLinkEstablishParams->isOffChannelSupported));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010093 status = sme_acquire_global_lock(&pMac->sme);
10094
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010095 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010096 status = csr_tdls_send_link_establish_params(hHal, sessionId,
10097 peerMac, tdlsLinkEstablishParams);
10098 sme_release_global_lock(&pMac->sme);
10099 }
10100 return status;
10101}
10102
10103/* ---------------------------------------------------------------------------
10104 \fn sme_send_tdls_mgmt_frame
10105 \brief API to send TDLS management frames.
10106
10107 \param peerMac - peer's Mac Adress.
10108 \param frame_type - Type of TDLS mgmt frame to be sent.
10109 \param dialog - dialog token used in the frame.
10110 \param status - status to be incuded in the frame.
10111 \param peerCapability - peer cpabilities
10112 \param buf - additional IEs to be included
10113 \param len - lenght of additional Ies
10114 \param responder - Tdls request type
Anurag Chouhanf04e84f2016-03-03 10:12:12 +053010115 \- return QDF_STATUS_SUCCES
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010116 -------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010117QDF_STATUS sme_send_tdls_mgmt_frame(tHalHandle hHal, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010118 const tSirMacAddr peerMac,
10119 uint8_t frame_type,
10120 uint8_t dialog, uint16_t statusCode,
10121 uint32_t peerCapability, uint8_t *buf,
10122 uint8_t len, uint8_t responder)
10123{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010124 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010125 tCsrTdlsSendMgmt sendTdlsReq = { {0} };
10126 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
10127
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053010128 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Sreelakshmi Konamki6744cff2015-09-07 12:10:39 +053010129 TRACE_CODE_SME_RX_HDD_TDLS_SEND_MGMT_FRAME,
10130 sessionId, statusCode));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010131 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010132 if (QDF_IS_STATUS_SUCCESS(status)) {
Anurag Chouhan600c3a02016-03-01 10:33:54 +053010133 qdf_mem_copy(sendTdlsReq.peerMac, peerMac, sizeof(tSirMacAddr));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010134 sendTdlsReq.frameType = frame_type;
10135 sendTdlsReq.buf = buf;
10136 sendTdlsReq.len = len;
10137 sendTdlsReq.dialog = dialog;
10138 sendTdlsReq.statusCode = statusCode;
10139 sendTdlsReq.responder = responder;
10140 sendTdlsReq.peerCapability = peerCapability;
10141
10142 status = csr_tdls_send_mgmt_req(hHal, sessionId, &sendTdlsReq);
10143
10144 sme_release_global_lock(&pMac->sme);
10145 }
10146
10147 return status;
10148
10149}
10150
10151/* ---------------------------------------------------------------------------
10152 \fn sme_change_tdls_peer_sta
10153 \brief API to Update TDLS peer sta parameters.
10154
10155 \param peerMac - peer's Mac Adress.
10156 \param staParams - Peer Station Parameters
Anurag Chouhanf04e84f2016-03-03 10:12:12 +053010157 \- return QDF_STATUS_SUCCES
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010158 -------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010159QDF_STATUS sme_change_tdls_peer_sta(tHalHandle hHal, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010160 const tSirMacAddr peerMac,
10161 tCsrStaParams *pstaParams)
10162{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010163 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010164 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
10165
10166 if (NULL == pstaParams) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053010167 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010168 "%s :pstaParams is NULL", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010169 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010170 }
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053010171 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Sreelakshmi Konamki6744cff2015-09-07 12:10:39 +053010172 TRACE_CODE_SME_RX_HDD_TDLS_CHANGE_PEER_STA,
10173 sessionId, pstaParams->capability));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010174 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010175 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010176 status = csr_tdls_change_peer_sta(hHal, sessionId, peerMac,
10177 pstaParams);
10178
10179 sme_release_global_lock(&pMac->sme);
10180 }
10181
10182 return status;
10183
10184}
10185
10186/* ---------------------------------------------------------------------------
10187 \fn sme_add_tdls_peer_sta
10188 \brief API to Add TDLS peer sta entry.
10189
10190 \param peerMac - peer's Mac Adress.
Anurag Chouhanf04e84f2016-03-03 10:12:12 +053010191 \- return QDF_STATUS_SUCCES
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010192 -------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010193QDF_STATUS sme_add_tdls_peer_sta(tHalHandle hHal, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010194 const tSirMacAddr peerMac)
10195{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010196 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010197 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
10198
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053010199 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Sreelakshmi Konamki6744cff2015-09-07 12:10:39 +053010200 TRACE_CODE_SME_RX_HDD_TDLS_ADD_PEER_STA,
10201 sessionId, 0));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010202 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010203 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010204 status = csr_tdls_add_peer_sta(hHal, sessionId, peerMac);
10205
10206 sme_release_global_lock(&pMac->sme);
10207 }
10208
10209 return status;
10210
10211}
10212
10213/* ---------------------------------------------------------------------------
10214 \fn sme_delete_tdls_peer_sta
10215 \brief API to Delete TDLS peer sta entry.
10216
10217 \param peerMac - peer's Mac Adress.
Anurag Chouhanf04e84f2016-03-03 10:12:12 +053010218 \- return QDF_STATUS_SUCCES
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010219 -------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010220QDF_STATUS sme_delete_tdls_peer_sta(tHalHandle hHal, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010221 const tSirMacAddr peerMac)
10222{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010223 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010224 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
10225
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053010226 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Sreelakshmi Konamki6744cff2015-09-07 12:10:39 +053010227 TRACE_CODE_SME_RX_HDD_TDLS_DEL_PEER_STA,
10228 sessionId, 0));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010229 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010230 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010231 status = csr_tdls_del_peer_sta(hHal, sessionId, peerMac);
10232
10233 sme_release_global_lock(&pMac->sme);
10234 }
10235
10236 return status;
10237
10238}
10239
10240/* ---------------------------------------------------------------------------
10241 \fn sme_set_tdls_power_save_prohibited
10242 \API to set/reset the is_tdls_power_save_prohibited.
10243
10244 \- return void
10245 -------------------------------------------------------------------------*/
10246void sme_set_tdls_power_save_prohibited(tHalHandle hHal, uint32_t sessionId,
10247 bool val)
10248{
10249 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
10250 struct ps_global_info *ps_global_info = &pMac->sme.ps_global_info;
10251 struct ps_params *ps_param = &ps_global_info->ps_params[sessionId];
10252 ps_param->is_tdls_power_save_prohibited = val;
10253 return;
10254}
10255
10256/* ---------------------------------------------------------------------------
10257 \fn sme_update_fw_tdls_state
10258
10259 \brief
10260 SME will send message to WMA to set TDLS state in f/w
10261
10262 \param
10263
10264 hHal - The handle returned by mac_open
10265
10266 psmeTdlsParams - TDLS state info to update in f/w
10267
10268 useSmeLock - Need to acquire SME Global Lock before state update or not
10269
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010270 \return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010271 --------------------------------------------------------------------------- */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010272QDF_STATUS sme_update_fw_tdls_state(tHalHandle hHal, void *psmeTdlsParams,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010273 bool useSmeLock)
10274{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010275 QDF_STATUS status = QDF_STATUS_SUCCESS;
10276 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010277 tpAniSirGlobal pMac = NULL;
10278 cds_msg_t cds_message;
10279
Mukul Sharmaeae172c2016-09-03 13:40:46 +053010280 pMac = PMAC_STRUCT(hHal);
10281 if (NULL == pMac) {
10282 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
10283 FL("pMac is Null"));
10284 return QDF_STATUS_E_FAILURE;
10285 }
10286
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010287 /* only acquire sme global lock before state update if asked to */
10288 if (useSmeLock) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010289 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010290 if (QDF_STATUS_SUCCESS != status)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010291 return status;
10292 }
10293
10294 /* serialize the req through MC thread */
10295 cds_message.bodyptr = psmeTdlsParams;
10296 cds_message.type = WMA_UPDATE_FW_TDLS_STATE;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010297 qdf_status = cds_mq_post_message(CDS_MQ_ID_WMA, &cds_message);
10298 if (!QDF_IS_STATUS_SUCCESS(qdf_status))
10299 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010300
10301 /* release the lock if it was acquired */
10302 if (useSmeLock)
10303 sme_release_global_lock(&pMac->sme);
10304
10305 return status;
10306}
10307
10308/**
10309 * sme_update_tdls_peer_state() - to update the state of TDLS peer
10310 * @hHal: The handle returned by mac_open
10311 * @peerStateParams: TDLS Peer state info to update in f/w
10312 *
10313 * SME will send message to WMA to set TDLS Peer state in f/w
10314 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010315 * Return: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010316 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010317QDF_STATUS sme_update_tdls_peer_state(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010318 tSmeTdlsPeerStateParams *peerStateParams)
10319{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010320 QDF_STATUS status = QDF_STATUS_SUCCESS;
10321 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010322 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
10323 tTdlsPeerStateParams *pTdlsPeerStateParams = NULL;
10324 tTdlsPeerCapParams *peer_cap = NULL;
10325 cds_msg_t cds_message;
10326 uint8_t num;
Kabilan Kannan44f65862016-06-28 23:46:51 -070010327 uint8_t peer_chan_len;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010328 uint8_t chanId;
10329 uint8_t i;
10330
10331 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010332 if (!QDF_IS_STATUS_SUCCESS(status))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010333 return status;
Anurag Chouhan600c3a02016-03-01 10:33:54 +053010334 pTdlsPeerStateParams = qdf_mem_malloc(sizeof(*pTdlsPeerStateParams));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010335 if (NULL == pTdlsPeerStateParams) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053010336 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010337 FL("failed to allocate mem for tdls peer state param"));
10338 sme_release_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010339 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010340 }
10341
Anurag Chouhan600c3a02016-03-01 10:33:54 +053010342 qdf_mem_zero(pTdlsPeerStateParams, sizeof(*pTdlsPeerStateParams));
10343 qdf_mem_copy(&pTdlsPeerStateParams->peerMacAddr,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010344 &peerStateParams->peerMacAddr, sizeof(tSirMacAddr));
10345 pTdlsPeerStateParams->vdevId = peerStateParams->vdevId;
10346 pTdlsPeerStateParams->peerState = peerStateParams->peerState;
10347
10348 switch (peerStateParams->peerState) {
10349 case eSME_TDLS_PEER_STATE_PEERING:
10350 pTdlsPeerStateParams->peerState =
10351 WMA_TDLS_PEER_STATE_PEERING;
10352 break;
10353
10354 case eSME_TDLS_PEER_STATE_CONNECTED:
10355 pTdlsPeerStateParams->peerState =
10356 WMA_TDLS_PEER_STATE_CONNECTED;
10357 break;
10358
10359 case eSME_TDLS_PEER_STATE_TEARDOWN:
10360 pTdlsPeerStateParams->peerState =
10361 WMA_TDLS_PEER_STATE_TEARDOWN;
10362 break;
10363
Kabilan Kannan421714b2015-11-23 04:44:59 -080010364 case eSME_TDLS_PEER_ADD_MAC_ADDR:
10365 pTdlsPeerStateParams->peerState = WMA_TDLS_PEER_ADD_MAC_ADDR;
10366 break;
10367
10368 case eSME_TDLS_PEER_REMOVE_MAC_ADDR:
10369 pTdlsPeerStateParams->peerState = WMA_TDLS_PEER_REMOVE_MAC_ADDR;
10370 break;
10371
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010372 default:
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053010373 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010374 FL("invalid peer state param (%d)"),
10375 peerStateParams->peerState);
Kabilan Kannan44f65862016-06-28 23:46:51 -070010376 goto error_return;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010377 }
10378 peer_cap = &(pTdlsPeerStateParams->peerCap);
10379 peer_cap->isPeerResponder =
10380 peerStateParams->peerCap.isPeerResponder;
10381 peer_cap->peerUapsdQueue =
10382 peerStateParams->peerCap.peerUapsdQueue;
10383 peer_cap->peerMaxSp =
10384 peerStateParams->peerCap.peerMaxSp;
10385 peer_cap->peerBuffStaSupport =
10386 peerStateParams->peerCap.peerBuffStaSupport;
10387 peer_cap->peerOffChanSupport =
10388 peerStateParams->peerCap.peerOffChanSupport;
10389 peer_cap->peerCurrOperClass =
10390 peerStateParams->peerCap.peerCurrOperClass;
10391 peer_cap->selfCurrOperClass =
10392 peerStateParams->peerCap.selfCurrOperClass;
10393
10394 num = 0;
Kabilan Kannan44f65862016-06-28 23:46:51 -070010395 peer_chan_len = peerStateParams->peerCap.peerChanLen;
10396
10397 if (peer_chan_len >= 0 &&
10398 peer_chan_len <= SME_TDLS_MAX_SUPP_CHANNELS) {
10399 for (i = 0; i < peerStateParams->peerCap.peerChanLen; i++) {
10400 chanId = peerStateParams->peerCap.peerChan[i];
10401 if (csr_roam_is_channel_valid(pMac, chanId) &&
10402 !(cds_get_channel_state(chanId) ==
10403 CHANNEL_STATE_DFS) &&
10404 !cds_is_dsrc_channel(cds_chan_to_freq(chanId))) {
10405 peer_cap->peerChan[num].chanId = chanId;
10406 peer_cap->peerChan[num].pwr =
10407 csr_get_cfg_max_tx_power(pMac, chanId);
10408 peer_cap->peerChan[num].dfsSet = false;
Archana Ramachandran63f64dd2016-04-28 15:13:35 -070010409 num++;
Kabilan Kannan44f65862016-06-28 23:46:51 -070010410 }
Archana Ramachandran63f64dd2016-04-28 15:13:35 -070010411 }
Kabilan Kannan44f65862016-06-28 23:46:51 -070010412 } else {
10413 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
10414 FL("invalid peer channel len (%d)"),
10415 peer_chan_len);
10416 goto error_return;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010417 }
Kabilan Kannan44f65862016-06-28 23:46:51 -070010418
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010419 peer_cap->peerChanLen = num;
10420 peer_cap->peerOperClassLen =
10421 peerStateParams->peerCap.peerOperClassLen;
10422 for (i = 0; i < HAL_TDLS_MAX_SUPP_OPER_CLASSES; i++) {
10423 peer_cap->peerOperClass[i] =
10424 peerStateParams->peerCap.peerOperClass[i];
10425 }
10426
10427 peer_cap->prefOffChanNum =
10428 peerStateParams->peerCap.prefOffChanNum;
10429 peer_cap->prefOffChanBandwidth =
10430 peerStateParams->peerCap.prefOffChanBandwidth;
Masti, Narayanraddic4a7ab82015-11-25 15:41:10 +053010431 peer_cap->opClassForPrefOffChan =
10432 peerStateParams->peerCap.opClassForPrefOffChan;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010433
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010434 cds_message.type = WMA_UPDATE_TDLS_PEER_STATE;
10435 cds_message.reserved = 0;
10436 cds_message.bodyptr = pTdlsPeerStateParams;
10437
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010438 qdf_status = cds_mq_post_message(CDS_MQ_ID_WMA, &cds_message);
10439 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
Kabilan Kannan44f65862016-06-28 23:46:51 -070010440 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
10441 FL("cds_mq_post_message failed "));
10442 goto error_return;
10443 } else {
10444 goto success_return;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010445 }
Kabilan Kannan44f65862016-06-28 23:46:51 -070010446
10447error_return:
10448 status = QDF_STATUS_E_FAILURE;
10449 qdf_mem_free(pTdlsPeerStateParams);
10450success_return:
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010451 sme_release_global_lock(&pMac->sme);
10452 return status;
10453}
10454
10455/**
10456 * sme_send_tdls_chan_switch_req() - send tdls channel switch request
10457 * @hal: UMAC handler
10458 * @ch_switch_params: Pointer to the chan switch parameter structure
10459 *
10460 * API to set tdls channel switch parameters.
10461 *
Anurag Chouhanf04e84f2016-03-03 10:12:12 +053010462 * Return: QDF_STATUS_SUCCESS on success; another QDF_STATUS_** code otherwise
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010463 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010464QDF_STATUS sme_send_tdls_chan_switch_req(tHalHandle hal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010465 sme_tdls_chan_switch_params *ch_switch_params)
10466{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010467 QDF_STATUS status = QDF_STATUS_SUCCESS;
10468 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010469 tpAniSirGlobal mac = PMAC_STRUCT(hal);
10470 tdls_chan_switch_params *chan_switch_params = NULL;
10471 cds_msg_t cds_message;
10472
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053010473 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Sreelakshmi Konamki6744cff2015-09-07 12:10:39 +053010474 TRACE_CODE_SME_RX_HDD_TDLS_CHAN_SWITCH_REQ,
10475 NO_SESSION, ch_switch_params->tdls_off_channel));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010476 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010477 if (QDF_STATUS_SUCCESS != status)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010478 return status;
Anurag Chouhan600c3a02016-03-01 10:33:54 +053010479 chan_switch_params = qdf_mem_malloc(sizeof(*chan_switch_params));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010480 if (NULL == chan_switch_params) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053010481 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010482 FL("fail to alloc mem for tdls chan switch param"));
10483 sme_release_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010484 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010485 }
Anurag Chouhan600c3a02016-03-01 10:33:54 +053010486 qdf_mem_zero(chan_switch_params, sizeof(*chan_switch_params));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010487
10488 switch (ch_switch_params->tdls_off_ch_mode) {
10489 case ENABLE_CHANSWITCH:
10490 chan_switch_params->tdls_sw_mode = WMA_TDLS_ENABLE_OFFCHANNEL;
10491 break;
10492
10493 case DISABLE_CHANSWITCH:
10494 chan_switch_params->tdls_sw_mode = WMA_TDLS_DISABLE_OFFCHANNEL;
10495 break;
10496
10497 default:
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053010498 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010499 FL("invalid off channel command (%d)"),
10500 ch_switch_params->tdls_off_ch_mode);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053010501 qdf_mem_free(chan_switch_params);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010502 sme_release_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010503 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010504 }
10505
Anurag Chouhan600c3a02016-03-01 10:33:54 +053010506 qdf_mem_copy(&chan_switch_params->peer_mac_addr,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010507 &ch_switch_params->peer_mac_addr, sizeof(tSirMacAddr));
10508 chan_switch_params->vdev_id = ch_switch_params->vdev_id;
10509 chan_switch_params->tdls_off_ch = ch_switch_params->tdls_off_channel;
10510 chan_switch_params->tdls_off_ch_bw_offset =
10511 ch_switch_params->tdls_off_ch_bw_offset;
10512 chan_switch_params->is_responder = ch_switch_params->is_responder;
Masti, Narayanraddic4a7ab82015-11-25 15:41:10 +053010513 chan_switch_params->oper_class = ch_switch_params->opclass;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010514
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053010515 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010516 FL("Country Code=%s, Req offset=%d, Selected Operate Class=%d"),
10517 mac->scan.countryCodeCurrent,
10518 chan_switch_params->tdls_off_ch_bw_offset,
10519 chan_switch_params->oper_class);
10520
10521 cds_message.type = WMA_TDLS_SET_OFFCHAN_MODE;
10522 cds_message.reserved = 0;
10523 cds_message.bodyptr = chan_switch_params;
10524
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010525 qdf_status = cds_mq_post_message(CDS_MQ_ID_WMA, &cds_message);
10526 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053010527 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010528 FL("Message Post failed status=%d"),
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010529 qdf_status);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053010530 qdf_mem_free(chan_switch_params);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010531 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010532 }
10533 sme_release_global_lock(&mac->sme);
10534 return status;
10535}
10536#endif /* FEATURE_WLAN_TDLS */
10537
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010538QDF_STATUS sme_get_link_speed(tHalHandle hHal, tSirLinkSpeedInfo *lsReq,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010539 void *plsContext,
10540 void (*pCallbackfn)(tSirLinkSpeedInfo *indParam,
10541 void *pContext))
10542{
10543
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010544 QDF_STATUS status = QDF_STATUS_SUCCESS;
10545 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010546 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
10547 cds_msg_t cds_message;
10548
10549 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010550 if (QDF_STATUS_SUCCESS == status) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010551 if ((NULL == pCallbackfn) &&
10552 (NULL == pMac->sme.pLinkSpeedIndCb)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053010553 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010554 "%s: Indication Call back did not registered",
10555 __func__);
10556 sme_release_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010557 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010558 } else if (NULL != pCallbackfn) {
10559 pMac->sme.pLinkSpeedCbContext = plsContext;
10560 pMac->sme.pLinkSpeedIndCb = pCallbackfn;
10561 }
10562 /* serialize the req through MC thread */
10563 cds_message.bodyptr = lsReq;
10564 cds_message.type = WMA_GET_LINK_SPEED;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010565 qdf_status = cds_mq_post_message(CDS_MQ_ID_WMA, &cds_message);
10566 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053010567 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010568 "%s: Post Link Speed msg fail", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010569 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010570 }
10571 sme_release_global_lock(&pMac->sme);
10572 }
10573 return status;
10574}
10575
10576
10577/*
10578 * SME API to enable/disable WLAN driver initiated SSR
10579 */
10580void sme_update_enable_ssr(tHalHandle hHal, bool enableSSR)
10581{
10582 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010583 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010584
10585 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010586 if (QDF_IS_STATUS_SUCCESS(status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053010587 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010588 "SSR level is changed %d", enableSSR);
10589 /* not serializing this messsage, as this is only going
10590 * to set a variable in WMA/WDI
10591 */
10592 WMA_SetEnableSSR(enableSSR);
10593 sme_release_global_lock(&pMac->sme);
10594 }
10595 return;
10596}
10597
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010598QDF_STATUS sme_check_ch_in_band(tpAniSirGlobal mac_ctx, uint8_t start_ch,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010599 uint8_t ch_cnt)
10600{
10601 uint8_t i;
10602 for (i = 0; i < ch_cnt; i++) {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010603 if (QDF_STATUS_SUCCESS != csr_is_valid_channel(mac_ctx,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010604 (start_ch + i*4)))
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010605 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010606 }
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010607 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010608}
10609
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010610/*convert the ini value to the ENUM used in csr and MAC for CB state*/
10611ePhyChanBondState sme_get_cb_phy_state_from_cb_ini_value(uint32_t cb_ini_value)
10612{
10613 return csr_convert_cb_ini_value_to_phy_cb_state(cb_ini_value);
10614}
10615
10616/*--------------------------------------------------------------------------
10617
10618 \brief sme_set_curr_device_mode() - Sets the current operating device mode.
10619 \param hHal - The handle returned by mac_open.
10620 \param currDeviceMode - Current operating device mode.
10621 --------------------------------------------------------------------------*/
10622
Peng Xuf5d60c82015-10-02 17:17:03 -070010623void sme_set_curr_device_mode(tHalHandle hHal,
Anurag Chouhan6d760662016-02-20 16:05:43 +053010624 enum tQDF_ADAPTER_MODE currDeviceMode)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010625{
10626 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
10627 pMac->sme.currDeviceMode = currDeviceMode;
10628 return;
10629}
10630
10631/*--------------------------------------------------------------------------
10632 \brief sme_handoff_request() - a wrapper function to Request a handoff
10633 from CSR.
10634 This is a synchronous call
10635 \param hHal - The handle returned by mac_open
10636 \param sessionId - Session Identifier
10637 \param pHandoffInfo - info provided by HDD with the handoff request (namely:
10638 BSSID, channel etc.)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010639 \return QDF_STATUS_SUCCESS - SME passed the request to CSR successfully.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010640 Other status means SME is failed to send the request.
10641 \sa
10642 --------------------------------------------------------------------------*/
10643
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010644QDF_STATUS sme_handoff_request(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010645 uint8_t sessionId,
10646 tCsrHandoffRequest *pHandoffInfo)
10647{
10648 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010649 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010650
10651 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010652 if (QDF_IS_STATUS_SUCCESS(status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053010653 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010654 "%s: invoked", __func__);
10655 status = csr_handoff_request(pMac, sessionId, pHandoffInfo);
10656 sme_release_global_lock(&pMac->sme);
10657 }
10658
10659 return status;
10660}
10661
10662#ifdef IPA_OFFLOAD
10663/* ---------------------------------------------------------------------------
10664 \fn sme_ipa_offload_enable_disable
10665 \brief API to enable/disable IPA offload
10666 \param hal - The handle returned by macOpen.
10667 \param session_id - Session Identifier
10668 \param request - Pointer to the offload request.
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010669 \return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010670 ---------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010671QDF_STATUS sme_ipa_offload_enable_disable(tHalHandle hal, uint8_t session_id,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010672 struct sir_ipa_offload_enable_disable *request)
10673{
10674 tpAniSirGlobal pMac = PMAC_STRUCT(hal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010675 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010676 struct sir_ipa_offload_enable_disable *request_buf;
10677 cds_msg_t msg;
10678
10679 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010680 if (QDF_STATUS_SUCCESS == status) {
Anurag Chouhan600c3a02016-03-01 10:33:54 +053010681 request_buf = qdf_mem_malloc(sizeof(*request_buf));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010682 if (NULL == request_buf) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053010683 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010684 FL("Not able to allocate memory for \
10685 IPA_OFFLOAD_ENABLE_DISABLE"));
10686 sme_release_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010687 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010688 }
10689
10690 request_buf->offload_type = request->offload_type;
10691 request_buf->vdev_id = request->vdev_id;
10692 request_buf->enable = request->enable;
10693
10694 msg.type = WMA_IPA_OFFLOAD_ENABLE_DISABLE;
10695 msg.reserved = 0;
10696 msg.bodyptr = request_buf;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010697 if (!QDF_IS_STATUS_SUCCESS(
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010698 cds_mq_post_message(CDS_MQ_ID_WMA, &msg))) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053010699 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010700 FL("Not able to post WMA_IPA_OFFLOAD_\
10701 ENABLE_DISABLE message to WMA"));
Anurag Chouhan600c3a02016-03-01 10:33:54 +053010702 qdf_mem_free(request_buf);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010703 sme_release_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010704 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010705 }
10706
10707 sme_release_global_lock(&pMac->sme);
10708 }
10709
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010710 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010711}
10712#endif /* IPA_OFFLOAD */
10713
10714/*
10715 * SME API to check if there is any infra station or
10716 * P2P client is connected
10717 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010718QDF_STATUS sme_is_sta_p2p_client_connected(tHalHandle hHal)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010719{
10720 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
10721 if (csr_is_infra_connected(pMac)) {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010722 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010723 }
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010724 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010725}
10726
10727#ifdef FEATURE_WLAN_LPHB
10728/* ---------------------------------------------------------------------------
10729 \fn sme_lphb_config_req
10730 \API to make configuration LPHB within FW.
10731 \param hHal - The handle returned by mac_open
10732 \param lphdReq - LPHB request argument by client
10733 \param pCallbackfn - LPHB timeout notification callback function pointer
10734 \- return Configuration message posting status, SUCCESS or Fail
10735 -------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010736QDF_STATUS sme_lphb_config_req
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010737 (tHalHandle hHal,
10738 tSirLPHBReq *lphdReq,
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010739 void (*pCallbackfn)(void *pHddCtx, tSirLPHBInd * indParam)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010740 ) {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010741 QDF_STATUS status = QDF_STATUS_SUCCESS;
10742 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010743 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
10744 cds_msg_t cds_message;
10745
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053010746 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Sreelakshmi Konamki6744cff2015-09-07 12:10:39 +053010747 TRACE_CODE_SME_RX_HDD_LPHB_CONFIG_REQ,
10748 NO_SESSION, lphdReq->cmd));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010749 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010750 if (QDF_STATUS_SUCCESS == status) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010751 if ((LPHB_SET_EN_PARAMS_INDID == lphdReq->cmd) &&
10752 (NULL == pCallbackfn) && (NULL == pMac->sme.pLphbIndCb)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053010753 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010754 "%s: Indication Call back did not registered",
10755 __func__);
10756 sme_release_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010757 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010758 } else if (NULL != pCallbackfn) {
10759 pMac->sme.pLphbIndCb = pCallbackfn;
10760 }
10761
10762 /* serialize the req through MC thread */
10763 cds_message.bodyptr = lphdReq;
10764 cds_message.type = WMA_LPHB_CONF_REQ;
Sreelakshmi Konamki6a065362016-05-31 16:05:01 +053010765 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
10766 NO_SESSION, cds_message.type));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010767 qdf_status = cds_mq_post_message(CDS_MQ_ID_WMA, &cds_message);
10768 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053010769 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010770 "%s: Post Config LPHB MSG fail", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010771 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010772 }
10773 sme_release_global_lock(&pMac->sme);
10774 }
10775
10776 return status;
10777}
10778#endif /* FEATURE_WLAN_LPHB */
10779/*--------------------------------------------------------------------------
10780 \brief sme_enable_disable_split_scan() - a wrapper function to set the split
10781 scan parameter.
10782 This is a synchronous call
10783 \param hHal - The handle returned by mac_open
10784 \return NONE.
10785 \sa
10786 --------------------------------------------------------------------------*/
10787void sme_enable_disable_split_scan(tHalHandle hHal, uint8_t nNumStaChan,
10788 uint8_t nNumP2PChan)
10789{
10790 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
10791
10792 pMac->roam.configParam.nNumStaChanCombinedConc = nNumStaChan;
10793 pMac->roam.configParam.nNumP2PChanCombinedConc = nNumP2PChan;
10794
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053010795 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010796 "%s: SCAN nNumStaChanCombinedConc : %d,"
10797 "nNumP2PChanCombinedConc : %d ",
10798 __func__, nNumStaChan, nNumP2PChan);
10799
10800 return;
10801
10802}
10803
10804/**
10805 * sme_add_periodic_tx_ptrn() - Add Periodic TX Pattern
10806 * @hal: global hal handle
10807 * @addPeriodicTxPtrnParams: request message
10808 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010809 * Return: QDF_STATUS enumeration
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010810 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010811QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010812sme_add_periodic_tx_ptrn(tHalHandle hal,
10813 struct sSirAddPeriodicTxPtrn *addPeriodicTxPtrnParams)
10814{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010815 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010816 tpAniSirGlobal mac = PMAC_STRUCT(hal);
10817 struct sSirAddPeriodicTxPtrn *req_msg;
10818 cds_msg_t msg;
10819
10820 sms_log(mac, LOG1, FL("enter"));
10821
Anurag Chouhan600c3a02016-03-01 10:33:54 +053010822 req_msg = qdf_mem_malloc(sizeof(*req_msg));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010823 if (!req_msg) {
10824 sms_log(mac, LOGE, FL("memory allocation failed"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010825 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010826 }
10827
10828 *req_msg = *addPeriodicTxPtrnParams;
10829
10830 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010831 if (!QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010832 sms_log(mac, LOGE,
10833 FL("sme_acquire_global_lock failed!(status=%d)"),
10834 status);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053010835 qdf_mem_free(req_msg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010836 return status;
10837 }
10838
10839 /* Serialize the req through MC thread */
10840 msg.bodyptr = req_msg;
10841 msg.type = WMA_ADD_PERIODIC_TX_PTRN_IND;
Sreelakshmi Konamki6a065362016-05-31 16:05:01 +053010842 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
10843 NO_SESSION, msg.type));
Anurag Chouhan6d760662016-02-20 16:05:43 +053010844 status = cds_mq_post_message(QDF_MODULE_ID_WMA, &msg);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010845 if (!QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010846 sms_log(mac, LOGE,
10847 FL("cds_mq_post_message failed!(err=%d)"),
10848 status);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053010849 qdf_mem_free(req_msg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010850 }
10851 sme_release_global_lock(&mac->sme);
10852 return status;
10853}
10854
10855/**
10856 * sme_del_periodic_tx_ptrn() - Delete Periodic TX Pattern
10857 * @hal: global hal handle
10858 * @delPeriodicTxPtrnParams: request message
10859 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010860 * Return: QDF_STATUS enumeration
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010861 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010862QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010863sme_del_periodic_tx_ptrn(tHalHandle hal,
10864 struct sSirDelPeriodicTxPtrn *delPeriodicTxPtrnParams)
10865{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010866 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010867 tpAniSirGlobal mac = PMAC_STRUCT(hal);
10868 struct sSirDelPeriodicTxPtrn *req_msg;
10869 cds_msg_t msg;
10870
10871 sms_log(mac, LOG1, FL("enter"));
10872
Anurag Chouhan600c3a02016-03-01 10:33:54 +053010873 req_msg = qdf_mem_malloc(sizeof(*req_msg));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010874 if (!req_msg) {
10875 sms_log(mac, LOGE, FL("memory allocation failed"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010876 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010877 }
10878
10879 *req_msg = *delPeriodicTxPtrnParams;
10880
10881 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010882 if (!QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010883 sms_log(mac, LOGE,
10884 FL("sme_acquire_global_lock failed!(status=%d)"),
10885 status);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053010886 qdf_mem_free(req_msg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010887 return status;
10888 }
10889
10890 /* Serialize the req through MC thread */
10891 msg.bodyptr = req_msg;
10892 msg.type = WMA_DEL_PERIODIC_TX_PTRN_IND;
Sreelakshmi Konamki6a065362016-05-31 16:05:01 +053010893 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
10894 NO_SESSION, msg.type));
Anurag Chouhan6d760662016-02-20 16:05:43 +053010895 status = cds_mq_post_message(QDF_MODULE_ID_WMA, &msg);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010896 if (!QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010897 sms_log(mac, LOGE,
10898 FL("cds_mq_post_message failed!(err=%d)"),
10899 status);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053010900 qdf_mem_free(req_msg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010901 }
10902 sme_release_global_lock(&mac->sme);
10903 return status;
10904}
10905
Rajeev Kumar8e3e2832015-11-06 16:02:54 -080010906/**
10907 * sme_enable_rmc() - enables RMC
10908 * @hHal : Pointer to global HAL handle
10909 * @sessionId : Session ID
10910 *
10911 * Return: QDF_STATUS
10912 */
10913QDF_STATUS sme_enable_rmc(tHalHandle hHal, uint32_t sessionId)
10914{
10915 QDF_STATUS status = QDF_STATUS_E_FAILURE;
10916 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
10917 cds_msg_t cds_message;
10918 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
10919
10920 sms_log(pMac, LOG1, FL("enable RMC"));
10921 status = sme_acquire_global_lock(&pMac->sme);
10922 if (QDF_IS_STATUS_SUCCESS(status)) {
10923 cds_message.bodyptr = NULL;
10924 cds_message.type = WMA_RMC_ENABLE_IND;
10925 qdf_status = cds_mq_post_message(CDS_MQ_ID_WMA, &cds_message);
10926 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
10927 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
10928 "%s: failed to post message to WMA",
10929 __func__);
10930 status = QDF_STATUS_E_FAILURE;
10931 }
10932 sme_release_global_lock(&pMac->sme);
10933 }
10934 return status;
10935}
10936
10937/**
10938 * sme_disable_rmc() - disables RMC
10939 * @hHal : Pointer to global HAL handle
10940 * @sessionId : Session ID
10941 *
10942 * Return: QDF_STATUS
10943 */
10944QDF_STATUS sme_disable_rmc(tHalHandle hHal, uint32_t sessionId)
10945{
10946 QDF_STATUS status = QDF_STATUS_E_FAILURE;
10947 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
10948 cds_msg_t cds_message;
10949 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
10950
10951 sms_log(pMac, LOG1, FL("disable RMC"));
10952 status = sme_acquire_global_lock(&pMac->sme);
10953 if (QDF_IS_STATUS_SUCCESS(status)) {
10954 cds_message.bodyptr = NULL;
10955 cds_message.type = WMA_RMC_DISABLE_IND;
10956 qdf_status = cds_mq_post_message(CDS_MQ_ID_WMA, &cds_message);
10957 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
10958 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
10959 "%s: failed to post message to WMA",
10960 __func__);
10961 status = QDF_STATUS_E_FAILURE;
10962 }
10963 sme_release_global_lock(&pMac->sme);
10964 }
10965 return status;
10966}
10967
10968/**
10969 * sme_send_rmc_action_period() - sends RMC action period param to target
10970 * @hHal : Pointer to global HAL handle
10971 * @sessionId : Session ID
10972 *
10973 * Return: QDF_STATUS
10974 */
10975QDF_STATUS sme_send_rmc_action_period(tHalHandle hHal, uint32_t sessionId)
10976{
10977 QDF_STATUS status = QDF_STATUS_SUCCESS;
10978 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
10979 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
10980 cds_msg_t cds_message;
10981
10982 status = sme_acquire_global_lock(&pMac->sme);
10983 if (QDF_STATUS_SUCCESS == status) {
10984 cds_message.bodyptr = NULL;
10985 cds_message.type = WMA_RMC_ACTION_PERIOD_IND;
10986 qdf_status = cds_mq_post_message(CDS_MQ_ID_WMA, &cds_message);
10987 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
10988 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
10989 "%s: failed to post message to WMA",
10990 __func__);
10991 status = QDF_STATUS_E_FAILURE;
10992 }
10993 sme_release_global_lock(&pMac->sme);
10994 }
10995
10996 return status;
10997}
10998
10999/**
11000 * sme_request_ibss_peer_info() - request ibss peer info
11001 * @hHal : Pointer to global HAL handle
11002 * @pUserData : Pointer to user data
11003 * @peerInfoCbk : Peer info callback
11004 * @allPeerInfoReqd : All peer info required or not
11005 * @staIdx : sta index
11006 *
11007 * Return: QDF_STATUS
11008 */
11009QDF_STATUS sme_request_ibss_peer_info(tHalHandle hHal, void *pUserData,
11010 pIbssPeerInfoCb peerInfoCbk,
11011 bool allPeerInfoReqd, uint8_t staIdx)
11012{
11013 QDF_STATUS status = QDF_STATUS_E_FAILURE;
11014 QDF_STATUS qdf_status = QDF_STATUS_E_FAILURE;
11015 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
11016 cds_msg_t cds_message;
11017 tSirIbssGetPeerInfoReqParams *pIbssInfoReqParams;
11018
11019 status = sme_acquire_global_lock(&pMac->sme);
11020 if (QDF_STATUS_SUCCESS == status) {
11021 pMac->sme.peerInfoParams.peerInfoCbk = peerInfoCbk;
11022 pMac->sme.peerInfoParams.pUserData = pUserData;
11023
11024 pIbssInfoReqParams = (tSirIbssGetPeerInfoReqParams *)
11025 qdf_mem_malloc(sizeof(tSirIbssGetPeerInfoReqParams));
11026 if (NULL == pIbssInfoReqParams) {
11027 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
11028 "%s: Not able to allocate memory for dhcp start",
11029 __func__);
11030 sme_release_global_lock(&pMac->sme);
11031 return QDF_STATUS_E_NOMEM;
11032 }
11033 pIbssInfoReqParams->allPeerInfoReqd = allPeerInfoReqd;
11034 pIbssInfoReqParams->staIdx = staIdx;
11035
11036 cds_message.type = WMA_GET_IBSS_PEER_INFO_REQ;
11037 cds_message.bodyptr = pIbssInfoReqParams;
11038 cds_message.reserved = 0;
11039
11040 qdf_status = cds_mq_post_message(CDS_MQ_ID_WMA, &cds_message);
11041 if (QDF_STATUS_SUCCESS != qdf_status) {
11042 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
11043 "%s: Post WMA_GET_IBSS_PEER_INFO_REQ MSG failed",
11044 __func__);
11045 qdf_mem_free(pIbssInfoReqParams);
11046 qdf_status = QDF_STATUS_E_FAILURE;
11047 }
11048 sme_release_global_lock(&pMac->sme);
11049 }
11050
11051 return qdf_status;
11052}
11053
11054/* ---------------------------------------------------------------------------
11055 \fn sme_send_cesium_enable_ind
11056 \brief Used to send proprietary cesium enable indication to fw
11057 \param hHal
11058 \param sessionId
11059 \- return QDF_STATUS
11060 -------------------------------------------------------------------------*/
11061QDF_STATUS sme_send_cesium_enable_ind(tHalHandle hHal, uint32_t sessionId)
11062{
11063 QDF_STATUS status = QDF_STATUS_SUCCESS;
11064 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
11065 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
11066 cds_msg_t cds_message;
11067
11068 status = sme_acquire_global_lock(&pMac->sme);
11069 if (QDF_STATUS_SUCCESS == status) {
11070 cds_message.bodyptr = NULL;
11071 cds_message.type = WMA_IBSS_CESIUM_ENABLE_IND;
11072 qdf_status = cds_mq_post_message(CDS_MQ_ID_WMA, &cds_message);
11073 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
11074 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
11075 "%s: failed to post message to WMA",
11076 __func__);
11077 status = QDF_STATUS_E_FAILURE;
11078 }
11079 sme_release_global_lock(&pMac->sme);
11080 }
11081
11082 return status;
11083}
11084
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011085void sme_get_command_q_status(tHalHandle hHal)
11086{
11087 tSmeCmd *pTempCmd = NULL;
11088 tListElem *pEntry;
11089 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
11090
11091 if (NULL == pMac) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053011092 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011093 "%s: pMac is NULL", __func__);
11094 return;
11095 }
11096
11097 pEntry = csr_ll_peek_head(&pMac->sme.smeCmdActiveList, LL_ACCESS_LOCK);
11098 if (pEntry) {
11099 pTempCmd = GET_BASE_ADDR(pEntry, tSmeCmd, Link);
11100 }
11101 sms_log(pMac, LOGE, "Currently smeCmdActiveList has command (0x%X)",
11102 (pTempCmd) ? pTempCmd->command : eSmeNoCommand);
11103 if (pTempCmd) {
11104 if (eSmeCsrCommandMask & pTempCmd->command) {
11105 /* CSR command is stuck. See what the reason code is for that command */
11106 dump_csr_command_info(pMac, pTempCmd);
11107 }
11108 } /* if(pTempCmd) */
11109
11110 sms_log(pMac, LOGE, "Currently smeCmdPendingList has %d commands",
11111 csr_ll_count(&pMac->sme.smeCmdPendingList));
11112
11113 sms_log(pMac, LOGE, "Currently roamCmdPendingList has %d commands",
11114 csr_ll_count(&pMac->roam.roamCmdPendingList));
11115
11116 return;
11117}
Agrawal Ashishb141b092016-09-02 19:59:26 +053011118#ifdef WLAN_FEATURE_DSRC
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011119/**
11120 * sme_set_dot11p_config() - API to set the 802.11p config
11121 * @hHal: The handle returned by macOpen
11122 * @enable_dot11p: 802.11p config param
11123 */
11124void sme_set_dot11p_config(tHalHandle hHal, bool enable_dot11p)
11125{
11126 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
11127 pMac->enable_dot11p = enable_dot11p;
11128}
11129
11130/**
11131 * copy_sir_ocb_config() - Performs deep copy of an OCB configuration
11132 * @src: the source configuration
11133 *
11134 * Return: pointer to the copied OCB configuration
11135 */
11136static struct sir_ocb_config *sme_copy_sir_ocb_config(
11137 struct sir_ocb_config *src)
11138{
11139 struct sir_ocb_config *dst;
11140 uint32_t length;
11141 void *cursor;
11142
11143 length = sizeof(*src) +
11144 src->channel_count * sizeof(*src->channels) +
11145 src->schedule_size * sizeof(*src->schedule) +
11146 src->dcc_ndl_chan_list_len +
11147 src->dcc_ndl_active_state_list_len;
11148
Anurag Chouhan600c3a02016-03-01 10:33:54 +053011149 dst = qdf_mem_malloc(length);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011150 if (!dst)
11151 return NULL;
11152
11153 *dst = *src;
11154
11155 cursor = dst;
11156 cursor += sizeof(*dst);
11157 dst->channels = cursor;
11158 cursor += src->channel_count * sizeof(*src->channels);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053011159 qdf_mem_copy(dst->channels, src->channels,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011160 src->channel_count * sizeof(*src->channels));
11161 dst->schedule = cursor;
11162 cursor += src->schedule_size * sizeof(*src->schedule);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053011163 qdf_mem_copy(dst->schedule, src->schedule,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011164 src->schedule_size * sizeof(*src->schedule));
11165 dst->dcc_ndl_chan_list = cursor;
11166 cursor += src->dcc_ndl_chan_list_len;
Anurag Chouhan600c3a02016-03-01 10:33:54 +053011167 qdf_mem_copy(dst->dcc_ndl_chan_list, src->dcc_ndl_chan_list,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011168 src->dcc_ndl_chan_list_len);
11169 dst->dcc_ndl_active_state_list = cursor;
11170 cursor += src->dcc_ndl_active_state_list_len;
Anurag Chouhan600c3a02016-03-01 10:33:54 +053011171 qdf_mem_copy(dst->dcc_ndl_active_state_list,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011172 src->dcc_ndl_active_state_list,
11173 src->dcc_ndl_active_state_list_len);
11174 return dst;
11175}
11176
11177/**
11178 * sme_ocb_set_config() - Set the OCB configuration
11179 * @hHal: reference to the HAL
11180 * @context: the context of the call
11181 * @callback: the callback to hdd
11182 * @config: the OCB configuration
11183 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011184 * Return: QDF_STATUS_SUCCESS on success, QDF_STATUS_E_FAILURE on failure
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011185 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011186QDF_STATUS sme_ocb_set_config(tHalHandle hHal, void *context,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011187 ocb_callback callback,
11188 struct sir_ocb_config *config)
11189{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011190 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011191 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
11192 cds_msg_t msg = {0};
11193 struct sir_ocb_config *msg_body;
11194
11195 /* Lock the SME structure */
11196 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011197 if (!QDF_IS_STATUS_SUCCESS(status))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011198 return status;
11199
11200 /*
11201 * Check if there is a pending request and return an error if one
11202 * exists
11203 */
11204 if (pMac->sme.ocb_set_config_callback) {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011205 status = QDF_STATUS_E_BUSY;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011206 goto end;
11207 }
11208
11209 msg_body = sme_copy_sir_ocb_config(config);
11210
11211 if (!msg_body) {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011212 status = QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011213 goto end;
11214 }
11215
11216 msg.type = WMA_OCB_SET_CONFIG_CMD;
11217 msg.bodyptr = msg_body;
11218
11219 /* Set the request callback and context */
11220 pMac->sme.ocb_set_config_callback = callback;
11221 pMac->sme.ocb_set_config_context = context;
11222
Anurag Chouhan6d760662016-02-20 16:05:43 +053011223 status = cds_mq_post_message(QDF_MODULE_ID_WMA, &msg);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011224 if (!QDF_IS_STATUS_SUCCESS(status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053011225 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011226 FL("Error posting message to WDA: %d"), status);
11227 pMac->sme.ocb_set_config_callback = callback;
11228 pMac->sme.ocb_set_config_context = context;
Anurag Chouhan600c3a02016-03-01 10:33:54 +053011229 qdf_mem_free(msg_body);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011230 goto end;
11231 }
11232
11233end:
11234 sme_release_global_lock(&pMac->sme);
11235
11236 return status;
11237}
11238
11239/**
11240 * sme_ocb_set_utc_time() - Set the OCB UTC time
11241 * @hHal: reference to the HAL
11242 * @utc: the UTC time struct
11243 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011244 * Return: QDF_STATUS_SUCCESS on success, QDF_STATUS_E_FAILURE on failure
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011245 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011246QDF_STATUS sme_ocb_set_utc_time(tHalHandle hHal, struct sir_ocb_utc *utc)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011247{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011248 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011249 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
11250 cds_msg_t msg = {0};
11251 struct sir_ocb_utc *sme_utc;
11252
11253 /* Lock the SME structure */
11254 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011255 if (!QDF_IS_STATUS_SUCCESS(status))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011256 return status;
11257
Anurag Chouhan600c3a02016-03-01 10:33:54 +053011258 sme_utc = qdf_mem_malloc(sizeof(*sme_utc));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011259 if (!sme_utc) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053011260 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011261 FL("Malloc failed"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011262 status = QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011263 goto end;
11264 }
11265 *sme_utc = *utc;
11266
11267 msg.type = WMA_OCB_SET_UTC_TIME_CMD;
11268 msg.reserved = 0;
11269 msg.bodyptr = sme_utc;
Anurag Chouhan6d760662016-02-20 16:05:43 +053011270 status = cds_mq_post_message(QDF_MODULE_ID_WMA, &msg);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011271 if (!QDF_IS_STATUS_SUCCESS(status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053011272 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011273 FL("Not able to post message to WDA"));
Anurag Chouhan600c3a02016-03-01 10:33:54 +053011274 qdf_mem_free(utc);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011275 goto end;
11276 }
11277
11278end:
11279 sme_release_global_lock(&pMac->sme);
11280
11281 return status;
11282}
11283
11284/**
11285 * sme_ocb_start_timing_advert() - Start sending timing advert frames
11286 * @hHal: reference to the HAL
11287 * @timing_advert: the timing advertisement struct
11288 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011289 * Return: QDF_STATUS_SUCCESS on success, QDF_STATUS_E_FAILURE on failure
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011290 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011291QDF_STATUS sme_ocb_start_timing_advert(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011292 struct sir_ocb_timing_advert *timing_advert)
11293{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011294 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011295 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
11296 cds_msg_t msg = {0};
11297 void *buf;
11298 struct sir_ocb_timing_advert *sme_timing_advert;
11299
11300 /* Lock the SME structure */
11301 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011302 if (!QDF_IS_STATUS_SUCCESS(status))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011303 return status;
11304
Anurag Chouhan600c3a02016-03-01 10:33:54 +053011305 buf = qdf_mem_malloc(sizeof(*sme_timing_advert) +
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011306 timing_advert->template_length);
11307 if (!buf) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053011308 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011309 FL("Not able to allocate memory for start TA"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011310 status = QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011311 goto end;
11312 }
11313
11314 sme_timing_advert = (struct sir_ocb_timing_advert *)buf;
11315 *sme_timing_advert = *timing_advert;
11316 sme_timing_advert->template_value = buf + sizeof(*sme_timing_advert);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053011317 qdf_mem_copy(sme_timing_advert->template_value,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011318 timing_advert->template_value, timing_advert->template_length);
11319
11320 msg.type = WMA_OCB_START_TIMING_ADVERT_CMD;
11321 msg.reserved = 0;
11322 msg.bodyptr = buf;
Anurag Chouhan6d760662016-02-20 16:05:43 +053011323 status = cds_mq_post_message(QDF_MODULE_ID_WMA, &msg);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011324 if (!QDF_IS_STATUS_SUCCESS(status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053011325 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011326 FL("Not able to post msg to WDA"));
11327 goto end;
11328 }
11329
11330end:
11331 sme_release_global_lock(&pMac->sme);
11332
11333 return status;
11334}
11335
11336/**
11337 * sme_ocb_stop_timing_advert() - Stop sending timing advert frames on a channel
11338 * @hHal: reference to the HAL
11339 * @timing_advert: the timing advertisement struct
11340 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011341 * Return: QDF_STATUS_SUCCESS on success, QDF_STATUS_E_FAILURE on failure
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011342 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011343QDF_STATUS sme_ocb_stop_timing_advert(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011344 struct sir_ocb_timing_advert *timing_advert)
11345{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011346 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011347 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
11348 cds_msg_t msg = {0};
11349 struct sir_ocb_timing_advert *sme_timing_advert;
11350
11351 /* Lock the SME structure */
11352 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011353 if (!QDF_IS_STATUS_SUCCESS(status))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011354 return status;
11355
Anurag Chouhan600c3a02016-03-01 10:33:54 +053011356 sme_timing_advert = qdf_mem_malloc(sizeof(*timing_advert));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011357 if (!sme_timing_advert) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053011358 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011359 FL("Not able to allocate memory for stop TA"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011360 status = QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011361 goto end;
11362 }
11363 *sme_timing_advert = *timing_advert;
11364
11365 msg.type = WMA_OCB_STOP_TIMING_ADVERT_CMD;
11366 msg.reserved = 0;
11367 msg.bodyptr = sme_timing_advert;
Anurag Chouhan6d760662016-02-20 16:05:43 +053011368 status = cds_mq_post_message(QDF_MODULE_ID_WMA, &msg);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011369 if (!QDF_IS_STATUS_SUCCESS(status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053011370 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011371 FL("Not able to post msg to WDA"));
11372 goto end;
11373 }
11374
11375end:
11376 sme_release_global_lock(&pMac->sme);
11377
11378 return status;
11379}
11380
11381/**
Naveen Rawatb4d37622015-11-13 16:15:25 -080011382 * sme_ocb_gen_timing_advert_frame() - generate TA frame and populate the buffer
11383 * @hal_handle: reference to the HAL
11384 * @self_addr: the self MAC address
11385 * @buf: the buffer that will contain the frame
11386 * @timestamp_offset: return for the offset of the timestamp field
11387 * @time_value_offset: return for the time_value field in the TA IE
11388 *
11389 * Return: the length of the buffer.
11390 */
11391int sme_ocb_gen_timing_advert_frame(tHalHandle hal_handle,
11392 tSirMacAddr self_addr, uint8_t **buf,
11393 uint32_t *timestamp_offset,
11394 uint32_t *time_value_offset)
11395{
11396 int template_length;
11397 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal_handle);
11398
11399 template_length = sch_gen_timing_advert_frame(mac_ctx, self_addr, buf,
11400 timestamp_offset,
11401 time_value_offset);
11402 return template_length;
11403}
11404/**
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011405 * sme_ocb_get_tsf_timer() - Get the TSF timer value
11406 * @hHal: reference to the HAL
11407 * @context: the context of the call
11408 * @callback: the callback to hdd
11409 * @request: the TSF timer request
11410 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011411 * Return: QDF_STATUS_SUCCESS on success, QDF_STATUS_E_FAILURE on failure
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011412 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011413QDF_STATUS sme_ocb_get_tsf_timer(tHalHandle hHal, void *context,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011414 ocb_callback callback,
11415 struct sir_ocb_get_tsf_timer *request)
11416{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011417 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011418 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
11419 cds_msg_t msg = {0};
11420 struct sir_ocb_get_tsf_timer *msg_body;
11421
11422 /* Lock the SME structure */
11423 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011424 if (!QDF_IS_STATUS_SUCCESS(status))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011425 return status;
11426
11427 /* Allocate memory for the WMI request, and copy the parameter */
Anurag Chouhan600c3a02016-03-01 10:33:54 +053011428 msg_body = qdf_mem_malloc(sizeof(*msg_body));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011429 if (!msg_body) {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011430 status = QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011431 goto end;
11432 }
11433 *msg_body = *request;
11434
11435 msg.type = WMA_OCB_GET_TSF_TIMER_CMD;
11436 msg.bodyptr = msg_body;
11437
11438 /* Set the request callback and the context */
11439 pMac->sme.ocb_get_tsf_timer_callback = callback;
11440 pMac->sme.ocb_get_tsf_timer_context = context;
11441
11442 /* Post the message to WDA */
Anurag Chouhan6d760662016-02-20 16:05:43 +053011443 status = cds_mq_post_message(QDF_MODULE_ID_WMA, &msg);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011444 if (!QDF_IS_STATUS_SUCCESS(status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053011445 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011446 FL("Error posting message to WDA: %d"), status);
11447 pMac->sme.ocb_get_tsf_timer_callback = NULL;
11448 pMac->sme.ocb_get_tsf_timer_context = NULL;
Anurag Chouhan600c3a02016-03-01 10:33:54 +053011449 qdf_mem_free(msg_body);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011450 goto end;
11451 }
11452
11453end:
11454 sme_release_global_lock(&pMac->sme);
11455
11456 return status;
11457}
11458
11459/**
11460 * sme_dcc_get_stats() - Get the DCC stats
11461 * @hHal: reference to the HAL
11462 * @context: the context of the call
11463 * @callback: the callback to hdd
11464 * @request: the get DCC stats request
11465 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011466 * Return: QDF_STATUS_SUCCESS on success, QDF_STATUS_E_FAILURE on failure
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011467 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011468QDF_STATUS sme_dcc_get_stats(tHalHandle hHal, void *context,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011469 ocb_callback callback,
11470 struct sir_dcc_get_stats *request)
11471{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011472 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011473 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
11474 cds_msg_t msg = {0};
11475 struct sir_dcc_get_stats *msg_body;
11476
11477 /* Lock the SME structure */
11478 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011479 if (!QDF_IS_STATUS_SUCCESS(status))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011480 return status;
11481
11482 /* Allocate memory for the WMI request, and copy the parameter */
Anurag Chouhan600c3a02016-03-01 10:33:54 +053011483 msg_body = qdf_mem_malloc(sizeof(*msg_body) +
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011484 request->request_array_len);
11485 if (!msg_body) {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011486 status = QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011487 goto end;
11488 }
11489 *msg_body = *request;
11490 msg_body->request_array = (void *)msg_body + sizeof(*msg_body);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053011491 qdf_mem_copy(msg_body->request_array, request->request_array,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011492 request->request_array_len);
11493
11494 msg.type = WMA_DCC_GET_STATS_CMD;
11495 msg.bodyptr = msg_body;
11496
11497 /* Set the request callback and context */
11498 pMac->sme.dcc_get_stats_callback = callback;
11499 pMac->sme.dcc_get_stats_context = context;
11500
Anurag Chouhan6d760662016-02-20 16:05:43 +053011501 status = cds_mq_post_message(QDF_MODULE_ID_WMA, &msg);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011502 if (!QDF_IS_STATUS_SUCCESS(status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053011503 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011504 FL("Error posting message to WDA: %d"), status);
11505 pMac->sme.dcc_get_stats_callback = callback;
11506 pMac->sme.dcc_get_stats_context = context;
Anurag Chouhan600c3a02016-03-01 10:33:54 +053011507 qdf_mem_free(msg_body);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011508 goto end;
11509 }
11510
11511end:
11512 sme_release_global_lock(&pMac->sme);
11513
11514 return status;
11515}
11516
11517/**
11518 * sme_dcc_clear_stats() - Clear the DCC stats
11519 * @hHal: reference to the HAL
11520 * @vdev_id: vdev id for OCB interface
11521 * @dcc_stats_bitmap: the entries in the stats to clear
11522 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011523 * Return: QDF_STATUS_SUCCESS on success, QDF_STATUS_E_FAILURE on failure
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011524 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011525QDF_STATUS sme_dcc_clear_stats(tHalHandle hHal, uint32_t vdev_id,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011526 uint32_t dcc_stats_bitmap)
11527{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011528 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011529 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
11530 cds_msg_t msg = {0};
11531 struct sir_dcc_clear_stats *request;
11532
11533 /* Lock the SME structure */
11534 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011535 if (!QDF_IS_STATUS_SUCCESS(status))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011536 return status;
11537
Anurag Chouhan600c3a02016-03-01 10:33:54 +053011538 request = qdf_mem_malloc(sizeof(struct sir_dcc_clear_stats));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011539 if (!request) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053011540 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011541 FL("Not able to allocate memory"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011542 status = QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011543 goto end;
11544 }
11545
Anurag Chouhan600c3a02016-03-01 10:33:54 +053011546 qdf_mem_zero(request, sizeof(*request));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011547 request->vdev_id = vdev_id;
11548 request->dcc_stats_bitmap = dcc_stats_bitmap;
11549
11550 msg.type = WMA_DCC_CLEAR_STATS_CMD;
11551 msg.bodyptr = request;
11552
Anurag Chouhan6d760662016-02-20 16:05:43 +053011553 status = cds_mq_post_message(QDF_MODULE_ID_WMA, &msg);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011554 if (!QDF_IS_STATUS_SUCCESS(status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053011555 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011556 FL("Not able to post msg to WDA"));
Anurag Chouhan600c3a02016-03-01 10:33:54 +053011557 qdf_mem_free(request);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011558 goto end;
11559 }
11560
11561end:
11562 sme_release_global_lock(&pMac->sme);
11563
11564 return status;
11565}
11566
11567/**
11568 * sme_dcc_update_ndl() - Update the DCC settings
11569 * @hHal: reference to the HAL
11570 * @context: the context of the call
11571 * @callback: the callback to hdd
11572 * @request: the update DCC request
11573 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011574 * Return: QDF_STATUS_SUCCESS on success, QDF_STATUS_E_FAILURE on failure
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011575 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011576QDF_STATUS sme_dcc_update_ndl(tHalHandle hHal, void *context,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011577 ocb_callback callback,
11578 struct sir_dcc_update_ndl *request)
11579{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011580 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011581 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
11582 cds_msg_t msg = {0};
11583 struct sir_dcc_update_ndl *msg_body;
11584
11585 /* Lock the SME structure */
11586 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011587 if (!QDF_IS_STATUS_SUCCESS(status))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011588 return status;
11589
11590 /* Allocate memory for the WMI request, and copy the parameter */
Anurag Chouhan600c3a02016-03-01 10:33:54 +053011591 msg_body = qdf_mem_malloc(sizeof(*msg_body) +
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011592 request->dcc_ndl_chan_list_len +
11593 request->dcc_ndl_active_state_list_len);
11594 if (!msg_body) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053011595 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011596 FL("Failed to allocate memory"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011597 status = QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011598 goto end;
11599 }
11600
11601 *msg_body = *request;
11602
11603 msg_body->dcc_ndl_chan_list = (void *)msg_body + sizeof(*msg_body);
11604 msg_body->dcc_ndl_active_state_list = msg_body->dcc_ndl_chan_list +
11605 request->dcc_ndl_chan_list_len;
Anurag Chouhan600c3a02016-03-01 10:33:54 +053011606 qdf_mem_copy(msg_body->dcc_ndl_chan_list, request->dcc_ndl_chan_list,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011607 request->dcc_ndl_active_state_list_len);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053011608 qdf_mem_copy(msg_body->dcc_ndl_active_state_list,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011609 request->dcc_ndl_active_state_list,
11610 request->dcc_ndl_active_state_list_len);
11611
11612 msg.type = WMA_DCC_UPDATE_NDL_CMD;
11613 msg.bodyptr = msg_body;
11614
11615 /* Set the request callback and the context */
11616 pMac->sme.dcc_update_ndl_callback = callback;
11617 pMac->sme.dcc_update_ndl_context = context;
11618
Anurag Chouhan6d760662016-02-20 16:05:43 +053011619 status = cds_mq_post_message(QDF_MODULE_ID_WMA, &msg);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011620 if (!QDF_IS_STATUS_SUCCESS(status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053011621 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011622 FL("Error posting message to WDA: %d"), status);
11623 pMac->sme.dcc_update_ndl_callback = NULL;
11624 pMac->sme.dcc_update_ndl_context = NULL;
Anurag Chouhan600c3a02016-03-01 10:33:54 +053011625 qdf_mem_free(msg_body);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011626 goto end;
11627 }
11628
11629end:
11630 sme_release_global_lock(&pMac->sme);
11631
11632 return status;
11633}
11634
11635/**
11636 * sme_register_for_dcc_stats_event() - Register for the periodic DCC stats
11637 * event
11638 * @hHal: reference to the HAL
11639 * @context: the context of the call
11640 * @callback: the callback to hdd
11641 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011642 * Return: QDF_STATUS_SUCCESS on success, QDF_STATUS_E_FAILURE on failure
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011643 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011644QDF_STATUS sme_register_for_dcc_stats_event(tHalHandle hHal, void *context,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011645 ocb_callback callback)
11646{
11647 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011648 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011649
11650 status = sme_acquire_global_lock(&pMac->sme);
11651 pMac->sme.dcc_stats_event_callback = callback;
11652 pMac->sme.dcc_stats_event_context = context;
11653 sme_release_global_lock(&pMac->sme);
11654
11655 return 0;
11656}
11657
Arun Khandavalli4b55da72016-07-19 19:55:01 +053011658/**
11659 * sme_deregister_for_dcc_stats_event() - De-Register for the periodic DCC stats
11660 * event
11661 * @h_hal: Hal Handle
11662 *
11663 * This function de-registers the DCC perioc stats callback
11664 *
11665 * Return: QDF_STATUS Enumeration
11666 */
11667QDF_STATUS sme_deregister_for_dcc_stats_event(tHalHandle h_hal)
11668{
11669 tpAniSirGlobal mac;
11670 QDF_STATUS status;
11671
11672 if (!h_hal) {
11673 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
11674 FL("h_hal is not valid"));
11675 return QDF_STATUS_E_INVAL;
11676 }
11677 mac = PMAC_STRUCT(h_hal);
11678
11679 status = sme_acquire_global_lock(&mac->sme);
11680 if (!QDF_IS_STATUS_SUCCESS(status)) {
11681 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
11682 FL("Failed to acquire global lock"));
11683 return status;
11684 }
11685 mac->sme.dcc_stats_event_callback = NULL;
11686 mac->sme.dcc_stats_event_context = NULL;
11687 sme_release_global_lock(&mac->sme);
11688
11689 return status;
11690}
Agrawal Ashishb141b092016-09-02 19:59:26 +053011691#endif
Arun Khandavalli4b55da72016-07-19 19:55:01 +053011692
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011693void sme_get_recovery_stats(tHalHandle hHal)
11694{
11695 uint8_t i;
11696
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053011697 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011698 "Self Recovery Stats");
11699 for (i = 0; i < MAX_ACTIVE_CMD_STATS; i++) {
11700 if (eSmeNoCommand !=
11701 g_self_recovery_stats.activeCmdStats[i].command) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053011702 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011703 "timestamp %llu: command 0x%0X: reason %d: session %d",
11704 g_self_recovery_stats.activeCmdStats[i].
11705 timestamp,
11706 g_self_recovery_stats.activeCmdStats[i].command,
11707 g_self_recovery_stats.activeCmdStats[i].reason,
11708 g_self_recovery_stats.activeCmdStats[i].
11709 sessionId);
11710 }
11711 }
11712}
11713
11714/**
11715 * sme_save_active_cmd_stats() - To save active command stats
11716 * @hHal: HAL context
11717 *
11718 * This routine is to save active command stats
11719 *
11720 * Return: None
11721 */
11722void sme_save_active_cmd_stats(tHalHandle hHal)
11723{
11724 tSmeCmd *pTempCmd = NULL;
11725 tListElem *pEntry;
11726 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
11727 uint8_t statidx = 0;
11728 tActiveCmdStats *actv_cmd_stat = NULL;
11729
11730 if (NULL == pMac) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053011731 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011732 FL("pMac is NULL"));
11733 return;
11734 }
11735
11736 pEntry = csr_ll_peek_head(&pMac->sme.smeCmdActiveList, LL_ACCESS_LOCK);
11737 if (pEntry)
11738 pTempCmd = GET_BASE_ADDR(pEntry, tSmeCmd, Link);
11739
11740 if (!pTempCmd)
11741 return;
11742
11743 if (eSmeCsrCommandMask & pTempCmd->command) {
11744 statidx = g_self_recovery_stats.cmdStatsIndx;
11745 actv_cmd_stat = &g_self_recovery_stats.activeCmdStats[statidx];
11746 actv_cmd_stat->command = pTempCmd->command;
11747 actv_cmd_stat->sessionId = pTempCmd->sessionId;
11748 actv_cmd_stat->timestamp = cds_get_monotonic_boottime();
11749 if (eSmeCommandRoam == pTempCmd->command)
11750 actv_cmd_stat->reason = pTempCmd->u.roamCmd.roamReason;
11751 else if (eSmeCommandScan == pTempCmd->command)
11752 actv_cmd_stat->reason = pTempCmd->u.scanCmd.reason;
11753 else
11754 actv_cmd_stat->reason = 0xFF;
11755
11756 g_self_recovery_stats.cmdStatsIndx =
11757 ((g_self_recovery_stats.cmdStatsIndx + 1) &
11758 (MAX_ACTIVE_CMD_STATS - 1));
11759 }
11760 return;
11761}
11762
11763void active_list_cmd_timeout_handle(void *userData)
11764{
Abhishek Singh5ea86532016-04-27 14:10:53 +053011765 tHalHandle hal = (tHalHandle)userData;
11766 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
Kapil Gupta63ddab22016-08-09 16:41:24 +053011767 tListElem *entry;
11768 tSmeCmd *temp_cmd = NULL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011769
Abhishek Singh5ea86532016-04-27 14:10:53 +053011770 if (NULL == mac_ctx) {
11771 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
11772 "%s: mac_ctx is null", __func__);
11773 return;
11774 }
11775 /* Return if no cmd pending in active list as
11776 * in this case we should not be here.
11777 */
11778 if (0 == csr_ll_count(&mac_ctx->sme.smeCmdActiveList))
11779 return;
11780 sms_log(mac_ctx, LOGE,
11781 FL("Active List command timeout Cmd List Count %d"),
11782 csr_ll_count(&mac_ctx->sme.smeCmdActiveList));
11783 sme_get_command_q_status(hal);
11784
11785 if (mac_ctx->roam.configParam.enable_fatal_event)
11786 cds_flush_logs(WLAN_LOG_TYPE_FATAL,
11787 WLAN_LOG_INDICATOR_HOST_DRIVER,
11788 WLAN_LOG_REASON_SME_COMMAND_STUCK,
11789 false,
11790 mac_ctx->sme.enableSelfRecovery ? true : false);
11791 else
11792 qdf_trace_dump_all(mac_ctx, 0, 0, 500, 0);
11793
Kapil Gupta63ddab22016-08-09 16:41:24 +053011794 entry = csr_ll_peek_head(&mac_ctx->sme.smeCmdActiveList,
11795 LL_ACCESS_LOCK);
11796 if (entry)
11797 temp_cmd = GET_BASE_ADDR(entry, tSmeCmd, Link);
11798 /* Ignore if ROC took more than 120 sec */
11799 if (temp_cmd && (eSmeCommandRemainOnChannel == temp_cmd->command))
11800 return;
11801
Abhishek Singh5ea86532016-04-27 14:10:53 +053011802 if (mac_ctx->sme.enableSelfRecovery) {
11803 sme_save_active_cmd_stats(hal);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011804 cds_trigger_recovery();
11805 } else {
Abhishek Singh5ea86532016-04-27 14:10:53 +053011806 if (!mac_ctx->roam.configParam.enable_fatal_event &&
11807 !(cds_is_load_or_unload_in_progress() ||
11808 cds_is_driver_recovering()))
11809 QDF_BUG(0);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011810 }
11811}
11812
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011813QDF_STATUS sme_notify_modem_power_state(tHalHandle hHal, uint32_t value)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011814{
11815 cds_msg_t msg;
11816 tpSirModemPowerStateInd request_buf;
11817 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
11818
11819 if (NULL == pMac) {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011820 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011821 }
11822
Anurag Chouhan600c3a02016-03-01 10:33:54 +053011823 request_buf = qdf_mem_malloc(sizeof(tSirModemPowerStateInd));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011824 if (NULL == request_buf) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053011825 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011826 "%s: Not able to allocate memory for MODEM POWER STATE IND",
11827 __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011828 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011829 }
11830
11831 request_buf->param = value;
11832
11833 msg.type = WMA_MODEM_POWER_STATE_IND;
11834 msg.reserved = 0;
11835 msg.bodyptr = request_buf;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011836 if (!QDF_IS_STATUS_SUCCESS
Anurag Chouhan6d760662016-02-20 16:05:43 +053011837 (cds_mq_post_message(QDF_MODULE_ID_WMA, &msg))) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053011838 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011839 "%s: Not able to post WMA_MODEM_POWER_STATE_IND message"
11840 " to WMA", __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053011841 qdf_mem_free(request_buf);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011842 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011843 }
11844
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011845 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011846}
11847
11848#ifdef QCA_HT_2040_COEX
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011849QDF_STATUS sme_notify_ht2040_mode(tHalHandle hHal, uint16_t staId,
Anurag Chouhan6d760662016-02-20 16:05:43 +053011850 struct qdf_mac_addr macAddrSTA,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011851 uint8_t sessionId,
11852 uint8_t channel_type)
11853{
11854 cds_msg_t msg;
11855 tUpdateVHTOpMode *pHtOpMode = NULL;
11856 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
11857
11858 if (NULL == pMac) {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011859 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011860 }
11861
Anurag Chouhan600c3a02016-03-01 10:33:54 +053011862 pHtOpMode = qdf_mem_malloc(sizeof(tUpdateVHTOpMode));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011863 if (NULL == pHtOpMode) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053011864 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011865 "%s: Not able to allocate memory for setting OP mode",
11866 __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011867 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011868 }
11869
11870 switch (channel_type) {
11871 case eHT_CHAN_HT20:
11872 pHtOpMode->opMode = eHT_CHANNEL_WIDTH_20MHZ;
11873 break;
11874
11875 case eHT_CHAN_HT40MINUS:
11876 case eHT_CHAN_HT40PLUS:
11877 pHtOpMode->opMode = eHT_CHANNEL_WIDTH_40MHZ;
11878 break;
11879
11880 default:
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053011881 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011882 "%s: Invalid OP mode", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011883 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011884 }
11885
11886 pHtOpMode->staId = staId,
Anurag Chouhan600c3a02016-03-01 10:33:54 +053011887 qdf_mem_copy(pHtOpMode->peer_mac, macAddrSTA.bytes,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011888 sizeof(tSirMacAddr));
11889 pHtOpMode->smesessionId = sessionId;
11890
11891 msg.type = WMA_UPDATE_OP_MODE;
11892 msg.reserved = 0;
11893 msg.bodyptr = pHtOpMode;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011894 if (!QDF_IS_STATUS_SUCCESS
Anurag Chouhan6d760662016-02-20 16:05:43 +053011895 (cds_mq_post_message(QDF_MODULE_ID_WMA, &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_UPDATE_OP_MODE message"
11898 " to WMA", __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053011899 qdf_mem_free(pHtOpMode);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011900 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011901 }
11902
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053011903 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011904 "%s: Notifed FW about OP mode: %d for staId=%d",
11905 __func__, pHtOpMode->opMode, staId);
11906
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011907 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011908}
11909
11910/* ---------------------------------------------------------------------------
11911
11912 \fn sme_set_ht2040_mode
11913
11914 \brief To update HT Operation beacon IE.
11915
11916 \param
11917
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011918 \return QDF_STATUS SUCCESS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011919 FAILURE or RESOURCES
11920 The API finished and failed.
11921
11922 -------------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011923QDF_STATUS sme_set_ht2040_mode(tHalHandle hHal, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011924 uint8_t channel_type, bool obssEnabled)
11925{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011926 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011927 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
11928 ePhyChanBondState cbMode;
11929
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053011930 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011931 "%s: Update HT operation beacon IE, channel_type=%d",
11932 __func__, channel_type);
11933
11934 switch (channel_type) {
11935 case eHT_CHAN_HT20:
11936 cbMode = PHY_SINGLE_CHANNEL_CENTERED;
11937 break;
11938 case eHT_CHAN_HT40MINUS:
11939 cbMode = PHY_DOUBLE_CHANNEL_HIGH_PRIMARY;
11940 break;
11941 case eHT_CHAN_HT40PLUS:
11942 cbMode = PHY_DOUBLE_CHANNEL_LOW_PRIMARY;
11943 break;
11944 default:
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053011945 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011946 "%s:Error!!! Invalid HT20/40 mode !", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011947 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011948 }
11949 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011950 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011951 status = csr_set_ht2040_mode(pMac, sessionId,
11952 cbMode, obssEnabled);
11953 sme_release_global_lock(&pMac->sme);
11954 }
11955 return status;
11956}
11957
11958/* ---------------------------------------------------------------------------
11959
11960 \fn sme_set_phy_cb_mode24_g
11961
11962 \brief Changes PHY channel bonding mode
11963
11964 \param hHal - The handle returned by mac_open.
11965
11966 \param cbMode new channel bonding mode which is to set
11967
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011968 \return QDF_STATUS SUCCESS.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011969
11970 -------------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011971QDF_STATUS sme_set_phy_cb_mode24_g(tHalHandle hHal, ePhyChanBondState phyCBMode)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011972{
11973 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
11974
11975 if (NULL == pMac) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053011976 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011977 "%s: invalid context", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011978 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011979 }
11980
11981 pMac->roam.configParam.channelBondingMode24GHz = phyCBMode;
11982
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011983 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011984}
11985#endif
11986
11987/*
11988 * SME API to enable/disable idle mode powersave
11989 * This should be called only if powersave offload
11990 * is enabled
11991 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011992QDF_STATUS sme_set_idle_powersave_config(void *cds_context,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011993 tHalHandle hHal, uint32_t value)
11994{
Anurag Chouhan6d760662016-02-20 16:05:43 +053011995 void *wmaContext = cds_get_context(QDF_MODULE_ID_WMA);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011996 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
11997
11998 if (NULL == wmaContext) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053011999 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012000 "%s: wmaContext is NULL", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012001 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012002 }
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053012003 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012004 " Idle Ps Set Value %d", value);
12005
12006 pMac->imps_enabled = false;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012007 if (QDF_STATUS_SUCCESS != wma_set_idle_ps_config(wmaContext, value)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053012008 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012009 " Failed to Set Idle Ps Value %d", value);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012010 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012011 }
12012 if (value)
12013 pMac->imps_enabled = true;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012014 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012015}
12016
12017int16_t sme_get_ht_config(tHalHandle hHal, uint8_t session_id, uint16_t ht_capab)
12018{
12019 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
12020 tCsrRoamSession *pSession = CSR_GET_SESSION(pMac, session_id);
12021
12022 if (NULL == pSession) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053012023 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012024 "%s: pSession is NULL", __func__);
12025 return -EIO;
12026 }
12027 switch (ht_capab) {
12028 case WNI_CFG_HT_CAP_INFO_ADVANCE_CODING:
12029 return pSession->htConfig.ht_rx_ldpc;
12030 case WNI_CFG_HT_CAP_INFO_TX_STBC:
12031 return pSession->htConfig.ht_tx_stbc;
12032 case WNI_CFG_HT_CAP_INFO_RX_STBC:
12033 return pSession->htConfig.ht_rx_stbc;
12034 case WNI_CFG_HT_CAP_INFO_SHORT_GI_20MHZ:
Sandeep Puligilla607f34a2016-05-25 14:37:47 -070012035 return pSession->htConfig.ht_sgi20;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012036 case WNI_CFG_HT_CAP_INFO_SHORT_GI_40MHZ:
Sandeep Puligilla607f34a2016-05-25 14:37:47 -070012037 return pSession->htConfig.ht_sgi40;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012038 default:
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053012039 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012040 "invalid ht capability");
12041 return -EIO;
12042 }
12043}
12044
12045int sme_update_ht_config(tHalHandle hHal, uint8_t sessionId, uint16_t htCapab,
12046 int value)
12047{
12048 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
12049 tCsrRoamSession *pSession = CSR_GET_SESSION(pMac, sessionId);
12050
12051 if (NULL == pSession) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053012052 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012053 "%s: pSession is NULL", __func__);
12054 return -EIO;
12055 }
12056
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012057 if (QDF_STATUS_SUCCESS != wma_set_htconfig(sessionId, htCapab, value)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053012058 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012059 "Failed to set ht capability in target");
12060 return -EIO;
12061 }
12062
12063 switch (htCapab) {
12064 case WNI_CFG_HT_CAP_INFO_ADVANCE_CODING:
12065 pSession->htConfig.ht_rx_ldpc = value;
12066 break;
12067 case WNI_CFG_HT_CAP_INFO_TX_STBC:
12068 pSession->htConfig.ht_tx_stbc = value;
12069 break;
12070 case WNI_CFG_HT_CAP_INFO_RX_STBC:
12071 pSession->htConfig.ht_rx_stbc = value;
12072 break;
12073 case WNI_CFG_HT_CAP_INFO_SHORT_GI_20MHZ:
Sandeep Puligilla607f34a2016-05-25 14:37:47 -070012074 pSession->htConfig.ht_sgi20 = value;
12075 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012076 case WNI_CFG_HT_CAP_INFO_SHORT_GI_40MHZ:
Sandeep Puligilla607f34a2016-05-25 14:37:47 -070012077 pSession->htConfig.ht_sgi40 = value;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012078 break;
12079 }
12080
12081 return 0;
12082}
12083
12084#define HT20_SHORT_GI_MCS7_RATE 722
12085/* ---------------------------------------------------------------------------
12086 \fn sme_send_rate_update_ind
12087 \brief API to Update rate
12088 \param hHal - The handle returned by mac_open
12089 \param rateUpdateParams - Pointer to rate update params
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012090 \return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012091 ---------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012092QDF_STATUS sme_send_rate_update_ind(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012093 tSirRateUpdateInd *rateUpdateParams)
12094{
12095 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012096 QDF_STATUS status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012097 cds_msg_t msg;
Anurag Chouhan600c3a02016-03-01 10:33:54 +053012098 tSirRateUpdateInd *rate_upd = qdf_mem_malloc(sizeof(tSirRateUpdateInd));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012099
12100 if (rate_upd == NULL) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053012101 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012102 "Rate update struct alloc failed");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012103 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012104 }
12105 *rate_upd = *rateUpdateParams;
12106
12107 if (rate_upd->mcastDataRate24GHz == HT20_SHORT_GI_MCS7_RATE)
12108 rate_upd->mcastDataRate24GHzTxFlag =
12109 eHAL_TX_RATE_HT20 | eHAL_TX_RATE_SGI;
12110 else if (rate_upd->reliableMcastDataRate ==
12111 HT20_SHORT_GI_MCS7_RATE)
12112 rate_upd->reliableMcastDataRateTxFlag =
12113 eHAL_TX_RATE_HT20 | eHAL_TX_RATE_SGI;
12114
12115 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012116 if (QDF_STATUS_SUCCESS == status) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012117 msg.type = WMA_RATE_UPDATE_IND;
12118 msg.bodyptr = rate_upd;
Sreelakshmi Konamki6a065362016-05-31 16:05:01 +053012119 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
12120 NO_SESSION, msg.type));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012121 if (!QDF_IS_STATUS_SUCCESS
Anurag Chouhan6d760662016-02-20 16:05:43 +053012122 (cds_mq_post_message(QDF_MODULE_ID_WMA, &msg))) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053012123 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012124 "%s: Not able "
12125 "to post WMA_SET_RMC_RATE_IND to WMA!",
12126 __func__);
12127
12128 sme_release_global_lock(&pMac->sme);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053012129 qdf_mem_free(rate_upd);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012130 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012131 }
12132
12133 sme_release_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012134 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012135 }
12136
12137 return status;
12138}
12139
12140/**
Kondabattini, Ganeshe4f18e02016-09-13 13:01:22 +053012141 * sme_update_access_policy_vendor_ie() - update vendor ie and access policy.
12142 * @hal: Pointer to the mac context
12143 * @session_id: sme session id
12144 * @vendor_ie: vendor ie
12145 * @access_policy: vendor ie access policy
12146 *
12147 * This function updates the vendor ie and access policy to lim.
12148 *
12149 * Return: success or failure.
12150 */
12151QDF_STATUS sme_update_access_policy_vendor_ie(tHalHandle hal,
12152 uint8_t session_id, uint8_t *vendor_ie, int access_policy)
12153{
12154 struct sme_update_access_policy_vendor_ie *msg;
12155 uint16_t msg_len;
12156 QDF_STATUS status = QDF_STATUS_E_FAILURE;
12157 tpAniSirGlobal mac = PMAC_STRUCT(hal);
12158
12159 msg_len = sizeof(*msg);
12160
12161 msg = qdf_mem_malloc(msg_len);
12162 if (!msg) {
12163 sms_log(mac, LOGE,
12164 "failed to allocate memory for sme_update_access_policy_vendor_ie");
12165 return QDF_STATUS_E_FAILURE;
12166 }
12167
12168 qdf_mem_set(msg, msg_len, 0);
12169 msg->msg_type = (uint16_t)eWNI_SME_UPDATE_ACCESS_POLICY_VENDOR_IE;
12170 msg->length = (uint16_t)msg_len;
12171
12172 qdf_mem_copy(&msg->ie[0], vendor_ie, sizeof(msg->ie));
12173
12174 msg->sme_session_id = session_id;
12175 msg->access_policy = access_policy;
12176
12177 sms_log(mac, LOG1, "sme_session_id %hu, access_policy %d", session_id,
12178 access_policy);
12179
12180 status = cds_send_mb_message_to_mac(msg);
12181
12182 return status;
12183}
12184
12185/**
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012186 * sme_get_reg_info() - To get registration info
12187 * @hHal: HAL context
12188 * @chanId: channel id
12189 * @regInfo1: first reg info to fill
12190 * @regInfo2: second reg info to fill
12191 *
12192 * This routine will give you reg info
12193 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012194 * Return: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012195 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012196QDF_STATUS sme_get_reg_info(tHalHandle hHal, uint8_t chanId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012197 uint32_t *regInfo1, uint32_t *regInfo2)
12198{
12199 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012200 QDF_STATUS status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012201 uint8_t i;
12202 bool found = false;
12203
12204 status = sme_acquire_global_lock(&pMac->sme);
12205 *regInfo1 = 0;
12206 *regInfo2 = 0;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012207 if (!QDF_IS_STATUS_SUCCESS(status))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012208 return status;
12209
12210 for (i = 0; i < WNI_CFG_VALID_CHANNEL_LIST_LEN; i++) {
Amar Singhala297bfa2015-10-15 15:07:29 -070012211 if (pMac->scan.defaultPowerTable[i].chan_num == chanId) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012212 SME_SET_CHANNEL_REG_POWER(*regInfo1,
Amar Singhala297bfa2015-10-15 15:07:29 -070012213 pMac->scan.defaultPowerTable[i].power);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012214
12215 SME_SET_CHANNEL_MAX_TX_POWER(*regInfo2,
Amar Singhala297bfa2015-10-15 15:07:29 -070012216 pMac->scan.defaultPowerTable[i].power);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012217 found = true;
12218 break;
12219 }
12220 }
12221 if (!found)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012222 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012223
12224 sme_release_global_lock(&pMac->sme);
12225 return status;
12226}
12227
12228#ifdef FEATURE_WLAN_AUTO_SHUTDOWN
12229/* ---------------------------------------------------------------------------
12230 \fn sme_auto_shutdown_cb
12231 \brief Used to plug in callback function for receiving auto shutdown evt
12232 \param hHal
12233 \param pCallbackfn : callback function pointer should be plugged in
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012234 \- return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012235 -------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012236QDF_STATUS sme_set_auto_shutdown_cb(tHalHandle hHal, void (*pCallbackfn)(void)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012237 ) {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012238 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012239 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
12240
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053012241 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012242 "%s: Plug in Auto shutdown event callback", __func__);
12243
12244 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012245 if (QDF_STATUS_SUCCESS == status) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012246 if (NULL != pCallbackfn) {
12247 pMac->sme.pAutoShutdownNotificationCb = pCallbackfn;
12248 }
12249 sme_release_global_lock(&pMac->sme);
12250 }
12251
12252 return status;
12253}
12254
12255/* ---------------------------------------------------------------------------
12256 \fn sme_set_auto_shutdown_timer
12257 \API to set auto shutdown timer value in FW.
12258 \param hHal - The handle returned by mac_open
12259 \param timer_val - The auto shutdown timer value to be set
12260 \- return Configuration message posting status, SUCCESS or Fail
12261 -------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012262QDF_STATUS sme_set_auto_shutdown_timer(tHalHandle hHal, uint32_t timer_val)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012263{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012264 QDF_STATUS status = QDF_STATUS_SUCCESS;
12265 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012266 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
12267 tSirAutoShutdownCmdParams *auto_sh_cmd;
12268 cds_msg_t cds_message;
12269
12270 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012271 if (QDF_STATUS_SUCCESS == status) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012272 auto_sh_cmd = (tSirAutoShutdownCmdParams *)
Anurag Chouhan600c3a02016-03-01 10:33:54 +053012273 qdf_mem_malloc(sizeof(tSirAutoShutdownCmdParams));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012274 if (auto_sh_cmd == NULL) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053012275 QDF_TRACE(QDF_MODULE_ID_HDD, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012276 "%s Request Buffer Alloc Fail", __func__);
12277 sme_release_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012278 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012279 }
12280
12281 auto_sh_cmd->timer_val = timer_val;
12282
12283 /* serialize the req through MC thread */
12284 cds_message.bodyptr = auto_sh_cmd;
12285 cds_message.type = WMA_SET_AUTO_SHUTDOWN_TIMER_REQ;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012286 qdf_status = cds_mq_post_message(CDS_MQ_ID_WMA, &cds_message);
12287 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053012288 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012289 "%s: Post Auto shutdown MSG fail", __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053012290 qdf_mem_free(auto_sh_cmd);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012291 sme_release_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012292 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012293 }
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053012294 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012295 "%s: Posted Auto shutdown MSG", __func__);
12296 sme_release_global_lock(&pMac->sme);
12297 }
12298
12299 return status;
12300}
12301#endif
12302
12303#ifdef FEATURE_WLAN_CH_AVOID
12304/* ---------------------------------------------------------------------------
12305 \fn sme_add_ch_avoid_callback
12306 \brief Used to plug in callback function
12307 Which notify channel may not be used with SAP or P2PGO mode.
12308 Notification come from FW.
12309 \param hHal
12310 \param pCallbackfn : callback function pointer should be plugged in
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012311 \- return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012312 -------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012313QDF_STATUS sme_add_ch_avoid_callback
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012314 (tHalHandle hHal, void (*pCallbackfn)(void *pAdapter, void *indParam)
12315 ) {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012316 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012317 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
12318
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053012319 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012320 "%s: Plug in CH AVOID CB", __func__);
12321
12322 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012323 if (QDF_STATUS_SUCCESS == status) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012324 if (NULL != pCallbackfn) {
12325 pMac->sme.pChAvoidNotificationCb = pCallbackfn;
12326 }
12327 sme_release_global_lock(&pMac->sme);
12328 }
12329
12330 return status;
12331}
12332
12333/* ---------------------------------------------------------------------------
12334 \fn sme_ch_avoid_update_req
12335 \API to request channel avoidance update from FW.
12336 \param hHal - The handle returned by mac_open
12337 \param update_type - The udpate_type parameter of this request call
12338 \- return Configuration message posting status, SUCCESS or Fail
12339 -------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012340QDF_STATUS sme_ch_avoid_update_req(tHalHandle hHal)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012341{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012342 QDF_STATUS status = QDF_STATUS_SUCCESS;
12343 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012344 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
12345 tSirChAvoidUpdateReq *cauReq;
12346 cds_msg_t cds_message;
12347
12348 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012349 if (QDF_STATUS_SUCCESS == status) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012350 cauReq = (tSirChAvoidUpdateReq *)
Anurag Chouhan600c3a02016-03-01 10:33:54 +053012351 qdf_mem_malloc(sizeof(tSirChAvoidUpdateReq));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012352 if (NULL == cauReq) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053012353 QDF_TRACE(QDF_MODULE_ID_HDD, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012354 "%s Request Buffer Alloc Fail", __func__);
12355 sme_release_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012356 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012357 }
12358
12359 cauReq->reserved_param = 0;
12360
12361 /* serialize the req through MC thread */
12362 cds_message.bodyptr = cauReq;
12363 cds_message.type = WMA_CH_AVOID_UPDATE_REQ;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012364 qdf_status = cds_mq_post_message(CDS_MQ_ID_WMA, &cds_message);
12365 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053012366 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012367 "%s: Post Ch Avoid Update MSG fail",
12368 __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053012369 qdf_mem_free(cauReq);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012370 sme_release_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012371 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012372 }
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053012373 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012374 "%s: Posted Ch Avoid Update MSG", __func__);
12375 sme_release_global_lock(&pMac->sme);
12376 }
12377
12378 return status;
12379}
12380#endif /* FEATURE_WLAN_CH_AVOID */
12381
12382/**
12383 * sme_set_miracast() - Function to set miracast value to UMAC
12384 * @hal: Handle returned by macOpen
12385 * @filter_type: 0-Disabled, 1-Source, 2-sink
12386 *
12387 * This function passes down the value of miracast set by
12388 * framework to UMAC
12389 *
12390 * Return: Configuration message posting status, SUCCESS or Fail
12391 *
12392 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012393QDF_STATUS sme_set_miracast(tHalHandle hal, uint8_t filter_type)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012394{
12395 cds_msg_t msg;
12396 uint32_t *val;
12397 tpAniSirGlobal mac_ptr = PMAC_STRUCT(hal);
12398
Anurag Chouhan600c3a02016-03-01 10:33:54 +053012399 val = qdf_mem_malloc(sizeof(*val));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012400 if (NULL == val || NULL == mac_ptr) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053012401 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012402 "%s: Invalid pointer", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012403 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012404 }
12405
12406 *val = filter_type;
12407
12408 msg.type = SIR_HAL_SET_MIRACAST;
12409 msg.reserved = 0;
12410 msg.bodyptr = val;
12411
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012412 if (!QDF_IS_STATUS_SUCCESS(
Anurag Chouhan6d760662016-02-20 16:05:43 +053012413 cds_mq_post_message(QDF_MODULE_ID_WMA, &msg))) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053012414 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012415 "%s: Not able to post WDA_SET_MAS_ENABLE_DISABLE to WMA!",
12416 __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053012417 qdf_mem_free(val);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012418 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012419 }
12420
12421 mac_ptr->sme.miracast_value = filter_type;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012422 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012423}
12424
12425/**
12426 * sme_set_mas() - Function to set MAS value to UMAC
12427 * @val: 1-Enable, 0-Disable
12428 *
12429 * This function passes down the value of MAS to the UMAC. A
12430 * value of 1 will enable MAS and a value of 0 will disable MAS
12431 *
12432 * Return: Configuration message posting status, SUCCESS or Fail
12433 *
12434 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012435QDF_STATUS sme_set_mas(uint32_t val)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012436{
12437 cds_msg_t msg;
12438 uint32_t *ptr_val;
12439
Anurag Chouhan600c3a02016-03-01 10:33:54 +053012440 ptr_val = qdf_mem_malloc(sizeof(*ptr_val));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012441 if (NULL == ptr_val) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053012442 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012443 "%s: could not allocate ptr_val", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012444 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012445 }
12446
12447 *ptr_val = val;
12448
12449 msg.type = SIR_HAL_SET_MAS;
12450 msg.reserved = 0;
12451 msg.bodyptr = ptr_val;
12452
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012453 if (!QDF_IS_STATUS_SUCCESS(
Anurag Chouhan6d760662016-02-20 16:05:43 +053012454 cds_mq_post_message(QDF_MODULE_ID_WMA, &msg))) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053012455 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012456 "%s: Not able to post WDA_SET_MAS_ENABLE_DISABLE to WMA!",
12457 __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053012458 qdf_mem_free(ptr_val);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012459 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012460 }
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012461 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012462}
12463
Kiran Kumar Lokere999e58c2016-01-07 02:18:39 -080012464/**
12465 * sme_roam_channel_change_req() - Channel change to new target channel
12466 * @hHal: handle returned by mac_open
12467 * @bssid: mac address of BSS
12468 * @ch_params: target channel information
12469 * @profile: CSR profile
12470 *
12471 * API to Indicate Channel change to new target channel
12472 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012473 * Return: QDF_STATUS
Kiran Kumar Lokere999e58c2016-01-07 02:18:39 -080012474 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012475QDF_STATUS sme_roam_channel_change_req(tHalHandle hHal,
Amar Singhale4f28ee2015-10-21 14:36:56 -070012476 struct qdf_mac_addr bssid,
12477 struct ch_params_s *ch_params,
12478 tCsrRoamProfile *profile)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012479{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012480 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012481 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012482
12483 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012484 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012485
Kiran Kumar Lokere999e58c2016-01-07 02:18:39 -080012486 status = csr_roam_channel_change_req(pMac, bssid, ch_params,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012487 profile);
12488 sme_release_global_lock(&pMac->sme);
12489 }
12490 return status;
12491}
12492
12493/* -------------------------------------------------------------------------
12494 \fn sme_process_channel_change_resp
12495 \brief API to Indicate Channel change response message to SAP.
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012496 \return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012497 ---------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012498QDF_STATUS sme_process_channel_change_resp(tpAniSirGlobal pMac,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012499 uint16_t msg_type, void *pMsgBuf)
12500{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012501 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012502 tCsrRoamInfo proam_info = { 0 };
12503 eCsrRoamResult roamResult;
12504 tpSwitchChannelParams pChnlParams = (tpSwitchChannelParams) pMsgBuf;
12505 uint32_t SessionId = pChnlParams->peSessionId;
12506
12507 proam_info.channelChangeRespEvent =
12508 (tSirChanChangeResponse *)
Anurag Chouhan600c3a02016-03-01 10:33:54 +053012509 qdf_mem_malloc(sizeof(tSirChanChangeResponse));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012510 if (NULL == proam_info.channelChangeRespEvent) {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012511 status = QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012512 sms_log(pMac, LOGE,
12513 "Channel Change Event Allocation Failed: %d\n", status);
12514 return status;
12515 }
12516 if (msg_type == eWNI_SME_CHANNEL_CHANGE_RSP) {
12517 proam_info.channelChangeRespEvent->sessionId = SessionId;
12518 proam_info.channelChangeRespEvent->newChannelNumber =
12519 pChnlParams->channelNumber;
12520 proam_info.channelChangeRespEvent->secondaryChannelOffset =
12521 pChnlParams->ch_width;
12522
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012523 if (pChnlParams->status == QDF_STATUS_SUCCESS) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053012524 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO_MED,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012525 "sapdfs: Received success eWNI_SME_CHANNEL_CHANGE_RSP for sessionId[%d]",
12526 SessionId);
12527 proam_info.channelChangeRespEvent->channelChangeStatus =
12528 1;
12529 roamResult = eCSR_ROAM_RESULT_CHANNEL_CHANGE_SUCCESS;
12530 } else {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053012531 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO_MED,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012532 "sapdfs: Received failure eWNI_SME_CHANNEL_CHANGE_RSP for sessionId[%d]",
12533 SessionId);
12534 proam_info.channelChangeRespEvent->channelChangeStatus =
12535 0;
12536 roamResult = eCSR_ROAM_RESULT_CHANNEL_CHANGE_FAILURE;
12537 }
12538
12539 csr_roam_call_callback(pMac, SessionId, &proam_info, 0,
12540 eCSR_ROAM_SET_CHANNEL_RSP, roamResult);
12541
12542 } else {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012543 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012544 sms_log(pMac, LOGE, "Invalid Channel Change Resp Message: %d\n",
12545 status);
12546 }
Anurag Chouhan600c3a02016-03-01 10:33:54 +053012547 qdf_mem_free(proam_info.channelChangeRespEvent);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012548
12549 return status;
12550}
12551
12552/* -------------------------------------------------------------------------
12553 \fn sme_roam_start_beacon_req
12554 \brief API to Indicate LIM to start Beacon Tx
12555 \after SAP CAC Wait is completed.
12556 \param hHal - The handle returned by mac_open
12557 \param sessionId - session ID
12558 \param dfsCacWaitStatus - CAC WAIT status flag
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012559 \return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012560 ---------------------------------------------------------------------------*/
Anurag Chouhan6d760662016-02-20 16:05:43 +053012561QDF_STATUS sme_roam_start_beacon_req(tHalHandle hHal, struct qdf_mac_addr bssid,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012562 uint8_t dfsCacWaitStatus)
12563{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012564 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012565 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
12566 status = sme_acquire_global_lock(&pMac->sme);
12567
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012568 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012569 status = csr_roam_start_beacon_req(pMac, bssid, dfsCacWaitStatus);
12570 sme_release_global_lock(&pMac->sme);
12571 }
12572 return status;
12573}
12574
Kiran Kumar Lokere999e58c2016-01-07 02:18:39 -080012575/**
12576 * sme_roam_csa_ie_request() - request CSA IE transmission from PE
12577 * @hHal: handle returned by mac_open
12578 * @bssid: SAP bssid
12579 * @targetChannel: target channel information
12580 * @csaIeReqd: CSA IE Request
12581 * @ch_params: channel information
12582 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012583 * Return: QDF_STATUS
Kiran Kumar Lokere999e58c2016-01-07 02:18:39 -080012584 */
Anurag Chouhan6d760662016-02-20 16:05:43 +053012585QDF_STATUS sme_roam_csa_ie_request(tHalHandle hHal, struct qdf_mac_addr bssid,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012586 uint8_t targetChannel, uint8_t csaIeReqd,
Amar Singhale4f28ee2015-10-21 14:36:56 -070012587 struct ch_params_s *ch_params)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012588{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012589 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012590 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
12591 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012592 if (QDF_IS_STATUS_SUCCESS(status)) {
Kiran Kumar Lokere999e58c2016-01-07 02:18:39 -080012593 status = csr_roam_send_chan_sw_ie_request(pMac, bssid,
12594 targetChannel, csaIeReqd, ch_params);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012595 sme_release_global_lock(&pMac->sme);
12596 }
12597 return status;
12598}
12599
12600/* ---------------------------------------------------------------------------
12601 \fn sme_init_thermal_info
12602 \brief SME API to initialize the thermal mitigation parameters
12603 \param hHal
12604 \param thermalParam : thermal mitigation parameters
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012605 \- return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012606 -------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012607QDF_STATUS sme_init_thermal_info(tHalHandle hHal, tSmeThermalParams thermalParam)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012608{
12609 t_thermal_mgmt *pWmaParam;
12610 cds_msg_t msg;
12611 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
12612
Anurag Chouhan600c3a02016-03-01 10:33:54 +053012613 pWmaParam = (t_thermal_mgmt *) qdf_mem_malloc(sizeof(t_thermal_mgmt));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012614 if (NULL == pWmaParam) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053012615 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012616 "%s: could not allocate tThermalMgmt", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012617 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012618 }
12619
Anurag Chouhan600c3a02016-03-01 10:33:54 +053012620 qdf_mem_zero((void *)pWmaParam, sizeof(t_thermal_mgmt));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012621
12622 pWmaParam->thermalMgmtEnabled = thermalParam.smeThermalMgmtEnabled;
12623 pWmaParam->throttlePeriod = thermalParam.smeThrottlePeriod;
Poddar, Siddarth83905022016-04-16 17:56:08 -070012624
12625 pWmaParam->throttle_duty_cycle_tbl[0] =
12626 thermalParam.sme_throttle_duty_cycle_tbl[0];
12627 pWmaParam->throttle_duty_cycle_tbl[1] =
12628 thermalParam.sme_throttle_duty_cycle_tbl[1];
12629 pWmaParam->throttle_duty_cycle_tbl[2] =
12630 thermalParam.sme_throttle_duty_cycle_tbl[2];
12631 pWmaParam->throttle_duty_cycle_tbl[3] =
12632 thermalParam.sme_throttle_duty_cycle_tbl[3];
12633
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012634 pWmaParam->thermalLevels[0].minTempThreshold =
12635 thermalParam.smeThermalLevels[0].smeMinTempThreshold;
12636 pWmaParam->thermalLevels[0].maxTempThreshold =
12637 thermalParam.smeThermalLevels[0].smeMaxTempThreshold;
12638 pWmaParam->thermalLevels[1].minTempThreshold =
12639 thermalParam.smeThermalLevels[1].smeMinTempThreshold;
12640 pWmaParam->thermalLevels[1].maxTempThreshold =
12641 thermalParam.smeThermalLevels[1].smeMaxTempThreshold;
12642 pWmaParam->thermalLevels[2].minTempThreshold =
12643 thermalParam.smeThermalLevels[2].smeMinTempThreshold;
12644 pWmaParam->thermalLevels[2].maxTempThreshold =
12645 thermalParam.smeThermalLevels[2].smeMaxTempThreshold;
12646 pWmaParam->thermalLevels[3].minTempThreshold =
12647 thermalParam.smeThermalLevels[3].smeMinTempThreshold;
12648 pWmaParam->thermalLevels[3].maxTempThreshold =
12649 thermalParam.smeThermalLevels[3].smeMaxTempThreshold;
12650
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012651 if (QDF_STATUS_SUCCESS == sme_acquire_global_lock(&pMac->sme)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012652 msg.type = WMA_INIT_THERMAL_INFO_CMD;
12653 msg.bodyptr = pWmaParam;
12654
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012655 if (!QDF_IS_STATUS_SUCCESS
Anurag Chouhan6d760662016-02-20 16:05:43 +053012656 (cds_mq_post_message(QDF_MODULE_ID_WMA, &msg))) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053012657 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012658 "%s: Not able to post WMA_SET_THERMAL_INFO_CMD to WMA!",
12659 __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053012660 qdf_mem_free(pWmaParam);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012661 sme_release_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012662 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012663 }
12664 sme_release_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012665 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012666 }
Anurag Chouhan600c3a02016-03-01 10:33:54 +053012667 qdf_mem_free(pWmaParam);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012668 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012669}
12670
12671/**
12672 * sme_add_set_thermal_level_callback() - Plug in set thermal level callback
12673 * @hal: Handle returned by macOpen
12674 * @callback: sme_set_thermal_level_callback
12675 *
12676 * Plug in set thermal level callback
12677 *
12678 * Return: none
12679 */
12680void sme_add_set_thermal_level_callback(tHalHandle hal,
12681 sme_set_thermal_level_callback callback)
12682{
12683 tpAniSirGlobal pMac = PMAC_STRUCT(hal);
12684
12685 pMac->sme.set_thermal_level_cb = callback;
12686}
12687
12688/**
12689 * sme_set_thermal_level() - SME API to set the thermal mitigation level
12690 * @hal: Handler to HAL
12691 * @level: Thermal mitigation level
12692 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012693 * Return: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012694 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012695QDF_STATUS sme_set_thermal_level(tHalHandle hal, uint8_t level)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012696{
12697 cds_msg_t msg;
12698 tpAniSirGlobal pMac = PMAC_STRUCT(hal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012699 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012700
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012701 if (QDF_STATUS_SUCCESS == sme_acquire_global_lock(&pMac->sme)) {
Anurag Chouhan600c3a02016-03-01 10:33:54 +053012702 qdf_mem_set(&msg, sizeof(msg), 0);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012703 msg.type = WMA_SET_THERMAL_LEVEL;
12704 msg.bodyval = level;
12705
Anurag Chouhan6d760662016-02-20 16:05:43 +053012706 qdf_status = cds_mq_post_message(QDF_MODULE_ID_WMA, &msg);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012707 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053012708 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012709 "%s: Not able to post WMA_SET_THERMAL_LEVEL to WMA!",
12710 __func__);
12711 sme_release_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012712 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012713 }
12714 sme_release_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012715 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012716 }
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012717 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012718}
12719
12720/* ---------------------------------------------------------------------------
12721 \fn sme_txpower_limit
12722 \brief SME API to set txpower limits
12723 \param hHal
12724 \param psmetx : power limits for 2g/5g
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012725 \- return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012726 -------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012727QDF_STATUS sme_txpower_limit(tHalHandle hHal, tSirTxPowerLimit *psmetx)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012728{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012729 QDF_STATUS status = QDF_STATUS_SUCCESS;
12730 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012731 cds_msg_t cds_message;
12732 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Prashanth Bhatta75fa9a12016-01-11 18:30:08 -080012733 tSirTxPowerLimit *tx_power_limit;
12734
Anurag Chouhan600c3a02016-03-01 10:33:54 +053012735 tx_power_limit = qdf_mem_malloc(sizeof(*tx_power_limit));
Prashanth Bhatta75fa9a12016-01-11 18:30:08 -080012736 if (!tx_power_limit) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053012737 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prashanth Bhatta75fa9a12016-01-11 18:30:08 -080012738 "%s: Memory allocation for TxPowerLimit failed!",
12739 __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012740 return QDF_STATUS_E_FAILURE;
Prashanth Bhatta75fa9a12016-01-11 18:30:08 -080012741 }
12742
12743 *tx_power_limit = *psmetx;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012744
12745 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012746 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012747 cds_message.type = WMA_TX_POWER_LIMIT;
12748 cds_message.reserved = 0;
Prashanth Bhatta75fa9a12016-01-11 18:30:08 -080012749 cds_message.bodyptr = tx_power_limit;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012750
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012751 qdf_status = cds_mq_post_message(CDS_MQ_ID_WMA, &cds_message);
12752 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053012753 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012754 "%s: not able to post WMA_TX_POWER_LIMIT",
12755 __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012756 status = QDF_STATUS_E_FAILURE;
Anurag Chouhan600c3a02016-03-01 10:33:54 +053012757 qdf_mem_free(tx_power_limit);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012758 }
12759 sme_release_global_lock(&pMac->sme);
12760 }
12761 return status;
12762}
12763
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012764QDF_STATUS sme_update_connect_debug(tHalHandle hHal, uint32_t set_value)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012765{
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 pMac->fEnableDebugLog = set_value;
12769 return status;
12770}
12771
12772/* ---------------------------------------------------------------------------
12773 \fn sme_ap_disable_intra_bss_fwd
12774
12775 \brief
12776 SME will send message to WMA to set Intra BSS in txrx
12777
12778 \param
12779
12780 hHal - The handle returned by mac_open
12781
12782 sessionId - session id ( vdev id)
12783
12784 disablefwd - bool value that indicate disable intrabss fwd disable
12785
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012786 \return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012787 --------------------------------------------------------------------------- */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012788QDF_STATUS sme_ap_disable_intra_bss_fwd(tHalHandle hHal, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012789 bool disablefwd)
12790{
12791 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012792 int status = QDF_STATUS_SUCCESS;
12793 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012794 cds_msg_t cds_message;
12795 tpDisableIntraBssFwd pSapDisableIntraFwd = NULL;
12796
12797 /* Prepare the request to send to SME. */
Anurag Chouhan600c3a02016-03-01 10:33:54 +053012798 pSapDisableIntraFwd = qdf_mem_malloc(sizeof(tDisableIntraBssFwd));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012799 if (NULL == pSapDisableIntraFwd) {
12800 sms_log(pMac, LOGP, "Memory Allocation Failure!!! %s", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012801 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012802 }
12803
Anurag Chouhan600c3a02016-03-01 10:33:54 +053012804 qdf_mem_zero(pSapDisableIntraFwd, sizeof(tDisableIntraBssFwd));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012805
12806 pSapDisableIntraFwd->sessionId = sessionId;
12807 pSapDisableIntraFwd->disableintrabssfwd = disablefwd;
12808
12809 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012810 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012811 /* serialize the req through MC thread */
12812 cds_message.bodyptr = pSapDisableIntraFwd;
12813 cds_message.type = WMA_SET_SAP_INTRABSS_DIS;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012814 qdf_status = cds_mq_post_message(CDS_MQ_ID_WMA, &cds_message);
12815 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
12816 status = QDF_STATUS_E_FAILURE;
Anurag Chouhan600c3a02016-03-01 10:33:54 +053012817 qdf_mem_free(pSapDisableIntraFwd);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012818 }
12819 sme_release_global_lock(&pMac->sme);
12820 }
12821 return status;
12822}
12823
12824#ifdef WLAN_FEATURE_STATS_EXT
12825
12826/******************************************************************************
12827 \fn sme_stats_ext_register_callback
12828
12829 \brief
12830 a function called to register the callback that send vendor event for stats
12831 ext
12832
12833 \param callback - callback to be registered
12834******************************************************************************/
12835void sme_stats_ext_register_callback(tHalHandle hHal, StatsExtCallback callback)
12836{
12837 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
12838
12839 pMac->sme.StatsExtCallback = callback;
12840}
12841
Arun Khandavalli4b55da72016-07-19 19:55:01 +053012842/**
12843 * sme_stats_ext_deregister_callback() - De-register ext stats callback
12844 * @h_hal: Hal Handle
12845 *
12846 * This function is called to de initialize the HDD NAN feature. Currently
12847 * the only operation required is to de-register a callback with SME.
12848 *
12849 * Return: None
12850 */
12851void sme_stats_ext_deregister_callback(tHalHandle h_hal)
12852{
12853 tpAniSirGlobal pmac;
12854
12855 if (!h_hal) {
12856 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
12857 FL("hHal is not valid"));
12858 return;
12859 }
12860
12861 pmac = PMAC_STRUCT(h_hal);
12862 pmac->sme.StatsExtCallback = NULL;
12863}
12864
12865
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012866/******************************************************************************
12867 \fn sme_stats_ext_request
12868
12869 \brief
12870 a function called when HDD receives STATS EXT vendor command from userspace
12871
12872 \param sessionID - vdevID for the stats ext request
12873
12874 \param input - Stats Ext Request structure ptr
12875
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012876 \return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012877******************************************************************************/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012878QDF_STATUS sme_stats_ext_request(uint8_t session_id, tpStatsExtRequestReq input)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012879{
12880 cds_msg_t msg;
12881 tpStatsExtRequest data;
12882 size_t data_len;
12883
12884 data_len = sizeof(tStatsExtRequest) + input->request_data_len;
Anurag Chouhan600c3a02016-03-01 10:33:54 +053012885 data = qdf_mem_malloc(data_len);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012886
12887 if (data == NULL) {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012888 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012889 }
12890
Anurag Chouhan600c3a02016-03-01 10:33:54 +053012891 qdf_mem_zero(data, data_len);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012892 data->vdev_id = session_id;
12893 data->request_data_len = input->request_data_len;
12894 if (input->request_data_len) {
Anurag Chouhan600c3a02016-03-01 10:33:54 +053012895 qdf_mem_copy(data->request_data,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012896 input->request_data, input->request_data_len);
12897 }
12898
12899 msg.type = WMA_STATS_EXT_REQUEST;
12900 msg.reserved = 0;
12901 msg.bodyptr = data;
12902
Anurag Chouhan6d760662016-02-20 16:05:43 +053012903 if (QDF_STATUS_SUCCESS != cds_mq_post_message(QDF_MODULE_ID_WMA, &msg)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053012904 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012905 "%s: Not able to post WMA_STATS_EXT_REQUEST message to WMA",
12906 __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053012907 qdf_mem_free(data);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012908 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012909 }
12910
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012911 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012912}
12913
12914/******************************************************************************
12915 \fn sme_stats_ext_event
12916
12917 \brief
12918 a callback function called when SME received eWNI_SME_STATS_EXT_EVENT
12919 response from WMA
12920
12921 \param hHal - HAL handle for device
12922 \param pMsg - Message body passed from WMA; includes NAN header
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012923 \return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012924******************************************************************************/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012925QDF_STATUS sme_stats_ext_event(tHalHandle hHal, void *pMsg)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012926{
12927 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012928 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012929
12930 if (NULL == pMsg) {
12931 sms_log(pMac, LOGE, "in %s msg ptr is NULL", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012932 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012933 } else {
12934 sms_log(pMac, LOG2, "SME: entering %s", __func__);
12935
12936 if (pMac->sme.StatsExtCallback) {
12937 pMac->sme.StatsExtCallback(pMac->hHdd,
12938 (tpStatsExtEvent) pMsg);
12939 }
12940 }
12941
12942 return status;
12943}
12944
12945#endif
12946
12947/* ---------------------------------------------------------------------------
12948 \fn sme_update_dfs_scan_mode
12949 \brief Update DFS roam scan mode
12950 This function is called through dynamic setConfig callback function
12951 to configure allowDFSChannelRoam.
12952 \param hHal - HAL handle for device
12953 \param sessionId - Session Identifier
12954 \param allowDFSChannelRoam - DFS roaming scan mode 0 (disable),
12955 1 (passive), 2 (active)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012956 \return QDF_STATUS_SUCCESS - SME update DFS roaming scan config
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012957 successfully.
12958 Other status means SME failed to update DFS roaming scan config.
12959 \sa
12960 -------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012961QDF_STATUS sme_update_dfs_scan_mode(tHalHandle hHal, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012962 uint8_t allowDFSChannelRoam)
12963{
12964 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012965 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012966
12967 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012968 if (QDF_IS_STATUS_SUCCESS(status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053012969 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012970 "LFR runtime successfully set AllowDFSChannelRoam Mode to "
12971 "%d - old value is %d - roam state is %s",
12972 allowDFSChannelRoam,
12973 pMac->roam.configParam.allowDFSChannelRoam,
12974 mac_trace_get_neighbour_roam_state(pMac->roam.
12975 neighborRoamInfo
12976 [sessionId].
12977 neighborRoamState));
12978 pMac->roam.configParam.allowDFSChannelRoam =
12979 allowDFSChannelRoam;
12980 sme_release_global_lock(&pMac->sme);
12981 }
12982 if (pMac->roam.configParam.isRoamOffloadScanEnabled) {
12983 csr_roam_offload_scan(pMac, sessionId,
12984 ROAM_SCAN_OFFLOAD_UPDATE_CFG,
12985 REASON_ROAM_DFS_SCAN_MODE_CHANGED);
12986 }
12987
12988 return status;
12989}
12990
12991/*--------------------------------------------------------------------------
12992 \brief sme_get_dfs_scan_mode() - get DFS roam scan mode
12993 This is a synchronous call
12994 \param hHal - The handle returned by mac_open.
12995 \return DFS roaming scan mode 0 (disable), 1 (passive), 2 (active)
12996 \sa
12997 --------------------------------------------------------------------------*/
12998uint8_t sme_get_dfs_scan_mode(tHalHandle hHal)
12999{
13000 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
13001 return pMac->roam.configParam.allowDFSChannelRoam;
13002}
13003
13004/*----------------------------------------------------------------------------
13005 \fn sme_modify_add_ie
13006 \brief This function sends msg to updates the additional IE buffers in PE
13007 \param hHal - global structure
13008 \param pModifyIE - pointer to tModifyIE structure
13009 \param updateType - type of buffer
13010 \- return Success or failure
13011 -----------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013012QDF_STATUS sme_modify_add_ie(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013013 tSirModifyIE *pModifyIE, eUpdateIEsType updateType)
13014{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013015 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013016 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
13017 status = sme_acquire_global_lock(&pMac->sme);
13018
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013019 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013020 status = csr_roam_modify_add_ies(pMac, pModifyIE, updateType);
13021 sme_release_global_lock(&pMac->sme);
13022 }
13023 return status;
13024}
13025
13026/*----------------------------------------------------------------------------
13027 \fn sme_update_add_ie
13028 \brief This function sends msg to updates the additional IE buffers in PE
13029 \param hHal - global structure
13030 \param pUpdateIE - pointer to structure tUpdateIE
13031 \param updateType - type of buffer
13032 \- return Success or failure
13033 -----------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013034QDF_STATUS sme_update_add_ie(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013035 tSirUpdateIE *pUpdateIE, eUpdateIEsType updateType)
13036{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013037 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013038 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
13039 status = sme_acquire_global_lock(&pMac->sme);
13040
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013041 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013042 status = csr_roam_update_add_ies(pMac, pUpdateIE, updateType);
13043 sme_release_global_lock(&pMac->sme);
13044 }
13045 return status;
13046}
13047
13048/* ---------------------------------------------------------------------------
13049 \fn sme_sta_in_middle_of_roaming
13050 \brief This function returns true if STA is in the middle of roaming state
13051 \param hHal - HAL handle for device
13052 \param sessionId - Session Identifier
13053 \- return true or false
13054 -------------------------------------------------------------------------*/
13055bool sme_sta_in_middle_of_roaming(tHalHandle hHal, uint8_t sessionId)
13056{
13057 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013058 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013059 bool ret = false;
13060
13061 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013062 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013063 ret = csr_neighbor_middle_of_roaming(hHal, sessionId);
13064 sme_release_global_lock(&pMac->sme);
13065 }
13066 return ret;
13067}
13068
13069
13070/**
13071 * sme_update_dsc_pto_up_mapping()
13072 * @hHal: HAL context
13073 * @dscpmapping: pointer to DSCP mapping structure
13074 * @sessionId: SME session id
13075 *
13076 * This routine is called to update dscp mapping
13077 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013078 * Return: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013079 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013080QDF_STATUS sme_update_dsc_pto_up_mapping(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013081 sme_QosWmmUpType *dscpmapping,
13082 uint8_t sessionId)
13083{
13084 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013085 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013086 uint8_t i, j, peSessionId;
13087 tCsrRoamSession *pCsrSession = NULL;
13088 tpPESession pSession = NULL;
13089
13090 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013091 if (!QDF_IS_STATUS_SUCCESS(status))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013092 return status;
13093 pCsrSession = CSR_GET_SESSION(pMac, sessionId);
13094 if (pCsrSession == NULL) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053013095 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013096 FL("Session lookup fails for CSR session"));
13097 sme_release_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013098 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013099 }
13100 if (!CSR_IS_SESSION_VALID(pMac, sessionId)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053013101 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013102 FL("Invalid session Id %u"), sessionId);
13103 sme_release_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013104 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013105 }
13106
13107 pSession = pe_find_session_by_bssid(pMac,
13108 pCsrSession->connectedProfile.bssid.bytes,
13109 &peSessionId);
13110
13111 if (pSession == NULL) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053013112 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013113 FL(" Session lookup fails for BSSID"));
13114 sme_release_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013115 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013116 }
13117
13118 if (!pSession->QosMapSet.present) {
Anurag Chouhan05d124f2016-09-03 16:21:50 +053013119 hdd_notice("QOS Mapping IE not present");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013120 sme_release_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013121 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013122 }
13123 for (i = 0; i < SME_QOS_WMM_UP_MAX; i++) {
13124 for (j = pSession->QosMapSet.dscp_range[i][0];
13125 j <= pSession->QosMapSet.dscp_range[i][1];
13126 j++) {
13127 if ((pSession->QosMapSet.dscp_range[i][0] == 255)
13128 && (pSession->QosMapSet.dscp_range[i][1] ==
13129 255)) {
13130 dscpmapping[j] = 0;
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053013131 QDF_TRACE(QDF_MODULE_ID_SME,
13132 QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013133 FL("User Priority %d isn't used"), i);
13134 break;
13135 } else {
13136 dscpmapping[j] = i;
13137 }
13138 }
13139 }
13140 for (i = 0; i < pSession->QosMapSet.num_dscp_exceptions; i++)
13141 if (pSession->QosMapSet.dscp_exceptions[i][0] != 255)
13142 dscpmapping[pSession->QosMapSet.dscp_exceptions[i][0]] =
13143 pSession->QosMapSet.dscp_exceptions[i][1];
13144
13145 sme_release_global_lock(&pMac->sme);
13146 return status;
13147}
13148
13149/* ---------------------------------------------------------------------------
13150 \fn sme_abort_roam_scan
13151 \brief API to abort current roam scan cycle by roam scan offload module.
13152 \param hHal - The handle returned by mac_open.
13153 \param sessionId - Session Identifier
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013154 \return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013155 ---------------------------------------------------------------------------*/
13156
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013157QDF_STATUS sme_abort_roam_scan(tHalHandle hHal, uint8_t sessionId)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013158{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013159 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013160 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
13161
13162 sms_log(pMac, LOGW, "entering function %s", __func__);
13163 if (pMac->roam.configParam.isRoamOffloadScanEnabled) {
13164 /* acquire the lock for the sme object */
13165 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013166 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013167 csr_roam_offload_scan(pMac, sessionId,
13168 ROAM_SCAN_OFFLOAD_ABORT_SCAN,
13169 REASON_ROAM_ABORT_ROAM_SCAN);
13170 /* release the lock for the sme object */
13171 sme_release_global_lock(&pMac->sme);
13172 }
13173 }
13174
13175 return status;
13176}
13177
13178#ifdef FEATURE_WLAN_EXTSCAN
13179/**
13180 * sme_get_valid_channels_by_band() - to fetch valid channels filtered by band
13181 * @hHal: HAL context
13182 * @wifiBand: RF band information
13183 * @aValidChannels: output array to store channel info
13184 * @pNumChannels: output number of channels
13185 *
13186 * SME API to fetch all valid channels filtered by band
13187 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013188 * Return: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013189 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013190QDF_STATUS sme_get_valid_channels_by_band(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013191 uint8_t wifiBand,
13192 uint32_t *aValidChannels,
13193 uint8_t *pNumChannels)
13194{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013195 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013196 uint8_t chanList[WNI_CFG_VALID_CHANNEL_LIST_LEN] = { 0 };
13197 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
13198 uint8_t numChannels = 0;
13199 uint8_t i = 0;
13200 uint32_t totValidChannels = WNI_CFG_VALID_CHANNEL_LIST_LEN;
13201
13202 if (!aValidChannels || !pNumChannels) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053013203 sms_log(pMac, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013204 FL("Output channel list/NumChannels is NULL"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013205 return QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013206 }
13207
13208 if ((wifiBand < WIFI_BAND_UNSPECIFIED) || (wifiBand >= WIFI_BAND_MAX)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053013209 sms_log(pMac, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013210 FL("Invalid wifiBand (%d)"), wifiBand);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013211 return QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013212 }
13213
13214 status = sme_get_cfg_valid_channels(hHal, &chanList[0],
13215 &totValidChannels);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013216 if (!QDF_IS_STATUS_SUCCESS(status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053013217 sms_log(pMac, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013218 FL("Fail to get valid channel list (err=%d)"), status);
13219 return status;
13220 }
13221
13222 switch (wifiBand) {
13223 case WIFI_BAND_UNSPECIFIED:
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053013224 sms_log(pMac, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013225 FL("Unspec Band, return all (%d) valid channels"),
13226 totValidChannels);
13227 numChannels = totValidChannels;
13228 for (i = 0; i < totValidChannels; i++) {
13229 aValidChannels[i] = cds_chan_to_freq(chanList[i]);
13230 }
13231 break;
13232
13233 case WIFI_BAND_BG:
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053013234 sms_log(pMac, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013235 FL("WIFI_BAND_BG (2.4 GHz)"));
13236 for (i = 0; i < totValidChannels; i++) {
13237 if (CDS_IS_CHANNEL_24GHZ(chanList[i])) {
13238 aValidChannels[numChannels++] =
13239 cds_chan_to_freq(chanList[i]);
13240 }
13241 }
13242 break;
13243
13244 case WIFI_BAND_A:
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053013245 sms_log(pMac, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013246 FL("WIFI_BAND_A (5 GHz without DFS)"));
13247 for (i = 0; i < totValidChannels; i++) {
13248 if (CDS_IS_CHANNEL_5GHZ(chanList[i]) &&
13249 !CDS_IS_DFS_CH(chanList[i])) {
13250 aValidChannels[numChannels++] =
13251 cds_chan_to_freq(chanList[i]);
13252 }
13253 }
13254 break;
13255
13256 case WIFI_BAND_ABG:
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053013257 sms_log(pMac, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013258 FL("WIFI_BAND_ABG (2.4 GHz + 5 GHz; no DFS)"));
13259 for (i = 0; i < totValidChannels; i++) {
13260 if ((CDS_IS_CHANNEL_24GHZ(chanList[i]) ||
13261 CDS_IS_CHANNEL_5GHZ(chanList[i])) &&
13262 !CDS_IS_DFS_CH(chanList[i])) {
13263 aValidChannels[numChannels++] =
13264 cds_chan_to_freq(chanList[i]);
13265 }
13266 }
13267 break;
13268
13269 case WIFI_BAND_A_DFS_ONLY:
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053013270 sms_log(pMac, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013271 FL("WIFI_BAND_A_DFS (5 GHz DFS only)"));
13272 for (i = 0; i < totValidChannels; i++) {
13273 if (CDS_IS_CHANNEL_5GHZ(chanList[i]) &&
13274 CDS_IS_DFS_CH(chanList[i])) {
13275 aValidChannels[numChannels++] =
13276 cds_chan_to_freq(chanList[i]);
13277 }
13278 }
13279 break;
13280
13281 case WIFI_BAND_A_WITH_DFS:
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053013282 sms_log(pMac, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013283 FL("WIFI_BAND_A_WITH_DFS (5 GHz with DFS)"));
13284 for (i = 0; i < totValidChannels; i++) {
13285 if (CDS_IS_CHANNEL_5GHZ(chanList[i])) {
13286 aValidChannels[numChannels++] =
13287 cds_chan_to_freq(chanList[i]);
13288 }
13289 }
13290 break;
13291
13292 case WIFI_BAND_ABG_WITH_DFS:
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053013293 sms_log(pMac, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013294 FL("WIFI_BAND_ABG_WITH_DFS (2.4 GHz+5 GHz with DFS)"));
13295 for (i = 0; i < totValidChannels; i++) {
13296 if (CDS_IS_CHANNEL_24GHZ(chanList[i]) ||
13297 CDS_IS_CHANNEL_5GHZ(chanList[i])) {
13298 aValidChannels[numChannels++] =
13299 cds_chan_to_freq(chanList[i]);
13300 }
13301 }
13302 break;
13303
13304 default:
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053013305 sms_log(pMac, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013306 FL("Unknown wifiBand (%d))"), wifiBand);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013307 return QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013308 break;
13309 }
13310 *pNumChannels = numChannels;
13311
13312 return status;
13313}
13314
13315/* ---------------------------------------------------------------------------
13316 \fn sme_ext_scan_get_capabilities
13317 \brief SME API to fetch extscan capabilities
13318 \param hHal
13319 \param pReq: extscan capabilities structure
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013320 \- return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013321 -------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013322QDF_STATUS sme_ext_scan_get_capabilities(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013323 tSirGetExtScanCapabilitiesReqParams *
13324 pReq)
13325{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013326 QDF_STATUS status = QDF_STATUS_SUCCESS;
13327 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013328 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
13329 cds_msg_t cds_message;
13330
13331 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013332 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013333 /* Serialize the req through MC thread */
13334 cds_message.bodyptr = pReq;
13335 cds_message.type = WMA_EXTSCAN_GET_CAPABILITIES_REQ;
Sreelakshmi Konamki6a065362016-05-31 16:05:01 +053013336 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
13337 NO_SESSION, cds_message.type));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013338 qdf_status = cds_mq_post_message(CDS_MQ_ID_WMA, &cds_message);
13339 if (!QDF_IS_STATUS_SUCCESS(qdf_status))
13340 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013341
13342 sme_release_global_lock(&pMac->sme);
13343 }
13344 return status;
13345}
13346
13347/* ---------------------------------------------------------------------------
13348 \fn sme_ext_scan_start
13349 \brief SME API to issue extscan start
13350 \param hHal
13351 \param pStartCmd: extscan start structure
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013352 \- return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013353 -------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013354QDF_STATUS sme_ext_scan_start(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013355 tSirWifiScanCmdReqParams *pStartCmd)
13356{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013357 QDF_STATUS status = QDF_STATUS_SUCCESS;
13358 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013359 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
13360 cds_msg_t cds_message;
13361
13362 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013363 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013364 /* Serialize the req through MC thread */
13365 cds_message.bodyptr = pStartCmd;
13366 cds_message.type = WMA_EXTSCAN_START_REQ;
Sreelakshmi Konamki6a065362016-05-31 16:05:01 +053013367 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
13368 NO_SESSION, cds_message.type));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013369 qdf_status = cds_mq_post_message(CDS_MQ_ID_WMA, &cds_message);
13370 if (!QDF_IS_STATUS_SUCCESS(qdf_status))
13371 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013372
13373 sme_release_global_lock(&pMac->sme);
13374 }
13375 return status;
13376}
13377
13378/* ---------------------------------------------------------------------------
13379 \fn sme_ext_scan_stop
13380 \brief SME API to issue extscan stop
13381 \param hHal
13382 \param pStopReq: extscan stop structure
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013383 \- return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013384 -------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013385QDF_STATUS sme_ext_scan_stop(tHalHandle hHal, tSirExtScanStopReqParams *pStopReq)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013386{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013387 QDF_STATUS status = QDF_STATUS_SUCCESS;
13388 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013389 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
13390 cds_msg_t cds_message;
13391
13392 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013393 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013394 /* Serialize the req through MC thread */
13395 cds_message.bodyptr = pStopReq;
13396 cds_message.type = WMA_EXTSCAN_STOP_REQ;
Sreelakshmi Konamki6a065362016-05-31 16:05:01 +053013397 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
13398 NO_SESSION, cds_message.type));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013399 qdf_status = cds_mq_post_message(CDS_MQ_ID_WMA, &cds_message);
13400 if (!QDF_IS_STATUS_SUCCESS(qdf_status))
13401 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013402 sme_release_global_lock(&pMac->sme);
13403 }
13404 return status;
13405}
13406
13407/* ---------------------------------------------------------------------------
13408 \fn sme_set_bss_hotlist
13409 \brief SME API to set BSSID hotlist
13410 \param hHal
13411 \param pSetHotListReq: extscan set hotlist structure
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013412 \- return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013413 -------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013414QDF_STATUS sme_set_bss_hotlist(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013415 tSirExtScanSetBssidHotListReqParams *
13416 pSetHotListReq)
13417{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013418 QDF_STATUS status = QDF_STATUS_SUCCESS;
13419 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013420 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
13421 cds_msg_t cds_message;
13422
13423 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013424 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013425 /* Serialize the req through MC thread */
13426 cds_message.bodyptr = pSetHotListReq;
13427 cds_message.type = WMA_EXTSCAN_SET_BSSID_HOTLIST_REQ;
Sreelakshmi Konamki6a065362016-05-31 16:05:01 +053013428 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
13429 NO_SESSION, cds_message.type));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013430 qdf_status = cds_mq_post_message(CDS_MQ_ID_WMA, &cds_message);
13431 if (!QDF_IS_STATUS_SUCCESS(qdf_status))
13432 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013433
13434 sme_release_global_lock(&pMac->sme);
13435 }
13436 return status;
13437}
13438
13439/* ---------------------------------------------------------------------------
13440 \fn sme_reset_bss_hotlist
13441 \brief SME API to reset BSSID hotlist
13442 \param hHal
13443 \param pSetHotListReq: extscan set hotlist structure
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013444 \- return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013445 -------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013446QDF_STATUS sme_reset_bss_hotlist(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013447 tSirExtScanResetBssidHotlistReqParams *
13448 pResetReq)
13449{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013450 QDF_STATUS status = QDF_STATUS_SUCCESS;
13451 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013452 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
13453 cds_msg_t cds_message;
13454
13455 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013456 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013457 /* Serialize the req through MC thread */
13458 cds_message.bodyptr = pResetReq;
13459 cds_message.type = WMA_EXTSCAN_RESET_BSSID_HOTLIST_REQ;
Sreelakshmi Konamki6a065362016-05-31 16:05:01 +053013460 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
13461 NO_SESSION, cds_message.type));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013462 qdf_status = cds_mq_post_message(CDS_MQ_ID_WMA, &cds_message);
13463 if (!QDF_IS_STATUS_SUCCESS(qdf_status))
13464 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013465
13466 sme_release_global_lock(&pMac->sme);
13467 }
13468 return status;
13469}
13470
Manikandan Mohan80dea792016-04-28 16:36:48 -070013471/**
13472 * sme_send_wisa_params(): Pass WISA mode to WMA
13473 * @hal: HAL context
13474 * @wisa_params: pointer to WISA params struct
13475 * @sessionId: SME session id
13476 *
13477 * Pass WISA params to WMA
13478 *
13479 * Return: QDF_STATUS
13480 */
13481QDF_STATUS sme_set_wisa_params(tHalHandle hal,
13482 struct sir_wisa_params *wisa_params)
13483{
13484 QDF_STATUS status = QDF_STATUS_SUCCESS;
13485 tpAniSirGlobal mac = PMAC_STRUCT(hal);
13486 cds_msg_t cds_message;
13487 struct sir_wisa_params *cds_msg_wisa_params;
13488
13489 cds_msg_wisa_params = qdf_mem_malloc(sizeof(struct sir_wisa_params));
13490 if (!cds_msg_wisa_params)
13491 return QDF_STATUS_E_NOMEM;
13492
13493 *cds_msg_wisa_params = *wisa_params;
13494 status = sme_acquire_global_lock(&mac->sme);
13495 if (QDF_IS_STATUS_SUCCESS(status)) {
13496 cds_message.bodyptr = cds_msg_wisa_params;
13497 cds_message.type = WMA_SET_WISA_PARAMS;
13498 status = cds_mq_post_message(CDS_MQ_ID_WMA, &cds_message);
13499 sme_release_global_lock(&mac->sme);
13500 }
13501 return status;
13502}
13503
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013504/* ---------------------------------------------------------------------------
13505 \fn sme_set_significant_change
13506 \brief SME API to set significant change
13507 \param hHal
13508 \param pSetSignificantChangeReq: extscan set significant change structure
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013509 \- return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013510 -------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013511QDF_STATUS sme_set_significant_change(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013512 tSirExtScanSetSigChangeReqParams *
13513 pSetSignificantChangeReq)
13514{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013515 QDF_STATUS status = QDF_STATUS_SUCCESS;
13516 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013517 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
13518 cds_msg_t cds_message;
13519
13520 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013521 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013522 /* Serialize the req through MC thread */
13523 cds_message.bodyptr = pSetSignificantChangeReq;
13524 cds_message.type = WMA_EXTSCAN_SET_SIGNF_CHANGE_REQ;
Sreelakshmi Konamki6a065362016-05-31 16:05:01 +053013525 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
13526 NO_SESSION, cds_message.type));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013527 qdf_status = cds_mq_post_message(CDS_MQ_ID_WMA, &cds_message);
13528 if (!QDF_IS_STATUS_SUCCESS(qdf_status))
13529 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013530
13531 sme_release_global_lock(&pMac->sme);
13532 }
13533 return status;
13534}
13535
13536/* ---------------------------------------------------------------------------
13537 \fn sme_reset_significant_change
13538 \brief SME API to reset significant change
13539 \param hHal
13540 \param pResetReq: extscan reset significant change structure
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013541 \- return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013542 -------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013543QDF_STATUS sme_reset_significant_change(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013544 tSirExtScanResetSignificantChangeReqParams
13545 *pResetReq)
13546{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013547 QDF_STATUS status = QDF_STATUS_SUCCESS;
13548 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013549 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
13550 cds_msg_t cds_message;
13551
13552 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013553 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013554 /* Serialize the req through MC thread */
13555 cds_message.bodyptr = pResetReq;
13556 cds_message.type = WMA_EXTSCAN_RESET_SIGNF_CHANGE_REQ;
Sreelakshmi Konamki6a065362016-05-31 16:05:01 +053013557 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
13558 NO_SESSION, cds_message.type));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013559 qdf_status = cds_mq_post_message(CDS_MQ_ID_WMA, &cds_message);
13560 if (!QDF_IS_STATUS_SUCCESS(qdf_status))
13561 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013562
13563 sme_release_global_lock(&pMac->sme);
13564 }
13565 return status;
13566}
13567
13568/* ---------------------------------------------------------------------------
13569 \fn sme_get_cached_results
13570 \brief SME API to get cached results
13571 \param hHal
13572 \param pCachedResultsReq: extscan get cached results structure
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013573 \- return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013574 -------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013575QDF_STATUS sme_get_cached_results(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013576 tSirExtScanGetCachedResultsReqParams *
13577 pCachedResultsReq)
13578{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013579 QDF_STATUS status = QDF_STATUS_SUCCESS;
13580 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013581 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
13582 cds_msg_t cds_message;
13583
13584 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013585 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013586 /* Serialize the req through MC thread */
13587 cds_message.bodyptr = pCachedResultsReq;
13588 cds_message.type = WMA_EXTSCAN_GET_CACHED_RESULTS_REQ;
Sreelakshmi Konamki6a065362016-05-31 16:05:01 +053013589 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
13590 NO_SESSION, cds_message.type));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013591 qdf_status = cds_mq_post_message(CDS_MQ_ID_WMA, &cds_message);
13592 if (!QDF_IS_STATUS_SUCCESS(qdf_status))
13593 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013594
13595 sme_release_global_lock(&pMac->sme);
13596 }
13597 return status;
13598}
13599
13600/**
13601 * sme_set_epno_list() - set epno network list
Deepak Dhamdhere0f076bd2016-06-02 11:29:21 -070013602 * @hal: global hal handle
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013603 * @input: request message
13604 *
13605 * This function constructs the cds message and fill in message type,
13606 * bodyptr with %input and posts it to WDA queue.
13607 *
Deepak Dhamdhere0f076bd2016-06-02 11:29:21 -070013608 * Return: QDF_STATUS enumeration
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013609 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013610QDF_STATUS sme_set_epno_list(tHalHandle hal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013611 struct wifi_epno_params *input)
13612{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013613 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013614 tpAniSirGlobal mac = PMAC_STRUCT(hal);
13615 cds_msg_t cds_message;
13616 struct wifi_epno_params *req_msg;
13617 int len, i;
13618
13619 sms_log(mac, LOG1, FL("enter"));
13620 len = sizeof(*req_msg) +
13621 (input->num_networks * sizeof(struct wifi_epno_network));
Anurag Chouhan600c3a02016-03-01 10:33:54 +053013622 req_msg = qdf_mem_malloc(len);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013623 if (!req_msg) {
Anurag Chouhan600c3a02016-03-01 10:33:54 +053013624 sms_log(mac, LOGE, FL("qdf_mem_malloc failed"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013625 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013626 }
13627
Anurag Chouhan600c3a02016-03-01 10:33:54 +053013628 qdf_mem_zero(req_msg, len);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013629 req_msg->num_networks = input->num_networks;
13630 req_msg->request_id = input->request_id;
13631 req_msg->session_id = input->session_id;
13632 for (i = 0; i < req_msg->num_networks; i++) {
13633 req_msg->networks[i].rssi_threshold =
13634 input->networks[i].rssi_threshold;
13635 req_msg->networks[i].flags = input->networks[i].flags;
13636 req_msg->networks[i].auth_bit_field =
13637 input->networks[i].auth_bit_field;
13638 req_msg->networks[i].ssid.length =
13639 input->networks[i].ssid.length;
Anurag Chouhan600c3a02016-03-01 10:33:54 +053013640 qdf_mem_copy(req_msg->networks[i].ssid.ssId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013641 input->networks[i].ssid.ssId,
13642 req_msg->networks[i].ssid.length);
13643 }
13644
13645 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013646 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013647 sms_log(mac, LOGE,
13648 FL("sme_acquire_global_lock failed!(status=%d)"),
13649 status);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053013650 qdf_mem_free(req_msg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013651 return status;
13652 }
13653
13654 /* Serialize the req through MC thread */
13655 cds_message.bodyptr = req_msg;
13656 cds_message.type = WMA_SET_EPNO_LIST_REQ;
13657 status = cds_mq_post_message(CDS_MQ_ID_WMA, &cds_message);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013658 if (!QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013659 sms_log(mac, LOGE,
13660 FL("cds_mq_post_message failed!(err=%d)"),
13661 status);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053013662 qdf_mem_free(req_msg);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013663 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013664 }
13665 sme_release_global_lock(&mac->sme);
13666 return status;
13667}
13668
13669/**
13670 * sme_set_passpoint_list() - set passpoint network list
13671 * @hal: global hal handle
13672 * @input: request message
13673 *
13674 * This function constructs the cds message and fill in message type,
13675 * bodyptr with @input and posts it to WDA queue.
13676 *
Deepak Dhamdhere0f076bd2016-06-02 11:29:21 -070013677 * Return: QDF_STATUS enumeration
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013678 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013679QDF_STATUS sme_set_passpoint_list(tHalHandle hal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013680 struct wifi_passpoint_req *input)
13681{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013682 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013683 tpAniSirGlobal mac = PMAC_STRUCT(hal);
13684 cds_msg_t cds_message;
13685 struct wifi_passpoint_req *req_msg;
13686 int len, i;
13687
13688 sms_log(mac, LOG1, FL("enter"));
13689 len = sizeof(*req_msg) +
13690 (input->num_networks * sizeof(struct wifi_passpoint_network));
Anurag Chouhan600c3a02016-03-01 10:33:54 +053013691 req_msg = qdf_mem_malloc(len);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013692 if (!req_msg) {
Anurag Chouhan600c3a02016-03-01 10:33:54 +053013693 sms_log(mac, LOGE, FL("qdf_mem_malloc failed"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013694 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013695 }
13696
Anurag Chouhan600c3a02016-03-01 10:33:54 +053013697 qdf_mem_zero(req_msg, len);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013698 req_msg->num_networks = input->num_networks;
13699 req_msg->request_id = input->request_id;
13700 req_msg->session_id = input->session_id;
13701 for (i = 0; i < req_msg->num_networks; i++) {
13702 req_msg->networks[i].id =
13703 input->networks[i].id;
Anurag Chouhan600c3a02016-03-01 10:33:54 +053013704 qdf_mem_copy(req_msg->networks[i].realm,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013705 input->networks[i].realm,
13706 strlen(input->networks[i].realm) + 1);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053013707 qdf_mem_copy(req_msg->networks[i].plmn,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013708 input->networks[i].plmn,
13709 SIR_PASSPOINT_PLMN_LEN);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053013710 qdf_mem_copy(req_msg->networks[i].roaming_consortium_ids,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013711 input->networks[i].roaming_consortium_ids,
13712 sizeof(req_msg->networks[i].roaming_consortium_ids));
13713 }
13714
13715 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013716 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013717 sms_log(mac, LOGE,
13718 FL("sme_acquire_global_lock failed!(status=%d)"),
13719 status);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053013720 qdf_mem_free(req_msg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013721 return status;
13722 }
13723
13724 /* Serialize the req through MC thread */
13725 cds_message.bodyptr = req_msg;
13726 cds_message.type = WMA_SET_PASSPOINT_LIST_REQ;
13727 status = cds_mq_post_message(CDS_MQ_ID_WMA, &cds_message);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013728 if (!QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013729 sms_log(mac, LOGE,
13730 FL("cds_mq_post_message failed!(err=%d)"),
13731 status);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053013732 qdf_mem_free(req_msg);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013733 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013734 }
13735 sme_release_global_lock(&mac->sme);
13736 return status;
13737}
13738
13739/**
13740 * sme_reset_passpoint_list() - reset passpoint network list
13741 * @hHal: global hal handle
13742 * @input: request message
13743 *
Deepak Dhamdhere0f076bd2016-06-02 11:29:21 -070013744 * Return: QDF_STATUS enumeration
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013745 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013746QDF_STATUS sme_reset_passpoint_list(tHalHandle hal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013747 struct wifi_passpoint_req *input)
13748{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013749 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013750 tpAniSirGlobal mac = PMAC_STRUCT(hal);
13751 cds_msg_t cds_message;
13752 struct wifi_passpoint_req *req_msg;
13753
13754 sms_log(mac, LOG1, FL("enter"));
Anurag Chouhan600c3a02016-03-01 10:33:54 +053013755 req_msg = qdf_mem_malloc(sizeof(*req_msg));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013756 if (!req_msg) {
Anurag Chouhan600c3a02016-03-01 10:33:54 +053013757 sms_log(mac, LOGE, FL("qdf_mem_malloc failed"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013758 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013759 }
13760
Anurag Chouhan600c3a02016-03-01 10:33:54 +053013761 qdf_mem_zero(req_msg, sizeof(*req_msg));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013762 req_msg->request_id = input->request_id;
13763 req_msg->session_id = input->session_id;
13764
13765 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013766 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013767 sms_log(mac, LOGE,
13768 FL("sme_acquire_global_lock failed!(status=%d)"),
13769 status);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053013770 qdf_mem_free(req_msg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013771 return status;
13772 }
13773
13774 /* Serialize the req through MC thread */
13775 cds_message.bodyptr = req_msg;
13776 cds_message.type = WMA_RESET_PASSPOINT_LIST_REQ;
13777 status = cds_mq_post_message(CDS_MQ_ID_WMA, &cds_message);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013778 if (!QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013779 sms_log(mac, LOGE,
13780 FL("cds_mq_post_message failed!(err=%d)"),
13781 status);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053013782 qdf_mem_free(req_msg);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013783 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013784 }
13785 sme_release_global_lock(&mac->sme);
13786 return status;
13787}
13788
13789/**
13790 * sme_set_ssid_hotlist() - Set the SSID hotlist
13791 * @hal: SME handle
13792 * @request: set ssid hotlist request
13793 *
Deepak Dhamdhere0f076bd2016-06-02 11:29:21 -070013794 * Return: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013795 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013796QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013797sme_set_ssid_hotlist(tHalHandle hal,
13798 struct sir_set_ssid_hotlist_request *request)
13799{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013800 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013801 tpAniSirGlobal mac = PMAC_STRUCT(hal);
13802 cds_msg_t cds_message;
13803 struct sir_set_ssid_hotlist_request *set_req;
13804
Anurag Chouhan600c3a02016-03-01 10:33:54 +053013805 set_req = qdf_mem_malloc(sizeof(*set_req));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013806 if (!set_req) {
Anurag Chouhan600c3a02016-03-01 10:33:54 +053013807 sms_log(mac, LOGE, FL("qdf_mem_malloc failed"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013808 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013809 }
13810
13811 *set_req = *request;
13812 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013813 if (QDF_STATUS_SUCCESS == status) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013814 /* Serialize the req through MC thread */
13815 cds_message.bodyptr = set_req;
13816 cds_message.type = WMA_EXTSCAN_SET_SSID_HOTLIST_REQ;
13817 status = cds_mq_post_message(CDS_MQ_ID_WMA, &cds_message);
13818 sme_release_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013819 if (!QDF_IS_STATUS_SUCCESS(status)) {
Anurag Chouhan600c3a02016-03-01 10:33:54 +053013820 qdf_mem_free(set_req);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013821 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013822 }
13823 } else {
13824 sms_log(mac, LOGE,
13825 FL("sme_acquire_global_lock failed!(status=%d)"),
13826 status);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053013827 qdf_mem_free(set_req);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013828 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013829 }
13830 return status;
13831}
13832
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013833QDF_STATUS sme_ext_scan_register_callback(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013834 void (*pExtScanIndCb)(void *,
13835 const uint16_t,
13836 void *))
13837{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013838 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013839 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
13840
13841 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013842 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013843 pMac->sme.pExtScanIndCb = pExtScanIndCb;
13844 sme_release_global_lock(&pMac->sme);
13845 }
13846 return status;
13847}
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013848#endif /* FEATURE_WLAN_EXTSCAN */
13849
13850#ifdef WLAN_FEATURE_LINK_LAYER_STATS
13851
13852/* ---------------------------------------------------------------------------
13853 \fn sme_ll_stats_clear_req
13854 \brief SME API to clear Link Layer Statistics
13855 \param hHal
13856 \param pclearStatsReq: Link Layer clear stats request params structure
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013857 \- return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013858 -------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013859QDF_STATUS sme_ll_stats_clear_req(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013860 tSirLLStatsClearReq *pclearStatsReq)
13861{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013862 QDF_STATUS status = QDF_STATUS_SUCCESS;
13863 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013864 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
13865 cds_msg_t cds_message;
13866 tSirLLStatsClearReq *clear_stats_req;
13867
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053013868 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013869 "staId = %u", pclearStatsReq->staId);
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053013870 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013871 "statsClearReqMask = 0x%X",
13872 pclearStatsReq->statsClearReqMask);
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053013873 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013874 "stopReq = %u", pclearStatsReq->stopReq);
13875
Anurag Chouhan600c3a02016-03-01 10:33:54 +053013876 clear_stats_req = qdf_mem_malloc(sizeof(*clear_stats_req));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013877
13878 if (!clear_stats_req) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053013879 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013880 "%s: Not able to allocate memory for WMA_LL_STATS_CLEAR_REQ",
13881 __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013882 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013883 }
13884
13885 *clear_stats_req = *pclearStatsReq;
13886
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013887 if (QDF_STATUS_SUCCESS == sme_acquire_global_lock(&pMac->sme)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013888 /* Serialize the req through MC thread */
13889 cds_message.bodyptr = clear_stats_req;
13890 cds_message.type = WMA_LINK_LAYER_STATS_CLEAR_REQ;
Sreelakshmi Konamki6a065362016-05-31 16:05:01 +053013891 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
13892 NO_SESSION, cds_message.type));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013893 qdf_status = cds_mq_post_message(CDS_MQ_ID_WMA, &cds_message);
13894 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053013895 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013896 "%s: not able to post WMA_LL_STATS_CLEAR_REQ",
13897 __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053013898 qdf_mem_free(clear_stats_req);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013899 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013900 }
13901 sme_release_global_lock(&pMac->sme);
13902 } else {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053013903 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR, "%s: "
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013904 "sme_acquire_global_lock error", __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053013905 qdf_mem_free(clear_stats_req);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013906 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013907 }
13908
13909 return status;
13910}
13911
13912/* ---------------------------------------------------------------------------
13913 \fn sme_ll_stats_set_req
13914 \brief SME API to set the Link Layer Statistics
13915 \param hHal
13916 \param psetStatsReq: Link Layer set stats request params structure
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013917 \- return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013918 -------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013919QDF_STATUS sme_ll_stats_set_req(tHalHandle hHal, tSirLLStatsSetReq *psetStatsReq)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013920{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013921 QDF_STATUS status = QDF_STATUS_SUCCESS;
13922 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013923 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
13924 cds_msg_t cds_message;
13925 tSirLLStatsSetReq *set_stats_req;
13926
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053013927 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013928 "%s: MPDU Size = %u", __func__,
13929 psetStatsReq->mpduSizeThreshold);
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053013930 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013931 " Aggressive Stats Collections = %u",
13932 psetStatsReq->aggressiveStatisticsGathering);
13933
Anurag Chouhan600c3a02016-03-01 10:33:54 +053013934 set_stats_req = qdf_mem_malloc(sizeof(*set_stats_req));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013935
13936 if (!set_stats_req) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053013937 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013938 "%s: Not able to allocate memory for WMA_LL_STATS_SET_REQ",
13939 __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013940 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013941 }
13942
13943 *set_stats_req = *psetStatsReq;
13944
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013945 if (QDF_STATUS_SUCCESS == sme_acquire_global_lock(&pMac->sme)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013946 /* Serialize the req through MC thread */
13947 cds_message.bodyptr = set_stats_req;
13948 cds_message.type = WMA_LINK_LAYER_STATS_SET_REQ;
Sreelakshmi Konamki6a065362016-05-31 16:05:01 +053013949 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
13950 NO_SESSION, cds_message.type));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013951 qdf_status = cds_mq_post_message(CDS_MQ_ID_WMA, &cds_message);
13952 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053013953 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013954 "%s: not able to post WMA_LL_STATS_SET_REQ",
13955 __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053013956 qdf_mem_free(set_stats_req);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013957 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013958 }
13959 sme_release_global_lock(&pMac->sme);
13960 } else {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053013961 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR, "%s: "
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013962 "sme_acquire_global_lock error", __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053013963 qdf_mem_free(set_stats_req);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013964 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013965 }
13966
13967 return status;
13968}
13969
13970/* ---------------------------------------------------------------------------
13971 \fn sme_ll_stats_get_req
13972 \brief SME API to get the Link Layer Statistics
13973 \param hHal
13974 \param pgetStatsReq: Link Layer get stats request params structure
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013975 \- return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013976 -------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013977QDF_STATUS sme_ll_stats_get_req(tHalHandle hHal, tSirLLStatsGetReq *pgetStatsReq)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013978{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013979 QDF_STATUS status = QDF_STATUS_SUCCESS;
13980 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013981 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
13982 cds_msg_t cds_message;
13983 tSirLLStatsGetReq *get_stats_req;
13984
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053013985 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013986 "reqId = %u", pgetStatsReq->reqId);
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053013987 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013988 "staId = %u", pgetStatsReq->staId);
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053013989 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013990 "Stats Type = %u", pgetStatsReq->paramIdMask);
13991
Anurag Chouhan600c3a02016-03-01 10:33:54 +053013992 get_stats_req = qdf_mem_malloc(sizeof(*get_stats_req));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013993
13994 if (!get_stats_req) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053013995 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013996 "%s: Not able to allocate memory for WMA_LL_STATS_GET_REQ",
13997 __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013998 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013999 }
14000
14001 *get_stats_req = *pgetStatsReq;
14002
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014003 if (QDF_STATUS_SUCCESS == sme_acquire_global_lock(&pMac->sme)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014004 /* Serialize the req through MC thread */
14005 cds_message.bodyptr = get_stats_req;
14006 cds_message.type = WMA_LINK_LAYER_STATS_GET_REQ;
Sreelakshmi Konamki6a065362016-05-31 16:05:01 +053014007 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
14008 NO_SESSION, cds_message.type));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014009 qdf_status = cds_mq_post_message(CDS_MQ_ID_WMA, &cds_message);
14010 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053014011 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014012 "%s: not able to post WMA_LL_STATS_GET_REQ",
14013 __func__);
14014
Anurag Chouhan600c3a02016-03-01 10:33:54 +053014015 qdf_mem_free(get_stats_req);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014016 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014017
14018 }
14019 sme_release_global_lock(&pMac->sme);
14020 } else {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053014021 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR, "%s: "
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014022 "sme_acquire_global_lock error", __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053014023 qdf_mem_free(get_stats_req);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014024 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014025 }
14026
14027 return status;
14028}
14029
14030/* ---------------------------------------------------------------------------
14031 \fn sme_set_link_layer_stats_ind_cb
14032 \brief SME API to trigger the stats are available after get request
14033 \param hHal
14034 \param callback_routine - HDD callback which needs to be invoked after
14035 getting status notification from FW
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014036 \- return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014037 -------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014038QDF_STATUS sme_set_link_layer_stats_ind_cb
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014039 (tHalHandle hHal,
14040 void (*callback_routine)(void *callbackCtx, int indType, void *pRsp)
14041 ) {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014042 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014043 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
14044
14045 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014046 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014047 pMac->sme.pLinkLayerStatsIndCallback = callback_routine;
14048 sme_release_global_lock(&pMac->sme);
14049 } else {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053014050 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR, "%s: "
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014051 "sme_acquire_global_lock error", __func__);
14052 }
14053
14054 return status;
14055}
14056
Arun Khandavalli4b55da72016-07-19 19:55:01 +053014057/**
14058 * sme_reset_link_layer_stats_ind_cb() - SME API to reset link layer stats
14059 * indication
14060 * @h_hal: Hal Handle
14061 *
14062 * This function reset's the link layer stats indication
14063 *
14064 * Return: QDF_STATUS Enumeration
14065 */
14066
14067QDF_STATUS sme_reset_link_layer_stats_ind_cb(tHalHandle h_hal)
14068{
14069 QDF_STATUS status;
14070 tpAniSirGlobal pmac;
14071
14072 if (!h_hal) {
14073 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
14074 FL("hHal is not valid"));
14075 return QDF_STATUS_E_INVAL;
14076 }
14077 pmac = PMAC_STRUCT(h_hal);
14078
14079 status = sme_acquire_global_lock(&pmac->sme);
14080 if (QDF_IS_STATUS_SUCCESS(status)) {
14081 pmac->sme.pLinkLayerStatsIndCallback = NULL;
14082 sme_release_global_lock(&pmac->sme);
14083 } else {
14084 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR, "%s: sme_acquire_global_lock error",
14085 __func__);
14086 }
14087
14088 return status;
14089}
14090
14091
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014092#endif /* WLAN_FEATURE_LINK_LAYER_STATS */
14093
14094/**
14095 * sme_fw_mem_dump_register_cb() - Register fw memory dump callback
14096 *
14097 * @hal - MAC global handle
14098 * @callback_routine - callback routine from HDD
14099 *
14100 * This API is invoked by HDD to register its callback in SME
14101 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014102 * Return: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014103 */
14104#ifdef WLAN_FEATURE_MEMDUMP
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014105QDF_STATUS sme_fw_mem_dump_register_cb(tHalHandle hal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014106 void (*callback_routine)(void *cb_context,
14107 struct fw_dump_rsp *rsp))
14108{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014109 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014110 tpAniSirGlobal pmac = PMAC_STRUCT(hal);
14111
14112 status = sme_acquire_global_lock(&pmac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014113 if (QDF_STATUS_SUCCESS == status) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014114 pmac->sme.fw_dump_callback = callback_routine;
14115 sme_release_global_lock(&pmac->sme);
14116 } else {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053014117 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014118 FL("sme_acquire_global_lock error"));
14119 }
14120
14121 return status;
14122}
14123#else
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014124QDF_STATUS sme_fw_mem_dump_register_cb(tHalHandle hal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014125 void (*callback_routine)(void *cb_context,
14126 struct fw_dump_rsp *rsp))
14127{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014128 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014129}
14130#endif /* WLAN_FEATURE_MEMDUMP */
14131
14132/**
14133 * sme_fw_mem_dump_unregister_cb() - Unregister fw memory dump callback
14134 *
14135 * @hHal - MAC global handle
14136 *
14137 * This API is invoked by HDD to unregister its callback in SME
14138 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014139 * Return: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014140 */
14141#ifdef WLAN_FEATURE_MEMDUMP
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014142QDF_STATUS sme_fw_mem_dump_unregister_cb(tHalHandle hal)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014143{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014144 QDF_STATUS status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014145 tpAniSirGlobal pmac = PMAC_STRUCT(hal);
14146
14147 status = sme_acquire_global_lock(&pmac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014148 if (QDF_STATUS_SUCCESS == status) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014149 pmac->sme.fw_dump_callback = NULL;
14150 sme_release_global_lock(&pmac->sme);
14151 } else {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053014152 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014153 FL("sme_acquire_global_lock error"));
14154 }
14155
14156 return status;
14157}
14158#else
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014159QDF_STATUS sme_fw_mem_dump_unregister_cb(tHalHandle hal)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014160{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014161 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014162}
14163#endif /* WLAN_FEATURE_MEMDUMP */
14164
14165#ifdef WLAN_FEATURE_ROAM_OFFLOAD
14166/*--------------------------------------------------------------------------
14167 \brief sme_update_roam_offload_enabled() - enable/disable roam offload feaure
14168 It is used at in the REG_DYNAMIC_VARIABLE macro definition of
14169 \param hHal - The handle returned by mac_open.
14170 \param nRoamOffloadEnabled - The bool to update with
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014171 \return QDF_STATUS_SUCCESS - SME update config successfully.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014172 Other status means SME is failed to update.
14173 \sa
14174 --------------------------------------------------------------------------*/
14175
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014176QDF_STATUS sme_update_roam_offload_enabled(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014177 bool nRoamOffloadEnabled)
14178{
14179 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014180 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014181
14182 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014183 if (QDF_IS_STATUS_SUCCESS(status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053014184 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014185 "%s: LFR3:gRoamOffloadEnabled is changed from %d to %d",
14186 __func__, pMac->roam.configParam.isRoamOffloadEnabled,
14187 nRoamOffloadEnabled);
14188 pMac->roam.configParam.isRoamOffloadEnabled =
14189 nRoamOffloadEnabled;
14190 sme_release_global_lock(&pMac->sme);
14191 }
14192
14193 return status;
14194}
14195
Deepak Dhamdheref2a7d8b2016-08-19 16:17:38 -070014196/**
14197 * sme_update_roam_key_mgmt_offload_enabled() - enable/disable key mgmt offload
14198 * This is a synchronous call
14199 * @hal_ctx: The handle returned by mac_open.
14200 * @session_id: Session Identifier
14201 * @key_mgmt_offload_enabled: key mgmt enable/disable flag
14202 * @okc_enabled: Opportunistic key caching enable/disable flag
14203 * Return: QDF_STATUS_SUCCESS - SME updated config successfully.
14204 * Other status means SME is failed to update.
14205 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014206
Deepak Dhamdheref2a7d8b2016-08-19 16:17:38 -070014207QDF_STATUS sme_update_roam_key_mgmt_offload_enabled(tHalHandle hal_ctx,
14208 uint8_t session_id,
14209 bool key_mgmt_offload_enabled,
14210 bool okc_enabled)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014211{
Deepak Dhamdheref2a7d8b2016-08-19 16:17:38 -070014212 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal_ctx);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014213 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014214
Deepak Dhamdheref2a7d8b2016-08-19 16:17:38 -070014215 status = sme_acquire_global_lock(&mac_ctx->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014216 if (QDF_IS_STATUS_SUCCESS(status)) {
Deepak Dhamdheref2a7d8b2016-08-19 16:17:38 -070014217 if (CSR_IS_SESSION_VALID(mac_ctx, session_id)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053014218 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO,
Deepak Dhamdheref2a7d8b2016-08-19 16:17:38 -070014219 "%s: LFR3: key_mgmt_offload_enabled changed to %d",
14220 __func__, key_mgmt_offload_enabled);
14221 status = csr_roam_set_key_mgmt_offload(mac_ctx,
14222 session_id,
14223 key_mgmt_offload_enabled,
14224 okc_enabled);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014225 } else {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014226 status = QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014227 }
Deepak Dhamdheref2a7d8b2016-08-19 16:17:38 -070014228 sme_release_global_lock(&mac_ctx->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014229 }
14230
14231 return status;
14232}
Prashanth Bhattabfc25292015-11-05 11:16:21 -080014233#endif
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014234
14235/* ---------------------------------------------------------------------------
14236 \fn sme_get_temperature
14237 \brief SME API to get the pdev temperature
14238 \param hHal
14239 \param temperature context
14240 \param pCallbackfn: callback fn with response (temperature)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014241 \- return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014242 -------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014243QDF_STATUS sme_get_temperature(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014244 void *tempContext,
14245 void (*pCallbackfn)(int temperature,
14246 void *pContext))
14247{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014248 QDF_STATUS status = QDF_STATUS_SUCCESS;
14249 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014250 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
14251 cds_msg_t cds_message;
14252
14253 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014254 if (QDF_STATUS_SUCCESS == status) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014255 if ((NULL == pCallbackfn) &&
14256 (NULL == pMac->sme.pGetTemperatureCb)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053014257 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014258 FL
14259 ("Indication Call back did not registered"));
14260 sme_release_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014261 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014262 } else if (NULL != pCallbackfn) {
14263 pMac->sme.pTemperatureCbContext = tempContext;
14264 pMac->sme.pGetTemperatureCb = pCallbackfn;
14265 }
14266 /* serialize the req through MC thread */
14267 cds_message.bodyptr = NULL;
14268 cds_message.type = WMA_GET_TEMPERATURE_REQ;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014269 qdf_status = cds_mq_post_message(CDS_MQ_ID_WMA, &cds_message);
14270 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053014271 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014272 FL("Post Get Temperature msg fail"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014273 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014274 }
14275 sme_release_global_lock(&pMac->sme);
14276 }
14277 return status;
14278}
14279
14280/* ---------------------------------------------------------------------------
14281 \fn sme_set_scanning_mac_oui
14282 \brief SME API to set scanning mac oui
14283 \param hHal
14284 \param pScanMacOui: Scanning Mac Oui (input 3 bytes)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014285 \- return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014286 -------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014287QDF_STATUS sme_set_scanning_mac_oui(tHalHandle hHal, tSirScanMacOui *pScanMacOui)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014288{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014289 QDF_STATUS status = QDF_STATUS_SUCCESS;
14290 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014291 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
14292 cds_msg_t cds_message;
14293
14294 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014295 if (QDF_STATUS_SUCCESS == status) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014296 /* Serialize the req through MC thread */
14297 cds_message.bodyptr = pScanMacOui;
14298 cds_message.type = WMA_SET_SCAN_MAC_OUI_REQ;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014299 qdf_status = cds_mq_post_message(CDS_MQ_ID_WMA, &cds_message);
14300 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053014301 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014302 FL("Msg post Set Scan Mac OUI failed"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014303 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014304 }
14305 sme_release_global_lock(&pMac->sme);
14306 }
14307 return status;
14308}
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014309
14310#ifdef DHCP_SERVER_OFFLOAD
14311/* ---------------------------------------------------------------------------
14312 \fn sme_set_dhcp_srv_offload
14313 \brief SME API to set DHCP server offload info
14314 \param hHal
14315 \param pDhcpSrvInfo : DHCP server offload info struct
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014316 \- return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014317 -------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014318QDF_STATUS sme_set_dhcp_srv_offload(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014319 tSirDhcpSrvOffloadInfo *pDhcpSrvInfo)
14320{
14321 cds_msg_t cds_message;
14322 tSirDhcpSrvOffloadInfo *pSmeDhcpSrvInfo;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014323 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014324 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
14325
Anurag Chouhan600c3a02016-03-01 10:33:54 +053014326 pSmeDhcpSrvInfo = qdf_mem_malloc(sizeof(*pSmeDhcpSrvInfo));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014327
14328 if (!pSmeDhcpSrvInfo) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053014329 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014330 "%s: Not able to allocate memory for WMA_SET_DHCP_SERVER_OFFLOAD_CMD",
14331 __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014332 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014333 }
14334
14335 *pSmeDhcpSrvInfo = *pDhcpSrvInfo;
14336
14337 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014338 if (QDF_STATUS_SUCCESS == status) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014339 /* serialize the req through MC thread */
14340 cds_message.type = WMA_SET_DHCP_SERVER_OFFLOAD_CMD;
14341 cds_message.bodyptr = pSmeDhcpSrvInfo;
14342
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014343 if (!QDF_IS_STATUS_SUCCESS
Anurag Chouhan6d760662016-02-20 16:05:43 +053014344 (cds_mq_post_message(QDF_MODULE_ID_WMA, &cds_message))) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053014345 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014346 "%s: Not able to post WMA_SET_DHCP_SERVER_OFFLOAD_CMD to WMA!",
14347 __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053014348 qdf_mem_free(pSmeDhcpSrvInfo);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014349 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014350 }
14351 sme_release_global_lock(&pMac->sme);
14352 } else {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053014353 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014354 "%s: sme_acquire_global_lock error!", __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053014355 qdf_mem_free(pSmeDhcpSrvInfo);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014356 }
14357
14358 return status;
14359}
14360#endif /* DHCP_SERVER_OFFLOAD */
14361
14362#ifdef WLAN_FEATURE_GPIO_LED_FLASHING
14363/* ---------------------------------------------------------------------------
14364 \fn sme_set_led_flashing
14365 \brief API to set the Led flashing parameters.
14366 \param hHal - The handle returned by mac_open.
14367 \param x0, x1 - led flashing parameters
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014368 \return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014369 ---------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014370QDF_STATUS sme_set_led_flashing(tHalHandle hHal, uint8_t type,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014371 uint32_t x0, uint32_t x1)
14372{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014373 QDF_STATUS status = QDF_STATUS_SUCCESS;
14374 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014375 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
14376 cds_msg_t cds_message;
14377 tSirLedFlashingReq *ledflashing;
14378
Anurag Chouhan600c3a02016-03-01 10:33:54 +053014379 ledflashing = qdf_mem_malloc(sizeof(*ledflashing));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014380 if (!ledflashing) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053014381 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014382 FL
14383 ("Not able to allocate memory for WMA_LED_TIMING_REQ"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014384 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014385 }
14386
14387 ledflashing->pattern_id = type;
14388 ledflashing->led_x0 = x0;
14389 ledflashing->led_x1 = x1;
14390
14391 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014392 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014393 /* Serialize the req through MC thread */
14394 cds_message.bodyptr = ledflashing;
14395 cds_message.type = WMA_LED_FLASHING_REQ;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014396 qdf_status = cds_mq_post_message(CDS_MQ_ID_WMA, &cds_message);
14397 if (!QDF_IS_STATUS_SUCCESS(qdf_status))
14398 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014399 sme_release_global_lock(&pMac->sme);
14400 }
14401 return status;
14402}
14403#endif
14404
14405/**
14406 * sme_handle_dfS_chan_scan() - handle DFS channel configuration
14407 * @h_hal: corestack handler
14408 * @dfs_flag: flag indicating dfs channel enable/disable
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014409 * Return: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014410 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014411QDF_STATUS sme_handle_dfs_chan_scan(tHalHandle h_hal, uint8_t dfs_flag)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014412{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014413 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014414 tpAniSirGlobal mac = PMAC_STRUCT(h_hal);
14415
14416 status = sme_acquire_global_lock(&mac->sme);
14417
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014418 if (QDF_STATUS_SUCCESS == status) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014419
14420 mac->scan.fEnableDFSChnlScan = dfs_flag;
14421
14422 /* update the channel list to the firmware */
14423 status = csr_update_channel_list(mac);
14424
14425 sme_release_global_lock(&mac->sme);
14426 }
14427
14428 return status;
14429}
14430
Edhar, Mahesh Kumardf2ec122015-11-16 11:33:16 +053014431#ifdef FEATURE_WLAN_MCC_TO_SCC_SWITCH
14432/**
14433 * sme_validate_sap_channel_switch() - validate target channel switch w.r.t
14434 * concurreny rules set to avoid channel interference.
14435 * @hal - Hal context
14436 * @sap_ch - channel to switch
14437 * @sap_phy_mode - phy mode of SAP
14438 * @cc_switch_mode - concurreny switch mode
14439 * @session_id - sme session id.
14440 *
14441 * Return: true if there is no channel interference else return false
14442 */
14443bool sme_validate_sap_channel_switch(tHalHandle hal,
14444 uint16_t sap_ch, eCsrPhyMode sap_phy_mode, uint8_t cc_switch_mode,
14445 uint8_t session_id)
14446{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014447 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Edhar, Mahesh Kumardf2ec122015-11-16 11:33:16 +053014448 tpAniSirGlobal mac = PMAC_STRUCT(hal);
14449 tCsrRoamSession *session = CSR_GET_SESSION(mac, session_id);
14450 uint16_t intf_channel = 0;
14451
14452 if (!session)
14453 return false;
14454
14455 session->ch_switch_in_progress = true;
14456 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014457 if (QDF_IS_STATUS_SUCCESS(status)) {
Edhar, Mahesh Kumardf2ec122015-11-16 11:33:16 +053014458 intf_channel = csr_check_concurrent_channel_overlap(mac, sap_ch,
14459 sap_phy_mode,
14460 cc_switch_mode);
14461 sme_release_global_lock(&mac->sme);
14462 } else {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053014463 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Edhar, Mahesh Kumardf2ec122015-11-16 11:33:16 +053014464 FL("sme_acquire_global_lock error!"));
14465 session->ch_switch_in_progress = false;
14466 return false;
14467 }
14468
14469 session->ch_switch_in_progress = false;
14470 return (intf_channel == 0) ? true : false;
14471}
14472#endif
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014473
14474/**
14475 * sme_configure_stats_avg_factor() - function to config avg. stats factor
14476 * @hal: hal
14477 * @session_id: session ID
14478 * @stats_avg_factor: average stats factor
14479 *
14480 * This function configures the stats avg factor in firmware
14481 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014482 * Return: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014483 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014484QDF_STATUS sme_configure_stats_avg_factor(tHalHandle hal, uint8_t session_id,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014485 uint16_t stats_avg_factor)
14486{
14487 cds_msg_t msg;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014488 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014489 tpAniSirGlobal mac = PMAC_STRUCT(hal);
14490 struct sir_stats_avg_factor *stats_factor;
14491
Anurag Chouhan600c3a02016-03-01 10:33:54 +053014492 stats_factor = qdf_mem_malloc(sizeof(*stats_factor));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014493
14494 if (!stats_factor) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053014495 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014496 "%s: Not able to allocate memory for SIR_HAL_CONFIG_STATS_FACTOR",
14497 __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014498 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014499 }
14500
14501 status = sme_acquire_global_lock(&mac->sme);
14502
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014503 if (QDF_STATUS_SUCCESS == status) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014504
14505 stats_factor->vdev_id = session_id;
14506 stats_factor->stats_avg_factor = stats_avg_factor;
14507
14508 /* serialize the req through MC thread */
14509 msg.type = SIR_HAL_CONFIG_STATS_FACTOR;
14510 msg.bodyptr = stats_factor;
14511
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014512 if (!QDF_IS_STATUS_SUCCESS(
Anurag Chouhan6d760662016-02-20 16:05:43 +053014513 cds_mq_post_message(QDF_MODULE_ID_WMA, &msg))) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053014514 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014515 "%s: Not able to post SIR_HAL_CONFIG_STATS_FACTOR to WMA!",
14516 __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053014517 qdf_mem_free(stats_factor);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014518 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014519 }
14520 sme_release_global_lock(&mac->sme);
14521 } else {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053014522 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014523 "%s: sme_acquire_global_lock error!",
14524 __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053014525 qdf_mem_free(stats_factor);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014526 }
14527
14528 return status;
14529}
14530
14531/**
14532 * sme_configure_guard_time() - function to configure guard time
14533 * @hal: hal
14534 * @session_id: session id
14535 * @guard_time: guard time
14536 *
14537 * This function configures the guard time in firmware
14538 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014539 * Return: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014540 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014541QDF_STATUS sme_configure_guard_time(tHalHandle hal, uint8_t session_id,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014542 uint32_t guard_time)
14543{
14544 cds_msg_t msg;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014545 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014546 tpAniSirGlobal mac = PMAC_STRUCT(hal);
14547 struct sir_guard_time_request *g_time;
14548
Anurag Chouhan600c3a02016-03-01 10:33:54 +053014549 g_time = qdf_mem_malloc(sizeof(*g_time));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014550
14551 if (!g_time) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053014552 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014553 "%s: Not able to allocate memory for SIR_HAL_CONFIG_GUARD_TIME",
14554 __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014555 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014556 }
14557
14558 status = sme_acquire_global_lock(&mac->sme);
14559
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014560 if (QDF_STATUS_SUCCESS == status) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014561
14562 g_time->vdev_id = session_id;
14563 g_time->guard_time = guard_time;
14564
14565 /* serialize the req through MC thread */
14566 msg.type = SIR_HAL_CONFIG_GUARD_TIME;
14567 msg.bodyptr = g_time;
14568
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014569 if (!QDF_IS_STATUS_SUCCESS(
Anurag Chouhan6d760662016-02-20 16:05:43 +053014570 cds_mq_post_message(QDF_MODULE_ID_WMA, &msg))) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053014571 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014572 "%s: Not able to post SIR_HAL_CONFIG_GUARD_TIME to WMA!",
14573 __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053014574 qdf_mem_free(g_time);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014575 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014576 }
14577 sme_release_global_lock(&mac->sme);
14578 } else {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053014579 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014580 "%s: sme_acquire_global_lock error!",
14581 __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053014582 qdf_mem_free(g_time);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014583 }
14584
14585 return status;
14586}
14587
14588/**
14589 * sme_configure_modulated_dtim() - function to configure modulated dtim
14590 * @h_hal: SME API to enable/disable modulated DTIM instantaneously
14591 * @session_id: session ID
14592 * @modulated_dtim: modulated dtim value
14593 *
14594 * This function configures the modulated dtim in firmware
14595 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014596 * Return: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014597 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014598QDF_STATUS sme_configure_modulated_dtim(tHalHandle h_hal, uint8_t session_id,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014599 uint32_t modulated_dtim)
14600{
14601 cds_msg_t msg;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014602 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014603 tpAniSirGlobal mac = PMAC_STRUCT(h_hal);
14604 wma_cli_set_cmd_t *iwcmd;
14605
Anurag Chouhan600c3a02016-03-01 10:33:54 +053014606 iwcmd = qdf_mem_malloc(sizeof(*iwcmd));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014607 if (NULL == iwcmd) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053014608 QDF_TRACE(QDF_MODULE_ID_SME,
14609 QDF_TRACE_LEVEL_FATAL,
Anurag Chouhanf04e84f2016-03-03 10:12:12 +053014610 "%s: qdf_mem_malloc failed", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014611 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014612 }
14613
14614 status = sme_acquire_global_lock(&mac->sme);
14615
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014616 if (QDF_STATUS_SUCCESS == status) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014617
Anurag Chouhan600c3a02016-03-01 10:33:54 +053014618 qdf_mem_zero((void *)iwcmd, sizeof(*iwcmd));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014619 iwcmd->param_value = modulated_dtim;
14620 iwcmd->param_vdev_id = session_id;
14621 iwcmd->param_id = GEN_PARAM_MODULATED_DTIM;
14622 iwcmd->param_vp_dev = GEN_CMD;
14623 msg.type = WMA_CLI_SET_CMD;
14624 msg.reserved = 0;
14625 msg.bodyptr = (void *)iwcmd;
14626
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014627 if (!QDF_IS_STATUS_SUCCESS(
Anurag Chouhan6d760662016-02-20 16:05:43 +053014628 cds_mq_post_message(QDF_MODULE_ID_WMA, &msg))) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053014629 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014630 "%s: Not able to post GEN_PARAM_DYNAMIC_DTIM to WMA!",
14631 __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053014632 qdf_mem_free(iwcmd);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014633 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014634 }
14635 sme_release_global_lock(&mac->sme);
14636 } else {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053014637 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014638 "%s: sme_acquire_global_lock error!",
14639 __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053014640 qdf_mem_free(iwcmd);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014641 }
14642
14643 return status;
14644}
14645
14646/*
14647 * sme_wifi_start_logger() - Send the start/stop logging command to WMA
14648 * to either start/stop logging
14649 * @hal: HAL context
14650 * @start_log: Structure containing the wifi start logger params
14651 *
14652 * This function sends the start/stop logging command to WMA
14653 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014654 * Return: QDF_STATUS_SUCCESS on successful posting
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014655 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014656QDF_STATUS sme_wifi_start_logger(tHalHandle hal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014657 struct sir_wifi_start_log start_log)
14658{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014659 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014660 tpAniSirGlobal mac = PMAC_STRUCT(hal);
14661 cds_msg_t cds_message;
14662 struct sir_wifi_start_log *req_msg;
14663 uint32_t len;
14664
14665 len = sizeof(*req_msg);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053014666 req_msg = qdf_mem_malloc(len);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014667 if (!req_msg) {
Anurag Chouhan600c3a02016-03-01 10:33:54 +053014668 sms_log(mac, LOGE, FL("qdf_mem_malloc failed"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014669 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014670 }
14671
Anurag Chouhan600c3a02016-03-01 10:33:54 +053014672 qdf_mem_zero(req_msg, len);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014673
14674 req_msg->verbose_level = start_log.verbose_level;
Poddar, Siddartheefe3482016-09-21 18:12:59 +053014675 req_msg->is_iwpriv_command = start_log.is_iwpriv_command;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014676 req_msg->ring_id = start_log.ring_id;
Srinivas Girigowdac34f11d2016-02-25 16:02:42 -080014677 req_msg->ini_triggered = start_log.ini_triggered;
14678 req_msg->user_triggered = start_log.user_triggered;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014679
14680 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014681 if (status != QDF_STATUS_SUCCESS) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014682 sms_log(mac, LOGE,
14683 FL("sme_acquire_global_lock failed(status=%d)"),
14684 status);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053014685 qdf_mem_free(req_msg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014686 return status;
14687 }
14688
14689 /* Serialize the req through MC thread */
14690 cds_message.bodyptr = req_msg;
14691 cds_message.type = SIR_HAL_START_STOP_LOGGING;
14692 status = cds_mq_post_message(CDS_MQ_ID_WMA, &cds_message);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014693 if (!QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014694 sms_log(mac, LOGE,
Arun Khandavalli2476ef52016-04-26 20:19:43 +053014695 FL("cds_mq_post_message failed!(err=%d)"),
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014696 status);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053014697 qdf_mem_free(req_msg);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014698 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014699 }
14700 sme_release_global_lock(&mac->sme);
14701
14702 return status;
14703}
14704
14705/**
14706 * sme_neighbor_middle_of_roaming() - Function to know if
14707 * STA is in the middle of roaming states
14708 * @hal: Handle returned by macOpen
14709 * @sessionId: sessionId of the STA session
14710 *
14711 * This function is a wrapper to call
14712 * csr_neighbor_middle_of_roaming to know STA is in the
14713 * middle of roaming states
14714 *
14715 * Return: True or False
14716 *
14717 */
14718bool sme_neighbor_middle_of_roaming(tHalHandle hHal, uint8_t sessionId)
14719{
14720 return csr_neighbor_middle_of_roaming(PMAC_STRUCT(hHal), sessionId);
14721}
14722
14723/*
14724 * sme_send_flush_logs_cmd_to_fw() - Flush FW logs
14725 * @mac: MAC handle
14726 *
14727 * This function is used to send the command that will
14728 * be used to flush the logs in the firmware
14729 *
Deepak Dhamdhere0f076bd2016-06-02 11:29:21 -070014730 * Return: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014731 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014732QDF_STATUS sme_send_flush_logs_cmd_to_fw(tpAniSirGlobal mac)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014733{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014734 QDF_STATUS status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014735 cds_msg_t message;
14736
14737 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014738 if (status != QDF_STATUS_SUCCESS) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014739 sms_log(mac, LOGE,
14740 FL("sme_acquire_global_lock failed!(status=%d)"),
14741 status);
14742 return status;
14743 }
14744
14745 /* Serialize the req through MC thread */
14746 message.bodyptr = NULL;
14747 message.type = SIR_HAL_FLUSH_LOG_TO_FW;
14748 status = cds_mq_post_message(CDS_MQ_ID_WMA, &message);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014749 if (!QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014750 sms_log(mac, LOGE,
14751 FL("cds_mq_post_message failed!(err=%d)"),
14752 status);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014753 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014754 }
14755 sme_release_global_lock(&mac->sme);
14756 return status;
14757}
14758
14759/**
14760 * sme_enable_uapsd_for_ac() - enable uapsd for access catagory requerst to WMA
14761 * @cds_ctx: cds context
14762 * @sta_id: station id
14763 * @ac: access catagory
14764 * @tid: tid value
14765 * @pri: user priority
14766 * @srvc_int: service interval
14767 * @sus_int: suspend interval
14768 * @dir: tspec direction
14769 * @psb: PSB value
14770 * @sessionId: session id
14771 * @delay_interval: delay interval
14772 *
Anurag Chouhanf04e84f2016-03-03 10:12:12 +053014773 * Return: QDF status
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014774 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014775QDF_STATUS sme_enable_uapsd_for_ac(void *cds_ctx, uint8_t sta_id,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014776 sme_ac_enum_type ac, uint8_t tid,
14777 uint8_t pri, uint32_t srvc_int,
14778 uint32_t sus_int,
14779 sme_tspec_dir_type dir,
14780 uint8_t psb, uint32_t sessionId,
14781 uint32_t delay_interval)
14782{
14783 void *wma_handle;
14784 t_wma_trigger_uapsd_params uapsd_params;
14785 enum uapsd_ac access_category;
14786
14787 if (!psb) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053014788 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014789 "No need to configure auto trigger:psb is 0");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014790 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014791 }
14792
Anurag Chouhan6d760662016-02-20 16:05:43 +053014793 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014794 if (!wma_handle) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053014795 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014796 "wma_handle is NULL");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014797 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014798 }
14799
14800 switch (ac) {
14801 case SME_AC_BK:
14802 access_category = UAPSD_BK;
14803 break;
14804 case SME_AC_BE:
14805 access_category = UAPSD_BE;
14806 break;
14807 case SME_AC_VI:
14808 access_category = UAPSD_VI;
14809 break;
14810 case SME_AC_VO:
14811 access_category = UAPSD_VO;
14812 break;
14813 default:
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014814 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014815 }
14816
14817 uapsd_params.wmm_ac = access_category;
14818 uapsd_params.user_priority = pri;
14819 uapsd_params.service_interval = srvc_int;
14820 uapsd_params.delay_interval = delay_interval;
14821 uapsd_params.suspend_interval = sus_int;
14822
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014823 if (QDF_STATUS_SUCCESS !=
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014824 wma_trigger_uapsd_params(wma_handle, sessionId, &uapsd_params)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053014825 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014826 "Failed to Trigger Uapsd params for sessionId %d",
14827 sessionId);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014828 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014829 }
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014830 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014831}
14832
14833/**
14834 * sme_disable_uapsd_for_ac() - disable uapsed access catagory request to WMA
14835 * @cds_ctx: cds context
14836 * @sta_id: station id
14837 * @ac: access catagory
14838 * @sessionId: session id
14839 *
Anurag Chouhanf04e84f2016-03-03 10:12:12 +053014840 * Return: QDF status
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014841 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014842QDF_STATUS sme_disable_uapsd_for_ac(void *cds_ctx, uint8_t sta_id,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014843 sme_ac_enum_type ac,
14844 uint32_t sessionId)
14845{
14846 void *wma_handle;
14847 enum uapsd_ac access_category;
14848
14849 switch (ac) {
14850 case SME_AC_BK:
14851 access_category = UAPSD_BK;
14852 break;
14853 case SME_AC_BE:
14854 access_category = UAPSD_BE;
14855 break;
14856 case SME_AC_VI:
14857 access_category = UAPSD_VI;
14858 break;
14859 case SME_AC_VO:
14860 access_category = UAPSD_VO;
14861 break;
14862 default:
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014863 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014864 }
14865
Anurag Chouhan6d760662016-02-20 16:05:43 +053014866 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014867 if (!wma_handle) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053014868 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014869 "wma handle is NULL");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014870 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014871 }
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014872 if (QDF_STATUS_SUCCESS !=
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014873 wma_disable_uapsd_per_ac(wma_handle, sessionId, access_category)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053014874 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014875 "Failed to disable uapsd for ac %d for sessionId %d",
14876 ac, sessionId);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014877 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014878 }
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014879 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014880}
14881
14882/**
14883 * sme_update_nss() - SME API to change the number for spatial streams
14884 * (1 or 2)
14885 * @hal: Handle returned by mac open
14886 * @nss: Number of spatial streams
14887 *
14888 * This function is used to update the number of spatial streams supported.
14889 *
14890 * Return: Success upon successfully changing nss else failure
14891 *
14892 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014893QDF_STATUS sme_update_nss(tHalHandle h_hal, uint8_t nss)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014894{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014895 QDF_STATUS status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014896 tpAniSirGlobal mac_ctx = PMAC_STRUCT(h_hal);
14897 uint32_t i, value = 0;
14898 union {
14899 uint16_t cfg_value16;
14900 tSirMacHTCapabilityInfo ht_cap_info;
14901 } uHTCapabilityInfo;
14902 tCsrRoamSession *csr_session;
14903
14904 status = sme_acquire_global_lock(&mac_ctx->sme);
14905
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014906 if (QDF_STATUS_SUCCESS == status) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014907 mac_ctx->roam.configParam.enable2x2 = (nss == 1) ? 0 : 1;
14908
14909 /* get the HT capability info*/
14910 sme_cfg_get_int(mac_ctx, WNI_CFG_HT_CAP_INFO, &value);
14911 uHTCapabilityInfo.cfg_value16 = (0xFFFF & value);
14912
14913 for (i = 0; i < CSR_ROAM_SESSION_MAX; i++) {
14914 if (CSR_IS_SESSION_VALID(mac_ctx, i)) {
14915 csr_session = &mac_ctx->roam.roamSession[i];
14916 csr_session->htConfig.ht_tx_stbc =
14917 uHTCapabilityInfo.ht_cap_info.txSTBC;
14918 }
14919 }
14920
14921 sme_release_global_lock(&mac_ctx->sme);
14922 }
14923 return status;
14924}
14925
14926/**
Archana Ramachandran5041b252016-04-25 14:29:25 -070014927 * sme_update_user_configured_nss() - sets the nss based on user request
14928 * @hal: Pointer to HAL
14929 * @nss: number of streams
14930 *
14931 * Return: None
14932 */
14933void sme_update_user_configured_nss(tHalHandle hal, uint8_t nss)
14934{
14935 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
14936
14937 mac_ctx->user_configured_nss = nss;
14938}
14939
14940/**
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014941 * sme_set_rssi_threshold_breached_cb() - set rssi threshold breached callback
Arun Khandavalli4b55da72016-07-19 19:55:01 +053014942 * @h_hal: global hal handle
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014943 * @cb: callback function pointer
14944 *
14945 * This function stores the rssi threshold breached callback function.
14946 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014947 * Return: QDF_STATUS enumeration.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014948 */
Arun Khandavalli4b55da72016-07-19 19:55:01 +053014949QDF_STATUS sme_set_rssi_threshold_breached_cb(tHalHandle h_hal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014950 void (*cb)(void *, struct rssi_breach_event *))
14951{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014952 QDF_STATUS status = QDF_STATUS_SUCCESS;
Arun Khandavalli4b55da72016-07-19 19:55:01 +053014953 tpAniSirGlobal mac;
14954
14955 if (!h_hal) {
14956 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
14957 FL("hHal is not valid"));
14958 return QDF_STATUS_E_INVAL;
14959 }
14960 mac = PMAC_STRUCT(h_hal);
14961
14962 status = sme_acquire_global_lock(&mac->sme);
14963 if (!QDF_IS_STATUS_SUCCESS(status)) {
14964 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
14965 FL("sme_acquire_global_lock failed!(status=%d)"),
14966 status);
14967 return status;
14968 }
14969
14970 mac->sme.rssi_threshold_breached_cb = cb;
14971 sme_release_global_lock(&mac->sme);
14972 return status;
14973}
14974
14975/**
14976 * sme_set_rssi_threshold_breached_cb() - Reset rssi threshold breached callback
14977 * @hal: global hal handle
14978 *
14979 * This function de-registers the rssi threshold breached callback function.
14980 *
14981 * Return: QDF_STATUS enumeration.
14982 */
14983QDF_STATUS sme_reset_rssi_threshold_breached_cb(tHalHandle hal)
14984{
14985 QDF_STATUS status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014986 tpAniSirGlobal mac = PMAC_STRUCT(hal);
14987
14988 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014989 if (!QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014990 sms_log(mac, LOGE,
14991 FL("sme_acquire_global_lock failed!(status=%d)"),
14992 status);
14993 return status;
14994 }
14995
Arun Khandavalli4b55da72016-07-19 19:55:01 +053014996 mac->sme.rssi_threshold_breached_cb = NULL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014997 sme_release_global_lock(&mac->sme);
14998 return status;
14999}
15000
15001/**
15002 * sme_is_any_session_in_connected_state() - SME wrapper API to
15003 * check if any session is in connected state or not.
15004 *
15005 * @hal: Handle returned by mac open
15006 *
15007 * This function is used to check if any valid sme session is in
15008 * connected state or not.
15009 *
15010 * Return: true if any session is connected, else false.
15011 *
15012 */
15013bool sme_is_any_session_in_connected_state(tHalHandle h_hal)
15014{
15015 tpAniSirGlobal mac_ctx = PMAC_STRUCT(h_hal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015016 QDF_STATUS status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015017 bool ret = false;
15018
15019 status = sme_acquire_global_lock(&mac_ctx->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015020 if (QDF_STATUS_SUCCESS == status) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015021 ret = csr_is_any_session_in_connect_state(mac_ctx);
15022 sme_release_global_lock(&mac_ctx->sme);
15023 }
15024 return ret;
15025}
15026
15027/**
15028 * sme_set_rssi_monitoring() - set rssi monitoring
15029 * @hal: global hal handle
15030 * @input: request message
15031 *
15032 * This function constructs the vos message and fill in message type,
15033 * bodyptr with @input and posts it to WDA queue.
15034 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015035 * Return: QDF_STATUS enumeration
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015036 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015037QDF_STATUS sme_set_rssi_monitoring(tHalHandle hal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015038 struct rssi_monitor_req *input)
15039{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015040 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015041 tpAniSirGlobal mac = PMAC_STRUCT(hal);
15042 cds_msg_t cds_message;
15043 struct rssi_monitor_req *req_msg;
15044
15045 sms_log(mac, LOG1, FL("enter"));
Anurag Chouhan600c3a02016-03-01 10:33:54 +053015046 req_msg = qdf_mem_malloc(sizeof(*req_msg));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015047 if (!req_msg) {
15048 sms_log(mac, LOGE, FL("memory allocation failed"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015049 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015050 }
15051
15052 *req_msg = *input;
15053
15054 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015055 if (!QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015056 sms_log(mac, LOGE,
15057 FL("sme_acquire_global_lock failed!(status=%d)"),
15058 status);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053015059 qdf_mem_free(req_msg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015060 return status;
15061 }
15062
15063 /* Serialize the req through MC thread */
15064 cds_message.bodyptr = req_msg;
15065 cds_message.type = WMA_SET_RSSI_MONITOR_REQ;
15066 status = cds_mq_post_message(CDS_MQ_ID_WMA, &cds_message);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015067 if (!QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015068 sms_log(mac, LOGE,
15069 FL("cds_mq_post_message failed!(err=%d)"),
15070 status);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053015071 qdf_mem_free(req_msg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015072 }
15073 sme_release_global_lock(&mac->sme);
15074
15075 return status;
15076}
15077
15078/**
15079 * sme_fw_mem_dump() - Get FW memory dump
15080 * @hHal: hal handle
15081 * @recvd_req: received memory dump request.
15082 *
15083 * This API is invoked by HDD to indicate FW to start
15084 * dumping firmware memory.
15085 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015086 * Return: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015087 */
15088#ifdef WLAN_FEATURE_MEMDUMP
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015089QDF_STATUS sme_fw_mem_dump(tHalHandle hHal, void *recvd_req)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015090{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015091 QDF_STATUS status = QDF_STATUS_SUCCESS;
15092 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015093 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
15094 cds_msg_t msg;
15095 struct fw_dump_req *send_req;
15096 struct fw_dump_seg_req seg_req;
15097 int loop;
15098
Anurag Chouhan600c3a02016-03-01 10:33:54 +053015099 send_req = qdf_mem_malloc(sizeof(*send_req));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015100 if (!send_req) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053015101 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015102 FL("Memory allocation failed for WDA_FW_MEM_DUMP"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015103 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015104 }
Anurag Chouhan600c3a02016-03-01 10:33:54 +053015105 qdf_mem_copy(send_req, recvd_req, sizeof(*send_req));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015106
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053015107 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015108 FL("request_id:%d num_seg:%d"),
15109 send_req->request_id, send_req->num_seg);
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053015110 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015111 FL("Segment Information"));
15112 for (loop = 0; loop < send_req->num_seg; loop++) {
15113 seg_req = send_req->segment[loop];
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053015114 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015115 FL("seg_number:%d"), loop);
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053015116 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015117 FL("seg_id:%d start_addr_lo:0x%x start_addr_hi:0x%x"),
15118 seg_req.seg_id, seg_req.seg_start_addr_lo,
15119 seg_req.seg_start_addr_hi);
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053015120 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015121 FL("seg_length:%d dst_addr_lo:0x%x dst_addr_hi:0x%x"),
15122 seg_req.seg_length, seg_req.dst_addr_lo,
15123 seg_req.dst_addr_hi);
15124 }
15125
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015126 if (QDF_STATUS_SUCCESS == sme_acquire_global_lock(&pMac->sme)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015127 msg.bodyptr = send_req;
15128 msg.type = WMA_FW_MEM_DUMP_REQ;
15129 msg.reserved = 0;
15130
Anurag Chouhan6d760662016-02-20 16:05:43 +053015131 qdf_status = cds_mq_post_message(QDF_MODULE_ID_WMA, &msg);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015132 if (QDF_STATUS_SUCCESS != qdf_status) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053015133 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015134 FL("Not able to post WMA_FW_MEM_DUMP"));
Anurag Chouhan600c3a02016-03-01 10:33:54 +053015135 qdf_mem_free(send_req);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015136 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015137 }
15138 sme_release_global_lock(&pMac->sme);
15139 } else {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053015140 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015141 FL("Failed to acquire SME Global Lock"));
Anurag Chouhan600c3a02016-03-01 10:33:54 +053015142 qdf_mem_free(send_req);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015143 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015144 }
15145
15146 return status;
15147}
15148#else
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015149QDF_STATUS sme_fw_mem_dump(tHalHandle hHal, void *recvd_req)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015150{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015151 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015152}
15153#endif /* WLAN_FEATURE_MEMDUMP */
15154
15155/*
Manishekar Chandrasekaran7009f252016-04-21 19:14:15 +053015156 * sme_pdev_set_pcl() - Send WMI_PDEV_SET_PCL_CMDID to the WMA
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015157 * @hal: Handle returned by macOpen
15158 * @msg: PCL channel list and length structure
15159 *
Manishekar Chandrasekaran7009f252016-04-21 19:14:15 +053015160 * Sends the command to WMA to send WMI_PDEV_SET_PCL_CMDID to FW
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015161 * Return: QDF_STATUS_SUCCESS on successful posting
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015162 */
Manishekar Chandrasekaran7009f252016-04-21 19:14:15 +053015163QDF_STATUS sme_pdev_set_pcl(tHalHandle hal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015164 struct sir_pcl_list msg)
15165{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015166 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015167 tpAniSirGlobal mac = PMAC_STRUCT(hal);
15168 cds_msg_t cds_message;
Manishekar Chandrasekaran7009f252016-04-21 19:14:15 +053015169 struct wmi_pcl_chan_weights *req_msg;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015170 uint32_t len, i;
15171
15172 len = sizeof(*req_msg);
15173
Anurag Chouhan600c3a02016-03-01 10:33:54 +053015174 req_msg = qdf_mem_malloc(len);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015175 if (!req_msg) {
Anurag Chouhan600c3a02016-03-01 10:33:54 +053015176 sms_log(mac, LOGE, FL("qdf_mem_malloc failed"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015177 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015178 }
15179
Anurag Chouhan600c3a02016-03-01 10:33:54 +053015180 qdf_mem_zero(req_msg, len);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015181
Manishekar Chandrasekaran7009f252016-04-21 19:14:15 +053015182 for (i = 0; i < msg.pcl_len; i++) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015183 req_msg->pcl_list[i] = msg.pcl_list[i];
Manishekar Chandrasekaran7009f252016-04-21 19:14:15 +053015184 req_msg->weight_list[i] = msg.weight_list[i];
15185 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015186
15187 req_msg->pcl_len = msg.pcl_len;
15188
15189 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015190 if (status != QDF_STATUS_SUCCESS) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015191 sms_log(mac, LOGE,
Deepak Dhamdhere0f076bd2016-06-02 11:29:21 -070015192 FL("sme_acquire_global_lock failed!(status=%d)"),
15193 status);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053015194 qdf_mem_free(req_msg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015195 return status;
15196 }
15197
15198 /* Serialize the req through MC thread */
15199 cds_message.bodyptr = req_msg;
Manishekar Chandrasekaran7009f252016-04-21 19:14:15 +053015200 cds_message.type = SIR_HAL_PDEV_SET_PCL_TO_FW;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015201 status = cds_mq_post_message(CDS_MQ_ID_WMA, &cds_message);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015202 if (!QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015203 sms_log(mac, LOGE,
Deepak Dhamdhere0f076bd2016-06-02 11:29:21 -070015204 FL("cds_mq_post_message failed!(err=%d)"),
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015205 status);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053015206 qdf_mem_free(req_msg);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015207 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015208 }
15209 sme_release_global_lock(&mac->sme);
15210
15211 return status;
15212}
15213
15214/*
Manishekar Chandrasekarand9640342016-04-27 12:28:26 +053015215 * sme_pdev_set_hw_mode() - Send WMI_PDEV_SET_HW_MODE_CMDID to the WMA
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015216 * @hal: Handle returned by macOpen
15217 * @msg: HW mode structure containing hw mode and callback details
15218 *
Manishekar Chandrasekarand9640342016-04-27 12:28:26 +053015219 * Sends the command to CSR to send WMI_PDEV_SET_HW_MODE_CMDID to FW
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015220 * Return: QDF_STATUS_SUCCESS on successful posting
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015221 */
Manishekar Chandrasekarand9640342016-04-27 12:28:26 +053015222QDF_STATUS sme_pdev_set_hw_mode(tHalHandle hal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015223 struct sir_hw_mode msg)
15224{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015225 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015226 tpAniSirGlobal mac = PMAC_STRUCT(hal);
15227 tSmeCmd *cmd = NULL;
15228
15229 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015230 if (!QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015231 sms_log(mac, LOGE, FL("Failed to acquire lock"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015232 return QDF_STATUS_E_RESOURCES;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015233 }
15234
15235 cmd = sme_get_command_buffer(mac);
15236 if (!cmd) {
15237 sms_log(mac, LOGE, FL("Get command buffer failed"));
15238 sme_release_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015239 return QDF_STATUS_E_NULL_VALUE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015240 }
15241
15242 cmd->command = e_sme_command_set_hw_mode;
15243 cmd->u.set_hw_mode_cmd.hw_mode_index = msg.hw_mode_index;
15244 cmd->u.set_hw_mode_cmd.set_hw_mode_cb = msg.set_hw_mode_cb;
Chandrasekaran, Manishekaref70c0d2015-10-20 19:54:55 +053015245 cmd->u.set_hw_mode_cmd.reason = msg.reason;
15246 cmd->u.set_hw_mode_cmd.session_id = msg.session_id;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015247
Chandrasekaran, Manishekarce2172e2016-02-18 16:12:43 +053015248 sms_log(mac, LOG1,
15249 FL("Queuing set hw mode to CSR, session:%d reason:%d"),
15250 cmd->u.set_hw_mode_cmd.session_id,
15251 cmd->u.set_hw_mode_cmd.reason);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015252 csr_queue_sme_command(mac, cmd, false);
15253
15254 sme_release_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015255 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015256}
15257
15258/**
15259 * sme_register_hw_mode_trans_cb() - HW mode transition callback registration
15260 * @hal: Handle returned by macOpen
15261 * @callback: HDD callback to be registered
15262 *
15263 * Registers the HDD callback with SME. This callback will be invoked when
15264 * HW mode transition event is received from the FW
15265 *
15266 * Return: None
15267 */
15268void sme_register_hw_mode_trans_cb(tHalHandle hal,
15269 hw_mode_transition_cb callback)
15270{
15271 tpAniSirGlobal mac = PMAC_STRUCT(hal);
15272
15273 mac->sme.sme_hw_mode_trans_cb = callback;
15274 sms_log(mac, LOG1, FL("HW mode transition callback registered"));
15275}
15276
15277/**
15278 * sme_nss_update_request() - Send beacon templete update to FW with new
15279 * nss value
15280 * @hal: Handle returned by macOpen
15281 * @vdev_id: the session id
15282 * @new_nss: the new nss value
15283 * @cback: hdd callback
15284 * @next_action: next action to happen at policy mgr after beacon update
15285 *
15286 * Sends the command to CSR to send to PE
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015287 * Return: QDF_STATUS_SUCCESS on successful posting
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015288 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015289QDF_STATUS sme_nss_update_request(tHalHandle hHal, uint32_t vdev_id,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015290 uint8_t new_nss, void *cback, uint8_t next_action,
Chandrasekaran, Manishekarce2172e2016-02-18 16:12:43 +053015291 void *hdd_context,
15292 enum sir_conn_update_reason reason)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015293{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015294 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015295 tpAniSirGlobal mac = PMAC_STRUCT(hHal);
15296 tSmeCmd *cmd = NULL;
15297
15298 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015299 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015300 cmd = sme_get_command_buffer(mac);
15301 if (!cmd) {
15302 sms_log(mac, LOGE, FL("Get command buffer failed"));
15303 sme_release_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015304 return QDF_STATUS_E_NULL_VALUE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015305 }
15306 cmd->command = e_sme_command_nss_update;
15307 /* Sessionized modules may require this info */
15308 cmd->sessionId = vdev_id;
15309 cmd->u.nss_update_cmd.new_nss = new_nss;
15310 cmd->u.nss_update_cmd.session_id = vdev_id;
15311 cmd->u.nss_update_cmd.nss_update_cb = cback;
15312 cmd->u.nss_update_cmd.context = hdd_context;
15313 cmd->u.nss_update_cmd.next_action = next_action;
Chandrasekaran, Manishekarce2172e2016-02-18 16:12:43 +053015314 cmd->u.nss_update_cmd.reason = reason;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015315
15316 sms_log(mac, LOG1, FL("Queuing e_sme_command_nss_update to CSR"));
15317 csr_queue_sme_command(mac, cmd, false);
15318 sme_release_global_lock(&mac->sme);
15319 }
15320 return status;
15321}
15322
15323/**
15324 * sme_soc_set_dual_mac_config() - Set dual mac configurations
15325 * @hal: Handle returned by macOpen
15326 * @msg: Structure containing the dual mac config parameters
15327 *
15328 * Queues configuration information to CSR to configure
15329 * WLAN firmware for the dual MAC features
15330 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015331 * Return: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015332 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015333QDF_STATUS sme_soc_set_dual_mac_config(tHalHandle hal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015334 struct sir_dual_mac_config msg)
15335{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015336 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015337 tpAniSirGlobal mac = PMAC_STRUCT(hal);
15338 tSmeCmd *cmd;
15339
15340 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015341 if (!QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015342 sms_log(mac, LOGE, FL("Failed to acquire lock"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015343 return QDF_STATUS_E_RESOURCES;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015344 }
15345
15346 cmd = sme_get_command_buffer(mac);
15347 if (!cmd) {
15348 sms_log(mac, LOGE, FL("Get command buffer failed"));
15349 sme_release_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015350 return QDF_STATUS_E_NULL_VALUE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015351 }
15352
15353 cmd->command = e_sme_command_set_dual_mac_config;
15354 cmd->u.set_dual_mac_cmd.scan_config = msg.scan_config;
15355 cmd->u.set_dual_mac_cmd.fw_mode_config = msg.fw_mode_config;
15356 cmd->u.set_dual_mac_cmd.set_dual_mac_cb = msg.set_dual_mac_cb;
15357
15358 sms_log(mac, LOG1,
15359 FL("Queuing e_sme_command_set_dual_mac_config to CSR: %x %x"),
15360 cmd->u.set_dual_mac_cmd.scan_config,
15361 cmd->u.set_dual_mac_cmd.fw_mode_config);
15362 csr_queue_sme_command(mac, cmd, false);
15363
15364 sme_release_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015365 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015366}
15367
Ravi Joshi9e891ba2015-11-09 19:03:46 -080015368#ifdef FEATURE_LFR_SUBNET_DETECTION
15369/**
15370 * sme_gateway_param_update() - to update gateway parameters with WMA
15371 * @Hal: hal handle
15372 * @gw_params: request parameters from HDD
15373 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015374 * Return: QDF_STATUS
Ravi Joshi9e891ba2015-11-09 19:03:46 -080015375 *
15376 * This routine will update gateway parameters to WMA
15377 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015378QDF_STATUS sme_gateway_param_update(tHalHandle Hal,
Ravi Joshi9e891ba2015-11-09 19:03:46 -080015379 struct gateway_param_update_req *gw_params)
15380{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015381 QDF_STATUS qdf_status;
Ravi Joshi9e891ba2015-11-09 19:03:46 -080015382 cds_msg_t cds_message;
15383 struct gateway_param_update_req *request_buf;
15384
Anurag Chouhan600c3a02016-03-01 10:33:54 +053015385 request_buf = qdf_mem_malloc(sizeof(*request_buf));
Ravi Joshi9e891ba2015-11-09 19:03:46 -080015386 if (NULL == request_buf) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053015387 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Ravi Joshi9e891ba2015-11-09 19:03:46 -080015388 FL("Not able to allocate memory for gw param update request"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015389 return QDF_STATUS_E_NOMEM;
Ravi Joshi9e891ba2015-11-09 19:03:46 -080015390 }
15391
15392 *request_buf = *gw_params;
15393
15394 cds_message.type = WMA_GW_PARAM_UPDATE_REQ;
15395 cds_message.reserved = 0;
15396 cds_message.bodyptr = request_buf;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015397 qdf_status = cds_mq_post_message(CDS_MQ_ID_WMA, &cds_message);
15398 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053015399 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Ravi Joshi9e891ba2015-11-09 19:03:46 -080015400 FL("Not able to post WMA_GW_PARAM_UPDATE_REQ message to HAL"));
Anurag Chouhan600c3a02016-03-01 10:33:54 +053015401 qdf_mem_free(request_buf);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015402 return QDF_STATUS_E_FAILURE;
Ravi Joshi9e891ba2015-11-09 19:03:46 -080015403 }
15404
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015405 return QDF_STATUS_SUCCESS;
Ravi Joshi9e891ba2015-11-09 19:03:46 -080015406}
15407#endif /* FEATURE_LFR_SUBNET_DETECTION */
15408
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015409/**
Archana Ramachandrana20ef812015-11-13 16:12:13 -080015410 * sme_soc_set_antenna_mode() - set antenna mode
15411 * @hal: Handle returned by macOpen
15412 * @msg: Structure containing the antenna mode parameters
15413 *
15414 * Send the command to CSR to send
15415 * WMI_SOC_SET_ANTENNA_MODE_CMDID to FW
15416 *
15417 * Return: QDF_STATUS
15418 */
15419QDF_STATUS sme_soc_set_antenna_mode(tHalHandle hal,
15420 struct sir_antenna_mode_param *msg)
15421{
15422 QDF_STATUS status = QDF_STATUS_SUCCESS;
15423 tpAniSirGlobal mac = PMAC_STRUCT(hal);
15424 tSmeCmd *cmd;
15425
15426 if (NULL == msg) {
15427 sms_log(mac, LOGE, FL("antenna mode mesg is NULL"));
15428 return QDF_STATUS_E_FAILURE;
15429 }
15430
15431 status = sme_acquire_global_lock(&mac->sme);
15432 if (!QDF_IS_STATUS_SUCCESS(status)) {
15433 sms_log(mac, LOGE, FL("Failed to acquire lock"));
15434 return QDF_STATUS_E_RESOURCES;
15435 }
15436
15437 cmd = sme_get_command_buffer(mac);
15438 if (!cmd) {
15439 sme_release_global_lock(&mac->sme);
15440 sms_log(mac, LOGE, FL("Get command buffer failed"));
15441 return QDF_STATUS_E_NULL_VALUE;
15442 }
15443
15444 cmd->command = e_sme_command_set_antenna_mode;
15445 cmd->u.set_antenna_mode_cmd = *msg;
15446
15447 sms_log(mac, LOG1,
15448 FL("Queuing e_sme_command_set_antenna_mode to CSR: %d %d"),
15449 cmd->u.set_antenna_mode_cmd.num_rx_chains,
15450 cmd->u.set_antenna_mode_cmd.num_tx_chains);
15451
15452 csr_queue_sme_command(mac, cmd, false);
15453 sme_release_global_lock(&mac->sme);
15454
15455 return QDF_STATUS_SUCCESS;
15456}
15457
15458/**
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015459 * sme_set_peer_authorized() - call peer authorized callback
15460 * @peer_addr: peer mac address
15461 * @auth_cb: auth callback
15462 * @vdev_id: vdev id
15463 *
Anurag Chouhanf04e84f2016-03-03 10:12:12 +053015464 * Return: QDF Status
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015465 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015466QDF_STATUS sme_set_peer_authorized(uint8_t *peer_addr,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015467 sme_peer_authorized_fp auth_cb,
15468 uint32_t vdev_id)
15469{
15470 void *wma_handle;
15471
Anurag Chouhan6d760662016-02-20 16:05:43 +053015472 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015473 if (!wma_handle) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053015474 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015475 "wma handle is NULL");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015476 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015477 }
15478
15479 wma_set_peer_authorized_cb(wma_handle, auth_cb);
15480 return wma_set_peer_param(wma_handle, peer_addr, WMI_PEER_AUTHORIZE,
15481 1, vdev_id);
15482}
15483
15484/*
Amar Singhal7c1e8982016-05-19 15:08:09 -070015485 * sme_handle_set_fcc_channel() - set spec. tx power for non-fcc channel
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015486 * @hal: HAL pointer
Amar Singhal83a047a2016-05-19 15:56:11 -070015487 * @fcc_constraint: flag to enable/disable the constraint
15488 * @scan_pending: whether there is pending scan
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015489 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015490 * Return: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015491 */
Amar Singhal83a047a2016-05-19 15:56:11 -070015492QDF_STATUS sme_handle_set_fcc_channel(tHalHandle hal, bool fcc_constraint,
15493 bool scan_pending)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015494{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015495 QDF_STATUS status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015496 tpAniSirGlobal mac_ptr = PMAC_STRUCT(hal);
15497
15498 status = sme_acquire_global_lock(&mac_ptr->sme);
15499
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015500 if (QDF_STATUS_SUCCESS == status) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015501
15502 if (fcc_constraint != mac_ptr->scan.fcc_constraint) {
15503 mac_ptr->scan.fcc_constraint = fcc_constraint;
Amar Singhal83a047a2016-05-19 15:56:11 -070015504 if (scan_pending)
15505 mac_ptr->scan.defer_update_channel_list = true;
15506 else
15507 status = csr_update_channel_list(mac_ptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015508 /* update the channel list in firmware */
15509 status = csr_update_channel_list(mac_ptr);
15510 }
15511
15512 sme_release_global_lock(&mac_ptr->sme);
15513 }
15514
15515 return status;
15516}
15517/**
15518 * sme_setdef_dot11mode() - Updates pMac with default dot11mode
15519 * @hal: Global MAC pointer
15520 *
15521 * Return: NULL.
15522 */
15523void sme_setdef_dot11mode(tHalHandle hal)
15524{
15525 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
15526 csr_set_default_dot11_mode(mac_ctx);
15527}
15528
15529/**
15530 * sme_update_roam_scan_hi_rssi_scan_params() - update high rssi scan
15531 * params
15532 * @hal_handle - The handle returned by macOpen.
15533 * @session_id - Session Identifier
15534 * @notify_id - Identifies 1 of the 4 parameters to be modified
15535 * @val New value of the parameter
15536 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015537 * Return: QDF_STATUS - SME update config successful.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015538 * Other status means SME failed to update
15539 */
15540
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015541QDF_STATUS sme_update_roam_scan_hi_rssi_scan_params(tHalHandle hal_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015542 uint8_t session_id,
15543 uint32_t notify_id,
15544 int32_t val)
15545{
15546 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal_handle);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015547 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015548 tCsrNeighborRoamConfig *nr_config = NULL;
15549 tpCsrNeighborRoamControlInfo nr_info = NULL;
15550 uint32_t reason = 0;
15551
15552 status = sme_acquire_global_lock(&mac_ctx->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015553 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015554 nr_config = &mac_ctx->roam.configParam.neighborRoamConfig;
15555 nr_info = &mac_ctx->roam.neighborRoamInfo[session_id];
15556 switch (notify_id) {
15557 case eCSR_HI_RSSI_SCAN_MAXCOUNT_ID:
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053015558 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015559 "%s: gRoamScanHirssiMaxCount %d => %d",
15560 __func__, nr_config->nhi_rssi_scan_max_count,
15561 val);
15562 nr_config->nhi_rssi_scan_max_count = val;
15563 nr_info->cfgParams.hi_rssi_scan_max_count = val;
15564 reason = REASON_ROAM_SCAN_HI_RSSI_MAXCOUNT_CHANGED;
15565 break;
15566
15567 case eCSR_HI_RSSI_SCAN_RSSI_DELTA_ID:
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053015568 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015569 FL("gRoamScanHiRssiDelta %d => %d"),
15570 nr_config->nhi_rssi_scan_rssi_delta,
15571 val);
15572 nr_config->nhi_rssi_scan_rssi_delta = val;
15573 nr_info->cfgParams.hi_rssi_scan_rssi_delta = val;
15574 reason = REASON_ROAM_SCAN_HI_RSSI_DELTA_CHANGED;
15575 break;
15576
15577 case eCSR_HI_RSSI_SCAN_DELAY_ID:
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053015578 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015579 FL("gRoamScanHiRssiDelay %d => %d"),
15580 nr_config->nhi_rssi_scan_delay,
15581 val);
15582 nr_config->nhi_rssi_scan_delay = val;
15583 nr_info->cfgParams.hi_rssi_scan_delay = val;
15584 reason = REASON_ROAM_SCAN_HI_RSSI_DELAY_CHANGED;
15585 break;
15586
15587 case eCSR_HI_RSSI_SCAN_RSSI_UB_ID:
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053015588 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015589 FL("gRoamScanHiRssiUpperBound %d => %d"),
15590 nr_config->nhi_rssi_scan_rssi_ub,
15591 val);
15592 nr_config->nhi_rssi_scan_rssi_ub = val;
15593 nr_info->cfgParams.hi_rssi_scan_rssi_ub = val;
15594 reason = REASON_ROAM_SCAN_HI_RSSI_UB_CHANGED;
15595 break;
15596
15597 default:
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053015598 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015599 FL("invalid parameter notify_id %d"),
15600 notify_id);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015601 status = QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015602 break;
15603 }
15604 sme_release_global_lock(&mac_ctx->sme);
15605 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015606 if (mac_ctx->roam.configParam.isRoamOffloadScanEnabled &&
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015607 status == QDF_STATUS_SUCCESS) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015608 csr_roam_offload_scan(mac_ctx, session_id,
15609 ROAM_SCAN_OFFLOAD_UPDATE_CFG, reason);
15610 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015611
15612 return status;
15613}
15614
Krishna Kumaar Natarajan052c6e62015-09-28 15:32:55 -070015615/**
15616 * sme_update_tgt_services() - update the target services config.
15617 * @hal: HAL pointer.
15618 * @cfg: wma_tgt_services parameters.
15619 *
15620 * update the target services config.
15621 *
15622 * Return: None.
15623 */
15624void sme_update_tgt_services(tHalHandle hal, struct wma_tgt_services *cfg)
15625{
15626 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
15627
15628 mac_ctx->lteCoexAntShare = cfg->lte_coex_ant_share;
15629 mac_ctx->beacon_offload = cfg->beacon_offload;
mukul sharma72c8b222015-09-04 17:02:01 +053015630 mac_ctx->pmf_offload = cfg->pmf_offload;
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053015631 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO,
mukul sharma72c8b222015-09-04 17:02:01 +053015632 FL("mac_ctx->pmf_offload: %d"), mac_ctx->pmf_offload);
Krishna Kumaar Natarajan052c6e62015-09-28 15:32:55 -070015633
15634 return;
15635}
Masti, Narayanraddic4a7ab82015-11-25 15:41:10 +053015636
Chandrasekaran, Manishekar2859de42016-02-11 16:17:38 +053015637/**
15638 * sme_is_session_id_valid() - Check if the session id is valid
15639 * @hal: Pointer to HAL
15640 * @session_id: Session id
15641 *
15642 * Checks if the session id is valid or not
15643 *
15644 * Return: True is the session id is valid, false otherwise
15645 */
15646bool sme_is_session_id_valid(tHalHandle hal, uint32_t session_id)
15647{
15648 tpAniSirGlobal mac = PMAC_STRUCT(hal);
15649 if (!mac) {
Chandrasekaran, Manishekard3cb4772016-02-22 22:21:10 +053015650 /* Using QDF_TRACE since mac is not available for sms_log */
15651 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
15652 "%s: null mac pointer", __func__);
Chandrasekaran, Manishekar2859de42016-02-11 16:17:38 +053015653 return false;
15654 }
15655
15656 if (CSR_IS_SESSION_VALID(mac, session_id)) {
15657 return true;
15658 } else {
15659 sms_log(mac, LOGE,
15660 FL("invalid session id:%d"), session_id);
15661 return false;
15662 }
15663}
15664
Masti, Narayanraddic4a7ab82015-11-25 15:41:10 +053015665#ifdef FEATURE_WLAN_TDLS
15666
15667/**
15668 * sme_get_opclass() - determine operating class
15669 * @hal: Pointer to HAL
15670 * @channel: channel id
15671 * @bw_offset: bandwidth offset
15672 * @opclass: pointer to operating class
15673 *
15674 * Function will determine operating class from regdm_get_opclass_from_channel
15675 *
15676 * Return: none
15677 */
15678void sme_get_opclass(tHalHandle hal, uint8_t channel, uint8_t bw_offset,
15679 uint8_t *opclass)
15680{
15681 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
15682
15683 /* redgm opclass table contains opclass for 40MHz low primary,
15684 * 40MHz high primary and 20MHz. No support for 80MHz yet. So
15685 * first we will check if bit for 40MHz is set and if so find
15686 * matching opclass either with low primary or high primary
15687 * (a channel would never be in both) and then search for opclass
15688 * matching 20MHz, else for any BW.
15689 */
15690 if (bw_offset & (1 << BW_40_OFFSET_BIT)) {
Amar Singhal22995112016-01-22 10:42:33 -080015691 *opclass = cds_reg_dmn_get_opclass_from_channel(
Masti, Narayanraddic4a7ab82015-11-25 15:41:10 +053015692 mac_ctx->scan.countryCodeCurrent,
15693 channel, BW40_LOW_PRIMARY);
15694 if (!(*opclass)) {
Amar Singhal22995112016-01-22 10:42:33 -080015695 *opclass = cds_reg_dmn_get_opclass_from_channel(
Masti, Narayanraddic4a7ab82015-11-25 15:41:10 +053015696 mac_ctx->scan.countryCodeCurrent,
15697 channel, BW40_HIGH_PRIMARY);
15698 }
15699 } else if (bw_offset & (1 << BW_20_OFFSET_BIT)) {
Amar Singhal22995112016-01-22 10:42:33 -080015700 *opclass = cds_reg_dmn_get_opclass_from_channel(
Masti, Narayanraddic4a7ab82015-11-25 15:41:10 +053015701 mac_ctx->scan.countryCodeCurrent,
15702 channel, BW20);
15703 } else {
Amar Singhal22995112016-01-22 10:42:33 -080015704 *opclass = cds_reg_dmn_get_opclass_from_channel(
Masti, Narayanraddic4a7ab82015-11-25 15:41:10 +053015705 mac_ctx->scan.countryCodeCurrent,
15706 channel, BWALL);
15707 }
15708}
15709#endif
Ryan Hsu3c8f79f2015-12-02 16:45:09 -080015710
15711#ifdef FEATURE_GREEN_AP
15712/**
15713 * sme_send_egap_conf_params() - set the enhanced green ap configuration params
15714 * @enable: enable/disable the enhanced green ap feature
15715 * @inactivity_time: inactivity timeout value
15716 * @wait_time: wait timeout value
15717 * @flag: feature flag in bitmasp
15718 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015719 * Return: Return QDF_STATUS, otherwise appropriate failure code
Ryan Hsu3c8f79f2015-12-02 16:45:09 -080015720 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015721QDF_STATUS sme_send_egap_conf_params(uint32_t enable, uint32_t inactivity_time,
Ryan Hsu3c8f79f2015-12-02 16:45:09 -080015722 uint32_t wait_time, uint32_t flags)
15723{
15724 cds_msg_t message;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015725 QDF_STATUS status;
Ryan Hsu3c8f79f2015-12-02 16:45:09 -080015726 struct egap_conf_params *egap_params;
15727
Anurag Chouhan600c3a02016-03-01 10:33:54 +053015728 egap_params = qdf_mem_malloc(sizeof(*egap_params));
Ryan Hsu3c8f79f2015-12-02 16:45:09 -080015729 if (NULL == egap_params) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053015730 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Ryan Hsu3c8f79f2015-12-02 16:45:09 -080015731 "%s: fail to alloc egap_params", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015732 return QDF_STATUS_E_NOMEM;
Ryan Hsu3c8f79f2015-12-02 16:45:09 -080015733 }
15734
15735 egap_params->enable = enable;
15736 egap_params->inactivity_time = inactivity_time;
15737 egap_params->wait_time = wait_time;
15738 egap_params->flags = flags;
15739
15740 message.type = WMA_SET_EGAP_CONF_PARAMS;
15741 message.bodyptr = egap_params;
Anurag Chouhan6d760662016-02-20 16:05:43 +053015742 status = cds_mq_post_message(QDF_MODULE_ID_WMA, &message);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015743 if (!QDF_IS_STATUS_SUCCESS(status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053015744 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Ryan Hsu3c8f79f2015-12-02 16:45:09 -080015745 "%s: Not able to post msg to WMA!", __func__);
15746
Anurag Chouhan600c3a02016-03-01 10:33:54 +053015747 qdf_mem_free(egap_params);
Ryan Hsu3c8f79f2015-12-02 16:45:09 -080015748 }
15749 return status;
15750}
15751#endif
Sandeep Puligillae0875662016-02-12 16:09:21 -080015752
15753/**
Anurag Chouhanbf5e0e22016-09-12 12:54:09 +053015754 * sme_set_fw_test() - set fw test
15755 * @fw_test: fw test param
15756 *
15757 * Return: Return QDF_STATUS, otherwise appropriate failure code
15758 */
15759QDF_STATUS sme_set_fw_test(struct set_fwtest_params *fw_test)
15760{
15761 void *wma_handle;
15762
15763 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
15764 if (!wma_handle) {
15765 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
15766 "wma handle is NULL");
15767 return QDF_STATUS_E_FAILURE;
15768 }
15769 wma_process_fw_test_cmd(wma_handle, fw_test);
15770 return QDF_STATUS_SUCCESS;
15771}
15772
15773/**
Sandeep Puligillae0875662016-02-12 16:09:21 -080015774 * sme_ht40_stop_obss_scan() - ht40 obss stop scan
15775 * @hal: mac handel
15776 * @vdev_id: vdev identifier
15777 *
15778 * Return: Return QDF_STATUS, otherwise appropriate failure code
15779 */
15780QDF_STATUS sme_ht40_stop_obss_scan(tHalHandle hal, uint32_t vdev_id)
15781{
15782 void *wma_handle;
15783
15784 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
15785 if (!wma_handle) {
15786 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
15787 "wma handle is NULL");
15788 return QDF_STATUS_E_FAILURE;
15789 }
15790 wma_ht40_stop_obss_scan(wma_handle, vdev_id);
15791 return QDF_STATUS_SUCCESS;
15792}
Archana Ramachandran20d2e232016-02-11 16:58:40 -080015793
15794/**
15795 * sme_update_mimo_power_save() - Update MIMO power save
15796 * configuration
15797 * @hal: The handle returned by macOpen
15798 * @is_ht_smps_enabled: enable/disable ht smps
15799 * @ht_smps_mode: smps mode disabled/static/dynamic
Archana Ramachandranfec24812016-02-16 16:31:56 -080015800 * @send_smps_action: flag to send smps force mode command
15801 * to FW
Archana Ramachandran20d2e232016-02-11 16:58:40 -080015802 *
15803 * Return: QDF_STATUS if SME update mimo power save
15804 * configuration sucsess else failue status
15805 */
15806QDF_STATUS sme_update_mimo_power_save(tHalHandle hal,
15807 uint8_t is_ht_smps_enabled,
Archana Ramachandranfec24812016-02-16 16:31:56 -080015808 uint8_t ht_smps_mode,
15809 bool send_smps_action)
Archana Ramachandran20d2e232016-02-11 16:58:40 -080015810{
15811 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
Archana Ramachandranfec24812016-02-16 16:31:56 -080015812
Archana Ramachandran20d2e232016-02-11 16:58:40 -080015813 sms_log(mac_ctx, LOG1,
Archana Ramachandranfec24812016-02-16 16:31:56 -080015814 "SMPS enable: %d mode: %d send action: %d",
15815 is_ht_smps_enabled, ht_smps_mode,
15816 send_smps_action);
Archana Ramachandran20d2e232016-02-11 16:58:40 -080015817 mac_ctx->roam.configParam.enableHtSmps =
15818 is_ht_smps_enabled;
15819 mac_ctx->roam.configParam.htSmps = ht_smps_mode;
Archana Ramachandranfec24812016-02-16 16:31:56 -080015820 mac_ctx->roam.configParam.send_smps_action =
15821 send_smps_action;
Archana Ramachandran20d2e232016-02-11 16:58:40 -080015822
15823 return QDF_STATUS_SUCCESS;
15824}
15825
15826/**
15827 * sme_is_sta_smps_allowed() - check if the supported nss for
15828 * the session is greater than 1x1 to enable sta SMPS
15829 * @hal: The handle returned by macOpen
15830 * @session_id: session id
15831 *
15832 * Return: bool returns true if supported nss is greater than
15833 * 1x1 else false
15834 */
15835bool sme_is_sta_smps_allowed(tHalHandle hal, uint8_t session_id)
15836{
15837 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
15838 tCsrRoamSession *csr_session;
15839
Archana Ramachandran20d2e232016-02-11 16:58:40 -080015840 csr_session = CSR_GET_SESSION(mac_ctx, session_id);
15841 if (NULL == csr_session) {
15842 sms_log(mac_ctx, LOGE,
Sreelakshmi Konamki58697e12016-05-25 17:30:18 +053015843 FL("SME session not valid: %d"), session_id);
15844 return false;
15845 }
15846
15847 if (!CSR_IS_SESSION_VALID(mac_ctx, session_id)) {
15848 sms_log(mac_ctx, LOGE,
15849 FL("CSR session not valid: %d"), session_id);
Archana Ramachandran20d2e232016-02-11 16:58:40 -080015850 return false;
15851 }
15852
15853 return (csr_session->supported_nss_1x1 == true) ? false : true;
15854}
Gupta, Kapil4cb1d7d2016-04-16 18:16:25 -070015855
15856/**
15857 * sme_add_beacon_filter() - set the beacon filter configuration
15858 * @hal: The handle returned by macOpen
15859 * @session_id: session id
15860 * @ie_map: bitwise array of IEs
15861 *
15862 * Return: Return QDF_STATUS, otherwise appropriate failure code
15863 */
15864QDF_STATUS sme_add_beacon_filter(tHalHandle hal,
15865 uint32_t session_id,
15866 uint32_t *ie_map)
15867{
15868 cds_msg_t message;
15869 QDF_STATUS qdf_status;
15870 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
15871 struct beacon_filter_param *filter_param;
15872
15873 if (!CSR_IS_SESSION_VALID(mac_ctx, session_id)) {
15874 sms_log(mac_ctx, LOGE,
15875 "CSR session not valid: %d",
15876 session_id);
15877 return QDF_STATUS_E_FAILURE;
15878 }
15879
15880 filter_param = qdf_mem_malloc(sizeof(*filter_param));
15881 if (NULL == filter_param) {
15882 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
15883 "%s: fail to alloc filter_param", __func__);
15884 return QDF_STATUS_E_FAILURE;
15885 }
15886
15887 filter_param->vdev_id = session_id;
15888
15889 qdf_mem_copy(filter_param->ie_map, ie_map,
15890 BCN_FLT_MAX_ELEMS_IE_LIST * sizeof(uint32_t));
15891
15892 message.type = WMA_ADD_BCN_FILTER_CMDID;
15893 message.bodyptr = filter_param;
15894 qdf_status = cds_mq_post_message(QDF_MODULE_ID_WMA,
15895 &message);
15896 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
15897 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
15898 "%s: Not able to post msg to WDA!",
15899 __func__);
15900
15901 qdf_mem_free(filter_param);
15902 }
15903 return qdf_status;
15904}
15905
15906/**
15907 * sme_remove_beacon_filter() - set the beacon filter configuration
15908 * @hal: The handle returned by macOpen
15909 * @session_id: session id
15910 *
15911 * Return: Return QDF_STATUS, otherwise appropriate failure code
15912 */
15913QDF_STATUS sme_remove_beacon_filter(tHalHandle hal, uint32_t session_id)
15914{
15915 cds_msg_t message;
15916 QDF_STATUS qdf_status;
15917 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
15918 struct beacon_filter_param *filter_param;
15919
15920 if (!CSR_IS_SESSION_VALID(mac_ctx, session_id)) {
15921 sms_log(mac_ctx, LOGE,
15922 "CSR session not valid: %d",
15923 session_id);
15924 return QDF_STATUS_E_FAILURE;
15925 }
15926
15927 filter_param = qdf_mem_malloc(sizeof(*filter_param));
15928 if (NULL == filter_param) {
15929 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
15930 "%s: fail to alloc filter_param", __func__);
15931 return QDF_STATUS_E_FAILURE;
15932 }
15933
15934 filter_param->vdev_id = session_id;
15935
15936 message.type = WMA_REMOVE_BCN_FILTER_CMDID;
15937 message.bodyptr = filter_param;
15938 qdf_status = cds_mq_post_message(QDF_MODULE_ID_WMA,
15939 &message);
15940 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
15941 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
15942 "%s: Not able to post msg to WDA!",
15943 __func__);
15944
15945 qdf_mem_free(filter_param);
15946 }
15947 return qdf_status;
15948}
Arun Khandavalli2476ef52016-04-26 20:19:43 +053015949
Arun Khandavalli2476ef52016-04-26 20:19:43 +053015950/**
Kondabattini, Ganesh3f2d02c2016-09-13 12:23:47 +053015951 * sme_send_disassoc_req_frame - send disassoc req
15952 * @hal: handler to hal
15953 * @session_id: session id
15954 * @peer_mac: peer mac address
15955 * @reason: reason for disassociation
15956 * wait_for_ack: wait for acknowledgment
15957 *
15958 * function to send disassoc request to lim
15959 *
15960 * return: none
15961 */
15962void sme_send_disassoc_req_frame(tHalHandle hal, uint8_t session_id,
15963 uint8_t *peer_mac, uint16_t reason, uint8_t wait_for_ack)
15964{
15965 struct sme_send_disassoc_frm_req *msg;
15966 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
15967 A_UINT8 *buf;
15968 A_UINT16 tmp;
15969
15970 msg = qdf_mem_malloc(sizeof(struct sme_send_disassoc_frm_req));
15971
15972 if (NULL == msg)
15973 qdf_status = QDF_STATUS_E_FAILURE;
15974 else
15975 qdf_status = QDF_STATUS_SUCCESS;
15976
15977 if (!QDF_IS_STATUS_SUCCESS(qdf_status))
15978 return;
15979
15980 qdf_mem_set(msg, sizeof(struct sme_send_disassoc_frm_req), 0);
15981 msg->msg_type = (uint16_t) eWNI_SME_SEND_DISASSOC_FRAME;
15982
15983 msg->length = (uint16_t) sizeof(struct sme_send_disassoc_frm_req);
15984
15985 buf = &msg->session_id;
15986
15987 /* session id */
15988 *buf = (A_UINT8) session_id;
15989 buf += sizeof(A_UINT8);
15990
15991 /* transaction id */
15992 *buf = 0;
15993 *(buf + 1) = 0;
15994 buf += sizeof(A_UINT16);
15995
15996 /* Set the peer MAC address before sending the message to LIM */
15997 qdf_mem_copy(buf, peer_mac, QDF_MAC_ADDR_SIZE);
15998
15999 buf += QDF_MAC_ADDR_SIZE;
16000
16001 /* reasoncode */
16002 tmp = (uint16_t) reason;
16003 qdf_mem_copy(buf, &tmp, sizeof(uint16_t));
16004 buf += sizeof(uint16_t);
16005
16006 *buf = wait_for_ack;
16007 buf += sizeof(uint8_t);
16008
16009 qdf_status = cds_send_mb_message_to_mac(msg);
16010
16011 if (qdf_status != QDF_STATUS_SUCCESS)
16012 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
16013 FL("cds_send_mb_message Failed"));
16014}
16015
16016/**
Arun Khandavalli2476ef52016-04-26 20:19:43 +053016017 * sme_get_bpf_offload_capabilities() - Get length for BPF offload
16018 * @hal: Global HAL handle
16019 * This function constructs the cds message and fill in message type,
16020 * post the same to WDA.
16021 * Return: QDF_STATUS enumeration
16022 */
16023QDF_STATUS sme_get_bpf_offload_capabilities(tHalHandle hal)
16024{
16025 QDF_STATUS status = QDF_STATUS_SUCCESS;
16026 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
16027 cds_msg_t cds_msg;
16028
16029 sms_log(mac_ctx, LOG1, FL("enter"));
16030
16031 status = sme_acquire_global_lock(&mac_ctx->sme);
16032 if (QDF_STATUS_SUCCESS == status) {
16033 /* Serialize the req through MC thread */
16034 cds_msg.bodyptr = NULL;
16035 cds_msg.type = WDA_BPF_GET_CAPABILITIES_REQ;
16036 status = cds_mq_post_message(QDF_MODULE_ID_WMA, &cds_msg);
16037 if (!QDF_IS_STATUS_SUCCESS(status)) {
16038 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
16039 FL("Post bpf get offload msg fail"));
16040 status = QDF_STATUS_E_FAILURE;
16041 }
16042 sme_release_global_lock(&mac_ctx->sme);
16043 } else {
16044 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
16045 FL("sme_acquire_global_lock error"));
16046 }
16047 sms_log(mac_ctx, LOG1, FL("exit"));
16048 return status;
16049}
16050
16051
16052/**
16053 * sme_set_bpf_instructions() - Set BPF bpf filter instructions.
16054 * @hal: HAL handle
16055 * @bpf_set_offload: struct to set bpf filter instructions.
16056 *
16057 * Return: QDF_STATUS enumeration.
16058 */
16059QDF_STATUS sme_set_bpf_instructions(tHalHandle hal,
16060 struct sir_bpf_set_offload *req)
16061{
16062 QDF_STATUS status = QDF_STATUS_SUCCESS;
16063 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
16064 cds_msg_t cds_msg;
16065 struct sir_bpf_set_offload *set_offload;
16066
16067 set_offload = qdf_mem_malloc(sizeof(*set_offload));
16068
16069 if (NULL == set_offload) {
16070 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
16071 FL("Failed to alloc set_offload"));
16072 return QDF_STATUS_E_NOMEM;
16073 }
16074
16075 set_offload->session_id = req->session_id;
16076 set_offload->filter_id = req->filter_id;
16077 set_offload->current_offset = req->current_offset;
16078 set_offload->total_length = req->total_length;
Rajeev Kumare5a16822016-07-27 13:11:42 -070016079 set_offload->current_length = req->current_length;
Arun Khandavalli2476ef52016-04-26 20:19:43 +053016080 if (set_offload->total_length) {
Arun Khandavalli2476ef52016-04-26 20:19:43 +053016081 set_offload->program = qdf_mem_malloc(sizeof(uint8_t) *
16082 req->current_length);
Rajeev Kumar348ed992016-07-27 14:44:01 -070016083 if (NULL == set_offload->program) {
16084 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
16085 FL("Failed to alloc instruction memory"));
16086 qdf_mem_free(set_offload);
16087 return QDF_STATUS_E_NOMEM;
16088 }
Arun Khandavalli2476ef52016-04-26 20:19:43 +053016089 qdf_mem_copy(set_offload->program, req->program,
16090 set_offload->current_length);
16091 }
16092 status = sme_acquire_global_lock(&mac_ctx->sme);
16093 if (QDF_STATUS_SUCCESS == status) {
16094 /* Serialize the req through MC thread */
16095 cds_msg.bodyptr = set_offload;
16096 cds_msg.type = WDA_BPF_SET_INSTRUCTIONS_REQ;
16097 status = cds_mq_post_message(QDF_MODULE_ID_WMA, &cds_msg);
16098
16099 if (!QDF_IS_STATUS_SUCCESS(status)) {
16100 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
16101 FL("Post BPF set offload msg fail"));
16102 status = QDF_STATUS_E_FAILURE;
16103 if (set_offload->total_length)
16104 qdf_mem_free(set_offload->program);
16105 qdf_mem_free(set_offload);
16106 }
16107 sme_release_global_lock(&mac_ctx->sme);
16108 } else {
16109 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
16110 FL("sme_acquire_global_lock failed"));
16111 if (set_offload->total_length)
16112 qdf_mem_free(set_offload->program);
16113 qdf_mem_free(set_offload);
16114 }
16115 return status;
16116}
16117
16118/**
16119 * sme_bpf_offload_register_callback() - Register get bpf offload callbacK
16120 *
16121 * @hal - MAC global handle
16122 * @callback_routine - callback routine from HDD
16123 *
16124 * This API is invoked by HDD to register its callback in SME
16125 *
16126 * Return: QDF_STATUS
16127 */
16128QDF_STATUS sme_bpf_offload_register_callback(tHalHandle hal,
16129 void (*pbpf_get_offload_cb)(void *context,
16130 struct sir_bpf_get_offload *))
16131{
16132 QDF_STATUS status = QDF_STATUS_SUCCESS;
16133 tpAniSirGlobal mac = PMAC_STRUCT(hal);
16134
16135 status = sme_acquire_global_lock(&mac->sme);
16136 if (QDF_IS_STATUS_SUCCESS(status)) {
16137 mac->sme.pbpf_get_offload_cb = pbpf_get_offload_cb;
16138 sme_release_global_lock(&mac->sme);
16139 } else {
16140 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
16141 FL("sme_acquire_global_lock failed"));
16142 }
16143 return status;
16144}
Manjunathappa Prakash59f861d2016-04-21 10:33:31 -070016145
16146/**
Abhishek Singh1c676222016-05-09 14:20:28 +053016147 * sme_get_wni_dot11_mode() - return configured wni dot11mode
16148 * @hal: hal pointer
16149 *
16150 * Return: wni dot11 mode.
16151 */
16152uint32_t sme_get_wni_dot11_mode(tHalHandle hal)
16153{
16154 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
16155
16156 return csr_translate_to_wni_cfg_dot11_mode(mac_ctx,
16157 mac_ctx->roam.configParam.uCfgDot11Mode);
16158}
16159
16160/**
Arun Khandavalli4b55da72016-07-19 19:55:01 +053016161 * sme_bpf_offload_deregister_callback() - Register get bpf offload callbacK
16162 *
16163 * @h_hal - MAC global handle
16164 * @callback_routine - callback routine from HDD
16165 *
16166 * This API is invoked by HDD to de-register its callback in SME
16167 *
16168 * Return: QDF_STATUS Enumeration
16169 */
16170QDF_STATUS sme_bpf_offload_deregister_callback(tHalHandle h_hal)
16171{
16172 QDF_STATUS status = QDF_STATUS_SUCCESS;
16173 tpAniSirGlobal mac;
16174
16175 if (!h_hal) {
16176 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
16177 FL("hHal is not valid"));
16178 return QDF_STATUS_E_INVAL;
16179 }
16180
16181 mac = PMAC_STRUCT(h_hal);
16182
16183 status = sme_acquire_global_lock(&mac->sme);
16184 if (QDF_IS_STATUS_SUCCESS(status)) {
16185 mac->sme.pbpf_get_offload_cb = NULL;
16186 sme_release_global_lock(&mac->sme);
16187 } else {
16188 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
16189 FL("sme_acquire_global_lock failed"));
16190 }
16191 return status;
16192}
16193
16194
16195/**
Manjunathappa Prakash59f861d2016-04-21 10:33:31 -070016196 * sme_create_mon_session() - post message to create PE session for monitormode
16197 * operation
16198 * @hal_handle: Handle to the HAL
16199 * @bssid: pointer to bssid
16200 *
16201 * Return: QDF_STATUS_SUCCESS on success, non-zero error code on failure.
16202 */
16203QDF_STATUS sme_create_mon_session(tHalHandle hal_handle, tSirMacAddr bss_id)
16204{
16205 QDF_STATUS status = QDF_STATUS_E_FAILURE;
16206 struct sir_create_session *msg;
16207
16208 msg = qdf_mem_malloc(sizeof(*msg));
16209 if (NULL != msg) {
16210 msg->type = eWNI_SME_MON_INIT_SESSION;
16211 msg->msg_len = sizeof(*msg);
16212 qdf_mem_copy(msg->bss_id.bytes, bss_id, QDF_MAC_ADDR_SIZE);
16213 status = cds_send_mb_message_to_mac(msg);
16214 }
16215 return status;
16216}
Gupta, Kapil96c7f2f2016-04-25 19:13:41 +053016217
Gupta, Kapil96c7f2f2016-04-25 19:13:41 +053016218/**
16219 * sme_set_adaptive_dwelltime_config() - Update Adaptive dwelltime configuration
16220 * @hal: The handle returned by macOpen
16221 * @params: adaptive_dwelltime_params config
16222 *
16223 * Return: QDF_STATUS if adaptive dwell time update
16224 * configuration sucsess else failure status
16225 */
16226QDF_STATUS sme_set_adaptive_dwelltime_config(tHalHandle hal,
16227 struct adaptive_dwelltime_params *params)
16228{
16229 cds_msg_t message;
16230 QDF_STATUS status;
16231 struct adaptive_dwelltime_params *dwelltime_params;
16232
16233 dwelltime_params = qdf_mem_malloc(sizeof(*dwelltime_params));
16234 if (NULL == dwelltime_params) {
16235 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
16236 "%s: fail to alloc dwelltime_params", __func__);
16237 return QDF_STATUS_E_NOMEM;
16238 }
16239
16240 dwelltime_params->is_enabled = params->is_enabled;
16241 dwelltime_params->dwelltime_mode = params->dwelltime_mode;
16242 dwelltime_params->lpf_weight = params->lpf_weight;
16243 dwelltime_params->passive_mon_intval = params->passive_mon_intval;
16244 dwelltime_params->wifi_act_threshold = params->wifi_act_threshold;
16245
16246 message.type = WMA_SET_ADAPT_DWELLTIME_CONF_PARAMS;
16247 message.bodyptr = dwelltime_params;
16248 status = cds_mq_post_message(QDF_MODULE_ID_WMA, &message);
16249 if (!QDF_IS_STATUS_SUCCESS(status)) {
16250 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
16251 "%s: Not able to post msg to WMA!", __func__);
16252
16253 qdf_mem_free(dwelltime_params);
16254 }
16255 return status;
16256}
Naveen Rawata410c5a2016-09-19 14:22:33 -070016257
16258/**
16259 * sme_set_vdev_ies_per_band() - sends the per band IEs to vdev
16260 * @hal: Pointer to HAL
16261 * @vdev_id: vdev_id for which IE is targeted
16262 *
16263 * Return: None
16264 */
16265void sme_set_vdev_ies_per_band(tHalHandle hal, uint8_t vdev_id)
16266{
16267 tpAniSirGlobal p_mac = PMAC_STRUCT(hal);
16268 struct sir_set_vdev_ies_per_band *p_msg;
16269 QDF_STATUS status = QDF_STATUS_E_FAILURE;
16270
16271 p_msg = qdf_mem_malloc(sizeof(*p_msg));
16272 if (NULL == p_msg) {
16273 sms_log(p_mac, LOGE, FL("mem alloc failed for sme msg"));
16274 return;
16275 }
16276
16277 p_msg->vdev_id = vdev_id;
16278 p_msg->msg_type = eWNI_SME_SET_VDEV_IES_PER_BAND;
16279 p_msg->len = sizeof(*p_msg);
16280 sms_log(p_mac, LOG1,
16281 FL("sending eWNI_SME_SET_VDEV_IES_PER_BAND: vdev_id: %d "),
16282 vdev_id);
16283 status = cds_send_mb_message_to_mac(p_msg);
16284 if (QDF_STATUS_SUCCESS != status)
16285 sms_log(p_mac, LOGE,
16286 FL("Send eWNI_SME_SET_VDEV_IES_PER_BAND fail"));
16287}
16288
Kiran Kumar Lokere666bf852016-05-02 12:23:02 -070016289/**
16290 * sme_set_pdev_ht_vht_ies() - sends the set pdev IE req
16291 * @hal: Pointer to HAL
16292 * @enable2x2: 1x1 or 2x2 mode.
16293 *
16294 * Sends the set pdev IE req with Nss value.
16295 *
16296 * Return: None
16297 */
16298void sme_set_pdev_ht_vht_ies(tHalHandle hal, bool enable2x2)
16299{
16300 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
16301 struct sir_set_ht_vht_cfg *ht_vht_cfg;
16302 QDF_STATUS status = QDF_STATUS_E_FAILURE;
16303
Kiran Kumar Lokere666bf852016-05-02 12:23:02 -070016304 if (!((mac_ctx->roam.configParam.uCfgDot11Mode ==
16305 eCSR_CFG_DOT11_MODE_AUTO) ||
16306 (mac_ctx->roam.configParam.uCfgDot11Mode ==
16307 eCSR_CFG_DOT11_MODE_11N) ||
16308 (mac_ctx->roam.configParam.uCfgDot11Mode ==
16309 eCSR_CFG_DOT11_MODE_11N_ONLY) ||
16310 (mac_ctx->roam.configParam.uCfgDot11Mode ==
16311 eCSR_CFG_DOT11_MODE_11AC) ||
16312 (mac_ctx->roam.configParam.uCfgDot11Mode ==
16313 eCSR_CFG_DOT11_MODE_11AC_ONLY)))
16314 return;
16315
16316 status = sme_acquire_global_lock(&mac_ctx->sme);
16317 if (QDF_STATUS_SUCCESS == status) {
16318 ht_vht_cfg = qdf_mem_malloc(sizeof(*ht_vht_cfg));
16319 if (NULL == ht_vht_cfg) {
16320 sms_log(mac_ctx, LOGE,
16321 "%s: mem alloc failed for ht_vht_cfg",
16322 __func__);
16323 sme_release_global_lock(&mac_ctx->sme);
16324 return;
16325 }
16326
16327 ht_vht_cfg->pdev_id = 0;
16328 if (enable2x2)
16329 ht_vht_cfg->nss = 2;
16330 else
16331 ht_vht_cfg->nss = 1;
16332 ht_vht_cfg->dot11mode =
16333 (uint8_t)csr_translate_to_wni_cfg_dot11_mode(mac_ctx,
16334 mac_ctx->roam.configParam.uCfgDot11Mode);
16335
16336 ht_vht_cfg->msg_type = eWNI_SME_PDEV_SET_HT_VHT_IE;
16337 ht_vht_cfg->len = sizeof(*ht_vht_cfg);
16338 sms_log(mac_ctx, LOG1,
16339 FL("SET_HT_VHT_IE with nss %d, dot11mode %d"),
16340 ht_vht_cfg->nss,
16341 ht_vht_cfg->dot11mode);
16342 status = cds_send_mb_message_to_mac(ht_vht_cfg);
16343 if (QDF_STATUS_SUCCESS != status) {
16344 sms_log(mac_ctx, LOGE, FL(
16345 "Send SME_PDEV_SET_HT_VHT_IE fail"));
Kiran Kumar Lokere666bf852016-05-02 12:23:02 -070016346 }
16347 sme_release_global_lock(&mac_ctx->sme);
16348 }
16349 return;
16350}
16351
16352/**
16353 * sme_update_vdev_type_nss() - sets the nss per vdev type
16354 * @hal: Pointer to HAL
16355 * @max_supp_nss: max_supported Nss
16356 * @band: 5G or 2.4G band
16357 *
16358 * Sets the per band Nss for each vdev type based on INI and configured
16359 * chain mask value.
16360 *
16361 * Return: None
16362 */
16363void sme_update_vdev_type_nss(tHalHandle hal, uint8_t max_supp_nss,
16364 uint32_t vdev_type_nss, eCsrBand band)
16365{
16366 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
16367 struct vdev_type_nss *vdev_nss;
16368
16369 if (eCSR_BAND_5G == band)
16370 vdev_nss = &mac_ctx->vdev_type_nss_5g;
16371 else
16372 vdev_nss = &mac_ctx->vdev_type_nss_2g;
16373
16374 vdev_nss->sta = QDF_MIN(max_supp_nss, CFG_STA_NSS(vdev_type_nss));
16375 vdev_nss->sap = QDF_MIN(max_supp_nss, CFG_SAP_NSS(vdev_type_nss));
16376 vdev_nss->p2p_go = QDF_MIN(max_supp_nss,
16377 CFG_P2P_GO_NSS(vdev_type_nss));
16378 vdev_nss->p2p_cli = QDF_MIN(max_supp_nss,
16379 CFG_P2P_CLI_NSS(vdev_type_nss));
16380 vdev_nss->p2p_dev = QDF_MIN(max_supp_nss,
16381 CFG_P2P_DEV_NSS(vdev_type_nss));
16382 vdev_nss->ibss = QDF_MIN(max_supp_nss, CFG_IBSS_NSS(vdev_type_nss));
16383 vdev_nss->tdls = QDF_MIN(max_supp_nss, CFG_TDLS_NSS(vdev_type_nss));
16384 vdev_nss->ocb = QDF_MIN(max_supp_nss, CFG_OCB_NSS(vdev_type_nss));
16385
16386 sms_log(mac_ctx, LOG1,
16387 "band %d NSS:sta %d sap %d cli %d go %d dev %d ibss %d tdls %d ocb %d",
16388 band, vdev_nss->sta, vdev_nss->sap, vdev_nss->p2p_cli,
16389 vdev_nss->p2p_go, vdev_nss->p2p_dev, vdev_nss->ibss,
16390 vdev_nss->tdls, vdev_nss->ocb);
16391}
Peng Xu8fdaa492016-06-22 10:20:47 -070016392
16393/**
16394 * sme_register_p2p_lo_event() - Register for the p2p lo event
16395 * @hHal: reference to the HAL
16396 * @context: the context of the call
16397 * @callback: the callback to hdd
16398 *
16399 * This function registers the callback function for P2P listen
16400 * offload stop event.
16401 *
16402 * Return: none
16403 */
16404void sme_register_p2p_lo_event(tHalHandle hHal, void *context,
16405 p2p_lo_callback callback)
16406{
16407 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
16408 QDF_STATUS status = QDF_STATUS_E_FAILURE;
16409
16410 status = sme_acquire_global_lock(&pMac->sme);
16411 pMac->sme.p2p_lo_event_callback = callback;
16412 pMac->sme.p2p_lo_event_context = context;
16413 sme_release_global_lock(&pMac->sme);
16414}
Manjeet Singhf82ed072016-07-08 11:40:00 +053016415
16416/**
16417 * sme_process_mac_pwr_dbg_cmd() - enable mac pwr debugging
16418 * @hal: The handle returned by macOpen
16419 * @session_id: session id
16420 * @dbg_args: args for mac pwr debug command
16421 * Return: Return QDF_STATUS, otherwise appropriate failure code
16422 */
16423QDF_STATUS sme_process_mac_pwr_dbg_cmd(tHalHandle hal, uint32_t session_id,
16424 struct sir_mac_pwr_dbg_cmd*
16425 dbg_args)
16426{
16427 cds_msg_t message;
16428 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
16429 struct sir_mac_pwr_dbg_cmd *req;
16430 int i;
16431
16432 if (!CSR_IS_SESSION_VALID(mac_ctx, session_id)) {
16433 sms_log(mac_ctx, LOGE,
16434 "CSR session not valid: %d",
16435 session_id);
16436 return QDF_STATUS_E_FAILURE;
16437 }
16438
16439 req = qdf_mem_malloc(sizeof(*req));
16440 if (NULL == req) {
16441 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
16442 "%s: fail to alloc mac_pwr_dbg_args", __func__);
16443 return QDF_STATUS_E_FAILURE;
16444 }
16445 req->module_id = dbg_args->module_id;
16446 req->pdev_id = dbg_args->pdev_id;
16447 req->num_args = dbg_args->num_args;
16448 for (i = 0; i < req->num_args; i++)
16449 req->args[i] = dbg_args->args[i];
16450
16451 message.type = SIR_HAL_POWER_DBG_CMD;
16452 message.bodyptr = req;
16453
16454 if (!QDF_IS_STATUS_SUCCESS(cds_mq_post_message
16455 (QDF_MODULE_ID_WMA, &message))) {
16456 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
16457 "%s: Not able to post msg to WDA!",
16458 __func__);
16459 qdf_mem_free(req);
16460 }
16461 return QDF_STATUS_SUCCESS;
16462}
Tushnim Bhattacharyyaf44a9d82016-07-05 10:52:06 -070016463/**
16464 * sme_get_vdev_type_nss() - gets the nss per vdev type
16465 * @hal: Pointer to HAL
16466 * @dev_mode: connection type.
16467 * @nss2g: Pointer to the 2G Nss parameter.
16468 * @nss5g: Pointer to the 5G Nss parameter.
16469 *
16470 * Fills the 2G and 5G Nss values based on connection type.
16471 *
16472 * Return: None
16473 */
16474void sme_get_vdev_type_nss(tHalHandle hal, enum tQDF_ADAPTER_MODE dev_mode,
16475 uint8_t *nss_2g, uint8_t *nss_5g)
16476{
16477 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
16478 csr_get_vdev_type_nss(mac_ctx, dev_mode, nss_2g, nss_5g);
16479}
Agrawal Ashish21ba2572016-09-03 16:40:10 +053016480
16481/**
16482 * sme_update_sta_roam_policy() - update sta roam policy for
16483 * unsafe and DFS channels.
16484 * @hal_handle: hal handle for getting global mac struct
16485 * @dfs_mode: dfs mode which tell if dfs channel needs to be
16486 * skipped or not
16487 * @skip_unsafe_channels: Param to tell if driver needs to
16488 * skip unsafe channels or not.
16489 * @param session_id: sme_session_id
16490 *
16491 * sme_update_sta_roam_policy update sta rome policies to csr
16492 * this function will call csrUpdateChannelList as well
16493 * to include/exclude DFS channels and unsafe channels.
16494 *
16495 * Return: eHAL_STATUS_SUCCESS or non-zero on failure.
16496 */
16497QDF_STATUS sme_update_sta_roam_policy(tHalHandle hal_handle,
16498 enum sta_roam_policy_dfs_mode dfs_mode,
16499 bool skip_unsafe_channels,
16500 uint8_t session_id)
16501{
16502 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal_handle);
16503 QDF_STATUS status = QDF_STATUS_SUCCESS;
16504 tSmeConfigParams sme_config;
16505
16506 if (!mac_ctx) {
16507 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_FATAL,
16508 "%s: mac_ctx is null", __func__);
16509 return QDF_STATUS_E_FAILURE;
16510 }
16511 qdf_mem_zero(&sme_config, sizeof(sme_config));
16512 sme_get_config_param(hal_handle, &sme_config);
16513
16514 sme_config.csrConfig.sta_roam_policy_params.dfs_mode =
16515 dfs_mode;
16516 sme_config.csrConfig.sta_roam_policy_params.skip_unsafe_channels =
16517 skip_unsafe_channels;
16518
16519 sme_update_config(hal_handle, &sme_config);
16520
16521 status = csr_update_channel_list(mac_ctx);
16522 if (QDF_STATUS_SUCCESS != status) {
16523 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
16524 FL("failed to update the supported channel list"));
16525 }
16526 if (mac_ctx->roam.configParam.isRoamOffloadScanEnabled)
16527 csr_roam_offload_scan(mac_ctx, session_id,
16528 ROAM_SCAN_OFFLOAD_UPDATE_CFG,
16529 REASON_ROAM_SCAN_STA_ROAM_POLICY_CHANGED);
Selvaraj, Sridharebda0f22016-08-29 16:05:23 +053016530 return status;
16531}
16532
16533/**
16534 * sme_enable_disable_chanavoidind_event - configure ca event ind
16535 * @hal: handler to hal
16536 * @set_value: enable/disable
16537 *
16538 * function to enable/disable chan avoidance indication
16539 *
16540 * Return: QDF_STATUS
16541 */
16542QDF_STATUS sme_enable_disable_chanavoidind_event(tHalHandle hal,
16543 uint8_t set_value)
16544{
16545 QDF_STATUS status;
16546 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
16547 cds_msg_t msg;
16548
16549 sms_log(mac_ctx, LOG1, FL("set_value: %d"), set_value);
16550 status = sme_acquire_global_lock(&mac_ctx->sme);
16551 if (QDF_STATUS_SUCCESS == status) {
16552 qdf_mem_zero(&msg, sizeof(cds_msg_t));
16553 msg.type = WMA_SEND_FREQ_RANGE_CONTROL_IND;
16554 msg.bodyval = set_value;
16555 status = cds_mq_post_message(QDF_MODULE_ID_WMA, &msg);
16556 sme_release_global_lock(&mac_ctx->sme);
16557 return status;
16558 }
Deepak Dhamdhereb106ae52016-08-10 20:55:30 +053016559 return status;
16560}
Agrawal Ashish21ba2572016-09-03 16:40:10 +053016561
Deepak Dhamdhereb106ae52016-08-10 20:55:30 +053016562/*
16563 * sme_set_default_scan_ie() - API to send default scan IE to LIM
16564 * @hal: reference to the HAL
16565 * @session_id: current session ID
16566 * @ie_data: Pointer to Scan IE data
16567 * @ie_len: Length of @ie_data
16568 *
16569 * Return: QDF_STATUS
16570 */
16571QDF_STATUS sme_set_default_scan_ie(tHalHandle hal, uint16_t session_id,
16572 uint8_t *ie_data, uint16_t ie_len)
16573{
16574 QDF_STATUS status;
16575 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
16576 struct hdd_default_scan_ie *set_ie_params;
16577
16578 status = sme_acquire_global_lock(&mac_ctx->sme);
16579 if (QDF_IS_STATUS_SUCCESS(status)) {
16580 set_ie_params = qdf_mem_malloc(sizeof(*set_ie_params));
16581 if (!set_ie_params)
16582 status = QDF_STATUS_E_NOMEM;
16583 else {
16584 set_ie_params->message_type = eWNI_SME_DEFAULT_SCAN_IE;
16585 set_ie_params->length = sizeof(*set_ie_params);
16586 set_ie_params->session_id = session_id;
16587 set_ie_params->ie_len = ie_len;
16588 qdf_mem_copy(set_ie_params->ie_data, ie_data, ie_len);
16589 status = cds_send_mb_message_to_mac(set_ie_params);
16590 }
16591 sme_release_global_lock(&mac_ctx->sme);
16592 }
16593 sms_log(mac_ctx, LOG1, FL("Set default scan IE status %d"), status);
Agrawal Ashish21ba2572016-09-03 16:40:10 +053016594 return status;
16595}
Padma, Santhosh Kumard7cc0792016-06-28 18:54:12 +053016596
16597/**
16598 * sme_encrypt_decrypt_msg() - handles encrypt/decrypt mesaage
16599 * @hal: HAL handle
16600 * @encrypt_decrypt_params: struct to set encryption/decryption params.
16601 *
16602 * Return: QDF_STATUS enumeration.
16603 */
16604QDF_STATUS sme_encrypt_decrypt_msg(tHalHandle hal,
16605 struct encrypt_decrypt_req_params *encrypt_decrypt_params)
16606{
16607 QDF_STATUS status = QDF_STATUS_SUCCESS;
16608 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
16609 cds_msg_t cds_msg;
16610 struct encrypt_decrypt_req_params *params;
16611 uint8_t *ptr;
16612
16613 ptr = qdf_mem_malloc(sizeof(*params) +
16614 encrypt_decrypt_params->data_len);
16615 if (ptr == NULL) {
16616 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
16617 FL("Failed to alloc memory for encrypt/decrypt params"));
16618 return QDF_STATUS_E_NOMEM;
16619 }
16620
16621 params = (struct encrypt_decrypt_req_params *)ptr;
16622
16623 *params = *encrypt_decrypt_params;
16624
16625 if (params->data_len) {
16626 params->data = ptr + sizeof(*params);
16627
16628 qdf_mem_copy(params->data, encrypt_decrypt_params->data,
16629 params->data_len);
16630 }
16631
16632 status = sme_acquire_global_lock(&mac_ctx->sme);
16633 if (status == QDF_STATUS_SUCCESS) {
16634 /* Serialize the req through MC thread */
16635 cds_msg.bodyptr = params;
16636 cds_msg.type = WMA_ENCRYPT_DECRYPT_MSG;
16637 status = cds_mq_post_message(QDF_MODULE_ID_WMA, &cds_msg);
16638
16639 if (!QDF_IS_STATUS_SUCCESS(status)) {
16640 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
16641 FL("Post encrypt/decrypt msg fail"));
16642 status = QDF_STATUS_E_FAILURE;
16643 qdf_mem_free(params);
16644 }
16645 sme_release_global_lock(&mac_ctx->sme);
16646 } else {
16647 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
16648 FL("sme_acquire_global_lock failed"));
16649 qdf_mem_free(params);
16650 }
16651 return status;
16652
16653}
16654
16655/**
16656 * sme_encrypt_decrypt_msg_register_callback() - Registers
16657 * encrypt/decrypt message callback
16658 *
16659 * @hal - MAC global handle
16660 * @callback_routine - callback routine from HDD
16661 *
16662 * This API is invoked by HDD to register its callback in SME
16663 *
16664 * Return: QDF_STATUS
16665 */
16666QDF_STATUS sme_encrypt_decrypt_msg_register_callback(tHalHandle hal,
16667 void (*encrypt_decrypt_cb)(void *hdd_context,
16668 struct sir_encrypt_decrypt_rsp_params
16669 *encrypt_decrypt_rsp_params))
16670{
16671 QDF_STATUS status = QDF_STATUS_SUCCESS;
16672 tpAniSirGlobal mac;
16673
16674 if (!hal) {
16675 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
16676 FL("hHal is not valid"));
16677 return QDF_STATUS_E_INVAL;
16678 }
16679
16680 mac = PMAC_STRUCT(hal);
16681
16682 status = sme_acquire_global_lock(&mac->sme);
16683 if (QDF_IS_STATUS_SUCCESS(status)) {
16684 mac->sme.encrypt_decrypt_cb = encrypt_decrypt_cb;
16685 sme_release_global_lock(&mac->sme);
16686 } else {
16687 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
16688 FL("sme_acquire_global_lock failed"));
16689 }
16690 return status;
16691}
16692
16693/**
16694 * sme_encrypt_decrypt_msg_deregister_callback() - Registers
16695 * encrypt/decrypt message callback
16696 *
16697 * @h_hal - MAC global handle
16698 * @callback_routine - callback routine from HDD
16699 *
16700 * This API is invoked by HDD to de-register its callback in SME
16701 *
16702 * Return: QDF_STATUS Enumeration
16703 */
16704QDF_STATUS sme_encrypt_decrypt_msg_deregister_callback(tHalHandle h_hal)
16705{
16706 QDF_STATUS status = QDF_STATUS_SUCCESS;
16707 tpAniSirGlobal mac;
16708
16709 if (!h_hal) {
16710 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
16711 FL("hHal is not valid"));
16712 return QDF_STATUS_E_INVAL;
16713 }
16714
16715 mac = PMAC_STRUCT(h_hal);
16716
16717 status = sme_acquire_global_lock(&mac->sme);
16718 if (QDF_IS_STATUS_SUCCESS(status)) {
16719 mac->sme.encrypt_decrypt_cb = NULL;
16720 sme_release_global_lock(&mac->sme);
16721 } else {
16722 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
16723 FL("sme_acquire_global_lock failed"));
16724 }
16725 return status;
16726}