blob: bcd45914a7bf764f6cacef31068697e8d160fa00 [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);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080076
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053077static QDF_STATUS init_sme_cmd_list(tpAniSirGlobal pMac);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080078static void sme_abort_command(tpAniSirGlobal pMac, tSmeCmd *pCommand,
79 bool fStopping);
80
81eCsrPhyMode sme_get_phy_mode(tHalHandle hHal);
82
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053083QDF_STATUS sme_handle_change_country_code(tpAniSirGlobal pMac, void *pMsgBuf);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080084
85void sme_disconnect_connected_sessions(tpAniSirGlobal pMac);
86
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053087QDF_STATUS sme_handle_generic_change_country_code(tpAniSirGlobal pMac,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080088 void *pMsgBuf);
89
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053090QDF_STATUS sme_process_nss_update_resp(tpAniSirGlobal mac, uint8_t *msg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080091
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -080092#ifdef FEATURE_WLAN_ESE
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080093bool csr_is_supported_channel(tpAniSirGlobal pMac, uint8_t channelId);
94#endif
95
96#ifdef WLAN_FEATURE_11W
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053097QDF_STATUS sme_unprotected_mgmt_frm_ind(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080098 tpSirSmeUnprotMgmtFrameInd pSmeMgmtFrm);
99#endif
100
101/* Message processor for events from DFS */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530102QDF_STATUS dfs_msg_processor(tpAniSirGlobal pMac,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800103 uint16_t msg_type, void *pMsgBuf);
104
105/* Channel Change Response Indication Handler */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530106QDF_STATUS sme_process_channel_change_resp(tpAniSirGlobal pMac,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800107 uint16_t msg_type, void *pMsgBuf);
108
109/* Internal SME APIs */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530110QDF_STATUS sme_acquire_global_lock(tSmeStruct *psSme)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800111{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530112 QDF_STATUS status = QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800113
114 if (psSme) {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530115 if (QDF_IS_STATUS_SUCCESS
Anurag Chouhana37b5b72016-02-21 14:53:42 +0530116 (qdf_mutex_acquire(&psSme->lkSmeGlobalLock))) {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530117 status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800118 }
119 }
120
121 return status;
122}
123
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530124QDF_STATUS sme_release_global_lock(tSmeStruct *psSme)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800125{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530126 QDF_STATUS status = QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800127
128 if (psSme) {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530129 if (QDF_IS_STATUS_SUCCESS
Anurag Chouhana37b5b72016-02-21 14:53:42 +0530130 (qdf_mutex_release(&psSme->lkSmeGlobalLock))) {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530131 status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800132 }
133 }
134
135 return status;
136}
137
138/**
139 * sme_process_set_hw_mode_resp() - Process set HW mode response
140 * @mac: Global MAC pointer
141 * @msg: HW mode response
142 *
143 * Processes the HW mode response and invokes the HDD callback
144 * to process further
145 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530146static QDF_STATUS sme_process_set_hw_mode_resp(tpAniSirGlobal mac, uint8_t *msg)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800147{
148 tListElem *entry = NULL;
149 tSmeCmd *command = NULL;
150 bool found;
151 hw_mode_cb callback = NULL;
152 struct sir_set_hw_mode_resp *param;
Chandrasekaran, Manishekarce2172e2016-02-18 16:12:43 +0530153 enum sir_conn_update_reason reason;
Chandrasekaran, Manishekaref70c0d2015-10-20 19:54:55 +0530154 tSmeCmd *saved_cmd;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800155
Chandrasekaran, Manishekaref70c0d2015-10-20 19:54:55 +0530156 sms_log(mac, LOG1, FL("%s"), __func__);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800157 param = (struct sir_set_hw_mode_resp *)msg;
158 if (!param) {
159 sms_log(mac, LOGE, FL("HW mode resp param is NULL"));
160 /* Not returning. Need to check if active command list
161 * needs to be freed
162 */
163 }
164
165 entry = csr_ll_peek_head(&mac->sme.smeCmdActiveList,
166 LL_ACCESS_LOCK);
167 if (!entry) {
168 sms_log(mac, LOGE, FL("No cmd found in active list"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530169 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800170 }
171
172 command = GET_BASE_ADDR(entry, tSmeCmd, Link);
173 if (!command) {
174 sms_log(mac, LOGE, FL("Base address is NULL"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530175 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800176 }
177
178 if (e_sme_command_set_hw_mode != command->command) {
179 sms_log(mac, LOGE, FL("Command mismatch!"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530180 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800181 }
182
183 callback = command->u.set_hw_mode_cmd.set_hw_mode_cb;
Chandrasekaran, Manishekaref70c0d2015-10-20 19:54:55 +0530184 reason = command->u.set_hw_mode_cmd.reason;
Chandrasekaran, Manishekarce2172e2016-02-18 16:12:43 +0530185
186 sms_log(mac, LOG1, FL("reason:%d session:%d"),
187 command->u.set_hw_mode_cmd.reason,
188 command->u.set_hw_mode_cmd.session_id);
189
Chandrasekaran, Manishekar4dd215e2016-04-16 18:48:34 -0700190 if (!callback) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800191 sms_log(mac, LOGE, FL("Callback does not exist"));
Chandrasekaran, Manishekar4dd215e2016-04-16 18:48:34 -0700192 goto end;
193 }
194
195 if (!param) {
196 sms_log(mac, LOGE,
197 FL("Callback failed since HW mode params is NULL"));
198 goto end;
199 }
200
201 /* Irrespective of the reason for which the hw mode change request
202 * was issued, the policy manager connection table needs to be updated
203 * with the new vdev-mac id mapping, tx/rx spatial streams etc., if the
204 * set hw mode was successful.
205 */
206 callback(param->status,
207 param->cfgd_hw_mode_index,
208 param->num_vdev_mac_entries,
209 param->vdev_mac_map);
210
211 if (reason == SIR_UPDATE_REASON_HIDDEN_STA) {
212 /* In the case of hidden SSID, connection update
213 * (set hw mode) is done after the scan with reason
214 * code eCsrScanForSsid completes. The connect/failure
215 * needs to be handled after the response of set hw
216 * mode
217 */
218 saved_cmd = (tSmeCmd *)mac->sme.saved_scan_cmd;
219 if (!saved_cmd) {
220 sms_log(mac, LOGP,
221 FL("saved cmd is NULL, Check this"));
222 goto end;
223 }
224 if (param->status == SET_HW_MODE_STATUS_OK) {
225 sms_log(mac, LOG1,
226 FL("search for ssid success"));
227 csr_scan_handle_search_for_ssid(mac,
228 saved_cmd);
229 } else {
230 sms_log(mac, LOG1,
231 FL("search for ssid failure"));
232 csr_scan_handle_search_for_ssid_failure(mac,
233 saved_cmd);
234 }
235 if (saved_cmd->u.roamCmd.pRoamBssEntry)
236 qdf_mem_free(
237 saved_cmd->u.roamCmd.pRoamBssEntry);
238 if (saved_cmd->u.scanCmd.u.scanRequest.SSIDs.SSIDList)
239 qdf_mem_free(saved_cmd->u.scanCmd.u.
240 scanRequest.SSIDs.SSIDList);
241 if (saved_cmd->u.scanCmd.pToRoamProfile)
242 qdf_mem_free(saved_cmd->u.scanCmd.
243 pToRoamProfile);
244 if (saved_cmd) {
245 qdf_mem_free(saved_cmd);
246 saved_cmd = NULL;
247 mac->sme.saved_scan_cmd = NULL;
248 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800249 }
250
Chandrasekaran, Manishekaref70c0d2015-10-20 19:54:55 +0530251end:
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800252 found = csr_ll_remove_entry(&mac->sme.smeCmdActiveList, entry,
253 LL_ACCESS_LOCK);
254 if (found) {
255 /* Now put this command back on the avilable command list */
256 sme_release_command(mac, command);
257 }
258 sme_process_pending_queue(mac);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530259 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800260}
261
262/**
263 * sme_process_hw_mode_trans_ind() - Process HW mode transition indication
264 * @mac: Global MAC pointer
265 * @msg: HW mode transition response
266 *
267 * Processes the HW mode transition indication and invoke the HDD callback
268 * to process further
269 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530270static QDF_STATUS sme_process_hw_mode_trans_ind(tpAniSirGlobal mac,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800271 uint8_t *msg)
272{
273 hw_mode_transition_cb callback = NULL;
274 struct sir_hw_mode_trans_ind *param;
275
276 param = (struct sir_hw_mode_trans_ind *)msg;
277 if (!param) {
278 sms_log(mac, LOGE, FL("HW mode trans ind param is NULL"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530279 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800280 }
281
282 callback = mac->sme.sme_hw_mode_trans_cb;
283 if (callback) {
284 sms_log(mac, LOGE, FL("Calling registered callback..."));
285 callback(param->old_hw_mode_index,
286 param->new_hw_mode_index,
287 param->num_vdev_mac_entries,
288 param->vdev_mac_map);
289 }
290
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530291 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800292}
293
Naveen Rawate7d86052015-11-13 12:01:43 -0800294/**
295 * free_sme_cmds() - This function frees memory allocated for SME commands
296 * @mac_ctx: Pointer to Global MAC structure
297 *
298 * This function frees memory allocated for SME commands
299 *
300 * @Return: void
301 */
302static void free_sme_cmds(tpAniSirGlobal mac_ctx)
303{
304 uint32_t idx;
305 if (NULL == mac_ctx->sme.pSmeCmdBufAddr)
306 return;
307
308 for (idx = 0; idx < mac_ctx->sme.totalSmeCmd; idx++)
Anurag Chouhan600c3a02016-03-01 10:33:54 +0530309 qdf_mem_free(mac_ctx->sme.pSmeCmdBufAddr[idx]);
Naveen Rawate7d86052015-11-13 12:01:43 -0800310
Anurag Chouhan600c3a02016-03-01 10:33:54 +0530311 qdf_mem_free(mac_ctx->sme.pSmeCmdBufAddr);
Naveen Rawate7d86052015-11-13 12:01:43 -0800312 mac_ctx->sme.pSmeCmdBufAddr = NULL;
313}
314
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530315static QDF_STATUS init_sme_cmd_list(tpAniSirGlobal pMac)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800316{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530317 QDF_STATUS status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800318 tSmeCmd *pCmd;
319 uint32_t cmd_idx;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530320 QDF_STATUS qdf_status;
Anurag Chouhan210db072016-02-22 18:42:15 +0530321 qdf_mc_timer_t *cmdTimeoutTimer = NULL;
Naveen Rawate7d86052015-11-13 12:01:43 -0800322 uint32_t sme_cmd_ptr_ary_sz;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800323
324 pMac->sme.totalSmeCmd = SME_TOTAL_COMMAND;
325
326 status = csr_ll_open(pMac->hHdd, &pMac->sme.smeCmdActiveList);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530327 if (!QDF_IS_STATUS_SUCCESS(status))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800328 goto end;
329
330 status = csr_ll_open(pMac->hHdd, &pMac->sme.smeCmdPendingList);
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.smeScanCmdActiveList);
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.smeScanCmdPendingList);
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.smeCmdFreeList);
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
Naveen Rawate7d86052015-11-13 12:01:43 -0800346 /* following pointer contains array of pointers for tSmeCmd* */
347 sme_cmd_ptr_ary_sz = sizeof(void *) * pMac->sme.totalSmeCmd;
Anurag Chouhan600c3a02016-03-01 10:33:54 +0530348 pMac->sme.pSmeCmdBufAddr = qdf_mem_malloc(sme_cmd_ptr_ary_sz);
Naveen Rawate7d86052015-11-13 12:01:43 -0800349 if (NULL == pMac->sme.pSmeCmdBufAddr) {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530350 status = QDF_STATUS_E_NOMEM;
Naveen Rawate7d86052015-11-13 12:01:43 -0800351 goto end;
352 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800353
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530354 status = QDF_STATUS_SUCCESS;
Naveen Rawate7d86052015-11-13 12:01:43 -0800355 for (cmd_idx = 0; cmd_idx < pMac->sme.totalSmeCmd; cmd_idx++) {
356 /*
357 * Since total size of all commands together can be huge chunk
358 * of memory, allocate SME cmd individually. These SME CMDs are
359 * moved between pending and active queues. And these freeing of
360 * these queues just manipulates the list but does not actually
361 * frees SME CMD pointers. Hence store each SME CMD address in
362 * the array, sme.pSmeCmdBufAddr. This will later facilitate
363 * freeing up of all SME CMDs with just a for loop.
364 */
365 pMac->sme.pSmeCmdBufAddr[cmd_idx] =
Anurag Chouhan600c3a02016-03-01 10:33:54 +0530366 qdf_mem_malloc(sizeof(tSmeCmd));
Naveen Rawate7d86052015-11-13 12:01:43 -0800367 if (NULL == pMac->sme.pSmeCmdBufAddr[cmd_idx]) {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530368 status = QDF_STATUS_E_NOMEM;
Naveen Rawate7d86052015-11-13 12:01:43 -0800369 free_sme_cmds(pMac);
370 goto end;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800371 }
Naveen Rawate7d86052015-11-13 12:01:43 -0800372 pCmd = (tSmeCmd *)pMac->sme.pSmeCmdBufAddr[cmd_idx];
373 csr_ll_insert_tail(&pMac->sme.smeCmdFreeList,
374 &pCmd->Link, LL_ACCESS_LOCK);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800375 }
376
377 /* This timer is only to debug the active list command timeout */
378
379 cmdTimeoutTimer =
Anurag Chouhan600c3a02016-03-01 10:33:54 +0530380 (qdf_mc_timer_t *) qdf_mem_malloc(sizeof(qdf_mc_timer_t));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800381 if (cmdTimeoutTimer) {
382 pMac->sme.smeCmdActiveList.cmdTimeoutTimer = cmdTimeoutTimer;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530383 qdf_status =
Anurag Chouhan210db072016-02-22 18:42:15 +0530384 qdf_mc_timer_init(pMac->sme.smeCmdActiveList.
Anurag Chouhan6d760662016-02-20 16:05:43 +0530385 cmdTimeoutTimer, QDF_TIMER_TYPE_SW,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800386 active_list_cmd_timeout_handle, (void *)pMac);
387
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530388 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +0530389 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800390 "Init Timer fail for active list command process time out");
Anurag Chouhan600c3a02016-03-01 10:33:54 +0530391 qdf_mem_free(pMac->sme.smeCmdActiveList.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800392 cmdTimeoutTimer);
393 pMac->sme.smeCmdActiveList.cmdTimeoutTimer = NULL;
394 } else {
395 pMac->sme.smeCmdActiveList.cmdTimeoutDuration =
396 CSR_ACTIVE_LIST_CMD_TIMEOUT_VALUE;
397 }
398 }
399
400end:
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530401 if (!QDF_IS_STATUS_SUCCESS(status))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800402 sms_log(pMac, LOGE, "failed to initialize sme command list:%d\n",
403 status);
404
405 return status;
406}
407
408void sme_release_command(tpAniSirGlobal pMac, tSmeCmd *pCmd)
409{
410 pCmd->command = eSmeNoCommand;
411 csr_ll_insert_tail(&pMac->sme.smeCmdFreeList, &pCmd->Link, LL_ACCESS_LOCK);
412}
413
414static void sme_release_cmd_list(tpAniSirGlobal pMac, tDblLinkList *pList)
415{
416 tListElem *pEntry;
417 tSmeCmd *pCommand;
418
419 while ((pEntry = csr_ll_remove_head(pList, LL_ACCESS_LOCK)) != NULL) {
420 /* TODO: base on command type to call release functions */
421 /* reinitialize different command types so they can be reused */
422 pCommand = GET_BASE_ADDR(pEntry, tSmeCmd, Link);
423 sme_abort_command(pMac, pCommand, true);
424 }
425}
426
427static void purge_sme_cmd_list(tpAniSirGlobal pMac)
428{
429 /* release any out standing commands back to free command list */
430 sme_release_cmd_list(pMac, &pMac->sme.smeCmdPendingList);
431 sme_release_cmd_list(pMac, &pMac->sme.smeCmdActiveList);
432 sme_release_cmd_list(pMac, &pMac->sme.smeScanCmdPendingList);
433 sme_release_cmd_list(pMac, &pMac->sme.smeScanCmdActiveList);
434}
435
436void purge_sme_session_cmd_list(tpAniSirGlobal pMac, uint32_t sessionId,
437 tDblLinkList *pList)
438{
439 /* release any out standing commands back to free command list */
440 tListElem *pEntry, *pNext;
441 tSmeCmd *pCommand;
442 tDblLinkList localList;
443
Anurag Chouhan600c3a02016-03-01 10:33:54 +0530444 qdf_mem_zero(&localList, sizeof(tDblLinkList));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530445 if (!QDF_IS_STATUS_SUCCESS(csr_ll_open(pMac->hHdd, &localList))) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800446 sms_log(pMac, LOGE, FL(" failed to open list"));
447 return;
448 }
449
450 csr_ll_lock(pList);
451 pEntry = csr_ll_peek_head(pList, LL_ACCESS_NOLOCK);
452 while (pEntry != NULL) {
453 pNext = csr_ll_next(pList, pEntry, LL_ACCESS_NOLOCK);
454 pCommand = GET_BASE_ADDR(pEntry, tSmeCmd, Link);
455 if (pCommand->sessionId == sessionId) {
456 if (csr_ll_remove_entry(pList, pEntry, LL_ACCESS_NOLOCK)) {
457 csr_ll_insert_tail(&localList, pEntry,
458 LL_ACCESS_NOLOCK);
459 }
460 }
461 pEntry = pNext;
462 }
463 csr_ll_unlock(pList);
464
465 while ((pEntry = csr_ll_remove_head(&localList, LL_ACCESS_NOLOCK))) {
466 pCommand = GET_BASE_ADDR(pEntry, tSmeCmd, Link);
467 sme_abort_command(pMac, pCommand, true);
468 }
469 csr_ll_close(&localList);
470}
471
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530472static QDF_STATUS free_sme_cmd_list(tpAniSirGlobal pMac)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800473{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530474 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800475
476 purge_sme_cmd_list(pMac);
477 csr_ll_close(&pMac->sme.smeCmdPendingList);
478 csr_ll_close(&pMac->sme.smeCmdActiveList);
479 csr_ll_close(&pMac->sme.smeScanCmdPendingList);
480 csr_ll_close(&pMac->sme.smeScanCmdActiveList);
481 csr_ll_close(&pMac->sme.smeCmdFreeList);
482
483 /*destroy active list command time out timer */
Anurag Chouhan210db072016-02-22 18:42:15 +0530484 qdf_mc_timer_destroy(pMac->sme.smeCmdActiveList.cmdTimeoutTimer);
Anurag Chouhan600c3a02016-03-01 10:33:54 +0530485 qdf_mem_free(pMac->sme.smeCmdActiveList.cmdTimeoutTimer);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800486 pMac->sme.smeCmdActiveList.cmdTimeoutTimer = NULL;
487
Anurag Chouhana37b5b72016-02-21 14:53:42 +0530488 status = qdf_mutex_acquire(&pMac->sme.lkSmeGlobalLock);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530489 if (status != QDF_STATUS_SUCCESS) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800490 sms_log(pMac, LOGE,
491 FL("Failed to acquire the lock status = %d"), status);
492 goto done;
493 }
494
Naveen Rawate7d86052015-11-13 12:01:43 -0800495 free_sme_cmds(pMac);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800496
Anurag Chouhana37b5b72016-02-21 14:53:42 +0530497 status = qdf_mutex_release(&pMac->sme.lkSmeGlobalLock);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530498 if (status != QDF_STATUS_SUCCESS) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800499 sms_log(pMac, LOGE,
500 FL("Failed to release the lock status = %d"), status);
501 }
502done:
503 return status;
504}
505
Jeff Johnson49c02f92016-10-07 10:29:09 -0700506static void dump_csr_command_info(tpAniSirGlobal pMac, tSmeCmd *pCmd)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800507{
508 switch (pCmd->command) {
509 case eSmeCommandScan:
510 sms_log(pMac, LOGE, " scan command reason is %d",
511 pCmd->u.scanCmd.reason);
512 break;
513
514 case eSmeCommandRoam:
515 sms_log(pMac, LOGE, " roam command reason is %d",
516 pCmd->u.roamCmd.roamReason);
517 break;
518
519 case eSmeCommandWmStatusChange:
520 sms_log(pMac, LOGE, " WMStatusChange command type is %d",
521 pCmd->u.wmStatusChangeCmd.Type);
522 break;
523
524 case eSmeCommandSetKey:
525 sms_log(pMac, LOGE, " setKey command auth(%d) enc(%d)",
526 pCmd->u.setKeyCmd.authType, pCmd->u.setKeyCmd.encType);
527 break;
528
529 default:
530 sms_log(pMac, LOGE, " default: Unhandled command %d",
531 pCmd->command);
532 break;
533 }
534}
535
536tSmeCmd *sme_get_command_buffer(tpAniSirGlobal pMac)
537{
538 tSmeCmd *pRetCmd = NULL, *pTempCmd = NULL;
539 tListElem *pEntry;
540 static int sme_command_queue_full;
541
542 pEntry = csr_ll_remove_head(&pMac->sme.smeCmdFreeList, LL_ACCESS_LOCK);
543
544 /* If we can get another MS Msg buffer, then we are ok. Just link */
545 /* the entry onto the linked list. (We are using the linked list */
546 /* to keep track of tfhe message buffers). */
547 if (pEntry) {
548 pRetCmd = GET_BASE_ADDR(pEntry, tSmeCmd, Link);
549 /* reset when free list is available */
550 sme_command_queue_full = 0;
551 } else {
552 int idx = 1;
553
554 /* Cannot change pRetCmd here since it needs to return later. */
555 pEntry =
556 csr_ll_peek_head(&pMac->sme.smeCmdActiveList, LL_ACCESS_LOCK);
557 if (pEntry) {
558 pTempCmd = GET_BASE_ADDR(pEntry, tSmeCmd, Link);
559 }
560 sms_log(pMac, LOGE,
561 "Out of command buffer.... command (0x%X) stuck",
562 (pTempCmd) ? pTempCmd->command : eSmeNoCommand);
563 if (pTempCmd) {
564 if (eSmeCsrCommandMask & pTempCmd->command) {
565 /* CSR command is stuck. See what the reason code is for that command */
566 dump_csr_command_info(pMac, pTempCmd);
567 }
568 } /* if(pTempCmd) */
569
570 /* dump what is in the pending queue */
571 csr_ll_lock(&pMac->sme.smeCmdPendingList);
572 pEntry =
573 csr_ll_peek_head(&pMac->sme.smeCmdPendingList,
574 LL_ACCESS_NOLOCK);
575 while (pEntry && !sme_command_queue_full) {
576 pTempCmd = GET_BASE_ADDR(pEntry, tSmeCmd, Link);
577 /* Print only 1st five commands from pending queue. */
578 if (idx <= 5)
579 sms_log(pMac, LOGE,
580 "Out of command buffer.... SME pending command #%d (0x%X)",
581 idx, pTempCmd->command);
582 idx++;
583 if (eSmeCsrCommandMask & pTempCmd->command) {
584 /* CSR command is stuck. See what the reason code is for that command */
585 dump_csr_command_info(pMac, pTempCmd);
586 }
587 pEntry =
588 csr_ll_next(&pMac->sme.smeCmdPendingList, pEntry,
589 LL_ACCESS_NOLOCK);
590 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800591 csr_ll_unlock(&pMac->sme.smeCmdPendingList);
592
DARAM SUDHAf6c3f972015-05-26 19:26:16 +0530593 idx = 1;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800594 /* There may be some more command in CSR's own pending queue */
595 csr_ll_lock(&pMac->roam.roamCmdPendingList);
596 pEntry =
597 csr_ll_peek_head(&pMac->roam.roamCmdPendingList,
598 LL_ACCESS_NOLOCK);
DARAM SUDHAf6c3f972015-05-26 19:26:16 +0530599 while (pEntry && !sme_command_queue_full) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800600 pTempCmd = GET_BASE_ADDR(pEntry, tSmeCmd, Link);
DARAM SUDHAf6c3f972015-05-26 19:26:16 +0530601 /* Print only 1st five commands from CSR pending queue */
602 if (idx <= 5)
603 sms_log(pMac, LOGE,
604 "Out of command buffer.... "
605 "CSR roamCmdPendingList command #%d (0x%X)",
606 idx, pTempCmd->command);
607 idx++;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800608 dump_csr_command_info(pMac, pTempCmd);
609 pEntry =
610 csr_ll_next(&pMac->roam.roamCmdPendingList, pEntry,
611 LL_ACCESS_NOLOCK);
612 }
DARAM SUDHAf6c3f972015-05-26 19:26:16 +0530613
614 /* Increment static variable so that it prints
615 * pending command only once
616 */
617 sme_command_queue_full++;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800618 csr_ll_unlock(&pMac->roam.roamCmdPendingList);
DARAM SUDHAf6c3f972015-05-26 19:26:16 +0530619
Abhishek Singh5ea86532016-04-27 14:10:53 +0530620 if (pMac->roam.configParam.enable_fatal_event)
621 cds_flush_logs(WLAN_LOG_TYPE_FATAL,
622 WLAN_LOG_INDICATOR_HOST_DRIVER,
623 WLAN_LOG_REASON_SME_OUT_OF_CMD_BUF,
624 false,
625 pMac->sme.enableSelfRecovery ? true : false);
626 else if (pMac->sme.enableSelfRecovery)
627 cds_trigger_recovery();
628 else
629 QDF_BUG(0);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800630 }
631
632 /* memset to zero */
633 if (pRetCmd) {
Anurag Chouhan600c3a02016-03-01 10:33:54 +0530634 qdf_mem_set((uint8_t *)&pRetCmd->command,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800635 sizeof(pRetCmd->command), 0);
Anurag Chouhan600c3a02016-03-01 10:33:54 +0530636 qdf_mem_set((uint8_t *)&pRetCmd->sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800637 sizeof(pRetCmd->sessionId), 0);
Anurag Chouhan600c3a02016-03-01 10:33:54 +0530638 qdf_mem_set((uint8_t *)&pRetCmd->u, sizeof(pRetCmd->u), 0);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800639 }
640
641 return pRetCmd;
642}
643
644void sme_push_command(tpAniSirGlobal pMac, tSmeCmd *pCmd, bool fHighPriority)
645{
646 if (!SME_IS_START(pMac)) {
647 sms_log(pMac, LOGE, FL("Sme in stop state"));
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +0530648 QDF_ASSERT(0);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800649 return;
650 }
651
652 if (fHighPriority) {
653 csr_ll_insert_head(&pMac->sme.smeCmdPendingList, &pCmd->Link,
654 LL_ACCESS_LOCK);
655 } else {
656 csr_ll_insert_tail(&pMac->sme.smeCmdPendingList, &pCmd->Link,
657 LL_ACCESS_LOCK);
658 }
659
660 /* process the command queue... */
661 sme_process_pending_queue(pMac);
662
663 return;
664}
665
666/* For commands that need to do extra cleanup. */
667static void sme_abort_command(tpAniSirGlobal pMac, tSmeCmd *pCommand,
668 bool fStopping)
669{
670 if (eSmePmcCommandMask & pCommand->command) {
671 sms_log(pMac, LOG1,
672 "No need to process PMC commands");
673 return;
674 }
675 if (eSmeCsrCommandMask & pCommand->command) {
676 csr_abort_command(pMac, pCommand, fStopping);
677 return;
678 }
679 switch (pCommand->command) {
680 case eSmeCommandRemainOnChannel:
681 if (NULL != pCommand->u.remainChlCmd.callback) {
682 remainOnChanCallback callback =
683 pCommand->u.remainChlCmd.callback;
684 /* process the msg */
685 if (callback) {
686 callback(pMac, pCommand->u.remainChlCmd.
687 callbackCtx, eCSR_SCAN_ABORT,
688 pCommand->u.remainChlCmd.scan_id);
689 }
690 }
691 sme_release_command(pMac, pCommand);
692 break;
693 default:
694 sme_release_command(pMac, pCommand);
695 break;
696 }
697
698}
699
Jeff Johnson49c02f92016-10-07 10:29:09 -0700700static
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800701tListElem *csr_get_cmd_to_process(tpAniSirGlobal pMac, tDblLinkList *pList,
702 uint8_t sessionId, bool fInterlocked)
703{
704 tListElem *pCurEntry = NULL;
705 tSmeCmd *pCommand;
706
707 /* Go through the list and return the command whose session id is not
708 * matching with the current ongoing scan cmd sessionId */
709 pCurEntry = csr_ll_peek_head(pList, LL_ACCESS_LOCK);
710 while (pCurEntry) {
711 pCommand = GET_BASE_ADDR(pCurEntry, tSmeCmd, Link);
712 if (pCommand->sessionId != sessionId) {
713 sms_log(pMac, LOG1,
714 "selected the command with different sessionId");
715 return pCurEntry;
716 }
717
718 pCurEntry = csr_ll_next(pList, pCurEntry, fInterlocked);
719 }
720
721 sms_log(pMac, LOG1, "No command pending with different sessionId");
722 return NULL;
723}
724
Jeff Johnson49c02f92016-10-07 10:29:09 -0700725static bool sme_process_scan_queue(tpAniSirGlobal pMac)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800726{
727 tListElem *pEntry;
728 tSmeCmd *pCommand;
729 tListElem *pSmeEntry = NULL;
730 tSmeCmd *pSmeCommand = NULL;
731 bool status = true;
732
733 if ((!csr_ll_is_list_empty(&pMac->sme.smeCmdActiveList,
734 LL_ACCESS_LOCK))) {
735 pSmeEntry = csr_ll_peek_head(&pMac->sme.smeCmdActiveList,
736 LL_ACCESS_LOCK);
737 if (pSmeEntry)
738 pSmeCommand = GET_BASE_ADDR(pSmeEntry, tSmeCmd, Link);
739 }
740 csr_ll_lock(&pMac->sme.smeScanCmdActiveList);
741 if (csr_ll_is_list_empty(&pMac->sme.smeScanCmdPendingList,
742 LL_ACCESS_LOCK))
743 goto end;
744 pEntry = csr_ll_peek_head(&pMac->sme.smeScanCmdPendingList,
745 LL_ACCESS_LOCK);
746 if (!pEntry)
747 goto end;
748
Archana Ramachandran31b5b652016-09-21 15:37:58 -0700749 sms_log(pMac, LOG1,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800750 FL("scan_count in active scanlist %d "),
751 pMac->sme.smeScanCmdActiveList.Count);
752
753 pCommand = GET_BASE_ADDR(pEntry, tSmeCmd, Link);
754 if (pSmeCommand != NULL) {
755 /*
756 * if scan is running on one interface and SME receives
757 * the next command on the same interface then
758 * dont the allow the command to be queued to
759 * smeCmdPendingList. If next scan is allowed on
760 * the same interface the CSR state machine will
761 * get screwed up.
762 */
763 if (pSmeCommand->sessionId == pCommand->sessionId) {
764 status = false;
765 goto end;
766 }
767 }
768 /*
769 * We cannot execute any command in wait-for-key state until setKey is
770 * through.
771 */
772 if (CSR_IS_WAIT_FOR_KEY(pMac, pCommand->sessionId)) {
773 if (!CSR_IS_SET_KEY_COMMAND(pCommand)) {
774 sms_log(pMac, LOGE,
775 FL("Can't process cmd(%d), waiting for key"),
776 pCommand->command);
777 status = false;
778 goto end;
779 }
780 }
781 if (csr_ll_remove_entry(&pMac->sme.smeScanCmdPendingList, pEntry,
782 LL_ACCESS_LOCK)) {
783 csr_ll_insert_head(&pMac->sme.smeScanCmdActiveList,
784 &pCommand->Link, LL_ACCESS_NOLOCK);
785 switch (pCommand->command) {
786 case eSmeCommandScan:
787 sms_log(pMac, LOG1, FL("Processing scan offload cmd."));
Anurag Chouhan210db072016-02-22 18:42:15 +0530788 qdf_mc_timer_start(&pCommand->u.scanCmd.csr_scan_timer,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800789 CSR_ACTIVE_SCAN_LIST_CMD_TIMEOUT);
790 csr_process_scan_command(pMac, pCommand);
791 break;
792 case eSmeCommandRemainOnChannel:
793 sms_log(pMac, LOG1,
794 FL("Processing remain on channel offload cmd"));
795 p2p_process_remain_on_channel_cmd(pMac, pCommand);
796 break;
797 default:
798 sms_log(pMac, LOGE,
799 FL("Wrong cmd enqueued to ScanCmdPendingList"));
800 pEntry = csr_ll_remove_head(
801 &pMac->sme.smeScanCmdActiveList,
802 LL_ACCESS_NOLOCK);
803 pCommand = GET_BASE_ADDR(pEntry, tSmeCmd, Link);
804 sme_release_command(pMac, pCommand);
805 break;
806 }
807 }
808end:
809 csr_ll_unlock(&pMac->sme.smeScanCmdActiveList);
810 return status;
811}
812
813/**
814 * sme_process_command() - processes SME commnd
815 * @mac_ctx: mac global context
816 *
817 * This function is called by sme_process_pending_queue() in a while loop
818 *
819 * Return: true indicates that caller function can proceed to next cmd
820 * false otherwise.
821 */
Jeff Johnson49c02f92016-10-07 10:29:09 -0700822static bool sme_process_command(tpAniSirGlobal pMac)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800823{
824 bool fContinue = false;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530825 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800826 tListElem *pEntry;
827 tSmeCmd *pCommand;
828 tListElem *pSmeEntry;
829 tSmeCmd *pSmeCommand;
830
831 /*
832 * if the ActiveList is empty, then nothing is active so we can process
833 * a pending command...
834 * alwasy lock active list before locking pending list
835 */
836 csr_ll_lock(&pMac->sme.smeCmdActiveList);
837 if (!csr_ll_is_list_empty(&pMac->sme.smeCmdActiveList,
838 LL_ACCESS_NOLOCK)) {
839 csr_ll_unlock(&pMac->sme.smeCmdActiveList);
840 goto process_scan_q;
841 }
842
843 if (csr_ll_is_list_empty(&pMac->sme.smeCmdPendingList,
844 LL_ACCESS_LOCK)) {
845 /* No command waiting */
846 csr_ll_unlock(&pMac->sme.smeCmdActiveList);
847 goto process_scan_q;
848 }
849
850 /*
851 * If scan command is pending in the smeScanCmdActive list then pick the
852 * command from smeCmdPendingList which is not matching with the scan
853 * command session id. At any point of time only one command will be
854 * allowed on a single session.
855 */
856 if (!csr_ll_is_list_empty(
857 &pMac->sme.smeScanCmdActiveList, LL_ACCESS_LOCK)) {
858 pSmeEntry = csr_ll_peek_head(&pMac->sme.smeScanCmdActiveList,
859 LL_ACCESS_LOCK);
860 if (pSmeEntry) {
861 pSmeCommand = GET_BASE_ADDR(pSmeEntry, tSmeCmd, Link);
862 pEntry = csr_get_cmd_to_process(pMac,
863 &pMac->sme.smeCmdPendingList,
864 pSmeCommand->sessionId,
865 LL_ACCESS_LOCK);
866 goto sme_process_cmd;
867 }
868 }
869
870 /* Peek the command */
871 pEntry = csr_ll_peek_head(&pMac->sme.smeCmdPendingList, LL_ACCESS_LOCK);
872sme_process_cmd:
873 if (!pEntry) {
874 csr_ll_unlock(&pMac->sme.smeCmdActiveList);
875 goto process_scan_q;
876 }
877 pCommand = GET_BASE_ADDR(pEntry, tSmeCmd, Link);
878 /*
879 * Allow only disconnect command in wait-for-key state until setKey is
880 * through.
881 */
882 if (CSR_IS_WAIT_FOR_KEY(pMac, pCommand->sessionId)
883 && !CSR_IS_DISCONNECT_COMMAND(pCommand)
884 && !CSR_IS_SET_KEY_COMMAND(pCommand)) {
885 if (CSR_IS_CLOSE_SESSION_COMMAND(pCommand)) {
886 tSmeCmd *sme_cmd = NULL;
887
888 sms_log(pMac, LOGE,
889 FL("SessionId %d: close session command issued while waiting for key, issue disconnect first"),
890 pCommand->sessionId);
891 status = csr_prepare_disconnect_command(pMac,
892 pCommand->sessionId, &sme_cmd);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530893 if (status == QDF_STATUS_SUCCESS && sme_cmd) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800894 csr_ll_lock(&pMac->sme.smeCmdPendingList);
895 csr_ll_insert_head(&pMac->sme.smeCmdPendingList,
896 &sme_cmd->Link, LL_ACCESS_NOLOCK);
897 pEntry = csr_ll_peek_head(
898 &pMac->sme.smeCmdPendingList,
899 LL_ACCESS_NOLOCK);
900 csr_ll_unlock(&pMac->sme.smeCmdPendingList);
901 goto sme_process_cmd;
902 }
903 }
904
905 csr_ll_unlock(&pMac->sme.smeCmdActiveList);
906 sms_log(pMac, LOGE,
907 FL("SessionId %d: Can't process cmd(%d), waiting for key"),
908 pCommand->sessionId, pCommand->command);
909 fContinue = false;
910 goto process_scan_q;
911 }
912
913 if (!csr_ll_remove_entry(&pMac->sme.smeCmdPendingList, pEntry,
914 LL_ACCESS_LOCK)) {
915 /* This is odd. Some one else pull off the command. */
916 csr_ll_unlock(&pMac->sme.smeCmdActiveList);
917 goto process_scan_q;
918 }
919 /* we can reuse the pCommand. Insert the command onto the ActiveList */
920 csr_ll_insert_head(&pMac->sme.smeCmdActiveList, &pCommand->Link,
921 LL_ACCESS_NOLOCK);
922 /* .... and process the command. */
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +0530923 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_COMMAND,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800924 pCommand->sessionId, pCommand->command));
925
926 switch (pCommand->command) {
927 case eSmeCommandScan:
928 csr_ll_unlock(&pMac->sme.smeCmdActiveList);
929 status = csr_process_scan_command(pMac, pCommand);
930 break;
931 case eSmeCommandRoam:
932 csr_ll_unlock(&pMac->sme.smeCmdActiveList);
933 status = csr_roam_process_command(pMac, pCommand);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530934 if (!QDF_IS_STATUS_SUCCESS(status)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800935 && csr_ll_remove_entry(&pMac->sme.smeCmdActiveList,
936 &pCommand->Link, LL_ACCESS_LOCK))
937 csr_release_command_roam(pMac, pCommand);
938 break;
939 case eSmeCommandWmStatusChange:
940 csr_ll_unlock(&pMac->sme.smeCmdActiveList);
941 csr_roam_process_wm_status_change_command(pMac, pCommand);
942 break;
943 case eSmeCommandSetKey:
944 csr_ll_unlock(&pMac->sme.smeCmdActiveList);
945 status = csr_roam_process_set_key_command(pMac, pCommand);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530946 if (!QDF_IS_STATUS_SUCCESS(status)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800947 && csr_ll_remove_entry(&pMac->sme.smeCmdActiveList,
948 &pCommand->Link, LL_ACCESS_LOCK)) {
949 csr_release_command_set_key(pMac, pCommand);
950 }
951 break;
952 case eSmeCommandAddStaSession:
953 csr_ll_unlock(&pMac->sme.smeCmdActiveList);
954 csr_process_add_sta_session_command(pMac, pCommand);
955 break;
Deepak Dhamdhere0f076bd2016-06-02 11:29:21 -0700956 case eSmeCommandNdpInitiatorRequest:
957 csr_ll_unlock(&pMac->sme.smeCmdActiveList);
958 if (csr_process_ndp_initiator_request(pMac, pCommand) !=
959 QDF_STATUS_SUCCESS)
960 if (csr_ll_remove_entry(
961 &pMac->sme.smeCmdActiveList,
962 &pCommand->Link, LL_ACCESS_LOCK))
963 csr_release_command(pMac, pCommand);
Abhishek Singh4fef7472016-06-06 11:36:03 -0700964 break;
965 case eSmeCommandNdpResponderRequest:
966 csr_ll_unlock(&pMac->sme.smeCmdActiveList);
967 status = csr_process_ndp_responder_request(pMac, pCommand);
968 if (status != QDF_STATUS_SUCCESS) {
969 if (csr_ll_remove_entry(&pMac->sme.smeCmdActiveList,
Naveen Rawatf28315c2016-06-29 18:06:02 -0700970 &pCommand->Link, LL_ACCESS_LOCK))
971 csr_release_command(pMac, pCommand);
972 }
973 break;
974 case eSmeCommandNdpDataEndInitiatorRequest:
975 csr_ll_unlock(&pMac->sme.smeCmdActiveList);
976 status = csr_process_ndp_data_end_request(pMac, pCommand);
977 if (status != QDF_STATUS_SUCCESS) {
978 if (csr_ll_remove_entry(&pMac->sme.smeCmdActiveList,
979 &pCommand->Link, LL_ACCESS_LOCK))
Abhishek Singh4fef7472016-06-06 11:36:03 -0700980 csr_release_command(pMac, pCommand);
981 }
982 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800983 case eSmeCommandDelStaSession:
984 csr_ll_unlock(&pMac->sme.smeCmdActiveList);
985 csr_process_del_sta_session_command(pMac, pCommand);
986 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800987 case eSmeCommandRemainOnChannel:
988 csr_ll_unlock(&pMac->sme.smeCmdActiveList);
989 p2p_process_remain_on_channel_cmd(pMac, pCommand);
990 break;
991 /*
992 * Treat standby differently here because caller may not be able
993 * to handle the failure so we do our best here
994 */
995 case eSmeCommandEnterStandby:
996 break;
997 case eSmeCommandAddTs:
998 case eSmeCommandDelTs:
999 csr_ll_unlock(&pMac->sme.smeCmdActiveList);
1000#ifndef WLAN_MDM_CODE_REDUCTION_OPT
1001 fContinue = qos_process_command(pMac, pCommand);
1002 if (fContinue && csr_ll_remove_entry(
1003 &pMac->sme.smeCmdActiveList,
1004 &pCommand->Link, LL_ACCESS_NOLOCK)) {
1005 /* The command failed, remove it */
1006 qos_release_command(pMac, pCommand);
1007 }
1008#endif
1009 break;
1010#ifdef FEATURE_WLAN_TDLS
1011 case eSmeCommandTdlsSendMgmt:
1012 case eSmeCommandTdlsAddPeer:
1013 case eSmeCommandTdlsDelPeer:
1014 case eSmeCommandTdlsLinkEstablish:
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301015 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001016 FL("sending TDLS Command 0x%x to PE"),
1017 pCommand->command);
1018 csr_ll_unlock(&pMac->sme.smeCmdActiveList);
1019 status = csr_tdls_process_cmd(pMac, pCommand);
Frank Liud32281c2016-09-30 11:25:14 +08001020 if (!QDF_IS_STATUS_SUCCESS(status)) {
1021 if (csr_ll_remove_entry(&pMac->sme.smeCmdActiveList,
1022 &pCommand->Link,
1023 LL_ACCESS_LOCK)) {
1024 qdf_mem_zero(&pCommand->u.tdlsCmd,
1025 sizeof(tTdlsCmd));
1026 csr_release_command(pMac, pCommand);
1027 }
1028 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001029 break;
1030#endif
1031 case e_sme_command_set_hw_mode:
1032 csr_ll_unlock(&pMac->sme.smeCmdActiveList);
1033 csr_process_set_hw_mode(pMac, pCommand);
1034 break;
1035 case e_sme_command_nss_update:
1036 csr_ll_unlock(&pMac->sme.smeCmdActiveList);
1037 csr_process_nss_update_req(pMac, pCommand);
1038 break;
1039 case e_sme_command_set_dual_mac_config:
1040 csr_ll_unlock(&pMac->sme.smeCmdActiveList);
1041 csr_process_set_dual_mac_config(pMac, pCommand);
1042 break;
Archana Ramachandrana20ef812015-11-13 16:12:13 -08001043 case e_sme_command_set_antenna_mode:
1044 csr_ll_unlock(&pMac->sme.smeCmdActiveList);
1045 csr_process_set_antenna_mode(pMac, pCommand);
1046 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001047 default:
1048 /* something is wrong */
1049 /* remove it from the active list */
1050 sms_log(pMac, LOGE, FL("unknown command %d"),
1051 pCommand->command);
1052 pEntry = csr_ll_remove_head(&pMac->sme.smeCmdActiveList,
1053 LL_ACCESS_NOLOCK);
1054 csr_ll_unlock(&pMac->sme.smeCmdActiveList);
1055 pCommand = GET_BASE_ADDR(pEntry, tSmeCmd, Link);
1056 sme_release_command(pMac, pCommand);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301057 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001058 break;
1059 }
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301060 if (!QDF_IS_STATUS_SUCCESS(status))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001061 fContinue = true;
1062process_scan_q:
1063 if (!(sme_process_scan_queue(pMac)))
1064 fContinue = false;
1065 return fContinue;
1066}
1067
1068void sme_process_pending_queue(tpAniSirGlobal pMac)
1069{
1070 while (sme_process_command(pMac))
1071 ;
1072}
1073
1074bool sme_command_pending(tpAniSirGlobal pMac)
1075{
1076 return !csr_ll_is_list_empty(&pMac->sme.smeCmdActiveList, LL_ACCESS_NOLOCK)
1077 || !csr_ll_is_list_empty(&pMac->sme.smeCmdPendingList,
1078 LL_ACCESS_NOLOCK);
1079}
1080
Padma, Santhosh Kumar9aba02f2016-08-11 16:30:25 +05301081/**
1082 * sme_get_sessionid_from_activelist() - gets session id
1083 * @mac: mac context
1084 *
1085 * This function is used to get session id from sme command
1086 * active list
1087 *
1088 * Return: returns session id
1089 */
Jeff Johnson49c02f92016-10-07 10:29:09 -07001090static uint32_t sme_get_sessionid_from_activelist(tpAniSirGlobal mac)
Padma, Santhosh Kumar9aba02f2016-08-11 16:30:25 +05301091{
1092 tListElem *entry;
1093 tSmeCmd *command;
1094 uint32_t session_id = CSR_SESSION_ID_INVALID;
1095
1096 entry = csr_ll_peek_head(&mac->sme.smeCmdActiveList, LL_ACCESS_LOCK);
1097 if (entry) {
1098 command = GET_BASE_ADDR(entry, tSmeCmd, Link);
1099 session_id = command->sessionId;
1100 }
1101
1102 return session_id;
1103}
1104
1105/**
1106 * sme_state_info_dump() - prints state information of sme layer
1107 * @buf: buffer pointer
1108 * @size: size of buffer to be filled
1109 *
1110 * This function is used to dump state information of sme layer
1111 *
1112 * Return: None
1113 */
1114static void sme_state_info_dump(char **buf_ptr, uint16_t *size)
1115{
1116 uint32_t session_id, active_session_id;
1117 tHalHandle hal;
1118 tpAniSirGlobal mac;
1119 uint16_t len = 0;
1120 char *buf = *buf_ptr;
1121 eCsrConnectState connect_state;
1122
1123 hal = cds_get_context(QDF_MODULE_ID_SME);
1124 if (hal == NULL) {
1125 QDF_ASSERT(0);
1126 return;
1127 }
1128
1129 mac = PMAC_STRUCT(hal);
1130 sms_log(mac, LOG1, FL("size of buffer: %d"), *size);
1131
1132 active_session_id = sme_get_sessionid_from_activelist(mac);
1133 if (active_session_id != CSR_SESSION_ID_INVALID) {
1134 len += qdf_scnprintf(buf + len, *size - len,
1135 "\n active command sessionid %d", active_session_id);
1136 }
1137
1138 for (session_id = 0; session_id < CSR_ROAM_SESSION_MAX; session_id++) {
1139 if (CSR_IS_SESSION_VALID(mac, session_id)) {
1140 connect_state =
1141 mac->roam.roamSession[session_id].connectState;
1142 if ((eCSR_ASSOC_STATE_TYPE_INFRA_ASSOCIATED ==
1143 connect_state)
1144 || (eCSR_ASSOC_STATE_TYPE_INFRA_CONNECTED ==
1145 connect_state)) {
1146 len += qdf_scnprintf(buf + len, *size - len,
1147 "\n NeighborRoamState: %d",
1148 mac->roam.neighborRoamInfo[session_id].
1149 neighborRoamState);
1150 len += qdf_scnprintf(buf + len, *size - len,
1151 "\n RoamState: %d", mac->roam.
1152 curState[session_id]);
1153 len += qdf_scnprintf(buf + len, *size - len,
1154 "\n RoamSubState: %d", mac->roam.
1155 curSubState[session_id]);
1156 len += qdf_scnprintf(buf + len, *size - len,
1157 "\n ConnectState: %d",
1158 connect_state);
1159 }
1160 }
1161 }
1162
1163 *size -= len;
1164 *buf_ptr += len;
1165}
1166
1167/**
1168 * sme_register_debug_callback() - registration function sme layer
1169 * to print sme state information
1170 *
1171 * Return: None
1172 */
1173static void sme_register_debug_callback(void)
1174{
1175 qdf_register_debug_callback(QDF_MODULE_ID_SME, &sme_state_info_dump);
1176}
1177
1178
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001179/* Global APIs */
1180
1181/**
1182 * sme_open() - Initialze all SME modules and put them at idle state
1183 * @hHal: The handle returned by mac_open
1184 *
1185 * The function initializes each module inside SME, PMC, CSR, etc. Upon
1186 * successfully return, all modules are at idle state ready to start.
1187 * smeOpen must be called before any other SME APIs can be involved.
1188 * smeOpen must be called after mac_open.
1189 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301190 * Return: QDF_STATUS_SUCCESS - SME is successfully initialized.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001191 * Other status means SME is failed to be initialized
1192 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301193QDF_STATUS sme_open(tHalHandle hHal)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001194{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301195 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001196 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001197
1198 pMac->sme.state = SME_STATE_STOP;
Anurag Chouhan6d760662016-02-20 16:05:43 +05301199 pMac->sme.currDeviceMode = QDF_STA_MODE;
Anurag Chouhana37b5b72016-02-21 14:53:42 +05301200 if (!QDF_IS_STATUS_SUCCESS(qdf_mutex_create(
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001201 &pMac->sme.lkSmeGlobalLock))) {
1202 sms_log(pMac, LOGE, FL("sme_open failed init lock"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301203 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001204 }
1205 status = csr_open(pMac);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301206 if (!QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001207 sms_log(pMac, LOGE, FL("csr_open failed, status=%d"), status);
1208 return status;
1209 }
1210
1211 status = sme_ps_open(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301212 if (!QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001213 sms_log(pMac, LOGE,
1214 FL("sme_ps_open failed during initialization with status=%d"),
1215 status);
1216 return status;
1217 }
1218#ifdef FEATURE_WLAN_TDLS
1219 pMac->is_tdls_power_save_prohibited = 0;
1220#endif
1221
1222#ifndef WLAN_MDM_CODE_REDUCTION_OPT
1223 status = sme_qos_open(pMac);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301224 if (!QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001225 sms_log(pMac, LOGE, FL("Qos open, status=%d"), status);
1226 return status;
1227 }
1228#endif
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001229 status = init_sme_cmd_list(pMac);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301230 if (!QDF_IS_STATUS_SUCCESS(status))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001231 return status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001232
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001233 status = rrm_open(pMac);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301234 if (!QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001235 sms_log(pMac, LOGE, FL("rrm_open failed, status=%d"), status);
1236 return status;
1237 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001238 sme_p2p_open(pMac);
1239 sme_trace_init(pMac);
Padma, Santhosh Kumar9aba02f2016-08-11 16:30:25 +05301240 sme_register_debug_callback();
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001241 return status;
1242}
1243
1244/*
1245 * sme_init_chan_list, triggers channel setup based on country code.
1246 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301247QDF_STATUS sme_init_chan_list(tHalHandle hal, uint8_t *alpha2,
Amar Singhala297bfa2015-10-15 15:07:29 -07001248 enum country_src cc_src)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001249{
1250 tpAniSirGlobal pmac = PMAC_STRUCT(hal);
1251
Amar Singhala297bfa2015-10-15 15:07:29 -07001252 if ((cc_src == SOURCE_USERSPACE) &&
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001253 (pmac->roam.configParam.fSupplicantCountryCodeHasPriority)) {
1254 pmac->roam.configParam.Is11dSupportEnabled = false;
1255 }
1256
1257 return csr_init_chan_list(pmac, alpha2);
1258}
1259
1260/*--------------------------------------------------------------------------
1261
1262 \brief sme_set11dinfo() - Set the 11d information about valid channels
1263 and there power using information from nvRAM
1264 This function is called only for AP.
1265
1266 This is a synchronous call
1267
1268 \param hHal - The handle returned by mac_open.
1269 \Param pSmeConfigParams - a pointer to a caller allocated object of
1270 typedef struct _smeConfigParams.
1271
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301272 \return QDF_STATUS_SUCCESS - SME update the config parameters successfully.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001273
1274 Other status means SME is failed to update the config parameters.
1275 \sa
1276 --------------------------------------------------------------------------*/
1277
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301278QDF_STATUS sme_set11dinfo(tHalHandle hHal, tpSmeConfigParams pSmeConfigParams)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001279{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301280 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001281 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
1282
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301283 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001284 TRACE_CODE_SME_RX_HDD_MSG_SET_11DINFO, NO_SESSION, 0));
1285 if (NULL == pSmeConfigParams) {
1286 sms_log(pMac, LOGE,
1287 "Empty config param structure for SME, nothing to update");
1288 return status;
1289 }
1290
1291 status = csr_set_channels(hHal, &pSmeConfigParams->csrConfig);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301292 if (!QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001293 sms_log(pMac, LOGE,
1294 "csr_change_default_config_param failed with status=%d",
1295 status);
1296 }
1297 return status;
1298}
1299
1300/**
1301 * sme_set_scan_disable() - Dynamically enable/disable scan
1302 * @h_hal: Handle to HAL
1303 *
1304 * This command gives the user an option to dynamically
1305 * enable or disable scans.
1306 *
1307 * Return: None
1308 */
1309void sme_set_scan_disable(tHalHandle h_hal, int value)
1310{
1311 tpAniSirGlobal mac_ctx = PMAC_STRUCT(h_hal);
1312 mac_ctx->lim.scan_disabled = value;
1313 sms_log(mac_ctx, LOG1, FL("value=%d"), value);
1314}
1315/*--------------------------------------------------------------------------
1316
1317 \brief sme_get_soft_ap_domain() - Get the current regulatory domain of softAp.
1318
1319 This is a synchronous call
1320
1321 \param hHal - The handle returned by HostapdAdapter.
1322 \Param v_REGDOMAIN_t - The current Regulatory Domain requested for SoftAp.
1323
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301324 \return QDF_STATUS_SUCCESS - SME successfully completed the request.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001325
1326 Other status means, failed to get the current regulatory domain.
1327 \sa
1328 --------------------------------------------------------------------------*/
1329
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301330QDF_STATUS sme_get_soft_ap_domain(tHalHandle hHal, v_REGDOMAIN_t *domainIdSoftAp)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001331{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301332 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001333 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
1334
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301335 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001336 TRACE_CODE_SME_RX_HDD_MSG_GET_SOFTAP_DOMAIN,
1337 NO_SESSION, 0));
1338 if (NULL == domainIdSoftAp) {
1339 sms_log(pMac, LOGE, "Uninitialized domain Id");
1340 return status;
1341 }
1342
1343 *domainIdSoftAp = pMac->scan.domainIdCurrent;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301344 status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001345
1346 return status;
1347}
1348
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301349QDF_STATUS sme_set_reg_info(tHalHandle hHal, uint8_t *apCntryCode)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001350{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301351 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001352 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
1353
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301354 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001355 TRACE_CODE_SME_RX_HDD_MSG_SET_REGINFO, NO_SESSION, 0));
1356 if (NULL == apCntryCode) {
1357 sms_log(pMac, LOGE, "Empty Country Code, nothing to update");
1358 return status;
1359 }
1360
1361 status = csr_set_reg_info(hHal, apCntryCode);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301362 if (!QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001363 sms_log(pMac, LOGE, "csr_set_reg_info failed with status=%d",
1364 status);
1365 }
1366 return status;
1367}
1368
Krunal Sonie3531942016-04-12 17:43:53 -07001369/**
1370 * sme_update_fine_time_measurement_capab() - Update the FTM capabitlies from
1371 * incoming val
1372 * @hal: Handle for Hal layer
1373 * @val: New FTM capability value
1374 *
1375 * Return: None
1376 */
Selvaraj, Sridhar57bb4d02016-08-31 16:14:15 +05301377void sme_update_fine_time_measurement_capab(tHalHandle hal, uint8_t session_id,
1378 uint32_t val)
Krunal Sonie3531942016-04-12 17:43:53 -07001379{
1380 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
1381 mac_ctx->fine_time_meas_cap = val;
1382
Selvaraj, Sridhar57bb4d02016-08-31 16:14:15 +05301383 if (!val) {
Krunal Sonie3531942016-04-12 17:43:53 -07001384 mac_ctx->rrm.rrmPEContext.rrmEnabledCaps.fine_time_meas_rpt = 0;
1385 ((tpRRMCaps)mac_ctx->rrm.rrmSmeContext.
1386 rrmConfig.rm_capability)->fine_time_meas_rpt = 0;
1387 } else {
1388 mac_ctx->rrm.rrmPEContext.rrmEnabledCaps.fine_time_meas_rpt = 1;
1389 ((tpRRMCaps)mac_ctx->rrm.rrmSmeContext.
1390 rrmConfig.rm_capability)->fine_time_meas_rpt = 1;
1391 }
Selvaraj, Sridhar57bb4d02016-08-31 16:14:15 +05301392
1393 /* Inform this RRM IE change to FW */
1394 csr_roam_offload_scan(mac_ctx, session_id,
1395 ROAM_SCAN_OFFLOAD_UPDATE_CFG,
1396 REASON_CONNECT_IES_CHANGED);
Krunal Sonie3531942016-04-12 17:43:53 -07001397}
1398
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001399/*--------------------------------------------------------------------------
1400
1401 \brief sme_update_config() - Change configurations for all SME moduels
1402
1403 The function updates some configuration for modules in SME, CSR, etc
1404 during SMEs close open sequence.
1405
1406 Modules inside SME apply the new configuration at the next transaction.
1407
1408 This is a synchronous call
1409
1410 \param hHal - The handle returned by mac_open.
1411 \Param pSmeConfigParams - a pointer to a caller allocated object of
1412 typedef struct _smeConfigParams.
1413
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301414 \return QDF_STATUS_SUCCESS - SME update the config parameters successfully.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001415
1416 Other status means SME is failed to update the config parameters.
1417 \sa
1418
1419 --------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301420QDF_STATUS sme_update_config(tHalHandle hHal, tpSmeConfigParams pSmeConfigParams)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001421{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301422 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001423 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
1424
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301425 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001426 TRACE_CODE_SME_RX_HDD_MSG_UPDATE_CONFIG, NO_SESSION,
1427 0));
1428 if (NULL == pSmeConfigParams) {
1429 sms_log(pMac, LOGE,
1430 "Empty config param structure for SME, nothing to update");
1431 return status;
1432 }
1433
1434 status =
1435 csr_change_default_config_param(pMac, &pSmeConfigParams->csrConfig);
1436
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301437 if (!QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001438 sms_log(pMac, LOGE,
1439 "csr_change_default_config_param failed with status=%d",
1440 status);
1441 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001442 status =
1443 rrm_change_default_config_param(hHal, &pSmeConfigParams->rrmConfig);
1444
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301445 if (!QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001446 sms_log(pMac, LOGE,
1447 "rrm_change_default_config_param failed with status=%d",
1448 status);
1449 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001450 /* For SOC, CFG is set before start */
1451 /* We don't want to apply global CFG in connect state because that may cause some side affect */
1452 if (csr_is_all_session_disconnected(pMac)) {
1453 csr_set_global_cfgs(pMac);
1454 }
1455
1456 /*
1457 * If scan offload is enabled then lim has allow the sending of
1458 * scan request to firmware even in powersave mode. The firmware has
1459 * to take care of exiting from power save mode
1460 */
1461 status = sme_cfg_set_int(hHal, WNI_CFG_SCAN_IN_POWERSAVE, true);
1462
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301463 if (QDF_STATUS_SUCCESS != status) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301464 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001465 "Could not pass on WNI_CFG_SCAN_IN_POWERSAVE to CFG");
1466 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001467 return status;
1468}
1469
1470/**
1471 * sme_update_roam_params() - Store/Update the roaming params
1472 * @hal: Handle for Hal layer
1473 * @session_id: SME Session ID
1474 * @roam_params_src: The source buffer to copy
1475 * @update_param: Type of parameter to be updated
1476 *
1477 * Return: Return the status of the updation.
1478 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301479QDF_STATUS sme_update_roam_params(tHalHandle hal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001480 uint8_t session_id, struct roam_ext_params roam_params_src,
1481 int update_param)
1482{
1483 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
1484 struct roam_ext_params *roam_params_dst;
1485 uint8_t i;
1486
1487 roam_params_dst = &mac_ctx->roam.configParam.roam_params;
1488 switch (update_param) {
1489 case REASON_ROAM_EXT_SCAN_PARAMS_CHANGED:
1490 roam_params_dst->raise_rssi_thresh_5g =
1491 roam_params_src.raise_rssi_thresh_5g;
1492 roam_params_dst->drop_rssi_thresh_5g =
1493 roam_params_src.drop_rssi_thresh_5g;
1494 roam_params_dst->raise_factor_5g =
1495 roam_params_src.raise_factor_5g;
1496 roam_params_dst->drop_factor_5g =
1497 roam_params_src.drop_factor_5g;
1498 roam_params_dst->max_raise_rssi_5g =
1499 roam_params_src.max_raise_rssi_5g;
1500 roam_params_dst->max_drop_rssi_5g =
1501 roam_params_src.max_drop_rssi_5g;
1502 roam_params_dst->alert_rssi_threshold =
1503 roam_params_src.alert_rssi_threshold;
1504 roam_params_dst->is_5g_pref_enabled = true;
1505 break;
1506 case REASON_ROAM_SET_SSID_ALLOWED:
Anurag Chouhan600c3a02016-03-01 10:33:54 +05301507 qdf_mem_set(&roam_params_dst->ssid_allowed_list, 0,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001508 sizeof(tSirMacSSid) * MAX_SSID_ALLOWED_LIST);
1509 roam_params_dst->num_ssid_allowed_list =
1510 roam_params_src.num_ssid_allowed_list;
1511 for (i = 0; i < roam_params_dst->num_ssid_allowed_list; i++) {
1512 roam_params_dst->ssid_allowed_list[i].length =
1513 roam_params_src.ssid_allowed_list[i].length;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05301514 qdf_mem_copy(roam_params_dst->ssid_allowed_list[i].ssId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001515 roam_params_src.ssid_allowed_list[i].ssId,
1516 roam_params_dst->ssid_allowed_list[i].length);
1517 }
1518 break;
1519 case REASON_ROAM_SET_FAVORED_BSSID:
Anurag Chouhan600c3a02016-03-01 10:33:54 +05301520 qdf_mem_set(&roam_params_dst->bssid_favored, 0,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001521 sizeof(tSirMacAddr) * MAX_BSSID_FAVORED);
1522 roam_params_dst->num_bssid_favored =
1523 roam_params_src.num_bssid_favored;
1524 for (i = 0; i < roam_params_dst->num_bssid_favored; i++) {
Anurag Chouhan600c3a02016-03-01 10:33:54 +05301525 qdf_mem_copy(&roam_params_dst->bssid_favored[i],
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001526 &roam_params_src.bssid_favored[i],
1527 sizeof(tSirMacAddr));
1528 roam_params_dst->bssid_favored_factor[i] =
1529 roam_params_src.bssid_favored_factor[i];
1530 }
1531 break;
1532 case REASON_ROAM_SET_BLACKLIST_BSSID:
Anurag Chouhan600c3a02016-03-01 10:33:54 +05301533 qdf_mem_set(&roam_params_dst->bssid_avoid_list, 0,
Anurag Chouhan6d760662016-02-20 16:05:43 +05301534 QDF_MAC_ADDR_SIZE * MAX_BSSID_AVOID_LIST);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001535 roam_params_dst->num_bssid_avoid_list =
1536 roam_params_src.num_bssid_avoid_list;
1537 for (i = 0; i < roam_params_dst->num_bssid_avoid_list; i++) {
Anurag Chouhanc5548422016-02-24 18:33:27 +05301538 qdf_copy_macaddr(&roam_params_dst->bssid_avoid_list[i],
Srinivas Girigowdab0532392015-11-24 11:50:16 -08001539 &roam_params_src.bssid_avoid_list[i]);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001540 }
1541 break;
1542 case REASON_ROAM_GOOD_RSSI_CHANGED:
1543 roam_params_dst->good_rssi_roam =
1544 roam_params_src.good_rssi_roam;
1545 break;
1546 default:
1547 break;
1548 }
1549 csr_roam_offload_scan(mac_ctx, session_id, ROAM_SCAN_OFFLOAD_UPDATE_CFG,
1550 update_param);
1551 return 0;
1552}
1553
1554#ifdef WLAN_FEATURE_GTK_OFFLOAD
Jeff Johnson49c02f92016-10-07 10:29:09 -07001555static void sme_process_get_gtk_info_rsp(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001556 tpSirGtkOffloadGetInfoRspParams
1557 pGtkOffloadGetInfoRsp)
1558{
1559 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
1560
1561 if (NULL == pMac) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301562 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_FATAL,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001563 "%s: pMac is null", __func__);
1564 return;
1565 }
1566 if (pMac->sme.gtk_offload_get_info_cb == NULL) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301567 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001568 "%s: HDD callback is null", __func__);
1569 return;
1570 }
1571 pMac->sme.gtk_offload_get_info_cb(
1572 pMac->sme.gtk_offload_get_info_cb_context,
1573 pGtkOffloadGetInfoRsp);
1574}
1575#endif
1576
1577/*--------------------------------------------------------------------------
1578
1579 \fn - sme_process_ready_to_suspend
1580 \brief - On getting ready to suspend indication, this function calls
1581 callback registered (HDD callbacks) with SME to inform
1582 ready to suspend indication.
1583
1584 \param hHal - Handle returned by mac_open.
1585 pReadyToSuspend - Parameter received along with ready to suspend
1586 indication from WMA.
1587
1588 \return None
1589
1590 \sa
1591
1592 --------------------------------------------------------------------------*/
Jeff Johnson49c02f92016-10-07 10:29:09 -07001593static void sme_process_ready_to_suspend(tHalHandle hHal,
1594 tpSirReadyToSuspendInd pReadyToSuspend)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001595{
1596 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
1597
1598 if (NULL == pMac) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301599 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_FATAL,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001600 "%s: pMac is null", __func__);
1601 return;
1602 }
1603
1604 if (NULL != pMac->readyToSuspendCallback) {
1605 pMac->readyToSuspendCallback(pMac->readyToSuspendContext,
1606 pReadyToSuspend->suspended);
1607 pMac->readyToSuspendCallback = NULL;
1608 }
1609}
1610
1611#ifdef WLAN_FEATURE_EXTWOW_SUPPORT
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001612
Krishna Kumaar Natarajand9131902015-10-19 11:52:47 -07001613/**
1614 * sme_process_ready_to_ext_wow() - inform ready to ExtWoW indication.
1615 * @hHal - Handle returned by mac_open.
1616 * @pReadyToExtWoW - Parameter received along with ready to Ext WoW
1617 * indication from WMA.
1618 *
1619 * On getting ready to Ext WoW indication, this function calls callback
1620 * registered (HDD callback)with SME to inform ready to ExtWoW indication.
1621 *
1622 * Return: None
1623 */
Jeff Johnson49c02f92016-10-07 10:29:09 -07001624static void sme_process_ready_to_ext_wow(tHalHandle hHal,
1625 tpSirReadyToExtWoWInd pReadyToExtWoW)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001626{
1627 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
1628
1629 if (NULL == pMac) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301630 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_FATAL,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001631 "%s: pMac is null", __func__);
1632 return;
1633 }
1634
1635 if (NULL != pMac->readyToExtWoWCallback) {
1636 pMac->readyToExtWoWCallback(pMac->readyToExtWoWContext,
1637 pReadyToExtWoW->status);
1638 pMac->readyToExtWoWCallback = NULL;
1639 pMac->readyToExtWoWContext = NULL;
1640 }
1641
1642}
1643#endif
1644
1645/* ---------------------------------------------------------------------------
1646 \fn sme_change_config_params
1647 \brief The SME API exposed for HDD to provide config params to SME during
1648 SMEs stop -> start sequence.
1649
1650 If HDD changed the domain that will cause a reset. This function will
1651 provide the new set of 11d information for the new domain. Currrently this
1652 API provides info regarding 11d only at reset but we can extend this for
1653 other params (PMC, QoS) which needs to be initialized again at reset.
1654
1655 This is a synchronous call
1656
1657 \param hHal - The handle returned by mac_open.
1658
1659 \Param
1660 pUpdateConfigParam - a pointer to a structure (tCsrUpdateConfigParam) that
1661 currently provides 11d related information like Country code,
1662 Regulatory domain, valid channel list, Tx power per channel, a
1663 list with active/passive scan allowed per valid channel.
1664
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301665 \return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001666 ---------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301667QDF_STATUS sme_change_config_params(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001668 tCsrUpdateConfigParam *pUpdateConfigParam)
1669{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301670 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001671 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
1672
1673 if (NULL == pUpdateConfigParam) {
1674 sms_log(pMac, LOGE,
1675 "Empty config param structure for SME, nothing to reset");
1676 return status;
1677 }
1678
1679 status = csr_change_config_params(pMac, pUpdateConfigParam);
1680
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301681 if (!QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001682 sms_log(pMac, LOGE, "csrUpdateConfigParam failed with status=%d",
1683 status);
1684 }
1685
1686 return status;
1687
1688}
1689
1690/*--------------------------------------------------------------------------
1691
1692 \brief sme_hdd_ready_ind() - SME sends eWNI_SME_SYS_READY_IND to PE to inform
1693 that the NIC is ready tio run.
1694
1695 The function is called by HDD at the end of initialization stage so PE/HAL can
1696 enable the NIC to running state.
1697
1698 This is a synchronous call
1699 \param hHal - The handle returned by mac_open.
1700
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301701 \return QDF_STATUS_SUCCESS - eWNI_SME_SYS_READY_IND is sent to PE
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001702 successfully.
1703
1704 Other status means SME failed to send the message to PE.
1705 \sa
1706
1707 --------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301708QDF_STATUS sme_hdd_ready_ind(tHalHandle hHal)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001709{
1710 tSirSmeReadyReq Msg;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301711 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001712 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
1713
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301714 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001715 TRACE_CODE_SME_RX_HDD_MSG_HDDREADYIND, NO_SESSION, 0));
1716 do {
1717
1718 Msg.messageType = eWNI_SME_SYS_READY_IND;
1719 Msg.length = sizeof(tSirSmeReadyReq);
1720 Msg.add_bssdescr_cb = csr_scan_process_single_bssdescr;
Varun Reddy Yeturud5939f82015-12-24 18:14:02 -08001721 Msg.csr_roam_synch_cb = csr_roam_synch_callback;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001722
1723
1724 if (eSIR_FAILURE != u_mac_post_ctrl_msg(hHal, (tSirMbMsg *) &Msg)) {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301725 status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001726 } else {
1727 sms_log(pMac, LOGE,
1728 "u_mac_post_ctrl_msg failed to send eWNI_SME_SYS_READY_IND");
1729 break;
1730 }
1731
1732 status = csr_ready(pMac);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301733 if (!QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001734 sms_log(pMac, LOGE,
1735 "csr_ready failed with status=%d",
1736 status);
1737 break;
1738 }
1739
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301740 if (QDF_STATUS_SUCCESS != rrm_ready(hHal)) {
1741 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001742 sms_log(pMac, LOGE, "rrm_ready failed");
1743 break;
1744 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001745 pMac->sme.state = SME_STATE_READY;
1746 } while (0);
1747
1748 return status;
1749}
1750
1751/*--------------------------------------------------------------------------
1752
1753 \brief sme_start() - Put all SME modules at ready state.
1754
1755 The function starts each module in SME, PMC, CSR, etc. . Upon
1756 successfully return, all modules are ready to run.
1757 This is a synchronous call
1758 \param hHal - The handle returned by mac_open.
1759
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301760 \return QDF_STATUS_SUCCESS - SME is ready.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001761
1762 Other status means SME is failed to start
1763 \sa
1764
1765 --------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301766QDF_STATUS sme_start(tHalHandle hHal)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001767{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301768 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001769 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
1770
1771 do {
1772 status = csr_start(pMac);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301773 if (!QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001774 sms_log(pMac, LOGE,
1775 "csr_start failed during smeStart with status=%d",
1776 status);
1777 break;
1778 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001779 pMac->sme.state = SME_STATE_START;
1780 } while (0);
1781
1782 return status;
1783}
1784
1785/**
1786 * sme_handle_scan_req() - Scan request handler
1787 * @mac_ctx: MAC global context
1788 * @msg: message buffer
1789 *
1790 * Scan request message from upper layer is handled as
1791 * part of this API
1792 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301793 * Return: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001794 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301795static QDF_STATUS sme_handle_scan_req(tpAniSirGlobal mac_ctx,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001796 void *msg)
1797{
1798 struct ani_scan_req *scan_msg;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301799 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001800 uint16_t session_id;
1801 csr_scan_completeCallback callback;
1802
1803 scan_msg = msg;
1804 session_id = scan_msg->session_id;
1805 callback = scan_msg->callback;
1806 status = csr_scan_request(mac_ctx, session_id,
1807 scan_msg->scan_param,
1808 callback, scan_msg->ctx);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301809 if (!QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001810 sms_log(mac_ctx, LOGE,
1811 FL("scan request failed. session_id %d"), session_id);
1812 }
1813 csr_scan_free_request(mac_ctx, scan_msg->scan_param);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05301814 qdf_mem_free(scan_msg->scan_param);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001815 return status;
1816}
1817
1818/**
1819 * sme_handle_roc_req() - Roc request handler
1820 * @mac_ctx: MAC global context
1821 * @msg: message buffer
1822 *
1823 * Roc request message from upper layer is handled as
1824 * part of this API
1825 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301826 * Return: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001827 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301828static QDF_STATUS sme_handle_roc_req(tHalHandle hal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001829 void *msg)
1830{
1831 struct ani_roc_req *roc_msg;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301832 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001833 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
1834 remainOnChanCallback callback;
1835
1836 if (msg == NULL) {
1837 sms_log(mac_ctx, LOGE, FL("ROC request is NULL"));
1838 return status;
1839 }
1840
1841 roc_msg = msg;
1842 callback = roc_msg->callback;
1843 status = p2p_remain_on_channel(hal, roc_msg->session_id,
1844 roc_msg->channel, roc_msg->duration, callback,
1845 roc_msg->ctx, roc_msg->is_p2pprobe_allowed,
1846 roc_msg->scan_id);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301847 if (!QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001848 sms_log(mac_ctx, LOGE,
1849 FL("scan request failed. session_id %d scan_id %d"),
1850 roc_msg->session_id, roc_msg->scan_id);
1851 }
1852 return status;
1853}
1854
1855#ifdef WLAN_FEATURE_11W
1856/*------------------------------------------------------------------
1857 *
1858 * Handle the unprotected management frame indication from LIM and
1859 * forward it to HDD.
1860 *
1861 *------------------------------------------------------------------*/
1862
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301863QDF_STATUS sme_unprotected_mgmt_frm_ind(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001864 tpSirSmeUnprotMgmtFrameInd pSmeMgmtFrm)
1865{
1866 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301867 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001868 tCsrRoamInfo pRoamInfo = { 0 };
1869 uint32_t SessionId = pSmeMgmtFrm->sessionId;
1870
1871 pRoamInfo.nFrameLength = pSmeMgmtFrm->frameLen;
1872 pRoamInfo.pbFrames = pSmeMgmtFrm->frameBuf;
1873 pRoamInfo.frameType = pSmeMgmtFrm->frameType;
1874
1875 /* forward the mgmt frame to HDD */
1876 csr_roam_call_callback(pMac, SessionId, &pRoamInfo, 0,
1877 eCSR_ROAM_UNPROT_MGMT_FRAME_IND, 0);
1878
1879 return status;
1880}
1881#endif
1882
1883/*------------------------------------------------------------------
1884 *
1885 * Handle the DFS Radar Event and indicate it to the SAP
1886 *
1887 *------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301888QDF_STATUS dfs_msg_processor(tpAniSirGlobal pMac, uint16_t msgType, void *pMsgBuf)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001889{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301890 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001891 tCsrRoamInfo roamInfo = { 0 };
1892 tSirSmeDfsEventInd *dfs_event;
1893 tSirSmeCSAIeTxCompleteRsp *csaIeTxCompleteRsp;
1894 uint32_t sessionId = 0;
1895 eRoamCmdStatus roamStatus;
1896 eCsrRoamResult roamResult;
1897 int i;
1898
1899 switch (msgType) {
1900 case eWNI_SME_DFS_RADAR_FOUND:
1901 {
1902 /* Radar found !! */
1903 dfs_event = (tSirSmeDfsEventInd *) pMsgBuf;
1904 if (NULL == dfs_event) {
1905 sms_log(pMac, LOGE,
1906 "%s: pMsg is NULL for eWNI_SME_DFS_RADAR_FOUND message",
1907 __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301908 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001909 }
1910 sessionId = dfs_event->sessionId;
1911 roamInfo.dfs_event.sessionId = sessionId;
1912 roamInfo.dfs_event.chan_list.nchannels =
1913 dfs_event->chan_list.nchannels;
1914 for (i = 0; i < dfs_event->chan_list.nchannels; i++) {
1915 roamInfo.dfs_event.chan_list.channels[i] =
1916 dfs_event->chan_list.channels[i];
1917 }
1918
1919 roamInfo.dfs_event.dfs_radar_status =
1920 dfs_event->dfs_radar_status;
1921 roamInfo.dfs_event.use_nol = dfs_event->use_nol;
1922
1923 roamStatus = eCSR_ROAM_DFS_RADAR_IND;
1924 roamResult = eCSR_ROAM_RESULT_DFS_RADAR_FOUND_IND;
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301925 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO_MED,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001926 "sapdfs: Radar indication event occurred");
1927 break;
1928 }
1929 case eWNI_SME_DFS_CSAIE_TX_COMPLETE_IND:
1930 {
1931 csaIeTxCompleteRsp =
1932 (tSirSmeCSAIeTxCompleteRsp *) pMsgBuf;
1933 if (NULL == csaIeTxCompleteRsp) {
1934 sms_log(pMac, LOGE,
1935 "%s: pMsg is NULL for eWNI_SME_DFS_CSAIE_TX_COMPLETE_IND",
1936 __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301937 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001938 }
1939 sessionId = csaIeTxCompleteRsp->sessionId;
1940 roamStatus = eCSR_ROAM_DFS_CHAN_SW_NOTIFY;
1941 roamResult = eCSR_ROAM_RESULT_DFS_CHANSW_UPDATE_SUCCESS;
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301942 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO_MED,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001943 "sapdfs: Received eWNI_SME_DFS_CSAIE_TX_COMPLETE_IND for session id [%d]",
1944 sessionId);
1945 break;
1946 }
1947 default:
1948 {
1949 sms_log(pMac, LOG1, "%s: Invalid DFS message = 0x%x",
1950 __func__, msgType);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301951 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001952 return status;
1953 }
1954 }
1955
1956 /* Indicate Radar Event to SAP */
1957 csr_roam_call_callback(pMac, sessionId, &roamInfo, 0,
1958 roamStatus, roamResult);
1959 return status;
1960}
1961
Abhishek Singh518323d2015-10-19 17:42:01 +05301962/**
1963 * sme_extended_change_channel_ind()- function to indicate ECSA
1964 * action frame is received in lim to SAP
1965 * @mac_ctx: pointer to global mac structure
1966 * @msg_buf: contain new channel and session id.
1967 *
1968 * This function is called to post ECSA action frame
1969 * receive event to SAP.
1970 *
1971 * Return: success if msg indicated to SAP else return failure
1972 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301973static QDF_STATUS sme_extended_change_channel_ind(tpAniSirGlobal mac_ctx,
Abhishek Singh518323d2015-10-19 17:42:01 +05301974 void *msg_buf)
1975{
1976 struct sir_sme_ext_cng_chan_ind *ext_chan_ind;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301977 QDF_STATUS status = QDF_STATUS_SUCCESS;
Abhishek Singh518323d2015-10-19 17:42:01 +05301978 uint32_t session_id = 0;
1979 tCsrRoamInfo roamInfo = {0};
1980 eRoamCmdStatus roam_status;
1981 eCsrRoamResult roam_result;
1982
1983
1984 ext_chan_ind = msg_buf;
1985 if (NULL == ext_chan_ind) {
1986 sms_log(mac_ctx, LOGE,
1987 FL("pMsg is NULL for eWNI_SME_EXT_CHANGE_CHANNEL_IND"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301988 return QDF_STATUS_E_FAILURE;
Abhishek Singh518323d2015-10-19 17:42:01 +05301989 }
1990 session_id = ext_chan_ind->session_id;
1991 roamInfo.target_channel = ext_chan_ind->new_channel;
1992 roam_status = eCSR_ROAM_EXT_CHG_CHNL_IND;
1993 roam_result = eCSR_ROAM_EXT_CHG_CHNL_UPDATE_IND;
1994 sms_log(mac_ctx, LOG1,
1995 FL("sapdfs: Received eWNI_SME_EXT_CHANGE_CHANNEL_IND for session id [%d]"),
1996 session_id);
1997
1998 /* Indicate Ext Channel Change event to SAP */
1999 csr_roam_call_callback(mac_ctx, session_id, &roamInfo, 0,
2000 roam_status, roam_result);
2001 return status;
2002}
2003
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08002004/**
2005 * sme_process_fw_mem_dump_rsp - process fw memory dump response from WMA
2006 *
2007 * @mac_ctx: pointer to MAC handle.
2008 * @msg: pointer to received SME msg.
2009 *
2010 * This function process the received SME message and calls the corresponding
2011 * callback which was already registered with SME.
2012 *
2013 * Return: None
2014 */
2015#ifdef WLAN_FEATURE_MEMDUMP
2016static void sme_process_fw_mem_dump_rsp(tpAniSirGlobal mac_ctx, cds_msg_t *msg)
2017{
2018 if (msg->bodyptr) {
2019 if (mac_ctx->sme.fw_dump_callback)
2020 mac_ctx->sme.fw_dump_callback(mac_ctx->hHdd,
2021 (struct fw_dump_rsp *) msg->bodyptr);
2022 qdf_mem_free(msg->bodyptr);
2023 }
2024}
2025#else
2026static void sme_process_fw_mem_dump_rsp(tpAniSirGlobal mac_ctx, cds_msg_t *msg)
2027{
2028}
2029#endif
2030
2031#ifdef FEATURE_WLAN_ESE
2032/**
2033 * sme_update_is_ese_feature_enabled() - enable/disable ESE support at runtime
2034 * @hHal: HAL handle
2035 * @sessionId: session id
2036 * @isEseIniFeatureEnabled: ese ini enabled
2037 *
2038 * It is used at in the REG_DYNAMIC_VARIABLE macro definition of
2039 * isEseIniFeatureEnabled. This is a synchronous call
2040 *
2041 * Return: QDF_STATUS enumeration
2042 */
2043QDF_STATUS sme_update_is_ese_feature_enabled(tHalHandle hHal,
2044 uint8_t sessionId, const bool isEseIniFeatureEnabled)
2045{
2046 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
2047
2048 if (pMac->roam.configParam.isEseIniFeatureEnabled ==
2049 isEseIniFeatureEnabled) {
2050 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO,
2051 "%s: ESE Mode is already enabled or disabled, nothing to do (returning) old(%d) new(%d)",
2052 __func__,
2053 pMac->roam.configParam.isEseIniFeatureEnabled,
2054 isEseIniFeatureEnabled);
2055 return QDF_STATUS_SUCCESS;
2056 }
2057
2058 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO,
2059 "%s: EseEnabled is changed from %d to %d", __func__,
2060 pMac->roam.configParam.isEseIniFeatureEnabled,
2061 isEseIniFeatureEnabled);
2062 pMac->roam.configParam.isEseIniFeatureEnabled = isEseIniFeatureEnabled;
Varun Reddy Yeturuff4feb02016-04-20 12:26:11 -07002063 csr_neighbor_roam_update_fast_roaming_enabled(
2064 pMac, sessionId, isEseIniFeatureEnabled);
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08002065
2066 if (true == isEseIniFeatureEnabled)
2067 sme_update_fast_transition_enabled(hHal, true);
2068
2069 if (pMac->roam.configParam.isRoamOffloadScanEnabled)
2070 csr_roam_offload_scan(pMac, sessionId,
2071 ROAM_SCAN_OFFLOAD_UPDATE_CFG,
2072 REASON_ESE_INI_CFG_CHANGED);
2073
2074 return QDF_STATUS_SUCCESS;
2075}
2076
2077/**
2078 * sme_set_plm_request() - set plm request
2079 * @hHal: HAL handle
2080 * @pPlmReq: Pointer to input plm request
2081 *
2082 * Return: QDF_STATUS enumeration
2083 */
2084QDF_STATUS sme_set_plm_request(tHalHandle hHal, tpSirPlmReq pPlmReq)
2085{
2086 QDF_STATUS status;
2087 bool ret = false;
2088 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
2089 uint8_t ch_list[WNI_CFG_VALID_CHANNEL_LIST] = { 0 };
2090 uint8_t count, valid_count = 0;
2091 cds_msg_t msg;
2092 tCsrRoamSession *pSession = CSR_GET_SESSION(pMac, pPlmReq->sessionId);
2093
2094 status = sme_acquire_global_lock(&pMac->sme);
2095 if (!QDF_IS_STATUS_SUCCESS(status))
2096 return status;
2097
2098 if (!pSession) {
2099 sms_log(pMac, LOGE, FL("session %d not found"),
2100 pPlmReq->sessionId);
2101 sme_release_global_lock(&pMac->sme);
2102 return QDF_STATUS_E_FAILURE;
2103 }
2104
2105 if (!pSession->sessionActive) {
2106 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
2107 FL("Invalid Sessionid"));
2108 sme_release_global_lock(&pMac->sme);
2109 return QDF_STATUS_E_FAILURE;
2110 }
2111
2112 if (!pPlmReq->enable)
2113 goto send_plm_start;
2114 /* validating channel numbers */
2115 for (count = 0; count < pPlmReq->plmNumCh; count++) {
2116 ret = csr_is_supported_channel(pMac, pPlmReq->plmChList[count]);
2117 if (ret && pPlmReq->plmChList[count] > 14) {
2118 if (CHANNEL_STATE_DFS == cds_get_channel_state(
2119 pPlmReq->plmChList[count])) {
2120 /* DFS channel is provided, no PLM bursts can be
2121 * transmitted. Ignoring these channels.
2122 */
2123 QDF_TRACE(QDF_MODULE_ID_SME,
2124 QDF_TRACE_LEVEL_INFO,
2125 FL("DFS channel %d ignored for PLM"),
2126 pPlmReq->plmChList[count]);
2127 continue;
2128 }
2129 } else if (!ret) {
2130 /* Not supported, ignore the channel */
2131 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO,
2132 FL("Unsupported channel %d ignored for PLM"),
2133 pPlmReq->plmChList[count]);
2134 continue;
2135 }
2136 ch_list[valid_count] = pPlmReq->plmChList[count];
2137 valid_count++;
2138 } /* End of for () */
2139
2140 /* Copying back the valid channel list to plm struct */
2141 qdf_mem_set((void *)pPlmReq->plmChList,
2142 pPlmReq->plmNumCh, 0);
2143 if (valid_count)
2144 qdf_mem_copy(pPlmReq->plmChList, ch_list,
2145 valid_count);
2146 /* All are invalid channels, FW need to send the PLM
2147 * report with "incapable" bit set.
2148 */
2149 pPlmReq->plmNumCh = valid_count;
2150
2151send_plm_start:
2152 /* PLM START */
2153 msg.type = WMA_SET_PLM_REQ;
2154 msg.reserved = 0;
2155 msg.bodyptr = pPlmReq;
2156
2157 if (!QDF_IS_STATUS_SUCCESS(cds_mq_post_message(QDF_MODULE_ID_WMA,
2158 &msg))) {
2159 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
2160 FL("Not able to post WMA_SET_PLM_REQ to WMA"));
2161 sme_release_global_lock(&pMac->sme);
2162 return QDF_STATUS_E_FAILURE;
2163 }
2164
2165 sme_release_global_lock(&pMac->sme);
2166 return status;
2167}
2168
2169/**
2170 * sme_tsm_ie_ind() - sme tsm ie indication
2171 * @hHal: HAL handle
2172 * @pSmeTsmIeInd: Pointer to tsm ie indication
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002173 *
2174 * Handle the tsm ie indication from LIM and forward it to HDD.
2175 *
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08002176 * Return: QDF_STATUS enumeration
2177 */
2178static QDF_STATUS sme_tsm_ie_ind(tHalHandle hHal, tSirSmeTsmIEInd *pSmeTsmIeInd)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002179{
2180 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302181 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002182 tCsrRoamInfo pRoamInfo = { 0 };
2183 uint32_t SessionId = pSmeTsmIeInd->sessionId;
2184 pRoamInfo.tsmIe.tsid = pSmeTsmIeInd->tsmIe.tsid;
2185 pRoamInfo.tsmIe.state = pSmeTsmIeInd->tsmIe.state;
2186 pRoamInfo.tsmIe.msmt_interval = pSmeTsmIeInd->tsmIe.msmt_interval;
2187 /* forward the tsm ie information to HDD */
2188 csr_roam_call_callback(pMac,
2189 SessionId, &pRoamInfo, 0, eCSR_ROAM_TSM_IE_IND, 0);
2190 return status;
2191}
2192
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08002193/**
2194 * sme_set_cckm_ie() - set cckm ie
2195 * @hHal: HAL handle
2196 * @sessionId: session id
2197 * @pCckmIe: Pointer to CCKM Ie
2198 * @cckmIeLen: Length of @pCckmIe
2199 *
2200 * Function to store the CCKM IE passed from supplicant and use
2201 * it while packing reassociation request.
2202 *
2203 * Return: QDF_STATUS enumeration
2204 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302205QDF_STATUS sme_set_cckm_ie(tHalHandle hHal, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002206 uint8_t *pCckmIe, uint8_t cckmIeLen)
2207{
2208 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302209 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002210 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302211 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002212 csr_set_cckm_ie(pMac, sessionId, pCckmIe, cckmIeLen);
2213 sme_release_global_lock(&pMac->sme);
2214 }
2215 return status;
2216}
2217
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08002218/**
2219 * sme_set_ese_beacon_request() - set ese beacon request
2220 * @hHal: HAL handle
2221 * @sessionId: session id
2222 * @pEseBcnReq: Ese beacon report
2223 *
2224 * function to set ESE beacon request parameters
2225 *
2226 * Return: QDF_STATUS enumeration
2227 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302228QDF_STATUS sme_set_ese_beacon_request(tHalHandle hHal, const uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002229 const tCsrEseBeaconReq *pEseBcnReq)
2230{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302231 QDF_STATUS status = eSIR_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002232 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
2233 tpSirBeaconReportReqInd pSmeBcnReportReq = NULL;
2234 tCsrEseBeaconReqParams *pBeaconReq = NULL;
2235 uint8_t counter = 0;
2236 tCsrRoamSession *pSession = CSR_GET_SESSION(pMac, sessionId);
2237 tpRrmSMEContext pSmeRrmContext = &pMac->rrm.rrmSmeContext;
2238
2239 if (pSmeRrmContext->eseBcnReqInProgress == true) {
2240 sms_log(pMac, LOGE,
2241 "A Beacon Report Req is already in progress");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302242 return QDF_STATUS_E_RESOURCES;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002243 }
2244
2245 /* Store the info in RRM context */
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302246 qdf_mem_copy(&pSmeRrmContext->eseBcnReqInfo, pEseBcnReq,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002247 sizeof(tCsrEseBeaconReq));
2248
2249 /* Prepare the request to send to SME. */
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302250 pSmeBcnReportReq = qdf_mem_malloc(sizeof(tSirBeaconReportReqInd));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002251 if (NULL == pSmeBcnReportReq) {
2252 sms_log(pMac, LOGP,
2253 "Memory Allocation Failure!!! ESE BcnReq Ind to SME");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302254 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002255 }
2256
2257 pSmeRrmContext->eseBcnReqInProgress = true;
2258
2259 sms_log(pMac, LOGE, "Sending Beacon Report Req to SME");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002260
2261 pSmeBcnReportReq->messageType = eWNI_SME_BEACON_REPORT_REQ_IND;
2262 pSmeBcnReportReq->length = sizeof(tSirBeaconReportReqInd);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302263 qdf_mem_copy(pSmeBcnReportReq->bssId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002264 pSession->connectedProfile.bssid.bytes,
2265 sizeof(tSirMacAddr));
2266 pSmeBcnReportReq->channelInfo.channelNum = 255;
2267 pSmeBcnReportReq->channelList.numChannels = pEseBcnReq->numBcnReqIe;
2268 pSmeBcnReportReq->msgSource = eRRM_MSG_SOURCE_ESE_UPLOAD;
2269
2270 for (counter = 0; counter < pEseBcnReq->numBcnReqIe; counter++) {
2271 pBeaconReq =
2272 (tCsrEseBeaconReqParams *) &pEseBcnReq->bcnReq[counter];
2273 pSmeBcnReportReq->fMeasurementtype[counter] =
2274 pBeaconReq->scanMode;
2275 pSmeBcnReportReq->measurementDuration[counter] =
2276 SYS_TU_TO_MS(pBeaconReq->measurementDuration);
2277 pSmeBcnReportReq->channelList.channelNumber[counter] =
2278 pBeaconReq->channel;
2279 }
2280
2281 status = sme_rrm_process_beacon_report_req_ind(pMac, pSmeBcnReportReq);
2282
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302283 if (status != QDF_STATUS_SUCCESS)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002284 pSmeRrmContext->eseBcnReqInProgress = false;
2285
Hanumanth Reddy Pothula7f7a2712016-09-07 18:44:47 +05302286 qdf_mem_free(pSmeBcnReportReq);
2287
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002288 return status;
2289}
2290
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08002291/**
2292 * sme_get_tsm_stats() - SME get tsm stats
2293 * @hHal: HAL handle
2294 * @callback: SME sends back the requested stats using the callback
2295 * @staId: The station ID for which the stats is requested for
2296 * @bssId: bssid
2297 * @pContext: user context to be passed back along with the callback
2298 * @p_cds_context: CDS context
2299 * @tid: Traffic id
2300 *
2301 * API register a callback to get TSM Stats.
2302 *
2303 * Return: QDF_STATUS enumeration
2304 */
2305QDF_STATUS sme_get_tsm_stats(tHalHandle hHal,
2306 tCsrTsmStatsCallback callback,
2307 uint8_t staId, struct qdf_mac_addr bssId,
2308 void *pContext, void *p_cds_context, uint8_t tid)
2309{
2310 QDF_STATUS status = QDF_STATUS_E_FAILURE;
2311 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
2312
2313 status = sme_acquire_global_lock(&pMac->sme);
2314 if (QDF_IS_STATUS_SUCCESS(status)) {
2315 status = csr_get_tsm_stats(pMac, callback,
2316 staId, bssId, pContext,
2317 p_cds_context, tid);
2318 sme_release_global_lock(&pMac->sme);
2319 }
2320 return status;
2321}
2322
2323/**
2324 * sme_set_ese_roam_scan_channel_list() - To set ese roam scan channel list
2325 * @hHal: pointer HAL handle returned by mac_open
2326 * @sessionId: sme session id
2327 * @pChannelList: Output channel list
2328 * @numChannels: Output number of channels
2329 *
2330 * This routine is called to set ese roam scan channel list.
2331 * This is a synchronous call
2332 *
2333 * Return: QDF_STATUS
2334 */
2335QDF_STATUS sme_set_ese_roam_scan_channel_list(tHalHandle hHal,
2336 uint8_t sessionId,
2337 uint8_t *pChannelList,
2338 uint8_t numChannels)
2339{
2340 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
2341 QDF_STATUS status = QDF_STATUS_SUCCESS;
2342 tpCsrNeighborRoamControlInfo pNeighborRoamInfo
2343 = &pMac->roam.neighborRoamInfo[sessionId];
2344 tpCsrChannelInfo curchnl_list_info
2345 = &pNeighborRoamInfo->roamChannelInfo.currentChannelListInfo;
2346 uint8_t oldChannelList[WNI_CFG_VALID_CHANNEL_LIST_LEN * 2] = { 0 };
2347 uint8_t newChannelList[128] = { 0 };
2348 uint8_t i = 0, j = 0;
2349
2350 status = sme_acquire_global_lock(&pMac->sme);
2351 if (!QDF_IS_STATUS_SUCCESS(status)) {
2352 if (pMac->roam.configParam.isRoamOffloadScanEnabled)
2353 csr_roam_offload_scan(pMac, sessionId,
2354 ROAM_SCAN_OFFLOAD_UPDATE_CFG,
2355 REASON_CHANNEL_LIST_CHANGED);
2356 return status;
2357 }
2358 if (NULL != curchnl_list_info->ChannelList) {
2359 for (i = 0; i < curchnl_list_info->numOfChannels; i++) {
2360 j += snprintf(oldChannelList + j,
2361 sizeof(oldChannelList) - j, "%d",
2362 curchnl_list_info->ChannelList[i]);
2363 }
2364 }
2365 status = csr_create_roam_scan_channel_list(pMac, sessionId,
2366 pChannelList, numChannels,
2367 csr_get_current_band(hHal));
2368 if (QDF_IS_STATUS_SUCCESS(status)) {
2369 if (NULL != curchnl_list_info->ChannelList) {
2370 j = 0;
2371 for (i = 0; i < curchnl_list_info->numOfChannels; i++) {
2372 j += snprintf(newChannelList + j,
2373 sizeof(newChannelList) - j, "%d",
2374 curchnl_list_info->ChannelList[i]);
2375 }
2376 }
2377 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
2378 "ESE roam scan chnl list successfully set to %s-old value is %s-roam state is %d",
2379 newChannelList, oldChannelList,
2380 pNeighborRoamInfo->neighborRoamState);
2381 }
2382 sme_release_global_lock(&pMac->sme);
2383 if (pMac->roam.configParam.isRoamOffloadScanEnabled)
2384 csr_roam_offload_scan(pMac, sessionId,
2385 ROAM_SCAN_OFFLOAD_UPDATE_CFG,
2386 REASON_CHANNEL_LIST_CHANGED);
2387 return status;
2388}
2389
2390#endif /* FEATURE_WLAN_ESE */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002391
Jeff Johnson49c02f92016-10-07 10:29:09 -07002392static
2393QDF_STATUS sme_ibss_peer_info_response_handler(tHalHandle hHal,
2394 tpSirIbssGetPeerInfoRspParams
2395 pIbssPeerInfoParams)
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08002396{
2397 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
2398
2399 if (NULL == pMac) {
2400 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_FATAL,
2401 "%s: pMac is null", __func__);
2402 return QDF_STATUS_E_FAILURE;
2403 }
2404 if (pMac->sme.peerInfoParams.peerInfoCbk == NULL) {
2405 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
2406 "%s: HDD callback is null", __func__);
2407 return QDF_STATUS_E_FAILURE;
2408 }
2409 pMac->sme.peerInfoParams.peerInfoCbk(pMac->sme.peerInfoParams.pUserData,
2410 &pIbssPeerInfoParams->
2411 ibssPeerInfoRspParams);
2412 return QDF_STATUS_SUCCESS;
2413}
2414
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002415/**
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002416 * sme_process_dual_mac_config_resp() - Process set Dual mac config response
2417 * @mac: Global MAC pointer
2418 * @msg: Dual mac config response
2419 *
2420 * Processes the dual mac configuration response and invokes the HDD callback
2421 * to process further
2422 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302423static QDF_STATUS sme_process_dual_mac_config_resp(tpAniSirGlobal mac,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002424 uint8_t *msg)
2425{
2426 tListElem *entry = NULL;
2427 tSmeCmd *command = NULL;
2428 bool found;
2429 dual_mac_cb callback = NULL;
2430 struct sir_dual_mac_config_resp *param;
2431
2432 param = (struct sir_dual_mac_config_resp *)msg;
2433 if (!param) {
2434 sms_log(mac, LOGE, FL("Dual mac config resp param is NULL"));
2435 /* Not returning. Need to check if active command list
2436 * needs to be freed
2437 */
2438 }
2439
2440 entry = csr_ll_peek_head(&mac->sme.smeCmdActiveList,
2441 LL_ACCESS_LOCK);
2442 if (!entry) {
2443 sms_log(mac, LOGE, FL("No cmd found in active list"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302444 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002445 }
2446
2447 command = GET_BASE_ADDR(entry, tSmeCmd, Link);
2448 if (!command) {
2449 sms_log(mac, LOGE, FL("Base address is NULL"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302450 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002451 }
2452
2453 if (e_sme_command_set_dual_mac_config != command->command) {
2454 sms_log(mac, LOGE, FL("Command mismatch!"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302455 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002456 }
2457
2458 callback = command->u.set_dual_mac_cmd.set_dual_mac_cb;
2459 if (callback) {
2460 if (!param) {
2461 sms_log(mac, LOGE,
2462 FL("Callback failed-Dual mac config is NULL"));
2463 } else {
2464 sms_log(mac, LOG1,
2465 FL("Calling HDD callback for Dual mac config"));
2466 callback(param->status,
2467 command->u.set_dual_mac_cmd.scan_config,
2468 command->u.set_dual_mac_cmd.fw_mode_config);
2469 }
2470 } else {
2471 sms_log(mac, LOGE, FL("Callback does not exist"));
2472 }
2473
2474 found = csr_ll_remove_entry(&mac->sme.smeCmdActiveList, entry,
2475 LL_ACCESS_LOCK);
2476 if (found)
2477 /* Now put this command back on the available command list */
2478 sme_release_command(mac, command);
2479
2480 sme_process_pending_queue(mac);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302481 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002482}
2483
Archana Ramachandrana20ef812015-11-13 16:12:13 -08002484/**
2485 * sme_process_antenna_mode_resp() - Process set antenna mode
2486 * response
2487 * @mac: Global MAC pointer
2488 * @msg: antenna mode response
2489 *
2490 * Processes the antenna mode response and invokes the HDD
2491 * callback to process further
2492 */
2493static QDF_STATUS sme_process_antenna_mode_resp(tpAniSirGlobal mac,
2494 uint8_t *msg)
2495{
2496 tListElem *entry;
2497 tSmeCmd *command;
2498 bool found;
2499 antenna_mode_cb callback;
2500 struct sir_antenna_mode_resp *param;
2501
2502 param = (struct sir_antenna_mode_resp *)msg;
2503 if (!param) {
2504 sms_log(mac, LOGE, FL("set antenna mode resp is NULL"));
2505 /* Not returning. Need to check if active command list
2506 * needs to be freed
2507 */
2508 }
2509
2510 entry = csr_ll_peek_head(&mac->sme.smeCmdActiveList,
2511 LL_ACCESS_LOCK);
2512 if (!entry) {
2513 sms_log(mac, LOGE, FL("No cmd found in active list"));
2514 return QDF_STATUS_E_FAILURE;
2515 }
2516
2517 command = GET_BASE_ADDR(entry, tSmeCmd, Link);
2518 if (!command) {
2519 sms_log(mac, LOGE, FL("Base address is NULL"));
2520 return QDF_STATUS_E_FAILURE;
2521 }
2522
2523 if (e_sme_command_set_antenna_mode != command->command) {
2524 sms_log(mac, LOGE, FL("Command mismatch!"));
2525 return QDF_STATUS_E_FAILURE;
2526 }
2527
2528 callback =
2529 command->u.set_antenna_mode_cmd.set_antenna_mode_resp;
2530 if (callback) {
2531 if (!param) {
2532 sms_log(mac, LOGE,
2533 FL("Set antenna mode call back is NULL"));
2534 } else {
2535 sms_log(mac, LOG1,
2536 FL("HDD callback for set antenna mode"));
2537 callback(param->status);
2538 }
2539 } else {
2540 sms_log(mac, LOGE, FL("Callback does not exist"));
2541 }
2542
2543 found = csr_ll_remove_entry(&mac->sme.smeCmdActiveList, entry,
2544 LL_ACCESS_LOCK);
2545 if (found)
2546 /* Now put this command back on the available command list */
2547 sme_release_command(mac, command);
2548
2549 sme_process_pending_queue(mac);
2550 return QDF_STATUS_SUCCESS;
2551}
2552
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002553/*--------------------------------------------------------------------------
2554
2555 \brief sme_process_msg() - The main message processor for SME.
2556
2557 The function is called by a message dispatcher when to process a message
2558 targeted for SME.
2559
2560 This is a synchronous call
2561 \param hHal - The handle returned by mac_open.
2562 \param pMsg - A pointer to a caller allocated object of tSirMsgQ.
2563
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302564 \return QDF_STATUS_SUCCESS - SME successfully process the message.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002565
2566 Other status means SME failed to process the message to HAL.
2567 \sa
2568
2569 --------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302570QDF_STATUS sme_process_msg(tHalHandle hHal, cds_msg_t *pMsg)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002571{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302572 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002573 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
2574
2575 if (pMsg == NULL) {
2576 sms_log(pMac, LOGE, "Empty message for SME");
2577 return status;
2578 }
2579 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302580 if (!QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002581 sms_log(pMac, LOGW, FL("Locking failed, bailing out"));
2582 if (pMsg->bodyptr)
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302583 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002584 return status;
2585 }
2586 if (!SME_IS_START(pMac)) {
2587 sms_log(pMac, LOGW, FL("message type %d in stop state ignored"),
2588 pMsg->type);
2589 if (pMsg->bodyptr)
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302590 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002591 goto release_lock;
2592 }
2593 switch (pMsg->type) {
2594#ifdef WLAN_FEATURE_ROAM_OFFLOAD
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002595 case eWNI_SME_HO_FAIL_IND:
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302596 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002597 FL("LFR3: Rcvd eWNI_SME_HO_FAIL_IND"));
2598 csr_process_ho_fail_ind(pMac, pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302599 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002600 break;
2601#endif
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002602 case WNI_CFG_SET_CNF:
2603 case WNI_CFG_DNLD_CNF:
2604 case WNI_CFG_GET_RSP:
2605 case WNI_CFG_ADD_GRP_ADDR_CNF:
2606 case WNI_CFG_DEL_GRP_ADDR_CNF:
2607 break;
2608 case eWNI_SME_ADDTS_RSP:
2609 case eWNI_SME_DELTS_RSP:
2610 case eWNI_SME_DELTS_IND:
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002611 case eWNI_SME_FT_AGGR_QOS_RSP:
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002612 /* QoS */
2613 if (pMsg->bodyptr) {
2614#ifndef WLAN_MDM_CODE_REDUCTION_OPT
2615 status = sme_qos_msg_processor(pMac, pMsg->type,
2616 pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302617 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002618#endif
2619 } else {
2620 sms_log(pMac, LOGE, FL("Empty message for %d"),
2621 pMsg->type);
2622 }
2623 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002624 case eWNI_SME_NEIGHBOR_REPORT_IND:
2625 case eWNI_SME_BEACON_REPORT_REQ_IND:
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002626 if (pMsg->bodyptr) {
2627 status = sme_rrm_msg_processor(pMac, pMsg->type,
2628 pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302629 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002630 } else {
2631 sms_log(pMac, LOGE, FL("Empty message for %d"),
2632 pMsg->type);
2633 }
2634 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002635 case eWNI_SME_ADD_STA_SELF_RSP:
2636 if (pMsg->bodyptr) {
2637 status = csr_process_add_sta_session_rsp(pMac,
2638 pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302639 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002640 } else {
2641 sms_log(pMac, LOGE, FL("Empty message for %d"),
2642 pMsg->type);
2643 }
2644 break;
2645 case eWNI_SME_DEL_STA_SELF_RSP:
2646 if (pMsg->bodyptr) {
2647 status = csr_process_del_sta_session_rsp(pMac,
2648 pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302649 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002650 } else {
2651 sms_log(pMac, LOGE, FL("Empty message for %d"),
2652 pMsg->type);
2653 }
2654 break;
2655 case eWNI_SME_REMAIN_ON_CHN_RSP:
2656 if (pMsg->bodyptr) {
2657 status = sme_remain_on_chn_rsp(pMac, pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302658 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002659 } else {
2660 sms_log(pMac, LOGE, FL("Empty message for %d"),
2661 pMsg->type);
2662 }
2663 break;
2664 case eWNI_SME_REMAIN_ON_CHN_RDY_IND:
2665 if (pMsg->bodyptr) {
2666 status = sme_remain_on_chn_ready(pMac, pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302667 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002668 } else {
2669 sms_log(pMac, LOGE, FL("Empty message for %d"),
2670 pMsg->type);
2671 }
2672 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002673#ifdef FEATURE_WLAN_SCAN_PNO
2674 case eWNI_SME_PREF_NETWORK_FOUND_IND:
Sreelakshmi Konamki6a065362016-05-31 16:05:01 +05302675 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_RX_WMA_MSG,
2676 NO_SESSION, pMsg->type));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002677 if (pMsg->bodyptr) {
2678 status = sme_preferred_network_found_ind((void *)pMac,
2679 pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302680 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002681 } else {
2682 sms_log(pMac, LOGE, FL("Empty message for %d"),
2683 pMsg->type);
2684 }
2685 break;
2686#endif /* FEATURE_WLAN_SCAN_PNO */
2687 case eWNI_SME_CHANGE_COUNTRY_CODE:
2688 if (pMsg->bodyptr) {
2689 status = sme_handle_change_country_code((void *)pMac,
2690 pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302691 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002692 } else {
2693 sms_log(pMac, LOGE, FL("Empty message for %d"),
2694 pMsg->type);
2695 }
2696 break;
2697 case eWNI_SME_GENERIC_CHANGE_COUNTRY_CODE:
2698 if (pMsg->bodyptr) {
2699 status = sme_handle_generic_change_country_code(
2700 (void *)pMac, pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302701 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002702 } else {
2703 sms_log(pMac, LOGE, FL("Empty message for %d"),
2704 pMsg->type);
2705 }
2706 break;
2707 case eWNI_SME_SCAN_CMD:
2708 if (pMsg->bodyptr) {
2709 status = sme_handle_scan_req(pMac, pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302710 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002711 } else {
2712 sms_log(pMac, LOGE, FL("Empty message for %d"),
2713 pMsg->type);
2714 }
2715 break;
2716 case eWNI_SME_ROC_CMD:
2717 if (pMsg->bodyptr) {
2718 status = sme_handle_roc_req(hHal, pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302719 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002720 } else {
2721 sms_log(pMac, LOGE, FL("Empty message for %d"),
2722 pMsg->type);
2723 }
2724 break;
2725#ifdef FEATURE_WLAN_TDLS
2726 /*
2727 * command rescived from PE, SME tdls msg processor shall be called
2728 * to process commands recieved from PE
2729 */
2730 case eWNI_SME_TDLS_SEND_MGMT_RSP:
2731 case eWNI_SME_TDLS_ADD_STA_RSP:
2732 case eWNI_SME_TDLS_DEL_STA_RSP:
2733 case eWNI_SME_TDLS_DEL_STA_IND:
2734 case eWNI_SME_TDLS_DEL_ALL_PEER_IND:
2735 case eWNI_SME_MGMT_FRM_TX_COMPLETION_IND:
2736 case eWNI_SME_TDLS_LINK_ESTABLISH_RSP:
2737 case eWNI_SME_TDLS_SHOULD_DISCOVER:
2738 case eWNI_SME_TDLS_SHOULD_TEARDOWN:
2739 case eWNI_SME_TDLS_PEER_DISCONNECTED:
2740 if (pMsg->bodyptr) {
2741 status = tdls_msg_processor(pMac, pMsg->type,
2742 pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302743 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002744 } else {
2745 sms_log(pMac, LOGE, FL("Empty message for %d"),
2746 pMsg->type);
2747 }
2748 break;
2749#endif
2750#ifdef WLAN_FEATURE_11W
2751 case eWNI_SME_UNPROT_MGMT_FRM_IND:
2752 if (pMsg->bodyptr) {
2753 sme_unprotected_mgmt_frm_ind(pMac, pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302754 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002755 } else {
2756 sms_log(pMac, LOGE, FL("Empty message for %d"),
2757 pMsg->type);
2758 }
2759 break;
2760#endif
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08002761#ifdef FEATURE_WLAN_ESE
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002762 case eWNI_SME_TSM_IE_IND:
2763 if (pMsg->bodyptr) {
2764 sme_tsm_ie_ind(pMac, pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302765 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002766 } else {
2767 sms_log(pMac, LOGE, FL("Empty message for %d"),
2768 pMsg->type);
2769 }
2770 break;
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08002771#endif /* FEATURE_WLAN_ESE */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002772 case eWNI_SME_ROAM_SCAN_OFFLOAD_RSP:
2773 status = csr_roam_offload_scan_rsp_hdlr((void *)pMac,
2774 pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302775 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002776 break;
2777#ifdef WLAN_FEATURE_GTK_OFFLOAD
2778 case eWNI_PMC_GTK_OFFLOAD_GETINFO_RSP:
Sreelakshmi Konamki6a065362016-05-31 16:05:01 +05302779 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_RX_WMA_MSG,
2780 NO_SESSION, pMsg->type));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002781 if (pMsg->bodyptr) {
2782 sme_process_get_gtk_info_rsp(pMac, pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302783 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002784 } else {
2785 sms_log(pMac, LOGE, FL("Empty message for %d"),
2786 pMsg->type);
2787 }
2788 break;
2789#endif
2790#ifdef FEATURE_WLAN_LPHB
2791 /* LPHB timeout indication arrived, send IND to client */
2792 case eWNI_SME_LPHB_IND:
Sreelakshmi Konamki6a065362016-05-31 16:05:01 +05302793 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_RX_WMA_MSG,
2794 NO_SESSION, pMsg->type));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002795 if (pMac->sme.pLphbIndCb)
2796 pMac->sme.pLphbIndCb(pMac->hHdd, pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302797 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002798 break;
2799#endif /* FEATURE_WLAN_LPHB */
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08002800 case eWNI_SME_IBSS_PEER_INFO_RSP:
2801 if (pMsg->bodyptr) {
Jeff Johnson49c02f92016-10-07 10:29:09 -07002802 sme_ibss_peer_info_response_handler(pMac,
2803 pMsg->bodyptr);
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08002804 qdf_mem_free(pMsg->bodyptr);
2805 } else {
2806 sms_log(pMac, LOGE, FL("Empty message for %d"),
2807 pMsg->type);
2808 }
2809 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002810 case eWNI_SME_READY_TO_SUSPEND_IND:
2811 if (pMsg->bodyptr) {
2812 sme_process_ready_to_suspend(pMac, pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302813 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002814 } else {
2815 sms_log(pMac, LOGE, FL("Empty message for %d"),
2816 pMsg->type);
2817 }
2818 break;
2819#ifdef WLAN_FEATURE_EXTWOW_SUPPORT
2820 case eWNI_SME_READY_TO_EXTWOW_IND:
2821 if (pMsg->bodyptr) {
Krishna Kumaar Natarajand9131902015-10-19 11:52:47 -07002822 sme_process_ready_to_ext_wow(pMac, pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302823 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002824 } else {
2825 sms_log(pMac, LOGE, FL("Empty message for %d"),
2826 pMsg->type);
2827 }
2828 break;
2829#endif
2830#ifdef FEATURE_WLAN_CH_AVOID
2831 /* channel avoid message arrived, send IND to client */
2832 case eWNI_SME_CH_AVOID_IND:
Sreelakshmi Konamki6a065362016-05-31 16:05:01 +05302833 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_RX_WMA_MSG,
2834 NO_SESSION, pMsg->type));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002835 if (pMac->sme.pChAvoidNotificationCb) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302836 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002837 FL("CH avoid notification"));
2838 pMac->sme.pChAvoidNotificationCb(pMac->hHdd,
2839 pMsg->bodyptr);
2840 }
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302841 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002842 break;
2843#endif /* FEATURE_WLAN_CH_AVOID */
2844#ifdef FEATURE_WLAN_AUTO_SHUTDOWN
2845 case eWNI_SME_AUTO_SHUTDOWN_IND:
2846 if (pMac->sme.pAutoShutdownNotificationCb) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302847 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002848 FL("Auto shutdown notification"));
2849 pMac->sme.pAutoShutdownNotificationCb();
2850 }
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302851 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002852 break;
2853#endif
2854 case eWNI_SME_DFS_RADAR_FOUND:
2855 case eWNI_SME_DFS_CSAIE_TX_COMPLETE_IND:
2856 status = dfs_msg_processor(pMac, pMsg->type, pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302857 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002858 break;
2859 case eWNI_SME_CHANNEL_CHANGE_RSP:
2860 if (pMsg->bodyptr) {
2861 status = sme_process_channel_change_resp(pMac,
2862 pMsg->type,
2863 pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302864 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002865 } else {
2866 sms_log(pMac, LOGE, FL("Empty message for %d"),
2867 pMsg->type);
2868 }
2869 break;
2870#ifdef WLAN_FEATURE_STATS_EXT
2871 case eWNI_SME_STATS_EXT_EVENT:
2872 if (pMsg->bodyptr) {
2873 status = sme_stats_ext_event(hHal, pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302874 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002875 } else {
2876 sms_log(pMac, LOGE, FL("Empty message for %d"),
2877 pMsg->type);
2878 }
2879 break;
2880#endif
2881 case eWNI_SME_LINK_SPEED_IND:
2882 if (pMac->sme.pLinkSpeedIndCb)
2883 pMac->sme.pLinkSpeedIndCb(pMsg->bodyptr,
2884 pMac->sme.pLinkSpeedCbContext);
2885 if (pMsg->bodyptr)
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302886 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002887 break;
2888 case eWNI_SME_CSA_OFFLOAD_EVENT:
2889 if (pMsg->bodyptr) {
2890 csr_scan_flush_bss_entry(pMac, pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302891 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002892 }
2893 break;
Manikandan Mohandcc21ba2016-03-15 14:31:56 -07002894 case eWNI_SME_TSF_EVENT:
2895 if (pMac->sme.get_tsf_cb) {
2896 pMac->sme.get_tsf_cb(pMac->sme.get_tsf_cxt,
2897 (struct stsf *)pMsg->bodyptr);
2898 }
2899 if (pMsg->bodyptr)
2900 qdf_mem_free(pMsg->bodyptr);
2901 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002902#ifdef WLAN_FEATURE_NAN
2903 case eWNI_SME_NAN_EVENT:
Sreelakshmi Konamki6a065362016-05-31 16:05:01 +05302904 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_RX_WMA_MSG,
2905 NO_SESSION, pMsg->type));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002906 if (pMsg->bodyptr) {
2907 sme_nan_event(hHal, pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302908 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002909 }
2910 break;
2911#endif /* WLAN_FEATURE_NAN */
2912 case eWNI_SME_LINK_STATUS_IND:
2913 {
2914 tAniGetLinkStatus *pLinkStatus =
2915 (tAniGetLinkStatus *) pMsg->bodyptr;
2916 if (pLinkStatus) {
2917 if (pMac->sme.linkStatusCallback) {
2918 pMac->sme.linkStatusCallback(
2919 pLinkStatus->linkStatus,
2920 pMac->sme.linkStatusContext);
2921 }
2922 pMac->sme.linkStatusCallback = NULL;
2923 pMac->sme.linkStatusContext = NULL;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302924 qdf_mem_free(pLinkStatus);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002925 }
2926 break;
2927 }
2928 case eWNI_SME_MSG_GET_TEMPERATURE_IND:
2929 if (pMac->sme.pGetTemperatureCb) {
2930 pMac->sme.pGetTemperatureCb(pMsg->bodyval,
2931 pMac->sme.pTemperatureCbContext);
2932 }
2933 break;
2934 case eWNI_SME_SNR_IND:
2935 {
2936 tAniGetSnrReq *pSnrReq = (tAniGetSnrReq *) pMsg->bodyptr;
2937 if (pSnrReq) {
2938 if (pSnrReq->snrCallback) {
2939 ((tCsrSnrCallback)
2940 (pSnrReq->snrCallback))
2941 (pSnrReq->snr, pSnrReq->staId,
2942 pSnrReq->pDevContext);
2943 }
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302944 qdf_mem_free(pSnrReq);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002945 }
2946 break;
2947 }
2948#ifdef FEATURE_WLAN_EXTSCAN
2949 case eWNI_SME_EXTSCAN_FULL_SCAN_RESULT_IND:
2950 if (pMac->sme.pExtScanIndCb)
2951 pMac->sme.pExtScanIndCb(pMac->hHdd,
2952 eSIR_EXTSCAN_FULL_SCAN_RESULT_IND,
2953 pMsg->bodyptr);
2954 else
2955 sms_log(pMac, LOGE,
2956 FL("callback not registered to process %d"),
2957 pMsg->type);
2958
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302959 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002960 break;
2961 case eWNI_SME_EPNO_NETWORK_FOUND_IND:
2962 if (pMac->sme.pExtScanIndCb)
2963 pMac->sme.pExtScanIndCb(pMac->hHdd,
2964 eSIR_EPNO_NETWORK_FOUND_IND,
2965 pMsg->bodyptr);
2966 else
2967 sms_log(pMac, LOGE,
2968 FL("callback not registered to process %d"),
2969 pMsg->type);
2970
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302971 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002972 break;
2973#endif
2974 case eWNI_SME_FW_DUMP_IND:
2975 sme_process_fw_mem_dump_rsp(pMac, pMsg);
2976 break;
2977 case eWNI_SME_SET_HW_MODE_RESP:
2978 if (pMsg->bodyptr) {
2979 status = sme_process_set_hw_mode_resp(pMac,
2980 pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302981 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002982 } else {
2983 sms_log(pMac, LOGE, FL("Empty message for %d"),
2984 pMsg->type);
2985 }
2986 break;
2987 case eWNI_SME_HW_MODE_TRANS_IND:
2988 if (pMsg->bodyptr) {
2989 status = sme_process_hw_mode_trans_ind(pMac,
2990 pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302991 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002992 } else {
2993 sms_log(pMac, LOGE, FL("Empty message for %d"),
2994 pMsg->type);
2995 }
2996 break;
2997 case eWNI_SME_NSS_UPDATE_RSP:
2998 if (pMsg->bodyptr) {
2999 status = sme_process_nss_update_resp(pMac,
3000 pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303001 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003002 } else {
3003 sms_log(pMac, LOGE, FL("Empty message for %d"),
3004 pMsg->type);
3005 }
3006 break;
3007 case eWNI_SME_OCB_SET_CONFIG_RSP:
3008 if (pMac->sme.ocb_set_config_callback) {
3009 pMac->sme.ocb_set_config_callback(
3010 pMac->sme.ocb_set_config_context,
3011 pMsg->bodyptr);
3012 } else {
3013 sms_log(pMac, LOGE, FL(
3014 "Message error. The callback is NULL."));
3015 }
3016 pMac->sme.ocb_set_config_callback = NULL;
3017 pMac->sme.ocb_set_config_context = NULL;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303018 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003019 break;
3020 case eWNI_SME_OCB_GET_TSF_TIMER_RSP:
3021 if (pMac->sme.ocb_get_tsf_timer_callback) {
3022 pMac->sme.ocb_get_tsf_timer_callback(
3023 pMac->sme.ocb_get_tsf_timer_context,
3024 pMsg->bodyptr);
3025 } else {
3026 sms_log(pMac, LOGE, FL(
3027 "Message error. The callback is NULL."));
3028 }
3029 pMac->sme.ocb_get_tsf_timer_callback = NULL;
3030 pMac->sme.ocb_get_tsf_timer_context = NULL;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303031 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003032 break;
3033 case eWNI_SME_DCC_GET_STATS_RSP:
3034 if (pMac->sme.dcc_get_stats_callback) {
3035 pMac->sme.dcc_get_stats_callback(
3036 pMac->sme.dcc_get_stats_context,
3037 pMsg->bodyptr);
3038 } else {
3039 sms_log(pMac, LOGE, FL(
3040 "Message error. The callback is NULL."));
3041 }
3042 pMac->sme.dcc_get_stats_callback = NULL;
3043 pMac->sme.dcc_get_stats_context = NULL;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303044 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003045 break;
3046 case eWNI_SME_DCC_UPDATE_NDL_RSP:
3047 if (pMac->sme.dcc_update_ndl_callback) {
3048 pMac->sme.dcc_update_ndl_callback(
3049 pMac->sme.dcc_update_ndl_context,
3050 pMsg->bodyptr);
3051 } else {
3052 sms_log(pMac, LOGE, FL(
3053 "Message error. The callback is NULL."));
3054 }
3055 pMac->sme.dcc_update_ndl_callback = NULL;
3056 pMac->sme.dcc_update_ndl_context = NULL;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303057 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003058 break;
3059 case eWNI_SME_DCC_STATS_EVENT:
3060 if (pMac->sme.dcc_stats_event_callback) {
3061 pMac->sme.dcc_stats_event_callback(
3062 pMac->sme.dcc_stats_event_context,
3063 pMsg->bodyptr);
3064 } else {
3065 sms_log(pMac, LOGE, FL(
3066 "Message error. The callback is NULL."));
3067 }
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303068 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003069 break;
3070 case eWNI_SME_SET_DUAL_MAC_CFG_RESP:
3071 if (pMsg->bodyptr) {
3072 status = sme_process_dual_mac_config_resp(pMac,
3073 pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303074 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003075 } else {
3076 sms_log(pMac, LOGE, FL("Empty message for %d"),
3077 pMsg->type);
3078 }
3079 case eWNI_SME_SET_THERMAL_LEVEL_IND:
3080 if (pMac->sme.set_thermal_level_cb)
3081 pMac->sme.set_thermal_level_cb(pMac->hHdd,
3082 pMsg->bodyval);
3083 break;
Abhishek Singh518323d2015-10-19 17:42:01 +05303084 case eWNI_SME_EXT_CHANGE_CHANNEL_IND:
3085 status = sme_extended_change_channel_ind(pMac, pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303086 qdf_mem_free(pMsg->bodyptr);
Abhishek Singh518323d2015-10-19 17:42:01 +05303087 break;
Archana Ramachandrana20ef812015-11-13 16:12:13 -08003088 case eWNI_SME_SET_ANTENNA_MODE_RESP:
3089 if (pMsg->bodyptr) {
3090 status = sme_process_antenna_mode_resp(pMac,
3091 pMsg->bodyptr);
3092 qdf_mem_free(pMsg->bodyptr);
3093 } else {
3094 sms_log(pMac, LOGE, FL("Empty message for %d"),
3095 pMsg->type);
3096 }
3097 break;
Deepak Dhamdhere0f076bd2016-06-02 11:29:21 -07003098 case eWNI_SME_NDP_CONFIRM_IND:
3099 case eWNI_SME_NDP_NEW_PEER_IND:
3100 case eWNI_SME_NDP_INITIATOR_RSP:
Abhishek Singh4fef7472016-06-06 11:36:03 -07003101 case eWNI_SME_NDP_INDICATION:
3102 case eWNI_SME_NDP_RESPONDER_RSP:
Naveen Rawatf28315c2016-06-29 18:06:02 -07003103 case eWNI_SME_NDP_END_RSP:
Deepak Dhamdherea6d2f4c2016-06-04 00:24:52 -07003104 case eWNI_SME_NDP_END_IND:
3105 case eWNI_SME_NDP_PEER_DEPARTED_IND:
Deepak Dhamdhere0f076bd2016-06-02 11:29:21 -07003106 sme_ndp_msg_processor(pMac, pMsg);
3107 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003108 default:
3109
3110 if ((pMsg->type >= eWNI_SME_MSG_TYPES_BEGIN)
3111 && (pMsg->type <= eWNI_SME_MSG_TYPES_END)) {
3112 /* CSR */
3113 if (pMsg->bodyptr) {
3114 status = csr_msg_processor(hHal, pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303115 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003116 } else {
3117 sms_log(pMac, LOGE, FL("Empty message for %d"),
3118 pMsg->type);
3119 }
3120 } else {
3121 sms_log(pMac, LOGW, FL("Unknown message type %d"),
3122 pMsg->type);
3123 if (pMsg->bodyptr)
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303124 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003125 }
3126 } /* switch */
3127release_lock:
3128 sme_release_global_lock(&pMac->sme);
3129 return status;
3130}
3131
3132/**
3133 * sme_process_nss_update_resp() - Process nss update response
3134 * @mac: Global MAC pointer
3135 * @msg: nss update response
3136 *
3137 * Processes the nss update response and invokes the HDD
3138 * callback to process further
3139 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303140QDF_STATUS sme_process_nss_update_resp(tpAniSirGlobal mac, uint8_t *msg)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003141{
3142 tListElem *entry = NULL;
3143 tSmeCmd *command = NULL;
3144 bool found;
3145 nss_update_cb callback = NULL;
3146 struct sir_beacon_tx_complete_rsp *param;
3147
3148 param = (struct sir_beacon_tx_complete_rsp *)msg;
3149 if (!param) {
3150 sms_log(mac, LOGE, FL("nss update resp param is NULL"));
3151 /* Not returning. Need to check if active command list
3152 * needs to be freed
3153 */
3154 }
3155
3156 entry = csr_ll_peek_head(&mac->sme.smeCmdActiveList,
3157 LL_ACCESS_LOCK);
3158 if (!entry) {
3159 sms_log(mac, LOGE, FL("No cmd found in active list"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303160 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003161 }
3162
3163 command = GET_BASE_ADDR(entry, tSmeCmd, Link);
3164 if (!command) {
3165 sms_log(mac, LOGE, FL("Base address is NULL"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303166 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003167 }
3168
3169 if (e_sme_command_nss_update != command->command) {
3170 sms_log(mac, LOGE, FL("Command mismatch!"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303171 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003172 }
3173
3174 callback = command->u.nss_update_cmd.nss_update_cb;
3175 if (callback) {
3176 if (!param) {
3177 sms_log(mac, LOGE,
3178 FL("Callback failed since nss update params is NULL"));
3179 } else {
3180 sms_log(mac, LOGE,
3181 FL("Calling HDD callback for nss update response"));
3182 callback(command->u.nss_update_cmd.context,
3183 param->tx_status,
3184 param->session_id,
Chandrasekaran, Manishekarce2172e2016-02-18 16:12:43 +05303185 command->u.nss_update_cmd.next_action,
3186 command->u.nss_update_cmd.reason);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003187 }
3188 } else {
3189 sms_log(mac, LOGE, FL("Callback does not exisit"));
3190 }
3191
3192 found = csr_ll_remove_entry(&mac->sme.smeCmdActiveList, entry,
3193 LL_ACCESS_LOCK);
3194 if (found) {
3195 /* Now put this command back on the avilable command list */
3196 sme_release_command(mac, command);
3197 }
3198 sme_process_pending_queue(mac);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303199 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003200}
3201
3202/* No need to hold the global lock here because this function can only be called */
3203/* after sme_stop. */
3204void sme_free_msg(tHalHandle hHal, cds_msg_t *pMsg)
3205{
3206 if (pMsg) {
3207 if (pMsg->bodyptr) {
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303208 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003209 }
3210 }
3211
3212}
3213
3214/*--------------------------------------------------------------------------
3215
3216 \brief sme_stop() - Stop all SME modules and put them at idle state
3217
3218 The function stops each module in SME, PMC, CSR, etc. . Upon
3219 return, all modules are at idle state ready to start.
3220
3221 This is a synchronous call
3222 \param hHal - The handle returned by mac_open
3223 \param tHalStopType - reason for stopping
3224
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303225 \return QDF_STATUS_SUCCESS - SME is stopped.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003226
3227 Other status means SME is failed to stop but caller should still
3228 consider SME is stopped.
3229 \sa
3230
3231 --------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303232QDF_STATUS sme_stop(tHalHandle hHal, tHalStopType stopType)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003233{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303234 QDF_STATUS status = QDF_STATUS_E_FAILURE;
3235 QDF_STATUS fail_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003236 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
3237
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003238 p2p_stop(hHal);
3239
3240 status = csr_stop(pMac, stopType);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303241 if (!QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003242 sms_log(pMac, LOGE,
3243 "csr_stop failed during smeStop with status=%d", status);
3244 fail_status = status;
3245 }
3246
3247 purge_sme_cmd_list(pMac);
3248
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303249 if (!QDF_IS_STATUS_SUCCESS(fail_status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003250 status = fail_status;
3251 }
3252
3253 pMac->sme.state = SME_STATE_STOP;
3254
3255 return status;
3256}
3257
3258/*--------------------------------------------------------------------------
3259
3260 \brief sme_close() - Release all SME modules and their resources.
3261
3262 The function release each module in SME, PMC, CSR, etc. . Upon
3263 return, all modules are at closed state.
3264
3265 No SME APIs can be involved after smeClose except smeOpen.
3266 smeClose must be called before mac_close.
3267 This is a synchronous call
3268 \param hHal - The handle returned by mac_open
3269
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303270 \return QDF_STATUS_SUCCESS - SME is successfully close.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003271
3272 Other status means SME is failed to be closed but caller still cannot
3273 call any other SME functions except smeOpen.
3274 \sa
3275
3276 --------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303277QDF_STATUS sme_close(tHalHandle hHal)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003278{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303279 QDF_STATUS status = QDF_STATUS_E_FAILURE;
3280 QDF_STATUS fail_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003281 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
3282
3283 if (!pMac)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303284 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003285
3286 /* Note: pSession will be invalid from here on, do not access */
3287 status = csr_close(pMac);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303288 if (!QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003289 sms_log(pMac, LOGE,
3290 "csr_close failed during sme close with status=%d",
3291 status);
3292 fail_status = status;
3293 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003294#ifndef WLAN_MDM_CODE_REDUCTION_OPT
3295 status = sme_qos_close(pMac);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303296 if (!QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003297 sms_log(pMac, LOGE,
3298 "Qos close failed during sme close with status=%d",
3299 status);
3300 fail_status = status;
3301 }
3302#endif
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003303 status = sme_ps_close(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303304 if (!QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003305 sms_log(pMac, LOGE,
3306 "sme_ps_close failed during smeClose status=%d",
3307 status);
3308 fail_status = status;
3309 }
3310
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003311 status = rrm_close(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303312 if (!QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003313 sms_log(pMac, LOGE,
3314 "RRM close failed during sme close with status=%d",
3315 status);
3316 fail_status = status;
3317 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003318
3319 sme_p2p_close(hHal);
3320
3321 free_sme_cmd_list(pMac);
3322
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303323 if (!QDF_IS_STATUS_SUCCESS
Anurag Chouhana37b5b72016-02-21 14:53:42 +05303324 (qdf_mutex_destroy(&pMac->sme.lkSmeGlobalLock))) {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303325 fail_status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003326 }
3327
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303328 if (!QDF_IS_STATUS_SUCCESS(fail_status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003329 status = fail_status;
3330 }
3331
3332 pMac->sme.state = SME_STATE_STOP;
3333
3334 return status;
3335}
3336
3337/**
Abhishek Singhc9941602016-08-09 16:06:22 +05303338 * sme_remove_bssid_from_scan_list() - wrapper to remove the bssid from
3339 * scan list
3340 * @hal: hal context.
3341 * @bssid: bssid to be removed
3342 *
3343 * This function remove the given bssid from scan list.
3344 *
3345 * Return: QDF status.
3346 */
3347QDF_STATUS sme_remove_bssid_from_scan_list(tHalHandle hal,
3348 tSirMacAddr bssid)
3349{
3350 QDF_STATUS status = QDF_STATUS_E_FAILURE;
3351 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
3352
3353 status = sme_acquire_global_lock(&mac_ctx->sme);
3354 if (QDF_IS_STATUS_SUCCESS(status)) {
3355 csr_remove_bssid_from_scan_list(mac_ctx, bssid);
3356 sme_release_global_lock(&mac_ctx->sme);
3357 }
3358
3359 return status;
3360}
3361
3362/**
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003363 * sme_scan_request() - wrapper function to Request a 11d or full scan from CSR.
3364 * @hal: hal global context
3365 * @session_id: session id
3366 * @scan_req: scan req
3367 * @callback: a callback function that scan calls upon finish, will not
3368 * be called if csr_scan_request returns error
3369 * @ctx: a pointer passed in for the callback
3370 *
3371 * This is a wrapper function to Request a 11d or full scan from CSR. This is
3372 * an asynchronous call
3373 *
3374 * Return: Status of operation
3375 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303376QDF_STATUS sme_scan_request(tHalHandle hal, uint8_t session_id,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003377 tCsrScanRequest *scan_req,
3378 csr_scan_completeCallback callback, void *ctx)
3379{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303380 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003381 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
3382 struct ani_scan_req *scan_msg;
3383 cds_msg_t msg;
3384 uint32_t scan_req_id, scan_count;
3385
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303386 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003387 TRACE_CODE_SME_RX_HDD_MSG_SCAN_REQ, session_id,
3388 scan_req->scanType));
Chandrasekaran, Manishekar2859de42016-02-11 16:17:38 +05303389
3390 if (!CSR_IS_SESSION_VALID(mac_ctx, session_id)) {
3391 sms_log(mac_ctx, LOGE, FL("Invalid session id:%d"),
3392 session_id);
3393 return status;
3394 }
3395
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003396 if (!mac_ctx->scan.fScanEnable) {
3397 sms_log(mac_ctx, LOGE, FL("fScanEnable false"));
3398 return status;
3399 }
3400
3401 scan_count = csr_ll_count(&mac_ctx->sme.smeScanCmdActiveList);
3402 if (scan_count >= mac_ctx->scan.max_scan_count) {
3403 sms_log(mac_ctx, LOGE, FL("Max scan reached"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303404 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003405 }
3406 wma_get_scan_id(&scan_req_id);
3407 scan_req->scan_id = scan_req_id;
3408
3409 status = sme_acquire_global_lock(&mac_ctx->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303410 if (!QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003411 sms_log(mac_ctx, LOGE, FL("Unable to acquire lock"));
3412 return status;
3413 }
3414 sms_log(mac_ctx, LOG1, FL(" called"));
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303415 scan_msg = qdf_mem_malloc(sizeof(struct ani_scan_req));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003416 if (NULL == scan_msg) {
3417 sms_log(mac_ctx, LOGE,
3418 " scan_req: failed to allocate mem for msg");
3419 sme_release_global_lock(&mac_ctx->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303420 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003421 }
3422 scan_msg->msg_type = eWNI_SME_SCAN_CMD;
3423 scan_msg->msg_len = (uint16_t) sizeof(struct ani_scan_req);
3424 scan_msg->session_id = session_id;
3425 scan_msg->callback = callback;
3426 scan_msg->ctx = ctx;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303427 scan_msg->scan_param = qdf_mem_malloc(sizeof(tCsrScanRequest));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003428 if (NULL == scan_msg->scan_param) {
3429 sms_log(mac_ctx, LOGE,
3430 "scan_req:failed to allocate mem for scanreq");
3431 sme_release_global_lock(&mac_ctx->sme);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303432 qdf_mem_free(scan_msg);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303433 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003434 }
3435 csr_scan_copy_request(mac_ctx, scan_msg->scan_param, scan_req);
3436 msg.type = eWNI_SME_SCAN_CMD;
3437 msg.bodyptr = scan_msg;
3438 msg.reserved = 0;
3439 msg.bodyval = 0;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303440 if (QDF_STATUS_SUCCESS !=
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003441 cds_mq_post_message(CDS_MQ_ID_SME, &msg)) {
3442 sms_log(mac_ctx, LOGE,
3443 " sme_scan_req failed to post msg");
3444 csr_scan_free_request(mac_ctx, scan_msg->scan_param);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303445 qdf_mem_free(scan_msg->scan_param);
3446 qdf_mem_free(scan_msg);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303447 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003448 }
3449 sme_release_global_lock(&mac_ctx->sme);
3450 return status;
3451}
3452
3453/* ---------------------------------------------------------------------------
3454 \fn sme_scan_get_result
3455 \brief a wrapper function to request scan results from CSR.
3456 This is a synchronous call
3457 \param pFilter - If pFilter is NULL, all cached results are returned
3458 \param phResult - an object for the result.
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303459 \return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003460 ---------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303461QDF_STATUS sme_scan_get_result(tHalHandle hHal, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003462 tCsrScanResultFilter *pFilter,
3463 tScanResultHandle *phResult)
3464{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303465 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003466 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
3467
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303468 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003469 TRACE_CODE_SME_RX_HDD_MSG_SCAN_GET_RESULTS, sessionId,
3470 0));
3471 sms_log(pMac, LOG2, FL("enter"));
3472 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303473 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003474 status = csr_scan_get_result(hHal, pFilter, phResult);
3475 sme_release_global_lock(&pMac->sme);
3476 }
3477 sms_log(pMac, LOG2, FL("exit status %d"), status);
3478
3479 return status;
3480}
3481
3482/**
3483 * sme_get_ap_channel_from_scan_cache() - a wrapper function to get AP's
3484 * channel id from CSR by filtering the
3485 * result which matches our roam profile.
3486 * @profile: SAP adapter
3487 * @ap_chnl_id: pointer to channel id of SAP. Fill the value after finding the
3488 * best ap from scan cache.
3489 *
3490 * This function is written to get AP's channel id from CSR by filtering
3491 * the result which matches our roam profile. This is a synchronous call.
3492 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303493 * Return: QDF_STATUS.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003494 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303495QDF_STATUS sme_get_ap_channel_from_scan_cache(tHalHandle hal_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003496 tCsrRoamProfile *profile,
3497 tScanResultHandle *scan_cache,
3498 uint8_t *ap_chnl_id)
3499{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303500 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003501 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal_handle);
3502 tCsrScanResultFilter *scan_filter = NULL;
3503 tScanResultHandle filtered_scan_result = NULL;
3504 tSirBssDescription first_ap_profile;
3505
3506 if (NULL == mac_ctx) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303507 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003508 FL("mac_ctx is NULL"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303509 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003510 }
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303511 scan_filter = qdf_mem_malloc(sizeof(tCsrScanResultFilter));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003512 if (NULL == scan_filter) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303513 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003514 FL("scan_filter mem alloc failed"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303515 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003516 } else {
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303517 qdf_mem_set(&first_ap_profile, sizeof(tSirBssDescription), 0);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003518
3519 if (NULL == profile) {
3520 scan_filter->EncryptionType.numEntries = 1;
3521 scan_filter->EncryptionType.encryptionType[0]
3522 = eCSR_ENCRYPT_TYPE_NONE;
3523 } else {
3524 /* Here is the profile we need to connect to */
3525 status = csr_roam_prepare_filter_from_profile(mac_ctx,
3526 profile,
3527 scan_filter);
3528 }
3529
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303530 if (QDF_STATUS_SUCCESS == status) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003531 /* Save the WPS info */
3532 if (NULL != profile) {
3533 scan_filter->bWPSAssociation =
3534 profile->bWPSAssociation;
3535 scan_filter->bOSENAssociation =
3536 profile->bOSENAssociation;
3537 } else {
3538 scan_filter->bWPSAssociation = 0;
3539 scan_filter->bOSENAssociation = 0;
3540 }
3541 } else {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303542 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003543 FL("Preparing the profile filter failed"));
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303544 qdf_mem_free(scan_filter);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303545 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003546 }
3547 }
3548 status = sme_acquire_global_lock(&mac_ctx->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303549 if (QDF_STATUS_SUCCESS == status) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003550 status = csr_scan_get_result(hal_handle, scan_filter,
3551 &filtered_scan_result);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303552 if (QDF_STATUS_SUCCESS == status) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003553 csr_get_bssdescr_from_scan_handle(filtered_scan_result,
3554 &first_ap_profile);
3555 *scan_cache = filtered_scan_result;
3556 if (0 != first_ap_profile.channelId) {
3557 *ap_chnl_id = first_ap_profile.channelId;
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303558 QDF_TRACE(QDF_MODULE_ID_SME,
3559 QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003560 FL("Found best AP & its on chnl[%d]"),
3561 first_ap_profile.channelId);
3562 } else {
3563 /*
3564 * This means scan result is empty
3565 * so set the channel to zero, caller should
3566 * take of zero channel id case.
3567 */
3568 *ap_chnl_id = 0;
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303569 QDF_TRACE(QDF_MODULE_ID_SME,
3570 QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003571 FL("Scan is empty, set chnl to 0"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303572 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003573 }
3574 } else {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303575 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003576 FL("Failed to get scan get result"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303577 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003578 }
3579 csr_free_scan_filter(mac_ctx, scan_filter);
3580 sme_release_global_lock(&mac_ctx->sme);
3581 } else {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303582 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003583 FL("Aquiring lock failed"));
Krunal Sonif9882222016-01-22 17:16:50 -08003584 csr_free_scan_filter(mac_ctx, scan_filter);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303585 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003586 }
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303587 qdf_mem_free(scan_filter);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003588 return status;
3589}
3590
3591/**
3592 * sme_store_joinreq_param() - This function will pass station's join
3593 * request to store to csr.
3594 * @hal_handle: pointer to hal context.
3595 * @profile: pointer to station's roam profile.
3596 * @scan_cache: pointer to station's scan cache.
3597 * @roam_id: reference to roam_id variable being passed.
3598 * @session_id: station's session id.
3599 *
3600 * This function will pass station's join request further down to csr
3601 * to store it. this stored parameter will be used later.
3602 *
3603 * Return: true or false based on function's overall success.
3604 **/
3605bool sme_store_joinreq_param(tHalHandle hal_handle,
3606 tCsrRoamProfile *profile,
3607 tScanResultHandle scan_cache,
3608 uint32_t *roam_id,
3609 uint32_t session_id)
3610{
3611 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal_handle);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303612 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003613 bool ret_status = true;
3614
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303615 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003616 TRACE_CODE_SME_RX_HDD_STORE_JOIN_REQ,
3617 session_id, 0));
3618 status = sme_acquire_global_lock(&mac_ctx->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303619 if (QDF_STATUS_SUCCESS == status) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003620 if (false == csr_store_joinreq_param(mac_ctx, profile,
3621 scan_cache, roam_id, session_id)) {
3622 ret_status = false;
3623 }
3624 sme_release_global_lock(&mac_ctx->sme);
3625 } else {
3626 ret_status = false;
3627 }
3628
3629 return ret_status;
3630}
3631
3632/**
3633 * sme_clear_joinreq_param() - This function will pass station's clear
3634 * the join request to csr.
3635 * @hal_handle: pointer to hal context.
3636 * @session_id: station's session id.
3637 *
3638 * This function will pass station's clear join request further down to csr
3639 * to cleanup.
3640 *
3641 * Return: true or false based on function's overall success.
3642 **/
3643bool sme_clear_joinreq_param(tHalHandle hal_handle,
3644 uint32_t session_id)
3645{
3646 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal_handle);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303647 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003648 bool ret_status = true;
3649
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303650 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003651 TRACE_CODE_SME_RX_HDD_CLEAR_JOIN_REQ,
3652 session_id, 0));
3653 status = sme_acquire_global_lock(&mac_ctx->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303654 if (QDF_STATUS_SUCCESS == status) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003655 if (false == csr_clear_joinreq_param(mac_ctx,
3656 session_id)) {
3657 ret_status = false;
3658 }
3659 sme_release_global_lock(&mac_ctx->sme);
3660 } else {
3661 ret_status = false;
3662 }
3663
3664 return ret_status;
3665}
3666
3667/**
3668 * sme_issue_stored_joinreq() - This function will issues station's stored
3669 * the join request to csr.
3670 * @hal_handle: pointer to hal context.
3671 * @roam_id: reference to roam_id variable being passed.
3672 * @session_id: station's session id.
3673 *
3674 * This function will issue station's stored join request further down to csr
3675 * to proceed forward.
3676 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303677 * Return: QDF_STATUS_SUCCESS or QDF_STATUS_E_FAILURE.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003678 **/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303679QDF_STATUS sme_issue_stored_joinreq(tHalHandle hal_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003680 uint32_t *roam_id,
3681 uint32_t session_id)
3682{
3683 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal_handle);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303684 QDF_STATUS status = QDF_STATUS_E_FAILURE;
3685 QDF_STATUS ret_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003686
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303687 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003688 TRACE_CODE_SME_RX_HDD_ISSUE_JOIN_REQ,
3689 session_id, 0));
3690 status = sme_acquire_global_lock(&mac_ctx->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303691 if (QDF_STATUS_SUCCESS == status) {
3692 if (QDF_STATUS_SUCCESS != csr_issue_stored_joinreq(mac_ctx,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003693 roam_id,
3694 session_id)) {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303695 ret_status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003696 }
3697 sme_release_global_lock(&mac_ctx->sme);
3698 } else {
3699 csr_clear_joinreq_param(mac_ctx, session_id);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303700 ret_status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003701 }
3702 return ret_status;
3703}
3704
3705/* ---------------------------------------------------------------------------
3706 \fn sme_scan_flush_result
3707 \brief a wrapper function to request CSR to clear scan results.
3708 This is a synchronous call
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303709 \return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003710 ---------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303711QDF_STATUS sme_scan_flush_result(tHalHandle hHal)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003712{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303713 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003714 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
3715
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303716 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003717 TRACE_CODE_SME_RX_HDD_MSG_SCAN_FLUSH_RESULTS,
3718 0, 0));
3719 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303720 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003721 status = csr_scan_flush_result(hHal);
3722 sme_release_global_lock(&pMac->sme);
3723 }
3724
3725 return status;
3726}
3727
3728/* ---------------------------------------------------------------------------
3729 \fn sme_filter_scan_results
3730 \brief a wrapper function to request CSR to clear scan results.
3731 This is a synchronous call
3732 \param tHalHandle - HAL context handle
3733 \param sessionId - session id
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303734 \return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003735 ---------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303736QDF_STATUS sme_filter_scan_results(tHalHandle hHal, uint8_t sessionId)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003737{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303738 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003739 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
3740
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303741 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003742 TRACE_CODE_SME_RX_HDD_MSG_SCAN_FLUSH_RESULTS,
3743 sessionId, 0));
3744 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303745 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003746 csr_scan_filter_results(pMac);
3747 sme_release_global_lock(&pMac->sme);
3748 }
3749
3750 return status;
3751}
3752
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303753QDF_STATUS sme_scan_flush_p2p_result(tHalHandle hHal, uint8_t sessionId)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003754{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303755 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003756 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
3757
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303758 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003759 TRACE_CODE_SME_RX_HDD_MSG_SCAN_FLUSH_P2PRESULTS,
3760 sessionId, 0));
3761 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303762 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003763 status = csr_scan_flush_selective_result(hHal, true);
3764 sme_release_global_lock(&pMac->sme);
3765 }
3766
3767 return status;
3768}
3769
3770/* ---------------------------------------------------------------------------
3771 \fn sme_scan_result_get_first
3772 \brief a wrapper function to request CSR to returns the first element of
3773 scan result.
3774 This is a synchronous call
3775 \param hScanResult - returned from csr_scan_get_result
3776 \return tCsrScanResultInfo * - NULL if no result
3777 ---------------------------------------------------------------------------*/
3778tCsrScanResultInfo *sme_scan_result_get_first(tHalHandle hHal,
3779 tScanResultHandle hScanResult)
3780{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303781 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003782 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
3783 tCsrScanResultInfo *pRet = NULL;
3784
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303785 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003786 TRACE_CODE_SME_RX_HDD_MSG_SCAN_RESULT_GETFIRST,
3787 NO_SESSION, 0));
3788 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303789 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003790 pRet = csr_scan_result_get_first(pMac, hScanResult);
3791 sme_release_global_lock(&pMac->sme);
3792 }
3793
3794 return pRet;
3795}
3796
3797/* ---------------------------------------------------------------------------
3798 \fn sme_scan_result_get_next
3799 \brief a wrapper function to request CSR to returns the next element of
3800 scan result. It can be called without calling csr_scan_result_get_first
3801 first
3802 This is a synchronous call
3803 \param hScanResult - returned from csr_scan_get_result
3804 \return Null if no result or reach the end
3805 ---------------------------------------------------------------------------*/
3806tCsrScanResultInfo *sme_scan_result_get_next(tHalHandle hHal,
3807 tScanResultHandle hScanResult)
3808{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303809 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003810 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
3811 tCsrScanResultInfo *pRet = NULL;
3812
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003813 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303814 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003815 pRet = csr_scan_result_get_next(pMac, hScanResult);
3816 sme_release_global_lock(&pMac->sme);
3817 }
3818
3819 return pRet;
3820}
3821
3822/* ---------------------------------------------------------------------------
3823 \fn sme_scan_result_purge
3824 \brief a wrapper function to request CSR to remove all items(tCsrScanResult)
3825 in the list and free memory for each item
3826 This is a synchronous call
3827 \param hScanResult - returned from csr_scan_get_result. hScanResult is
3828 considered gone by
3829 calling this function and even before this function reutrns.
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303830 \return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003831 ---------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303832QDF_STATUS sme_scan_result_purge(tHalHandle hHal, tScanResultHandle hScanResult)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003833{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303834 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003835 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
3836
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303837 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003838 TRACE_CODE_SME_RX_HDD_MSG_SCAN_RESULT_PURGE,
3839 NO_SESSION, 0));
3840 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303841 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003842 status = csr_scan_result_purge(hHal, hScanResult);
3843 sme_release_global_lock(&pMac->sme);
3844 }
3845
3846 return status;
3847}
3848
3849/* ---------------------------------------------------------------------------
3850 \fn sme_scan_get_pmkid_candidate_list
3851 \brief a wrapper function to return the PMKID candidate list
3852 This is a synchronous call
3853 \param pPmkidList - caller allocated buffer point to an array of
3854 tPmkidCandidateInfo
3855 \param pNumItems - pointer to a variable that has the number of
3856 tPmkidCandidateInfo allocated when retruning, this is
3857 either the number needed or number of items put into
3858 pPmkidList
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303859 \return QDF_STATUS - when fail, it usually means the buffer allocated is not
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003860 big enough and pNumItems
3861 has the number of tPmkidCandidateInfo.
3862 \Note: pNumItems is a number of tPmkidCandidateInfo,
3863 not sizeof(tPmkidCandidateInfo) * something
3864 ---------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303865QDF_STATUS sme_scan_get_pmkid_candidate_list(tHalHandle hHal, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003866 tPmkidCandidateInfo *pPmkidList,
3867 uint32_t *pNumItems)
3868{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303869 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003870 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
3871
3872 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303873 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003874 status =
3875 csr_scan_get_pmkid_candidate_list(pMac, sessionId,
3876 pPmkidList,
3877 pNumItems);
3878 sme_release_global_lock(&pMac->sme);
3879 }
3880
3881 return status;
3882}
3883
3884eCsrPhyMode sme_get_phy_mode(tHalHandle hHal)
3885{
3886 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
3887 return pMac->roam.configParam.phyMode;
3888}
3889
3890/* ---------------------------------------------------------------------------
3891 \fn sme_get_channel_bonding_mode5_g
3892 \brief get the channel bonding mode for 5G band
3893 \param hHal - HAL handle
3894 \return channel bonding mode for 5G
3895 ---------------------------------------------------------------------------*/
3896uint32_t sme_get_channel_bonding_mode5_g(tHalHandle hHal)
3897{
3898 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
3899 tSmeConfigParams smeConfig;
3900
3901 sme_get_config_param(pMac, &smeConfig);
3902
3903 return smeConfig.csrConfig.channelBondingMode5GHz;
3904}
3905
3906/* ---------------------------------------------------------------------------
3907 \fn sme_get_channel_bonding_mode24_g
3908 \brief get the channel bonding mode for 2.4G band
3909 \param hHal - HAL handle
3910 \return channel bonding mode for 2.4G
3911 ---------------------------------------------------------------------------*/
3912uint32_t sme_get_channel_bonding_mode24_g(tHalHandle hHal)
3913{
3914 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
3915 tSmeConfigParams smeConfig;
3916
3917 sme_get_config_param(pMac, &smeConfig);
3918
3919 return smeConfig.csrConfig.channelBondingMode24GHz;
3920}
3921
3922/* ---------------------------------------------------------------------------
3923 \fn sme_roam_connect
3924 \brief a wrapper function to request CSR to inititiate an association
3925 This is an asynchronous call.
3926 \param sessionId - the sessionId returned by sme_open_session.
3927 \param pProfile - description of the network to which to connect
3928 \param hBssListIn - a list of BSS descriptor to roam to. It is returned
3929 from csr_scan_get_result
3930 \param pRoamId - to get back the request ID
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303931 \return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003932 ---------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303933QDF_STATUS sme_roam_connect(tHalHandle hHal, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003934 tCsrRoamProfile *pProfile, uint32_t *pRoamId)
3935{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303936 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003937 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
3938
3939 if (!pMac) {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303940 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003941 }
3942
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303943 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003944 TRACE_CODE_SME_RX_HDD_MSG_CONNECT, sessionId, 0));
3945 sms_log(pMac, LOG2, FL("enter"));
3946 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303947 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003948 if (CSR_IS_SESSION_VALID(pMac, sessionId)) {
3949 status =
3950 csr_roam_connect(pMac, sessionId, pProfile,
3951 pRoamId);
3952 } else {
3953 sms_log(pMac, LOGE, FL("invalid sessionID %d"),
3954 sessionId);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303955 status = QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003956 }
3957 sme_release_global_lock(&pMac->sme);
3958 } else {
3959 sms_log(pMac, LOGE, FL("sme_acquire_global_lock failed"));
3960 }
3961
3962 return status;
3963}
3964
3965/* ---------------------------------------------------------------------------
3966
3967 \fn sme_set_phy_mode
3968
3969 \brief Changes the PhyMode.
3970
3971 \param hHal - The handle returned by mac_open.
3972
3973 \param phyMode new phyMode which is to set
3974
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303975 \return QDF_STATUS SUCCESS.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003976
3977 -------------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303978QDF_STATUS sme_set_phy_mode(tHalHandle hHal, eCsrPhyMode phyMode)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003979{
3980 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
3981
3982 if (NULL == pMac) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303983 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003984 "%s: invalid context", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303985 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003986 }
3987
3988 pMac->roam.configParam.phyMode = phyMode;
3989 pMac->roam.configParam.uCfgDot11Mode =
3990 csr_get_cfg_dot11_mode_from_csr_phy_mode(NULL,
3991 pMac->roam.configParam.phyMode,
3992 pMac->roam.configParam.
3993 ProprietaryRatesEnabled);
3994
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303995 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003996}
3997
3998/* ---------------------------------------------------------------------------
3999 \fn sme_roam_reassoc
4000 \brief a wrapper function to request CSR to inititiate a re-association
4001 \param pProfile - can be NULL to join the currently connected AP. In that
4002 case modProfileFields should carry the modified field(s) which could trigger
4003 reassoc
4004 \param modProfileFields - fields which are part of tCsrRoamConnectedProfile
4005 that might need modification dynamically once STA is up & running and this
4006 could trigger a reassoc
4007 \param pRoamId - to get back the request ID
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304008 \return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004009 -------------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304010QDF_STATUS sme_roam_reassoc(tHalHandle hHal, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004011 tCsrRoamProfile *pProfile,
4012 tCsrRoamModifyProfileFields modProfileFields,
4013 uint32_t *pRoamId, bool fForce)
4014{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304015 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004016 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
4017
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05304018 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004019 TRACE_CODE_SME_RX_HDD_ROAM_REASSOC, sessionId, 0));
4020 sms_log(pMac, LOG2, FL("enter"));
4021 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304022 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004023 if (CSR_IS_SESSION_VALID(pMac, sessionId)) {
4024 if ((NULL == pProfile) && (fForce == 1)) {
4025 status =
4026 csr_reassoc(pMac, sessionId,
4027 &modProfileFields, pRoamId,
4028 fForce);
4029 } else {
4030 status =
4031 csr_roam_reassoc(pMac, sessionId, pProfile,
4032 modProfileFields, pRoamId);
4033 }
4034 } else {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304035 status = QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004036 }
4037 sme_release_global_lock(&pMac->sme);
4038 }
4039
4040 return status;
4041}
4042
4043/* ---------------------------------------------------------------------------
4044 \fn sme_roam_connect_to_last_profile
4045 \brief a wrapper function to request CSR to disconnect and reconnect with
4046 the same profile
4047 This is an asynchronous call.
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304048 \return QDF_STATUS. It returns fail if currently connected
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004049 ---------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304050QDF_STATUS sme_roam_connect_to_last_profile(tHalHandle hHal, uint8_t sessionId)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004051{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304052 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004053 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
4054
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05304055 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004056 TRACE_CODE_SME_RX_HDD_ROAM_GET_CONNECTPROFILE,
4057 sessionId, 0));
4058 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304059 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004060 if (CSR_IS_SESSION_VALID(pMac, sessionId)) {
4061 status = csr_roam_connect_to_last_profile(pMac, sessionId);
4062 } else {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304063 status = QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004064 }
4065 sme_release_global_lock(&pMac->sme);
4066 }
4067
4068 return status;
4069}
4070
4071/* ---------------------------------------------------------------------------
4072 \fn sme_roam_disconnect
4073 \brief a wrapper function to request CSR to disconnect from a network
4074 This is an asynchronous call.
4075 \param reason -- To indicate the reason for disconnecting. Currently, only
4076 eCSR_DISCONNECT_REASON_MIC_ERROR is meanful.
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304077 \return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004078 ---------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304079QDF_STATUS sme_roam_disconnect(tHalHandle hHal, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004080 eCsrRoamDisconnectReason reason)
4081{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304082 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004083 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
4084
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05304085 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004086 TRACE_CODE_SME_RX_HDD_ROAM_DISCONNECT, sessionId,
4087 reason));
4088 sms_log(pMac, LOG2, FL("enter"));
4089 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304090 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004091 if (CSR_IS_SESSION_VALID(pMac, sessionId)) {
4092 status = csr_roam_disconnect(pMac, sessionId, reason);
4093 } else {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304094 status = QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004095 }
4096 sme_release_global_lock(&pMac->sme);
4097 }
4098
4099 return status;
4100}
4101
Abhishek Singhca408032016-09-13 15:26:12 +05304102/* sme_dhcp_done_ind() - send dhcp done ind
4103 * @hal: hal context
4104 * @session_id: session id
4105 *
4106 * Return: void.
4107 */
4108void sme_dhcp_done_ind(tHalHandle hal, uint8_t session_id)
4109{
4110 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
4111 tCsrRoamSession *session;
4112
4113 if (!mac_ctx)
4114 return;
4115
4116 session = CSR_GET_SESSION(mac_ctx, session_id);
4117 if (!session) {
4118 sms_log(mac_ctx, LOGE,
4119 FL("session %d not found"), session_id);
4120 return;
4121 }
4122 session->dhcp_done = true;
4123}
4124
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004125/* ---------------------------------------------------------------------------
4126 \fn sme_roam_stop_bss
4127 \brief To stop BSS for Soft AP. This is an asynchronous API.
4128 \param hHal - Global structure
4129 \param sessionId - sessionId of SoftAP
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304130 \return QDF_STATUS SUCCESS Roam callback will be called to indicate actual results
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004131 -------------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304132QDF_STATUS sme_roam_stop_bss(tHalHandle hHal, uint8_t sessionId)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004133{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304134 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004135 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
4136
4137 sms_log(pMac, LOG2, FL("enter"));
4138 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304139 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004140 if (CSR_IS_SESSION_VALID(pMac, sessionId)) {
4141 status = csr_roam_issue_stop_bss_cmd(pMac, sessionId, true);
4142 } else {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304143 status = QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004144 }
4145 sme_release_global_lock(&pMac->sme);
4146 }
4147
4148 return status;
4149}
4150
Deepthi Gowrib3bfefd2016-09-13 15:14:34 +05304151/**
4152 * sme_roam_disconnect_sta() - disassociate a station
4153 * @hHal: Global structure
4154 * @sessionId: SessionId of SoftAP
4155 * @p_del_sta_params: Pointer to parameters of the station to disassoc
4156 *
4157 * To disassociate a station. This is an asynchronous API.
4158 *
4159 * Return: QDF_STATUS_SUCCESS on success.Roam callback will
4160 * be called to indicate actual result.
4161 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304162QDF_STATUS sme_roam_disconnect_sta(tHalHandle hHal, uint8_t sessionId,
Deepthi Gowrib3bfefd2016-09-13 15:14:34 +05304163 struct tagCsrDelStaParams *p_del_sta_params)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004164{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304165 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004166 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
4167
4168 if (NULL == pMac) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05304169 QDF_ASSERT(0);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004170 return status;
4171 }
4172
4173 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304174 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004175 if (CSR_IS_SESSION_VALID(pMac, sessionId)) {
4176 status = csr_roam_issue_disassociate_sta_cmd(pMac,
Deepthi Gowrib3bfefd2016-09-13 15:14:34 +05304177 sessionId, p_del_sta_params);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004178 } else {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304179 status = QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004180 }
4181 sme_release_global_lock(&pMac->sme);
4182 }
4183
4184 return status;
4185}
4186
4187/**
4188 * sme_roam_deauth_sta() - deauthenticate a station
4189 * @hHal: Global structure
4190 * @sessionId: SessionId of SoftAP
4191 * @pDelStaParams: Pointer to parameters of the station to deauthenticate
4192 *
4193 * To disassociate a station. This is an asynchronous API.
4194 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304195 * Return: QDF_STATUS_SUCCESS on success or another QDF_STATUS error
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004196 * code on error. Roam callback will be called to indicate actual
4197 * result
4198 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304199QDF_STATUS sme_roam_deauth_sta(tHalHandle hHal, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004200 struct tagCsrDelStaParams *pDelStaParams)
4201{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304202 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004203 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
4204
4205 if (NULL == pMac) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05304206 QDF_ASSERT(0);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004207 return status;
4208 }
4209
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05304210 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Sreelakshmi Konamki6744cff2015-09-07 12:10:39 +05304211 TRACE_CODE_SME_RX_HDD_MSG_DEAUTH_STA,
4212 sessionId, pDelStaParams->reason_code));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004213 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304214 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004215 if (CSR_IS_SESSION_VALID(pMac, sessionId)) {
4216 status =
4217 csr_roam_issue_deauth_sta_cmd(pMac, sessionId,
4218 pDelStaParams);
4219 } else {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304220 status = QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004221 }
4222 sme_release_global_lock(&pMac->sme);
4223 }
4224
4225 return status;
4226}
4227
4228/* ---------------------------------------------------------------------------
4229 \fn sme_roam_tkip_counter_measures
4230 \brief To start or stop TKIP counter measures. This is an asynchronous API.
4231 \param sessionId - sessionId of SoftAP
4232 \param pPeerMacAddr - Caller allocated memory filled with peer MAC address (6 bytes)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304233 \return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004234 -------------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304235QDF_STATUS sme_roam_tkip_counter_measures(tHalHandle hHal, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004236 bool bEnable)
4237{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304238 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004239 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
4240
4241 if (NULL == pMac) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05304242 QDF_ASSERT(0);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004243 return status;
4244 }
4245
4246 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304247 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004248 if (CSR_IS_SESSION_VALID(pMac, sessionId)) {
4249 status =
4250 csr_roam_issue_tkip_counter_measures(pMac, sessionId,
4251 bEnable);
4252 } else {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304253 status = QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004254 }
4255 sme_release_global_lock(&pMac->sme);
4256 }
4257
4258 return status;
4259}
4260
4261/* ---------------------------------------------------------------------------
4262 \fn sme_roam_get_associated_stas
4263 \brief To probe the list of associated stations from various modules
4264 of CORE stack.
4265 \This is an asynchronous API.
4266 \param sessionId - sessionId of SoftAP
4267 \param modId - Module from whom list of associtated stations is
4268 to be probed. If an invalid module is passed then
Anurag Chouhan6d760662016-02-20 16:05:43 +05304269 by default QDF_MODULE_ID_PE will be probed.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004270 \param pUsrContext - Opaque HDD context
4271 \param pfnSapEventCallback - Sap event callback in HDD
4272 \param pAssocBuf - Caller allocated memory to be filled with associatd
4273 stations info
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304274 \return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004275 -------------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304276QDF_STATUS sme_roam_get_associated_stas(tHalHandle hHal, uint8_t sessionId,
Anurag Chouhan6d760662016-02-20 16:05:43 +05304277 QDF_MODULE_ID modId, void *pUsrContext,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004278 void *pfnSapEventCallback,
4279 uint8_t *pAssocStasBuf)
4280{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304281 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004282 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
4283
4284 if (NULL == pMac) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05304285 QDF_ASSERT(0);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004286 return status;
4287 }
4288
4289 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304290 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004291 if (CSR_IS_SESSION_VALID(pMac, sessionId)) {
4292 status =
4293 csr_roam_get_associated_stas(pMac, sessionId, modId,
4294 pUsrContext,
4295 pfnSapEventCallback,
4296 pAssocStasBuf);
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
4306/* ---------------------------------------------------------------------------
4307 \fn sme_roam_get_wps_session_overlap
4308 \brief To get the WPS PBC session overlap information.
4309 \This is an asynchronous API.
4310 \param sessionId - sessionId of SoftAP
4311 \param pUsrContext - Opaque HDD context
4312 \param pfnSapEventCallback - Sap event callback in HDD
4313 \pRemoveMac - pointer to Mac address which needs to be removed from session
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304314 \return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004315 -------------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304316QDF_STATUS sme_roam_get_wps_session_overlap(tHalHandle hHal, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004317 void *pUsrContext, void
4318 *pfnSapEventCallback,
Anurag Chouhan6d760662016-02-20 16:05:43 +05304319 struct qdf_mac_addr pRemoveMac)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004320{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304321 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004322 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
4323
4324 if (NULL == pMac) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05304325 QDF_ASSERT(0);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004326 return status;
4327 }
4328
4329 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304330 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004331 if (CSR_IS_SESSION_VALID(pMac, sessionId)) {
4332 status =
4333 csr_roam_get_wps_session_overlap(pMac, sessionId,
4334 pUsrContext,
4335 pfnSapEventCallback,
4336 pRemoveMac);
4337 } else {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304338 status = QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004339 }
4340 sme_release_global_lock(&pMac->sme);
4341 }
4342
4343 return status;
4344}
4345
4346/* ---------------------------------------------------------------------------
4347 \fn sme_roam_get_connect_state
4348 \brief a wrapper function to request CSR to return the current connect state
4349 of Roaming
4350 This is a synchronous call.
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304351 \return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004352 ---------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304353QDF_STATUS sme_roam_get_connect_state(tHalHandle hHal, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004354 eCsrConnectState *pState)
4355{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304356 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004357 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
4358
4359 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304360 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004361 if (CSR_IS_SESSION_VALID(pMac, sessionId)) {
4362 status =
4363 csr_roam_get_connect_state(pMac, sessionId, pState);
4364 } else {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304365 status = QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004366 }
4367 sme_release_global_lock(&pMac->sme);
4368 }
4369
4370 return status;
4371}
4372
4373/* ---------------------------------------------------------------------------
4374 \fn sme_roam_get_connect_profile
4375 \brief a wrapper function to request CSR to return the current connect
4376 profile. Caller must call csr_roam_free_connect_profile after it is done
4377 and before reuse for another csr_roam_get_connect_profile call.
4378 This is a synchronous call.
4379 \param pProfile - pointer to a caller allocated structure
4380 tCsrRoamConnectedProfile
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304381 \return QDF_STATUS. Failure if not connected
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004382 ---------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304383QDF_STATUS sme_roam_get_connect_profile(tHalHandle hHal, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004384 tCsrRoamConnectedProfile *pProfile)
4385{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304386 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004387 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
4388
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05304389 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004390 TRACE_CODE_SME_RX_HDD_ROAM_GET_CONNECTPROFILE,
4391 sessionId, 0));
4392 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304393 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004394 if (CSR_IS_SESSION_VALID(pMac, sessionId)) {
4395 status =
4396 csr_roam_get_connect_profile(pMac, sessionId, pProfile);
4397 } else {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304398 status = QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004399 }
4400 sme_release_global_lock(&pMac->sme);
4401 }
4402
4403 return status;
4404}
4405
Naveen Rawatdf0a7e72016-01-06 18:35:53 -08004406/**
4407 * sme_roam_free_connect_profile - a wrapper function to request CSR to free and
4408 * reinitialize the profile returned previously by csr_roam_get_connect_profile.
4409 *
4410 * @profile - pointer to a caller allocated structure tCsrRoamConnectedProfile
4411 *
4412 * Return: none
4413 */
4414void sme_roam_free_connect_profile(tCsrRoamConnectedProfile *profile)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004415{
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05304416 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004417 TRACE_CODE_SME_RX_HDD_ROAM_FREE_CONNECTPROFILE,
4418 NO_SESSION, 0));
Naveen Rawatdf0a7e72016-01-06 18:35:53 -08004419 csr_roam_free_connect_profile(profile);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004420}
4421
4422/* ---------------------------------------------------------------------------
4423 \fn sme_roam_set_pmkid_cache
4424 \brief a wrapper function to request CSR to return the PMKID candidate list
4425 This is a synchronous call.
4426 \param pPMKIDCache - caller allocated buffer point to an array of
4427 tPmkidCacheInfo
4428 \param numItems - a variable that has the number of tPmkidCacheInfo
4429 allocated when retruning, this is either the number needed
4430 or number of items put into pPMKIDCache
4431 \param update_entire_cache - this bool value specifies if the entire pmkid
4432 cache should be overwritten or should it be
4433 updated entry by entry.
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304434 \return QDF_STATUS - when fail, it usually means the buffer allocated is not
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004435 big enough and pNumItems has the number of
4436 tPmkidCacheInfo.
4437 \Note: pNumItems is a number of tPmkidCacheInfo,
4438 not sizeof(tPmkidCacheInfo) * something
4439 ---------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304440QDF_STATUS sme_roam_set_pmkid_cache(tHalHandle hHal, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004441 tPmkidCacheInfo *pPMKIDCache,
4442 uint32_t numItems, bool update_entire_cache)
4443{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304444 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004445 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
4446
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05304447 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004448 TRACE_CODE_SME_RX_HDD_ROAM_SET_PMKIDCACHE, sessionId,
4449 numItems));
4450 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304451 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004452 if (CSR_IS_SESSION_VALID(pMac, sessionId)) {
4453 status =
4454 csr_roam_set_pmkid_cache(pMac, sessionId, pPMKIDCache,
4455 numItems, update_entire_cache);
4456 } else {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304457 status = QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004458 }
4459 sme_release_global_lock(&pMac->sme);
4460 }
4461
4462 return status;
4463}
4464
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304465QDF_STATUS sme_roam_del_pmkid_from_cache(tHalHandle hHal, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004466 const uint8_t *pBSSId, bool flush_cache)
4467{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304468 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004469 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Sreelakshmi Konamki6744cff2015-09-07 12:10:39 +05304470
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05304471 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Sreelakshmi Konamki6744cff2015-09-07 12:10:39 +05304472 TRACE_CODE_SME_RX_HDD_ROAM_DEL_PMKIDCACHE,
4473 sessionId, flush_cache));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004474 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 = csr_roam_del_pmkid_from_cache(pMac, sessionId,
4478 pBSSId, flush_cache);
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 return status;
4485}
4486
4487#ifdef WLAN_FEATURE_ROAM_OFFLOAD
4488/* ---------------------------------------------------------------------------
4489 * \fn sme_roam_set_psk_pmk
4490 * \brief a wrapper function to request CSR to save PSK/PMK
4491 * This is a synchronous call.
4492 * \param hHal - Global structure
4493 * \param sessionId - SME sessionId
4494 * \param pPSK_PMK - pointer to an array of Psk[]/Pmk
4495 * \param pmk_len - Length could be only 16 bytes in case if LEAP
4496 * connections. Need to pass this information to
4497 * firmware.
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304498 * \return QDF_STATUS -status whether PSK/PMK is set or not
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004499 *---------------------------------------------------------------------------
4500 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304501QDF_STATUS sme_roam_set_psk_pmk(tHalHandle hHal, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004502 uint8_t *pPSK_PMK, size_t pmk_len)
4503{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304504 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004505 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
4506 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304507 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004508 if (CSR_IS_SESSION_VALID(pMac, sessionId)) {
4509 status =
4510 csr_roam_set_psk_pmk(pMac, sessionId, pPSK_PMK,
4511 pmk_len);
4512 } else {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304513 status = QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004514 }
4515 sme_release_global_lock(&pMac->sme);
4516 }
4517 return status;
4518}
4519#endif
4520/* ---------------------------------------------------------------------------
4521 \fn sme_roam_get_security_req_ie
4522 \brief a wrapper function to request CSR to return the WPA or RSN or WAPI IE CSR
4523 passes to PE to JOIN request or START_BSS request
4524 This is a synchronous call.
4525 \param pLen - caller allocated memory that has the length of pBuf as input.
4526 Upon returned, *pLen has the needed or IE length in pBuf.
4527 \param pBuf - Caller allocated memory that contain the IE field, if any,
4528 upon return
4529 \param secType - Specifies whether looking for WPA/WPA2/WAPI IE
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304530 \return QDF_STATUS - when fail, it usually means the buffer allocated is not
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004531 big enough
4532 ---------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304533QDF_STATUS sme_roam_get_security_req_ie(tHalHandle hHal, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004534 uint32_t *pLen, uint8_t *pBuf,
4535 eCsrSecurityType secType)
4536{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304537 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004538 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
4539
4540 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304541 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004542 if (CSR_IS_SESSION_VALID(pMac, sessionId)) {
4543 status =
4544 csr_roam_get_wpa_rsn_req_ie(hHal, sessionId, pLen, pBuf);
4545 } else {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304546 status = QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004547 }
4548 sme_release_global_lock(&pMac->sme);
4549 }
4550
4551 return status;
4552}
4553
4554/* ---------------------------------------------------------------------------
4555 \fn sme_roam_get_security_rsp_ie
4556 \brief a wrapper function to request CSR to return the WPA or RSN or
4557 WAPI IE from the beacon or probe rsp if connected
4558 This is a synchronous call.
4559 \param pLen - caller allocated memory that has the length of pBuf as input.
4560 Upon returned, *pLen has the needed or IE length in pBuf.
4561 \param pBuf - Caller allocated memory that contain the IE field, if any,
4562 upon return
4563 \param secType - Specifies whether looking for WPA/WPA2/WAPI IE
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304564 \return QDF_STATUS - when fail, it usually means the buffer allocated is not
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004565 big enough
4566 ---------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304567QDF_STATUS sme_roam_get_security_rsp_ie(tHalHandle hHal, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004568 uint32_t *pLen, uint8_t *pBuf,
4569 eCsrSecurityType secType)
4570{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304571 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004572 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
4573
4574 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304575 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004576 if (CSR_IS_SESSION_VALID(pMac, sessionId)) {
4577 status =
4578 csr_roam_get_wpa_rsn_rsp_ie(pMac, sessionId, pLen, pBuf);
4579 } else {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304580 status = QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004581 }
4582 sme_release_global_lock(&pMac->sme);
4583 }
4584
4585 return status;
4586
4587}
4588
4589/* ---------------------------------------------------------------------------
4590 \fn sme_roam_get_num_pmkid_cache
4591 \brief a wrapper function to request CSR to return number of PMKID cache
4592 entries
4593 This is a synchronous call.
4594 \return uint32_t - the number of PMKID cache entries
4595 ---------------------------------------------------------------------------*/
4596uint32_t sme_roam_get_num_pmkid_cache(tHalHandle hHal, uint8_t sessionId)
4597{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304598 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004599 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
4600 uint32_t numPmkidCache = 0;
4601
4602 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304603 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004604 if (CSR_IS_SESSION_VALID(pMac, sessionId)) {
4605 numPmkidCache =
4606 csr_roam_get_num_pmkid_cache(pMac, sessionId);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304607 status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004608 } else {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304609 status = QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004610 }
4611 sme_release_global_lock(&pMac->sme);
4612 }
4613
4614 return numPmkidCache;
4615}
4616
4617/* ---------------------------------------------------------------------------
4618 \fn sme_roam_get_pmkid_cache
4619 \brief a wrapper function to request CSR to return PMKID cache from CSR
4620 This is a synchronous call.
4621 \param pNum - caller allocated memory that has the space of the number of
4622 pBuf tPmkidCacheInfo as input. Upon returned, *pNum has the
4623 needed or actually number in tPmkidCacheInfo.
4624 \param pPmkidCache - Caller allocated memory that contains PMKID cache, if
4625 any, upon return
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304626 \return QDF_STATUS - when fail, it usually means the buffer allocated is not
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004627 big enough
4628 ---------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304629QDF_STATUS sme_roam_get_pmkid_cache(tHalHandle hHal, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004630 uint32_t *pNum, tPmkidCacheInfo *pPmkidCache)
4631{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304632 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004633 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
4634
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05304635 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004636 TRACE_CODE_SME_RX_HDD_ROAM_GET_PMKIDCACHE, sessionId,
4637 0));
4638 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304639 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004640 if (CSR_IS_SESSION_VALID(pMac, sessionId)) {
4641 status =
4642 csr_roam_get_pmkid_cache(pMac, sessionId, pNum,
4643 pPmkidCache);
4644 } else {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304645 status = QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004646 }
4647 sme_release_global_lock(&pMac->sme);
4648 }
4649
4650 return status;
4651}
4652
4653/* ---------------------------------------------------------------------------
4654 \fn sme_get_config_param
4655 \brief a wrapper function that HDD calls to get the global settings
4656 currently maintained by CSR.
4657 This is a synchronous call.
4658 \param pParam - caller allocated memory
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304659 \return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004660 ---------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304661QDF_STATUS sme_get_config_param(tHalHandle hHal, tSmeConfigParams *pParam)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004662{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304663 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004664 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
4665
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05304666 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004667 TRACE_CODE_SME_RX_HDD_GET_CONFIGPARAM, NO_SESSION, 0));
4668 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304669 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004670 status = csr_get_config_param(pMac, &pParam->csrConfig);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304671 if (status != QDF_STATUS_SUCCESS) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004672 sms_log(pMac, LOGE, "%s csr_get_config_param failed",
4673 __func__);
4674 sme_release_global_lock(&pMac->sme);
4675 return status;
4676 }
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304677 qdf_mem_copy(&pParam->rrmConfig,
Krunal Soni1878d3a2016-01-14 13:00:44 -08004678 &pMac->rrm.rrmSmeContext.rrmConfig,
4679 sizeof(pMac->rrm.rrmSmeContext.rrmConfig));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004680 sme_release_global_lock(&pMac->sme);
4681 }
4682
4683 return status;
4684}
4685
4686/**
4687 * sme_cfg_set_int() - Sets the cfg parameter value.
4688 * @hal: Handle to hal.
4689 * @cfg_id: Configuration parameter ID.
4690 * @value: value to be saved in the cfg parameter.
4691 *
4692 * This function sets the string value in cfg parameter.
4693 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304694 * Return: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004695 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304696QDF_STATUS sme_cfg_set_int(tHalHandle hal, uint16_t cfg_id, uint32_t value)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004697{
4698 tpAniSirGlobal pmac = PMAC_STRUCT(hal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304699 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004700
4701 if (eSIR_SUCCESS != cfg_set_int(pmac, cfg_id, value))
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304702 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004703
4704 return status;
4705}
4706
4707/**
4708 * sme_cfg_set_str() - Sets the cfg parameter string.
4709 * @hal: Handle to hal.
4710 * @cfg_id: Configuration parameter ID.
4711 * @str: Pointer to the string buffer.
4712 * @length: Length of the string.
4713 *
4714 * This function sets the string value in cfg parameter.
4715 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304716 * Return: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004717 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304718QDF_STATUS sme_cfg_set_str(tHalHandle hal, uint16_t cfg_id, uint8_t *str,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004719 uint32_t length)
4720{
4721 tpAniSirGlobal pmac = PMAC_STRUCT(hal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304722 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004723
4724 if (eSIR_SUCCESS != cfg_set_str(pmac, cfg_id, str, length))
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304725 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004726
4727 return status;
4728}
4729
4730/**
4731 * sme_cfg_get_int() - Gets the cfg parameter value.
4732 * @hal: Handle to hal.
4733 * @cfg_id: Configuration parameter ID.
4734 * @cfg_value: Pointer to variable in which cfg value
4735 * will be saved.
4736 *
4737 * This function gets the value of the cfg parameter.
4738 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304739 * Return: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004740 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304741QDF_STATUS sme_cfg_get_int(tHalHandle hal, uint16_t cfg_id, uint32_t *cfg_value)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004742{
4743 tpAniSirGlobal pmac = PMAC_STRUCT(hal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304744 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004745
4746 if (eSIR_SUCCESS != wlan_cfg_get_int(pmac, cfg_id, cfg_value))
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304747 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004748
4749 return status;
4750}
4751
4752/**
4753 * sme_cfg_get_str() - Gets the cfg parameter string.
4754 * @hal: Handle to hal.
4755 * @cfg_id: Configuration parameter ID.
4756 * @str: Pointer to the string buffer.
4757 * @length: Pointer to length of the string.
4758 *
4759 * This function gets the string value of the cfg parameter.
4760 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304761 * Return: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004762 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304763QDF_STATUS sme_cfg_get_str(tHalHandle hal, uint16_t cfg_id, uint8_t *str,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004764 uint32_t *length)
4765{
4766 tpAniSirGlobal pmac = PMAC_STRUCT(hal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304767 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004768
4769 if (eSIR_SUCCESS != wlan_cfg_get_str(pmac, cfg_id, str, length))
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304770 status = QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004771
4772 return status;
4773}
4774
4775/* ---------------------------------------------------------------------------
4776 \fn sme_get_modify_profile_fields
4777 \brief HDD or SME - QOS calls this function to get the current values of
4778 connected profile fields, changing which can cause reassoc.
4779 This function must be called after CFG is downloaded and STA is in connected
4780 state. Also, make sure to call this function to get the current profile
4781 fields before calling the reassoc. So that pModifyProfileFields will have
4782 all the latest values plus the one(s) has been updated as part of reassoc
4783 request.
4784 \param pModifyProfileFields - pointer to the connected profile fields
4785 changing which can cause reassoc
4786
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304787 \return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004788 -------------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304789QDF_STATUS sme_get_modify_profile_fields(tHalHandle hHal, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004790 tCsrRoamModifyProfileFields *
4791 pModifyProfileFields)
4792{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304793 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004794 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
4795
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05304796 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004797 TRACE_CODE_SME_RX_HDD_GET_MODPROFFIELDS, sessionId,
4798 0));
4799 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304800 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004801 if (CSR_IS_SESSION_VALID(pMac, sessionId)) {
4802 status =
4803 csr_get_modify_profile_fields(pMac, sessionId,
4804 pModifyProfileFields);
4805 } else {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304806 status = QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004807 }
4808 sme_release_global_lock(&pMac->sme);
4809 }
4810
4811 return status;
4812}
4813
4814/* ---------------------------------------------------------------------------
4815 \fn sme_set_dhcp_till_power_active_flag
4816 \brief Sets/Clears DHCP related flag to disable/enable auto PS
4817 \param hal - The handle returned by mac_open.
4818 ---------------------------------------------------------------------------*/
4819void sme_set_dhcp_till_power_active_flag(tHalHandle hal, uint8_t flag)
4820{
4821 tpAniSirGlobal mac = PMAC_STRUCT(hal);
4822 struct ps_global_info *ps_global_info = &mac->sme.ps_global_info;
4823
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05304824 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004825 TRACE_CODE_SME_RX_HDD_SET_DHCP_FLAG, NO_SESSION,
4826 flag));
4827 /* Set/Clear the DHCP flag which will disable/enable auto PS */
4828 ps_global_info->remain_in_power_active_till_dhcp = flag;
4829}
4830
4831/* ---------------------------------------------------------------------------
4832 \fn sme_register11d_scan_done_callback
4833 \brief Register a routine of type csr_scan_completeCallback which is
4834 called whenever an 11d scan is done
4835 \param hHal - The handle returned by mac_open.
4836 \param callback - 11d scan complete routine to be registered
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304837 \return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004838 ---------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304839QDF_STATUS sme_register11d_scan_done_callback(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004840 csr_scan_completeCallback callback)
4841{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304842 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004843 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
4844
4845 pMac->scan.callback11dScanDone = callback;
4846
4847 return status;
4848}
4849
Arun Khandavalli4b55da72016-07-19 19:55:01 +05304850/**
4851 * sme_deregister11d_scan_done_callback() - De-register scandone callback
4852 * @h_hal: Handler return by mac_open
4853 *
4854 * This function De-registers the scandone callback to SME
4855 *
4856 * Return: None
4857 */
4858void sme_deregister11d_scan_done_callback(tHalHandle h_hal)
4859{
4860 tpAniSirGlobal pmac;
4861
4862 if (!h_hal) {
4863 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
4864 FL("hHal is not valid"));
4865 return;
4866 }
4867
4868 pmac = PMAC_STRUCT(h_hal);
4869 pmac->scan.callback11dScanDone = NULL;
4870}
4871
4872
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004873#ifdef FEATURE_OEM_DATA_SUPPORT
4874/**
4875 * sme_register_oem_data_rsp_callback() - Register a routine of
4876 * type send_oem_data_rsp_msg
4877 * @h_hal: Handle returned by mac_open.
4878 * @callback: Callback to send response
4879 * to oem application.
4880 *
4881 * sme_oem_data_rsp_callback is used to register sme_send_oem_data_rsp_msg
4882 * callback function.
4883 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304884 * Return: QDF_STATUS.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004885 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304886QDF_STATUS sme_register_oem_data_rsp_callback(tHalHandle h_hal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004887 sme_send_oem_data_rsp_msg callback)
4888{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304889 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004890 tpAniSirGlobal pmac = PMAC_STRUCT(h_hal);
4891
Krishna Kumaar Natarajanbbbf2ef2016-08-03 14:06:26 -07004892 pmac->sme.oem_data_rsp_callback = callback;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004893
4894 return status;
4895
4896}
Arun Khandavalli4b55da72016-07-19 19:55:01 +05304897
4898/**
4899 * sme_deregister_oem_data_rsp_callback() - De-register OEM datarsp callback
4900 * @h_hal: Handler return by mac_open
4901 * This function De-registers the OEM data response callback to SME
4902 *
4903 * Return: None
4904 */
4905void sme_deregister_oem_data_rsp_callback(tHalHandle h_hal)
4906{
4907 tpAniSirGlobal pmac;
4908
4909 if (!h_hal) {
4910 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
4911 FL("hHal is not valid"));
4912 return;
4913 }
4914 pmac = PMAC_STRUCT(h_hal);
4915
Krishna Kumaar Natarajanbbbf2ef2016-08-03 14:06:26 -07004916 pmac->sme.oem_data_rsp_callback = NULL;
Arun Khandavalli4b55da72016-07-19 19:55:01 +05304917}
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004918#endif
4919
4920/**
Krishna Kumaar Natarajan53ca2902015-12-04 14:01:46 -08004921 * sme_oem_update_capability() - update UMAC's oem related capability.
4922 * @hal: Handle returned by mac_open
4923 * @oem_cap: pointer to oem_capability
4924 *
4925 * This function updates OEM capability to UMAC. Currently RTT
4926 * related capabilities are updated. More capabilities can be
4927 * added in future.
4928 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304929 * Return: QDF_STATUS
Krishna Kumaar Natarajan53ca2902015-12-04 14:01:46 -08004930 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304931QDF_STATUS sme_oem_update_capability(tHalHandle hal,
Krishna Kumaar Natarajan53ca2902015-12-04 14:01:46 -08004932 struct sme_oem_capability *cap)
4933{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304934 QDF_STATUS status = QDF_STATUS_SUCCESS;
Krishna Kumaar Natarajan53ca2902015-12-04 14:01:46 -08004935 tpAniSirGlobal pmac = PMAC_STRUCT(hal);
4936 uint8_t *bytes;
4937
4938 bytes = pmac->rrm.rrmSmeContext.rrmConfig.rm_capability;
4939
4940 if (cap->ftm_rr)
4941 bytes[4] |= RM_CAP_FTM_RANGE_REPORT;
4942 if (cap->lci_capability)
4943 bytes[4] |= RM_CAP_CIVIC_LOC_MEASUREMENT;
4944
4945 return status;
4946}
4947
4948/**
4949 * sme_oem_get_capability() - get oem capability
4950 * @hal: Handle returned by mac_open
4951 * @oem_cap: pointer to oem_capability
4952 *
4953 * This function is used to get the OEM capability from UMAC.
4954 * Currently RTT related capabilities are received. More
4955 * capabilities can be added in future.
4956 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304957 * Return: QDF_STATUS
Krishna Kumaar Natarajan53ca2902015-12-04 14:01:46 -08004958 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304959QDF_STATUS sme_oem_get_capability(tHalHandle hal,
Krishna Kumaar Natarajan53ca2902015-12-04 14:01:46 -08004960 struct sme_oem_capability *cap)
4961{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304962 QDF_STATUS status = QDF_STATUS_SUCCESS;
Krishna Kumaar Natarajan53ca2902015-12-04 14:01:46 -08004963 tpAniSirGlobal pmac = PMAC_STRUCT(hal);
4964 uint8_t *bytes;
4965
4966 bytes = pmac->rrm.rrmSmeContext.rrmConfig.rm_capability;
4967
4968 cap->ftm_rr = bytes[4] & RM_CAP_FTM_RANGE_REPORT;
4969 cap->lci_capability = bytes[4] & RM_CAP_CIVIC_LOC_MEASUREMENT;
4970
4971 return status;
4972}
4973
4974/**
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004975 * sme_register_ftm_msg_processor() - registers hdd ftm message processor
4976 * function to MAC/SYS
4977 *
4978 * @hal: hal handle
4979 * @callback: hdd function that has to be registered
4980 *
4981 * Return: void
4982 */
4983void sme_register_ftm_msg_processor(tHalHandle hal,
4984 hdd_ftm_msg_processor callback)
4985{
4986 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
4987
4988 if (mac_ctx == NULL) {
Naveen Rawatcf684762016-06-27 15:30:24 -07004989 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
4990 FL("mac ctx is NULL"));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004991 return;
4992 }
Naveen Rawatcf684762016-06-27 15:30:24 -07004993
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004994 mac_ctx->ftm_msg_processor_callback = callback;
4995 return;
4996}
4997
4998/**
4999 * sme_wow_add_pattern() - add a wow pattern in fw
5000 * @hHal: handle returned by mac_open
5001 * @pattern: pointer to input pattern
5002 *
5003 * Add a pattern for Pattern Byte Matching in WoW mode. Firmware will
5004 * do a pattern match on these patterns when WoW is enabled during system
5005 * suspend.
5006 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305007 * Return: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005008 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305009QDF_STATUS sme_wow_add_pattern(tHalHandle hal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005010 struct wow_add_pattern *pattern,
5011 uint8_t session_id)
5012{
5013 tpAniSirGlobal pMac = PMAC_STRUCT(hal);
5014 struct wow_add_pattern *ptrn;
5015 tSirRetStatus ret_code = eSIR_SUCCESS;
5016 tSirMsgQ msg_q;
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05305017 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005018 TRACE_CODE_SME_RX_HDD_WOWL_ADDBCAST_PATTERN, session_id,
5019 0));
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305020 ptrn = qdf_mem_malloc(sizeof(*ptrn));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005021 if (NULL == ptrn) {
5022 sms_log(pMac, LOGP,
5023 FL("Fail to allocate memory for WoWLAN Add Bcast Pattern "));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305024 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005025 }
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305026 (void)qdf_mem_copy(ptrn, pattern, sizeof(*ptrn));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005027
5028 msg_q.type = WMA_WOW_ADD_PTRN;
5029 msg_q.reserved = 0;
5030 msg_q.bodyptr = ptrn;
5031 msg_q.bodyval = 0;
5032
5033 sms_log(pMac, LOG1, FL("Sending WMA_WOWL_ADD_BCAST_PTRN to HAL"));
5034 ret_code = wma_post_ctrl_msg(pMac, &msg_q);
5035 if (eSIR_SUCCESS != ret_code) {
5036 sms_log(pMac, LOGE,
5037 FL("Posting WMA_WOWL_ADD_BCAST_PTRN failed, reason=%X"),
5038 ret_code);
5039 }
5040 return ret_code;
5041}
5042
5043/**
5044 * sme_wow_delete_pattern() - delete user configured wow pattern in target
5045 * @hHal: handle returned by mac_open.
5046 * @pattern: pointer to delete pattern parameter
5047 * @sessionId: session id
5048 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305049 * Return: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005050 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305051QDF_STATUS sme_wow_delete_pattern(tHalHandle hal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005052 struct wow_delete_pattern *pattern, uint8_t sessionId)
5053{
5054 tpAniSirGlobal pMac = PMAC_STRUCT(hal);
5055 struct wow_delete_pattern *delete_ptrn;
5056 tSirRetStatus ret_code = eSIR_SUCCESS;
5057 tSirMsgQ msg_q;
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05305058 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005059 TRACE_CODE_SME_RX_HDD_WOWL_DELBCAST_PATTERN, sessionId,
5060 0));
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305061 delete_ptrn = qdf_mem_malloc(sizeof(*delete_ptrn));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005062 if (NULL == delete_ptrn) {
5063 sms_log(pMac, LOGP,
5064 FL("Fail to allocate memory for WoWLAN Delete Bcast Pattern "));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305065 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005066 }
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305067 (void)qdf_mem_copy(delete_ptrn, pattern, sizeof(*delete_ptrn));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005068 msg_q.type = WMA_WOW_DEL_PTRN;
5069 msg_q.reserved = 0;
5070 msg_q.bodyptr = delete_ptrn;
5071 msg_q.bodyval = 0;
5072
5073 sms_log(pMac, LOG1, FL("Sending WMA_WOWL_DEL_BCAST_PTRN"));
5074
5075 ret_code = wma_post_ctrl_msg(pMac, &msg_q);
5076 if (eSIR_SUCCESS != ret_code) {
5077 sms_log(pMac, LOGE,
5078 FL("Posting WMA_WOWL_DEL_BCAST_PTRN failed, reason=%X"),
5079 ret_code);
5080 }
5081 return ret_code;
5082}
5083
5084/**
5085 * sme_enter_wowl(): SME API exposed to HDD to request enabling of WOWL mode.
5086 * @hal_ctx - The handle returned by mac_open.
5087 * @enter_wowl_callback_routine - Callback routine provided by HDD.
5088 * Used for success/failure notification by SME
5089 * @enter_wowl_callback_context - A cookie passed by HDD, that is passed
5090 * back to HDD at the time of callback.
5091 * @wake_reason_ind_cb - Callback routine provided by HDD.
5092 * Used for Wake Reason Indication by SME
5093 * @wake_reason_ind_cb_ctx - A cookie passed by HDD, that is passed
5094 * back to HDD at the time of callback.
5095 *
5096 * WoWLAN works on top of BMPS mode.
5097 * If the device is not in BMPS mode,
5098 * SME will will cache the information that
5099 * WOWL has been enabled and attempt to put the device
5100 * in BMPS. On entry into BMPS, SME will enable the
5101 * WOWL mode.
5102 * Note 1: If we exit BMPS mode (someone requests full power),
5103 * we will NOT resume WOWL when we go back to BMPS again.
5104 * Request for full power (while in WOWL mode) means disable
5105 * WOWL and go to full power.
5106 * Note 2: Both UAPSD and WOWL work on top of BMPS.
5107 * On entry into BMPS, SME will give priority to UAPSD and
5108 * enable only UAPSD if both UAPSD and WOWL are required.
5109 * Currently there is no requirement or use case to support
5110 * UAPSD and WOWL at the same time.
5111 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305112 * Return: QDF_STATUS
5113 * QDF_STATUS_SUCCESS Device is already in WoWLAN mode
5114 * QDF_STATUS_E_FAILURE Device cannot enter WoWLAN mode.
5115 * QDF_STATUS_PMC_PENDING Request accepted. SME will enable
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005116 * WOWL after BMPS mode is entered.
5117 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305118QDF_STATUS sme_enter_wowl(tHalHandle hal_ctx,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005119 void (*enter_wowl_callback_routine)(void
5120 *callback_context,
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305121 QDF_STATUS status),
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005122 void *enter_wowl_callback_context,
5123#ifdef WLAN_WAKEUP_EVENTS
5124 void (*wakeIndicationCB)(void *callback_context,
5125 tpSirWakeReasonInd
5126 wake_reason_ind),
5127 void *wakeIndicationCBContext,
5128#endif /* WLAN_WAKEUP_EVENTS */
5129 tpSirSmeWowlEnterParams wowl_enter_params,
5130 uint8_t session_id)
5131{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305132 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005133 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal_ctx);
5134 struct ps_global_info *ps_global_info = &mac_ctx->sme.ps_global_info;
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05305135 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005136 TRACE_CODE_SME_RX_HDD_ENTER_WOWL, session_id, 0));
5137
5138 /* cache the WOWL information */
5139 ps_global_info->ps_params[session_id].wowl_enter_params =
5140 *wowl_enter_params;
5141 ps_global_info->ps_params[session_id].enter_wowl_callback_routine =
5142 enter_wowl_callback_routine;
5143 ps_global_info->ps_params[session_id].enter_wowl_callback_context =
5144 enter_wowl_callback_context;
5145#ifdef WLAN_WAKEUP_EVENTS
5146 /* Cache the Wake Reason Indication callback information */
5147 ps_global_info->ps_params[session_id].wake_reason_ind_cb =
5148 wakeIndicationCB;
5149 ps_global_info->ps_params[session_id].wake_reason_ind_cb_ctx =
5150 wakeIndicationCBContext;
5151#endif /* WLAN_WAKEUP_EVENTS */
5152
5153 status = sme_ps_process_command(mac_ctx, session_id, SME_PS_WOWL_ENTER);
5154 return status;
5155}
5156/**
5157 *sme_exit_wowl(): SME API exposed to HDD to request exit from WoWLAN mode.
5158 * @hal_ctx - The handle returned by mac_open.
5159 * @wowl_exit_params - Carries info on which smesession
5160 * wowl exit is requested.
5161 *
5162 * SME will initiate exit from WoWLAN mode and device will be
5163 * put in BMPS mode.
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305164 * Return QDF_STATUS
5165 * QDF_STATUS_E_FAILURE Device cannot exit WoWLAN mode.
5166 * QDF_STATUS_SUCCESS Request accepted to exit WoWLAN mode.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005167 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305168QDF_STATUS sme_exit_wowl(tHalHandle hal_ctx,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005169 tpSirSmeWowlExitParams wowl_exit_params)
5170{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305171 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005172 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal_ctx);
5173 uint8_t session_id;
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05305174 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005175 TRACE_CODE_SME_RX_HDD_EXIT_WOWL, NO_SESSION, 0));
5176 session_id = wowl_exit_params->sessionId;
5177 status = sme_ps_process_command(mac_ctx, session_id, SME_PS_WOWL_EXIT);
5178 return status;
5179}
5180
5181/**
5182 * sme_roam_set_key() - To set encryption key.
5183 * @hal: hal global context
5184 * @session_id: session id
5185 * @set_key: pointer to a caller allocated object of tCsrSetContextInfo
5186 * @ptr_roam_id: Upon success return, this is the id caller can use to
5187 * identify the request in roamcallback
5188 *
5189 * This function should be called only when connected. This is an asynchronous
5190 * API.
5191 *
5192 * Return: Status of operation
5193 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305194QDF_STATUS sme_roam_set_key(tHalHandle hal, uint8_t session_id,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005195 tCsrRoamSetKey *set_key, uint32_t *ptr_roam_id)
5196{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305197 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005198 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
5199 uint32_t roam_id;
5200 uint32_t i;
5201 tCsrRoamSession *session = NULL;
5202 struct ps_global_info *ps_global_info = &mac_ctx->sme.ps_global_info;
5203
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05305204 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_RX_HDD_SET_KEY,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005205 session_id, 0));
5206 if (set_key->keyLength > CSR_MAX_KEY_LEN) {
5207 sms_log(mac_ctx, LOGE, FL("Invalid key length %d"),
5208 set_key->keyLength);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305209 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005210 }
5211 /*Once Setkey is done, we can go in BMPS */
5212 if (set_key->keyLength)
5213 ps_global_info->remain_in_power_active_till_dhcp = false;
5214
5215 status = sme_acquire_global_lock(&mac_ctx->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305216 if (!QDF_IS_STATUS_SUCCESS(status))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005217 return status;
5218
5219 roam_id = GET_NEXT_ROAM_ID(&mac_ctx->roam);
5220 if (ptr_roam_id)
5221 *ptr_roam_id = roam_id;
5222
5223 sms_log(mac_ctx, LOG2, FL("keyLength %d"), set_key->keyLength);
5224 for (i = 0; i < set_key->keyLength; i++)
5225 sms_log(mac_ctx, LOG2, FL("%02x"), set_key->Key[i]);
5226
5227 sms_log(mac_ctx, LOG2, "\n session_id=%d roam_id=%d", session_id,
5228 roam_id);
5229 session = CSR_GET_SESSION(mac_ctx, session_id);
5230 if (!session) {
5231 sms_log(mac_ctx, LOGE, FL("session %d not found"), session_id);
5232 sme_release_global_lock(&mac_ctx->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305233 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005234 }
5235 if (CSR_IS_INFRA_AP(&session->connectedProfile)
5236 && set_key->keyDirection == eSIR_TX_DEFAULT) {
5237 if ((eCSR_ENCRYPT_TYPE_WEP40 == set_key->encType)
5238 || (eCSR_ENCRYPT_TYPE_WEP40_STATICKEY ==
5239 set_key->encType)) {
5240 session->pCurRoamProfile->negotiatedUCEncryptionType =
5241 eCSR_ENCRYPT_TYPE_WEP40_STATICKEY;
5242 }
5243 if ((eCSR_ENCRYPT_TYPE_WEP104 == set_key->encType)
5244 || (eCSR_ENCRYPT_TYPE_WEP104_STATICKEY ==
5245 set_key->encType)) {
5246 session->pCurRoamProfile->negotiatedUCEncryptionType =
5247 eCSR_ENCRYPT_TYPE_WEP104_STATICKEY;
5248 }
5249 }
5250 status = csr_roam_set_key(mac_ctx, session_id, set_key, roam_id);
5251 sme_release_global_lock(&mac_ctx->sme);
5252 return status;
5253}
5254
Masti, Narayanraddiab712a72016-08-04 11:59:11 +05305255/**
5256 * sme_roam_set_default_key_index - To set default wep key idx
5257 * @hal: pointer to hal handler
5258 * @session_id: session id
5259 * @default_idx: default wep key index
5260 *
5261 * This function prepares a message and post to WMA to set wep default
5262 * key index
5263 *
5264 * Return: Success:QDF_STATUS_SUCCESS Failure: Error value
5265 */
5266QDF_STATUS sme_roam_set_default_key_index(tHalHandle hal, uint8_t session_id,
5267 uint8_t default_idx)
5268{
5269 cds_msg_t msg;
5270 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
5271 struct wep_update_default_key_idx *update_key;
5272
5273 update_key = qdf_mem_malloc(sizeof(*update_key));
5274 if (!update_key) {
5275 sms_log(mac_ctx, LOGE,
5276 FL("Failed to allocate memory for update key"));
5277 return QDF_STATUS_E_NOMEM;
5278 }
5279
5280 update_key->session_id = session_id;
5281 update_key->default_idx = default_idx;
5282
5283 msg.type = WMA_UPDATE_WEP_DEFAULT_KEY;
5284 msg.reserved = 0;
5285 msg.bodyptr = (void *)update_key;
5286
5287 if (QDF_STATUS_SUCCESS !=
5288 cds_mq_post_message(QDF_MODULE_ID_WMA, &msg)) {
5289 sms_log(mac_ctx, LOGE,
5290 FL("Failed to post WMA_UPDATE_WEP_DEFAULT_KEY to WMA"));
5291 qdf_mem_free(update_key);
5292 return QDF_STATUS_E_FAILURE;
5293 }
5294
5295 return QDF_STATUS_SUCCESS;
5296}
5297
5298
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005299/* ---------------------------------------------------------------------------
5300 \fn sme_get_rssi
5301 \brief a wrapper function that client calls to register a callback to get
5302 RSSI
5303
5304 \param hHal - HAL handle for device
5305 \param callback - SME sends back the requested stats using the callback
5306 \param staId - The station ID for which the stats is requested for
5307 \param bssid - The bssid of the connected session
5308 \param lastRSSI - RSSI value at time of request. In case fw cannot provide
5309 RSSI, do not hold up but return this value.
5310 \param pContext - user context to be passed back along with the callback
5311 \param p_cds_context - cds context
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305312 \return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005313 ---------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305314QDF_STATUS sme_get_rssi(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005315 tCsrRssiCallback callback,
Anurag Chouhan6d760662016-02-20 16:05:43 +05305316 uint8_t staId, struct qdf_mac_addr bssId, int8_t lastRSSI,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005317 void *pContext, void *p_cds_context)
5318{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305319 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005320 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
5321
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05305322 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005323 TRACE_CODE_SME_RX_HDD_GET_RSSI, NO_SESSION, 0));
5324 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305325 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005326 status = csr_get_rssi(pMac, callback,
5327 staId, bssId, lastRSSI,
5328 pContext, p_cds_context);
5329 sme_release_global_lock(&pMac->sme);
5330 }
5331 return status;
5332}
5333
5334/* ---------------------------------------------------------------------------
5335 \fn sme_get_snr
5336 \brief a wrapper function that client calls to register a callback to
5337 get SNR
5338
5339 \param callback - SME sends back the requested stats using the callback
5340 \param staId - The station ID for which the stats is requested for
5341 \param pContext - user context to be passed back along with the callback
5342 \param p_cds_context - cds context
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305343 \return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005344 ---------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305345QDF_STATUS sme_get_snr(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005346 tCsrSnrCallback callback,
Anurag Chouhan6d760662016-02-20 16:05:43 +05305347 uint8_t staId, struct qdf_mac_addr bssId, void *pContext)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005348{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305349 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005350 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
5351
5352 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305353 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005354 status = csr_get_snr(pMac, callback, staId, bssId, pContext);
5355 sme_release_global_lock(&pMac->sme);
5356 }
5357 return status;
5358}
5359
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005360/* ---------------------------------------------------------------------------
5361 \fn sme_get_statistics
5362 \brief a wrapper function that client calls to register a callback to get
5363 different PHY level statistics from CSR.
5364
5365 \param requesterId - different client requesting for statistics,
5366 HDD, UMA/GAN etc
5367 \param statsMask - The different category/categories of stats requester
5368 is looking for
5369 \param callback - SME sends back the requested stats using the callback
5370 \param periodicity - If requester needs periodic update in millisec, 0 means
5371 it's an one time request
5372 \param cache - If requester is happy with cached stats
5373 \param staId - The station ID for which the stats is requested for
5374 \param pContext - user context to be passed back along with the callback
5375 \param sessionId - sme session interface
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305376 \return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005377 ---------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305378QDF_STATUS sme_get_statistics(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005379 eCsrStatsRequesterType requesterId,
5380 uint32_t statsMask, tCsrStatsCallback callback,
5381 uint32_t periodicity, bool cache, uint8_t staId,
5382 void *pContext, uint8_t sessionId)
5383{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305384 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005385 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
5386
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05305387 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005388 TRACE_CODE_SME_RX_HDD_GET_STATS, NO_SESSION,
5389 periodicity));
5390 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305391 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005392 status =
5393 csr_get_statistics(pMac, requesterId, statsMask, callback,
5394 periodicity, cache, staId, pContext,
5395 sessionId);
5396 sme_release_global_lock(&pMac->sme);
5397 }
5398
5399 return status;
5400
5401}
5402
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305403QDF_STATUS sme_get_link_status(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005404 tCsrLinkStatusCallback callback,
5405 void *pContext, uint8_t sessionId)
5406{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305407 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005408 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
5409 tAniGetLinkStatus *pMsg;
5410 cds_msg_t cds_message;
5411
5412 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305413 if (QDF_IS_STATUS_SUCCESS(status)) {
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305414 pMsg = qdf_mem_malloc(sizeof(tAniGetLinkStatus));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005415 if (NULL == pMsg) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05305416 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005417 "%s: Not able to allocate memory for link status",
5418 __func__);
5419 sme_release_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305420 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005421 }
5422
5423 pMsg->msgType = WMA_LINK_STATUS_GET_REQ;
5424 pMsg->msgLen = (uint16_t) sizeof(tAniGetLinkStatus);
5425 pMsg->sessionId = sessionId;
5426 pMac->sme.linkStatusContext = pContext;
5427 pMac->sme.linkStatusCallback = callback;
5428
5429 cds_message.type = WMA_LINK_STATUS_GET_REQ;
5430 cds_message.bodyptr = pMsg;
5431 cds_message.reserved = 0;
5432
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305433 if (!QDF_IS_STATUS_SUCCESS
Anurag Chouhan6d760662016-02-20 16:05:43 +05305434 (cds_mq_post_message(QDF_MODULE_ID_WMA, &cds_message))) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05305435 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005436 "%s: Post LINK STATUS MSG fail", __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305437 qdf_mem_free(pMsg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005438 pMac->sme.linkStatusContext = NULL;
5439 pMac->sme.linkStatusCallback = NULL;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305440 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005441 }
5442
5443 sme_release_global_lock(&pMac->sme);
5444 }
5445
5446 return status;
5447}
5448
5449/* ---------------------------------------------------------------------------
5450
5451 \fn sme_get_country_code
5452
5453 \brief To return the current country code. If no country code is applied,
5454 default country code is used to fill the buffer.
5455 If 11d supported is turned off, an error is return and the last
5456 applied/default country code is used.
5457 This is a synchronous API.
5458
5459 \param pBuf - pointer to a caller allocated buffer for returned country code.
5460
5461 \param pbLen For input, this parameter indicates how big is the buffer.
5462 Upon return, this parameter has the number of bytes for
5463 country. If pBuf doesn't have enough space, this function
5464 returns fail status and this parameter contains the number
5465 that is needed.
5466
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305467 \return QDF_STATUS SUCCESS.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005468
5469 FAILURE or RESOURCES The API finished and failed.
5470
5471 -------------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305472QDF_STATUS sme_get_country_code(tHalHandle hHal, uint8_t *pBuf, uint8_t *pbLen)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005473{
5474 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
5475
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05305476 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005477 TRACE_CODE_SME_RX_HDD_GET_CNTRYCODE, NO_SESSION, 0));
5478
5479 return csr_get_country_code(pMac, pBuf, pbLen);
5480}
5481
5482/**
5483 * sme_apply_channel_power_info_to_fw() - sends channel info to fw
5484 * @hHal: hal handle
5485 *
5486 * This function sends the channel power info to firmware
5487 *
5488 * Return: none
5489 */
5490void sme_apply_channel_power_info_to_fw(tHalHandle hHal)
5491{
5492 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
5493
5494 csr_apply_channel_power_info_wrapper(pMac);
5495}
5496
5497/* some support functions */
5498bool sme_is11d_supported(tHalHandle hHal)
5499{
5500 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
5501
5502 return csr_is11d_supported(pMac);
5503}
5504
5505bool sme_is11h_supported(tHalHandle hHal)
5506{
5507 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
5508
5509 return csr_is11h_supported(pMac);
5510}
5511
5512bool sme_is_wmm_supported(tHalHandle hHal)
5513{
5514 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
5515
5516 return csr_is_wmm_supported(pMac);
5517}
5518
5519/* ---------------------------------------------------------------------------
5520
5521 \fn sme_change_country_code
5522
5523 \brief Change Country code from upperlayer during WLAN driver operation.
5524 This is a synchronous API.
5525
5526 \param hHal - The handle returned by mac_open.
5527
5528 \param pCountry New Country Code String
5529
5530 \param sendRegHint If we want to send reg hint to nl80211
5531
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305532 \return QDF_STATUS SUCCESS.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005533
5534 FAILURE or RESOURCES The API finished and failed.
5535
5536 -------------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305537QDF_STATUS sme_change_country_code(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005538 tSmeChangeCountryCallback callback,
5539 uint8_t *pCountry,
5540 void *pContext,
5541 void *p_cds_context,
5542 tAniBool countryFromUserSpace,
5543 tAniBool sendRegHint)
5544{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305545 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005546 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
5547 cds_msg_t msg;
5548 tAniChangeCountryCodeReq *pMsg;
5549
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05305550 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005551 TRACE_CODE_SME_RX_HDD_CHANGE_CNTRYCODE, NO_SESSION,
5552 0));
5553 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305554 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005555 sms_log(pMac, LOG1, FL(" called"));
5556
5557 if ((pMac->roam.configParam.Is11dSupportEnabledOriginal == true)
5558 && (!pMac->roam.configParam.
5559 fSupplicantCountryCodeHasPriority)) {
5560
5561 sms_log(pMac, LOGW,
5562 "Set Country Code Fail since the STA is associated and userspace does not have priority ");
5563
5564 sme_release_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305565 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005566 return status;
5567 }
5568
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305569 pMsg = qdf_mem_malloc(sizeof(tAniChangeCountryCodeReq));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005570 if (NULL == pMsg) {
5571 sms_log(pMac, LOGE,
5572 " csrChangeCountryCode: failed to allocate mem for req");
5573 sme_release_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305574 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005575 }
5576
5577 pMsg->msgType = eWNI_SME_CHANGE_COUNTRY_CODE;
5578 pMsg->msgLen = (uint16_t) sizeof(tAniChangeCountryCodeReq);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305579 qdf_mem_copy(pMsg->countryCode, pCountry, 3);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005580 pMsg->countryFromUserSpace = countryFromUserSpace;
5581 pMsg->sendRegHint = sendRegHint;
5582 pMsg->changeCCCallback = callback;
5583 pMsg->pDevContext = pContext;
5584 pMsg->p_cds_context = p_cds_context;
5585
5586 msg.type = eWNI_SME_CHANGE_COUNTRY_CODE;
5587 msg.bodyptr = pMsg;
5588 msg.reserved = 0;
5589
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305590 if (QDF_STATUS_SUCCESS !=
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005591 cds_mq_post_message(CDS_MQ_ID_SME, &msg)) {
5592 sms_log(pMac, LOGE,
5593 " sme_change_country_code failed to post msg to self ");
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305594 qdf_mem_free((void *)pMsg);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305595 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005596 }
5597 sms_log(pMac, LOG1, FL(" returned"));
5598 sme_release_global_lock(&pMac->sme);
5599 }
5600
5601 return status;
5602}
5603
5604/*--------------------------------------------------------------------------
5605
5606 \fn sme_generic_change_country_code
5607
5608 \brief Change Country code from upperlayer during WLAN driver operation.
5609 This is a synchronous API.
5610
5611 \param hHal - The handle returned by mac_open.
5612
5613 \param pCountry New Country Code String
5614
5615 \param reg_domain regulatory domain
5616
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305617 \return QDF_STATUS SUCCESS.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005618
5619 FAILURE or RESOURCES The API finished and failed.
5620
5621 -----------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305622QDF_STATUS sme_generic_change_country_code(tHalHandle hHal,
Amar Singhal7f1f3ec2015-10-13 17:14:08 -07005623 uint8_t *pCountry)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005624{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305625 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005626 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
5627 cds_msg_t msg;
5628 tAniGenericChangeCountryCodeReq *pMsg;
5629
5630 if (NULL == pMac) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05305631 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_FATAL,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005632 "%s: pMac is null", __func__);
5633 return status;
5634 }
5635
5636 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305637 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005638 sms_log(pMac, LOG1, FL(" called"));
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305639 pMsg = qdf_mem_malloc(sizeof(tAniGenericChangeCountryCodeReq));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005640
5641 if (NULL == pMsg) {
5642 sms_log(pMac, LOGE,
5643 " sme_generic_change_country_code: failed to allocate mem for req");
5644 sme_release_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305645 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005646 }
5647
5648 pMsg->msgType = eWNI_SME_GENERIC_CHANGE_COUNTRY_CODE;
5649 pMsg->msgLen =
5650 (uint16_t) sizeof(tAniGenericChangeCountryCodeReq);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305651 qdf_mem_copy(pMsg->countryCode, pCountry, 2);
Amar Singhal7f1f3ec2015-10-13 17:14:08 -07005652 pMsg->countryCode[2] = ' ';
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005653
5654 msg.type = eWNI_SME_GENERIC_CHANGE_COUNTRY_CODE;
5655 msg.bodyptr = pMsg;
5656 msg.reserved = 0;
5657
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305658 if (QDF_STATUS_SUCCESS !=
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005659 cds_mq_post_message(CDS_MQ_ID_SME, &msg)) {
5660 sms_log(pMac, LOGE,
5661 "sme_generic_change_country_code failed to post msg to self");
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305662 qdf_mem_free(pMsg);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305663 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005664 }
5665 sms_log(pMac, LOG1, FL(" returned"));
5666 sme_release_global_lock(&pMac->sme);
5667 }
5668
5669 return status;
5670}
5671
5672/* ---------------------------------------------------------------------------
5673
5674 \fn sme_dhcp_start_ind
5675
5676 \brief API to signal the FW about the DHCP Start event.
5677
5678 \param hHal - HAL handle for device.
5679
5680 \param device_mode - mode(AP,SAP etc) of the device.
5681
5682 \param macAddr - MAC address of the adapter.
5683
5684 \param sessionId - session ID.
5685
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305686 \return QDF_STATUS SUCCESS.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005687
5688 FAILURE or RESOURCES The API finished and failed.
5689 --------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305690QDF_STATUS sme_dhcp_start_ind(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005691 uint8_t device_mode,
5692 uint8_t *macAddr, uint8_t sessionId)
5693{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305694 QDF_STATUS status;
5695 QDF_STATUS qdf_status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005696 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
5697 cds_msg_t cds_message;
5698 tAniDHCPInd *pMsg;
5699 tCsrRoamSession *pSession;
5700
5701 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305702 if (QDF_STATUS_SUCCESS == status) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005703 pSession = CSR_GET_SESSION(pMac, sessionId);
5704
5705 if (!pSession) {
5706 sms_log(pMac, LOGE, FL("session %d not found "),
5707 sessionId);
5708 sme_release_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305709 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005710 }
5711
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305712 pMsg = (tAniDHCPInd *) qdf_mem_malloc(sizeof(tAniDHCPInd));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005713 if (NULL == pMsg) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05305714 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005715 "%s: Not able to allocate memory for dhcp start",
5716 __func__);
5717 sme_release_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305718 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005719 }
5720 pMsg->msgType = WMA_DHCP_START_IND;
5721 pMsg->msgLen = (uint16_t) sizeof(tAniDHCPInd);
5722 pMsg->device_mode = device_mode;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305723 qdf_mem_copy(pMsg->adapterMacAddr.bytes, macAddr,
Anurag Chouhan6d760662016-02-20 16:05:43 +05305724 QDF_MAC_ADDR_SIZE);
Anurag Chouhanc5548422016-02-24 18:33:27 +05305725 qdf_copy_macaddr(&pMsg->peerMacAddr,
Srinivas Girigowda296105a2015-09-24 16:31:16 -07005726 &pSession->connectedProfile.bssid);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005727
5728 cds_message.type = WMA_DHCP_START_IND;
5729 cds_message.bodyptr = pMsg;
5730 cds_message.reserved = 0;
Sreelakshmi Konamki6a065362016-05-31 16:05:01 +05305731 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
5732 sessionId, cds_message.type));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305733 qdf_status = cds_mq_post_message(CDS_MQ_ID_WMA, &cds_message);
5734 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05305735 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005736 "%s: Post DHCP Start MSG fail", __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305737 qdf_mem_free(pMsg);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305738 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005739 }
5740 sme_release_global_lock(&pMac->sme);
5741 }
5742 return status;
5743}
5744
5745/* ---------------------------------------------------------------------------
5746 \fn sme_dhcp_stop_ind
5747
5748 \brief API to signal the FW about the DHCP complete event.
5749
5750 \param hHal - HAL handle for device.
5751
5752 \param device_mode - mode(AP, SAP etc) of the device.
5753
5754 \param macAddr - MAC address of the adapter.
5755
5756 \param sessionId - session ID.
5757
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305758 \return QDF_STATUS SUCCESS.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005759 FAILURE or RESOURCES The API finished and failed.
5760 --------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305761QDF_STATUS sme_dhcp_stop_ind(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005762 uint8_t device_mode,
5763 uint8_t *macAddr, uint8_t sessionId)
5764{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305765 QDF_STATUS status;
5766 QDF_STATUS qdf_status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005767 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
5768 cds_msg_t cds_message;
5769 tAniDHCPInd *pMsg;
5770 tCsrRoamSession *pSession;
5771
5772 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305773 if (QDF_STATUS_SUCCESS == status) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005774 pSession = CSR_GET_SESSION(pMac, sessionId);
5775
5776 if (!pSession) {
5777 sms_log(pMac, LOGE, FL("session %d not found "),
5778 sessionId);
5779 sme_release_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305780 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005781 }
5782
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305783 pMsg = (tAniDHCPInd *) qdf_mem_malloc(sizeof(tAniDHCPInd));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005784 if (NULL == pMsg) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05305785 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005786 "%s: Not able to allocate memory for dhcp stop",
5787 __func__);
5788 sme_release_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305789 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005790 }
5791
5792 pMsg->msgType = WMA_DHCP_STOP_IND;
5793 pMsg->msgLen = (uint16_t) sizeof(tAniDHCPInd);
5794 pMsg->device_mode = device_mode;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305795 qdf_mem_copy(pMsg->adapterMacAddr.bytes, macAddr,
Anurag Chouhan6d760662016-02-20 16:05:43 +05305796 QDF_MAC_ADDR_SIZE);
Anurag Chouhanc5548422016-02-24 18:33:27 +05305797 qdf_copy_macaddr(&pMsg->peerMacAddr,
Srinivas Girigowda296105a2015-09-24 16:31:16 -07005798 &pSession->connectedProfile.bssid);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005799
5800 cds_message.type = WMA_DHCP_STOP_IND;
5801 cds_message.bodyptr = pMsg;
5802 cds_message.reserved = 0;
Sreelakshmi Konamki6a065362016-05-31 16:05:01 +05305803 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
5804 sessionId, cds_message.type));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305805 qdf_status = cds_mq_post_message(CDS_MQ_ID_WMA, &cds_message);
5806 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05305807 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005808 "%s: Post DHCP Stop MSG fail", __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305809 qdf_mem_free(pMsg);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305810 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005811 }
5812
5813 sme_release_global_lock(&pMac->sme);
5814 }
5815 return status;
5816}
5817
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08005818/*---------------------------------------------------------------------------
5819
5820 \fn sme_TXFailMonitorStopInd
5821
5822 \brief API to signal the FW to start monitoring TX failures
5823
5824 \return QDF_STATUS SUCCESS.
5825
5826 FAILURE or RESOURCES The API finished and failed.
5827 --------------------------------------------------------------------------*/
5828QDF_STATUS sme_tx_fail_monitor_start_stop_ind(tHalHandle hHal, uint8_t tx_fail_count,
5829 void *txFailIndCallback)
5830{
5831 QDF_STATUS status;
5832 QDF_STATUS qdf_status;
5833 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
5834 cds_msg_t cds_message;
5835 tAniTXFailMonitorInd *pMsg;
5836
5837 status = sme_acquire_global_lock(&pMac->sme);
5838 if (QDF_STATUS_SUCCESS == status) {
5839 pMsg = (tAniTXFailMonitorInd *)
5840 qdf_mem_malloc(sizeof(tAniTXFailMonitorInd));
5841 if (NULL == pMsg) {
5842 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
5843 "%s: Failed to allocate memory", __func__);
5844 sme_release_global_lock(&pMac->sme);
5845 return QDF_STATUS_E_NOMEM;
5846 }
5847
5848 pMsg->msgType = WMA_TX_FAIL_MONITOR_IND;
5849 pMsg->msgLen = (uint16_t) sizeof(tAniTXFailMonitorInd);
5850
5851 /* tx_fail_count = 0 should disable the Monitoring in FW */
5852 pMsg->tx_fail_count = tx_fail_count;
5853 pMsg->txFailIndCallback = txFailIndCallback;
5854
5855 cds_message.type = WMA_TX_FAIL_MONITOR_IND;
5856 cds_message.bodyptr = pMsg;
5857 cds_message.reserved = 0;
5858
5859 qdf_status = cds_mq_post_message(CDS_MQ_ID_WMA, &cds_message);
5860 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
5861 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
5862 "%s: Post TX Fail monitor Start MSG fail",
5863 __func__);
5864 qdf_mem_free(pMsg);
5865 status = QDF_STATUS_E_FAILURE;
5866 }
5867 sme_release_global_lock(&pMac->sme);
5868 }
5869 return status;
5870}
5871
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005872/* ---------------------------------------------------------------------------
5873 \fn sme_set_cfg_privacy
5874 \brief API to set configure privacy parameters
5875 \param hHal - The handle returned by mac_open.
5876 \param pProfile - Pointer CSR Roam profile.
5877 \param fPrivacy - This parameter indicates status of privacy
5878
5879 \return void
5880 ---------------------------------------------------------------------------*/
5881void sme_set_cfg_privacy(tHalHandle hHal,
5882 tCsrRoamProfile *pProfile, bool fPrivacy)
5883{
5884 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05305885 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005886 TRACE_CODE_SME_RX_HDD_SET_CFGPRIVACY, NO_SESSION, 0));
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 csr_set_cfg_privacy(pMac, pProfile, fPrivacy);
5889 sme_release_global_lock(&pMac->sme);
5890 }
5891}
5892
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005893/* ---------------------------------------------------------------------------
5894 \fn sme_neighbor_report_request
5895 \brief API to request neighbor report.
5896 \param hHal - The handle returned by mac_open.
5897 \param pRrmNeighborReq - Pointer to a caller allocated object of type
5898 tRrmNeighborReq. Caller owns the memory and is
5899 responsible for freeing it.
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305900 \return QDF_STATUS
5901 QDF_STATUS_E_FAILURE - failure
5902 QDF_STATUS_SUCCESS success
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005903 ---------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305904QDF_STATUS sme_neighbor_report_request(tHalHandle hHal, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005905 tpRrmNeighborReq pRrmNeighborReq,
5906 tpRrmNeighborRspCallbackInfo callbackInfo)
5907{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305908 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005909 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05305910 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005911 TRACE_CODE_SME_RX_HDD_NEIGHBOR_REPORTREQ, NO_SESSION,
5912 0));
5913
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305914 if (QDF_STATUS_SUCCESS == sme_acquire_global_lock(&pMac->sme)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005915 status =
5916 sme_rrm_neighbor_report_request(hHal, sessionId,
5917 pRrmNeighborReq, callbackInfo);
5918 sme_release_global_lock(&pMac->sme);
5919 }
5920
5921 return status;
5922}
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005923
5924void sms_log(tpAniSirGlobal pMac, uint32_t loglevel, const char *pString, ...)
5925{
5926#ifdef WLAN_DEBUG
5927 /* Verify against current log level */
5928 if (loglevel >
5929 pMac->utils.gLogDbgLevel[LOG_INDEX_FOR_MODULE(SIR_SMS_MODULE_ID)])
5930 return;
5931 else {
5932 va_list marker;
5933
5934 va_start(marker, pString); /* Initialize variable arguments. */
5935
5936 log_debug(pMac, SIR_SMS_MODULE_ID, loglevel, pString, marker);
5937
5938 va_end(marker); /* Reset variable arguments. */
5939 }
5940#endif
5941}
5942
5943/* ---------------------------------------------------------------------------
5944 \fn sme_get_wcnss_wlan_compiled_version
5945 \brief This API returns the version of the WCNSS WLAN API with
5946 which the HOST driver was built
5947 \param hHal - The handle returned by mac_open.
5948 \param pVersion - Points to the Version structure to be filled
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305949 \return QDF_STATUS
5950 QDF_STATUS_E_INVAL - failure
5951 QDF_STATUS_SUCCESS success
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005952 ---------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305953QDF_STATUS sme_get_wcnss_wlan_compiled_version(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005954 tSirVersionType *pVersion)
5955{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305956 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005957 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
5958
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305959 if (QDF_STATUS_SUCCESS == sme_acquire_global_lock(&pMac->sme)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005960 if (pVersion != NULL)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305961 status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005962 else
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305963 status = QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005964
5965 sme_release_global_lock(&pMac->sme);
5966 }
5967
5968 return status;
5969}
5970
5971/* ---------------------------------------------------------------------------
5972 \fn sme_get_wcnss_wlan_reported_version
5973 \brief This API returns the version of the WCNSS WLAN API with
5974 which the WCNSS driver reports it was built
5975 \param hHal - The handle returned by mac_open.
5976 \param pVersion - Points to the Version structure to be filled
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305977 \return QDF_STATUS
5978 QDF_STATUS_E_INVAL - failure
5979 QDF_STATUS_SUCCESS success
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005980 ---------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305981QDF_STATUS sme_get_wcnss_wlan_reported_version(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005982 tSirVersionType *pVersion)
5983{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305984 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005985 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
5986
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305987 if (QDF_STATUS_SUCCESS == sme_acquire_global_lock(&pMac->sme)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005988 if (pVersion != NULL)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305989 status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005990 else
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305991 status = QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005992
5993 sme_release_global_lock(&pMac->sme);
5994 }
5995
5996 return status;
5997}
5998
5999/* ---------------------------------------------------------------------------
6000 \fn sme_get_wcnss_software_version
6001 \brief This API returns the version string of the WCNSS driver
6002 \param hHal - The handle returned by mac_open.
6003 \param pVersion - Points to the Version string buffer to be filled
6004 \param versionBufferSize - THe size of the Version string buffer
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306005 \return QDF_STATUS
6006 QDF_STATUS_E_INVAL - failure
6007 QDF_STATUS_SUCCESS success
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006008 ---------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306009QDF_STATUS sme_get_wcnss_software_version(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006010 uint8_t *pVersion,
6011 uint32_t versionBufferSize)
6012{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306013 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006014 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
6015 v_CONTEXT_t cds_context = cds_get_global_context();
6016
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306017 if (QDF_STATUS_SUCCESS == sme_acquire_global_lock(&pMac->sme)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006018 if (pVersion != NULL) {
6019 status =
6020 wma_get_wcnss_software_version(cds_context,
6021 pVersion,
6022 versionBufferSize);
6023 } else {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306024 status = QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006025 }
6026 sme_release_global_lock(&pMac->sme);
6027 }
6028
6029 return status;
6030}
6031
6032/* ---------------------------------------------------------------------------
6033 \fn sme_get_wcnss_hardware_version
6034 \brief This API returns the version string of the WCNSS hardware
6035 \param hHal - The handle returned by mac_open.
6036 \param pVersion - Points to the Version string buffer to be filled
6037 \param versionBufferSize - THe size of the Version string buffer
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306038 \return QDF_STATUS
6039 QDF_STATUS_E_INVAL - failure
6040 QDF_STATUS_SUCCESS success
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006041 ---------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306042QDF_STATUS sme_get_wcnss_hardware_version(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006043 uint8_t *pVersion,
6044 uint32_t versionBufferSize)
6045{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306046 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006047 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
6048
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306049 if (QDF_STATUS_SUCCESS == sme_acquire_global_lock(&pMac->sme)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006050 if (pVersion != NULL)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306051 status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006052 else
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306053 status = QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006054
6055 sme_release_global_lock(&pMac->sme);
6056 }
6057
6058 return status;
6059}
6060
6061#ifdef FEATURE_WLAN_WAPI
6062
6063/* ---------------------------------------------------------------------------
6064 \fn sme_scan_get_bkid_candidate_list
6065 \brief a wrapper function to return the BKID candidate list
6066 \param pBkidList - caller allocated buffer point to an array of
6067 tBkidCandidateInfo
6068 \param pNumItems - pointer to a variable that has the number of
6069 tBkidCandidateInfo allocated when retruning, this is
6070 either the number needed or number of items put into
6071 pPmkidList
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306072 \return QDF_STATUS - when fail, it usually means the buffer allocated is not
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006073 big enough and pNumItems
6074 has the number of tBkidCandidateInfo.
6075 \Note: pNumItems is a number of tBkidCandidateInfo,
6076 not sizeof(tBkidCandidateInfo) * something
6077 ---------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306078QDF_STATUS sme_scan_get_bkid_candidate_list(tHalHandle hHal, uint32_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006079 tBkidCandidateInfo *pBkidList,
6080 uint32_t *pNumItems)
6081{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306082 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006083 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
6084
6085 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306086 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006087 status =
6088 csr_scan_get_bkid_candidate_list(pMac, sessionId, pBkidList,
6089 pNumItems);
6090 sme_release_global_lock(&pMac->sme);
6091 }
6092
6093 return status;
6094}
6095#endif /* FEATURE_WLAN_WAPI */
6096
6097#ifdef FEATURE_OEM_DATA_SUPPORT
Krishna Kumaar Natarajanc5e06ac2016-06-30 16:49:19 -07006098/**
6099 * sme_oem_data_req() - send oem data request to WMA
6100 * @hal: HAL handle
6101 * @hdd_oem_req: OEM data request from HDD
6102 *
6103 * Return: QDF_STATUS
6104 */
Krishna Kumaar Natarajanc1fa17d2016-08-03 14:19:20 -07006105QDF_STATUS sme_oem_data_req(tHalHandle hal, struct oem_data_req *hdd_oem_req)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006106{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306107 QDF_STATUS status = QDF_STATUS_SUCCESS;
Krishna Kumaar Natarajanc5e06ac2016-06-30 16:49:19 -07006108 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
Krishna Kumaar Natarajanc1fa17d2016-08-03 14:19:20 -07006109 struct oem_data_req *oem_data_req;
Krishna Kumaar Natarajanc5e06ac2016-06-30 16:49:19 -07006110 void *wma_handle;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006111
Krishna Kumaar Natarajanc5e06ac2016-06-30 16:49:19 -07006112 sms_log(mac_ctx, LOG1, FL("enter"));
6113 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
6114 if (!wma_handle) {
6115 sms_log(mac_ctx, LOGE, FL("wma_handle is NULL"));
6116 return QDF_STATUS_E_FAILURE;
6117 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006118
Krishna Kumaar Natarajanc5e06ac2016-06-30 16:49:19 -07006119 oem_data_req = qdf_mem_malloc(sizeof(*oem_data_req));
6120 if (!oem_data_req) {
6121 sms_log(mac_ctx, LOGE, FL("mem alloc failed"));
6122 return QDF_STATUS_E_NOMEM;
6123 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006124
Krishna Kumaar Natarajanc5e06ac2016-06-30 16:49:19 -07006125 oem_data_req->data_len = hdd_oem_req->data_len;
6126 oem_data_req->data = qdf_mem_malloc(oem_data_req->data_len);
6127 if (!oem_data_req->data) {
6128 sms_log(mac_ctx, LOGE, FL("mem alloc failed"));
6129 return QDF_STATUS_E_NOMEM;
6130 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006131
Krishna Kumaar Natarajanc5e06ac2016-06-30 16:49:19 -07006132 qdf_mem_copy(oem_data_req->data, hdd_oem_req->data,
6133 oem_data_req->data_len);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006134
Krishna Kumaar Natarajanc5e06ac2016-06-30 16:49:19 -07006135 status = wma_start_oem_data_req(wma_handle, oem_data_req);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006136
Krishna Kumaar Natarajanc5e06ac2016-06-30 16:49:19 -07006137 if (!QDF_IS_STATUS_SUCCESS(status)) {
6138 sms_log(mac_ctx, LOGE, FL("Post oem data request msg fail"));
6139 } else {
6140 sms_log(mac_ctx, LOG1,
6141 FL("OEM request(length: %d) sent to WMA"),
6142 oem_data_req->data_len);
6143 }
6144
6145 if (oem_data_req->data_len)
6146 qdf_mem_free(oem_data_req->data);
6147 qdf_mem_free(oem_data_req);
6148
6149 sms_log(mac_ctx, LOG1, FL("exit"));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006150 return status;
6151}
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006152#endif /*FEATURE_OEM_DATA_SUPPORT */
6153
6154/*--------------------------------------------------------------------------
6155
6156 \brief sme_open_session() - Open a session for scan/roam operation.
6157
6158 This is a synchronous API.
6159
6160 \param hHal - The handle returned by mac_open.
6161 \param callback - A pointer to the function caller specifies for
6162 roam/connect status indication
6163 \param pContext - The context passed with callback
6164 \param pSelfMacAddr - Caller allocated memory filled with self MAC address
6165 (6 bytes)
6166 \param pbSessionId - pointer to a caller allocated buffer for returned session ID
6167
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306168 \return QDF_STATUS_SUCCESS - session is opened. sessionId returned.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006169
6170 Other status means SME is failed to open the session.
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306171 QDF_STATUS_E_RESOURCES - no more session available.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006172 \sa
6173
6174 --------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306175QDF_STATUS sme_open_session(tHalHandle hHal, csr_roam_completeCallback callback,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006176 void *pContext,
6177 uint8_t *pSelfMacAddr, uint8_t *pbSessionId,
6178 uint32_t type, uint32_t subType)
6179{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306180 QDF_STATUS status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006181 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
6182
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05306183 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_HIGH,
Peng Xu66162de2016-02-11 17:01:20 -08006184 "%s: type=%d, subType=%d addr:%pM",
6185 __func__, type, subType, pSelfMacAddr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006186
6187 if (NULL == pbSessionId) {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306188 status = QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006189 } else {
6190 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306191 if (QDF_IS_STATUS_SUCCESS(status)) {
Peng Xu66162de2016-02-11 17:01:20 -08006192 status = csr_roam_open_session(pMac, callback, pContext,
6193 pSelfMacAddr,
6194 pbSessionId, type,
6195 subType);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006196
6197 sme_release_global_lock(&pMac->sme);
6198 }
6199 }
6200 if (NULL != pbSessionId)
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05306201 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006202 TRACE_CODE_SME_RX_HDD_OPEN_SESSION,
6203 *pbSessionId, 0));
6204
6205 return status;
6206}
6207
6208/*--------------------------------------------------------------------------
6209
6210 \brief sme_close_session() - Open a session for scan/roam operation.
6211
6212 This is a synchronous API.
6213
6214 \param hHal - The handle returned by mac_open.
6215
6216 \param sessionId - A previous opened session's ID.
6217
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306218 \return QDF_STATUS_SUCCESS - session is closed.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006219
6220 Other status means SME is failed to open the session.
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306221 QDF_STATUS_E_INVAL - session is not opened.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006222 \sa
6223
6224 --------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306225QDF_STATUS sme_close_session(tHalHandle hHal, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006226 csr_roamSessionCloseCallback callback,
6227 void *pContext)
6228{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306229 QDF_STATUS status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006230 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
6231
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05306232 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006233 TRACE_CODE_SME_RX_HDD_CLOSE_SESSION, sessionId, 0));
6234 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306235 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006236 status = csr_roam_close_session(pMac, sessionId, false,
6237 callback, pContext);
6238
6239 sme_release_global_lock(&pMac->sme);
6240 }
6241
6242 return status;
6243}
6244
6245/* ---------------------------------------------------------------------------
6246
6247 \fn sme_roam_update_apwpsie
6248
6249 \brief To update AP's WPS IE. This function should be called after SME AP session is created
6250 This is an asynchronous API.
6251
6252 \param pAPWPSIES - pointer to a caller allocated object of tSirAPWPSIEs
6253
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306254 \return QDF_STATUS – SUCCESS –
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006255
6256 FAILURE or RESOURCES – The API finished and failed.
6257
6258 -------------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306259QDF_STATUS sme_roam_update_apwpsie(tHalHandle hHal, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006260 tSirAPWPSIEs *pAPWPSIES)
6261{
6262
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306263 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006264 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
6265
6266 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306267 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006268
6269 status = csr_roam_update_apwpsie(pMac, sessionId, pAPWPSIES);
6270
6271 sme_release_global_lock(&pMac->sme);
6272 }
6273
6274 return status;
6275}
6276
6277/* ---------------------------------------------------------------------------
6278
6279 \fn sme_roam_update_apwparsni_es
6280
6281 \brief To update AP's WPA/RSN IEs. This function should be called after SME AP session is created
6282 This is an asynchronous API.
6283
6284 \param pAPSirRSNie - pointer to a caller allocated object of tSirRSNie with WPS/RSN IEs
6285
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306286 \return QDF_STATUS – SUCCESS –
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006287
6288 FAILURE or RESOURCES – The API finished and failed.
6289
6290 -------------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306291QDF_STATUS sme_roam_update_apwparsni_es(tHalHandle hHal, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006292 tSirRSNie *pAPSirRSNie)
6293{
6294
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306295 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006296 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
6297
6298 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306299 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006300
6301 status = csr_roam_update_wparsni_es(pMac, sessionId, pAPSirRSNie);
6302
6303 sme_release_global_lock(&pMac->sme);
6304 }
6305
6306 return status;
6307}
6308
6309/* ---------------------------------------------------------------------------
6310
6311 \fn sme_change_mcc_beacon_interval
6312
6313 \brief To update P2P-GO beaconInterval. This function should be called after
6314 disassociating all the station is done
6315 This is an asynchronous API.
6316
6317 \param
6318
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306319 \return QDF_STATUS SUCCESS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006320 FAILURE or RESOURCES
6321 The API finished and failed.
6322
6323 -------------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306324QDF_STATUS sme_change_mcc_beacon_interval(tHalHandle hHal, uint8_t sessionId)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006325{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306326 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006327 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
6328
6329 sms_log(pMac, LOG1, FL("Update Beacon PARAMS "));
6330 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306331 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006332 status = csr_send_chng_mcc_beacon_interval(pMac, sessionId);
6333 sme_release_global_lock(&pMac->sme);
6334 }
6335 return status;
6336}
6337
6338/**
6339 * sme_set_host_offload(): API to set the host offload feature.
6340 * @hHal: The handle returned by mac_open.
6341 * @sessionId: Session Identifier
6342 * @request: Pointer to the offload request.
6343 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306344 * Return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006345 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306346QDF_STATUS sme_set_host_offload(tHalHandle hHal, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006347 tpSirHostOffloadReq request)
6348{
6349 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306350 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006351
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05306352 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006353 TRACE_CODE_SME_RX_HDD_SET_HOSTOFFLOAD, sessionId, 0));
6354 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306355 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006356#ifdef WLAN_NS_OFFLOAD
6357 if (SIR_IPV6_NS_OFFLOAD == request->offloadType) {
6358 status = sme_set_ps_ns_offload(hHal, request,
6359 sessionId);
6360 } else
6361#endif /* WLAN_NS_OFFLOAD */
6362 {
6363 status = sme_set_ps_host_offload(hHal, request,
6364 sessionId);
6365 }
6366 sme_release_global_lock(&pMac->sme);
6367 }
6368
6369 return status;
6370}
6371
6372#ifdef WLAN_FEATURE_GTK_OFFLOAD
6373/**
6374 * sme_set_gtk_offload(): API to set GTK offload information.
6375 * @hHal: The handle returned by mac_open.
6376 * @sessionId: Session Identifier
6377 * @pGtkOffload: Pointer to the GTK offload request..
6378 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306379 * Return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006380 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306381QDF_STATUS sme_set_gtk_offload(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006382 tpSirGtkOffloadParams pGtkOffload,
6383 uint8_t sessionId)
6384{
6385 tpSirGtkOffloadParams request_buf;
6386 cds_msg_t msg;
6387 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
6388 tCsrRoamSession *pSession = CSR_GET_SESSION(pMac, sessionId);
6389
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05306390 QDF_TRACE(QDF_MODULE_ID_HDD, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006391 "%s: KeyReplayCounter: %lld", __func__,
6392 pGtkOffload->ullKeyReplayCounter);
6393
6394 if (NULL == pSession) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05306395 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006396 "%s: Session not found ", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306397 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006398 }
6399
Anurag Chouhan600c3a02016-03-01 10:33:54 +05306400 request_buf = qdf_mem_malloc(sizeof(*request_buf));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006401 if (NULL == request_buf) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05306402 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006403 FL("Not able to allocate memory for GTK offload request"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306404 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006405 }
6406
Anurag Chouhanc5548422016-02-24 18:33:27 +05306407 qdf_copy_macaddr(&pGtkOffload->bssid,
Srinivas Girigowda2213b1d2015-11-20 17:10:11 -08006408 &pSession->connectedProfile.bssid);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006409
6410 *request_buf = *pGtkOffload;
6411
6412 msg.type = WMA_GTK_OFFLOAD_REQ;
6413 msg.reserved = 0;
6414 msg.bodyptr = request_buf;
Sreelakshmi Konamki6a065362016-05-31 16:05:01 +05306415 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
6416 sessionId, msg.type));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306417 if (!QDF_IS_STATUS_SUCCESS
Anurag Chouhan6d760662016-02-20 16:05:43 +05306418 (cds_mq_post_message(QDF_MODULE_ID_WMA, &msg))) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05306419 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006420 FL("Not able to post SIR_HAL_SET_GTK_OFFLOAD message to HAL"));
Anurag Chouhan600c3a02016-03-01 10:33:54 +05306421 qdf_mem_free(request_buf);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306422 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006423 }
6424
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306425 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006426}
6427
6428/**
6429 * sme_get_gtk_offload(): API to get GTK offload information
6430 * @hHal: The handle returned by mac_open.
6431 * @callback_routine: callback_routine.
6432 * @sessionId: Session Identifier.
6433 * callback_context: callback_context.
6434 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306435 * Return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006436 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306437QDF_STATUS sme_get_gtk_offload(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006438 gtk_offload_get_info_callback callback_routine,
6439 void *callback_context, uint8_t session_id)
6440{
6441 tpSirGtkOffloadGetInfoRspParams request_buf;
6442 cds_msg_t msg;
6443 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
6444 tCsrRoamSession *pSession = CSR_GET_SESSION(pMac, session_id);
6445
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05306446 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO, "%s: Entered",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006447 __func__);
6448
6449 if (NULL == pSession) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05306450 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Srinivas Girigowda2213b1d2015-11-20 17:10:11 -08006451 "%s: Session not found", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306452 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006453 }
6454
Anurag Chouhan600c3a02016-03-01 10:33:54 +05306455 request_buf = qdf_mem_malloc(sizeof(*request_buf));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006456 if (NULL == request_buf) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05306457 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006458 FL("Not able to allocate memory for Get GTK offload request"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306459 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006460 }
6461
Anurag Chouhanc5548422016-02-24 18:33:27 +05306462 qdf_copy_macaddr(&request_buf->bssid,
Srinivas Girigowda2213b1d2015-11-20 17:10:11 -08006463 &pSession->connectedProfile.bssid);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006464
6465 msg.type = WMA_GTK_OFFLOAD_GETINFO_REQ;
6466 msg.reserved = 0;
6467 msg.bodyptr = request_buf;
6468
6469 /* Cache the Get GTK Offload callback information */
6470 if (NULL != pMac->sme.gtk_offload_get_info_cb) {
6471
6472 /* Do we need to check if the callback is in use? */
6473 /* Because we are not sending the same message again
6474 * when it is pending,
6475 * the only case when the callback is not NULL is that
6476 * the previous message was timed out or failed.
6477 * So, it will be safe to set the callback in this case.
6478 */
6479 }
6480
6481 pMac->sme.gtk_offload_get_info_cb = callback_routine;
6482 pMac->sme.gtk_offload_get_info_cb_context = callback_context;
Sreelakshmi Konamki6a065362016-05-31 16:05:01 +05306483 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
6484 session_id, msg.type));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306485 if (!QDF_IS_STATUS_SUCCESS
Anurag Chouhan6d760662016-02-20 16:05:43 +05306486 (cds_mq_post_message(QDF_MODULE_ID_WMA, &msg))) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05306487 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006488 FL("Not able to post WMA_GTK_OFFLOAD_GETINFO_REQ message to WMA"));
Anurag Chouhan600c3a02016-03-01 10:33:54 +05306489 qdf_mem_free(request_buf);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306490 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006491 }
6492
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306493 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006494}
6495#endif /* WLAN_FEATURE_GTK_OFFLOAD */
6496
6497/* ---------------------------------------------------------------------------
6498 \fn sme_set_keep_alive
6499 \brief API to set the Keep Alive feature.
6500 \param hHal - The handle returned by mac_open.
6501 \param request - Pointer to the Keep Alive request.
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306502 \return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006503 ---------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306504QDF_STATUS sme_set_keep_alive(tHalHandle hHal, uint8_t session_id,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006505 tpSirKeepAliveReq request)
6506{
6507 tpSirKeepAliveReq request_buf;
6508 cds_msg_t msg;
6509 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
6510 tCsrRoamSession *pSession = CSR_GET_SESSION(pMac, session_id);
6511
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05306512 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO_LOW,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006513 FL("WMA_SET_KEEP_ALIVE message"));
6514
6515 if (pSession == NULL) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05306516 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006517 FL("Session not Found"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306518 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006519 }
Anurag Chouhan600c3a02016-03-01 10:33:54 +05306520 request_buf = qdf_mem_malloc(sizeof(tSirKeepAliveReq));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006521 if (NULL == request_buf) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05306522 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006523 FL("Not able to allocate memory for keep alive request"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306524 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006525 }
6526
Anurag Chouhanc5548422016-02-24 18:33:27 +05306527 qdf_copy_macaddr(&request->bssid, &pSession->connectedProfile.bssid);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05306528 qdf_mem_copy(request_buf, request, sizeof(tSirKeepAliveReq));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006529
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05306530 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO_LOW,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006531 "buff TP %d input TP %d ", request_buf->timePeriod,
6532 request->timePeriod);
6533 request_buf->sessionId = session_id;
6534
6535 msg.type = WMA_SET_KEEP_ALIVE;
6536 msg.reserved = 0;
6537 msg.bodyptr = request_buf;
Sreelakshmi Konamki6a065362016-05-31 16:05:01 +05306538 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
6539 session_id, msg.type));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306540 if (QDF_STATUS_SUCCESS !=
Anurag Chouhan6d760662016-02-20 16:05:43 +05306541 cds_mq_post_message(QDF_MODULE_ID_WMA, &msg)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05306542 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006543 FL("Not able to post WMA_SET_KEEP_ALIVE message to WMA"));
Anurag Chouhan600c3a02016-03-01 10:33:54 +05306544 qdf_mem_free(request_buf);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306545 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006546 }
6547
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306548 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006549}
6550
6551#ifdef FEATURE_WLAN_SCAN_PNO
6552/* ---------------------------------------------------------------------------
6553 \fn sme_set_preferred_network_list
6554 \brief API to set the Preferred Network List Offload feature.
6555 \param hHal - The handle returned by mac_open.
6556 \param request - Pointer to the offload request.
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306557 \return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006558 ---------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306559QDF_STATUS sme_set_preferred_network_list(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006560 tpSirPNOScanReq request,
6561 uint8_t sessionId,
6562 void (*callback_routine)(void *callback_context,
6563 tSirPrefNetworkFoundInd
6564 *pPrefNetworkFoundInd),
6565 void *callback_context)
6566{
6567 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306568 QDF_STATUS status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006569
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05306570 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Sreelakshmi Konamki6744cff2015-09-07 12:10:39 +05306571 TRACE_CODE_SME_RX_HDD_PREF_NET_LIST,
6572 sessionId, request->ucNetworksCount));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006573 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306574 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006575 sme_set_ps_preferred_network_list(hHal, request, sessionId,
6576 callback_routine, callback_context);
6577 sme_release_global_lock(&pMac->sme);
6578 }
6579
6580 return status;
6581}
6582
6583#endif /* FEATURE_WLAN_SCAN_PNO */
6584
6585/* ---------------------------------------------------------------------------
6586 \fn sme_abort_mac_scan
6587 \brief API to cancel MAC scan.
6588 \param hHal - The handle returned by mac_open.
6589 \param sessionId - sessionId on which we need to abort scan.
6590 \param reason - Reason to abort the scan.
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306591 \return QDF_STATUS
6592 QDF_STATUS_E_FAILURE - failure
6593 QDF_STATUS_SUCCESS success
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006594 ---------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306595QDF_STATUS sme_abort_mac_scan(tHalHandle hHal, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006596 eCsrAbortReason reason)
6597{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306598 QDF_STATUS status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006599 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
6600
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05306601 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006602 TRACE_CODE_SME_RX_HDD_ABORT_MACSCAN, NO_SESSION, 0));
6603 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306604 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006605 status = csr_scan_abort_mac_scan(pMac, sessionId, reason);
6606
6607 sme_release_global_lock(&pMac->sme);
6608 }
6609
6610 return status;
6611}
6612
6613/* ----------------------------------------------------------------------------
6614 \fn sme_get_operation_channel
6615 \brief API to get current channel on which STA is parked
6616 this function gives channel information only of infra station or IBSS station
6617 \param hHal, pointer to memory location and sessionId
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306618 \returns QDF_STATUS_SUCCESS
6619 QDF_STATUS_E_FAILURE
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006620 -------------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306621QDF_STATUS sme_get_operation_channel(tHalHandle hHal, uint32_t *pChannel,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006622 uint8_t sessionId)
6623{
6624 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
6625 tCsrRoamSession *pSession;
6626
6627 if (CSR_IS_SESSION_VALID(pMac, sessionId)) {
6628 pSession = CSR_GET_SESSION(pMac, sessionId);
6629
6630 if ((pSession->connectedProfile.BSSType ==
6631 eCSR_BSS_TYPE_INFRASTRUCTURE)
6632 || (pSession->connectedProfile.BSSType ==
6633 eCSR_BSS_TYPE_IBSS)
6634 || (pSession->connectedProfile.BSSType ==
6635 eCSR_BSS_TYPE_INFRA_AP)
6636 || (pSession->connectedProfile.BSSType ==
6637 eCSR_BSS_TYPE_START_IBSS)) {
6638 *pChannel = pSession->connectedProfile.operationChannel;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306639 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006640 }
6641 }
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306642 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006643} /* sme_get_operation_channel ends here */
6644
Abhishek Singh7996eb72015-12-30 17:24:02 +05306645/**
Selvaraj, Sridhar4577a9b2016-09-04 15:17:07 +05306646 * sme_register_p2p_ack_ind_callback() - p2p ack indication callback
6647 * @hal: hal pointer
6648 * @callback: callback pointer to be registered
6649 *
6650 * This function is used to register a callback to PE for p2p ack
6651 * indication
6652 *
6653 * Return: Success if msg is posted to PE else Failure.
6654 */
6655QDF_STATUS sme_register_p2p_ack_ind_callback(tHalHandle hal,
6656 sir_p2p_ack_ind_callback callback)
6657{
6658 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
6659 struct sir_sme_p2p_ack_ind_cb_req *msg;
6660 QDF_STATUS status = QDF_STATUS_SUCCESS;
6661 sms_log(mac_ctx, LOG1, FL(": ENTER"));
6662 status = sme_acquire_global_lock(&mac_ctx->sme);
6663 if (QDF_IS_STATUS_SUCCESS(status)) {
6664 msg = qdf_mem_malloc(sizeof(*msg));
6665 if (NULL == msg) {
6666 sms_log(mac_ctx, LOGE,
6667 FL("Failed to allocate memory"));
6668 sme_release_global_lock(&mac_ctx->sme);
6669 return QDF_STATUS_E_NOMEM;
6670 }
Selvaraj, Sridhar4577a9b2016-09-04 15:17:07 +05306671 msg->message_type = eWNI_SME_REGISTER_P2P_ACK_CB;
6672 msg->length = sizeof(*msg);
6673
6674 msg->callback = callback;
6675 status = cds_send_mb_message_to_mac(msg);
6676 sme_release_global_lock(&mac_ctx->sme);
6677 return status;
6678 }
6679 return status;
6680}
6681
6682/**
Abhishek Singh7996eb72015-12-30 17:24:02 +05306683 * sme_register_mgmt_frame_ind_callback() - Register a callback for
6684 * management frame indication to PE.
6685 *
6686 * @hal: hal pointer
6687 * @callback: callback pointer to be registered
6688 *
6689 * This function is used to register a callback for management
6690 * frame indication to PE.
6691 *
6692 * Return: Success if msg is posted to PE else Failure.
6693 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306694QDF_STATUS sme_register_mgmt_frame_ind_callback(tHalHandle hal,
Abhishek Singh7996eb72015-12-30 17:24:02 +05306695 sir_mgmt_frame_ind_callback callback)
6696{
6697 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
6698 struct sir_sme_mgmt_frame_cb_req *msg;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306699 QDF_STATUS status = QDF_STATUS_SUCCESS;
Abhishek Singh7996eb72015-12-30 17:24:02 +05306700
6701 sms_log(mac_ctx, LOG1, FL(": ENTER"));
6702
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306703 if (QDF_STATUS_SUCCESS ==
Abhishek Singh7996eb72015-12-30 17:24:02 +05306704 sme_acquire_global_lock(&mac_ctx->sme)) {
Anurag Chouhan600c3a02016-03-01 10:33:54 +05306705 msg = qdf_mem_malloc(sizeof(*msg));
Abhishek Singh7996eb72015-12-30 17:24:02 +05306706 if (NULL == msg) {
6707 sms_log(mac_ctx, LOGE,
6708 FL("Not able to allocate memory for eWNI_SME_REGISTER_MGMT_FRAME_CB"));
6709 sme_release_global_lock(&mac_ctx->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306710 return QDF_STATUS_E_NOMEM;
Abhishek Singh7996eb72015-12-30 17:24:02 +05306711 }
Abhishek Singh7996eb72015-12-30 17:24:02 +05306712 msg->message_type = eWNI_SME_REGISTER_MGMT_FRAME_CB;
6713 msg->length = sizeof(*msg);
6714
6715 msg->callback = callback;
6716 status = cds_send_mb_message_to_mac(msg);
6717 sme_release_global_lock(&mac_ctx->sme);
6718 return status;
6719 }
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306720 return QDF_STATUS_E_FAILURE;
Abhishek Singh7996eb72015-12-30 17:24:02 +05306721}
6722
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006723/* ---------------------------------------------------------------------------
6724
6725 \fn sme_RegisterMgtFrame
6726
6727 \brief To register managment frame of specified type and subtype.
6728 \param frameType - type of the frame that needs to be passed to HDD.
6729 \param matchData - data which needs to be matched before passing frame
6730 to HDD.
6731 \param matchDataLen - Length of matched data.
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306732 \return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006733 -------------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306734QDF_STATUS sme_register_mgmt_frame(tHalHandle hHal, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006735 uint16_t frameType, uint8_t *matchData,
6736 uint16_t matchLen)
6737{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306738 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006739 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
6740
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05306741 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006742 TRACE_CODE_SME_RX_HDD_REGISTER_MGMTFR, sessionId, 0));
6743 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306744 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006745 tSirRegisterMgmtFrame *pMsg;
6746 uint16_t len;
6747 tCsrRoamSession *pSession = CSR_GET_SESSION(pMac, sessionId);
6748
6749 if (!CSR_IS_SESSION_ANY(sessionId) && !pSession) {
6750 sms_log(pMac, LOGE, FL(" session %d not found "),
6751 sessionId);
6752 sme_release_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306753 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006754 }
6755
6756 if (!CSR_IS_SESSION_ANY(sessionId) && !pSession->sessionActive) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05306757 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006758 "%s Invalid Sessionid", __func__);
6759 sme_release_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306760 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006761 }
6762
6763 len = sizeof(tSirRegisterMgmtFrame) + matchLen;
6764
Anurag Chouhan600c3a02016-03-01 10:33:54 +05306765 pMsg = qdf_mem_malloc(len);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006766 if (NULL == pMsg)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306767 status = QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006768 else {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006769 pMsg->messageType = eWNI_SME_REGISTER_MGMT_FRAME_REQ;
6770 pMsg->length = len;
6771 pMsg->sessionId = sessionId;
6772 pMsg->registerFrame = true;
6773 pMsg->frameType = frameType;
6774 pMsg->matchLen = matchLen;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05306775 qdf_mem_copy(pMsg->matchData, matchData, matchLen);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006776 status = cds_send_mb_message_to_mac(pMsg);
6777 }
6778 sme_release_global_lock(&pMac->sme);
6779 }
6780 return status;
6781}
6782
6783/* ---------------------------------------------------------------------------
6784
6785 \fn sme_DeregisterMgtFrame
6786
6787 \brief To De-register managment frame of specified type and subtype.
6788 \param frameType - type of the frame that needs to be passed to HDD.
6789 \param matchData - data which needs to be matched before passing frame
6790 to HDD.
6791 \param matchDataLen - Length of matched data.
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306792 \return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006793 -------------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306794QDF_STATUS sme_deregister_mgmt_frame(tHalHandle hHal, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006795 uint16_t frameType, uint8_t *matchData,
6796 uint16_t matchLen)
6797{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306798 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006799 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
6800
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05306801 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006802 TRACE_CODE_SME_RX_HDD_DEREGISTER_MGMTFR, sessionId,
6803 0));
6804 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306805 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006806 tSirRegisterMgmtFrame *pMsg;
6807 uint16_t len;
6808 tCsrRoamSession *pSession = CSR_GET_SESSION(pMac, sessionId);
6809
6810 if (!CSR_IS_SESSION_ANY(sessionId) && !pSession) {
6811 sms_log(pMac, LOGE, FL(" session %d not found "),
6812 sessionId);
6813 sme_release_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306814 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006815 }
6816
6817 if (!CSR_IS_SESSION_ANY(sessionId) && !pSession->sessionActive) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05306818 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006819 "%s Invalid Sessionid", __func__);
6820 sme_release_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306821 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006822 }
6823
6824 len = sizeof(tSirRegisterMgmtFrame) + matchLen;
6825
Anurag Chouhan600c3a02016-03-01 10:33:54 +05306826 pMsg = qdf_mem_malloc(len);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006827 if (NULL == pMsg)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306828 status = QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006829 else {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006830 pMsg->messageType = eWNI_SME_REGISTER_MGMT_FRAME_REQ;
6831 pMsg->length = len;
6832 pMsg->registerFrame = false;
6833 pMsg->frameType = frameType;
6834 pMsg->matchLen = matchLen;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05306835 qdf_mem_copy(pMsg->matchData, matchData, matchLen);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006836 status = cds_send_mb_message_to_mac(pMsg);
6837 }
6838 sme_release_global_lock(&pMac->sme);
6839 }
6840 return status;
6841}
6842
6843/**
6844 * sme_remain_on_channel - API to request remain on channel for 'x' duration
6845 *
6846 * @hHal: pointer to MAC handle
6847 * @session_id: Session identifier
6848 * @channel: channel information
6849 * @duration: duration in ms
6850 * @callback: HDD registered callback to process reaminOnChannelRsp
6851 * @context: HDD Callback param
6852 * @scan_id: scan identifier
6853 *
6854 * This function process the roc request and generates scan identifier.s
6855 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306856 * Return: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006857 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306858QDF_STATUS sme_remain_on_channel(tHalHandle hHal, uint8_t session_id,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006859 uint8_t channel, uint32_t duration,
6860 remainOnChanCallback callback,
6861 void *pContext, uint8_t isP2PProbeReqAllowed,
6862 uint32_t *scan_id)
6863{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306864 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006865 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hHal);
6866 uint32_t san_req_id, scan_count;
6867 struct ani_roc_req *roc_msg;
6868 cds_msg_t msg;
6869
6870
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05306871 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006872 TRACE_CODE_SME_RX_HDD_REMAIN_ONCHAN, session_id, 0));
6873
6874 scan_count = csr_ll_count(&mac_ctx->sme.smeScanCmdActiveList);
6875 if (scan_count >= mac_ctx->scan.max_scan_count) {
6876 sms_log(mac_ctx, LOGE, FL("Max scan reached"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306877 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006878 }
6879
6880 wma_get_scan_id(&san_req_id);
6881 *scan_id = san_req_id;
6882 status = sme_acquire_global_lock(&mac_ctx->sme);
6883
6884 sms_log(mac_ctx, LOG1, FL(" called"));
Anurag Chouhan600c3a02016-03-01 10:33:54 +05306885 roc_msg = qdf_mem_malloc(sizeof(struct ani_roc_req));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006886 if (NULL == roc_msg) {
6887 sms_log(mac_ctx, LOGE,
6888 " scan_req: failed to allocate mem for msg");
6889 sme_release_global_lock(&mac_ctx->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306890 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006891 }
6892 roc_msg->msg_type = eWNI_SME_ROC_CMD;
6893 roc_msg->msg_len = (uint16_t) sizeof(struct ani_roc_req);
6894 roc_msg->session_id = session_id;
6895 roc_msg->callback = callback;
6896 roc_msg->duration = duration;
6897 roc_msg->channel = channel;
6898 roc_msg->is_p2pprobe_allowed = isP2PProbeReqAllowed;
6899 roc_msg->ctx = pContext;
6900 roc_msg->scan_id = *scan_id;
6901 msg.type = eWNI_SME_ROC_CMD;
6902 msg.bodyptr = roc_msg;
6903 msg.reserved = 0;
6904 msg.bodyval = 0;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306905 if (QDF_STATUS_SUCCESS !=
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006906 cds_mq_post_message(CDS_MQ_ID_SME, &msg)) {
6907 sms_log(mac_ctx, LOGE,
6908 " sme_scan_req failed to post msg");
Anurag Chouhan600c3a02016-03-01 10:33:54 +05306909 qdf_mem_free(roc_msg);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306910 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006911 }
6912 sme_release_global_lock(&mac_ctx->sme);
6913 return status;
6914}
6915
6916/* ---------------------------------------------------------------------------
6917 \fn sme_report_probe_req
6918 \brief API to enable/disable forwarding of probeReq to apps in p2p.
6919 \param hHal - The handle returned by mac_open.
6920 \param falg: to set the Probe request forarding to wpa_supplicant in listen state in p2p
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306921 \return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006922 ---------------------------------------------------------------------------*/
6923
6924#ifndef WLAN_FEATURE_CONCURRENT_P2P
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306925QDF_STATUS sme_report_probe_req(tHalHandle hHal, uint8_t flag)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006926{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306927 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006928 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
6929
6930 do {
6931 /* acquire the lock for the sme object */
6932 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306933 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006934 /* call set in context */
6935 pMac->p2pContext.probeReqForwarding = flag;
6936 /* release the lock for the sme object */
6937 sme_release_global_lock(&pMac->sme);
6938 }
6939 } while (0);
6940
6941 sms_log(pMac, LOGW, "exiting function %s", __func__);
6942
6943 return status;
6944}
6945
6946/* ---------------------------------------------------------------------------
6947 \fn sme_update_p2p_ie
6948 \brief API to set the P2p Ie in p2p context
6949 \param hHal - The handle returned by mac_open.
6950 \param p2pIe - Ptr to p2pIe from HDD.
6951 \param p2pIeLength: length of p2pIe
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306952 \return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006953 ---------------------------------------------------------------------------*/
6954
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306955QDF_STATUS sme_update_p2p_ie(tHalHandle hHal, void *p2pIe, uint32_t p2pIeLength)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006956{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306957 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006958 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
6959
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05306960 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006961 TRACE_CODE_SME_RX_HDD_UPDATE_P2P_IE, NO_SESSION, 0));
6962 /* acquire the lock for the sme object */
6963 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306964 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006965 if (NULL != pMac->p2pContext.probeRspIe) {
Anurag Chouhan600c3a02016-03-01 10:33:54 +05306966 qdf_mem_free(pMac->p2pContext.probeRspIe);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006967 pMac->p2pContext.probeRspIeLength = 0;
6968 }
6969
Anurag Chouhan600c3a02016-03-01 10:33:54 +05306970 pMac->p2pContext.probeRspIe = qdf_mem_malloc(p2pIeLength);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006971 if (NULL == pMac->p2pContext.probeRspIe) {
6972 sms_log(pMac, LOGE, "%s: Unable to allocate P2P IE",
6973 __func__);
6974 pMac->p2pContext.probeRspIeLength = 0;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306975 status = QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006976 } else {
6977 pMac->p2pContext.probeRspIeLength = p2pIeLength;
6978
6979 sir_dump_buf(pMac, SIR_LIM_MODULE_ID, LOG2,
6980 pMac->p2pContext.probeRspIe,
6981 pMac->p2pContext.probeRspIeLength);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05306982 qdf_mem_copy((uint8_t *) pMac->p2pContext.probeRspIe,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006983 p2pIe, p2pIeLength);
6984 }
6985
6986 /* release the lock for the sme object */
6987 sme_release_global_lock(&pMac->sme);
6988 }
6989
6990 sms_log(pMac, LOG2, "exiting function %s", __func__);
6991
6992 return status;
6993}
6994#endif
6995
6996/* ---------------------------------------------------------------------------
6997 \fn sme_send_action
6998 \brief API to send action frame from supplicant.
6999 \param hHal - The handle returned by mac_open.
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307000 \return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007001 ---------------------------------------------------------------------------*/
7002
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307003QDF_STATUS sme_send_action(tHalHandle hHal, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007004 const uint8_t *pBuf, uint32_t len,
7005 uint16_t wait, bool noack,
7006 uint16_t channel_freq)
7007{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307008 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007009 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
7010
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05307011 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007012 TRACE_CODE_SME_RX_HDD_SEND_ACTION, sessionId, 0));
7013 /* acquire the lock for the sme object */
7014 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307015 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007016 p2p_send_action(hHal, sessionId, pBuf, len, wait, noack,
7017 channel_freq);
7018 /* release the lock for the sme object */
7019 sme_release_global_lock(&pMac->sme);
7020 }
7021
7022 sms_log(pMac, LOGW, "exiting function %s", __func__);
7023
7024 return status;
7025}
7026
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307027QDF_STATUS sme_cancel_remain_on_channel(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007028 uint8_t sessionId, uint32_t scan_id)
7029{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307030 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007031 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
7032
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05307033 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007034 TRACE_CODE_SME_RX_HDD_CANCEL_REMAIN_ONCHAN, sessionId,
7035 0));
7036 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307037 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007038 status = p2p_cancel_remain_on_channel(hHal, sessionId, scan_id);
7039 sme_release_global_lock(&pMac->sme);
7040 }
7041 return status;
7042}
7043
7044/* Power Save Related */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307045QDF_STATUS sme_p2p_set_ps(tHalHandle hHal, tP2pPsConfig *data)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007046{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307047 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007048 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
7049
7050 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307051 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007052 status = p2p_set_ps(hHal, data);
7053 sme_release_global_lock(&pMac->sme);
7054 }
7055 return status;
7056}
7057
7058/* ---------------------------------------------------------------------------
7059
7060 \fn sme_configure_rxp_filter
7061
7062 \brief
7063 SME will pass this request to lower mac to set/reset the filter on RXP for
7064 multicast & broadcast traffic.
7065
7066 \param
7067
7068 hHal - The handle returned by mac_open.
7069
7070 filterMask- Currently the API takes a 1 or 0 (set or reset) as filter.
7071 Basically to enable/disable the filter (to filter "all" mcbc traffic) based
7072 on this param. In future we can use this as a mask to set various types of
7073 filters as suggested below:
7074 FILTER_ALL_MULTICAST:
7075 FILTER_ALL_BROADCAST:
7076 FILTER_ALL_MULTICAST_BROADCAST:
7077
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307078 \return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007079
7080 --------------------------------------------------------------------------- */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307081QDF_STATUS sme_configure_rxp_filter(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007082 tpSirWlanSetRxpFilters wlanRxpFilterParam)
7083{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307084 QDF_STATUS status = QDF_STATUS_SUCCESS;
7085 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007086 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
7087 cds_msg_t cds_message;
7088
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05307089 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007090 TRACE_CODE_SME_RX_HDD_CONFIG_RXPFIL, NO_SESSION, 0));
7091 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307092 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007093 /* serialize the req through MC thread */
7094 cds_message.bodyptr = wlanRxpFilterParam;
7095 cds_message.type = WMA_CFG_RXP_FILTER_REQ;
Sreelakshmi Konamki6a065362016-05-31 16:05:01 +05307096 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
7097 NO_SESSION, cds_message.type));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307098 qdf_status = cds_mq_post_message(CDS_MQ_ID_WMA, &cds_message);
7099 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
7100 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007101 }
7102 sme_release_global_lock(&pMac->sme);
7103 }
7104 return status;
7105}
7106
7107/* ---------------------------------------------------------------------------
7108
7109 \fn sme_configure_suspend_ind
7110
7111 \brief
7112 SME will pass this request to lower mac to Indicate that the wlan needs to
7113 be suspended
7114
7115 \param
7116
7117 hHal - The handle returned by mac_open.
7118
7119 wlanSuspendParam- Depicts the wlan suspend params
7120
7121 csr_readyToSuspendCallback - Callback to be called when ready to suspend
7122 event is received.
7123 callback_context - Context associated with csr_readyToSuspendCallback.
7124
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307125 \return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007126
7127 --------------------------------------------------------------------------- */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307128QDF_STATUS sme_configure_suspend_ind(tHalHandle hHal,
Houston Hoffman7260ecb2015-10-05 18:43:07 -07007129 uint32_t conn_state_mask,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007130 csr_readyToSuspendCallback callback,
7131 void *callback_context)
7132{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307133 QDF_STATUS status = QDF_STATUS_SUCCESS;
7134 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007135 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
7136 cds_msg_t cds_message;
7137
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05307138 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007139 TRACE_CODE_SME_RX_HDD_CONFIG_SUSPENDIND, NO_SESSION,
7140 0));
7141
7142 pMac->readyToSuspendCallback = callback;
7143 pMac->readyToSuspendContext = callback_context;
7144
7145 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307146 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007147 /* serialize the req through MC thread */
Houston Hoffman7260ecb2015-10-05 18:43:07 -07007148 cds_message.bodyval = conn_state_mask;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007149 cds_message.type = WMA_WLAN_SUSPEND_IND;
Sreelakshmi Konamki6a065362016-05-31 16:05:01 +05307150 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
7151 NO_SESSION, cds_message.type));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307152 qdf_status = cds_mq_post_message(CDS_MQ_ID_WMA, &cds_message);
7153 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007154 pMac->readyToSuspendCallback = NULL;
7155 pMac->readyToSuspendContext = NULL;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307156 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007157 }
7158 sme_release_global_lock(&pMac->sme);
7159 }
7160
7161 return status;
7162}
7163
7164/* ---------------------------------------------------------------------------
7165
7166 \fn sme_configure_resume_req
7167
7168 \brief
7169 SME will pass this request to lower mac to Indicate that the wlan needs to
7170 be Resumed
7171
7172 \param
7173
7174 hHal - The handle returned by mac_open.
7175
7176 wlanResumeParam- Depicts the wlan resume params
7177
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307178 \return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007179
7180 --------------------------------------------------------------------------- */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307181QDF_STATUS sme_configure_resume_req(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007182 tpSirWlanResumeParam wlanResumeParam)
7183{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307184 QDF_STATUS status = QDF_STATUS_SUCCESS;
7185 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007186 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
7187 cds_msg_t cds_message;
7188
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05307189 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007190 TRACE_CODE_SME_RX_HDD_CONFIG_RESUMEREQ, NO_SESSION,
7191 0));
7192 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307193 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007194 /* serialize the req through MC thread */
7195 cds_message.bodyptr = wlanResumeParam;
7196 cds_message.type = WMA_WLAN_RESUME_REQ;
Sreelakshmi Konamki6a065362016-05-31 16:05:01 +05307197 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
7198 NO_SESSION, cds_message.type));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307199 qdf_status = cds_mq_post_message(CDS_MQ_ID_WMA, &cds_message);
7200 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
7201 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007202 }
7203 sme_release_global_lock(&pMac->sme);
7204 }
7205 return status;
7206}
7207
7208#ifdef WLAN_FEATURE_EXTWOW_SUPPORT
Krishna Kumaar Natarajand9131902015-10-19 11:52:47 -07007209/**
7210 * sme_configure_ext_wow() - configure Extr WoW
7211 * @hHal - The handle returned by mac_open.
7212 * @wlanExtParams - Depicts the wlan Ext params.
7213 * @callback - ext_wow callback to be registered.
7214 * @callback_context - ext_wow callback context
7215 *
7216 * SME will pass this request to lower mac to configure Extr WoW
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307217 * Return: QDF_STATUS
Krishna Kumaar Natarajand9131902015-10-19 11:52:47 -07007218 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307219QDF_STATUS sme_configure_ext_wow(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007220 tpSirExtWoWParams wlanExtParams,
7221 csr_readyToExtWoWCallback callback,
7222 void *callback_context)
7223{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307224 QDF_STATUS status = QDF_STATUS_SUCCESS;
7225 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007226 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
7227 cds_msg_t cds_message;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05307228 tpSirExtWoWParams MsgPtr = qdf_mem_malloc(sizeof(*MsgPtr));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007229
7230 if (!MsgPtr)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307231 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007232
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05307233 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007234 TRACE_CODE_SME_RX_HDD_CONFIG_EXTWOW, NO_SESSION, 0));
7235
7236 pMac->readyToExtWoWCallback = callback;
7237 pMac->readyToExtWoWContext = callback_context;
7238
7239 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307240 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007241
7242 /* serialize the req through MC thread */
Anurag Chouhan600c3a02016-03-01 10:33:54 +05307243 qdf_mem_copy(MsgPtr, wlanExtParams, sizeof(*MsgPtr));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007244 cds_message.bodyptr = MsgPtr;
7245 cds_message.type = WMA_WLAN_EXT_WOW;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307246 qdf_status = cds_mq_post_message(CDS_MQ_ID_WMA, &cds_message);
7247 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007248 pMac->readyToExtWoWCallback = NULL;
7249 pMac->readyToExtWoWContext = NULL;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05307250 qdf_mem_free(MsgPtr);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307251 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007252 }
7253 sme_release_global_lock(&pMac->sme);
7254 } else {
7255 pMac->readyToExtWoWCallback = NULL;
7256 pMac->readyToExtWoWContext = NULL;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05307257 qdf_mem_free(MsgPtr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007258 }
7259
7260 return status;
7261}
7262
7263/* ---------------------------------------------------------------------------
7264
7265 \fn sme_configure_app_type1_params
7266
7267 \brief
7268 SME will pass this request to lower mac to configure Indoor WoW parameters.
7269
7270 \param
7271
7272 hHal - The handle returned by mac_open.
7273
7274 wlanAppType1Params- Depicts the wlan App Type 1(Indoor) params
7275
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307276 \return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007277
7278 --------------------------------------------------------------------------- */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307279QDF_STATUS sme_configure_app_type1_params(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007280 tpSirAppType1Params wlanAppType1Params)
7281{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307282 QDF_STATUS status = QDF_STATUS_SUCCESS;
7283 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007284 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
7285 cds_msg_t cds_message;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05307286 tpSirAppType1Params MsgPtr = qdf_mem_malloc(sizeof(*MsgPtr));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007287
7288 if (!MsgPtr)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307289 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007290
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05307291 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007292 TRACE_CODE_SME_RX_HDD_CONFIG_APP_TYPE1, NO_SESSION,
7293 0));
7294
7295 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307296 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007297 /* serialize the req through MC thread */
Anurag Chouhan600c3a02016-03-01 10:33:54 +05307298 qdf_mem_copy(MsgPtr, wlanAppType1Params, sizeof(*MsgPtr));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007299 cds_message.bodyptr = MsgPtr;
7300 cds_message.type = WMA_WLAN_SET_APP_TYPE1_PARAMS;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307301 qdf_status = cds_mq_post_message(CDS_MQ_ID_WMA, &cds_message);
7302 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
Anurag Chouhan600c3a02016-03-01 10:33:54 +05307303 qdf_mem_free(MsgPtr);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307304 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007305 }
7306 sme_release_global_lock(&pMac->sme);
7307 } else {
Anurag Chouhan600c3a02016-03-01 10:33:54 +05307308 qdf_mem_free(MsgPtr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007309 }
7310
7311 return status;
7312}
7313
7314/* ---------------------------------------------------------------------------
7315
7316 \fn sme_configure_app_type2_params
7317
7318 \brief
7319 SME will pass this request to lower mac to configure Indoor WoW parameters.
7320
7321 \param
7322
7323 hHal - The handle returned by mac_open.
7324
7325 wlanAppType2Params- Depicts the wlan App Type 2 (Outdoor) params
7326
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307327 \return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007328
7329 --------------------------------------------------------------------------- */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307330QDF_STATUS sme_configure_app_type2_params(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007331 tpSirAppType2Params wlanAppType2Params)
7332{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307333 QDF_STATUS status = QDF_STATUS_SUCCESS;
7334 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007335 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
7336 cds_msg_t cds_message;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05307337 tpSirAppType2Params MsgPtr = qdf_mem_malloc(sizeof(*MsgPtr));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007338
7339 if (!MsgPtr)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307340 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007341
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05307342 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007343 TRACE_CODE_SME_RX_HDD_CONFIG_APP_TYPE2, NO_SESSION,
7344 0));
7345
7346 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307347 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007348 /* serialize the req through MC thread */
Anurag Chouhan600c3a02016-03-01 10:33:54 +05307349 qdf_mem_copy(MsgPtr, wlanAppType2Params, sizeof(*MsgPtr));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007350 cds_message.bodyptr = MsgPtr;
7351 cds_message.type = WMA_WLAN_SET_APP_TYPE2_PARAMS;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307352 qdf_status = cds_mq_post_message(CDS_MQ_ID_WMA, &cds_message);
7353 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
Anurag Chouhan600c3a02016-03-01 10:33:54 +05307354 qdf_mem_free(MsgPtr);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307355 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007356 }
7357 sme_release_global_lock(&pMac->sme);
7358 } else {
Anurag Chouhan600c3a02016-03-01 10:33:54 +05307359 qdf_mem_free(MsgPtr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007360 }
7361
7362 return status;
7363}
7364#endif
7365
7366/* ---------------------------------------------------------------------------
7367
7368 \fn sme_get_infra_session_id
7369
7370 \brief To get the session ID for infra session, if connected
7371 This is a synchronous API.
7372
7373 \param hHal - The handle returned by mac_open.
7374
7375 \return sessionid, -1 if infra session is not connected
7376
7377 -------------------------------------------------------------------------------*/
7378int8_t sme_get_infra_session_id(tHalHandle hHal)
7379{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307380 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007381 int8_t sessionid = -1;
7382 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
7383
7384 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307385 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007386
7387 sessionid = csr_get_infra_session_id(pMac);
7388
7389 sme_release_global_lock(&pMac->sme);
7390 }
7391
7392 return sessionid;
7393}
7394
7395/* ---------------------------------------------------------------------------
7396
7397 \fn sme_get_infra_operation_channel
7398
7399 \brief To get the operating channel for infra session, if connected
7400 This is a synchronous API.
7401
7402 \param hHal - The handle returned by mac_open.
7403 \param sessionId - the sessionId returned by sme_open_session.
7404
7405 \return operating channel, 0 if infra session is not connected
7406
7407 -------------------------------------------------------------------------------*/
7408uint8_t sme_get_infra_operation_channel(tHalHandle hHal, uint8_t sessionId)
7409{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307410 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007411 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
7412 uint8_t channel = 0;
7413 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307414 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007415
7416 channel = csr_get_infra_operation_channel(pMac, sessionId);
7417
7418 sme_release_global_lock(&pMac->sme);
7419 }
7420
7421 return channel;
7422}
7423
7424/* This routine will return poerating channel on which other BSS is operating to be used for concurrency mode. */
7425/* If other BSS is not up or not connected it will return 0 */
7426uint8_t sme_get_concurrent_operation_channel(tHalHandle hHal)
7427{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307428 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007429 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
7430 uint8_t channel = 0;
7431 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307432 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007433
7434 channel = csr_get_concurrent_operation_channel(pMac);
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05307435 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO_HIGH, "%s: "
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007436 " Other Concurrent Channel = %d", __func__, channel);
7437 sme_release_global_lock(&pMac->sme);
7438 }
7439
7440 return channel;
7441}
7442
7443#ifdef FEATURE_WLAN_MCC_TO_SCC_SWITCH
7444uint16_t sme_check_concurrent_channel_overlap(tHalHandle hHal, uint16_t sap_ch,
7445 eCsrPhyMode sapPhyMode,
7446 uint8_t cc_switch_mode)
7447{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307448 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007449 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
7450 uint16_t channel = 0;
7451
7452 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307453 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007454 channel =
7455 csr_check_concurrent_channel_overlap(pMac, sap_ch, sapPhyMode,
7456 cc_switch_mode);
7457 sme_release_global_lock(&pMac->sme);
7458 }
7459
7460 return channel;
7461}
7462#endif
7463
7464#ifdef FEATURE_WLAN_SCAN_PNO
Varun Reddy Yeturub43fda12015-09-10 18:16:21 -07007465/**
7466 * sme_update_roam_pno_channel_prediction_config() - Update PNO config
Krunal Soni1878d3a2016-01-14 13:00:44 -08007467 * @csr_config: config from SME context
Varun Reddy Yeturub43fda12015-09-10 18:16:21 -07007468 * @hal: Global Hal handle
7469 * @copy_from_to: Used to specify the source and destination
7470 *
7471 * Copy the PNO channel prediction configuration parameters from
7472 * SME context to MAC context or vice-versa
7473 *
7474 * Return: None
7475 */
7476void sme_update_roam_pno_channel_prediction_config(
Krunal Soni1878d3a2016-01-14 13:00:44 -08007477 tHalHandle hal, tCsrConfigParam *csr_config,
Varun Reddy Yeturub43fda12015-09-10 18:16:21 -07007478 uint8_t copy_from_to)
7479{
7480 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
7481 if (copy_from_to == SME_CONFIG_TO_ROAM_CONFIG) {
7482 mac_ctx->roam.configParam.pno_channel_prediction =
Krunal Soni1878d3a2016-01-14 13:00:44 -08007483 csr_config->pno_channel_prediction;
Varun Reddy Yeturub43fda12015-09-10 18:16:21 -07007484 mac_ctx->roam.configParam.top_k_num_of_channels =
Krunal Soni1878d3a2016-01-14 13:00:44 -08007485 csr_config->top_k_num_of_channels;
Varun Reddy Yeturub43fda12015-09-10 18:16:21 -07007486 mac_ctx->roam.configParam.stationary_thresh =
Krunal Soni1878d3a2016-01-14 13:00:44 -08007487 csr_config->stationary_thresh;
Varun Reddy Yeturub43fda12015-09-10 18:16:21 -07007488 mac_ctx->roam.configParam.channel_prediction_full_scan =
Krunal Soni1878d3a2016-01-14 13:00:44 -08007489 csr_config->channel_prediction_full_scan;
Gupta, Kapil96c7f2f2016-04-25 19:13:41 +05307490 mac_ctx->roam.configParam.pnoscan_adaptive_dwell_mode =
7491 csr_config->pnoscan_adaptive_dwell_mode;
Varun Reddy Yeturub43fda12015-09-10 18:16:21 -07007492 } else if (copy_from_to == ROAM_CONFIG_TO_SME_CONFIG) {
Krunal Soni1878d3a2016-01-14 13:00:44 -08007493 csr_config->pno_channel_prediction =
Varun Reddy Yeturub43fda12015-09-10 18:16:21 -07007494 mac_ctx->roam.configParam.pno_channel_prediction;
Krunal Soni1878d3a2016-01-14 13:00:44 -08007495 csr_config->top_k_num_of_channels =
Varun Reddy Yeturub43fda12015-09-10 18:16:21 -07007496 mac_ctx->roam.configParam.top_k_num_of_channels;
Krunal Soni1878d3a2016-01-14 13:00:44 -08007497 csr_config->stationary_thresh =
Varun Reddy Yeturub43fda12015-09-10 18:16:21 -07007498 mac_ctx->roam.configParam.stationary_thresh;
Krunal Soni1878d3a2016-01-14 13:00:44 -08007499 csr_config->channel_prediction_full_scan =
Varun Reddy Yeturub43fda12015-09-10 18:16:21 -07007500 mac_ctx->roam.configParam.channel_prediction_full_scan;
Gupta, Kapil96c7f2f2016-04-25 19:13:41 +05307501 csr_config->pnoscan_adaptive_dwell_mode =
7502 mac_ctx->roam.configParam.pnoscan_adaptive_dwell_mode;
Varun Reddy Yeturub43fda12015-09-10 18:16:21 -07007503 }
7504
7505}
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007506/******************************************************************************
7507*
7508* Name: sme_preferred_network_found_ind
7509*
7510* Description:
7511* Invoke Preferred Network Found Indication
7512*
7513* Parameters:
7514* hHal - HAL handle for device
7515* pMsg - found network description
7516*
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307517* Returns: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007518*
7519******************************************************************************/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307520QDF_STATUS sme_preferred_network_found_ind(tHalHandle hHal, void *pMsg)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007521{
7522 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307523 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007524 tSirPrefNetworkFoundInd *pPrefNetworkFoundInd =
7525 (tSirPrefNetworkFoundInd *) pMsg;
7526 uint8_t dumpSsId[SIR_MAC_MAX_SSID_LENGTH + 1];
7527 uint8_t ssIdLength = 0;
7528
7529 if (NULL == pMsg) {
7530 sms_log(pMac, LOGE, "in %s msg ptr is NULL", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307531 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007532 }
7533
7534 if (pMac->pnoOffload) {
7535 /* Call Preferred Network Found Indication callback routine. */
7536 if (pMac->sme.pref_netw_found_cb != NULL) {
7537 pMac->sme.pref_netw_found_cb(pMac->sme.
7538 preferred_network_found_ind_cb_ctx,
7539 pPrefNetworkFoundInd);
7540 }
7541 return status;
7542 }
7543
7544 if (pPrefNetworkFoundInd->ssId.length > 0) {
7545 ssIdLength = CSR_MIN(SIR_MAC_MAX_SSID_LENGTH,
7546 pPrefNetworkFoundInd->ssId.length);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05307547 qdf_mem_copy(dumpSsId, pPrefNetworkFoundInd->ssId.ssId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007548 ssIdLength);
7549 dumpSsId[ssIdLength] = 0;
7550 sms_log(pMac, LOG2, "%s:SSID=%s frame length %d",
7551 __func__, dumpSsId, pPrefNetworkFoundInd->frameLength);
7552
7553 /* Flush scan results, So as to avoid indication/updation of
7554 * stale entries, which may not have aged out during APPS collapse
7555 */
7556 sme_scan_flush_result(hHal);
7557
7558 /* Save the frame to scan result */
7559 if (pPrefNetworkFoundInd->mesgLen >
7560 sizeof(tSirPrefNetworkFoundInd)) {
7561 /* we may have a frame */
7562 status = csr_scan_save_preferred_network_found(pMac,
7563 pPrefNetworkFoundInd);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307564 if (!QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007565 sms_log(pMac, LOGE,
7566 FL(" fail to save preferred network"));
7567 }
7568 } else {
7569 sms_log(pMac, LOGE,
7570 FL(" not enough data length %d needed %zu"),
7571 pPrefNetworkFoundInd->mesgLen,
7572 sizeof(tSirPrefNetworkFoundInd));
7573 }
7574
7575 /* Call Preferred Netowrk Found Indication callback routine. */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307576 if (QDF_IS_STATUS_SUCCESS(status)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007577 && (pMac->sme.pref_netw_found_cb != NULL)) {
7578 pMac->sme.pref_netw_found_cb(pMac->sme.
7579 preferred_network_found_ind_cb_ctx,
7580 pPrefNetworkFoundInd);
7581 }
7582 } else {
7583 sms_log(pMac, LOGE, "%s: callback failed - SSID is NULL",
7584 __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307585 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007586 }
7587
7588 return status;
7589}
7590
7591#endif /* FEATURE_WLAN_SCAN_PNO */
7592
Arun Khandavalli4b55da72016-07-19 19:55:01 +05307593/**
Manikandan Mohandcc21ba2016-03-15 14:31:56 -07007594 * sme_set_tsfcb() - Set callback for TSF capture
Manikandan Mohan976e7562016-03-15 16:33:31 -07007595 * @h_hal: Handler return by mac_open
Manikandan Mohandcc21ba2016-03-15 14:31:56 -07007596 * @cb_fn: Callback function pointer
7597 * @db_ctx: Callback data
7598 *
7599 * Return: QDF_STATUS
7600 */
Manikandan Mohan976e7562016-03-15 16:33:31 -07007601QDF_STATUS sme_set_tsfcb(tHalHandle h_hal,
Manikandan Mohandcc21ba2016-03-15 14:31:56 -07007602 int (*cb_fn)(void *cb_ctx, struct stsf *ptsf), void *cb_ctx)
7603{
Manikandan Mohan976e7562016-03-15 16:33:31 -07007604 tpAniSirGlobal mac = PMAC_STRUCT(h_hal);
Manikandan Mohandcc21ba2016-03-15 14:31:56 -07007605 QDF_STATUS status;
7606
Manikandan Mohan976e7562016-03-15 16:33:31 -07007607 status = sme_acquire_global_lock(&mac->sme);
Manikandan Mohandcc21ba2016-03-15 14:31:56 -07007608 if (QDF_IS_STATUS_SUCCESS(status)) {
Manikandan Mohan976e7562016-03-15 16:33:31 -07007609 mac->sme.get_tsf_cb = cb_fn;
7610 mac->sme.get_tsf_cxt = cb_ctx;
7611 sme_release_global_lock(&mac->sme);
Manikandan Mohandcc21ba2016-03-15 14:31:56 -07007612 }
7613 return status;
7614}
7615
Arun Khandavalli4b55da72016-07-19 19:55:01 +05307616/**
7617 * sme_reset_tsfcb() - Reset callback for TSF capture
7618 * @h_hal: Handler return by mac_open
7619 *
7620 * This function reset the tsf capture callback to SME
7621 *
7622 * Return: QDF_STATUS
7623 */
7624QDF_STATUS sme_reset_tsfcb(tHalHandle h_hal)
7625{
7626 tpAniSirGlobal mac;
7627 QDF_STATUS status;
7628
7629 if (!h_hal) {
7630 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
7631 FL("h_hal is not valid"));
7632 return QDF_STATUS_E_INVAL;
7633 }
7634 mac = PMAC_STRUCT(h_hal);
7635
7636 status = sme_acquire_global_lock(&mac->sme);
7637 if (QDF_IS_STATUS_SUCCESS(status)) {
7638 mac->sme.get_tsf_cb = NULL;
7639 mac->sme.get_tsf_cxt = NULL;
7640 sme_release_global_lock(&mac->sme);
7641 }
7642 return status;
7643}
7644
Manikandan Mohan976e7562016-03-15 16:33:31 -07007645#ifdef WLAN_FEATURE_TSF
7646/*
7647 * sme_set_tsf_gpio() - set gpio pin that be toggled when capture tef
7648 * @h_hal: Handler return by mac_open
7649 * @pinvalue: gpio pin id
7650 *
7651 * Return: QDF_STATUS
7652 */
7653QDF_STATUS sme_set_tsf_gpio(tHalHandle h_hal, uint32_t pinvalue)
7654{
7655 QDF_STATUS status;
7656 cds_msg_t tsf_msg = {0};
7657 tpAniSirGlobal mac = PMAC_STRUCT(h_hal);
7658
7659 status = sme_acquire_global_lock(&mac->sme);
7660 if (QDF_IS_STATUS_SUCCESS(status)) {
7661 tsf_msg.type = WMA_TSF_GPIO_PIN;
7662 tsf_msg.reserved = 0;
7663 tsf_msg.bodyval = pinvalue;
7664
7665 status = cds_mq_post_message(CDS_MQ_ID_WMA, &tsf_msg);
7666 if (!QDF_IS_STATUS_SUCCESS(status)) {
7667 sms_log(mac, LOGE, "Unable to post WMA_TSF_GPIO_PIN");
7668 status = QDF_STATUS_E_FAILURE;
7669 }
7670 sme_release_global_lock(&mac->sme);
7671 }
7672 return status;
7673}
7674#endif
7675
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307676QDF_STATUS sme_get_cfg_valid_channels(tHalHandle hHal, uint8_t *aValidChannels,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007677 uint32_t *len)
7678{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307679 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007680 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
7681
7682 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307683 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007684 status = csr_get_cfg_valid_channels(pMac, aValidChannels, len);
7685 sme_release_global_lock(&pMac->sme);
7686 }
7687
7688 return status;
7689}
7690
7691/* ---------------------------------------------------------------------------
7692
7693 \fn sme_handle_change_country_code
7694
7695 \brief Change Country code, Reg Domain and channel list
7696
7697 \details Country Code Priority
7698 If Supplicant country code is priority than 11d is disabled.
7699 If 11D is enabled, we update the country code after every scan.
7700 Hence when Supplicant country code is priority, we don't need 11D info.
7701 Country code from Supplicant is set as current courtry code.
7702 User can send reset command XX (instead of country code) to reset the
7703 country code to default values.
7704 If 11D is priority,
7705 Than Supplicant country code code is set to default code. But 11D code is set as current country code
7706
7707 \param pMac - The handle returned by mac_open.
7708 \param pMsgBuf - MSG Buffer
7709
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307710 \return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007711
7712 -------------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307713QDF_STATUS sme_handle_change_country_code(tpAniSirGlobal pMac, void *pMsgBuf)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007714{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307715 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007716 tAniChangeCountryCodeReq *pMsg;
7717 v_REGDOMAIN_t domainIdIoctl;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307718 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Amar Singhala297bfa2015-10-15 15:07:29 -07007719 static uint8_t default_country[CDS_COUNTRY_CODE_LEN + 1];
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007720 pMsg = (tAniChangeCountryCodeReq *) pMsgBuf;
7721
7722 /*
7723 * if the reset Supplicant country code command is triggered,
7724 * enable 11D, reset the country code and return
7725 */
Ankit Guptaa5076012016-09-14 11:32:19 -07007726 if (!qdf_mem_cmp(pMsg->countryCode, SME_INVALID_COUNTRY_CODE, 2)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007727 pMac->roam.configParam.Is11dSupportEnabled =
7728 pMac->roam.configParam.Is11dSupportEnabledOriginal;
7729
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307730 qdf_status = cds_read_default_country(default_country);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007731
7732 /* read the country code and use it */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307733 if (QDF_IS_STATUS_SUCCESS(qdf_status)) {
Anurag Chouhan600c3a02016-03-01 10:33:54 +05307734 qdf_mem_copy(pMsg->countryCode,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007735 default_country,
7736 WNI_CFG_COUNTRY_CODE_LEN);
7737 } else {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307738 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007739 return status;
7740 }
7741 /*
7742 * Update the 11d country to default country so that when
7743 * callback is received for this default country, driver will
7744 * not disable the 11d taking it as valid country by user.
7745 */
7746 sms_log(pMac, LOG1,
7747 FL("Set default country code (%c%c) as invalid country received"),
7748 pMsg->countryCode[0], pMsg->countryCode[1]);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05307749 qdf_mem_copy(pMac->scan.countryCode11d,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007750 pMsg->countryCode,
7751 WNI_CFG_COUNTRY_CODE_LEN);
7752 } else {
7753 /* if Supplicant country code has priority, disable 11d */
7754 if (pMac->roam.configParam.fSupplicantCountryCodeHasPriority &&
7755 pMsg->countryFromUserSpace) {
7756 pMac->roam.configParam.Is11dSupportEnabled = false;
7757 }
7758 }
7759
7760 if (pMac->roam.configParam.Is11dSupportEnabled)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307761 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007762
7763 /* Set Current Country code and Current Regulatory domain */
7764 status = csr_set_country_code(pMac, pMsg->countryCode);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307765 if (QDF_STATUS_SUCCESS != status) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007766 /* Supplicant country code failed. So give 11D priority */
7767 pMac->roam.configParam.Is11dSupportEnabled =
7768 pMac->roam.configParam.Is11dSupportEnabledOriginal;
7769 sms_log(pMac, LOGE, "Set Country Code Fail %d", status);
7770 return status;
7771 }
7772
7773 /* overwrite the defualt country code */
Anurag Chouhan600c3a02016-03-01 10:33:54 +05307774 qdf_mem_copy(pMac->scan.countryCodeDefault,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007775 pMac->scan.countryCodeCurrent, WNI_CFG_COUNTRY_CODE_LEN);
7776
7777 /* Get Domain ID from country code */
7778 status = csr_get_regulatory_domain_for_country(pMac,
7779 pMac->scan.countryCodeCurrent,
7780 (v_REGDOMAIN_t *) &
Amar Singhala297bfa2015-10-15 15:07:29 -07007781 domainIdIoctl,
7782 SOURCE_QUERY);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307783 if (status != QDF_STATUS_SUCCESS) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007784 sms_log(pMac, LOGE, FL(" fail to get regId %d"), domainIdIoctl);
7785 return status;
7786 } else if (REGDOMAIN_WORLD == domainIdIoctl) {
7787 /* Supplicant country code is invalid, so we are on world mode now. So
7788 give 11D chance to update */
7789 pMac->roam.configParam.Is11dSupportEnabled =
7790 pMac->roam.configParam.Is11dSupportEnabledOriginal;
7791 sms_log(pMac, LOG1, FL("Country Code unrecognized by driver"));
7792 }
7793
7794 status = wma_set_reg_domain(pMac, domainIdIoctl);
7795
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307796 if (status != QDF_STATUS_SUCCESS) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007797 sms_log(pMac, LOGE, FL(" fail to set regId %d"), domainIdIoctl);
7798 return status;
7799 } else {
7800 /* if 11d has priority, clear currentCountryBssid & countryCode11d to get */
7801 /* set again if we find AP with 11d info during scan */
7802 if (!pMac->roam.configParam.fSupplicantCountryCodeHasPriority) {
7803 sms_log(pMac, LOGW,
7804 FL
7805 ("Clearing currentCountryBssid, countryCode11d"));
Anurag Chouhan600c3a02016-03-01 10:33:54 +05307806 qdf_mem_zero(&pMac->scan.currentCountryBssid,
Anurag Chouhan6d760662016-02-20 16:05:43 +05307807 sizeof(struct qdf_mac_addr));
Anurag Chouhan600c3a02016-03-01 10:33:54 +05307808 qdf_mem_zero(pMac->scan.countryCode11d,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007809 sizeof(pMac->scan.countryCode11d));
7810 }
7811 }
7812
7813 if (pMsg->changeCCCallback) {
7814 ((tSmeChangeCountryCallback) (pMsg->changeCCCallback))((void *)
7815 pMsg->
7816 pDevContext);
7817 }
7818
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307819 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007820}
7821
7822/**
Amar Singhal7f1f3ec2015-10-13 17:14:08 -07007823 * sme_handle_generic_change_country_code() - handles country ch req
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007824 * @mac_ctx: mac global context
7825 * @msg: request msg packet
7826 *
7827 * If Supplicant country code is priority than 11d is disabled.
7828 * If 11D is enabled, we update the country code after every scan.
7829 * Hence when Supplicant country code is priority, we don't need 11D info.
7830 * Country code from Supplicant is set as current country code.
7831 *
7832 * Return: status of operation
7833 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307834QDF_STATUS
Amar Singhal7f1f3ec2015-10-13 17:14:08 -07007835sme_handle_generic_change_country_code(tpAniSirGlobal mac_ctx,
7836 void *pMsgBuf)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007837{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307838 QDF_STATUS status = QDF_STATUS_SUCCESS;
Amar Singhal7f1f3ec2015-10-13 17:14:08 -07007839 v_REGDOMAIN_t reg_domain_id = 0;
Amar Singhalb6d0dc42016-10-19 09:45:05 -07007840 bool user_ctry_priority =
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007841 mac_ctx->roam.configParam.fSupplicantCountryCodeHasPriority;
Amar Singhal7f1f3ec2015-10-13 17:14:08 -07007842 tAniGenericChangeCountryCodeReq *msg = pMsgBuf;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007843
7844 sms_log(mac_ctx, LOG1, FL(" called"));
Amar Singhal7f1f3ec2015-10-13 17:14:08 -07007845
Amar Singhalb6d0dc42016-10-19 09:45:05 -07007846 if (!mac_ctx->is_11d_hint) {
7847 if (user_ctry_priority)
7848 mac_ctx->roam.configParam.Is11dSupportEnabled = false;
7849 else {
7850 if (mac_ctx->roam.configParam.Is11dSupportEnabled &&
7851 mac_ctx->scan.countryCode11d[0] != 0) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007852
Amar Singhalb6d0dc42016-10-19 09:45:05 -07007853 sms_log(mac_ctx, LOGW,
7854 FL("restore 11d"));
7855
7856 status = csr_get_regulatory_domain_for_country(
7857 mac_ctx,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007858 mac_ctx->scan.countryCode11d,
Amar Singhalb6d0dc42016-10-19 09:45:05 -07007859 &reg_domain_id,
Amar Singhala297bfa2015-10-15 15:07:29 -07007860 SOURCE_11D);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007861
Amar Singhalb6d0dc42016-10-19 09:45:05 -07007862 return QDF_STATUS_E_FAILURE;
7863 }
7864 }
7865 } else {
7866 /* if kernel gets invalid country code; it
7867 * resets the country code to world
7868 */
7869 if (('0' != msg->countryCode[0]) ||
7870 ('0' != msg->countryCode[1]))
7871 qdf_mem_copy(mac_ctx->scan.countryCode11d,
7872 msg->countryCode,
7873 WNI_CFG_COUNTRY_CODE_LEN);
7874 mac_ctx->is_11d_hint = false;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007875 }
Amar Singhal7f1f3ec2015-10-13 17:14:08 -07007876
Amar Singhalb6d0dc42016-10-19 09:45:05 -07007877 qdf_mem_copy(mac_ctx->scan.countryCodeCurrent,
7878 msg->countryCode,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007879 WNI_CFG_COUNTRY_CODE_LEN);
Amar Singhal9d5b1fe2016-10-16 20:16:05 -07007880
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007881 /* get the channels based on new cc */
7882 status = csr_get_channel_and_power_list(mac_ctx);
7883
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307884 if (status != QDF_STATUS_SUCCESS) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007885 sms_log(mac_ctx, LOGE, FL("fail to get Channels"));
7886 return status;
7887 }
Amar Singhalb6d0dc42016-10-19 09:45:05 -07007888
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007889 /* reset info based on new cc, and we are done */
7890 csr_apply_channel_power_info_wrapper(mac_ctx);
7891
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007892 csr_scan_filter_results(mac_ctx);
Amar Singhalb6d0dc42016-10-19 09:45:05 -07007893
7894 /* scans after the country is set by User hints or
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007895 * Country IE
7896 */
7897 mac_ctx->scan.curScanType = eSIR_ACTIVE_SCAN;
Amar Singhal9d5b1fe2016-10-16 20:16:05 -07007898
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007899 sme_disconnect_connected_sessions(mac_ctx);
Amar Singhalb6d0dc42016-10-19 09:45:05 -07007900
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007901 sms_log(mac_ctx, LOG1, FL(" returned"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307902 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007903}
7904
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007905static bool
7906sme_search_in_base_ch_lst(tpAniSirGlobal mac_ctx, uint8_t curr_ch)
7907{
7908 uint8_t i;
7909 tCsrChannel *ch_lst_info;
7910 ch_lst_info = &mac_ctx->scan.base_channels;
7911 for (i = 0; i < ch_lst_info->numChannels; i++) {
7912 if (ch_lst_info->channelList[i] == curr_ch)
7913 return true;
7914 }
7915
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007916 return false;
7917}
7918/**
7919 * sme_disconnect_connected_sessions() - Disconnect STA and P2P client session
7920 * if channel is not supported
7921 * @mac_ctx: mac global context
7922 *
7923 * If new country code does not support the channel on which STA/P2P client
7924 * is connetced, it sends the disconnect to the AP/P2P GO
7925 *
7926 * Return: void
7927 */
7928void sme_disconnect_connected_sessions(tpAniSirGlobal mac_ctx)
7929{
7930 uint8_t session_id, found = false;
7931 uint8_t curr_ch;
7932
7933 for (session_id = 0; session_id < CSR_ROAM_SESSION_MAX; session_id++) {
7934 if (!csr_is_session_client_and_connected(mac_ctx, session_id))
7935 continue;
7936 found = false;
7937 /* Session is connected.Check the channel */
7938 curr_ch = csr_get_infra_operation_channel(mac_ctx,
7939 session_id);
7940 sms_log(mac_ctx, LOGW,
7941 FL("Current Operating channel : %d, session :%d"),
7942 curr_ch, session_id);
7943 found = sme_search_in_base_ch_lst(mac_ctx, curr_ch);
7944 if (!found) {
7945 sms_log(mac_ctx, LOGW, FL("Disconnect Session :%d"),
7946 session_id);
7947 csr_roam_disconnect(mac_ctx, session_id,
7948 eCSR_DISCONNECT_REASON_UNSPECIFIED);
7949 }
7950 }
7951}
7952
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007953#ifdef WLAN_FEATURE_PACKET_FILTERING
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307954QDF_STATUS sme_8023_multicast_list(tHalHandle hHal, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007955 tpSirRcvFltMcAddrList pMulticastAddrs)
7956{
7957 tpSirRcvFltMcAddrList request_buf;
7958 cds_msg_t msg;
7959 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
7960 tCsrRoamSession *pSession = NULL;
7961
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05307962 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO, "%s: "
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007963 "ulMulticastAddrCnt=%d, multicastAddr[0]=%p", __func__,
7964 pMulticastAddrs->ulMulticastAddrCnt,
Srinivas Girigowda98530492015-11-20 17:39:24 -08007965 pMulticastAddrs->multicastAddr[0].bytes);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007966
Ravi Joshi4f447cb2016-07-19 13:42:01 -07007967 /* Find the connected Infra / P2P_client connected session */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007968 if (CSR_IS_SESSION_VALID(pMac, sessionId) &&
Ravi Joshi4f447cb2016-07-19 13:42:01 -07007969 (csr_is_conn_state_infra(pMac, sessionId) ||
7970 csr_is_ndi_started(pMac, sessionId))) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007971 pSession = CSR_GET_SESSION(pMac, sessionId);
7972 }
7973
7974 if (pSession == NULL) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05307975 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_WARN,
Srinivas Girigowdaf2599dd2015-11-16 18:20:46 -08007976 "%s: Unable to find the session Id: %d", __func__,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007977 sessionId);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307978 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007979 }
7980
Anurag Chouhan600c3a02016-03-01 10:33:54 +05307981 request_buf = qdf_mem_malloc(sizeof(tSirRcvFltMcAddrList));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007982 if (NULL == request_buf) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05307983 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007984 "%s: Not able to "
7985 "allocate memory for 8023 Multicast List request",
7986 __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307987 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007988 }
7989
Ravi Joshi4f447cb2016-07-19 13:42:01 -07007990 if (!csr_is_conn_state_connected_infra(pMac, sessionId) &&
7991 !csr_is_ndi_started(pMac, sessionId)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05307992 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Ravi Joshi4f447cb2016-07-19 13:42:01 -07007993 "%s: Request ignored, session %d is not connected or started",
7994 __func__, sessionId);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05307995 qdf_mem_free(request_buf);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307996 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007997 }
7998
Anurag Chouhan600c3a02016-03-01 10:33:54 +05307999 qdf_mem_copy(request_buf, pMulticastAddrs,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008000 sizeof(tSirRcvFltMcAddrList));
8001
Anurag Chouhanc5548422016-02-24 18:33:27 +05308002 qdf_copy_macaddr(&request_buf->self_macaddr, &pSession->selfMacAddr);
8003 qdf_copy_macaddr(&request_buf->bssid,
Srinivas Girigowda98530492015-11-20 17:39:24 -08008004 &pSession->connectedProfile.bssid);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008005
8006 msg.type = WMA_8023_MULTICAST_LIST_REQ;
8007 msg.reserved = 0;
8008 msg.bodyptr = request_buf;
Sreelakshmi Konamki6a065362016-05-31 16:05:01 +05308009 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
8010 sessionId, msg.type));
Anurag Chouhan6d760662016-02-20 16:05:43 +05308011 if (QDF_STATUS_SUCCESS != cds_mq_post_message(QDF_MODULE_ID_WMA, &msg)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308012 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008013 "%s: Not able to "
8014 "post WMA_8023_MULTICAST_LIST message to WMA",
8015 __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308016 qdf_mem_free(request_buf);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308017 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008018 }
8019
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308020 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008021}
8022
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308023QDF_STATUS sme_receive_filter_set_filter(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008024 tpSirRcvPktFilterCfgType pRcvPktFilterCfg,
8025 uint8_t sessionId)
8026{
8027 tpSirRcvPktFilterCfgType request_buf;
8028 int32_t allocSize;
8029 cds_msg_t msg;
8030 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
8031 tCsrRoamSession *pSession = CSR_GET_SESSION(pMac, sessionId);
8032 uint8_t idx = 0;
8033
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308034 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO, "%s: filterType=%d, "
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008035 "filterId = %d", __func__,
8036 pRcvPktFilterCfg->filterType, pRcvPktFilterCfg->filterId);
8037
8038 allocSize = sizeof(tSirRcvPktFilterCfgType);
8039
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308040 request_buf = qdf_mem_malloc(allocSize);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008041
8042 if (NULL == request_buf) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308043 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008044 "%s: Not able to "
8045 "allocate memory for Receive Filter Set Filter request",
8046 __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308047 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008048 }
8049
8050 if (NULL == pSession) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308051 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008052 "%s: Session Not found ", __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308053 qdf_mem_free(request_buf);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308054 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008055 }
8056
Anurag Chouhanc5548422016-02-24 18:33:27 +05308057 qdf_copy_macaddr(&pRcvPktFilterCfg->self_macaddr,
Srinivas Girigowda98530492015-11-20 17:39:24 -08008058 &pSession->selfMacAddr);
Anurag Chouhanc5548422016-02-24 18:33:27 +05308059 qdf_copy_macaddr(&pRcvPktFilterCfg->bssid,
Srinivas Girigowda98530492015-11-20 17:39:24 -08008060 &pSession->connectedProfile.bssid);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308061 qdf_mem_copy(request_buf, pRcvPktFilterCfg, allocSize);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008062
8063 msg.type = WMA_RECEIVE_FILTER_SET_FILTER_REQ;
8064 msg.reserved = 0;
8065 msg.bodyptr = request_buf;
Sreelakshmi Konamki6a065362016-05-31 16:05:01 +05308066 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
8067 sessionId, msg.type));
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308068 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO, "Pkt Flt Req : "
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008069 "FT %d FID %d ",
8070 request_buf->filterType, request_buf->filterId);
8071
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308072 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO, "Pkt Flt Req : "
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008073 "params %d CT %d",
8074 request_buf->numFieldParams, request_buf->coalesceTime);
8075
8076 for (idx = 0; idx < request_buf->numFieldParams; idx++) {
8077
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308078 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008079 "Proto %d Comp Flag %d ",
8080 request_buf->paramsData[idx].protocolLayer,
8081 request_buf->paramsData[idx].cmpFlag);
8082
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308083 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008084 "Data Offset %d Data Len %d",
8085 request_buf->paramsData[idx].dataOffset,
8086 request_buf->paramsData[idx].dataLength);
8087
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308088 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008089 "CData: %d:%d:%d:%d:%d:%d",
8090 request_buf->paramsData[idx].compareData[0],
8091 request_buf->paramsData[idx].compareData[1],
8092 request_buf->paramsData[idx].compareData[2],
8093 request_buf->paramsData[idx].compareData[3],
8094 request_buf->paramsData[idx].compareData[4],
8095 request_buf->paramsData[idx].compareData[5]);
8096
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308097 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008098 "MData: %d:%d:%d:%d:%d:%d",
8099 request_buf->paramsData[idx].dataMask[0],
8100 request_buf->paramsData[idx].dataMask[1],
8101 request_buf->paramsData[idx].dataMask[2],
8102 request_buf->paramsData[idx].dataMask[3],
8103 request_buf->paramsData[idx].dataMask[4],
8104 request_buf->paramsData[idx].dataMask[5]);
8105
8106 }
8107
Anurag Chouhan6d760662016-02-20 16:05:43 +05308108 if (QDF_STATUS_SUCCESS != cds_mq_post_message(QDF_MODULE_ID_WMA, &msg)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308109 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008110 "%s: Not able to post "
8111 "WMA_RECEIVE_FILTER_SET_FILTER message to WMA",
8112 __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308113 qdf_mem_free(request_buf);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308114 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008115 }
8116
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308117 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008118}
8119
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308120QDF_STATUS sme_receive_filter_clear_filter(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008121 tpSirRcvFltPktClearParam
8122 pRcvFltPktClearParam, uint8_t sessionId)
8123{
8124 tpSirRcvFltPktClearParam request_buf;
8125 cds_msg_t msg;
8126 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
8127 tCsrRoamSession *pSession = CSR_GET_SESSION(pMac, sessionId);
8128
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308129 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO, "%s: filterId = %d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008130 __func__, pRcvFltPktClearParam->filterId);
8131
Srinivas Girigowda98530492015-11-20 17:39:24 -08008132 if (NULL == pSession) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308133 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Srinivas Girigowda98530492015-11-20 17:39:24 -08008134 "%s: Session Not found", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308135 return QDF_STATUS_E_FAILURE;
Srinivas Girigowda98530492015-11-20 17:39:24 -08008136 }
8137
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308138 request_buf = qdf_mem_malloc(sizeof(tSirRcvFltPktClearParam));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008139 if (NULL == request_buf) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308140 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008141 "%s: Not able to allocate memory for Receive Filter "
8142 "Clear Filter request", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308143 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008144 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008145
Anurag Chouhanc5548422016-02-24 18:33:27 +05308146 qdf_copy_macaddr(&pRcvFltPktClearParam->self_macaddr,
Srinivas Girigowda98530492015-11-20 17:39:24 -08008147 &pSession->selfMacAddr);
Anurag Chouhanc5548422016-02-24 18:33:27 +05308148 qdf_copy_macaddr(&pRcvFltPktClearParam->bssid,
Srinivas Girigowda98530492015-11-20 17:39:24 -08008149 &pSession->connectedProfile.bssid);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008150
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308151 qdf_mem_copy(request_buf, pRcvFltPktClearParam,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008152 sizeof(tSirRcvFltPktClearParam));
8153
8154 msg.type = WMA_RECEIVE_FILTER_CLEAR_FILTER_REQ;
8155 msg.reserved = 0;
8156 msg.bodyptr = request_buf;
Sreelakshmi Konamki6a065362016-05-31 16:05:01 +05308157 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
8158 sessionId, msg.type));
Anurag Chouhan6d760662016-02-20 16:05:43 +05308159 if (QDF_STATUS_SUCCESS != cds_mq_post_message(QDF_MODULE_ID_WMA, &msg)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308160 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008161 "%s: Not able to post "
8162 "WMA_RECEIVE_FILTER_CLEAR_FILTER message to WMA",
8163 __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308164 qdf_mem_free(request_buf);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308165 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008166 }
8167
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308168 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008169}
8170#endif /* WLAN_FEATURE_PACKET_FILTERING */
8171
8172/* ---------------------------------------------------------------------------
8173
8174 \fn sme_is_channel_valid
8175
8176 \brief To check if the channel is valid for currently established domain
8177 This is a synchronous API.
8178
8179 \param hHal - The handle returned by mac_open.
8180 \param channel - channel to verify
8181
8182 \return true/false, true if channel is valid
8183
8184 -------------------------------------------------------------------------------*/
8185bool sme_is_channel_valid(tHalHandle hHal, uint8_t channel)
8186{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308187 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008188 bool valid = false;
8189 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
8190
8191 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308192 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008193
8194 valid = csr_roam_is_channel_valid(pMac, channel);
8195
8196 sme_release_global_lock(&pMac->sme);
8197 }
8198
8199 return valid;
8200}
8201
8202/* ---------------------------------------------------------------------------
8203 \fn sme_set_freq_band
8204 \brief Used to set frequency band.
8205 \param hHal
8206 \param sessionId - Session Identifier
8207 \eBand band value to be configured
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308208 \- return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008209 -------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308210QDF_STATUS sme_set_freq_band(tHalHandle hHal, uint8_t sessionId, eCsrBand eBand)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008211{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308212 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008213 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
8214
8215 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308216 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008217 status = csr_set_band(hHal, sessionId, eBand);
8218 sme_release_global_lock(&pMac->sme);
8219 }
8220 return status;
8221}
8222
8223/* ---------------------------------------------------------------------------
8224 \fn sme_get_freq_band
8225 \brief Used to get the current band settings.
8226 \param hHal
8227 \pBand pointer to hold band value
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308228 \- return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008229 -------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308230QDF_STATUS sme_get_freq_band(tHalHandle hHal, eCsrBand *pBand)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008231{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308232 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008233 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
8234
8235 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308236 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008237 *pBand = csr_get_current_band(hHal);
8238 sme_release_global_lock(&pMac->sme);
8239 }
8240 return status;
8241}
8242
8243/* ---------------------------------------------------------------------------
8244 \fn sme_set_max_tx_power_per_band
8245
8246 \brief Set the Maximum Transmit Power specific to band dynamically.
8247 Note: this setting will not persist over reboots.
8248
8249 \param band
8250 \param power to set in dB
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308251 \- return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008252
8253 ----------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308254QDF_STATUS sme_set_max_tx_power_per_band(eCsrBand band, int8_t dB)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008255{
8256 cds_msg_t msg;
8257 tpMaxTxPowerPerBandParams pMaxTxPowerPerBandParams = NULL;
8258
8259 pMaxTxPowerPerBandParams =
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308260 qdf_mem_malloc(sizeof(tMaxTxPowerPerBandParams));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008261 if (NULL == pMaxTxPowerPerBandParams) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308262 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008263 "%s:Not able to allocate memory for pMaxTxPowerPerBandParams",
8264 __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308265 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008266 }
8267
8268 pMaxTxPowerPerBandParams->power = dB;
8269 pMaxTxPowerPerBandParams->bandInfo = band;
8270
8271 msg.type = WMA_SET_MAX_TX_POWER_PER_BAND_REQ;
8272 msg.reserved = 0;
8273 msg.bodyptr = pMaxTxPowerPerBandParams;
Sreelakshmi Konamki6a065362016-05-31 16:05:01 +05308274 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
8275 NO_SESSION, msg.type));
Anurag Chouhan6d760662016-02-20 16:05:43 +05308276 if (QDF_STATUS_SUCCESS != cds_mq_post_message(QDF_MODULE_ID_WMA, &msg)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308277 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008278 "%s:Not able to post WMA_SET_MAX_TX_POWER_PER_BAND_REQ",
8279 __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308280 qdf_mem_free(pMaxTxPowerPerBandParams);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308281 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008282 }
8283
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308284 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008285}
8286
8287/* ---------------------------------------------------------------------------
8288
8289 \fn sme_set_max_tx_power
8290
8291 \brief Set the Maximum Transmit Power dynamically. Note: this setting will
8292 not persist over reboots.
8293
8294 \param hHal
8295 \param pBssid BSSID to set the power cap for
8296 \param pBssid pSelfMacAddress self MAC Address
8297 \param pBssid power to set in dB
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308298 \- return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008299
8300 -------------------------------------------------------------------------------*/
Anurag Chouhan6d760662016-02-20 16:05:43 +05308301QDF_STATUS sme_set_max_tx_power(tHalHandle hHal, struct qdf_mac_addr pBssid,
8302 struct qdf_mac_addr pSelfMacAddress, int8_t dB)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008303{
8304 cds_msg_t msg;
8305 tpMaxTxPowerParams pMaxTxParams = NULL;
8306
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308307 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008308 TRACE_CODE_SME_RX_HDD_SET_MAXTXPOW, NO_SESSION, 0));
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308309 pMaxTxParams = qdf_mem_malloc(sizeof(tMaxTxPowerParams));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008310 if (NULL == pMaxTxParams) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308311 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008312 "%s: Not able to allocate memory for pMaxTxParams",
8313 __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308314 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008315 }
8316
Anurag Chouhanc5548422016-02-24 18:33:27 +05308317 qdf_copy_macaddr(&pMaxTxParams->bssId, &pBssid);
8318 qdf_copy_macaddr(&pMaxTxParams->selfStaMacAddr, &pSelfMacAddress);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008319 pMaxTxParams->power = dB;
8320
8321 msg.type = WMA_SET_MAX_TX_POWER_REQ;
8322 msg.reserved = 0;
8323 msg.bodyptr = pMaxTxParams;
8324
Anurag Chouhan6d760662016-02-20 16:05:43 +05308325 if (QDF_STATUS_SUCCESS != cds_mq_post_message(QDF_MODULE_ID_WMA, &msg)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308326 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008327 "%s: Not able to post WMA_SET_MAX_TX_POWER_REQ message to WMA",
8328 __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308329 qdf_mem_free(pMaxTxParams);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308330 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008331 }
8332
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308333 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008334}
8335
8336/* ---------------------------------------------------------------------------
8337
8338 \fn sme_set_custom_mac_addr
8339
8340 \brief Set the customer Mac Address.
8341
8342 \param customMacAddr customer MAC Address
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308343 \- return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008344
8345 ---------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308346QDF_STATUS sme_set_custom_mac_addr(tSirMacAddr customMacAddr)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008347{
8348 cds_msg_t msg;
8349 tSirMacAddr *pBaseMacAddr;
8350
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308351 pBaseMacAddr = qdf_mem_malloc(sizeof(tSirMacAddr));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008352 if (NULL == pBaseMacAddr) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308353 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008354 FL("Not able to allocate memory for pBaseMacAddr"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308355 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008356 }
8357
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308358 qdf_mem_copy(*pBaseMacAddr, customMacAddr, sizeof(tSirMacAddr));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008359
8360 msg.type = SIR_HAL_SET_BASE_MACADDR_IND;
8361 msg.reserved = 0;
8362 msg.bodyptr = pBaseMacAddr;
8363
Anurag Chouhan6d760662016-02-20 16:05:43 +05308364 if (QDF_STATUS_SUCCESS != cds_mq_post_message(QDF_MODULE_ID_WMA, &msg)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308365 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008366 FL
8367 ("Not able to post SIR_HAL_SET_BASE_MACADDR_IND message to WMA"));
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308368 qdf_mem_free(pBaseMacAddr);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308369 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008370 }
8371
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308372 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008373}
8374
8375/* ----------------------------------------------------------------------------
8376 \fn sme_set_tx_power
8377 \brief Set Transmit Power dynamically.
8378 \param hHal
8379 \param sessionId Target Session ID
8380 \pBSSId BSSID
8381 \dev_mode dev_mode such as station, P2PGO, SAP
8382 \param dBm power to set
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308383 \- return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008384 ---------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308385QDF_STATUS sme_set_tx_power(tHalHandle hHal, uint8_t sessionId,
Anurag Chouhan6d760662016-02-20 16:05:43 +05308386 struct qdf_mac_addr pBSSId,
8387 enum tQDF_ADAPTER_MODE dev_mode, int dBm)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008388{
8389 cds_msg_t msg;
8390 tpMaxTxPowerParams pTxParams = NULL;
8391 int8_t power = (int8_t) dBm;
8392
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308393 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008394 TRACE_CODE_SME_RX_HDD_SET_TXPOW, sessionId, 0));
8395
8396 /* make sure there is no overflow */
8397 if ((int)power != dBm) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308398 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008399 "%s: error, invalid power = %d", __func__, dBm);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308400 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008401 }
8402
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308403 pTxParams = qdf_mem_malloc(sizeof(tMaxTxPowerParams));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008404 if (NULL == pTxParams) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308405 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008406 "%s: Not able to allocate memory for pTxParams",
8407 __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308408 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008409 }
8410
Anurag Chouhanc5548422016-02-24 18:33:27 +05308411 qdf_copy_macaddr(&pTxParams->bssId, &pBSSId);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008412 pTxParams->power = power; /* unit is dBm */
8413 pTxParams->dev_mode = dev_mode;
8414 msg.type = WMA_SET_TX_POWER_REQ;
8415 msg.reserved = 0;
8416 msg.bodyptr = pTxParams;
8417
Anurag Chouhan6d760662016-02-20 16:05:43 +05308418 if (QDF_STATUS_SUCCESS != cds_mq_post_message(QDF_MODULE_ID_WMA, &msg)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308419 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008420 "%s: failed to post WMA_SET_TX_POWER_REQ to WMA",
8421 __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308422 qdf_mem_free(pTxParams);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308423 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008424 }
8425
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308426 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008427}
8428
Selvaraj, Sridhar7231c5f2016-09-28 12:42:33 +05308429QDF_STATUS sme_update_session_param(tHalHandle hal, uint8_t session_id,
8430 uint32_t param_type, uint32_t param_val)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008431{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308432 QDF_STATUS status = QDF_STATUS_SUCCESS;
Selvaraj, Sridhar7231c5f2016-09-28 12:42:33 +05308433 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008434 uint16_t len;
8435
Selvaraj, Sridhar7231c5f2016-09-28 12:42:33 +05308436 status = sme_acquire_global_lock(&mac_ctx->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308437 if (QDF_IS_STATUS_SUCCESS(status)) {
Selvaraj, Sridhar7231c5f2016-09-28 12:42:33 +05308438 struct sir_update_session_param *msg;
8439 tCsrRoamSession *session = CSR_GET_SESSION(mac_ctx, session_id);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008440
Selvaraj, Sridhar7231c5f2016-09-28 12:42:33 +05308441 if (!session) {
8442 sms_log(mac_ctx, LOGE, FL("session %d not found"),
8443 session_id);
8444 sme_release_global_lock(&mac_ctx->sme);
8445 return status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008446 }
8447
Selvaraj, Sridhar7231c5f2016-09-28 12:42:33 +05308448 if (!session->sessionActive)
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308449 QDF_ASSERT(0);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008450
Selvaraj, Sridhar7231c5f2016-09-28 12:42:33 +05308451 len = sizeof(*msg);
8452 msg = qdf_mem_malloc(len);
8453 if (!msg)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308454 status = QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008455 else {
Selvaraj, Sridhar7231c5f2016-09-28 12:42:33 +05308456 msg->message_type = eWNI_SME_SESSION_UPDATE_PARAM;
8457 msg->length = len;
8458 msg->session_id = session_id;
8459 msg->param_type = param_type;
8460 msg->param_val = param_val;
8461 status = cds_send_mb_message_to_mac(msg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008462 }
Selvaraj, Sridhar7231c5f2016-09-28 12:42:33 +05308463 sme_release_global_lock(&mac_ctx->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008464 }
8465 return status;
8466}
8467
8468/* ---------------------------------------------------------------------------
8469
8470 \fn sme_set_tm_level
8471 \brief Set Thermal Mitigation Level to RIVA
8472 \param hHal - The handle returned by mac_open.
8473 \param newTMLevel - new Thermal Mitigation Level
8474 \param tmMode - Thermal Mitigation handle mode, default 0
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308475 \return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008476 ---------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308477QDF_STATUS sme_set_tm_level(tHalHandle hHal, uint16_t newTMLevel, uint16_t tmMode)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008478{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308479 QDF_STATUS status = QDF_STATUS_SUCCESS;
8480 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008481 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
8482 cds_msg_t cds_message;
8483 tAniSetTmLevelReq *setTmLevelReq = NULL;
8484
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308485 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008486 TRACE_CODE_SME_RX_HDD_SET_TMLEVEL, NO_SESSION, 0));
8487 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308488 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008489 setTmLevelReq =
8490 (tAniSetTmLevelReq *)
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308491 qdf_mem_malloc(sizeof(tAniSetTmLevelReq));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008492 if (NULL == setTmLevelReq) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308493 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008494 "%s: Not able to allocate memory for sme_set_tm_level",
8495 __func__);
8496 sme_release_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308497 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008498 }
8499
8500 setTmLevelReq->tmMode = tmMode;
8501 setTmLevelReq->newTmLevel = newTMLevel;
8502
8503 /* serialize the req through MC thread */
8504 cds_message.bodyptr = setTmLevelReq;
8505 cds_message.type = WMA_SET_TM_LEVEL_REQ;
Sreelakshmi Konamki6a065362016-05-31 16:05:01 +05308506 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
8507 NO_SESSION, cds_message.type));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308508 qdf_status = cds_mq_post_message(CDS_MQ_ID_WMA, &cds_message);
8509 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308510 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008511 "%s: Post Set TM Level MSG fail", __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308512 qdf_mem_free(setTmLevelReq);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308513 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008514 }
8515 sme_release_global_lock(&pMac->sme);
8516 }
8517 return status;
8518}
8519
8520/*---------------------------------------------------------------------------
8521
8522 \brief sme_feature_caps_exchange() - SME interface to exchange capabilities between
8523 Host and FW.
8524
8525 \param hHal - HAL handle for device
8526
8527 \return NONE
8528
8529 ---------------------------------------------------------------------------*/
8530void sme_feature_caps_exchange(tHalHandle hHal)
8531{
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308532 MTRACE(qdf_trace
Anurag Chouhan6d760662016-02-20 16:05:43 +05308533 (QDF_MODULE_ID_SME, TRACE_CODE_SME_RX_HDD_CAPS_EXCH, NO_SESSION,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008534 0));
8535}
8536
8537/*---------------------------------------------------------------------------
8538
8539 \brief sme_disable_feature_capablity() - SME interface to disable Active mode offload capablity
8540 in Host.
8541
8542 \param hHal - HAL handle for device
8543
8544 \return NONE
8545
8546 ---------------------------------------------------------------------------*/
8547void sme_disable_feature_capablity(uint8_t feature_index)
8548{
8549}
8550
8551/* ---------------------------------------------------------------------------
8552 \fn sme_reset_power_values_for5_g
8553 \brief Reset the power values for 5G band with default power values.
8554 \param hHal - HAL handle for device
8555 \- return NONE
8556 -------------------------------------------------------------------------*/
8557void sme_reset_power_values_for5_g(tHalHandle hHal)
8558{
8559 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308560 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008561 TRACE_CODE_SME_RX_HDD_RESET_PW5G, NO_SESSION, 0));
8562 csr_save_channel_power_for_band(pMac, true);
8563 csr_apply_power2_current(pMac); /* Store the channel+power info in the global place: Cfg */
8564}
8565
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008566/* ---------------------------------------------------------------------------
8567 \fn sme_update_roam_prefer5_g_hz
8568 \brief enable/disable Roam prefer 5G runtime option
8569 This function is called through dynamic setConfig callback function
8570 to configure the Roam prefer 5G runtime option
8571 \param hHal - HAL handle for device
8572 \param nRoamPrefer5GHz Enable/Disable Roam prefer 5G runtime option
8573 \- return Success or failure
8574 -------------------------------------------------------------------------*/
8575
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308576QDF_STATUS sme_update_roam_prefer5_g_hz(tHalHandle hHal, bool nRoamPrefer5GHz)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008577{
8578 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308579 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008580
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308581 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008582 TRACE_CODE_SME_RX_HDD_UPDATE_RP5G, NO_SESSION, 0));
8583 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308584 if (QDF_IS_STATUS_SUCCESS(status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308585 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008586 "%s: gRoamPrefer5GHz is changed from %d to %d",
8587 __func__, pMac->roam.configParam.nRoamPrefer5GHz,
8588 nRoamPrefer5GHz);
8589 pMac->roam.configParam.nRoamPrefer5GHz = nRoamPrefer5GHz;
8590 sme_release_global_lock(&pMac->sme);
8591 }
8592
8593 return status;
8594}
8595
8596/* ---------------------------------------------------------------------------
8597 \fn sme_set_roam_intra_band
8598 \brief enable/disable Intra band roaming
8599 This function is called through dynamic setConfig callback function
8600 to configure the intra band roaming
8601 \param hHal - HAL handle for device
8602 \param nRoamIntraBand Enable/Disable Intra band roaming
8603 \- return Success or failure
8604 -------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308605QDF_STATUS sme_set_roam_intra_band(tHalHandle hHal, const bool nRoamIntraBand)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008606{
8607 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308608 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008609
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308610 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008611 TRACE_CODE_SME_RX_HDD_SET_ROAMIBAND, NO_SESSION, 0));
8612 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308613 if (QDF_IS_STATUS_SUCCESS(status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308614 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008615 "%s: gRoamIntraBand is changed from %d to %d",
8616 __func__, pMac->roam.configParam.nRoamIntraBand,
8617 nRoamIntraBand);
8618 pMac->roam.configParam.nRoamIntraBand = nRoamIntraBand;
8619 sme_release_global_lock(&pMac->sme);
8620 }
8621
8622 return status;
8623}
8624
8625/* ---------------------------------------------------------------------------
8626 \fn sme_update_roam_scan_n_probes
8627 \brief function to update roam scan N probes
8628 This function is called through dynamic setConfig callback function
8629 to update roam scan N probes
8630 \param hHal - HAL handle for device
8631 \param sessionId - Session Identifier
8632 \param nProbes number of probe requests to be sent out
8633 \- return Success or failure
8634 -------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308635QDF_STATUS sme_update_roam_scan_n_probes(tHalHandle hHal, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008636 const uint8_t nProbes)
8637{
8638 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308639 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008640
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308641 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008642 TRACE_CODE_SME_RX_HDD_UPDATE_ROAM_SCAN_N_PROBES,
8643 NO_SESSION, 0));
8644 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308645 if (QDF_IS_STATUS_SUCCESS(status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308646 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008647 "%s: gRoamScanNProbes is changed from %d to %d",
8648 __func__, pMac->roam.configParam.nProbes, nProbes);
8649 pMac->roam.configParam.nProbes = nProbes;
8650 sme_release_global_lock(&pMac->sme);
8651 }
8652 if (pMac->roam.configParam.isRoamOffloadScanEnabled) {
8653 csr_roam_offload_scan(pMac, sessionId,
8654 ROAM_SCAN_OFFLOAD_UPDATE_CFG,
8655 REASON_NPROBES_CHANGED);
8656 }
8657 return status;
8658}
8659
8660/* ---------------------------------------------------------------------------
8661 \fn sme_update_roam_scan_home_away_time
8662 \brief function to update roam scan Home away time
8663 This function is called through dynamic setConfig callback function
8664 to update roam scan home away time
8665 \param hHal - HAL handle for device
8666 \param sessionId - Session Identifier
8667 \param nRoamScanAwayTime Scan home away time
8668 \param bSendOffloadCmd If true then send offload command to firmware
8669 If false then command is not sent to firmware
8670 \- return Success or failure
8671 -------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308672QDF_STATUS sme_update_roam_scan_home_away_time(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008673 uint8_t sessionId,
8674 const uint16_t nRoamScanHomeAwayTime,
8675 const bool bSendOffloadCmd)
8676{
8677 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308678 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008679
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308680 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008681 TRACE_CODE_SME_RX_HDD_UPDATE_ROAM_SCAN_HOME_AWAY_TIME,
8682 NO_SESSION, 0));
8683 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308684 if (QDF_IS_STATUS_SUCCESS(status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308685 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008686 "%s: gRoamScanHomeAwayTime is changed from %d to %d",
8687 __func__,
8688 pMac->roam.configParam.nRoamScanHomeAwayTime,
8689 nRoamScanHomeAwayTime);
8690 pMac->roam.configParam.nRoamScanHomeAwayTime =
8691 nRoamScanHomeAwayTime;
8692 sme_release_global_lock(&pMac->sme);
8693 }
8694 if (pMac->roam.configParam.isRoamOffloadScanEnabled && bSendOffloadCmd) {
8695 csr_roam_offload_scan(pMac, sessionId,
8696 ROAM_SCAN_OFFLOAD_UPDATE_CFG,
8697 REASON_HOME_AWAY_TIME_CHANGED);
8698 }
8699 return status;
8700}
8701
Abhishek Singh518323d2015-10-19 17:42:01 +05308702/**
8703 * sme_ext_change_channel()- function to post send ECSA
8704 * action frame to csr.
8705 * @hHal: Hal context
8706 * @channel: new channel to switch
8707 * @session_id: senssion it should be sent on.
8708 *
8709 * This function is called to post ECSA frame to csr.
8710 *
8711 * Return: success if msg is sent else return failure
8712 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308713QDF_STATUS sme_ext_change_channel(tHalHandle h_hal, uint32_t channel,
Abhishek Singh518323d2015-10-19 17:42:01 +05308714 uint8_t session_id)
8715{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308716 QDF_STATUS status = QDF_STATUS_SUCCESS;
Abhishek Singh518323d2015-10-19 17:42:01 +05308717 tpAniSirGlobal mac_ctx = PMAC_STRUCT(h_hal);
8718 uint8_t channel_state;
8719
8720 sms_log(mac_ctx, LOGE, FL(" Set Channel %d "), channel);
8721 channel_state =
8722 cds_get_channel_state(channel);
8723
8724 if (CHANNEL_STATE_DISABLE == channel_state) {
8725 sms_log(mac_ctx, LOGE, FL(" Invalid channel %d "), channel);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308726 return QDF_STATUS_E_INVAL;
Abhishek Singh518323d2015-10-19 17:42:01 +05308727 }
8728
8729 status = sme_acquire_global_lock(&mac_ctx->sme);
8730
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308731 if (QDF_STATUS_SUCCESS == status) {
Abhishek Singh518323d2015-10-19 17:42:01 +05308732 /* update the channel list to the firmware */
8733 status = csr_send_ext_change_channel(mac_ctx,
8734 channel, session_id);
8735 sme_release_global_lock(&mac_ctx->sme);
8736 }
8737
8738 return status;
8739}
8740
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008741/* ---------------------------------------------------------------------------
8742 \fn sme_get_roam_intra_band
8743 \brief get Intra band roaming
8744 \param hHal - HAL handle for device
8745 \- return Success or failure
8746 -------------------------------------------------------------------------*/
8747bool sme_get_roam_intra_band(tHalHandle hHal)
8748{
8749 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308750 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008751 TRACE_CODE_SME_RX_HDD_GET_ROAMIBAND, NO_SESSION, 0));
8752 return pMac->roam.configParam.nRoamIntraBand;
8753}
8754
8755/* ---------------------------------------------------------------------------
8756 \fn sme_get_roam_scan_n_probes
8757 \brief get N Probes
8758 \param hHal - HAL handle for device
8759 \- return Success or failure
8760 -------------------------------------------------------------------------*/
8761uint8_t sme_get_roam_scan_n_probes(tHalHandle hHal)
8762{
8763 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
8764 return pMac->roam.configParam.nProbes;
8765}
8766
8767/* ---------------------------------------------------------------------------
8768 \fn sme_get_roam_scan_home_away_time
8769 \brief get Roam scan home away time
8770 \param hHal - HAL handle for device
8771 \- return Success or failure
8772 -------------------------------------------------------------------------*/
8773uint16_t sme_get_roam_scan_home_away_time(tHalHandle hHal)
8774{
8775 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
8776 return pMac->roam.configParam.nRoamScanHomeAwayTime;
8777}
8778
8779/* ---------------------------------------------------------------------------
8780 \fn sme_update_roam_rssi_diff
8781 \brief Update RoamRssiDiff
8782 This function is called through dynamic setConfig callback function
8783 to configure RoamRssiDiff
8784 Usage: adb shell iwpriv wlan0 setConfig RoamRssiDiff=[0 .. 125]
8785 \param hHal - HAL handle for device
8786 \param sessionId - Session Identifier
8787 \param RoamRssiDiff - minimum rssi difference between potential
8788 candidate and current AP.
8789 \- return Success or failure
8790 -------------------------------------------------------------------------*/
8791
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308792QDF_STATUS sme_update_roam_rssi_diff(tHalHandle hHal, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008793 uint8_t RoamRssiDiff)
8794{
8795 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308796 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008797
8798 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308799 if (QDF_IS_STATUS_SUCCESS(status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308800 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008801 "LFR runtime successfully set roam rssi diff to %d - old value is %d - roam state is %s",
8802 RoamRssiDiff,
8803 pMac->roam.configParam.RoamRssiDiff,
8804 mac_trace_get_neighbour_roam_state(pMac->roam.
8805 neighborRoamInfo
8806 [sessionId].
8807 neighborRoamState));
8808 pMac->roam.configParam.RoamRssiDiff = RoamRssiDiff;
8809 sme_release_global_lock(&pMac->sme);
8810 }
8811 if (pMac->roam.configParam.isRoamOffloadScanEnabled) {
8812 csr_roam_offload_scan(pMac, sessionId,
8813 ROAM_SCAN_OFFLOAD_UPDATE_CFG,
8814 REASON_RSSI_DIFF_CHANGED);
8815 }
8816 return status;
8817}
8818
8819/*--------------------------------------------------------------------------
8820 \brief sme_update_fast_transition_enabled() - enable/disable Fast Transition
8821 support at runtime
8822 It is used at in the REG_DYNAMIC_VARIABLE macro definition of
8823 isFastTransitionEnabled.
8824 This is a synchronous call
8825 \param hHal - The handle returned by mac_open.
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308826 \return QDF_STATUS_SUCCESS - SME update isFastTransitionEnabled config
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008827 successfully.
8828 Other status means SME is failed to update isFastTransitionEnabled.
8829 \sa
8830 --------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308831QDF_STATUS sme_update_fast_transition_enabled(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008832 bool isFastTransitionEnabled)
8833{
8834 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308835 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008836
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308837 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008838 TRACE_CODE_SME_RX_HDD_UPDATE_FTENABLED, NO_SESSION,
8839 0));
8840 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308841 if (QDF_IS_STATUS_SUCCESS(status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308842 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008843 "%s: FastTransitionEnabled is changed from %d to %d",
8844 __func__,
8845 pMac->roam.configParam.isFastTransitionEnabled,
8846 isFastTransitionEnabled);
8847 pMac->roam.configParam.isFastTransitionEnabled =
8848 isFastTransitionEnabled;
8849 sme_release_global_lock(&pMac->sme);
8850 }
8851
8852 return status;
8853}
8854
8855/* ---------------------------------------------------------------------------
8856 \fn sme_update_wes_mode
8857 \brief Update WES Mode
8858 This function is called through dynamic setConfig callback function
8859 to configure isWESModeEnabled
8860 \param hHal - HAL handle for device
8861 \param isWESModeEnabled - WES mode
8862 \param sessionId - Session Identifier
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308863 \return QDF_STATUS_SUCCESS - SME update isWESModeEnabled config successfully.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008864 Other status means SME is failed to update isWESModeEnabled.
8865 -------------------------------------------------------------------------*/
8866
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308867QDF_STATUS sme_update_wes_mode(tHalHandle hHal, bool isWESModeEnabled,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008868 uint8_t sessionId)
8869{
8870 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308871 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008872
8873 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308874 if (QDF_IS_STATUS_SUCCESS(status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308875 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008876 "LFR runtime successfully set WES Mode to %d - old value is %d - roam state is %s",
8877 isWESModeEnabled,
8878 pMac->roam.configParam.isWESModeEnabled,
8879 mac_trace_get_neighbour_roam_state(pMac->roam.
8880 neighborRoamInfo
8881 [sessionId].
8882 neighborRoamState));
8883 pMac->roam.configParam.isWESModeEnabled = isWESModeEnabled;
8884 sme_release_global_lock(&pMac->sme);
8885 }
8886
8887 return status;
8888}
8889
8890/* ---------------------------------------------------------------------------
8891 \fn sme_set_roam_scan_control
8892 \brief Set roam scan control
8893 This function is called to set roam scan control
8894 if roam scan control is set to 0, roaming scan cache is cleared
8895 any value other than 0 is treated as invalid value
8896 \param hHal - HAL handle for device
8897 \param sessionId - Session Identifier
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308898 \return QDF_STATUS_SUCCESS - SME update config successfully.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008899 Other status means SME failure to update
8900 -------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308901QDF_STATUS sme_set_roam_scan_control(tHalHandle hHal, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008902 bool roamScanControl)
8903{
8904 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308905 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008906
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308907 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008908 TRACE_CODE_SME_RX_HDD_SET_SCANCTRL, NO_SESSION, 0));
8909 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308910 if (QDF_IS_STATUS_SUCCESS(status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308911 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008912 "LFR runtime successfully set roam scan control to %d - old value is %d - roam state is %s",
8913 roamScanControl,
8914 pMac->roam.configParam.nRoamScanControl,
8915 mac_trace_get_neighbour_roam_state(pMac->roam.
8916 neighborRoamInfo
8917 [sessionId].
8918 neighborRoamState));
8919 pMac->roam.configParam.nRoamScanControl = roamScanControl;
8920 if (0 == roamScanControl) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308921 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008922 "LFR runtime successfully cleared roam scan cache");
8923 csr_flush_cfg_bg_scan_roam_channel_list(pMac, sessionId);
8924 if (pMac->roam.configParam.isRoamOffloadScanEnabled) {
8925 csr_roam_offload_scan(pMac, sessionId,
8926 ROAM_SCAN_OFFLOAD_UPDATE_CFG,
8927 REASON_FLUSH_CHANNEL_LIST);
8928 }
8929 }
8930 sme_release_global_lock(&pMac->sme);
8931 }
8932 return status;
8933}
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008934
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008935/*--------------------------------------------------------------------------
8936 \brief sme_update_is_fast_roam_ini_feature_enabled() - enable/disable LFR
8937 support at runtime
8938 It is used at in the REG_DYNAMIC_VARIABLE macro definition of
8939 isFastRoamIniFeatureEnabled.
8940 This is a synchronous call
8941 \param hHal - The handle returned by mac_open.
8942 \param sessionId - Session Identifier
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308943 \return QDF_STATUS_SUCCESS - SME update isFastRoamIniFeatureEnabled config
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008944 successfully.
8945 Other status means SME is failed to update isFastRoamIniFeatureEnabled.
8946 \sa
8947 --------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308948QDF_STATUS sme_update_is_fast_roam_ini_feature_enabled
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008949 (tHalHandle hHal,
8950 uint8_t sessionId, const bool isFastRoamIniFeatureEnabled) {
8951 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
8952
8953 if (pMac->roam.configParam.isFastRoamIniFeatureEnabled ==
8954 isFastRoamIniFeatureEnabled) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308955 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008956 "%s: FastRoam is already enabled or disabled, nothing to do (returning) old(%d) new(%d)",
8957 __func__,
8958 pMac->roam.configParam.isFastRoamIniFeatureEnabled,
8959 isFastRoamIniFeatureEnabled);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308960 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008961 }
8962
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308963 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008964 "%s: FastRoamEnabled is changed from %d to %d", __func__,
8965 pMac->roam.configParam.isFastRoamIniFeatureEnabled,
8966 isFastRoamIniFeatureEnabled);
8967 pMac->roam.configParam.isFastRoamIniFeatureEnabled =
8968 isFastRoamIniFeatureEnabled;
8969 csr_neighbor_roam_update_fast_roaming_enabled(pMac, sessionId,
8970 isFastRoamIniFeatureEnabled);
8971
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308972 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008973}
8974
Mukul Sharma69c44cd2016-09-12 18:33:57 +05308975/**
8976 * sme_config_fast_roaming() - enable/disable LFR support at runtime
8977 * @hal - The handle returned by macOpen.
8978 * @session_id - Session Identifier
8979 * @is_fast_roam_enabled - flag to enable/disable roaming
8980 *
8981 * When Supplicant issues enabled/disable fast roaming on the basis
8982 * of the Bssid modification in network block (e.g. AutoJoin mode N/W block)
8983 *
8984 * Return: QDF_STATUS
8985 */
8986
8987QDF_STATUS sme_config_fast_roaming(tHalHandle hal, uint8_t session_id,
8988 const bool is_fast_roam_enabled)
8989{
8990 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
Sreelakshmi Konamkibda5bbf2016-09-12 18:38:10 +05308991 tCsrRoamSession *session = CSR_GET_SESSION(mac_ctx, session_id);
Mukul Sharma69c44cd2016-09-12 18:33:57 +05308992 QDF_STATUS status;
8993
8994 if (!mac_ctx->roam.configParam.isFastRoamIniFeatureEnabled) {
8995 sms_log(mac_ctx, LOGE, FL("Fast roam is disabled through ini"));
8996 if (!is_fast_roam_enabled)
8997 return QDF_STATUS_SUCCESS;
8998 return QDF_STATUS_E_FAILURE;
8999 }
Sreelakshmi Konamkibda5bbf2016-09-12 18:38:10 +05309000
9001 if (is_fast_roam_enabled && session && session->pCurRoamProfile)
9002 session->pCurRoamProfile->do_not_roam = false;
9003
Mukul Sharma69c44cd2016-09-12 18:33:57 +05309004 status = csr_neighbor_roam_update_fast_roaming_enabled(mac_ctx,
9005 session_id, is_fast_roam_enabled);
9006 if (!QDF_IS_STATUS_SUCCESS(status)) {
9007 sms_log(mac_ctx, LOGE,
9008 FL("csr_neighbor_roam_update_fast_roaming_enabled failed"));
9009 return QDF_STATUS_E_FAILURE;
9010 }
9011
9012 return QDF_STATUS_SUCCESS;
9013}
9014
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009015/*--------------------------------------------------------------------------
9016 \brief sme_update_is_mawc_ini_feature_enabled() -
9017 Enable/disable LFR MAWC support at runtime
9018 It is used at in the REG_DYNAMIC_VARIABLE macro definition of
9019 isMAWCIniFeatureEnabled.
9020 This is a synchronous call
9021 \param hHal - The handle returned by mac_open.
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309022 \return QDF_STATUS_SUCCESS - SME update MAWCEnabled config successfully.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009023 Other status means SME is failed to update MAWCEnabled.
9024 \sa
9025 --------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309026QDF_STATUS sme_update_is_mawc_ini_feature_enabled(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009027 const bool MAWCEnabled)
9028{
9029 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309030 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009031
9032 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309033 if (QDF_IS_STATUS_SUCCESS(status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05309034 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009035 "%s: MAWCEnabled is changed from %d to %d", __func__,
9036 pMac->roam.configParam.MAWCEnabled, MAWCEnabled);
9037 pMac->roam.configParam.MAWCEnabled = MAWCEnabled;
9038 sme_release_global_lock(&pMac->sme);
9039 }
9040
9041 return status;
9042
9043}
9044
9045/*--------------------------------------------------------------------------
9046 \brief sme_stop_roaming() - Stop roaming for a given sessionId
9047 This is a synchronous call
9048 \param hHal - The handle returned by mac_open
9049 \param sessionId - Session Identifier
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309050 \return QDF_STATUS_SUCCESS on success
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009051 Other status on failure
9052 \sa
9053 --------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309054QDF_STATUS sme_stop_roaming(tHalHandle hHal, uint8_t sessionId, uint8_t reason)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009055{
9056 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309057 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009058
9059 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309060 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009061 csr_roam_offload_scan(pMac, sessionId, ROAM_SCAN_OFFLOAD_STOP,
9062 reason);
9063 sme_release_global_lock(&pMac->sme);
9064 }
9065
9066 return status;
9067}
9068
9069/*--------------------------------------------------------------------------
9070 \brief sme_start_roaming() - Start roaming for a given sessionId
9071 This is a synchronous call
9072 \param hHal - The handle returned by mac_open
9073 \param sessionId - Session Identifier
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309074 \return QDF_STATUS_SUCCESS on success
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009075 Other status on failure
9076 \sa
9077 --------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309078QDF_STATUS sme_start_roaming(tHalHandle hHal, uint8_t sessionId, uint8_t reason)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009079{
9080 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309081 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009082
9083 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309084 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009085 csr_roam_offload_scan(pMac, sessionId, ROAM_SCAN_OFFLOAD_START,
9086 reason);
9087 sme_release_global_lock(&pMac->sme);
9088 }
9089
9090 return status;
9091}
9092
9093/*--------------------------------------------------------------------------
9094 \brief sme_update_enable_fast_roam_in_concurrency() - enable/disable LFR if
9095 Concurrent session exists
9096 This is a synchronuous call
9097 \param hHal - The handle returned by mac_open.
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309098 \return QDF_STATUS_SUCCESS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009099 Other status means SME is failed
9100 \sa
9101 --------------------------------------------------------------------------*/
9102
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309103QDF_STATUS sme_update_enable_fast_roam_in_concurrency(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009104 bool
9105 bFastRoamInConIniFeatureEnabled)
9106{
9107
9108 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309109 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009110
9111 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309112 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009113 pMac->roam.configParam.bFastRoamInConIniFeatureEnabled =
9114 bFastRoamInConIniFeatureEnabled;
9115 if (0 == pMac->roam.configParam.isRoamOffloadScanEnabled) {
9116 pMac->roam.configParam.bFastRoamInConIniFeatureEnabled =
9117 0;
9118 }
9119 sme_release_global_lock(&pMac->sme);
9120 }
9121
9122 return status;
9123}
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009124
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009125/*--------------------------------------------------------------------------
9126 \brief sme_update_config_fw_rssi_monitoring() - enable/disable firmware RSSI
9127 Monitoring at runtime
9128 It is used at in the REG_DYNAMIC_VARIABLE macro definition of
9129 fEnableFwRssiMonitoring.
9130 This is a synchronous call
9131 \param hHal - The handle returned by mac_open.
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309132 \return QDF_STATUS_SUCCESS - SME update fEnableFwRssiMonitoring.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009133 config successfully.
9134 Other status means SME is failed to update fEnableFwRssiMonitoring.
9135 \sa
9136 --------------------------------------------------------------------------*/
9137
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309138QDF_STATUS sme_update_config_fw_rssi_monitoring(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009139 bool fEnableFwRssiMonitoring)
9140{
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05309141 QDF_STATUS qdf_ret_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009142
9143 if (sme_cfg_set_int (hHal, WNI_CFG_PS_ENABLE_RSSI_MONITOR,
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309144 fEnableFwRssiMonitoring) == QDF_STATUS_E_FAILURE) {
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05309145 qdf_ret_status = QDF_STATUS_E_FAILURE;
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05309146 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009147 "Could not pass on WNI_CFG_PS_RSSI_MONITOR to CFG");
9148 }
9149
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05309150 return qdf_ret_status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009151}
9152
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009153/* ---------------------------------------------------------------------------
9154 \fn sme_set_roam_opportunistic_scan_threshold_diff
9155 \brief Update Opportunistic Scan threshold diff
9156 This function is called through dynamic setConfig callback function
9157 to configure nOpportunisticThresholdDiff
9158 \param hHal - HAL handle for device
9159 \param sessionId - Session Identifier
9160 \param nOpportunisticThresholdDiff - Opportunistic Scan threshold diff
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309161 \return QDF_STATUS_SUCCESS - SME update nOpportunisticThresholdDiff config
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009162 successfully.
9163 else SME is failed to update nOpportunisticThresholdDiff.
9164 -------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309165QDF_STATUS sme_set_roam_opportunistic_scan_threshold_diff(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009166 uint8_t sessionId,
9167 const uint8_t
9168 nOpportunisticThresholdDiff)
9169{
9170 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309171 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009172
9173 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309174 if (QDF_IS_STATUS_SUCCESS(status)) {
Varun Reddy Yeturuff4feb02016-04-20 12:26:11 -07009175 status = csr_neighbor_roam_update_config(pMac, sessionId,
9176 nOpportunisticThresholdDiff,
9177 REASON_OPPORTUNISTIC_THRESH_DIFF_CHANGED);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309178 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009179 pMac->roam.configParam.neighborRoamConfig.
9180 nOpportunisticThresholdDiff =
9181 nOpportunisticThresholdDiff;
9182 }
9183 sme_release_global_lock(&pMac->sme);
9184 }
9185 return status;
9186}
9187
9188/*--------------------------------------------------------------------------
9189 \fn sme_get_roam_opportunistic_scan_threshold_diff()
9190 \brief gets Opportunistic Scan threshold diff
9191 This is a synchronous call
9192 \param hHal - The handle returned by mac_open
9193 \return uint8_t - nOpportunisticThresholdDiff
9194 \sa
9195 --------------------------------------------------------------------------*/
9196uint8_t sme_get_roam_opportunistic_scan_threshold_diff(tHalHandle hHal)
9197{
9198 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
9199 return pMac->roam.configParam.neighborRoamConfig.
9200 nOpportunisticThresholdDiff;
9201}
9202
9203/* ---------------------------------------------------------------------------
9204 \fn sme_set_roam_rescan_rssi_diff
9205 \brief Update roam rescan rssi diff
9206 This function is called through dynamic setConfig callback function
9207 to configure nRoamRescanRssiDiff
9208 \param hHal - HAL handle for device
9209 \param sessionId - Session Identifier
9210 \param nRoamRescanRssiDiff - roam rescan rssi diff
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309211 \return QDF_STATUS_SUCCESS - SME update nRoamRescanRssiDiff config
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009212 successfully.
9213 else SME is failed to update nRoamRescanRssiDiff.
9214 -------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309215QDF_STATUS sme_set_roam_rescan_rssi_diff(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009216 uint8_t sessionId,
9217 const uint8_t nRoamRescanRssiDiff)
9218{
9219 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309220 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009221
9222 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309223 if (QDF_IS_STATUS_SUCCESS(status)) {
Varun Reddy Yeturuff4feb02016-04-20 12:26:11 -07009224 status = csr_neighbor_roam_update_config(pMac, sessionId,
9225 nRoamRescanRssiDiff,
9226 REASON_ROAM_RESCAN_RSSI_DIFF_CHANGED);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309227 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009228 pMac->roam.configParam.neighborRoamConfig.
9229 nRoamRescanRssiDiff = nRoamRescanRssiDiff;
9230 }
9231 sme_release_global_lock(&pMac->sme);
9232 }
9233 return status;
9234}
9235
9236/*--------------------------------------------------------------------------
9237 \fn sme_get_roam_rescan_rssi_diff
9238 \brief gets roam rescan rssi diff
9239 This is a synchronous call
9240 \param hHal - The handle returned by mac_open
9241 \return int8_t - nRoamRescanRssiDiff
9242 \sa
9243 --------------------------------------------------------------------------*/
9244uint8_t sme_get_roam_rescan_rssi_diff(tHalHandle hHal)
9245{
9246 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
9247 return pMac->roam.configParam.neighborRoamConfig.nRoamRescanRssiDiff;
9248}
9249
9250/* ---------------------------------------------------------------------------
9251 \fn sme_set_roam_bmiss_first_bcnt
9252 \brief Update Roam count for first beacon miss
9253 This function is called through dynamic setConfig callback function
9254 to configure nRoamBmissFirstBcnt
9255 \param hHal - HAL handle for device
9256 \param sessionId - Session Identifier
9257 \param nRoamBmissFirstBcnt - Roam first bmiss count
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309258 \return QDF_STATUS_SUCCESS - SME update nRoamBmissFirstBcnt
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009259 successfully.
9260 else SME is failed to update nRoamBmissFirstBcnt
9261 -------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309262QDF_STATUS sme_set_roam_bmiss_first_bcnt(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009263 uint8_t sessionId,
9264 const uint8_t nRoamBmissFirstBcnt)
9265{
9266 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309267 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009268
9269 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309270 if (QDF_IS_STATUS_SUCCESS(status)) {
Varun Reddy Yeturuff4feb02016-04-20 12:26:11 -07009271 status = csr_neighbor_roam_update_config(pMac, sessionId,
9272 nRoamBmissFirstBcnt,
9273 REASON_ROAM_BMISS_FIRST_BCNT_CHANGED);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309274 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009275 pMac->roam.configParam.neighborRoamConfig.
9276 nRoamBmissFirstBcnt = nRoamBmissFirstBcnt;
9277 }
9278 sme_release_global_lock(&pMac->sme);
9279 }
9280 return status;
9281}
9282
9283/* ---------------------------------------------------------------------------
9284 \fn sme_get_roam_bmiss_first_bcnt
9285 \brief get neighbor roam beacon miss first count
9286 \param hHal - The handle returned by mac_open.
9287 \return uint8_t - neighbor roam beacon miss first count
9288 -------------------------------------------------------------------------*/
9289uint8_t sme_get_roam_bmiss_first_bcnt(tHalHandle hHal)
9290{
9291 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
9292 return pMac->roam.configParam.neighborRoamConfig.nRoamBmissFirstBcnt;
9293}
9294
9295/* ---------------------------------------------------------------------------
9296 \fn sme_set_roam_bmiss_final_bcnt
9297 \brief Update Roam count for final beacon miss
9298 This function is called through dynamic setConfig callback function
9299 to configure nRoamBmissFinalBcnt
9300 \param hHal - HAL handle for device
9301 \param sessionId - Session Identifier
9302 \param nRoamBmissFinalBcnt - Roam final bmiss count
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309303 \return QDF_STATUS_SUCCESS - SME update nRoamBmissFinalBcnt
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009304 successfully.
9305 else SME is failed to update nRoamBmissFinalBcnt
9306 -------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309307QDF_STATUS sme_set_roam_bmiss_final_bcnt(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009308 uint8_t sessionId,
9309 const uint8_t nRoamBmissFinalBcnt)
9310{
9311 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309312 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009313
9314 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309315 if (QDF_IS_STATUS_SUCCESS(status)) {
Varun Reddy Yeturuff4feb02016-04-20 12:26:11 -07009316 status = csr_neighbor_roam_update_config(pMac, sessionId,
9317 nRoamBmissFinalBcnt,
9318 REASON_ROAM_BMISS_FINAL_BCNT_CHANGED);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309319 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009320 pMac->roam.configParam.neighborRoamConfig.
9321 nRoamBmissFinalBcnt = nRoamBmissFinalBcnt;
9322 }
9323 sme_release_global_lock(&pMac->sme);
9324 }
9325 return status;
9326}
9327
9328/*--------------------------------------------------------------------------
9329 \fn sme_get_roam_bmiss_final_bcnt
9330 \brief gets Roam count for final beacon miss
9331 This is a synchronous call
9332 \param hHal - The handle returned by mac_open
9333 \return uint8_t - nRoamBmissFinalBcnt
9334 \sa
9335 --------------------------------------------------------------------------*/
9336uint8_t sme_get_roam_bmiss_final_bcnt(tHalHandle hHal)
9337{
9338 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
9339 return pMac->roam.configParam.neighborRoamConfig.nRoamBmissFinalBcnt;
9340}
9341
9342/* ---------------------------------------------------------------------------
9343 \fn sme_set_roam_beacon_rssi_weight
9344 \brief Update Roam beacon rssi weight
9345 This function is called through dynamic setConfig callback function
9346 to configure nRoamBeaconRssiWeight
9347 \param hHal - HAL handle for device
9348 \param sessionId - Session Identifier
9349 \param nRoamBeaconRssiWeight - Roam beacon rssi weight
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309350 \return QDF_STATUS_SUCCESS - SME update nRoamBeaconRssiWeight config
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009351 successfully.
9352 else SME is failed to update nRoamBeaconRssiWeight
9353 -------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309354QDF_STATUS sme_set_roam_beacon_rssi_weight(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009355 uint8_t sessionId,
9356 const uint8_t nRoamBeaconRssiWeight)
9357{
9358 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309359 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009360
9361 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309362 if (QDF_IS_STATUS_SUCCESS(status)) {
Varun Reddy Yeturuff4feb02016-04-20 12:26:11 -07009363 status = csr_neighbor_roam_update_config(pMac, sessionId,
9364 nRoamBeaconRssiWeight,
9365 REASON_ROAM_BEACON_RSSI_WEIGHT_CHANGED);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309366 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009367 pMac->roam.configParam.neighborRoamConfig.
9368 nRoamBeaconRssiWeight = nRoamBeaconRssiWeight;
9369 }
9370 sme_release_global_lock(&pMac->sme);
9371 }
9372 return status;
9373}
9374
9375/*--------------------------------------------------------------------------
9376 \fn sme_get_roam_beacon_rssi_weight
9377 \brief gets Roam beacon rssi weight
9378 This is a synchronous call
9379 \param hHal - The handle returned by mac_open
9380 \return uint8_t - nRoamBeaconRssiWeight
9381 \sa
9382 --------------------------------------------------------------------------*/
9383uint8_t sme_get_roam_beacon_rssi_weight(tHalHandle hHal)
9384{
9385 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
9386 return pMac->roam.configParam.neighborRoamConfig.nRoamBeaconRssiWeight;
9387}
9388
9389/*--------------------------------------------------------------------------
9390 \brief sme_set_neighbor_lookup_rssi_threshold() - update neighbor lookup
9391 rssi threshold
9392 This is a synchronous call
9393 \param hHal - The handle returned by mac_open.
9394 \param sessionId - Session Identifier
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309395 \return QDF_STATUS_SUCCESS - SME update config successful.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009396 Other status means SME is failed to update
9397 \sa
9398 --------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309399QDF_STATUS sme_set_neighbor_lookup_rssi_threshold
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009400 (tHalHandle hHal, uint8_t sessionId, uint8_t neighborLookupRssiThreshold) {
9401 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309402 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009403
9404 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309405 if (QDF_IS_STATUS_SUCCESS(status)) {
Varun Reddy Yeturuff4feb02016-04-20 12:26:11 -07009406 status = csr_neighbor_roam_update_config(pMac,
9407 sessionId, neighborLookupRssiThreshold,
9408 REASON_LOOKUP_THRESH_CHANGED);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309409 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009410 pMac->roam.configParam.neighborRoamConfig.
9411 nNeighborLookupRssiThreshold =
9412 neighborLookupRssiThreshold;
9413 }
9414 sme_release_global_lock(&pMac->sme);
9415 }
9416 return status;
9417}
9418
9419/*--------------------------------------------------------------------------
9420 \brief sme_set_delay_before_vdev_stop() - update delay before VDEV_STOP
9421 This is a synchronous call
9422 \param hal - The handle returned by macOpen.
9423 \param session_id - Session Identifier
9424 \param delay_before_vdev_stop - value to be set
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309425 \return QDF_STATUS_SUCCESS - SME update config successful.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009426 Other status means SME is failed to update
9427 \sa
9428 --------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309429QDF_STATUS sme_set_delay_before_vdev_stop(tHalHandle hal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009430 uint8_t session_id,
9431 uint8_t delay_before_vdev_stop)
9432{
9433 tpAniSirGlobal pMac = PMAC_STRUCT(hal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309434 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009435 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309436 if (QDF_IS_STATUS_SUCCESS(status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05309437 QDF_TRACE(QDF_MODULE_ID_SME,
9438 QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009439 FL("LFR param delay_before_vdev_stop changed from %d to %d"),
9440 pMac->roam.configParam.neighborRoamConfig.
9441 delay_before_vdev_stop,
9442 delay_before_vdev_stop);
9443 pMac->roam.neighborRoamInfo[session_id].cfgParams.
9444 delay_before_vdev_stop = delay_before_vdev_stop;
9445 pMac->roam.configParam.neighborRoamConfig.
9446 delay_before_vdev_stop = delay_before_vdev_stop;
9447 sme_release_global_lock(&pMac->sme);
9448 }
9449 return status;
9450}
9451
9452/*--------------------------------------------------------------------------
9453 \brief sme_get_neighbor_lookup_rssi_threshold() - get neighbor lookup
9454 rssi threshold
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 successful.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009458 Other status means SME is failed to update
9459 \sa
9460 --------------------------------------------------------------------------*/
9461uint8_t sme_get_neighbor_lookup_rssi_threshold(tHalHandle hHal)
9462{
9463 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
9464 return pMac->roam.configParam.neighborRoamConfig.
9465 nNeighborLookupRssiThreshold;
9466}
9467
9468/*--------------------------------------------------------------------------
9469 \brief sme_set_neighbor_scan_refresh_period() - set neighbor scan results
9470 refresh period
9471 This is a synchronous call
9472 \param hHal - The handle returned by mac_open.
9473 \param sessionId - Session Identifier
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309474 \return QDF_STATUS_SUCCESS - SME update config successful.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009475 Other status means SME is failed to update
9476 \sa
9477 --------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309478QDF_STATUS sme_set_neighbor_scan_refresh_period
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009479 (tHalHandle hHal,
9480 uint8_t sessionId, uint16_t neighborScanResultsRefreshPeriod) {
9481 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309482 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009483 tCsrNeighborRoamConfig *pNeighborRoamConfig = NULL;
9484 tpCsrNeighborRoamControlInfo pNeighborRoamInfo = NULL;
9485
9486 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309487 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009488 pNeighborRoamConfig =
9489 &pMac->roam.configParam.neighborRoamConfig;
9490 pNeighborRoamInfo = &pMac->roam.neighborRoamInfo[sessionId];
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05309491 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009492 "LFR runtime successfully set roam scan refresh period to %d- old value is %d - roam state is %s",
9493 neighborScanResultsRefreshPeriod,
9494 pMac->roam.configParam.neighborRoamConfig.
9495 nNeighborResultsRefreshPeriod,
9496 mac_trace_get_neighbour_roam_state(pMac->roam.
9497 neighborRoamInfo
9498 [sessionId].
9499 neighborRoamState));
9500 pNeighborRoamConfig->nNeighborResultsRefreshPeriod =
9501 neighborScanResultsRefreshPeriod;
9502 pNeighborRoamInfo->cfgParams.neighborResultsRefreshPeriod =
9503 neighborScanResultsRefreshPeriod;
9504
9505 sme_release_global_lock(&pMac->sme);
9506 }
9507 if (pMac->roam.configParam.isRoamOffloadScanEnabled) {
9508 csr_roam_offload_scan(pMac, sessionId,
9509 ROAM_SCAN_OFFLOAD_UPDATE_CFG,
9510 REASON_NEIGHBOR_SCAN_REFRESH_PERIOD_CHANGED);
9511 }
9512 return status;
9513}
9514
9515/*--------------------------------------------------------------------------
9516 \brief sme_update_roam_scan_offload_enabled() - enable/disable roam scan
9517 offload feaure
9518 It is used at in the REG_DYNAMIC_VARIABLE macro definition of
9519 gRoamScanOffloadEnabled.
9520 This is a synchronous call
9521 \param hHal - The handle returned by mac_open.
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309522 \return QDF_STATUS_SUCCESS - SME update config successfully.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009523 Other status means SME is failed to update.
9524 \sa
9525 --------------------------------------------------------------------------*/
9526
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309527QDF_STATUS sme_update_roam_scan_offload_enabled(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009528 bool nRoamScanOffloadEnabled)
9529{
9530 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309531 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009532
9533 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309534 if (QDF_IS_STATUS_SUCCESS(status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05309535 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009536 FL
9537 ("gRoamScanOffloadEnabled is changed from %d to %d"),
9538 pMac->roam.configParam.isRoamOffloadScanEnabled,
9539 nRoamScanOffloadEnabled);
9540 pMac->roam.configParam.isRoamOffloadScanEnabled =
9541 nRoamScanOffloadEnabled;
9542 sme_release_global_lock(&pMac->sme);
9543 }
9544
9545 return status;
9546}
9547
9548/*--------------------------------------------------------------------------
9549 \brief sme_get_neighbor_scan_refresh_period() - get neighbor scan results
9550 refresh period
9551 This is a synchronous call
9552 \param hHal - The handle returned by mac_open.
9553 \return uint16_t - Neighbor scan results refresh period value
9554 \sa
9555 --------------------------------------------------------------------------*/
9556uint16_t sme_get_neighbor_scan_refresh_period(tHalHandle hHal)
9557{
9558 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
9559 return pMac->roam.configParam.neighborRoamConfig.
9560 nNeighborResultsRefreshPeriod;
9561}
9562
9563/*--------------------------------------------------------------------------
9564 \brief sme_get_empty_scan_refresh_period() - get empty scan refresh period
9565 This is a synchronuous call
9566 \param hHal - The handle returned by mac_open.
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309567 \return QDF_STATUS_SUCCESS - SME update config successful.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009568 Other status means SME is failed to update
9569 \sa
9570 --------------------------------------------------------------------------*/
9571uint16_t sme_get_empty_scan_refresh_period(tHalHandle hHal)
9572{
9573 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
9574 return pMac->roam.configParam.neighborRoamConfig.
9575 nEmptyScanRefreshPeriod;
9576}
9577
9578/* ---------------------------------------------------------------------------
9579 \fn sme_update_empty_scan_refresh_period
9580 \brief Update nEmptyScanRefreshPeriod
9581 This function is called through dynamic setConfig callback function
9582 to configure nEmptyScanRefreshPeriod
9583 Usage: adb shell iwpriv wlan0 setConfig
9584 nEmptyScanRefreshPeriod=[0 .. 60]
9585 \param hHal - HAL handle for device
9586 \param sessionId - Session Identifier
9587 \param nEmptyScanRefreshPeriod - scan period following empty scan results.
9588 \- return Success or failure
9589 -------------------------------------------------------------------------*/
9590
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309591QDF_STATUS sme_update_empty_scan_refresh_period(tHalHandle hHal, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009592 uint16_t nEmptyScanRefreshPeriod)
9593{
9594 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309595 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009596 tCsrNeighborRoamConfig *pNeighborRoamConfig = NULL;
9597 tpCsrNeighborRoamControlInfo pNeighborRoamInfo = NULL;
9598
9599 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309600 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009601 pNeighborRoamConfig =
9602 &pMac->roam.configParam.neighborRoamConfig;
9603 pNeighborRoamInfo = &pMac->roam.neighborRoamInfo[sessionId];
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05309604 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009605 "LFR runtime successfully set roam scan period to %d -old value is %d - roam state is %s",
9606 nEmptyScanRefreshPeriod,
9607 pMac->roam.configParam.neighborRoamConfig.
9608 nEmptyScanRefreshPeriod,
9609 mac_trace_get_neighbour_roam_state(pMac->roam.
9610 neighborRoamInfo
9611 [sessionId].
9612 neighborRoamState));
9613 pNeighborRoamConfig->nEmptyScanRefreshPeriod =
9614 nEmptyScanRefreshPeriod;
9615 pNeighborRoamInfo->cfgParams.emptyScanRefreshPeriod =
9616 nEmptyScanRefreshPeriod;
9617 sme_release_global_lock(&pMac->sme);
9618 }
9619 if (pMac->roam.configParam.isRoamOffloadScanEnabled) {
9620 csr_roam_offload_scan(pMac, sessionId,
9621 ROAM_SCAN_OFFLOAD_UPDATE_CFG,
9622 REASON_EMPTY_SCAN_REF_PERIOD_CHANGED);
9623 }
9624 return status;
9625}
9626
9627/* ---------------------------------------------------------------------------
9628 \fn sme_set_neighbor_scan_min_chan_time
9629 \brief Update nNeighborScanMinChanTime
9630 This function is called through dynamic setConfig callback function
9631 to configure gNeighborScanChannelMinTime
9632 Usage: adb shell iwpriv wlan0 setConfig
9633 gNeighborScanChannelMinTime=[0 .. 60]
9634 \param hHal - HAL handle for device
9635 \param nNeighborScanMinChanTime - Channel minimum dwell time
9636 \param sessionId - Session Identifier
9637 \- return Success or failure
9638 -------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309639QDF_STATUS sme_set_neighbor_scan_min_chan_time(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009640 const uint16_t
9641 nNeighborScanMinChanTime,
9642 uint8_t sessionId)
9643{
9644 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309645 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009646
9647 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309648 if (QDF_IS_STATUS_SUCCESS(status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05309649 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009650 "LFR runtime successfully set channel min dwell time to %d - old value is %d - roam state is %s",
9651 nNeighborScanMinChanTime,
9652 pMac->roam.configParam.neighborRoamConfig.
9653 nNeighborScanMinChanTime,
9654 mac_trace_get_neighbour_roam_state(pMac->roam.
9655 neighborRoamInfo
9656 [sessionId].
9657 neighborRoamState));
9658
9659 pMac->roam.configParam.neighborRoamConfig.
9660 nNeighborScanMinChanTime = nNeighborScanMinChanTime;
9661 pMac->roam.neighborRoamInfo[sessionId].cfgParams.
9662 minChannelScanTime = nNeighborScanMinChanTime;
9663 sme_release_global_lock(&pMac->sme);
9664 }
9665
9666 return status;
9667}
9668
9669/* ---------------------------------------------------------------------------
9670 \fn sme_set_neighbor_scan_max_chan_time
9671 \brief Update nNeighborScanMaxChanTime
9672 This function is called through dynamic setConfig callback function
9673 to configure gNeighborScanChannelMaxTime
9674 Usage: adb shell iwpriv wlan0 setConfig
9675 gNeighborScanChannelMaxTime=[0 .. 60]
9676 \param hHal - HAL handle for device
9677 \param sessionId - Session Identifier
9678 \param nNeighborScanMinChanTime - Channel maximum dwell time
9679 \- return Success or failure
9680 -------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309681QDF_STATUS sme_set_neighbor_scan_max_chan_time(tHalHandle hHal, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009682 const uint16_t
9683 nNeighborScanMaxChanTime)
9684{
9685 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309686 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009687 tCsrNeighborRoamConfig *pNeighborRoamConfig = NULL;
9688 tpCsrNeighborRoamControlInfo pNeighborRoamInfo = NULL;
9689
9690 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309691 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009692 pNeighborRoamConfig =
9693 &pMac->roam.configParam.neighborRoamConfig;
9694 pNeighborRoamInfo = &pMac->roam.neighborRoamInfo[sessionId];
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05309695 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009696 "LFR runtime successfully set channel max dwell time to %d - old value is %d - roam state is %s",
9697 nNeighborScanMaxChanTime,
9698 pMac->roam.configParam.neighborRoamConfig.
9699 nNeighborScanMaxChanTime,
9700 mac_trace_get_neighbour_roam_state(pMac->roam.
9701 neighborRoamInfo
9702 [sessionId].
9703 neighborRoamState));
9704 pNeighborRoamConfig->nNeighborScanMaxChanTime =
9705 nNeighborScanMaxChanTime;
9706 pNeighborRoamInfo->cfgParams.maxChannelScanTime =
9707 nNeighborScanMaxChanTime;
9708 sme_release_global_lock(&pMac->sme);
9709 }
9710 if (pMac->roam.configParam.isRoamOffloadScanEnabled) {
9711 csr_roam_offload_scan(pMac, sessionId,
9712 ROAM_SCAN_OFFLOAD_UPDATE_CFG,
9713 REASON_SCAN_CH_TIME_CHANGED);
9714 }
9715
9716 return status;
9717}
9718
9719/* ---------------------------------------------------------------------------
9720 \fn sme_get_neighbor_scan_min_chan_time
9721 \brief get neighbor scan min channel time
9722 \param hHal - The handle returned by mac_open.
9723 \param sessionId - Session Identifier
9724 \return uint16_t - channel min time value
9725 -------------------------------------------------------------------------*/
9726uint16_t sme_get_neighbor_scan_min_chan_time(tHalHandle hHal, uint8_t sessionId)
9727{
9728 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
9729 return pMac->roam.neighborRoamInfo[sessionId].cfgParams.
9730 minChannelScanTime;
9731}
9732
9733/* ---------------------------------------------------------------------------
9734 \fn sme_get_neighbor_roam_state
9735 \brief get neighbor roam state
9736 \param hHal - The handle returned by mac_open.
9737 \param sessionId - Session Identifier
9738 \return uint32_t - neighbor roam state
9739 -------------------------------------------------------------------------*/
9740uint32_t sme_get_neighbor_roam_state(tHalHandle hHal, uint8_t sessionId)
9741{
9742 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
9743 return pMac->roam.neighborRoamInfo[sessionId].neighborRoamState;
9744}
9745
9746/* ---------------------------------------------------------------------------
9747 \fn sme_get_current_roam_state
9748 \brief get current roam state
9749 \param hHal - The handle returned by mac_open.
9750 \param sessionId - Session Identifier
9751 \return uint32_t - current roam state
9752 -------------------------------------------------------------------------*/
9753uint32_t sme_get_current_roam_state(tHalHandle hHal, uint8_t sessionId)
9754{
9755 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
9756 return pMac->roam.curState[sessionId];
9757}
9758
9759/* ---------------------------------------------------------------------------
9760 \fn sme_get_current_roam_sub_state
9761 \brief get neighbor roam sub state
9762 \param hHal - The handle returned by mac_open.
9763 \param sessionId - Session Identifier
9764 \return uint32_t - current roam sub state
9765 -------------------------------------------------------------------------*/
9766uint32_t sme_get_current_roam_sub_state(tHalHandle hHal, uint8_t sessionId)
9767{
9768 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
9769 return pMac->roam.curSubState[sessionId];
9770}
9771
9772/* ---------------------------------------------------------------------------
9773 \fn sme_get_lim_sme_state
9774 \brief get Lim Sme state
9775 \param hHal - The handle returned by mac_open.
9776 \return uint32_t - Lim Sme state
9777 -------------------------------------------------------------------------*/
9778uint32_t sme_get_lim_sme_state(tHalHandle hHal)
9779{
9780 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
9781 return pMac->lim.gLimSmeState;
9782}
9783
9784/* ---------------------------------------------------------------------------
9785 \fn sme_get_lim_mlm_state
9786 \brief get Lim Mlm state
9787 \param hHal - The handle returned by mac_open.
9788 \return uint32_t - Lim Mlm state
9789 -------------------------------------------------------------------------*/
9790uint32_t sme_get_lim_mlm_state(tHalHandle hHal)
9791{
9792 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
9793 return pMac->lim.gLimMlmState;
9794}
9795
9796/* ---------------------------------------------------------------------------
9797 \fn sme_is_lim_session_valid
9798 \brief is Lim session valid
9799 \param hHal - The handle returned by mac_open.
9800 \param sessionId - Session Identifier
9801 \return bool - true or false
9802 -------------------------------------------------------------------------*/
9803bool sme_is_lim_session_valid(tHalHandle hHal, uint8_t sessionId)
9804{
9805 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Hanumantha Reddy Pothula589fd702015-11-17 15:25:16 +05309806
9807 if (sessionId > pMac->lim.maxBssId)
9808 return false;
9809
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009810 return pMac->lim.gpSession[sessionId].valid;
9811}
9812
9813/* ---------------------------------------------------------------------------
9814 \fn sme_get_lim_sme_session_state
9815 \brief get Lim Sme session state
9816 \param hHal - The handle returned by mac_open.
9817 \param sessionId - Session Identifier
9818 \return uint32_t - Lim Sme session state
9819 -------------------------------------------------------------------------*/
9820uint32_t sme_get_lim_sme_session_state(tHalHandle hHal, uint8_t sessionId)
9821{
9822 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
9823 return pMac->lim.gpSession[sessionId].limSmeState;
9824}
9825
9826/* ---------------------------------------------------------------------------
9827 \fn sme_get_lim_mlm_session_state
9828 \brief get Lim Mlm session state
9829 \param hHal - The handle returned by mac_open.
9830 \param sessionId - Session Identifier
9831 \return uint32_t - Lim Mlm session state
9832 -------------------------------------------------------------------------*/
9833uint32_t sme_get_lim_mlm_session_state(tHalHandle hHal, uint8_t sessionId)
9834{
9835 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
9836 return pMac->lim.gpSession[sessionId].limMlmState;
9837}
9838
9839/* ---------------------------------------------------------------------------
9840 \fn sme_get_neighbor_scan_max_chan_time
9841 \brief get neighbor scan max channel time
9842 \param hHal - The handle returned by mac_open.
9843 \param sessionId - Session Identifier
9844 \return uint16_t - channel max time value
9845 -------------------------------------------------------------------------*/
9846uint16_t sme_get_neighbor_scan_max_chan_time(tHalHandle hHal, uint8_t sessionId)
9847{
9848 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
9849 return pMac->roam.neighborRoamInfo[sessionId].cfgParams.
9850 maxChannelScanTime;
9851}
9852
9853/* ---------------------------------------------------------------------------
9854 \fn sme_set_neighbor_scan_period
9855 \brief Update nNeighborScanPeriod
9856 This function is called through dynamic setConfig callback function
9857 to configure nNeighborScanPeriod
9858 Usage: adb shell iwpriv wlan0 setConfig
9859 nNeighborScanPeriod=[0 .. 1000]
9860 \param hHal - HAL handle for device
9861 \param sessionId - Session Identifier
9862 \param nNeighborScanPeriod - neighbor scan period
9863 \- return Success or failure
9864 -------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309865QDF_STATUS sme_set_neighbor_scan_period(tHalHandle hHal, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009866 const uint16_t nNeighborScanPeriod)
9867{
9868 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309869 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009870 tCsrNeighborRoamConfig *pNeighborRoamConfig = NULL;
9871 tpCsrNeighborRoamControlInfo pNeighborRoamInfo = NULL;
9872
9873 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309874 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009875 pNeighborRoamConfig =
9876 &pMac->roam.configParam.neighborRoamConfig;
9877 pNeighborRoamInfo = &pMac->roam.neighborRoamInfo[sessionId];
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05309878 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009879 "LFR runtime successfully set neighbor scan period to %d"
9880 " - old value is %d - roam state is %s",
9881 nNeighborScanPeriod,
9882 pMac->roam.configParam.neighborRoamConfig.
9883 nNeighborScanTimerPeriod,
9884 mac_trace_get_neighbour_roam_state(pMac->roam.
9885 neighborRoamInfo
9886 [sessionId].
9887 neighborRoamState));
9888 pNeighborRoamConfig->nNeighborScanTimerPeriod =
9889 nNeighborScanPeriod;
9890 pNeighborRoamInfo->cfgParams.neighborScanPeriod =
9891 nNeighborScanPeriod;
9892 sme_release_global_lock(&pMac->sme);
9893 }
9894 if (pMac->roam.configParam.isRoamOffloadScanEnabled) {
9895 csr_roam_offload_scan(pMac, sessionId,
9896 ROAM_SCAN_OFFLOAD_UPDATE_CFG,
9897 REASON_SCAN_HOME_TIME_CHANGED);
9898 }
9899
9900 return status;
9901}
9902
9903/* ---------------------------------------------------------------------------
9904 \fn sme_get_neighbor_scan_period
9905 \brief get neighbor scan period
9906 \param hHal - The handle returned by mac_open.
9907 \param sessionId - Session Identifier
9908 \return uint16_t - neighbor scan period
9909 -------------------------------------------------------------------------*/
9910uint16_t sme_get_neighbor_scan_period(tHalHandle hHal, uint8_t sessionId)
9911{
9912 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
9913 return pMac->roam.neighborRoamInfo[sessionId].cfgParams.
9914 neighborScanPeriod;
9915}
9916
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009917
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009918
9919/*--------------------------------------------------------------------------
9920 \brief sme_get_roam_rssi_diff() - get Roam rssi diff
9921 This is a synchronous call
9922 \param hHal - The handle returned by mac_open.
9923 \return uint16_t - Rssi diff value
9924 \sa
9925 --------------------------------------------------------------------------*/
9926uint8_t sme_get_roam_rssi_diff(tHalHandle hHal)
9927{
9928 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
9929 return pMac->roam.configParam.RoamRssiDiff;
9930}
9931
9932/**
9933 * sme_change_roam_scan_channel_list() - to change scan channel list
9934 * @hHal: pointer HAL handle returned by mac_open
9935 * @sessionId: sme session id
9936 * @pChannelList: Output channel list
9937 * @numChannels: Output number of channels
9938 *
9939 * This routine is called to Change roam scan channel list.
9940 * This is a synchronous call
9941 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309942 * Return: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009943 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309944QDF_STATUS sme_change_roam_scan_channel_list(tHalHandle hHal, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009945 uint8_t *pChannelList,
9946 uint8_t numChannels)
9947{
9948 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309949 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009950 tpCsrNeighborRoamControlInfo pNeighborRoamInfo =
9951 &pMac->roam.neighborRoamInfo[sessionId];
9952 uint8_t oldChannelList[WNI_CFG_VALID_CHANNEL_LIST_LEN * 2] = { 0 };
9953 uint8_t newChannelList[WNI_CFG_VALID_CHANNEL_LIST_LEN * 2] = { 0 };
9954 uint8_t i = 0, j = 0;
9955 tCsrChannelInfo *chan_info;
9956
9957
9958 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309959 if (!QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009960 if (pMac->roam.configParam.isRoamOffloadScanEnabled)
9961 csr_roam_offload_scan(pMac, sessionId,
9962 ROAM_SCAN_OFFLOAD_UPDATE_CFG,
9963 REASON_CHANNEL_LIST_CHANGED);
9964 return status;
9965 }
9966 chan_info = &pNeighborRoamInfo->cfgParams.channelInfo;
9967
9968 if (NULL != chan_info->ChannelList) {
9969 for (i = 0; i < chan_info->numOfChannels; i++) {
9970 if (j < sizeof(oldChannelList))
9971 j += snprintf(oldChannelList + j,
9972 sizeof(oldChannelList) -
9973 j, "%d",
9974 chan_info->ChannelList[i]);
9975 else
9976 break;
9977 }
9978 }
9979 csr_flush_cfg_bg_scan_roam_channel_list(pMac, sessionId);
9980 csr_create_bg_scan_roam_channel_list(pMac, sessionId, pChannelList,
9981 numChannels);
9982 sme_set_roam_scan_control(hHal, sessionId, 1);
9983 if (NULL != chan_info->ChannelList) {
9984 j = 0;
9985 for (i = 0; i < chan_info->numOfChannels; i++) {
9986 if (j < sizeof(newChannelList))
9987 j += snprintf(newChannelList + j,
9988 sizeof(newChannelList) -
9989 j, " %d",
9990 chan_info->ChannelList[i]);
9991 else
9992 break;
9993 }
9994 }
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05309995 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009996 FL("LFR runtime successfully set roam scan channels to %s - old value is %s - roam state is %d"),
9997 newChannelList, oldChannelList,
9998 pMac->roam.neighborRoamInfo[sessionId].neighborRoamState);
9999 sme_release_global_lock(&pMac->sme);
10000
10001 if (pMac->roam.configParam.isRoamOffloadScanEnabled)
10002 csr_roam_offload_scan(pMac, sessionId,
10003 ROAM_SCAN_OFFLOAD_UPDATE_CFG,
10004 REASON_CHANNEL_LIST_CHANGED);
10005 return status;
10006}
10007
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010008/**
10009 * sme_get_roam_scan_channel_list() - To get roam scan channel list
10010 * @hHal: HAL pointer
10011 * @pChannelList: Output channel list
10012 * @pNumChannels: Output number of channels
10013 * @sessionId: Session Identifier
10014 *
10015 * To get roam scan channel list This is a synchronous call
10016 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010017 * Return: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010018 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010019QDF_STATUS sme_get_roam_scan_channel_list(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010020 uint8_t *pChannelList, uint8_t *pNumChannels,
10021 uint8_t sessionId)
10022{
10023 int i = 0;
10024 uint8_t *pOutPtr = pChannelList;
10025 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
10026 tpCsrNeighborRoamControlInfo pNeighborRoamInfo =
10027 &pMac->roam.neighborRoamInfo[sessionId];
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010028 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010029
10030 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010031 if (!QDF_IS_STATUS_SUCCESS(status))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010032 return status;
10033 if (NULL == pNeighborRoamInfo->cfgParams.channelInfo.ChannelList) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053010034 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_WARN,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010035 FL("Roam Scan channel list is NOT yet initialized"));
10036 *pNumChannels = 0;
10037 sme_release_global_lock(&pMac->sme);
10038 return status;
10039 }
10040
10041 *pNumChannels = pNeighborRoamInfo->cfgParams.channelInfo.numOfChannels;
10042 for (i = 0; i < (*pNumChannels); i++) {
10043 pOutPtr[i] =
10044 pNeighborRoamInfo->cfgParams.channelInfo.ChannelList[i];
10045 }
10046 pOutPtr[i] = '\0';
10047 sme_release_global_lock(&pMac->sme);
10048 return status;
10049}
10050
10051/*--------------------------------------------------------------------------
10052 \brief sme_get_is_ese_feature_enabled() - get ESE feature enabled or not
10053 This is a synchronuous call
10054 \param hHal - The handle returned by mac_open.
10055 \return true (1) - if the ESE feature is enabled
10056 false (0) - if feature is disabled (compile or runtime)
10057 \sa
10058 --------------------------------------------------------------------------*/
10059bool sme_get_is_ese_feature_enabled(tHalHandle hHal)
10060{
10061#ifdef FEATURE_WLAN_ESE
10062 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
10063 return csr_roam_is_ese_ini_feature_enabled(pMac);
10064#else
10065 return false;
10066#endif
10067}
10068
10069/*--------------------------------------------------------------------------
10070 \brief sme_get_wes_mode() - get WES Mode
10071 This is a synchronous call
10072 \param hHal - The handle returned by mac_open
10073 \return uint8_t - WES Mode Enabled(1)/Disabled(0)
10074 \sa
10075 --------------------------------------------------------------------------*/
10076bool sme_get_wes_mode(tHalHandle hHal)
10077{
10078 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
10079 return pMac->roam.configParam.isWESModeEnabled;
10080}
10081
10082/*--------------------------------------------------------------------------
10083 \brief sme_get_roam_scan_control() - get scan control
10084 This is a synchronous call
10085 \param hHal - The handle returned by mac_open.
10086 \return bool - Enabled(1)/Disabled(0)
10087 \sa
10088 --------------------------------------------------------------------------*/
10089bool sme_get_roam_scan_control(tHalHandle hHal)
10090{
10091 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
10092 return pMac->roam.configParam.nRoamScanControl;
10093}
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010094
10095/*--------------------------------------------------------------------------
10096 \brief sme_get_is_lfr_feature_enabled() - get LFR feature enabled or not
10097 This is a synchronuous call
10098 \param hHal - The handle returned by mac_open.
10099 \return true (1) - if the feature is enabled
10100 false (0) - if feature is disabled (compile or runtime)
10101 \sa
10102 --------------------------------------------------------------------------*/
10103bool sme_get_is_lfr_feature_enabled(tHalHandle hHal)
10104{
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010105 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
10106 return pMac->roam.configParam.isFastRoamIniFeatureEnabled;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010107}
10108
10109/*--------------------------------------------------------------------------
10110 \brief sme_get_is_ft_feature_enabled() - get FT feature enabled or not
10111 This is a synchronuous call
10112 \param hHal - The handle returned by mac_open.
10113 \return true (1) - if the feature is enabled
10114 false (0) - if feature is disabled (compile or runtime)
10115 \sa
10116 --------------------------------------------------------------------------*/
10117bool sme_get_is_ft_feature_enabled(tHalHandle hHal)
10118{
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010119 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
10120 return pMac->roam.configParam.isFastTransitionEnabled;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010121}
10122
10123/* ---------------------------------------------------------------------------
10124 \fn sme_is_feature_supported_by_fw
10125 \brief Check if an feature is enabled by FW
10126
10127 \param feattEnumValue - Enumeration value from placeHolderInCapBitmap
10128 \- return 1/0 (true/false)
10129 -------------------------------------------------------------------------*/
10130uint8_t sme_is_feature_supported_by_fw(uint8_t featEnumValue)
10131{
10132 return IS_FEATURE_SUPPORTED_BY_FW(featEnumValue);
10133}
10134
10135#ifdef FEATURE_WLAN_TDLS
10136
10137/* ---------------------------------------------------------------------------
10138 \fn sme_send_tdls_link_establish_params
10139 \brief API to send TDLS Peer Link Establishment Parameters.
10140
10141 \param peerMac - peer's Mac Adress.
10142 \param tdlsLinkEstablishParams - TDLS Peer Link Establishment Parameters
Anurag Chouhanf04e84f2016-03-03 10:12:12 +053010143 \- return QDF_STATUS_SUCCES
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010144 -------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010145QDF_STATUS sme_send_tdls_link_establish_params(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010146 uint8_t sessionId,
10147 const tSirMacAddr peerMac,
10148 tCsrTdlsLinkEstablishParams *
10149 tdlsLinkEstablishParams)
10150{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010151 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010152 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
10153
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053010154 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Sreelakshmi Konamki6744cff2015-09-07 12:10:39 +053010155 TRACE_CODE_SME_RX_HDD_TDLS_LINK_ESTABLISH_PARAM,
10156 sessionId,
10157 tdlsLinkEstablishParams->isOffChannelSupported));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010158 status = sme_acquire_global_lock(&pMac->sme);
10159
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010160 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010161 status = csr_tdls_send_link_establish_params(hHal, sessionId,
10162 peerMac, tdlsLinkEstablishParams);
10163 sme_release_global_lock(&pMac->sme);
10164 }
10165 return status;
10166}
10167
10168/* ---------------------------------------------------------------------------
10169 \fn sme_send_tdls_mgmt_frame
10170 \brief API to send TDLS management frames.
10171
10172 \param peerMac - peer's Mac Adress.
10173 \param frame_type - Type of TDLS mgmt frame to be sent.
10174 \param dialog - dialog token used in the frame.
10175 \param status - status to be incuded in the frame.
10176 \param peerCapability - peer cpabilities
10177 \param buf - additional IEs to be included
10178 \param len - lenght of additional Ies
10179 \param responder - Tdls request type
Anurag Chouhanf04e84f2016-03-03 10:12:12 +053010180 \- return QDF_STATUS_SUCCES
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010181 -------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010182QDF_STATUS sme_send_tdls_mgmt_frame(tHalHandle hHal, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010183 const tSirMacAddr peerMac,
10184 uint8_t frame_type,
10185 uint8_t dialog, uint16_t statusCode,
10186 uint32_t peerCapability, uint8_t *buf,
10187 uint8_t len, uint8_t responder)
10188{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010189 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010190 tCsrTdlsSendMgmt sendTdlsReq = { {0} };
10191 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
10192
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053010193 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Sreelakshmi Konamki6744cff2015-09-07 12:10:39 +053010194 TRACE_CODE_SME_RX_HDD_TDLS_SEND_MGMT_FRAME,
10195 sessionId, statusCode));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010196 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010197 if (QDF_IS_STATUS_SUCCESS(status)) {
Anurag Chouhan600c3a02016-03-01 10:33:54 +053010198 qdf_mem_copy(sendTdlsReq.peerMac, peerMac, sizeof(tSirMacAddr));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010199 sendTdlsReq.frameType = frame_type;
10200 sendTdlsReq.buf = buf;
10201 sendTdlsReq.len = len;
10202 sendTdlsReq.dialog = dialog;
10203 sendTdlsReq.statusCode = statusCode;
10204 sendTdlsReq.responder = responder;
10205 sendTdlsReq.peerCapability = peerCapability;
10206
10207 status = csr_tdls_send_mgmt_req(hHal, sessionId, &sendTdlsReq);
10208
10209 sme_release_global_lock(&pMac->sme);
10210 }
10211
10212 return status;
10213
10214}
10215
10216/* ---------------------------------------------------------------------------
10217 \fn sme_change_tdls_peer_sta
10218 \brief API to Update TDLS peer sta parameters.
10219
10220 \param peerMac - peer's Mac Adress.
10221 \param staParams - Peer Station Parameters
Anurag Chouhanf04e84f2016-03-03 10:12:12 +053010222 \- return QDF_STATUS_SUCCES
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010223 -------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010224QDF_STATUS sme_change_tdls_peer_sta(tHalHandle hHal, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010225 const tSirMacAddr peerMac,
10226 tCsrStaParams *pstaParams)
10227{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010228 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010229 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
10230
10231 if (NULL == pstaParams) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053010232 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010233 "%s :pstaParams is NULL", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010234 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010235 }
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053010236 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Sreelakshmi Konamki6744cff2015-09-07 12:10:39 +053010237 TRACE_CODE_SME_RX_HDD_TDLS_CHANGE_PEER_STA,
10238 sessionId, pstaParams->capability));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010239 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010240 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010241 status = csr_tdls_change_peer_sta(hHal, sessionId, peerMac,
10242 pstaParams);
10243
10244 sme_release_global_lock(&pMac->sme);
10245 }
10246
10247 return status;
10248
10249}
10250
10251/* ---------------------------------------------------------------------------
10252 \fn sme_add_tdls_peer_sta
10253 \brief API to Add TDLS peer sta entry.
10254
10255 \param peerMac - peer's Mac Adress.
Anurag Chouhanf04e84f2016-03-03 10:12:12 +053010256 \- return QDF_STATUS_SUCCES
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010257 -------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010258QDF_STATUS sme_add_tdls_peer_sta(tHalHandle hHal, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010259 const tSirMacAddr peerMac)
10260{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010261 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010262 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
10263
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053010264 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Sreelakshmi Konamki6744cff2015-09-07 12:10:39 +053010265 TRACE_CODE_SME_RX_HDD_TDLS_ADD_PEER_STA,
10266 sessionId, 0));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010267 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010268 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010269 status = csr_tdls_add_peer_sta(hHal, sessionId, peerMac);
10270
10271 sme_release_global_lock(&pMac->sme);
10272 }
10273
10274 return status;
10275
10276}
10277
10278/* ---------------------------------------------------------------------------
10279 \fn sme_delete_tdls_peer_sta
10280 \brief API to Delete TDLS peer sta entry.
10281
10282 \param peerMac - peer's Mac Adress.
Anurag Chouhanf04e84f2016-03-03 10:12:12 +053010283 \- return QDF_STATUS_SUCCES
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010284 -------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010285QDF_STATUS sme_delete_tdls_peer_sta(tHalHandle hHal, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010286 const tSirMacAddr peerMac)
10287{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010288 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010289 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
10290
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053010291 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Sreelakshmi Konamki6744cff2015-09-07 12:10:39 +053010292 TRACE_CODE_SME_RX_HDD_TDLS_DEL_PEER_STA,
10293 sessionId, 0));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010294 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010295 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010296 status = csr_tdls_del_peer_sta(hHal, sessionId, peerMac);
10297
10298 sme_release_global_lock(&pMac->sme);
10299 }
10300
10301 return status;
10302
10303}
10304
10305/* ---------------------------------------------------------------------------
10306 \fn sme_set_tdls_power_save_prohibited
10307 \API to set/reset the is_tdls_power_save_prohibited.
10308
10309 \- return void
10310 -------------------------------------------------------------------------*/
10311void sme_set_tdls_power_save_prohibited(tHalHandle hHal, uint32_t sessionId,
10312 bool val)
10313{
10314 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
10315 struct ps_global_info *ps_global_info = &pMac->sme.ps_global_info;
10316 struct ps_params *ps_param = &ps_global_info->ps_params[sessionId];
10317 ps_param->is_tdls_power_save_prohibited = val;
10318 return;
10319}
10320
10321/* ---------------------------------------------------------------------------
10322 \fn sme_update_fw_tdls_state
10323
10324 \brief
10325 SME will send message to WMA to set TDLS state in f/w
10326
10327 \param
10328
10329 hHal - The handle returned by mac_open
10330
10331 psmeTdlsParams - TDLS state info to update in f/w
10332
10333 useSmeLock - Need to acquire SME Global Lock before state update or not
10334
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010335 \return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010336 --------------------------------------------------------------------------- */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010337QDF_STATUS sme_update_fw_tdls_state(tHalHandle hHal, void *psmeTdlsParams,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010338 bool useSmeLock)
10339{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010340 QDF_STATUS status = QDF_STATUS_SUCCESS;
10341 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010342 tpAniSirGlobal pMac = NULL;
10343 cds_msg_t cds_message;
10344
Mukul Sharmaeae172c2016-09-03 13:40:46 +053010345 pMac = PMAC_STRUCT(hHal);
10346 if (NULL == pMac) {
10347 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
10348 FL("pMac is Null"));
10349 return QDF_STATUS_E_FAILURE;
10350 }
10351
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010352 /* only acquire sme global lock before state update if asked to */
10353 if (useSmeLock) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010354 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010355 if (QDF_STATUS_SUCCESS != status)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010356 return status;
10357 }
10358
10359 /* serialize the req through MC thread */
10360 cds_message.bodyptr = psmeTdlsParams;
10361 cds_message.type = WMA_UPDATE_FW_TDLS_STATE;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010362 qdf_status = cds_mq_post_message(CDS_MQ_ID_WMA, &cds_message);
10363 if (!QDF_IS_STATUS_SUCCESS(qdf_status))
10364 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010365
10366 /* release the lock if it was acquired */
10367 if (useSmeLock)
10368 sme_release_global_lock(&pMac->sme);
10369
10370 return status;
10371}
10372
10373/**
10374 * sme_update_tdls_peer_state() - to update the state of TDLS peer
10375 * @hHal: The handle returned by mac_open
10376 * @peerStateParams: TDLS Peer state info to update in f/w
10377 *
10378 * SME will send message to WMA to set TDLS Peer state in f/w
10379 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010380 * Return: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010381 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010382QDF_STATUS sme_update_tdls_peer_state(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010383 tSmeTdlsPeerStateParams *peerStateParams)
10384{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010385 QDF_STATUS status = QDF_STATUS_SUCCESS;
10386 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010387 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
10388 tTdlsPeerStateParams *pTdlsPeerStateParams = NULL;
10389 tTdlsPeerCapParams *peer_cap = NULL;
10390 cds_msg_t cds_message;
10391 uint8_t num;
Kabilan Kannan44f65862016-06-28 23:46:51 -070010392 uint8_t peer_chan_len;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010393 uint8_t chanId;
10394 uint8_t i;
10395
10396 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010397 if (!QDF_IS_STATUS_SUCCESS(status))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010398 return status;
Anurag Chouhan600c3a02016-03-01 10:33:54 +053010399 pTdlsPeerStateParams = qdf_mem_malloc(sizeof(*pTdlsPeerStateParams));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010400 if (NULL == pTdlsPeerStateParams) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053010401 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010402 FL("failed to allocate mem for tdls peer state param"));
10403 sme_release_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010404 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010405 }
10406
Anurag Chouhan600c3a02016-03-01 10:33:54 +053010407 qdf_mem_copy(&pTdlsPeerStateParams->peerMacAddr,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010408 &peerStateParams->peerMacAddr, sizeof(tSirMacAddr));
10409 pTdlsPeerStateParams->vdevId = peerStateParams->vdevId;
10410 pTdlsPeerStateParams->peerState = peerStateParams->peerState;
10411
10412 switch (peerStateParams->peerState) {
10413 case eSME_TDLS_PEER_STATE_PEERING:
10414 pTdlsPeerStateParams->peerState =
10415 WMA_TDLS_PEER_STATE_PEERING;
10416 break;
10417
10418 case eSME_TDLS_PEER_STATE_CONNECTED:
10419 pTdlsPeerStateParams->peerState =
10420 WMA_TDLS_PEER_STATE_CONNECTED;
10421 break;
10422
10423 case eSME_TDLS_PEER_STATE_TEARDOWN:
10424 pTdlsPeerStateParams->peerState =
10425 WMA_TDLS_PEER_STATE_TEARDOWN;
10426 break;
10427
Kabilan Kannan421714b2015-11-23 04:44:59 -080010428 case eSME_TDLS_PEER_ADD_MAC_ADDR:
10429 pTdlsPeerStateParams->peerState = WMA_TDLS_PEER_ADD_MAC_ADDR;
10430 break;
10431
10432 case eSME_TDLS_PEER_REMOVE_MAC_ADDR:
10433 pTdlsPeerStateParams->peerState = WMA_TDLS_PEER_REMOVE_MAC_ADDR;
10434 break;
10435
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010436 default:
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053010437 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010438 FL("invalid peer state param (%d)"),
10439 peerStateParams->peerState);
Kabilan Kannan44f65862016-06-28 23:46:51 -070010440 goto error_return;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010441 }
10442 peer_cap = &(pTdlsPeerStateParams->peerCap);
10443 peer_cap->isPeerResponder =
10444 peerStateParams->peerCap.isPeerResponder;
10445 peer_cap->peerUapsdQueue =
10446 peerStateParams->peerCap.peerUapsdQueue;
10447 peer_cap->peerMaxSp =
10448 peerStateParams->peerCap.peerMaxSp;
10449 peer_cap->peerBuffStaSupport =
10450 peerStateParams->peerCap.peerBuffStaSupport;
10451 peer_cap->peerOffChanSupport =
10452 peerStateParams->peerCap.peerOffChanSupport;
10453 peer_cap->peerCurrOperClass =
10454 peerStateParams->peerCap.peerCurrOperClass;
10455 peer_cap->selfCurrOperClass =
10456 peerStateParams->peerCap.selfCurrOperClass;
10457
10458 num = 0;
Kabilan Kannan44f65862016-06-28 23:46:51 -070010459 peer_chan_len = peerStateParams->peerCap.peerChanLen;
10460
10461 if (peer_chan_len >= 0 &&
10462 peer_chan_len <= SME_TDLS_MAX_SUPP_CHANNELS) {
10463 for (i = 0; i < peerStateParams->peerCap.peerChanLen; i++) {
10464 chanId = peerStateParams->peerCap.peerChan[i];
10465 if (csr_roam_is_channel_valid(pMac, chanId) &&
10466 !(cds_get_channel_state(chanId) ==
10467 CHANNEL_STATE_DFS) &&
10468 !cds_is_dsrc_channel(cds_chan_to_freq(chanId))) {
10469 peer_cap->peerChan[num].chanId = chanId;
10470 peer_cap->peerChan[num].pwr =
10471 csr_get_cfg_max_tx_power(pMac, chanId);
10472 peer_cap->peerChan[num].dfsSet = false;
Archana Ramachandran63f64dd2016-04-28 15:13:35 -070010473 num++;
Kabilan Kannan44f65862016-06-28 23:46:51 -070010474 }
Archana Ramachandran63f64dd2016-04-28 15:13:35 -070010475 }
Kabilan Kannan44f65862016-06-28 23:46:51 -070010476 } else {
10477 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
10478 FL("invalid peer channel len (%d)"),
10479 peer_chan_len);
10480 goto error_return;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010481 }
Kabilan Kannan44f65862016-06-28 23:46:51 -070010482
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010483 peer_cap->peerChanLen = num;
10484 peer_cap->peerOperClassLen =
10485 peerStateParams->peerCap.peerOperClassLen;
10486 for (i = 0; i < HAL_TDLS_MAX_SUPP_OPER_CLASSES; i++) {
10487 peer_cap->peerOperClass[i] =
10488 peerStateParams->peerCap.peerOperClass[i];
10489 }
10490
10491 peer_cap->prefOffChanNum =
10492 peerStateParams->peerCap.prefOffChanNum;
10493 peer_cap->prefOffChanBandwidth =
10494 peerStateParams->peerCap.prefOffChanBandwidth;
Masti, Narayanraddic4a7ab82015-11-25 15:41:10 +053010495 peer_cap->opClassForPrefOffChan =
10496 peerStateParams->peerCap.opClassForPrefOffChan;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010497
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010498 cds_message.type = WMA_UPDATE_TDLS_PEER_STATE;
10499 cds_message.reserved = 0;
10500 cds_message.bodyptr = pTdlsPeerStateParams;
10501
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010502 qdf_status = cds_mq_post_message(CDS_MQ_ID_WMA, &cds_message);
10503 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
Kabilan Kannan44f65862016-06-28 23:46:51 -070010504 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
10505 FL("cds_mq_post_message failed "));
10506 goto error_return;
10507 } else {
10508 goto success_return;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010509 }
Kabilan Kannan44f65862016-06-28 23:46:51 -070010510
10511error_return:
10512 status = QDF_STATUS_E_FAILURE;
10513 qdf_mem_free(pTdlsPeerStateParams);
10514success_return:
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010515 sme_release_global_lock(&pMac->sme);
10516 return status;
10517}
10518
10519/**
10520 * sme_send_tdls_chan_switch_req() - send tdls channel switch request
10521 * @hal: UMAC handler
10522 * @ch_switch_params: Pointer to the chan switch parameter structure
10523 *
10524 * API to set tdls channel switch parameters.
10525 *
Anurag Chouhanf04e84f2016-03-03 10:12:12 +053010526 * Return: QDF_STATUS_SUCCESS on success; another QDF_STATUS_** code otherwise
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010527 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010528QDF_STATUS sme_send_tdls_chan_switch_req(tHalHandle hal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010529 sme_tdls_chan_switch_params *ch_switch_params)
10530{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010531 QDF_STATUS status = QDF_STATUS_SUCCESS;
10532 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010533 tpAniSirGlobal mac = PMAC_STRUCT(hal);
10534 tdls_chan_switch_params *chan_switch_params = NULL;
10535 cds_msg_t cds_message;
10536
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053010537 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Sreelakshmi Konamki6744cff2015-09-07 12:10:39 +053010538 TRACE_CODE_SME_RX_HDD_TDLS_CHAN_SWITCH_REQ,
10539 NO_SESSION, ch_switch_params->tdls_off_channel));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010540 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010541 if (QDF_STATUS_SUCCESS != status)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010542 return status;
Anurag Chouhan600c3a02016-03-01 10:33:54 +053010543 chan_switch_params = qdf_mem_malloc(sizeof(*chan_switch_params));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010544 if (NULL == chan_switch_params) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053010545 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010546 FL("fail to alloc mem for tdls chan switch param"));
10547 sme_release_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010548 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010549 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010550
10551 switch (ch_switch_params->tdls_off_ch_mode) {
10552 case ENABLE_CHANSWITCH:
10553 chan_switch_params->tdls_sw_mode = WMA_TDLS_ENABLE_OFFCHANNEL;
10554 break;
10555
10556 case DISABLE_CHANSWITCH:
10557 chan_switch_params->tdls_sw_mode = WMA_TDLS_DISABLE_OFFCHANNEL;
10558 break;
10559
10560 default:
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053010561 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010562 FL("invalid off channel command (%d)"),
10563 ch_switch_params->tdls_off_ch_mode);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053010564 qdf_mem_free(chan_switch_params);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010565 sme_release_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010566 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010567 }
10568
Anurag Chouhan600c3a02016-03-01 10:33:54 +053010569 qdf_mem_copy(&chan_switch_params->peer_mac_addr,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010570 &ch_switch_params->peer_mac_addr, sizeof(tSirMacAddr));
10571 chan_switch_params->vdev_id = ch_switch_params->vdev_id;
10572 chan_switch_params->tdls_off_ch = ch_switch_params->tdls_off_channel;
10573 chan_switch_params->tdls_off_ch_bw_offset =
10574 ch_switch_params->tdls_off_ch_bw_offset;
10575 chan_switch_params->is_responder = ch_switch_params->is_responder;
Masti, Narayanraddic4a7ab82015-11-25 15:41:10 +053010576 chan_switch_params->oper_class = ch_switch_params->opclass;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010577
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053010578 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010579 FL("Country Code=%s, Req offset=%d, Selected Operate Class=%d"),
10580 mac->scan.countryCodeCurrent,
10581 chan_switch_params->tdls_off_ch_bw_offset,
10582 chan_switch_params->oper_class);
10583
10584 cds_message.type = WMA_TDLS_SET_OFFCHAN_MODE;
10585 cds_message.reserved = 0;
10586 cds_message.bodyptr = chan_switch_params;
10587
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010588 qdf_status = cds_mq_post_message(CDS_MQ_ID_WMA, &cds_message);
10589 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053010590 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010591 FL("Message Post failed status=%d"),
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010592 qdf_status);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053010593 qdf_mem_free(chan_switch_params);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010594 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010595 }
10596 sme_release_global_lock(&mac->sme);
10597 return status;
10598}
10599#endif /* FEATURE_WLAN_TDLS */
10600
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010601QDF_STATUS sme_get_link_speed(tHalHandle hHal, tSirLinkSpeedInfo *lsReq,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010602 void *plsContext,
10603 void (*pCallbackfn)(tSirLinkSpeedInfo *indParam,
10604 void *pContext))
10605{
10606
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010607 QDF_STATUS status = QDF_STATUS_SUCCESS;
10608 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010609 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
10610 cds_msg_t cds_message;
10611
10612 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010613 if (QDF_STATUS_SUCCESS == status) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010614 if ((NULL == pCallbackfn) &&
10615 (NULL == pMac->sme.pLinkSpeedIndCb)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053010616 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010617 "%s: Indication Call back did not registered",
10618 __func__);
10619 sme_release_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010620 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010621 } else if (NULL != pCallbackfn) {
10622 pMac->sme.pLinkSpeedCbContext = plsContext;
10623 pMac->sme.pLinkSpeedIndCb = pCallbackfn;
10624 }
10625 /* serialize the req through MC thread */
10626 cds_message.bodyptr = lsReq;
10627 cds_message.type = WMA_GET_LINK_SPEED;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010628 qdf_status = cds_mq_post_message(CDS_MQ_ID_WMA, &cds_message);
10629 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053010630 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010631 "%s: Post Link Speed msg fail", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010632 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010633 }
10634 sme_release_global_lock(&pMac->sme);
10635 }
10636 return status;
10637}
10638
10639
10640/*
10641 * SME API to enable/disable WLAN driver initiated SSR
10642 */
10643void sme_update_enable_ssr(tHalHandle hHal, bool enableSSR)
10644{
10645 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010646 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010647
10648 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010649 if (QDF_IS_STATUS_SUCCESS(status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053010650 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010651 "SSR level is changed %d", enableSSR);
10652 /* not serializing this messsage, as this is only going
10653 * to set a variable in WMA/WDI
10654 */
10655 WMA_SetEnableSSR(enableSSR);
10656 sme_release_global_lock(&pMac->sme);
10657 }
10658 return;
10659}
10660
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010661QDF_STATUS sme_check_ch_in_band(tpAniSirGlobal mac_ctx, uint8_t start_ch,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010662 uint8_t ch_cnt)
10663{
10664 uint8_t i;
10665 for (i = 0; i < ch_cnt; i++) {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010666 if (QDF_STATUS_SUCCESS != csr_is_valid_channel(mac_ctx,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010667 (start_ch + i*4)))
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010668 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010669 }
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010670 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010671}
10672
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010673/*convert the ini value to the ENUM used in csr and MAC for CB state*/
10674ePhyChanBondState sme_get_cb_phy_state_from_cb_ini_value(uint32_t cb_ini_value)
10675{
10676 return csr_convert_cb_ini_value_to_phy_cb_state(cb_ini_value);
10677}
10678
10679/*--------------------------------------------------------------------------
10680
10681 \brief sme_set_curr_device_mode() - Sets the current operating device mode.
10682 \param hHal - The handle returned by mac_open.
10683 \param currDeviceMode - Current operating device mode.
10684 --------------------------------------------------------------------------*/
10685
Peng Xuf5d60c82015-10-02 17:17:03 -070010686void sme_set_curr_device_mode(tHalHandle hHal,
Anurag Chouhan6d760662016-02-20 16:05:43 +053010687 enum tQDF_ADAPTER_MODE currDeviceMode)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010688{
10689 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
10690 pMac->sme.currDeviceMode = currDeviceMode;
10691 return;
10692}
10693
10694/*--------------------------------------------------------------------------
10695 \brief sme_handoff_request() - a wrapper function to Request a handoff
10696 from CSR.
10697 This is a synchronous call
10698 \param hHal - The handle returned by mac_open
10699 \param sessionId - Session Identifier
10700 \param pHandoffInfo - info provided by HDD with the handoff request (namely:
10701 BSSID, channel etc.)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010702 \return QDF_STATUS_SUCCESS - SME passed the request to CSR successfully.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010703 Other status means SME is failed to send the request.
10704 \sa
10705 --------------------------------------------------------------------------*/
10706
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010707QDF_STATUS sme_handoff_request(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010708 uint8_t sessionId,
10709 tCsrHandoffRequest *pHandoffInfo)
10710{
10711 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010712 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010713
10714 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010715 if (QDF_IS_STATUS_SUCCESS(status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053010716 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010717 "%s: invoked", __func__);
10718 status = csr_handoff_request(pMac, sessionId, pHandoffInfo);
10719 sme_release_global_lock(&pMac->sme);
10720 }
10721
10722 return status;
10723}
10724
10725#ifdef IPA_OFFLOAD
10726/* ---------------------------------------------------------------------------
10727 \fn sme_ipa_offload_enable_disable
10728 \brief API to enable/disable IPA offload
10729 \param hal - The handle returned by macOpen.
10730 \param session_id - Session Identifier
10731 \param request - Pointer to the offload request.
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010732 \return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010733 ---------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010734QDF_STATUS sme_ipa_offload_enable_disable(tHalHandle hal, uint8_t session_id,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010735 struct sir_ipa_offload_enable_disable *request)
10736{
10737 tpAniSirGlobal pMac = PMAC_STRUCT(hal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010738 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010739 struct sir_ipa_offload_enable_disable *request_buf;
10740 cds_msg_t msg;
10741
10742 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010743 if (QDF_STATUS_SUCCESS == status) {
Anurag Chouhan600c3a02016-03-01 10:33:54 +053010744 request_buf = qdf_mem_malloc(sizeof(*request_buf));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010745 if (NULL == request_buf) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053010746 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010747 FL("Not able to allocate memory for \
10748 IPA_OFFLOAD_ENABLE_DISABLE"));
10749 sme_release_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010750 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010751 }
10752
10753 request_buf->offload_type = request->offload_type;
10754 request_buf->vdev_id = request->vdev_id;
10755 request_buf->enable = request->enable;
10756
10757 msg.type = WMA_IPA_OFFLOAD_ENABLE_DISABLE;
10758 msg.reserved = 0;
10759 msg.bodyptr = request_buf;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010760 if (!QDF_IS_STATUS_SUCCESS(
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010761 cds_mq_post_message(CDS_MQ_ID_WMA, &msg))) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053010762 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010763 FL("Not able to post WMA_IPA_OFFLOAD_\
10764 ENABLE_DISABLE message to WMA"));
Anurag Chouhan600c3a02016-03-01 10:33:54 +053010765 qdf_mem_free(request_buf);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010766 sme_release_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010767 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010768 }
10769
10770 sme_release_global_lock(&pMac->sme);
10771 }
10772
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010773 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010774}
10775#endif /* IPA_OFFLOAD */
10776
10777/*
10778 * SME API to check if there is any infra station or
10779 * P2P client is connected
10780 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010781QDF_STATUS sme_is_sta_p2p_client_connected(tHalHandle hHal)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010782{
10783 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
10784 if (csr_is_infra_connected(pMac)) {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010785 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010786 }
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010787 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010788}
10789
10790#ifdef FEATURE_WLAN_LPHB
10791/* ---------------------------------------------------------------------------
10792 \fn sme_lphb_config_req
10793 \API to make configuration LPHB within FW.
10794 \param hHal - The handle returned by mac_open
10795 \param lphdReq - LPHB request argument by client
10796 \param pCallbackfn - LPHB timeout notification callback function pointer
10797 \- return Configuration message posting status, SUCCESS or Fail
10798 -------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010799QDF_STATUS sme_lphb_config_req
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010800 (tHalHandle hHal,
10801 tSirLPHBReq *lphdReq,
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010802 void (*pCallbackfn)(void *pHddCtx, tSirLPHBInd * indParam)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010803 ) {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010804 QDF_STATUS status = QDF_STATUS_SUCCESS;
10805 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010806 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
10807 cds_msg_t cds_message;
10808
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053010809 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Sreelakshmi Konamki6744cff2015-09-07 12:10:39 +053010810 TRACE_CODE_SME_RX_HDD_LPHB_CONFIG_REQ,
10811 NO_SESSION, lphdReq->cmd));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010812 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010813 if (QDF_STATUS_SUCCESS == status) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010814 if ((LPHB_SET_EN_PARAMS_INDID == lphdReq->cmd) &&
10815 (NULL == pCallbackfn) && (NULL == pMac->sme.pLphbIndCb)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053010816 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010817 "%s: Indication Call back did not registered",
10818 __func__);
10819 sme_release_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010820 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010821 } else if (NULL != pCallbackfn) {
10822 pMac->sme.pLphbIndCb = pCallbackfn;
10823 }
10824
10825 /* serialize the req through MC thread */
10826 cds_message.bodyptr = lphdReq;
10827 cds_message.type = WMA_LPHB_CONF_REQ;
Sreelakshmi Konamki6a065362016-05-31 16:05:01 +053010828 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
10829 NO_SESSION, cds_message.type));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010830 qdf_status = cds_mq_post_message(CDS_MQ_ID_WMA, &cds_message);
10831 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053010832 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010833 "%s: Post Config LPHB MSG fail", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010834 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010835 }
10836 sme_release_global_lock(&pMac->sme);
10837 }
10838
10839 return status;
10840}
10841#endif /* FEATURE_WLAN_LPHB */
10842/*--------------------------------------------------------------------------
10843 \brief sme_enable_disable_split_scan() - a wrapper function to set the split
10844 scan parameter.
10845 This is a synchronous call
10846 \param hHal - The handle returned by mac_open
10847 \return NONE.
10848 \sa
10849 --------------------------------------------------------------------------*/
10850void sme_enable_disable_split_scan(tHalHandle hHal, uint8_t nNumStaChan,
10851 uint8_t nNumP2PChan)
10852{
10853 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
10854
10855 pMac->roam.configParam.nNumStaChanCombinedConc = nNumStaChan;
10856 pMac->roam.configParam.nNumP2PChanCombinedConc = nNumP2PChan;
10857
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053010858 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010859 "%s: SCAN nNumStaChanCombinedConc : %d,"
10860 "nNumP2PChanCombinedConc : %d ",
10861 __func__, nNumStaChan, nNumP2PChan);
10862
10863 return;
10864
10865}
10866
10867/**
10868 * sme_add_periodic_tx_ptrn() - Add Periodic TX Pattern
10869 * @hal: global hal handle
10870 * @addPeriodicTxPtrnParams: request message
10871 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010872 * Return: QDF_STATUS enumeration
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010873 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010874QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010875sme_add_periodic_tx_ptrn(tHalHandle hal,
10876 struct sSirAddPeriodicTxPtrn *addPeriodicTxPtrnParams)
10877{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010878 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010879 tpAniSirGlobal mac = PMAC_STRUCT(hal);
10880 struct sSirAddPeriodicTxPtrn *req_msg;
10881 cds_msg_t msg;
10882
10883 sms_log(mac, LOG1, FL("enter"));
10884
Anurag Chouhan600c3a02016-03-01 10:33:54 +053010885 req_msg = qdf_mem_malloc(sizeof(*req_msg));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010886 if (!req_msg) {
10887 sms_log(mac, LOGE, FL("memory allocation failed"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010888 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010889 }
10890
10891 *req_msg = *addPeriodicTxPtrnParams;
10892
10893 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010894 if (!QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010895 sms_log(mac, LOGE,
10896 FL("sme_acquire_global_lock failed!(status=%d)"),
10897 status);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053010898 qdf_mem_free(req_msg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010899 return status;
10900 }
10901
10902 /* Serialize the req through MC thread */
10903 msg.bodyptr = req_msg;
10904 msg.type = WMA_ADD_PERIODIC_TX_PTRN_IND;
Sreelakshmi Konamki6a065362016-05-31 16:05:01 +053010905 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
10906 NO_SESSION, msg.type));
Anurag Chouhan6d760662016-02-20 16:05:43 +053010907 status = cds_mq_post_message(QDF_MODULE_ID_WMA, &msg);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010908 if (!QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010909 sms_log(mac, LOGE,
10910 FL("cds_mq_post_message failed!(err=%d)"),
10911 status);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053010912 qdf_mem_free(req_msg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010913 }
10914 sme_release_global_lock(&mac->sme);
10915 return status;
10916}
10917
10918/**
10919 * sme_del_periodic_tx_ptrn() - Delete Periodic TX Pattern
10920 * @hal: global hal handle
10921 * @delPeriodicTxPtrnParams: request message
10922 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010923 * Return: QDF_STATUS enumeration
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010924 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010925QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010926sme_del_periodic_tx_ptrn(tHalHandle hal,
10927 struct sSirDelPeriodicTxPtrn *delPeriodicTxPtrnParams)
10928{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010929 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010930 tpAniSirGlobal mac = PMAC_STRUCT(hal);
10931 struct sSirDelPeriodicTxPtrn *req_msg;
10932 cds_msg_t msg;
10933
10934 sms_log(mac, LOG1, FL("enter"));
10935
Anurag Chouhan600c3a02016-03-01 10:33:54 +053010936 req_msg = qdf_mem_malloc(sizeof(*req_msg));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010937 if (!req_msg) {
10938 sms_log(mac, LOGE, FL("memory allocation failed"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010939 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010940 }
10941
10942 *req_msg = *delPeriodicTxPtrnParams;
10943
10944 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010945 if (!QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010946 sms_log(mac, LOGE,
10947 FL("sme_acquire_global_lock failed!(status=%d)"),
10948 status);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053010949 qdf_mem_free(req_msg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010950 return status;
10951 }
10952
10953 /* Serialize the req through MC thread */
10954 msg.bodyptr = req_msg;
10955 msg.type = WMA_DEL_PERIODIC_TX_PTRN_IND;
Sreelakshmi Konamki6a065362016-05-31 16:05:01 +053010956 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
10957 NO_SESSION, msg.type));
Anurag Chouhan6d760662016-02-20 16:05:43 +053010958 status = cds_mq_post_message(QDF_MODULE_ID_WMA, &msg);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010959 if (!QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010960 sms_log(mac, LOGE,
10961 FL("cds_mq_post_message failed!(err=%d)"),
10962 status);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053010963 qdf_mem_free(req_msg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010964 }
10965 sme_release_global_lock(&mac->sme);
10966 return status;
10967}
10968
Rajeev Kumar8e3e2832015-11-06 16:02:54 -080010969/**
10970 * sme_enable_rmc() - enables RMC
10971 * @hHal : Pointer to global HAL handle
10972 * @sessionId : Session ID
10973 *
10974 * Return: QDF_STATUS
10975 */
10976QDF_STATUS sme_enable_rmc(tHalHandle hHal, uint32_t sessionId)
10977{
10978 QDF_STATUS status = QDF_STATUS_E_FAILURE;
10979 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
10980 cds_msg_t cds_message;
10981 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
10982
10983 sms_log(pMac, LOG1, FL("enable RMC"));
10984 status = sme_acquire_global_lock(&pMac->sme);
10985 if (QDF_IS_STATUS_SUCCESS(status)) {
10986 cds_message.bodyptr = NULL;
10987 cds_message.type = WMA_RMC_ENABLE_IND;
10988 qdf_status = cds_mq_post_message(CDS_MQ_ID_WMA, &cds_message);
10989 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
10990 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
10991 "%s: failed to post message to WMA",
10992 __func__);
10993 status = QDF_STATUS_E_FAILURE;
10994 }
10995 sme_release_global_lock(&pMac->sme);
10996 }
10997 return status;
10998}
10999
11000/**
11001 * sme_disable_rmc() - disables RMC
11002 * @hHal : Pointer to global HAL handle
11003 * @sessionId : Session ID
11004 *
11005 * Return: QDF_STATUS
11006 */
11007QDF_STATUS sme_disable_rmc(tHalHandle hHal, uint32_t sessionId)
11008{
11009 QDF_STATUS status = QDF_STATUS_E_FAILURE;
11010 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
11011 cds_msg_t cds_message;
11012 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
11013
11014 sms_log(pMac, LOG1, FL("disable RMC"));
11015 status = sme_acquire_global_lock(&pMac->sme);
11016 if (QDF_IS_STATUS_SUCCESS(status)) {
11017 cds_message.bodyptr = NULL;
11018 cds_message.type = WMA_RMC_DISABLE_IND;
11019 qdf_status = cds_mq_post_message(CDS_MQ_ID_WMA, &cds_message);
11020 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
11021 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
11022 "%s: failed to post message to WMA",
11023 __func__);
11024 status = QDF_STATUS_E_FAILURE;
11025 }
11026 sme_release_global_lock(&pMac->sme);
11027 }
11028 return status;
11029}
11030
11031/**
11032 * sme_send_rmc_action_period() - sends RMC action period param to target
11033 * @hHal : Pointer to global HAL handle
11034 * @sessionId : Session ID
11035 *
11036 * Return: QDF_STATUS
11037 */
11038QDF_STATUS sme_send_rmc_action_period(tHalHandle hHal, uint32_t sessionId)
11039{
11040 QDF_STATUS status = QDF_STATUS_SUCCESS;
11041 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
11042 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
11043 cds_msg_t cds_message;
11044
11045 status = sme_acquire_global_lock(&pMac->sme);
11046 if (QDF_STATUS_SUCCESS == status) {
11047 cds_message.bodyptr = NULL;
11048 cds_message.type = WMA_RMC_ACTION_PERIOD_IND;
11049 qdf_status = cds_mq_post_message(CDS_MQ_ID_WMA, &cds_message);
11050 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
11051 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
11052 "%s: failed to post message to WMA",
11053 __func__);
11054 status = QDF_STATUS_E_FAILURE;
11055 }
11056 sme_release_global_lock(&pMac->sme);
11057 }
11058
11059 return status;
11060}
11061
11062/**
11063 * sme_request_ibss_peer_info() - request ibss peer info
11064 * @hHal : Pointer to global HAL handle
11065 * @pUserData : Pointer to user data
11066 * @peerInfoCbk : Peer info callback
11067 * @allPeerInfoReqd : All peer info required or not
11068 * @staIdx : sta index
11069 *
11070 * Return: QDF_STATUS
11071 */
11072QDF_STATUS sme_request_ibss_peer_info(tHalHandle hHal, void *pUserData,
11073 pIbssPeerInfoCb peerInfoCbk,
11074 bool allPeerInfoReqd, uint8_t staIdx)
11075{
11076 QDF_STATUS status = QDF_STATUS_E_FAILURE;
11077 QDF_STATUS qdf_status = QDF_STATUS_E_FAILURE;
11078 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
11079 cds_msg_t cds_message;
11080 tSirIbssGetPeerInfoReqParams *pIbssInfoReqParams;
11081
11082 status = sme_acquire_global_lock(&pMac->sme);
11083 if (QDF_STATUS_SUCCESS == status) {
11084 pMac->sme.peerInfoParams.peerInfoCbk = peerInfoCbk;
11085 pMac->sme.peerInfoParams.pUserData = pUserData;
11086
11087 pIbssInfoReqParams = (tSirIbssGetPeerInfoReqParams *)
11088 qdf_mem_malloc(sizeof(tSirIbssGetPeerInfoReqParams));
11089 if (NULL == pIbssInfoReqParams) {
11090 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
11091 "%s: Not able to allocate memory for dhcp start",
11092 __func__);
11093 sme_release_global_lock(&pMac->sme);
11094 return QDF_STATUS_E_NOMEM;
11095 }
11096 pIbssInfoReqParams->allPeerInfoReqd = allPeerInfoReqd;
11097 pIbssInfoReqParams->staIdx = staIdx;
11098
11099 cds_message.type = WMA_GET_IBSS_PEER_INFO_REQ;
11100 cds_message.bodyptr = pIbssInfoReqParams;
11101 cds_message.reserved = 0;
11102
11103 qdf_status = cds_mq_post_message(CDS_MQ_ID_WMA, &cds_message);
11104 if (QDF_STATUS_SUCCESS != qdf_status) {
11105 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
11106 "%s: Post WMA_GET_IBSS_PEER_INFO_REQ MSG failed",
11107 __func__);
11108 qdf_mem_free(pIbssInfoReqParams);
11109 qdf_status = QDF_STATUS_E_FAILURE;
11110 }
11111 sme_release_global_lock(&pMac->sme);
11112 }
11113
11114 return qdf_status;
11115}
11116
11117/* ---------------------------------------------------------------------------
11118 \fn sme_send_cesium_enable_ind
11119 \brief Used to send proprietary cesium enable indication to fw
11120 \param hHal
11121 \param sessionId
11122 \- return QDF_STATUS
11123 -------------------------------------------------------------------------*/
11124QDF_STATUS sme_send_cesium_enable_ind(tHalHandle hHal, uint32_t sessionId)
11125{
11126 QDF_STATUS status = QDF_STATUS_SUCCESS;
11127 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
11128 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
11129 cds_msg_t cds_message;
11130
11131 status = sme_acquire_global_lock(&pMac->sme);
11132 if (QDF_STATUS_SUCCESS == status) {
11133 cds_message.bodyptr = NULL;
11134 cds_message.type = WMA_IBSS_CESIUM_ENABLE_IND;
11135 qdf_status = cds_mq_post_message(CDS_MQ_ID_WMA, &cds_message);
11136 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
11137 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
11138 "%s: failed to post message to WMA",
11139 __func__);
11140 status = QDF_STATUS_E_FAILURE;
11141 }
11142 sme_release_global_lock(&pMac->sme);
11143 }
11144
11145 return status;
11146}
11147
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011148void sme_get_command_q_status(tHalHandle hHal)
11149{
11150 tSmeCmd *pTempCmd = NULL;
11151 tListElem *pEntry;
11152 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
11153
11154 if (NULL == pMac) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053011155 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011156 "%s: pMac is NULL", __func__);
11157 return;
11158 }
11159
11160 pEntry = csr_ll_peek_head(&pMac->sme.smeCmdActiveList, LL_ACCESS_LOCK);
11161 if (pEntry) {
11162 pTempCmd = GET_BASE_ADDR(pEntry, tSmeCmd, Link);
11163 }
11164 sms_log(pMac, LOGE, "Currently smeCmdActiveList has command (0x%X)",
11165 (pTempCmd) ? pTempCmd->command : eSmeNoCommand);
11166 if (pTempCmd) {
11167 if (eSmeCsrCommandMask & pTempCmd->command) {
11168 /* CSR command is stuck. See what the reason code is for that command */
11169 dump_csr_command_info(pMac, pTempCmd);
11170 }
11171 } /* if(pTempCmd) */
11172
11173 sms_log(pMac, LOGE, "Currently smeCmdPendingList has %d commands",
11174 csr_ll_count(&pMac->sme.smeCmdPendingList));
11175
11176 sms_log(pMac, LOGE, "Currently roamCmdPendingList has %d commands",
11177 csr_ll_count(&pMac->roam.roamCmdPendingList));
11178
11179 return;
11180}
Kiran Kumar Lokere1aa9c9a2016-10-05 18:50:59 -070011181/**
11182 * sme_set_prefer_80MHz_over_160MHz() - API to set sta_prefer_80MHz_over_160MHz
11183 * @hal: The handle returned by macOpen
11184 * @sta_prefer_80MHz_over_160MHz: sta_prefer_80MHz_over_160MHz config param
11185 */
11186void sme_set_prefer_80MHz_over_160MHz(tHalHandle hal,
11187 bool sta_prefer_80MHz_over_160MHz)
11188{
11189 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
11190 mac_ctx->sta_prefer_80MHz_over_160MHz = sta_prefer_80MHz_over_160MHz;
11191}
11192
Agrawal Ashishb141b092016-09-02 19:59:26 +053011193#ifdef WLAN_FEATURE_DSRC
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011194/**
11195 * sme_set_dot11p_config() - API to set the 802.11p config
11196 * @hHal: The handle returned by macOpen
11197 * @enable_dot11p: 802.11p config param
11198 */
11199void sme_set_dot11p_config(tHalHandle hHal, bool enable_dot11p)
11200{
11201 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
11202 pMac->enable_dot11p = enable_dot11p;
11203}
11204
11205/**
11206 * copy_sir_ocb_config() - Performs deep copy of an OCB configuration
11207 * @src: the source configuration
11208 *
11209 * Return: pointer to the copied OCB configuration
11210 */
11211static struct sir_ocb_config *sme_copy_sir_ocb_config(
11212 struct sir_ocb_config *src)
11213{
11214 struct sir_ocb_config *dst;
11215 uint32_t length;
11216 void *cursor;
11217
11218 length = sizeof(*src) +
11219 src->channel_count * sizeof(*src->channels) +
11220 src->schedule_size * sizeof(*src->schedule) +
11221 src->dcc_ndl_chan_list_len +
11222 src->dcc_ndl_active_state_list_len;
11223
Anurag Chouhan600c3a02016-03-01 10:33:54 +053011224 dst = qdf_mem_malloc(length);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011225 if (!dst)
11226 return NULL;
11227
11228 *dst = *src;
11229
11230 cursor = dst;
11231 cursor += sizeof(*dst);
11232 dst->channels = cursor;
11233 cursor += src->channel_count * sizeof(*src->channels);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053011234 qdf_mem_copy(dst->channels, src->channels,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011235 src->channel_count * sizeof(*src->channels));
11236 dst->schedule = cursor;
11237 cursor += src->schedule_size * sizeof(*src->schedule);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053011238 qdf_mem_copy(dst->schedule, src->schedule,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011239 src->schedule_size * sizeof(*src->schedule));
11240 dst->dcc_ndl_chan_list = cursor;
11241 cursor += src->dcc_ndl_chan_list_len;
Anurag Chouhan600c3a02016-03-01 10:33:54 +053011242 qdf_mem_copy(dst->dcc_ndl_chan_list, src->dcc_ndl_chan_list,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011243 src->dcc_ndl_chan_list_len);
11244 dst->dcc_ndl_active_state_list = cursor;
11245 cursor += src->dcc_ndl_active_state_list_len;
Anurag Chouhan600c3a02016-03-01 10:33:54 +053011246 qdf_mem_copy(dst->dcc_ndl_active_state_list,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011247 src->dcc_ndl_active_state_list,
11248 src->dcc_ndl_active_state_list_len);
11249 return dst;
11250}
11251
11252/**
11253 * sme_ocb_set_config() - Set the OCB configuration
11254 * @hHal: reference to the HAL
11255 * @context: the context of the call
11256 * @callback: the callback to hdd
11257 * @config: the OCB configuration
11258 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011259 * Return: QDF_STATUS_SUCCESS on success, QDF_STATUS_E_FAILURE on failure
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011260 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011261QDF_STATUS sme_ocb_set_config(tHalHandle hHal, void *context,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011262 ocb_callback callback,
11263 struct sir_ocb_config *config)
11264{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011265 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011266 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
11267 cds_msg_t msg = {0};
11268 struct sir_ocb_config *msg_body;
11269
11270 /* Lock the SME structure */
11271 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011272 if (!QDF_IS_STATUS_SUCCESS(status))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011273 return status;
11274
11275 /*
11276 * Check if there is a pending request and return an error if one
11277 * exists
11278 */
11279 if (pMac->sme.ocb_set_config_callback) {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011280 status = QDF_STATUS_E_BUSY;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011281 goto end;
11282 }
11283
11284 msg_body = sme_copy_sir_ocb_config(config);
11285
11286 if (!msg_body) {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011287 status = QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011288 goto end;
11289 }
11290
11291 msg.type = WMA_OCB_SET_CONFIG_CMD;
11292 msg.bodyptr = msg_body;
11293
11294 /* Set the request callback and context */
11295 pMac->sme.ocb_set_config_callback = callback;
11296 pMac->sme.ocb_set_config_context = context;
11297
Anurag Chouhan6d760662016-02-20 16:05:43 +053011298 status = cds_mq_post_message(QDF_MODULE_ID_WMA, &msg);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011299 if (!QDF_IS_STATUS_SUCCESS(status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053011300 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011301 FL("Error posting message to WDA: %d"), status);
11302 pMac->sme.ocb_set_config_callback = callback;
11303 pMac->sme.ocb_set_config_context = context;
Anurag Chouhan600c3a02016-03-01 10:33:54 +053011304 qdf_mem_free(msg_body);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011305 goto end;
11306 }
11307
11308end:
11309 sme_release_global_lock(&pMac->sme);
11310
11311 return status;
11312}
11313
11314/**
11315 * sme_ocb_set_utc_time() - Set the OCB UTC time
11316 * @hHal: reference to the HAL
11317 * @utc: the UTC time struct
11318 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011319 * Return: QDF_STATUS_SUCCESS on success, QDF_STATUS_E_FAILURE on failure
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011320 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011321QDF_STATUS sme_ocb_set_utc_time(tHalHandle hHal, struct sir_ocb_utc *utc)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011322{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011323 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011324 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
11325 cds_msg_t msg = {0};
11326 struct sir_ocb_utc *sme_utc;
11327
11328 /* Lock the SME structure */
11329 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011330 if (!QDF_IS_STATUS_SUCCESS(status))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011331 return status;
11332
Anurag Chouhan600c3a02016-03-01 10:33:54 +053011333 sme_utc = qdf_mem_malloc(sizeof(*sme_utc));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011334 if (!sme_utc) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053011335 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011336 FL("Malloc failed"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011337 status = QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011338 goto end;
11339 }
11340 *sme_utc = *utc;
11341
11342 msg.type = WMA_OCB_SET_UTC_TIME_CMD;
11343 msg.reserved = 0;
11344 msg.bodyptr = sme_utc;
Anurag Chouhan6d760662016-02-20 16:05:43 +053011345 status = cds_mq_post_message(QDF_MODULE_ID_WMA, &msg);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011346 if (!QDF_IS_STATUS_SUCCESS(status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053011347 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011348 FL("Not able to post message to WDA"));
Anurag Chouhan600c3a02016-03-01 10:33:54 +053011349 qdf_mem_free(utc);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011350 goto end;
11351 }
11352
11353end:
11354 sme_release_global_lock(&pMac->sme);
11355
11356 return status;
11357}
11358
11359/**
11360 * sme_ocb_start_timing_advert() - Start sending timing advert frames
11361 * @hHal: reference to the HAL
11362 * @timing_advert: the timing advertisement struct
11363 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011364 * Return: QDF_STATUS_SUCCESS on success, QDF_STATUS_E_FAILURE on failure
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011365 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011366QDF_STATUS sme_ocb_start_timing_advert(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011367 struct sir_ocb_timing_advert *timing_advert)
11368{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011369 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011370 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
11371 cds_msg_t msg = {0};
11372 void *buf;
11373 struct sir_ocb_timing_advert *sme_timing_advert;
11374
11375 /* Lock the SME structure */
11376 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011377 if (!QDF_IS_STATUS_SUCCESS(status))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011378 return status;
11379
Anurag Chouhan600c3a02016-03-01 10:33:54 +053011380 buf = qdf_mem_malloc(sizeof(*sme_timing_advert) +
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011381 timing_advert->template_length);
11382 if (!buf) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053011383 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011384 FL("Not able to allocate memory for start TA"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011385 status = QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011386 goto end;
11387 }
11388
11389 sme_timing_advert = (struct sir_ocb_timing_advert *)buf;
11390 *sme_timing_advert = *timing_advert;
11391 sme_timing_advert->template_value = buf + sizeof(*sme_timing_advert);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053011392 qdf_mem_copy(sme_timing_advert->template_value,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011393 timing_advert->template_value, timing_advert->template_length);
11394
11395 msg.type = WMA_OCB_START_TIMING_ADVERT_CMD;
11396 msg.reserved = 0;
11397 msg.bodyptr = buf;
Anurag Chouhan6d760662016-02-20 16:05:43 +053011398 status = cds_mq_post_message(QDF_MODULE_ID_WMA, &msg);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011399 if (!QDF_IS_STATUS_SUCCESS(status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053011400 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011401 FL("Not able to post msg to WDA"));
11402 goto end;
11403 }
11404
11405end:
11406 sme_release_global_lock(&pMac->sme);
11407
11408 return status;
11409}
11410
11411/**
11412 * sme_ocb_stop_timing_advert() - Stop sending timing advert frames on a channel
11413 * @hHal: reference to the HAL
11414 * @timing_advert: the timing advertisement struct
11415 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011416 * Return: QDF_STATUS_SUCCESS on success, QDF_STATUS_E_FAILURE on failure
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011417 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011418QDF_STATUS sme_ocb_stop_timing_advert(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011419 struct sir_ocb_timing_advert *timing_advert)
11420{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011421 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011422 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
11423 cds_msg_t msg = {0};
11424 struct sir_ocb_timing_advert *sme_timing_advert;
11425
11426 /* Lock the SME structure */
11427 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011428 if (!QDF_IS_STATUS_SUCCESS(status))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011429 return status;
11430
Anurag Chouhan600c3a02016-03-01 10:33:54 +053011431 sme_timing_advert = qdf_mem_malloc(sizeof(*timing_advert));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011432 if (!sme_timing_advert) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053011433 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011434 FL("Not able to allocate memory for stop TA"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011435 status = QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011436 goto end;
11437 }
11438 *sme_timing_advert = *timing_advert;
11439
11440 msg.type = WMA_OCB_STOP_TIMING_ADVERT_CMD;
11441 msg.reserved = 0;
11442 msg.bodyptr = sme_timing_advert;
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("Not able to post msg to WDA"));
11447 goto end;
11448 }
11449
11450end:
11451 sme_release_global_lock(&pMac->sme);
11452
11453 return status;
11454}
11455
11456/**
Naveen Rawatb4d37622015-11-13 16:15:25 -080011457 * sme_ocb_gen_timing_advert_frame() - generate TA frame and populate the buffer
11458 * @hal_handle: reference to the HAL
11459 * @self_addr: the self MAC address
11460 * @buf: the buffer that will contain the frame
11461 * @timestamp_offset: return for the offset of the timestamp field
11462 * @time_value_offset: return for the time_value field in the TA IE
11463 *
11464 * Return: the length of the buffer.
11465 */
11466int sme_ocb_gen_timing_advert_frame(tHalHandle hal_handle,
11467 tSirMacAddr self_addr, uint8_t **buf,
11468 uint32_t *timestamp_offset,
11469 uint32_t *time_value_offset)
11470{
11471 int template_length;
11472 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal_handle);
11473
11474 template_length = sch_gen_timing_advert_frame(mac_ctx, self_addr, buf,
11475 timestamp_offset,
11476 time_value_offset);
11477 return template_length;
11478}
11479/**
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011480 * sme_ocb_get_tsf_timer() - Get the TSF timer value
11481 * @hHal: reference to the HAL
11482 * @context: the context of the call
11483 * @callback: the callback to hdd
11484 * @request: the TSF timer request
11485 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011486 * Return: QDF_STATUS_SUCCESS on success, QDF_STATUS_E_FAILURE on failure
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011487 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011488QDF_STATUS sme_ocb_get_tsf_timer(tHalHandle hHal, void *context,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011489 ocb_callback callback,
11490 struct sir_ocb_get_tsf_timer *request)
11491{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011492 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011493 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
11494 cds_msg_t msg = {0};
11495 struct sir_ocb_get_tsf_timer *msg_body;
11496
11497 /* Lock the SME structure */
11498 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011499 if (!QDF_IS_STATUS_SUCCESS(status))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011500 return status;
11501
11502 /* Allocate memory for the WMI request, and copy the parameter */
Anurag Chouhan600c3a02016-03-01 10:33:54 +053011503 msg_body = qdf_mem_malloc(sizeof(*msg_body));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011504 if (!msg_body) {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011505 status = QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011506 goto end;
11507 }
11508 *msg_body = *request;
11509
11510 msg.type = WMA_OCB_GET_TSF_TIMER_CMD;
11511 msg.bodyptr = msg_body;
11512
11513 /* Set the request callback and the context */
11514 pMac->sme.ocb_get_tsf_timer_callback = callback;
11515 pMac->sme.ocb_get_tsf_timer_context = context;
11516
11517 /* Post the message to WDA */
Anurag Chouhan6d760662016-02-20 16:05:43 +053011518 status = cds_mq_post_message(QDF_MODULE_ID_WMA, &msg);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011519 if (!QDF_IS_STATUS_SUCCESS(status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053011520 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011521 FL("Error posting message to WDA: %d"), status);
11522 pMac->sme.ocb_get_tsf_timer_callback = NULL;
11523 pMac->sme.ocb_get_tsf_timer_context = NULL;
Anurag Chouhan600c3a02016-03-01 10:33:54 +053011524 qdf_mem_free(msg_body);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011525 goto end;
11526 }
11527
11528end:
11529 sme_release_global_lock(&pMac->sme);
11530
11531 return status;
11532}
11533
11534/**
11535 * sme_dcc_get_stats() - Get the DCC stats
11536 * @hHal: reference to the HAL
11537 * @context: the context of the call
11538 * @callback: the callback to hdd
11539 * @request: the get DCC stats request
11540 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011541 * Return: QDF_STATUS_SUCCESS on success, QDF_STATUS_E_FAILURE on failure
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011542 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011543QDF_STATUS sme_dcc_get_stats(tHalHandle hHal, void *context,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011544 ocb_callback callback,
11545 struct sir_dcc_get_stats *request)
11546{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011547 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011548 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
11549 cds_msg_t msg = {0};
11550 struct sir_dcc_get_stats *msg_body;
11551
11552 /* Lock the SME structure */
11553 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011554 if (!QDF_IS_STATUS_SUCCESS(status))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011555 return status;
11556
11557 /* Allocate memory for the WMI request, and copy the parameter */
Anurag Chouhan600c3a02016-03-01 10:33:54 +053011558 msg_body = qdf_mem_malloc(sizeof(*msg_body) +
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011559 request->request_array_len);
11560 if (!msg_body) {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011561 status = QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011562 goto end;
11563 }
11564 *msg_body = *request;
11565 msg_body->request_array = (void *)msg_body + sizeof(*msg_body);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053011566 qdf_mem_copy(msg_body->request_array, request->request_array,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011567 request->request_array_len);
11568
11569 msg.type = WMA_DCC_GET_STATS_CMD;
11570 msg.bodyptr = msg_body;
11571
11572 /* Set the request callback and context */
11573 pMac->sme.dcc_get_stats_callback = callback;
11574 pMac->sme.dcc_get_stats_context = context;
11575
Anurag Chouhan6d760662016-02-20 16:05:43 +053011576 status = cds_mq_post_message(QDF_MODULE_ID_WMA, &msg);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011577 if (!QDF_IS_STATUS_SUCCESS(status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053011578 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011579 FL("Error posting message to WDA: %d"), status);
11580 pMac->sme.dcc_get_stats_callback = callback;
11581 pMac->sme.dcc_get_stats_context = context;
Anurag Chouhan600c3a02016-03-01 10:33:54 +053011582 qdf_mem_free(msg_body);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011583 goto end;
11584 }
11585
11586end:
11587 sme_release_global_lock(&pMac->sme);
11588
11589 return status;
11590}
11591
11592/**
11593 * sme_dcc_clear_stats() - Clear the DCC stats
11594 * @hHal: reference to the HAL
11595 * @vdev_id: vdev id for OCB interface
11596 * @dcc_stats_bitmap: the entries in the stats to clear
11597 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011598 * Return: QDF_STATUS_SUCCESS on success, QDF_STATUS_E_FAILURE on failure
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011599 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011600QDF_STATUS sme_dcc_clear_stats(tHalHandle hHal, uint32_t vdev_id,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011601 uint32_t dcc_stats_bitmap)
11602{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011603 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011604 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
11605 cds_msg_t msg = {0};
11606 struct sir_dcc_clear_stats *request;
11607
11608 /* Lock the SME structure */
11609 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011610 if (!QDF_IS_STATUS_SUCCESS(status))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011611 return status;
11612
Anurag Chouhan600c3a02016-03-01 10:33:54 +053011613 request = qdf_mem_malloc(sizeof(struct sir_dcc_clear_stats));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011614 if (!request) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053011615 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011616 FL("Not able to allocate memory"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011617 status = QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011618 goto end;
11619 }
11620
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011621 request->vdev_id = vdev_id;
11622 request->dcc_stats_bitmap = dcc_stats_bitmap;
11623
11624 msg.type = WMA_DCC_CLEAR_STATS_CMD;
11625 msg.bodyptr = request;
11626
Anurag Chouhan6d760662016-02-20 16:05:43 +053011627 status = cds_mq_post_message(QDF_MODULE_ID_WMA, &msg);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011628 if (!QDF_IS_STATUS_SUCCESS(status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053011629 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011630 FL("Not able to post msg to WDA"));
Anurag Chouhan600c3a02016-03-01 10:33:54 +053011631 qdf_mem_free(request);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011632 goto end;
11633 }
11634
11635end:
11636 sme_release_global_lock(&pMac->sme);
11637
11638 return status;
11639}
11640
11641/**
11642 * sme_dcc_update_ndl() - Update the DCC settings
11643 * @hHal: reference to the HAL
11644 * @context: the context of the call
11645 * @callback: the callback to hdd
11646 * @request: the update DCC request
11647 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011648 * Return: QDF_STATUS_SUCCESS on success, QDF_STATUS_E_FAILURE on failure
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011649 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011650QDF_STATUS sme_dcc_update_ndl(tHalHandle hHal, void *context,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011651 ocb_callback callback,
11652 struct sir_dcc_update_ndl *request)
11653{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011654 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011655 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
11656 cds_msg_t msg = {0};
11657 struct sir_dcc_update_ndl *msg_body;
11658
11659 /* Lock the SME structure */
11660 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011661 if (!QDF_IS_STATUS_SUCCESS(status))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011662 return status;
11663
11664 /* Allocate memory for the WMI request, and copy the parameter */
Anurag Chouhan600c3a02016-03-01 10:33:54 +053011665 msg_body = qdf_mem_malloc(sizeof(*msg_body) +
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011666 request->dcc_ndl_chan_list_len +
11667 request->dcc_ndl_active_state_list_len);
11668 if (!msg_body) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053011669 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011670 FL("Failed to allocate memory"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011671 status = QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011672 goto end;
11673 }
11674
11675 *msg_body = *request;
11676
11677 msg_body->dcc_ndl_chan_list = (void *)msg_body + sizeof(*msg_body);
11678 msg_body->dcc_ndl_active_state_list = msg_body->dcc_ndl_chan_list +
11679 request->dcc_ndl_chan_list_len;
Anurag Chouhan600c3a02016-03-01 10:33:54 +053011680 qdf_mem_copy(msg_body->dcc_ndl_chan_list, request->dcc_ndl_chan_list,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011681 request->dcc_ndl_active_state_list_len);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053011682 qdf_mem_copy(msg_body->dcc_ndl_active_state_list,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011683 request->dcc_ndl_active_state_list,
11684 request->dcc_ndl_active_state_list_len);
11685
11686 msg.type = WMA_DCC_UPDATE_NDL_CMD;
11687 msg.bodyptr = msg_body;
11688
11689 /* Set the request callback and the context */
11690 pMac->sme.dcc_update_ndl_callback = callback;
11691 pMac->sme.dcc_update_ndl_context = context;
11692
Anurag Chouhan6d760662016-02-20 16:05:43 +053011693 status = cds_mq_post_message(QDF_MODULE_ID_WMA, &msg);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011694 if (!QDF_IS_STATUS_SUCCESS(status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053011695 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011696 FL("Error posting message to WDA: %d"), status);
11697 pMac->sme.dcc_update_ndl_callback = NULL;
11698 pMac->sme.dcc_update_ndl_context = NULL;
Anurag Chouhan600c3a02016-03-01 10:33:54 +053011699 qdf_mem_free(msg_body);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011700 goto end;
11701 }
11702
11703end:
11704 sme_release_global_lock(&pMac->sme);
11705
11706 return status;
11707}
11708
11709/**
11710 * sme_register_for_dcc_stats_event() - Register for the periodic DCC stats
11711 * event
11712 * @hHal: reference to the HAL
11713 * @context: the context of the call
11714 * @callback: the callback to hdd
11715 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011716 * Return: QDF_STATUS_SUCCESS on success, QDF_STATUS_E_FAILURE on failure
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011717 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011718QDF_STATUS sme_register_for_dcc_stats_event(tHalHandle hHal, void *context,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011719 ocb_callback callback)
11720{
11721 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011722 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011723
11724 status = sme_acquire_global_lock(&pMac->sme);
11725 pMac->sme.dcc_stats_event_callback = callback;
11726 pMac->sme.dcc_stats_event_context = context;
11727 sme_release_global_lock(&pMac->sme);
11728
11729 return 0;
11730}
11731
Arun Khandavalli4b55da72016-07-19 19:55:01 +053011732/**
11733 * sme_deregister_for_dcc_stats_event() - De-Register for the periodic DCC stats
11734 * event
11735 * @h_hal: Hal Handle
11736 *
11737 * This function de-registers the DCC perioc stats callback
11738 *
11739 * Return: QDF_STATUS Enumeration
11740 */
11741QDF_STATUS sme_deregister_for_dcc_stats_event(tHalHandle h_hal)
11742{
11743 tpAniSirGlobal mac;
11744 QDF_STATUS status;
11745
11746 if (!h_hal) {
11747 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
11748 FL("h_hal is not valid"));
11749 return QDF_STATUS_E_INVAL;
11750 }
11751 mac = PMAC_STRUCT(h_hal);
11752
11753 status = sme_acquire_global_lock(&mac->sme);
11754 if (!QDF_IS_STATUS_SUCCESS(status)) {
11755 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
11756 FL("Failed to acquire global lock"));
11757 return status;
11758 }
11759 mac->sme.dcc_stats_event_callback = NULL;
11760 mac->sme.dcc_stats_event_context = NULL;
11761 sme_release_global_lock(&mac->sme);
11762
11763 return status;
11764}
Agrawal Ashishb141b092016-09-02 19:59:26 +053011765#endif
Arun Khandavalli4b55da72016-07-19 19:55:01 +053011766
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011767void sme_get_recovery_stats(tHalHandle hHal)
11768{
11769 uint8_t i;
11770
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053011771 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011772 "Self Recovery Stats");
11773 for (i = 0; i < MAX_ACTIVE_CMD_STATS; i++) {
11774 if (eSmeNoCommand !=
11775 g_self_recovery_stats.activeCmdStats[i].command) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053011776 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011777 "timestamp %llu: command 0x%0X: reason %d: session %d",
11778 g_self_recovery_stats.activeCmdStats[i].
11779 timestamp,
11780 g_self_recovery_stats.activeCmdStats[i].command,
11781 g_self_recovery_stats.activeCmdStats[i].reason,
11782 g_self_recovery_stats.activeCmdStats[i].
11783 sessionId);
11784 }
11785 }
11786}
11787
11788/**
11789 * sme_save_active_cmd_stats() - To save active command stats
11790 * @hHal: HAL context
11791 *
11792 * This routine is to save active command stats
11793 *
11794 * Return: None
11795 */
Jeff Johnson49c02f92016-10-07 10:29:09 -070011796static void sme_save_active_cmd_stats(tHalHandle hHal)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011797{
11798 tSmeCmd *pTempCmd = NULL;
11799 tListElem *pEntry;
11800 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
11801 uint8_t statidx = 0;
11802 tActiveCmdStats *actv_cmd_stat = NULL;
11803
11804 if (NULL == pMac) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053011805 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011806 FL("pMac is NULL"));
11807 return;
11808 }
11809
11810 pEntry = csr_ll_peek_head(&pMac->sme.smeCmdActiveList, LL_ACCESS_LOCK);
11811 if (pEntry)
11812 pTempCmd = GET_BASE_ADDR(pEntry, tSmeCmd, Link);
11813
11814 if (!pTempCmd)
11815 return;
11816
11817 if (eSmeCsrCommandMask & pTempCmd->command) {
11818 statidx = g_self_recovery_stats.cmdStatsIndx;
11819 actv_cmd_stat = &g_self_recovery_stats.activeCmdStats[statidx];
11820 actv_cmd_stat->command = pTempCmd->command;
11821 actv_cmd_stat->sessionId = pTempCmd->sessionId;
11822 actv_cmd_stat->timestamp = cds_get_monotonic_boottime();
11823 if (eSmeCommandRoam == pTempCmd->command)
11824 actv_cmd_stat->reason = pTempCmd->u.roamCmd.roamReason;
11825 else if (eSmeCommandScan == pTempCmd->command)
11826 actv_cmd_stat->reason = pTempCmd->u.scanCmd.reason;
11827 else
11828 actv_cmd_stat->reason = 0xFF;
11829
11830 g_self_recovery_stats.cmdStatsIndx =
11831 ((g_self_recovery_stats.cmdStatsIndx + 1) &
11832 (MAX_ACTIVE_CMD_STATS - 1));
11833 }
11834 return;
11835}
11836
11837void active_list_cmd_timeout_handle(void *userData)
11838{
Abhishek Singh5ea86532016-04-27 14:10:53 +053011839 tHalHandle hal = (tHalHandle)userData;
11840 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
Kapil Gupta63ddab22016-08-09 16:41:24 +053011841 tListElem *entry;
11842 tSmeCmd *temp_cmd = NULL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011843
Abhishek Singh5ea86532016-04-27 14:10:53 +053011844 if (NULL == mac_ctx) {
11845 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
11846 "%s: mac_ctx is null", __func__);
11847 return;
11848 }
11849 /* Return if no cmd pending in active list as
11850 * in this case we should not be here.
11851 */
11852 if (0 == csr_ll_count(&mac_ctx->sme.smeCmdActiveList))
11853 return;
11854 sms_log(mac_ctx, LOGE,
11855 FL("Active List command timeout Cmd List Count %d"),
11856 csr_ll_count(&mac_ctx->sme.smeCmdActiveList));
11857 sme_get_command_q_status(hal);
11858
11859 if (mac_ctx->roam.configParam.enable_fatal_event)
11860 cds_flush_logs(WLAN_LOG_TYPE_FATAL,
11861 WLAN_LOG_INDICATOR_HOST_DRIVER,
11862 WLAN_LOG_REASON_SME_COMMAND_STUCK,
11863 false,
11864 mac_ctx->sme.enableSelfRecovery ? true : false);
11865 else
11866 qdf_trace_dump_all(mac_ctx, 0, 0, 500, 0);
11867
Kapil Gupta63ddab22016-08-09 16:41:24 +053011868 entry = csr_ll_peek_head(&mac_ctx->sme.smeCmdActiveList,
11869 LL_ACCESS_LOCK);
11870 if (entry)
11871 temp_cmd = GET_BASE_ADDR(entry, tSmeCmd, Link);
11872 /* Ignore if ROC took more than 120 sec */
11873 if (temp_cmd && (eSmeCommandRemainOnChannel == temp_cmd->command))
11874 return;
11875
Abhishek Singh5ea86532016-04-27 14:10:53 +053011876 if (mac_ctx->sme.enableSelfRecovery) {
11877 sme_save_active_cmd_stats(hal);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011878 cds_trigger_recovery();
11879 } else {
Abhishek Singh5ea86532016-04-27 14:10:53 +053011880 if (!mac_ctx->roam.configParam.enable_fatal_event &&
11881 !(cds_is_load_or_unload_in_progress() ||
11882 cds_is_driver_recovering()))
11883 QDF_BUG(0);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011884 }
11885}
11886
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011887QDF_STATUS sme_notify_modem_power_state(tHalHandle hHal, uint32_t value)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011888{
11889 cds_msg_t msg;
11890 tpSirModemPowerStateInd request_buf;
11891 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
11892
11893 if (NULL == pMac) {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011894 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011895 }
11896
Anurag Chouhan600c3a02016-03-01 10:33:54 +053011897 request_buf = qdf_mem_malloc(sizeof(tSirModemPowerStateInd));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011898 if (NULL == request_buf) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053011899 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011900 "%s: Not able to allocate memory for MODEM POWER STATE IND",
11901 __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011902 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011903 }
11904
11905 request_buf->param = value;
11906
11907 msg.type = WMA_MODEM_POWER_STATE_IND;
11908 msg.reserved = 0;
11909 msg.bodyptr = request_buf;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011910 if (!QDF_IS_STATUS_SUCCESS
Anurag Chouhan6d760662016-02-20 16:05:43 +053011911 (cds_mq_post_message(QDF_MODULE_ID_WMA, &msg))) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053011912 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011913 "%s: Not able to post WMA_MODEM_POWER_STATE_IND message"
11914 " to WMA", __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053011915 qdf_mem_free(request_buf);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011916 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011917 }
11918
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011919 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011920}
11921
11922#ifdef QCA_HT_2040_COEX
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011923QDF_STATUS sme_notify_ht2040_mode(tHalHandle hHal, uint16_t staId,
Anurag Chouhan6d760662016-02-20 16:05:43 +053011924 struct qdf_mac_addr macAddrSTA,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011925 uint8_t sessionId,
11926 uint8_t channel_type)
11927{
11928 cds_msg_t msg;
11929 tUpdateVHTOpMode *pHtOpMode = NULL;
11930 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
11931
11932 if (NULL == pMac) {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011933 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011934 }
11935
Anurag Chouhan600c3a02016-03-01 10:33:54 +053011936 pHtOpMode = qdf_mem_malloc(sizeof(tUpdateVHTOpMode));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011937 if (NULL == pHtOpMode) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053011938 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011939 "%s: Not able to allocate memory for setting OP mode",
11940 __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011941 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011942 }
11943
11944 switch (channel_type) {
11945 case eHT_CHAN_HT20:
11946 pHtOpMode->opMode = eHT_CHANNEL_WIDTH_20MHZ;
11947 break;
11948
11949 case eHT_CHAN_HT40MINUS:
11950 case eHT_CHAN_HT40PLUS:
11951 pHtOpMode->opMode = eHT_CHANNEL_WIDTH_40MHZ;
11952 break;
11953
11954 default:
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053011955 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011956 "%s: Invalid OP mode", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011957 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011958 }
11959
11960 pHtOpMode->staId = staId,
Anurag Chouhan600c3a02016-03-01 10:33:54 +053011961 qdf_mem_copy(pHtOpMode->peer_mac, macAddrSTA.bytes,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011962 sizeof(tSirMacAddr));
11963 pHtOpMode->smesessionId = sessionId;
11964
11965 msg.type = WMA_UPDATE_OP_MODE;
11966 msg.reserved = 0;
11967 msg.bodyptr = pHtOpMode;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011968 if (!QDF_IS_STATUS_SUCCESS
Anurag Chouhan6d760662016-02-20 16:05:43 +053011969 (cds_mq_post_message(QDF_MODULE_ID_WMA, &msg))) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053011970 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011971 "%s: Not able to post WMA_UPDATE_OP_MODE message"
11972 " to WMA", __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053011973 qdf_mem_free(pHtOpMode);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011974 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011975 }
11976
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053011977 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011978 "%s: Notifed FW about OP mode: %d for staId=%d",
11979 __func__, pHtOpMode->opMode, staId);
11980
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011981 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011982}
11983
11984/* ---------------------------------------------------------------------------
11985
11986 \fn sme_set_ht2040_mode
11987
11988 \brief To update HT Operation beacon IE.
11989
11990 \param
11991
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011992 \return QDF_STATUS SUCCESS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011993 FAILURE or RESOURCES
11994 The API finished and failed.
11995
11996 -------------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011997QDF_STATUS sme_set_ht2040_mode(tHalHandle hHal, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011998 uint8_t channel_type, bool obssEnabled)
11999{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012000 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012001 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
12002 ePhyChanBondState cbMode;
12003
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053012004 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012005 "%s: Update HT operation beacon IE, channel_type=%d",
12006 __func__, channel_type);
12007
12008 switch (channel_type) {
12009 case eHT_CHAN_HT20:
12010 cbMode = PHY_SINGLE_CHANNEL_CENTERED;
12011 break;
12012 case eHT_CHAN_HT40MINUS:
12013 cbMode = PHY_DOUBLE_CHANNEL_HIGH_PRIMARY;
12014 break;
12015 case eHT_CHAN_HT40PLUS:
12016 cbMode = PHY_DOUBLE_CHANNEL_LOW_PRIMARY;
12017 break;
12018 default:
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053012019 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012020 "%s:Error!!! Invalid HT20/40 mode !", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012021 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012022 }
12023 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012024 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012025 status = csr_set_ht2040_mode(pMac, sessionId,
12026 cbMode, obssEnabled);
12027 sme_release_global_lock(&pMac->sme);
12028 }
12029 return status;
12030}
12031
12032/* ---------------------------------------------------------------------------
12033
12034 \fn sme_set_phy_cb_mode24_g
12035
12036 \brief Changes PHY channel bonding mode
12037
12038 \param hHal - The handle returned by mac_open.
12039
12040 \param cbMode new channel bonding mode which is to set
12041
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012042 \return QDF_STATUS SUCCESS.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012043
12044 -------------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012045QDF_STATUS sme_set_phy_cb_mode24_g(tHalHandle hHal, ePhyChanBondState phyCBMode)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012046{
12047 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
12048
12049 if (NULL == pMac) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053012050 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012051 "%s: invalid context", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012052 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012053 }
12054
12055 pMac->roam.configParam.channelBondingMode24GHz = phyCBMode;
12056
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012057 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012058}
12059#endif
12060
12061/*
12062 * SME API to enable/disable idle mode powersave
12063 * This should be called only if powersave offload
12064 * is enabled
12065 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012066QDF_STATUS sme_set_idle_powersave_config(void *cds_context,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012067 tHalHandle hHal, uint32_t value)
12068{
Anurag Chouhan6d760662016-02-20 16:05:43 +053012069 void *wmaContext = cds_get_context(QDF_MODULE_ID_WMA);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012070 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
12071
12072 if (NULL == wmaContext) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053012073 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012074 "%s: wmaContext is NULL", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012075 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012076 }
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053012077 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012078 " Idle Ps Set Value %d", value);
12079
12080 pMac->imps_enabled = false;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012081 if (QDF_STATUS_SUCCESS != wma_set_idle_ps_config(wmaContext, value)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053012082 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012083 " Failed to Set Idle Ps Value %d", value);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012084 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012085 }
12086 if (value)
12087 pMac->imps_enabled = true;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012088 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012089}
12090
12091int16_t sme_get_ht_config(tHalHandle hHal, uint8_t session_id, uint16_t ht_capab)
12092{
12093 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
12094 tCsrRoamSession *pSession = CSR_GET_SESSION(pMac, session_id);
12095
12096 if (NULL == pSession) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053012097 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012098 "%s: pSession is NULL", __func__);
12099 return -EIO;
12100 }
12101 switch (ht_capab) {
12102 case WNI_CFG_HT_CAP_INFO_ADVANCE_CODING:
12103 return pSession->htConfig.ht_rx_ldpc;
12104 case WNI_CFG_HT_CAP_INFO_TX_STBC:
12105 return pSession->htConfig.ht_tx_stbc;
12106 case WNI_CFG_HT_CAP_INFO_RX_STBC:
12107 return pSession->htConfig.ht_rx_stbc;
12108 case WNI_CFG_HT_CAP_INFO_SHORT_GI_20MHZ:
Sandeep Puligilla607f34a2016-05-25 14:37:47 -070012109 return pSession->htConfig.ht_sgi20;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012110 case WNI_CFG_HT_CAP_INFO_SHORT_GI_40MHZ:
Sandeep Puligilla607f34a2016-05-25 14:37:47 -070012111 return pSession->htConfig.ht_sgi40;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012112 default:
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053012113 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012114 "invalid ht capability");
12115 return -EIO;
12116 }
12117}
12118
12119int sme_update_ht_config(tHalHandle hHal, uint8_t sessionId, uint16_t htCapab,
12120 int value)
12121{
12122 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
12123 tCsrRoamSession *pSession = CSR_GET_SESSION(pMac, sessionId);
12124
12125 if (NULL == pSession) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053012126 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012127 "%s: pSession is NULL", __func__);
12128 return -EIO;
12129 }
12130
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012131 if (QDF_STATUS_SUCCESS != wma_set_htconfig(sessionId, htCapab, value)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053012132 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012133 "Failed to set ht capability in target");
12134 return -EIO;
12135 }
12136
12137 switch (htCapab) {
12138 case WNI_CFG_HT_CAP_INFO_ADVANCE_CODING:
12139 pSession->htConfig.ht_rx_ldpc = value;
12140 break;
12141 case WNI_CFG_HT_CAP_INFO_TX_STBC:
12142 pSession->htConfig.ht_tx_stbc = value;
12143 break;
12144 case WNI_CFG_HT_CAP_INFO_RX_STBC:
12145 pSession->htConfig.ht_rx_stbc = value;
12146 break;
12147 case WNI_CFG_HT_CAP_INFO_SHORT_GI_20MHZ:
Sandeep Puligilla607f34a2016-05-25 14:37:47 -070012148 pSession->htConfig.ht_sgi20 = value;
12149 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012150 case WNI_CFG_HT_CAP_INFO_SHORT_GI_40MHZ:
Sandeep Puligilla607f34a2016-05-25 14:37:47 -070012151 pSession->htConfig.ht_sgi40 = value;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012152 break;
12153 }
12154
12155 return 0;
12156}
12157
12158#define HT20_SHORT_GI_MCS7_RATE 722
12159/* ---------------------------------------------------------------------------
12160 \fn sme_send_rate_update_ind
12161 \brief API to Update rate
12162 \param hHal - The handle returned by mac_open
12163 \param rateUpdateParams - Pointer to rate update params
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012164 \return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012165 ---------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012166QDF_STATUS sme_send_rate_update_ind(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012167 tSirRateUpdateInd *rateUpdateParams)
12168{
12169 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012170 QDF_STATUS status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012171 cds_msg_t msg;
Anurag Chouhan600c3a02016-03-01 10:33:54 +053012172 tSirRateUpdateInd *rate_upd = qdf_mem_malloc(sizeof(tSirRateUpdateInd));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012173
12174 if (rate_upd == NULL) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053012175 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012176 "Rate update struct alloc failed");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012177 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012178 }
12179 *rate_upd = *rateUpdateParams;
12180
12181 if (rate_upd->mcastDataRate24GHz == HT20_SHORT_GI_MCS7_RATE)
12182 rate_upd->mcastDataRate24GHzTxFlag =
12183 eHAL_TX_RATE_HT20 | eHAL_TX_RATE_SGI;
12184 else if (rate_upd->reliableMcastDataRate ==
12185 HT20_SHORT_GI_MCS7_RATE)
12186 rate_upd->reliableMcastDataRateTxFlag =
12187 eHAL_TX_RATE_HT20 | eHAL_TX_RATE_SGI;
12188
12189 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012190 if (QDF_STATUS_SUCCESS == status) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012191 msg.type = WMA_RATE_UPDATE_IND;
12192 msg.bodyptr = rate_upd;
Sreelakshmi Konamki6a065362016-05-31 16:05:01 +053012193 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
12194 NO_SESSION, msg.type));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012195 if (!QDF_IS_STATUS_SUCCESS
Anurag Chouhan6d760662016-02-20 16:05:43 +053012196 (cds_mq_post_message(QDF_MODULE_ID_WMA, &msg))) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053012197 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012198 "%s: Not able "
12199 "to post WMA_SET_RMC_RATE_IND to WMA!",
12200 __func__);
12201
12202 sme_release_global_lock(&pMac->sme);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053012203 qdf_mem_free(rate_upd);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012204 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012205 }
12206
12207 sme_release_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012208 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012209 }
12210
12211 return status;
12212}
12213
12214/**
Kondabattini, Ganeshe4f18e02016-09-13 13:01:22 +053012215 * sme_update_access_policy_vendor_ie() - update vendor ie and access policy.
12216 * @hal: Pointer to the mac context
12217 * @session_id: sme session id
12218 * @vendor_ie: vendor ie
12219 * @access_policy: vendor ie access policy
12220 *
12221 * This function updates the vendor ie and access policy to lim.
12222 *
12223 * Return: success or failure.
12224 */
12225QDF_STATUS sme_update_access_policy_vendor_ie(tHalHandle hal,
12226 uint8_t session_id, uint8_t *vendor_ie, int access_policy)
12227{
12228 struct sme_update_access_policy_vendor_ie *msg;
12229 uint16_t msg_len;
12230 QDF_STATUS status = QDF_STATUS_E_FAILURE;
12231 tpAniSirGlobal mac = PMAC_STRUCT(hal);
12232
12233 msg_len = sizeof(*msg);
12234
12235 msg = qdf_mem_malloc(msg_len);
12236 if (!msg) {
12237 sms_log(mac, LOGE,
12238 "failed to allocate memory for sme_update_access_policy_vendor_ie");
12239 return QDF_STATUS_E_FAILURE;
12240 }
12241
Kondabattini, Ganeshe4f18e02016-09-13 13:01:22 +053012242 msg->msg_type = (uint16_t)eWNI_SME_UPDATE_ACCESS_POLICY_VENDOR_IE;
12243 msg->length = (uint16_t)msg_len;
12244
12245 qdf_mem_copy(&msg->ie[0], vendor_ie, sizeof(msg->ie));
12246
12247 msg->sme_session_id = session_id;
12248 msg->access_policy = access_policy;
12249
12250 sms_log(mac, LOG1, "sme_session_id %hu, access_policy %d", session_id,
12251 access_policy);
12252
12253 status = cds_send_mb_message_to_mac(msg);
12254
12255 return status;
12256}
12257
12258/**
Agrawal Ashishda3e9502016-09-21 17:43:51 +053012259 * sme_update_short_retry_limit_threshold() - update short frame retry limit TH
12260 * @hal: Handle returned by mac_open
12261 * @session_id: Session ID on which short frame retry limit needs to be
12262 * updated to FW
12263 * @short_limit_count_th: Retry count TH to retry short frame.
12264 *
12265 * This function is used to configure count to retry short frame.
12266 *
12267 * Return: QDF_STATUS
12268 */
12269QDF_STATUS sme_update_short_retry_limit_threshold(tHalHandle hal_handle,
12270 struct sme_short_retry_limit *short_retry_limit_th)
12271{
12272 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal_handle);
12273 QDF_STATUS status = QDF_STATUS_SUCCESS;
12274 struct sme_short_retry_limit *srl;
12275 cds_msg_t msg;
12276
12277 srl = qdf_mem_malloc(sizeof(*srl));
12278 if (NULL == srl) {
12279 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
12280 "%s: fail to alloc short retry limit", __func__);
12281 return QDF_STATUS_E_FAILURE;
12282 }
12283 sms_log(mac_ctx, LOG1, FL("session_id %d short retry limit count: %d"),
12284 short_retry_limit_th->session_id,
12285 short_retry_limit_th->short_retry_limit);
12286
12287 srl->session_id = short_retry_limit_th->session_id;
12288 srl->short_retry_limit = short_retry_limit_th->short_retry_limit;
12289
12290 qdf_mem_zero(&msg, sizeof(msg));
12291 msg.type = SIR_HAL_SHORT_RETRY_LIMIT_CNT;
12292 msg.reserved = 0;
12293 msg.bodyptr = srl;
12294 status = cds_mq_post_message(QDF_MODULE_ID_WMA, &msg);
12295 if (status != QDF_STATUS_SUCCESS) {
12296 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
12297 FL("Not able to post short retry limit count to WDA"));
12298 qdf_mem_free(srl);
12299 return QDF_STATUS_E_FAILURE;
12300 }
12301
12302 return status;
12303}
12304
12305/**
12306 * sme_update_long_retry_limit_threshold() - update long retry limit TH
12307 * @hal: Handle returned by mac_open
12308 * @session_id: Session ID on which long frames retry TH needs to be updated
12309 * to FW
12310 * @long_limit_count_th: Retry count to retry long frame.
12311 *
12312 * This function is used to configure TH to retry long frame.
12313 *
12314 * Return: QDF_STATUS
12315*/
12316QDF_STATUS sme_update_long_retry_limit_threshold(tHalHandle hal_handle,
12317 struct sme_long_retry_limit *long_retry_limit_th)
12318{
12319 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal_handle);
12320 QDF_STATUS status = QDF_STATUS_SUCCESS;
12321 struct sme_long_retry_limit *lrl;
12322 cds_msg_t msg;
12323
12324 lrl = qdf_mem_malloc(sizeof(*lrl));
12325 if (NULL == lrl) {
12326 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
12327 "%s: fail to alloc long retry limit", __func__);
12328 return QDF_STATUS_E_FAILURE;
12329 }
12330 sms_log(mac_ctx, LOG1, FL("session_id %d long retry limit count: %d"),
12331 long_retry_limit_th->session_id,
12332 long_retry_limit_th->long_retry_limit);
12333
12334 lrl->session_id = long_retry_limit_th->session_id;
12335 lrl->long_retry_limit = long_retry_limit_th->long_retry_limit;
12336
12337 qdf_mem_zero(&msg, sizeof(msg));
12338 msg.type = SIR_HAL_LONG_RETRY_LIMIT_CNT;
12339 msg.reserved = 0;
12340 msg.bodyptr = lrl;
12341 status = cds_mq_post_message(QDF_MODULE_ID_WMA, &msg);
12342
12343 if (status != QDF_STATUS_SUCCESS) {
12344 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
12345 FL("Not able to post long retry limit count to WDA"));
12346 qdf_mem_free(lrl);
12347 return QDF_STATUS_E_FAILURE;
12348 }
12349
12350 return status;
12351}
12352
12353/**
Agrawal, Ashish4e5fa1c2016-09-21 19:03:43 +053012354 * sme_update_sta_inactivity_timeout(): Update sta_inactivity_timeout to FW
12355 * @hal: Handle returned by mac_open
12356 * @session_id: Session ID on which sta_inactivity_timeout needs
12357 * to be updated to FW
12358 * @sta_inactivity_timeout: sta inactivity timeout.
12359 *
12360 * If a station does not send anything in sta_inactivity_timeout seconds, an
12361 * empty data frame is sent to it in order to verify whether it is
12362 * still in range. If this frame is not ACKed, the station will be
12363 * disassociated and then deauthenticated.
12364 *
12365 * Return: QDF_STATUS_SUCCESS or non-zero on failure.
12366*/
12367QDF_STATUS sme_update_sta_inactivity_timeout(tHalHandle hal_handle,
12368 struct sme_sta_inactivity_timeout *sta_inactivity_timer)
12369{
12370 struct sme_sta_inactivity_timeout *inactivity_time;
12371 void *wma_handle;
12372
12373 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
12374 inactivity_time = qdf_mem_malloc(sizeof(*inactivity_time));
12375 if (NULL == inactivity_time) {
12376 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
12377 "%s: fail to alloc inactivity_time", __func__);
12378 return QDF_STATUS_E_FAILURE;
12379 }
12380 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO,
12381 FL("sta_inactivity_timeout: %d"),
12382 sta_inactivity_timer->sta_inactivity_timeout);
12383 inactivity_time->session_id = sta_inactivity_timer->session_id;
12384 inactivity_time->sta_inactivity_timeout =
12385 sta_inactivity_timer->sta_inactivity_timeout;
12386
12387 wma_update_sta_inactivity_timeout(wma_handle,
12388 inactivity_time);
12389 return QDF_STATUS_SUCCESS;
12390}
12391
12392/**
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012393 * sme_get_reg_info() - To get registration info
12394 * @hHal: HAL context
12395 * @chanId: channel id
12396 * @regInfo1: first reg info to fill
12397 * @regInfo2: second reg info to fill
12398 *
12399 * This routine will give you reg info
12400 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012401 * Return: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012402 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012403QDF_STATUS sme_get_reg_info(tHalHandle hHal, uint8_t chanId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012404 uint32_t *regInfo1, uint32_t *regInfo2)
12405{
12406 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012407 QDF_STATUS status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012408 uint8_t i;
12409 bool found = false;
12410
12411 status = sme_acquire_global_lock(&pMac->sme);
12412 *regInfo1 = 0;
12413 *regInfo2 = 0;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012414 if (!QDF_IS_STATUS_SUCCESS(status))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012415 return status;
12416
12417 for (i = 0; i < WNI_CFG_VALID_CHANNEL_LIST_LEN; i++) {
Amar Singhala297bfa2015-10-15 15:07:29 -070012418 if (pMac->scan.defaultPowerTable[i].chan_num == chanId) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012419 SME_SET_CHANNEL_REG_POWER(*regInfo1,
Amar Singhala297bfa2015-10-15 15:07:29 -070012420 pMac->scan.defaultPowerTable[i].power);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012421
12422 SME_SET_CHANNEL_MAX_TX_POWER(*regInfo2,
Amar Singhala297bfa2015-10-15 15:07:29 -070012423 pMac->scan.defaultPowerTable[i].power);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012424 found = true;
12425 break;
12426 }
12427 }
12428 if (!found)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012429 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012430
12431 sme_release_global_lock(&pMac->sme);
12432 return status;
12433}
12434
12435#ifdef FEATURE_WLAN_AUTO_SHUTDOWN
12436/* ---------------------------------------------------------------------------
12437 \fn sme_auto_shutdown_cb
12438 \brief Used to plug in callback function for receiving auto shutdown evt
12439 \param hHal
12440 \param pCallbackfn : callback function pointer should be plugged in
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012441 \- return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012442 -------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012443QDF_STATUS sme_set_auto_shutdown_cb(tHalHandle hHal, void (*pCallbackfn)(void)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012444 ) {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012445 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012446 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
12447
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053012448 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012449 "%s: Plug in Auto shutdown event callback", __func__);
12450
12451 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012452 if (QDF_STATUS_SUCCESS == status) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012453 if (NULL != pCallbackfn) {
12454 pMac->sme.pAutoShutdownNotificationCb = pCallbackfn;
12455 }
12456 sme_release_global_lock(&pMac->sme);
12457 }
12458
12459 return status;
12460}
12461
12462/* ---------------------------------------------------------------------------
12463 \fn sme_set_auto_shutdown_timer
12464 \API to set auto shutdown timer value in FW.
12465 \param hHal - The handle returned by mac_open
12466 \param timer_val - The auto shutdown timer value to be set
12467 \- return Configuration message posting status, SUCCESS or Fail
12468 -------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012469QDF_STATUS sme_set_auto_shutdown_timer(tHalHandle hHal, uint32_t timer_val)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012470{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012471 QDF_STATUS status = QDF_STATUS_SUCCESS;
12472 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012473 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
12474 tSirAutoShutdownCmdParams *auto_sh_cmd;
12475 cds_msg_t cds_message;
12476
12477 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012478 if (QDF_STATUS_SUCCESS == status) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012479 auto_sh_cmd = (tSirAutoShutdownCmdParams *)
Anurag Chouhan600c3a02016-03-01 10:33:54 +053012480 qdf_mem_malloc(sizeof(tSirAutoShutdownCmdParams));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012481 if (auto_sh_cmd == NULL) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053012482 QDF_TRACE(QDF_MODULE_ID_HDD, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012483 "%s Request Buffer Alloc Fail", __func__);
12484 sme_release_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012485 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012486 }
12487
12488 auto_sh_cmd->timer_val = timer_val;
12489
12490 /* serialize the req through MC thread */
12491 cds_message.bodyptr = auto_sh_cmd;
12492 cds_message.type = WMA_SET_AUTO_SHUTDOWN_TIMER_REQ;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012493 qdf_status = cds_mq_post_message(CDS_MQ_ID_WMA, &cds_message);
12494 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053012495 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012496 "%s: Post Auto shutdown MSG fail", __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053012497 qdf_mem_free(auto_sh_cmd);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012498 sme_release_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012499 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012500 }
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053012501 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012502 "%s: Posted Auto shutdown MSG", __func__);
12503 sme_release_global_lock(&pMac->sme);
12504 }
12505
12506 return status;
12507}
12508#endif
12509
12510#ifdef FEATURE_WLAN_CH_AVOID
12511/* ---------------------------------------------------------------------------
12512 \fn sme_add_ch_avoid_callback
12513 \brief Used to plug in callback function
12514 Which notify channel may not be used with SAP or P2PGO mode.
12515 Notification come from FW.
12516 \param hHal
12517 \param pCallbackfn : callback function pointer should be plugged in
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012518 \- return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012519 -------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012520QDF_STATUS sme_add_ch_avoid_callback
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012521 (tHalHandle hHal, void (*pCallbackfn)(void *pAdapter, void *indParam)
12522 ) {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012523 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012524 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
12525
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053012526 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012527 "%s: Plug in CH AVOID CB", __func__);
12528
12529 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012530 if (QDF_STATUS_SUCCESS == status) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012531 if (NULL != pCallbackfn) {
12532 pMac->sme.pChAvoidNotificationCb = pCallbackfn;
12533 }
12534 sme_release_global_lock(&pMac->sme);
12535 }
12536
12537 return status;
12538}
12539
12540/* ---------------------------------------------------------------------------
12541 \fn sme_ch_avoid_update_req
12542 \API to request channel avoidance update from FW.
12543 \param hHal - The handle returned by mac_open
12544 \param update_type - The udpate_type parameter of this request call
12545 \- return Configuration message posting status, SUCCESS or Fail
12546 -------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012547QDF_STATUS sme_ch_avoid_update_req(tHalHandle hHal)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012548{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012549 QDF_STATUS status = QDF_STATUS_SUCCESS;
12550 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012551 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
12552 tSirChAvoidUpdateReq *cauReq;
12553 cds_msg_t cds_message;
12554
12555 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012556 if (QDF_STATUS_SUCCESS == status) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012557 cauReq = (tSirChAvoidUpdateReq *)
Anurag Chouhan600c3a02016-03-01 10:33:54 +053012558 qdf_mem_malloc(sizeof(tSirChAvoidUpdateReq));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012559 if (NULL == cauReq) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053012560 QDF_TRACE(QDF_MODULE_ID_HDD, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012561 "%s Request Buffer Alloc Fail", __func__);
12562 sme_release_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012563 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012564 }
12565
12566 cauReq->reserved_param = 0;
12567
12568 /* serialize the req through MC thread */
12569 cds_message.bodyptr = cauReq;
12570 cds_message.type = WMA_CH_AVOID_UPDATE_REQ;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012571 qdf_status = cds_mq_post_message(CDS_MQ_ID_WMA, &cds_message);
12572 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053012573 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012574 "%s: Post Ch Avoid Update MSG fail",
12575 __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053012576 qdf_mem_free(cauReq);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012577 sme_release_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012578 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012579 }
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053012580 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012581 "%s: Posted Ch Avoid Update MSG", __func__);
12582 sme_release_global_lock(&pMac->sme);
12583 }
12584
12585 return status;
12586}
12587#endif /* FEATURE_WLAN_CH_AVOID */
12588
12589/**
12590 * sme_set_miracast() - Function to set miracast value to UMAC
12591 * @hal: Handle returned by macOpen
12592 * @filter_type: 0-Disabled, 1-Source, 2-sink
12593 *
12594 * This function passes down the value of miracast set by
12595 * framework to UMAC
12596 *
12597 * Return: Configuration message posting status, SUCCESS or Fail
12598 *
12599 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012600QDF_STATUS sme_set_miracast(tHalHandle hal, uint8_t filter_type)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012601{
12602 cds_msg_t msg;
12603 uint32_t *val;
12604 tpAniSirGlobal mac_ptr = PMAC_STRUCT(hal);
12605
Anurag Chouhan600c3a02016-03-01 10:33:54 +053012606 val = qdf_mem_malloc(sizeof(*val));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012607 if (NULL == val || NULL == mac_ptr) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053012608 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012609 "%s: Invalid pointer", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012610 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012611 }
12612
12613 *val = filter_type;
12614
12615 msg.type = SIR_HAL_SET_MIRACAST;
12616 msg.reserved = 0;
12617 msg.bodyptr = val;
12618
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012619 if (!QDF_IS_STATUS_SUCCESS(
Anurag Chouhan6d760662016-02-20 16:05:43 +053012620 cds_mq_post_message(QDF_MODULE_ID_WMA, &msg))) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053012621 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012622 "%s: Not able to post WDA_SET_MAS_ENABLE_DISABLE to WMA!",
12623 __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053012624 qdf_mem_free(val);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012625 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012626 }
12627
12628 mac_ptr->sme.miracast_value = filter_type;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012629 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012630}
12631
12632/**
12633 * sme_set_mas() - Function to set MAS value to UMAC
12634 * @val: 1-Enable, 0-Disable
12635 *
12636 * This function passes down the value of MAS to the UMAC. A
12637 * value of 1 will enable MAS and a value of 0 will disable MAS
12638 *
12639 * Return: Configuration message posting status, SUCCESS or Fail
12640 *
12641 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012642QDF_STATUS sme_set_mas(uint32_t val)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012643{
12644 cds_msg_t msg;
12645 uint32_t *ptr_val;
12646
Anurag Chouhan600c3a02016-03-01 10:33:54 +053012647 ptr_val = qdf_mem_malloc(sizeof(*ptr_val));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012648 if (NULL == ptr_val) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053012649 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012650 "%s: could not allocate ptr_val", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012651 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012652 }
12653
12654 *ptr_val = val;
12655
12656 msg.type = SIR_HAL_SET_MAS;
12657 msg.reserved = 0;
12658 msg.bodyptr = ptr_val;
12659
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012660 if (!QDF_IS_STATUS_SUCCESS(
Anurag Chouhan6d760662016-02-20 16:05:43 +053012661 cds_mq_post_message(QDF_MODULE_ID_WMA, &msg))) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053012662 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012663 "%s: Not able to post WDA_SET_MAS_ENABLE_DISABLE to WMA!",
12664 __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053012665 qdf_mem_free(ptr_val);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012666 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012667 }
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012668 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012669}
12670
Kiran Kumar Lokere999e58c2016-01-07 02:18:39 -080012671/**
12672 * sme_roam_channel_change_req() - Channel change to new target channel
12673 * @hHal: handle returned by mac_open
12674 * @bssid: mac address of BSS
12675 * @ch_params: target channel information
12676 * @profile: CSR profile
12677 *
12678 * API to Indicate Channel change to new target channel
12679 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012680 * Return: QDF_STATUS
Kiran Kumar Lokere999e58c2016-01-07 02:18:39 -080012681 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012682QDF_STATUS sme_roam_channel_change_req(tHalHandle hHal,
Amar Singhale4f28ee2015-10-21 14:36:56 -070012683 struct qdf_mac_addr bssid,
12684 struct ch_params_s *ch_params,
12685 tCsrRoamProfile *profile)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012686{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012687 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012688 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012689
12690 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012691 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012692
Kiran Kumar Lokere999e58c2016-01-07 02:18:39 -080012693 status = csr_roam_channel_change_req(pMac, bssid, ch_params,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012694 profile);
12695 sme_release_global_lock(&pMac->sme);
12696 }
12697 return status;
12698}
12699
12700/* -------------------------------------------------------------------------
12701 \fn sme_process_channel_change_resp
12702 \brief API to Indicate Channel change response message to SAP.
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012703 \return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012704 ---------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012705QDF_STATUS sme_process_channel_change_resp(tpAniSirGlobal pMac,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012706 uint16_t msg_type, void *pMsgBuf)
12707{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012708 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012709 tCsrRoamInfo proam_info = { 0 };
12710 eCsrRoamResult roamResult;
12711 tpSwitchChannelParams pChnlParams = (tpSwitchChannelParams) pMsgBuf;
12712 uint32_t SessionId = pChnlParams->peSessionId;
12713
12714 proam_info.channelChangeRespEvent =
12715 (tSirChanChangeResponse *)
Anurag Chouhan600c3a02016-03-01 10:33:54 +053012716 qdf_mem_malloc(sizeof(tSirChanChangeResponse));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012717 if (NULL == proam_info.channelChangeRespEvent) {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012718 status = QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012719 sms_log(pMac, LOGE,
12720 "Channel Change Event Allocation Failed: %d\n", status);
12721 return status;
12722 }
12723 if (msg_type == eWNI_SME_CHANNEL_CHANGE_RSP) {
12724 proam_info.channelChangeRespEvent->sessionId = SessionId;
12725 proam_info.channelChangeRespEvent->newChannelNumber =
12726 pChnlParams->channelNumber;
12727 proam_info.channelChangeRespEvent->secondaryChannelOffset =
12728 pChnlParams->ch_width;
12729
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012730 if (pChnlParams->status == QDF_STATUS_SUCCESS) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053012731 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO_MED,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012732 "sapdfs: Received success eWNI_SME_CHANNEL_CHANGE_RSP for sessionId[%d]",
12733 SessionId);
12734 proam_info.channelChangeRespEvent->channelChangeStatus =
12735 1;
12736 roamResult = eCSR_ROAM_RESULT_CHANNEL_CHANGE_SUCCESS;
12737 } else {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053012738 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO_MED,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012739 "sapdfs: Received failure eWNI_SME_CHANNEL_CHANGE_RSP for sessionId[%d]",
12740 SessionId);
12741 proam_info.channelChangeRespEvent->channelChangeStatus =
12742 0;
12743 roamResult = eCSR_ROAM_RESULT_CHANNEL_CHANGE_FAILURE;
12744 }
12745
12746 csr_roam_call_callback(pMac, SessionId, &proam_info, 0,
12747 eCSR_ROAM_SET_CHANNEL_RSP, roamResult);
12748
12749 } else {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012750 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012751 sms_log(pMac, LOGE, "Invalid Channel Change Resp Message: %d\n",
12752 status);
12753 }
Anurag Chouhan600c3a02016-03-01 10:33:54 +053012754 qdf_mem_free(proam_info.channelChangeRespEvent);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012755
12756 return status;
12757}
12758
12759/* -------------------------------------------------------------------------
12760 \fn sme_roam_start_beacon_req
12761 \brief API to Indicate LIM to start Beacon Tx
12762 \after SAP CAC Wait is completed.
12763 \param hHal - The handle returned by mac_open
12764 \param sessionId - session ID
12765 \param dfsCacWaitStatus - CAC WAIT status flag
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012766 \return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012767 ---------------------------------------------------------------------------*/
Anurag Chouhan6d760662016-02-20 16:05:43 +053012768QDF_STATUS sme_roam_start_beacon_req(tHalHandle hHal, struct qdf_mac_addr bssid,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012769 uint8_t dfsCacWaitStatus)
12770{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012771 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012772 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
12773 status = sme_acquire_global_lock(&pMac->sme);
12774
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012775 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012776 status = csr_roam_start_beacon_req(pMac, bssid, dfsCacWaitStatus);
12777 sme_release_global_lock(&pMac->sme);
12778 }
12779 return status;
12780}
12781
Kiran Kumar Lokere999e58c2016-01-07 02:18:39 -080012782/**
12783 * sme_roam_csa_ie_request() - request CSA IE transmission from PE
12784 * @hHal: handle returned by mac_open
12785 * @bssid: SAP bssid
12786 * @targetChannel: target channel information
12787 * @csaIeReqd: CSA IE Request
12788 * @ch_params: channel information
12789 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012790 * Return: QDF_STATUS
Kiran Kumar Lokere999e58c2016-01-07 02:18:39 -080012791 */
Anurag Chouhan6d760662016-02-20 16:05:43 +053012792QDF_STATUS sme_roam_csa_ie_request(tHalHandle hHal, struct qdf_mac_addr bssid,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012793 uint8_t targetChannel, uint8_t csaIeReqd,
Amar Singhale4f28ee2015-10-21 14:36:56 -070012794 struct ch_params_s *ch_params)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012795{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012796 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012797 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
12798 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012799 if (QDF_IS_STATUS_SUCCESS(status)) {
Kiran Kumar Lokere999e58c2016-01-07 02:18:39 -080012800 status = csr_roam_send_chan_sw_ie_request(pMac, bssid,
12801 targetChannel, csaIeReqd, ch_params);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012802 sme_release_global_lock(&pMac->sme);
12803 }
12804 return status;
12805}
12806
12807/* ---------------------------------------------------------------------------
12808 \fn sme_init_thermal_info
12809 \brief SME API to initialize the thermal mitigation parameters
12810 \param hHal
12811 \param thermalParam : thermal mitigation parameters
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012812 \- return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012813 -------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012814QDF_STATUS sme_init_thermal_info(tHalHandle hHal, tSmeThermalParams thermalParam)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012815{
12816 t_thermal_mgmt *pWmaParam;
12817 cds_msg_t msg;
12818 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
12819
Anurag Chouhan600c3a02016-03-01 10:33:54 +053012820 pWmaParam = (t_thermal_mgmt *) qdf_mem_malloc(sizeof(t_thermal_mgmt));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012821 if (NULL == pWmaParam) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053012822 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012823 "%s: could not allocate tThermalMgmt", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012824 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012825 }
12826
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012827 pWmaParam->thermalMgmtEnabled = thermalParam.smeThermalMgmtEnabled;
12828 pWmaParam->throttlePeriod = thermalParam.smeThrottlePeriod;
Poddar, Siddarth83905022016-04-16 17:56:08 -070012829
12830 pWmaParam->throttle_duty_cycle_tbl[0] =
12831 thermalParam.sme_throttle_duty_cycle_tbl[0];
12832 pWmaParam->throttle_duty_cycle_tbl[1] =
12833 thermalParam.sme_throttle_duty_cycle_tbl[1];
12834 pWmaParam->throttle_duty_cycle_tbl[2] =
12835 thermalParam.sme_throttle_duty_cycle_tbl[2];
12836 pWmaParam->throttle_duty_cycle_tbl[3] =
12837 thermalParam.sme_throttle_duty_cycle_tbl[3];
12838
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012839 pWmaParam->thermalLevels[0].minTempThreshold =
12840 thermalParam.smeThermalLevels[0].smeMinTempThreshold;
12841 pWmaParam->thermalLevels[0].maxTempThreshold =
12842 thermalParam.smeThermalLevels[0].smeMaxTempThreshold;
12843 pWmaParam->thermalLevels[1].minTempThreshold =
12844 thermalParam.smeThermalLevels[1].smeMinTempThreshold;
12845 pWmaParam->thermalLevels[1].maxTempThreshold =
12846 thermalParam.smeThermalLevels[1].smeMaxTempThreshold;
12847 pWmaParam->thermalLevels[2].minTempThreshold =
12848 thermalParam.smeThermalLevels[2].smeMinTempThreshold;
12849 pWmaParam->thermalLevels[2].maxTempThreshold =
12850 thermalParam.smeThermalLevels[2].smeMaxTempThreshold;
12851 pWmaParam->thermalLevels[3].minTempThreshold =
12852 thermalParam.smeThermalLevels[3].smeMinTempThreshold;
12853 pWmaParam->thermalLevels[3].maxTempThreshold =
12854 thermalParam.smeThermalLevels[3].smeMaxTempThreshold;
12855
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012856 if (QDF_STATUS_SUCCESS == sme_acquire_global_lock(&pMac->sme)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012857 msg.type = WMA_INIT_THERMAL_INFO_CMD;
12858 msg.bodyptr = pWmaParam;
12859
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012860 if (!QDF_IS_STATUS_SUCCESS
Anurag Chouhan6d760662016-02-20 16:05:43 +053012861 (cds_mq_post_message(QDF_MODULE_ID_WMA, &msg))) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053012862 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012863 "%s: Not able to post WMA_SET_THERMAL_INFO_CMD to WMA!",
12864 __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053012865 qdf_mem_free(pWmaParam);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012866 sme_release_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012867 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012868 }
12869 sme_release_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012870 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012871 }
Anurag Chouhan600c3a02016-03-01 10:33:54 +053012872 qdf_mem_free(pWmaParam);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012873 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012874}
12875
12876/**
12877 * sme_add_set_thermal_level_callback() - Plug in set thermal level callback
12878 * @hal: Handle returned by macOpen
12879 * @callback: sme_set_thermal_level_callback
12880 *
12881 * Plug in set thermal level callback
12882 *
12883 * Return: none
12884 */
12885void sme_add_set_thermal_level_callback(tHalHandle hal,
12886 sme_set_thermal_level_callback callback)
12887{
12888 tpAniSirGlobal pMac = PMAC_STRUCT(hal);
12889
12890 pMac->sme.set_thermal_level_cb = callback;
12891}
12892
12893/**
12894 * sme_set_thermal_level() - SME API to set the thermal mitigation level
12895 * @hal: Handler to HAL
12896 * @level: Thermal mitigation level
12897 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012898 * Return: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012899 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012900QDF_STATUS sme_set_thermal_level(tHalHandle hal, uint8_t level)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012901{
12902 cds_msg_t msg;
12903 tpAniSirGlobal pMac = PMAC_STRUCT(hal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012904 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012905
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012906 if (QDF_STATUS_SUCCESS == sme_acquire_global_lock(&pMac->sme)) {
Anurag Chouhan600c3a02016-03-01 10:33:54 +053012907 qdf_mem_set(&msg, sizeof(msg), 0);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012908 msg.type = WMA_SET_THERMAL_LEVEL;
12909 msg.bodyval = level;
12910
Anurag Chouhan6d760662016-02-20 16:05:43 +053012911 qdf_status = cds_mq_post_message(QDF_MODULE_ID_WMA, &msg);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012912 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053012913 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012914 "%s: Not able to post WMA_SET_THERMAL_LEVEL to WMA!",
12915 __func__);
12916 sme_release_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012917 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012918 }
12919 sme_release_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012920 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012921 }
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012922 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012923}
12924
12925/* ---------------------------------------------------------------------------
12926 \fn sme_txpower_limit
12927 \brief SME API to set txpower limits
12928 \param hHal
12929 \param psmetx : power limits for 2g/5g
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012930 \- return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012931 -------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012932QDF_STATUS sme_txpower_limit(tHalHandle hHal, tSirTxPowerLimit *psmetx)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012933{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012934 QDF_STATUS status = QDF_STATUS_SUCCESS;
12935 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012936 cds_msg_t cds_message;
12937 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Prashanth Bhatta75fa9a12016-01-11 18:30:08 -080012938 tSirTxPowerLimit *tx_power_limit;
12939
Anurag Chouhan600c3a02016-03-01 10:33:54 +053012940 tx_power_limit = qdf_mem_malloc(sizeof(*tx_power_limit));
Prashanth Bhatta75fa9a12016-01-11 18:30:08 -080012941 if (!tx_power_limit) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053012942 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prashanth Bhatta75fa9a12016-01-11 18:30:08 -080012943 "%s: Memory allocation for TxPowerLimit failed!",
12944 __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012945 return QDF_STATUS_E_FAILURE;
Prashanth Bhatta75fa9a12016-01-11 18:30:08 -080012946 }
12947
12948 *tx_power_limit = *psmetx;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012949
12950 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012951 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012952 cds_message.type = WMA_TX_POWER_LIMIT;
12953 cds_message.reserved = 0;
Prashanth Bhatta75fa9a12016-01-11 18:30:08 -080012954 cds_message.bodyptr = tx_power_limit;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012955
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012956 qdf_status = cds_mq_post_message(CDS_MQ_ID_WMA, &cds_message);
12957 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053012958 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012959 "%s: not able to post WMA_TX_POWER_LIMIT",
12960 __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012961 status = QDF_STATUS_E_FAILURE;
Anurag Chouhan600c3a02016-03-01 10:33:54 +053012962 qdf_mem_free(tx_power_limit);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012963 }
12964 sme_release_global_lock(&pMac->sme);
12965 }
12966 return status;
12967}
12968
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012969QDF_STATUS sme_update_connect_debug(tHalHandle hHal, uint32_t set_value)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012970{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012971 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012972 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
12973 pMac->fEnableDebugLog = set_value;
12974 return status;
12975}
12976
12977/* ---------------------------------------------------------------------------
12978 \fn sme_ap_disable_intra_bss_fwd
12979
12980 \brief
12981 SME will send message to WMA to set Intra BSS in txrx
12982
12983 \param
12984
12985 hHal - The handle returned by mac_open
12986
12987 sessionId - session id ( vdev id)
12988
12989 disablefwd - bool value that indicate disable intrabss fwd disable
12990
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012991 \return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012992 --------------------------------------------------------------------------- */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012993QDF_STATUS sme_ap_disable_intra_bss_fwd(tHalHandle hHal, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012994 bool disablefwd)
12995{
12996 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012997 int status = QDF_STATUS_SUCCESS;
12998 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012999 cds_msg_t cds_message;
13000 tpDisableIntraBssFwd pSapDisableIntraFwd = NULL;
13001
13002 /* Prepare the request to send to SME. */
Anurag Chouhan600c3a02016-03-01 10:33:54 +053013003 pSapDisableIntraFwd = qdf_mem_malloc(sizeof(tDisableIntraBssFwd));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013004 if (NULL == pSapDisableIntraFwd) {
13005 sms_log(pMac, LOGP, "Memory Allocation Failure!!! %s", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013006 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013007 }
13008
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013009 pSapDisableIntraFwd->sessionId = sessionId;
13010 pSapDisableIntraFwd->disableintrabssfwd = disablefwd;
13011
13012 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013013 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013014 /* serialize the req through MC thread */
13015 cds_message.bodyptr = pSapDisableIntraFwd;
13016 cds_message.type = WMA_SET_SAP_INTRABSS_DIS;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013017 qdf_status = cds_mq_post_message(CDS_MQ_ID_WMA, &cds_message);
13018 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
13019 status = QDF_STATUS_E_FAILURE;
Anurag Chouhan600c3a02016-03-01 10:33:54 +053013020 qdf_mem_free(pSapDisableIntraFwd);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013021 }
13022 sme_release_global_lock(&pMac->sme);
13023 }
13024 return status;
13025}
13026
13027#ifdef WLAN_FEATURE_STATS_EXT
13028
13029/******************************************************************************
13030 \fn sme_stats_ext_register_callback
13031
13032 \brief
13033 a function called to register the callback that send vendor event for stats
13034 ext
13035
13036 \param callback - callback to be registered
13037******************************************************************************/
13038void sme_stats_ext_register_callback(tHalHandle hHal, StatsExtCallback callback)
13039{
13040 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
13041
13042 pMac->sme.StatsExtCallback = callback;
13043}
13044
Arun Khandavalli4b55da72016-07-19 19:55:01 +053013045/**
13046 * sme_stats_ext_deregister_callback() - De-register ext stats callback
13047 * @h_hal: Hal Handle
13048 *
13049 * This function is called to de initialize the HDD NAN feature. Currently
13050 * the only operation required is to de-register a callback with SME.
13051 *
13052 * Return: None
13053 */
13054void sme_stats_ext_deregister_callback(tHalHandle h_hal)
13055{
13056 tpAniSirGlobal pmac;
13057
13058 if (!h_hal) {
13059 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
13060 FL("hHal is not valid"));
13061 return;
13062 }
13063
13064 pmac = PMAC_STRUCT(h_hal);
13065 pmac->sme.StatsExtCallback = NULL;
13066}
13067
13068
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013069/******************************************************************************
13070 \fn sme_stats_ext_request
13071
13072 \brief
13073 a function called when HDD receives STATS EXT vendor command from userspace
13074
13075 \param sessionID - vdevID for the stats ext request
13076
13077 \param input - Stats Ext Request structure ptr
13078
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013079 \return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013080******************************************************************************/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013081QDF_STATUS sme_stats_ext_request(uint8_t session_id, tpStatsExtRequestReq input)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013082{
13083 cds_msg_t msg;
13084 tpStatsExtRequest data;
13085 size_t data_len;
13086
13087 data_len = sizeof(tStatsExtRequest) + input->request_data_len;
Anurag Chouhan600c3a02016-03-01 10:33:54 +053013088 data = qdf_mem_malloc(data_len);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013089
13090 if (data == NULL) {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013091 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013092 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013093 data->vdev_id = session_id;
13094 data->request_data_len = input->request_data_len;
13095 if (input->request_data_len) {
Anurag Chouhan600c3a02016-03-01 10:33:54 +053013096 qdf_mem_copy(data->request_data,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013097 input->request_data, input->request_data_len);
13098 }
13099
13100 msg.type = WMA_STATS_EXT_REQUEST;
13101 msg.reserved = 0;
13102 msg.bodyptr = data;
13103
Anurag Chouhan6d760662016-02-20 16:05:43 +053013104 if (QDF_STATUS_SUCCESS != cds_mq_post_message(QDF_MODULE_ID_WMA, &msg)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053013105 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013106 "%s: Not able to post WMA_STATS_EXT_REQUEST message to WMA",
13107 __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053013108 qdf_mem_free(data);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013109 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013110 }
13111
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013112 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013113}
13114
13115/******************************************************************************
13116 \fn sme_stats_ext_event
13117
13118 \brief
13119 a callback function called when SME received eWNI_SME_STATS_EXT_EVENT
13120 response from WMA
13121
13122 \param hHal - HAL handle for device
13123 \param pMsg - Message body passed from WMA; includes NAN header
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013124 \return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013125******************************************************************************/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013126QDF_STATUS sme_stats_ext_event(tHalHandle hHal, void *pMsg)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013127{
13128 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013129 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013130
13131 if (NULL == pMsg) {
13132 sms_log(pMac, LOGE, "in %s msg ptr is NULL", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013133 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013134 } else {
13135 sms_log(pMac, LOG2, "SME: entering %s", __func__);
13136
13137 if (pMac->sme.StatsExtCallback) {
13138 pMac->sme.StatsExtCallback(pMac->hHdd,
13139 (tpStatsExtEvent) pMsg);
13140 }
13141 }
13142
13143 return status;
13144}
13145
13146#endif
13147
13148/* ---------------------------------------------------------------------------
13149 \fn sme_update_dfs_scan_mode
13150 \brief Update DFS roam scan mode
13151 This function is called through dynamic setConfig callback function
13152 to configure allowDFSChannelRoam.
13153 \param hHal - HAL handle for device
13154 \param sessionId - Session Identifier
13155 \param allowDFSChannelRoam - DFS roaming scan mode 0 (disable),
13156 1 (passive), 2 (active)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013157 \return QDF_STATUS_SUCCESS - SME update DFS roaming scan config
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013158 successfully.
13159 Other status means SME failed to update DFS roaming scan config.
13160 \sa
13161 -------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013162QDF_STATUS sme_update_dfs_scan_mode(tHalHandle hHal, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013163 uint8_t allowDFSChannelRoam)
13164{
13165 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013166 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013167
13168 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013169 if (QDF_IS_STATUS_SUCCESS(status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053013170 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013171 "LFR runtime successfully set AllowDFSChannelRoam Mode to "
13172 "%d - old value is %d - roam state is %s",
13173 allowDFSChannelRoam,
13174 pMac->roam.configParam.allowDFSChannelRoam,
13175 mac_trace_get_neighbour_roam_state(pMac->roam.
13176 neighborRoamInfo
13177 [sessionId].
13178 neighborRoamState));
13179 pMac->roam.configParam.allowDFSChannelRoam =
13180 allowDFSChannelRoam;
13181 sme_release_global_lock(&pMac->sme);
13182 }
13183 if (pMac->roam.configParam.isRoamOffloadScanEnabled) {
13184 csr_roam_offload_scan(pMac, sessionId,
13185 ROAM_SCAN_OFFLOAD_UPDATE_CFG,
13186 REASON_ROAM_DFS_SCAN_MODE_CHANGED);
13187 }
13188
13189 return status;
13190}
13191
13192/*--------------------------------------------------------------------------
13193 \brief sme_get_dfs_scan_mode() - get DFS roam scan mode
13194 This is a synchronous call
13195 \param hHal - The handle returned by mac_open.
13196 \return DFS roaming scan mode 0 (disable), 1 (passive), 2 (active)
13197 \sa
13198 --------------------------------------------------------------------------*/
13199uint8_t sme_get_dfs_scan_mode(tHalHandle hHal)
13200{
13201 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
13202 return pMac->roam.configParam.allowDFSChannelRoam;
13203}
13204
13205/*----------------------------------------------------------------------------
13206 \fn sme_modify_add_ie
13207 \brief This function sends msg to updates the additional IE buffers in PE
13208 \param hHal - global structure
13209 \param pModifyIE - pointer to tModifyIE structure
13210 \param updateType - type of buffer
13211 \- return Success or failure
13212 -----------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013213QDF_STATUS sme_modify_add_ie(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013214 tSirModifyIE *pModifyIE, eUpdateIEsType updateType)
13215{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013216 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013217 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
13218 status = sme_acquire_global_lock(&pMac->sme);
13219
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013220 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013221 status = csr_roam_modify_add_ies(pMac, pModifyIE, updateType);
13222 sme_release_global_lock(&pMac->sme);
13223 }
13224 return status;
13225}
13226
13227/*----------------------------------------------------------------------------
13228 \fn sme_update_add_ie
13229 \brief This function sends msg to updates the additional IE buffers in PE
13230 \param hHal - global structure
13231 \param pUpdateIE - pointer to structure tUpdateIE
13232 \param updateType - type of buffer
13233 \- return Success or failure
13234 -----------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013235QDF_STATUS sme_update_add_ie(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013236 tSirUpdateIE *pUpdateIE, eUpdateIEsType updateType)
13237{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013238 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013239 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
13240 status = sme_acquire_global_lock(&pMac->sme);
13241
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013242 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013243 status = csr_roam_update_add_ies(pMac, pUpdateIE, updateType);
13244 sme_release_global_lock(&pMac->sme);
13245 }
13246 return status;
13247}
13248
13249/* ---------------------------------------------------------------------------
13250 \fn sme_sta_in_middle_of_roaming
13251 \brief This function returns true if STA is in the middle of roaming state
13252 \param hHal - HAL handle for device
13253 \param sessionId - Session Identifier
13254 \- return true or false
13255 -------------------------------------------------------------------------*/
13256bool sme_sta_in_middle_of_roaming(tHalHandle hHal, uint8_t sessionId)
13257{
13258 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013259 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013260 bool ret = false;
13261
13262 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013263 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013264 ret = csr_neighbor_middle_of_roaming(hHal, sessionId);
13265 sme_release_global_lock(&pMac->sme);
13266 }
13267 return ret;
13268}
13269
13270
13271/**
13272 * sme_update_dsc_pto_up_mapping()
13273 * @hHal: HAL context
13274 * @dscpmapping: pointer to DSCP mapping structure
13275 * @sessionId: SME session id
13276 *
13277 * This routine is called to update dscp mapping
13278 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013279 * Return: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013280 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013281QDF_STATUS sme_update_dsc_pto_up_mapping(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013282 sme_QosWmmUpType *dscpmapping,
13283 uint8_t sessionId)
13284{
13285 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013286 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013287 uint8_t i, j, peSessionId;
13288 tCsrRoamSession *pCsrSession = NULL;
13289 tpPESession pSession = NULL;
13290
13291 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013292 if (!QDF_IS_STATUS_SUCCESS(status))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013293 return status;
13294 pCsrSession = CSR_GET_SESSION(pMac, sessionId);
13295 if (pCsrSession == NULL) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053013296 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013297 FL("Session lookup fails for CSR session"));
13298 sme_release_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013299 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013300 }
13301 if (!CSR_IS_SESSION_VALID(pMac, sessionId)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053013302 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013303 FL("Invalid session Id %u"), sessionId);
13304 sme_release_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013305 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013306 }
13307
13308 pSession = pe_find_session_by_bssid(pMac,
13309 pCsrSession->connectedProfile.bssid.bytes,
13310 &peSessionId);
13311
13312 if (pSession == NULL) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053013313 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013314 FL(" Session lookup fails for BSSID"));
13315 sme_release_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013316 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013317 }
13318
13319 if (!pSession->QosMapSet.present) {
Anurag Chouhan05d124f2016-09-03 16:21:50 +053013320 hdd_notice("QOS Mapping IE not present");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013321 sme_release_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013322 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013323 }
13324 for (i = 0; i < SME_QOS_WMM_UP_MAX; i++) {
13325 for (j = pSession->QosMapSet.dscp_range[i][0];
13326 j <= pSession->QosMapSet.dscp_range[i][1];
13327 j++) {
13328 if ((pSession->QosMapSet.dscp_range[i][0] == 255)
13329 && (pSession->QosMapSet.dscp_range[i][1] ==
13330 255)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053013331 QDF_TRACE(QDF_MODULE_ID_SME,
13332 QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013333 FL("User Priority %d isn't used"), i);
13334 break;
13335 } else {
13336 dscpmapping[j] = i;
13337 }
13338 }
13339 }
13340 for (i = 0; i < pSession->QosMapSet.num_dscp_exceptions; i++)
13341 if (pSession->QosMapSet.dscp_exceptions[i][0] != 255)
13342 dscpmapping[pSession->QosMapSet.dscp_exceptions[i][0]] =
13343 pSession->QosMapSet.dscp_exceptions[i][1];
13344
13345 sme_release_global_lock(&pMac->sme);
13346 return status;
13347}
13348
13349/* ---------------------------------------------------------------------------
13350 \fn sme_abort_roam_scan
13351 \brief API to abort current roam scan cycle by roam scan offload module.
13352 \param hHal - The handle returned by mac_open.
13353 \param sessionId - Session Identifier
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013354 \return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013355 ---------------------------------------------------------------------------*/
13356
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013357QDF_STATUS sme_abort_roam_scan(tHalHandle hHal, uint8_t sessionId)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013358{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013359 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013360 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
13361
13362 sms_log(pMac, LOGW, "entering function %s", __func__);
13363 if (pMac->roam.configParam.isRoamOffloadScanEnabled) {
13364 /* acquire the lock for the sme object */
13365 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013366 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013367 csr_roam_offload_scan(pMac, sessionId,
13368 ROAM_SCAN_OFFLOAD_ABORT_SCAN,
13369 REASON_ROAM_ABORT_ROAM_SCAN);
13370 /* release the lock for the sme object */
13371 sme_release_global_lock(&pMac->sme);
13372 }
13373 }
13374
13375 return status;
13376}
13377
13378#ifdef FEATURE_WLAN_EXTSCAN
13379/**
13380 * sme_get_valid_channels_by_band() - to fetch valid channels filtered by band
13381 * @hHal: HAL context
13382 * @wifiBand: RF band information
13383 * @aValidChannels: output array to store channel info
13384 * @pNumChannels: output number of channels
13385 *
13386 * SME API to fetch all valid channels filtered by band
13387 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013388 * Return: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013389 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013390QDF_STATUS sme_get_valid_channels_by_band(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013391 uint8_t wifiBand,
13392 uint32_t *aValidChannels,
13393 uint8_t *pNumChannels)
13394{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013395 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013396 uint8_t chanList[WNI_CFG_VALID_CHANNEL_LIST_LEN] = { 0 };
13397 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
13398 uint8_t numChannels = 0;
13399 uint8_t i = 0;
13400 uint32_t totValidChannels = WNI_CFG_VALID_CHANNEL_LIST_LEN;
13401
13402 if (!aValidChannels || !pNumChannels) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053013403 sms_log(pMac, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013404 FL("Output channel list/NumChannels is NULL"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013405 return QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013406 }
13407
13408 if ((wifiBand < WIFI_BAND_UNSPECIFIED) || (wifiBand >= WIFI_BAND_MAX)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053013409 sms_log(pMac, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013410 FL("Invalid wifiBand (%d)"), wifiBand);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013411 return QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013412 }
13413
13414 status = sme_get_cfg_valid_channels(hHal, &chanList[0],
13415 &totValidChannels);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013416 if (!QDF_IS_STATUS_SUCCESS(status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053013417 sms_log(pMac, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013418 FL("Fail to get valid channel list (err=%d)"), status);
13419 return status;
13420 }
13421
13422 switch (wifiBand) {
13423 case WIFI_BAND_UNSPECIFIED:
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053013424 sms_log(pMac, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013425 FL("Unspec Band, return all (%d) valid channels"),
13426 totValidChannels);
13427 numChannels = totValidChannels;
13428 for (i = 0; i < totValidChannels; i++) {
13429 aValidChannels[i] = cds_chan_to_freq(chanList[i]);
13430 }
13431 break;
13432
13433 case WIFI_BAND_BG:
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053013434 sms_log(pMac, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013435 FL("WIFI_BAND_BG (2.4 GHz)"));
13436 for (i = 0; i < totValidChannels; i++) {
13437 if (CDS_IS_CHANNEL_24GHZ(chanList[i])) {
13438 aValidChannels[numChannels++] =
13439 cds_chan_to_freq(chanList[i]);
13440 }
13441 }
13442 break;
13443
13444 case WIFI_BAND_A:
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053013445 sms_log(pMac, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013446 FL("WIFI_BAND_A (5 GHz without DFS)"));
13447 for (i = 0; i < totValidChannels; i++) {
13448 if (CDS_IS_CHANNEL_5GHZ(chanList[i]) &&
13449 !CDS_IS_DFS_CH(chanList[i])) {
13450 aValidChannels[numChannels++] =
13451 cds_chan_to_freq(chanList[i]);
13452 }
13453 }
13454 break;
13455
13456 case WIFI_BAND_ABG:
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053013457 sms_log(pMac, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013458 FL("WIFI_BAND_ABG (2.4 GHz + 5 GHz; no DFS)"));
13459 for (i = 0; i < totValidChannels; i++) {
13460 if ((CDS_IS_CHANNEL_24GHZ(chanList[i]) ||
13461 CDS_IS_CHANNEL_5GHZ(chanList[i])) &&
13462 !CDS_IS_DFS_CH(chanList[i])) {
13463 aValidChannels[numChannels++] =
13464 cds_chan_to_freq(chanList[i]);
13465 }
13466 }
13467 break;
13468
13469 case WIFI_BAND_A_DFS_ONLY:
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053013470 sms_log(pMac, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013471 FL("WIFI_BAND_A_DFS (5 GHz DFS only)"));
13472 for (i = 0; i < totValidChannels; i++) {
13473 if (CDS_IS_CHANNEL_5GHZ(chanList[i]) &&
13474 CDS_IS_DFS_CH(chanList[i])) {
13475 aValidChannels[numChannels++] =
13476 cds_chan_to_freq(chanList[i]);
13477 }
13478 }
13479 break;
13480
13481 case WIFI_BAND_A_WITH_DFS:
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053013482 sms_log(pMac, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013483 FL("WIFI_BAND_A_WITH_DFS (5 GHz with DFS)"));
13484 for (i = 0; i < totValidChannels; i++) {
13485 if (CDS_IS_CHANNEL_5GHZ(chanList[i])) {
13486 aValidChannels[numChannels++] =
13487 cds_chan_to_freq(chanList[i]);
13488 }
13489 }
13490 break;
13491
13492 case WIFI_BAND_ABG_WITH_DFS:
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053013493 sms_log(pMac, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013494 FL("WIFI_BAND_ABG_WITH_DFS (2.4 GHz+5 GHz with DFS)"));
13495 for (i = 0; i < totValidChannels; i++) {
13496 if (CDS_IS_CHANNEL_24GHZ(chanList[i]) ||
13497 CDS_IS_CHANNEL_5GHZ(chanList[i])) {
13498 aValidChannels[numChannels++] =
13499 cds_chan_to_freq(chanList[i]);
13500 }
13501 }
13502 break;
13503
13504 default:
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053013505 sms_log(pMac, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013506 FL("Unknown wifiBand (%d))"), wifiBand);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013507 return QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013508 break;
13509 }
13510 *pNumChannels = numChannels;
13511
13512 return status;
13513}
13514
13515/* ---------------------------------------------------------------------------
13516 \fn sme_ext_scan_get_capabilities
13517 \brief SME API to fetch extscan capabilities
13518 \param hHal
13519 \param pReq: extscan capabilities structure
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013520 \- return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013521 -------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013522QDF_STATUS sme_ext_scan_get_capabilities(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013523 tSirGetExtScanCapabilitiesReqParams *
13524 pReq)
13525{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013526 QDF_STATUS status = QDF_STATUS_SUCCESS;
13527 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013528 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
13529 cds_msg_t cds_message;
13530
13531 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013532 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013533 /* Serialize the req through MC thread */
13534 cds_message.bodyptr = pReq;
13535 cds_message.type = WMA_EXTSCAN_GET_CAPABILITIES_REQ;
Sreelakshmi Konamki6a065362016-05-31 16:05:01 +053013536 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
13537 NO_SESSION, cds_message.type));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013538 qdf_status = cds_mq_post_message(CDS_MQ_ID_WMA, &cds_message);
13539 if (!QDF_IS_STATUS_SUCCESS(qdf_status))
13540 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013541
13542 sme_release_global_lock(&pMac->sme);
13543 }
13544 return status;
13545}
13546
13547/* ---------------------------------------------------------------------------
13548 \fn sme_ext_scan_start
13549 \brief SME API to issue extscan start
13550 \param hHal
13551 \param pStartCmd: extscan start structure
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013552 \- return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013553 -------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013554QDF_STATUS sme_ext_scan_start(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013555 tSirWifiScanCmdReqParams *pStartCmd)
13556{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013557 QDF_STATUS status = QDF_STATUS_SUCCESS;
13558 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013559 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
13560 cds_msg_t cds_message;
13561
13562 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013563 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013564 /* Serialize the req through MC thread */
13565 cds_message.bodyptr = pStartCmd;
13566 cds_message.type = WMA_EXTSCAN_START_REQ;
Sreelakshmi Konamki6a065362016-05-31 16:05:01 +053013567 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
13568 NO_SESSION, cds_message.type));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013569 qdf_status = cds_mq_post_message(CDS_MQ_ID_WMA, &cds_message);
13570 if (!QDF_IS_STATUS_SUCCESS(qdf_status))
13571 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013572
13573 sme_release_global_lock(&pMac->sme);
13574 }
13575 return status;
13576}
13577
13578/* ---------------------------------------------------------------------------
13579 \fn sme_ext_scan_stop
13580 \brief SME API to issue extscan stop
13581 \param hHal
13582 \param pStopReq: extscan stop structure
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013583 \- return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013584 -------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013585QDF_STATUS sme_ext_scan_stop(tHalHandle hHal, tSirExtScanStopReqParams *pStopReq)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013586{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013587 QDF_STATUS status = QDF_STATUS_SUCCESS;
13588 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013589 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
13590 cds_msg_t cds_message;
13591
13592 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013593 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013594 /* Serialize the req through MC thread */
13595 cds_message.bodyptr = pStopReq;
13596 cds_message.type = WMA_EXTSCAN_STOP_REQ;
Sreelakshmi Konamki6a065362016-05-31 16:05:01 +053013597 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
13598 NO_SESSION, cds_message.type));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013599 qdf_status = cds_mq_post_message(CDS_MQ_ID_WMA, &cds_message);
13600 if (!QDF_IS_STATUS_SUCCESS(qdf_status))
13601 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013602 sme_release_global_lock(&pMac->sme);
13603 }
13604 return status;
13605}
13606
13607/* ---------------------------------------------------------------------------
13608 \fn sme_set_bss_hotlist
13609 \brief SME API to set BSSID hotlist
13610 \param hHal
13611 \param pSetHotListReq: extscan set hotlist structure
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013612 \- return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013613 -------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013614QDF_STATUS sme_set_bss_hotlist(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013615 tSirExtScanSetBssidHotListReqParams *
13616 pSetHotListReq)
13617{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013618 QDF_STATUS status = QDF_STATUS_SUCCESS;
13619 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013620 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
13621 cds_msg_t cds_message;
13622
13623 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013624 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013625 /* Serialize the req through MC thread */
13626 cds_message.bodyptr = pSetHotListReq;
13627 cds_message.type = WMA_EXTSCAN_SET_BSSID_HOTLIST_REQ;
Sreelakshmi Konamki6a065362016-05-31 16:05:01 +053013628 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
13629 NO_SESSION, cds_message.type));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013630 qdf_status = cds_mq_post_message(CDS_MQ_ID_WMA, &cds_message);
13631 if (!QDF_IS_STATUS_SUCCESS(qdf_status))
13632 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013633
13634 sme_release_global_lock(&pMac->sme);
13635 }
13636 return status;
13637}
13638
13639/* ---------------------------------------------------------------------------
13640 \fn sme_reset_bss_hotlist
13641 \brief SME API to reset BSSID hotlist
13642 \param hHal
13643 \param pSetHotListReq: extscan set hotlist structure
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013644 \- return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013645 -------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013646QDF_STATUS sme_reset_bss_hotlist(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013647 tSirExtScanResetBssidHotlistReqParams *
13648 pResetReq)
13649{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013650 QDF_STATUS status = QDF_STATUS_SUCCESS;
13651 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013652 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
13653 cds_msg_t cds_message;
13654
13655 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013656 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013657 /* Serialize the req through MC thread */
13658 cds_message.bodyptr = pResetReq;
13659 cds_message.type = WMA_EXTSCAN_RESET_BSSID_HOTLIST_REQ;
Sreelakshmi Konamki6a065362016-05-31 16:05:01 +053013660 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
13661 NO_SESSION, cds_message.type));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013662 qdf_status = cds_mq_post_message(CDS_MQ_ID_WMA, &cds_message);
13663 if (!QDF_IS_STATUS_SUCCESS(qdf_status))
13664 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013665
13666 sme_release_global_lock(&pMac->sme);
13667 }
13668 return status;
13669}
13670
Manikandan Mohan80dea792016-04-28 16:36:48 -070013671/**
13672 * sme_send_wisa_params(): Pass WISA mode to WMA
13673 * @hal: HAL context
13674 * @wisa_params: pointer to WISA params struct
13675 * @sessionId: SME session id
13676 *
13677 * Pass WISA params to WMA
13678 *
13679 * Return: QDF_STATUS
13680 */
13681QDF_STATUS sme_set_wisa_params(tHalHandle hal,
13682 struct sir_wisa_params *wisa_params)
13683{
13684 QDF_STATUS status = QDF_STATUS_SUCCESS;
13685 tpAniSirGlobal mac = PMAC_STRUCT(hal);
13686 cds_msg_t cds_message;
13687 struct sir_wisa_params *cds_msg_wisa_params;
13688
13689 cds_msg_wisa_params = qdf_mem_malloc(sizeof(struct sir_wisa_params));
13690 if (!cds_msg_wisa_params)
13691 return QDF_STATUS_E_NOMEM;
13692
13693 *cds_msg_wisa_params = *wisa_params;
13694 status = sme_acquire_global_lock(&mac->sme);
13695 if (QDF_IS_STATUS_SUCCESS(status)) {
13696 cds_message.bodyptr = cds_msg_wisa_params;
13697 cds_message.type = WMA_SET_WISA_PARAMS;
13698 status = cds_mq_post_message(CDS_MQ_ID_WMA, &cds_message);
13699 sme_release_global_lock(&mac->sme);
13700 }
13701 return status;
13702}
13703
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013704/* ---------------------------------------------------------------------------
13705 \fn sme_set_significant_change
13706 \brief SME API to set significant change
13707 \param hHal
13708 \param pSetSignificantChangeReq: extscan set significant change structure
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013709 \- return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013710 -------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013711QDF_STATUS sme_set_significant_change(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013712 tSirExtScanSetSigChangeReqParams *
13713 pSetSignificantChangeReq)
13714{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013715 QDF_STATUS status = QDF_STATUS_SUCCESS;
13716 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013717 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
13718 cds_msg_t cds_message;
13719
13720 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013721 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013722 /* Serialize the req through MC thread */
13723 cds_message.bodyptr = pSetSignificantChangeReq;
13724 cds_message.type = WMA_EXTSCAN_SET_SIGNF_CHANGE_REQ;
Sreelakshmi Konamki6a065362016-05-31 16:05:01 +053013725 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
13726 NO_SESSION, cds_message.type));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013727 qdf_status = cds_mq_post_message(CDS_MQ_ID_WMA, &cds_message);
13728 if (!QDF_IS_STATUS_SUCCESS(qdf_status))
13729 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013730
13731 sme_release_global_lock(&pMac->sme);
13732 }
13733 return status;
13734}
13735
13736/* ---------------------------------------------------------------------------
13737 \fn sme_reset_significant_change
13738 \brief SME API to reset significant change
13739 \param hHal
13740 \param pResetReq: extscan reset significant change structure
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013741 \- return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013742 -------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013743QDF_STATUS sme_reset_significant_change(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013744 tSirExtScanResetSignificantChangeReqParams
13745 *pResetReq)
13746{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013747 QDF_STATUS status = QDF_STATUS_SUCCESS;
13748 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013749 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
13750 cds_msg_t cds_message;
13751
13752 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013753 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013754 /* Serialize the req through MC thread */
13755 cds_message.bodyptr = pResetReq;
13756 cds_message.type = WMA_EXTSCAN_RESET_SIGNF_CHANGE_REQ;
Sreelakshmi Konamki6a065362016-05-31 16:05:01 +053013757 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
13758 NO_SESSION, cds_message.type));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013759 qdf_status = cds_mq_post_message(CDS_MQ_ID_WMA, &cds_message);
13760 if (!QDF_IS_STATUS_SUCCESS(qdf_status))
13761 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013762
13763 sme_release_global_lock(&pMac->sme);
13764 }
13765 return status;
13766}
13767
13768/* ---------------------------------------------------------------------------
13769 \fn sme_get_cached_results
13770 \brief SME API to get cached results
13771 \param hHal
13772 \param pCachedResultsReq: extscan get cached results structure
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013773 \- return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013774 -------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013775QDF_STATUS sme_get_cached_results(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013776 tSirExtScanGetCachedResultsReqParams *
13777 pCachedResultsReq)
13778{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013779 QDF_STATUS status = QDF_STATUS_SUCCESS;
13780 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013781 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
13782 cds_msg_t cds_message;
13783
13784 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013785 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013786 /* Serialize the req through MC thread */
13787 cds_message.bodyptr = pCachedResultsReq;
13788 cds_message.type = WMA_EXTSCAN_GET_CACHED_RESULTS_REQ;
Sreelakshmi Konamki6a065362016-05-31 16:05:01 +053013789 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
13790 NO_SESSION, cds_message.type));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013791 qdf_status = cds_mq_post_message(CDS_MQ_ID_WMA, &cds_message);
13792 if (!QDF_IS_STATUS_SUCCESS(qdf_status))
13793 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013794
13795 sme_release_global_lock(&pMac->sme);
13796 }
13797 return status;
13798}
13799
13800/**
13801 * sme_set_epno_list() - set epno network list
Deepak Dhamdhere0f076bd2016-06-02 11:29:21 -070013802 * @hal: global hal handle
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013803 * @input: request message
13804 *
13805 * This function constructs the cds message and fill in message type,
13806 * bodyptr with %input and posts it to WDA queue.
13807 *
Deepak Dhamdhere0f076bd2016-06-02 11:29:21 -070013808 * Return: QDF_STATUS enumeration
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013809 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013810QDF_STATUS sme_set_epno_list(tHalHandle hal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013811 struct wifi_epno_params *input)
13812{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013813 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013814 tpAniSirGlobal mac = PMAC_STRUCT(hal);
13815 cds_msg_t cds_message;
13816 struct wifi_epno_params *req_msg;
13817 int len, i;
13818
13819 sms_log(mac, LOG1, FL("enter"));
13820 len = sizeof(*req_msg) +
13821 (input->num_networks * sizeof(struct wifi_epno_network));
Mukul Sharmae8c919f2016-10-02 20:35:15 +053013822
Anurag Chouhan600c3a02016-03-01 10:33:54 +053013823 req_msg = qdf_mem_malloc(len);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013824 if (!req_msg) {
Anurag Chouhan600c3a02016-03-01 10:33:54 +053013825 sms_log(mac, LOGE, FL("qdf_mem_malloc failed"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013826 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013827 }
13828
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013829 req_msg->num_networks = input->num_networks;
13830 req_msg->request_id = input->request_id;
13831 req_msg->session_id = input->session_id;
Mukul Sharmae8c919f2016-10-02 20:35:15 +053013832
13833 /* Fill only when num_networks are non zero */
13834 if (req_msg->num_networks) {
13835 req_msg->min_5ghz_rssi = input->min_5ghz_rssi;
13836 req_msg->min_24ghz_rssi = input->min_24ghz_rssi;
13837 req_msg->initial_score_max = input->initial_score_max;
13838 req_msg->same_network_bonus = input->same_network_bonus;
13839 req_msg->secure_bonus = input->secure_bonus;
13840 req_msg->band_5ghz_bonus = input->band_5ghz_bonus;
13841 req_msg->current_connection_bonus =
13842 input->current_connection_bonus;
13843
13844 for (i = 0; i < req_msg->num_networks; i++) {
13845 req_msg->networks[i].flags = input->networks[i].flags;
13846 req_msg->networks[i].auth_bit_field =
13847 input->networks[i].auth_bit_field;
13848 req_msg->networks[i].ssid.length =
13849 input->networks[i].ssid.length;
13850 qdf_mem_copy(req_msg->networks[i].ssid.ssId,
13851 input->networks[i].ssid.ssId,
13852 req_msg->networks[i].ssid.length);
13853 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013854 }
13855
13856 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013857 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013858 sms_log(mac, LOGE,
13859 FL("sme_acquire_global_lock failed!(status=%d)"),
13860 status);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053013861 qdf_mem_free(req_msg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013862 return status;
13863 }
13864
13865 /* Serialize the req through MC thread */
13866 cds_message.bodyptr = req_msg;
13867 cds_message.type = WMA_SET_EPNO_LIST_REQ;
13868 status = cds_mq_post_message(CDS_MQ_ID_WMA, &cds_message);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013869 if (!QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013870 sms_log(mac, LOGE,
13871 FL("cds_mq_post_message failed!(err=%d)"),
13872 status);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053013873 qdf_mem_free(req_msg);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013874 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013875 }
13876 sme_release_global_lock(&mac->sme);
13877 return status;
13878}
13879
13880/**
13881 * sme_set_passpoint_list() - set passpoint network list
13882 * @hal: global hal handle
13883 * @input: request message
13884 *
13885 * This function constructs the cds message and fill in message type,
13886 * bodyptr with @input and posts it to WDA queue.
13887 *
Deepak Dhamdhere0f076bd2016-06-02 11:29:21 -070013888 * Return: QDF_STATUS enumeration
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013889 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013890QDF_STATUS sme_set_passpoint_list(tHalHandle hal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013891 struct wifi_passpoint_req *input)
13892{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013893 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013894 tpAniSirGlobal mac = PMAC_STRUCT(hal);
13895 cds_msg_t cds_message;
13896 struct wifi_passpoint_req *req_msg;
13897 int len, i;
13898
13899 sms_log(mac, LOG1, FL("enter"));
13900 len = sizeof(*req_msg) +
13901 (input->num_networks * sizeof(struct wifi_passpoint_network));
Anurag Chouhan600c3a02016-03-01 10:33:54 +053013902 req_msg = qdf_mem_malloc(len);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013903 if (!req_msg) {
Anurag Chouhan600c3a02016-03-01 10:33:54 +053013904 sms_log(mac, LOGE, FL("qdf_mem_malloc failed"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013905 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013906 }
13907
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013908 req_msg->num_networks = input->num_networks;
13909 req_msg->request_id = input->request_id;
13910 req_msg->session_id = input->session_id;
13911 for (i = 0; i < req_msg->num_networks; i++) {
13912 req_msg->networks[i].id =
13913 input->networks[i].id;
Anurag Chouhan600c3a02016-03-01 10:33:54 +053013914 qdf_mem_copy(req_msg->networks[i].realm,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013915 input->networks[i].realm,
13916 strlen(input->networks[i].realm) + 1);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053013917 qdf_mem_copy(req_msg->networks[i].plmn,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013918 input->networks[i].plmn,
13919 SIR_PASSPOINT_PLMN_LEN);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053013920 qdf_mem_copy(req_msg->networks[i].roaming_consortium_ids,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013921 input->networks[i].roaming_consortium_ids,
13922 sizeof(req_msg->networks[i].roaming_consortium_ids));
13923 }
13924
13925 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013926 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013927 sms_log(mac, LOGE,
13928 FL("sme_acquire_global_lock failed!(status=%d)"),
13929 status);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053013930 qdf_mem_free(req_msg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013931 return status;
13932 }
13933
13934 /* Serialize the req through MC thread */
13935 cds_message.bodyptr = req_msg;
13936 cds_message.type = WMA_SET_PASSPOINT_LIST_REQ;
13937 status = cds_mq_post_message(CDS_MQ_ID_WMA, &cds_message);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013938 if (!QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013939 sms_log(mac, LOGE,
13940 FL("cds_mq_post_message failed!(err=%d)"),
13941 status);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053013942 qdf_mem_free(req_msg);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013943 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013944 }
13945 sme_release_global_lock(&mac->sme);
13946 return status;
13947}
13948
13949/**
13950 * sme_reset_passpoint_list() - reset passpoint network list
13951 * @hHal: global hal handle
13952 * @input: request message
13953 *
Deepak Dhamdhere0f076bd2016-06-02 11:29:21 -070013954 * Return: QDF_STATUS enumeration
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013955 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013956QDF_STATUS sme_reset_passpoint_list(tHalHandle hal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013957 struct wifi_passpoint_req *input)
13958{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013959 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013960 tpAniSirGlobal mac = PMAC_STRUCT(hal);
13961 cds_msg_t cds_message;
13962 struct wifi_passpoint_req *req_msg;
13963
13964 sms_log(mac, LOG1, FL("enter"));
Anurag Chouhan600c3a02016-03-01 10:33:54 +053013965 req_msg = qdf_mem_malloc(sizeof(*req_msg));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013966 if (!req_msg) {
Anurag Chouhan600c3a02016-03-01 10:33:54 +053013967 sms_log(mac, LOGE, FL("qdf_mem_malloc failed"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013968 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013969 }
13970
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013971 req_msg->request_id = input->request_id;
13972 req_msg->session_id = input->session_id;
13973
13974 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013975 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013976 sms_log(mac, LOGE,
13977 FL("sme_acquire_global_lock failed!(status=%d)"),
13978 status);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053013979 qdf_mem_free(req_msg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013980 return status;
13981 }
13982
13983 /* Serialize the req through MC thread */
13984 cds_message.bodyptr = req_msg;
13985 cds_message.type = WMA_RESET_PASSPOINT_LIST_REQ;
13986 status = cds_mq_post_message(CDS_MQ_ID_WMA, &cds_message);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013987 if (!QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013988 sms_log(mac, LOGE,
13989 FL("cds_mq_post_message failed!(err=%d)"),
13990 status);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053013991 qdf_mem_free(req_msg);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013992 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013993 }
13994 sme_release_global_lock(&mac->sme);
13995 return status;
13996}
13997
13998/**
13999 * sme_set_ssid_hotlist() - Set the SSID hotlist
14000 * @hal: SME handle
14001 * @request: set ssid hotlist request
14002 *
Deepak Dhamdhere0f076bd2016-06-02 11:29:21 -070014003 * Return: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014004 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014005QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014006sme_set_ssid_hotlist(tHalHandle hal,
14007 struct sir_set_ssid_hotlist_request *request)
14008{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014009 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014010 tpAniSirGlobal mac = PMAC_STRUCT(hal);
14011 cds_msg_t cds_message;
14012 struct sir_set_ssid_hotlist_request *set_req;
14013
Anurag Chouhan600c3a02016-03-01 10:33:54 +053014014 set_req = qdf_mem_malloc(sizeof(*set_req));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014015 if (!set_req) {
Anurag Chouhan600c3a02016-03-01 10:33:54 +053014016 sms_log(mac, LOGE, FL("qdf_mem_malloc failed"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014017 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014018 }
14019
14020 *set_req = *request;
14021 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014022 if (QDF_STATUS_SUCCESS == status) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014023 /* Serialize the req through MC thread */
14024 cds_message.bodyptr = set_req;
14025 cds_message.type = WMA_EXTSCAN_SET_SSID_HOTLIST_REQ;
14026 status = cds_mq_post_message(CDS_MQ_ID_WMA, &cds_message);
14027 sme_release_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014028 if (!QDF_IS_STATUS_SUCCESS(status)) {
Anurag Chouhan600c3a02016-03-01 10:33:54 +053014029 qdf_mem_free(set_req);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014030 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014031 }
14032 } else {
14033 sms_log(mac, LOGE,
14034 FL("sme_acquire_global_lock failed!(status=%d)"),
14035 status);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053014036 qdf_mem_free(set_req);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014037 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014038 }
14039 return status;
14040}
14041
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014042QDF_STATUS sme_ext_scan_register_callback(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014043 void (*pExtScanIndCb)(void *,
14044 const uint16_t,
14045 void *))
14046{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014047 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014048 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
14049
14050 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014051 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014052 pMac->sme.pExtScanIndCb = pExtScanIndCb;
14053 sme_release_global_lock(&pMac->sme);
14054 }
14055 return status;
14056}
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014057#endif /* FEATURE_WLAN_EXTSCAN */
14058
14059#ifdef WLAN_FEATURE_LINK_LAYER_STATS
14060
14061/* ---------------------------------------------------------------------------
14062 \fn sme_ll_stats_clear_req
14063 \brief SME API to clear Link Layer Statistics
14064 \param hHal
14065 \param pclearStatsReq: Link Layer clear stats request params structure
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014066 \- return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014067 -------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014068QDF_STATUS sme_ll_stats_clear_req(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014069 tSirLLStatsClearReq *pclearStatsReq)
14070{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014071 QDF_STATUS status = QDF_STATUS_SUCCESS;
14072 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014073 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
14074 cds_msg_t cds_message;
14075 tSirLLStatsClearReq *clear_stats_req;
14076
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053014077 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014078 "staId = %u", pclearStatsReq->staId);
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053014079 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014080 "statsClearReqMask = 0x%X",
14081 pclearStatsReq->statsClearReqMask);
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053014082 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014083 "stopReq = %u", pclearStatsReq->stopReq);
14084
Anurag Chouhan600c3a02016-03-01 10:33:54 +053014085 clear_stats_req = qdf_mem_malloc(sizeof(*clear_stats_req));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014086
14087 if (!clear_stats_req) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053014088 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014089 "%s: Not able to allocate memory for WMA_LL_STATS_CLEAR_REQ",
14090 __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014091 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014092 }
14093
14094 *clear_stats_req = *pclearStatsReq;
14095
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014096 if (QDF_STATUS_SUCCESS == sme_acquire_global_lock(&pMac->sme)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014097 /* Serialize the req through MC thread */
14098 cds_message.bodyptr = clear_stats_req;
14099 cds_message.type = WMA_LINK_LAYER_STATS_CLEAR_REQ;
Sreelakshmi Konamki6a065362016-05-31 16:05:01 +053014100 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
14101 NO_SESSION, cds_message.type));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014102 qdf_status = cds_mq_post_message(CDS_MQ_ID_WMA, &cds_message);
14103 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053014104 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014105 "%s: not able to post WMA_LL_STATS_CLEAR_REQ",
14106 __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053014107 qdf_mem_free(clear_stats_req);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014108 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014109 }
14110 sme_release_global_lock(&pMac->sme);
14111 } else {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053014112 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR, "%s: "
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014113 "sme_acquire_global_lock error", __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053014114 qdf_mem_free(clear_stats_req);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014115 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014116 }
14117
14118 return status;
14119}
14120
14121/* ---------------------------------------------------------------------------
14122 \fn sme_ll_stats_set_req
14123 \brief SME API to set the Link Layer Statistics
14124 \param hHal
14125 \param psetStatsReq: Link Layer set stats request params structure
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014126 \- return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014127 -------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014128QDF_STATUS sme_ll_stats_set_req(tHalHandle hHal, tSirLLStatsSetReq *psetStatsReq)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014129{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014130 QDF_STATUS status = QDF_STATUS_SUCCESS;
14131 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014132 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
14133 cds_msg_t cds_message;
14134 tSirLLStatsSetReq *set_stats_req;
14135
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053014136 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014137 "%s: MPDU Size = %u", __func__,
14138 psetStatsReq->mpduSizeThreshold);
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053014139 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014140 " Aggressive Stats Collections = %u",
14141 psetStatsReq->aggressiveStatisticsGathering);
14142
Anurag Chouhan600c3a02016-03-01 10:33:54 +053014143 set_stats_req = qdf_mem_malloc(sizeof(*set_stats_req));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014144
14145 if (!set_stats_req) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053014146 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014147 "%s: Not able to allocate memory for WMA_LL_STATS_SET_REQ",
14148 __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014149 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014150 }
14151
14152 *set_stats_req = *psetStatsReq;
14153
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014154 if (QDF_STATUS_SUCCESS == sme_acquire_global_lock(&pMac->sme)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014155 /* Serialize the req through MC thread */
14156 cds_message.bodyptr = set_stats_req;
14157 cds_message.type = WMA_LINK_LAYER_STATS_SET_REQ;
Sreelakshmi Konamki6a065362016-05-31 16:05:01 +053014158 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
14159 NO_SESSION, cds_message.type));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014160 qdf_status = cds_mq_post_message(CDS_MQ_ID_WMA, &cds_message);
14161 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053014162 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014163 "%s: not able to post WMA_LL_STATS_SET_REQ",
14164 __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053014165 qdf_mem_free(set_stats_req);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014166 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014167 }
14168 sme_release_global_lock(&pMac->sme);
14169 } else {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053014170 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR, "%s: "
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014171 "sme_acquire_global_lock error", __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053014172 qdf_mem_free(set_stats_req);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014173 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014174 }
14175
14176 return status;
14177}
14178
14179/* ---------------------------------------------------------------------------
14180 \fn sme_ll_stats_get_req
14181 \brief SME API to get the Link Layer Statistics
14182 \param hHal
14183 \param pgetStatsReq: Link Layer get stats request params structure
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014184 \- return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014185 -------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014186QDF_STATUS sme_ll_stats_get_req(tHalHandle hHal, tSirLLStatsGetReq *pgetStatsReq)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014187{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014188 QDF_STATUS status = QDF_STATUS_SUCCESS;
14189 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014190 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
14191 cds_msg_t cds_message;
14192 tSirLLStatsGetReq *get_stats_req;
14193
Anurag Chouhan600c3a02016-03-01 10:33:54 +053014194 get_stats_req = qdf_mem_malloc(sizeof(*get_stats_req));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014195
14196 if (!get_stats_req) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053014197 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014198 "%s: Not able to allocate memory for WMA_LL_STATS_GET_REQ",
14199 __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014200 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014201 }
14202
14203 *get_stats_req = *pgetStatsReq;
14204
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014205 if (QDF_STATUS_SUCCESS == sme_acquire_global_lock(&pMac->sme)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014206 /* Serialize the req through MC thread */
14207 cds_message.bodyptr = get_stats_req;
14208 cds_message.type = WMA_LINK_LAYER_STATS_GET_REQ;
Sreelakshmi Konamki6a065362016-05-31 16:05:01 +053014209 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
14210 NO_SESSION, cds_message.type));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014211 qdf_status = cds_mq_post_message(CDS_MQ_ID_WMA, &cds_message);
14212 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053014213 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014214 "%s: not able to post WMA_LL_STATS_GET_REQ",
14215 __func__);
14216
Anurag Chouhan600c3a02016-03-01 10:33:54 +053014217 qdf_mem_free(get_stats_req);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014218 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014219
14220 }
14221 sme_release_global_lock(&pMac->sme);
14222 } else {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053014223 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR, "%s: "
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014224 "sme_acquire_global_lock error", __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053014225 qdf_mem_free(get_stats_req);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014226 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014227 }
14228
14229 return status;
14230}
14231
14232/* ---------------------------------------------------------------------------
14233 \fn sme_set_link_layer_stats_ind_cb
14234 \brief SME API to trigger the stats are available after get request
14235 \param hHal
14236 \param callback_routine - HDD callback which needs to be invoked after
14237 getting status notification from FW
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014238 \- return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014239 -------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014240QDF_STATUS sme_set_link_layer_stats_ind_cb
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014241 (tHalHandle hHal,
14242 void (*callback_routine)(void *callbackCtx, int indType, void *pRsp)
14243 ) {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014244 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014245 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
14246
14247 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014248 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014249 pMac->sme.pLinkLayerStatsIndCallback = callback_routine;
14250 sme_release_global_lock(&pMac->sme);
14251 } else {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053014252 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR, "%s: "
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014253 "sme_acquire_global_lock error", __func__);
14254 }
14255
14256 return status;
14257}
14258
Arun Khandavalli4b55da72016-07-19 19:55:01 +053014259/**
14260 * sme_reset_link_layer_stats_ind_cb() - SME API to reset link layer stats
14261 * indication
14262 * @h_hal: Hal Handle
14263 *
14264 * This function reset's the link layer stats indication
14265 *
14266 * Return: QDF_STATUS Enumeration
14267 */
14268
14269QDF_STATUS sme_reset_link_layer_stats_ind_cb(tHalHandle h_hal)
14270{
14271 QDF_STATUS status;
14272 tpAniSirGlobal pmac;
14273
14274 if (!h_hal) {
14275 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
14276 FL("hHal is not valid"));
14277 return QDF_STATUS_E_INVAL;
14278 }
14279 pmac = PMAC_STRUCT(h_hal);
14280
14281 status = sme_acquire_global_lock(&pmac->sme);
14282 if (QDF_IS_STATUS_SUCCESS(status)) {
14283 pmac->sme.pLinkLayerStatsIndCallback = NULL;
14284 sme_release_global_lock(&pmac->sme);
14285 } else {
14286 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR, "%s: sme_acquire_global_lock error",
14287 __func__);
14288 }
14289
14290 return status;
14291}
14292
14293
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014294#endif /* WLAN_FEATURE_LINK_LAYER_STATS */
14295
14296/**
14297 * sme_fw_mem_dump_register_cb() - Register fw memory dump callback
14298 *
14299 * @hal - MAC global handle
14300 * @callback_routine - callback routine from HDD
14301 *
14302 * This API is invoked by HDD to register its callback in SME
14303 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014304 * Return: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014305 */
14306#ifdef WLAN_FEATURE_MEMDUMP
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014307QDF_STATUS sme_fw_mem_dump_register_cb(tHalHandle hal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014308 void (*callback_routine)(void *cb_context,
14309 struct fw_dump_rsp *rsp))
14310{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014311 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014312 tpAniSirGlobal pmac = PMAC_STRUCT(hal);
14313
14314 status = sme_acquire_global_lock(&pmac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014315 if (QDF_STATUS_SUCCESS == status) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014316 pmac->sme.fw_dump_callback = callback_routine;
14317 sme_release_global_lock(&pmac->sme);
14318 } else {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053014319 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014320 FL("sme_acquire_global_lock error"));
14321 }
14322
14323 return status;
14324}
14325#else
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014326QDF_STATUS sme_fw_mem_dump_register_cb(tHalHandle hal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014327 void (*callback_routine)(void *cb_context,
14328 struct fw_dump_rsp *rsp))
14329{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014330 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014331}
14332#endif /* WLAN_FEATURE_MEMDUMP */
14333
14334/**
14335 * sme_fw_mem_dump_unregister_cb() - Unregister fw memory dump callback
14336 *
14337 * @hHal - MAC global handle
14338 *
14339 * This API is invoked by HDD to unregister its callback in SME
14340 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014341 * Return: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014342 */
14343#ifdef WLAN_FEATURE_MEMDUMP
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014344QDF_STATUS sme_fw_mem_dump_unregister_cb(tHalHandle hal)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014345{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014346 QDF_STATUS status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014347 tpAniSirGlobal pmac = PMAC_STRUCT(hal);
14348
14349 status = sme_acquire_global_lock(&pmac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014350 if (QDF_STATUS_SUCCESS == status) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014351 pmac->sme.fw_dump_callback = NULL;
14352 sme_release_global_lock(&pmac->sme);
14353 } else {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053014354 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014355 FL("sme_acquire_global_lock error"));
14356 }
14357
14358 return status;
14359}
14360#else
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014361QDF_STATUS sme_fw_mem_dump_unregister_cb(tHalHandle hal)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014362{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014363 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014364}
14365#endif /* WLAN_FEATURE_MEMDUMP */
14366
14367#ifdef WLAN_FEATURE_ROAM_OFFLOAD
14368/*--------------------------------------------------------------------------
14369 \brief sme_update_roam_offload_enabled() - enable/disable roam offload feaure
14370 It is used at in the REG_DYNAMIC_VARIABLE macro definition of
14371 \param hHal - The handle returned by mac_open.
14372 \param nRoamOffloadEnabled - The bool to update with
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014373 \return QDF_STATUS_SUCCESS - SME update config successfully.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014374 Other status means SME is failed to update.
14375 \sa
14376 --------------------------------------------------------------------------*/
14377
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014378QDF_STATUS sme_update_roam_offload_enabled(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014379 bool nRoamOffloadEnabled)
14380{
14381 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014382 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014383
14384 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014385 if (QDF_IS_STATUS_SUCCESS(status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053014386 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014387 "%s: LFR3:gRoamOffloadEnabled is changed from %d to %d",
14388 __func__, pMac->roam.configParam.isRoamOffloadEnabled,
14389 nRoamOffloadEnabled);
14390 pMac->roam.configParam.isRoamOffloadEnabled =
14391 nRoamOffloadEnabled;
14392 sme_release_global_lock(&pMac->sme);
14393 }
14394
14395 return status;
14396}
14397
Deepak Dhamdheref2a7d8b2016-08-19 16:17:38 -070014398/**
14399 * sme_update_roam_key_mgmt_offload_enabled() - enable/disable key mgmt offload
14400 * This is a synchronous call
14401 * @hal_ctx: The handle returned by mac_open.
14402 * @session_id: Session Identifier
14403 * @key_mgmt_offload_enabled: key mgmt enable/disable flag
14404 * @okc_enabled: Opportunistic key caching enable/disable flag
14405 * Return: QDF_STATUS_SUCCESS - SME updated config successfully.
14406 * Other status means SME is failed to update.
14407 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014408
Deepak Dhamdheref2a7d8b2016-08-19 16:17:38 -070014409QDF_STATUS sme_update_roam_key_mgmt_offload_enabled(tHalHandle hal_ctx,
14410 uint8_t session_id,
14411 bool key_mgmt_offload_enabled,
14412 bool okc_enabled)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014413{
Deepak Dhamdheref2a7d8b2016-08-19 16:17:38 -070014414 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal_ctx);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014415 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014416
Deepak Dhamdheref2a7d8b2016-08-19 16:17:38 -070014417 status = sme_acquire_global_lock(&mac_ctx->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014418 if (QDF_IS_STATUS_SUCCESS(status)) {
Deepak Dhamdheref2a7d8b2016-08-19 16:17:38 -070014419 if (CSR_IS_SESSION_VALID(mac_ctx, session_id)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053014420 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO,
Deepak Dhamdheref2a7d8b2016-08-19 16:17:38 -070014421 "%s: LFR3: key_mgmt_offload_enabled changed to %d",
14422 __func__, key_mgmt_offload_enabled);
14423 status = csr_roam_set_key_mgmt_offload(mac_ctx,
14424 session_id,
14425 key_mgmt_offload_enabled,
14426 okc_enabled);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014427 } else {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014428 status = QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014429 }
Deepak Dhamdheref2a7d8b2016-08-19 16:17:38 -070014430 sme_release_global_lock(&mac_ctx->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014431 }
14432
14433 return status;
14434}
Prashanth Bhattabfc25292015-11-05 11:16:21 -080014435#endif
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014436
14437/* ---------------------------------------------------------------------------
14438 \fn sme_get_temperature
14439 \brief SME API to get the pdev temperature
14440 \param hHal
14441 \param temperature context
14442 \param pCallbackfn: callback fn with response (temperature)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014443 \- return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014444 -------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014445QDF_STATUS sme_get_temperature(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014446 void *tempContext,
14447 void (*pCallbackfn)(int temperature,
14448 void *pContext))
14449{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014450 QDF_STATUS status = QDF_STATUS_SUCCESS;
14451 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014452 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
14453 cds_msg_t cds_message;
14454
14455 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014456 if (QDF_STATUS_SUCCESS == status) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014457 if ((NULL == pCallbackfn) &&
14458 (NULL == pMac->sme.pGetTemperatureCb)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053014459 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014460 FL
14461 ("Indication Call back did not registered"));
14462 sme_release_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014463 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014464 } else if (NULL != pCallbackfn) {
14465 pMac->sme.pTemperatureCbContext = tempContext;
14466 pMac->sme.pGetTemperatureCb = pCallbackfn;
14467 }
14468 /* serialize the req through MC thread */
14469 cds_message.bodyptr = NULL;
14470 cds_message.type = WMA_GET_TEMPERATURE_REQ;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014471 qdf_status = cds_mq_post_message(CDS_MQ_ID_WMA, &cds_message);
14472 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053014473 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014474 FL("Post Get Temperature msg fail"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014475 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014476 }
14477 sme_release_global_lock(&pMac->sme);
14478 }
14479 return status;
14480}
14481
14482/* ---------------------------------------------------------------------------
14483 \fn sme_set_scanning_mac_oui
14484 \brief SME API to set scanning mac oui
14485 \param hHal
14486 \param pScanMacOui: Scanning Mac Oui (input 3 bytes)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014487 \- return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014488 -------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014489QDF_STATUS sme_set_scanning_mac_oui(tHalHandle hHal, tSirScanMacOui *pScanMacOui)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014490{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014491 QDF_STATUS status = QDF_STATUS_SUCCESS;
14492 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014493 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
14494 cds_msg_t cds_message;
14495
14496 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014497 if (QDF_STATUS_SUCCESS == status) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014498 /* Serialize the req through MC thread */
14499 cds_message.bodyptr = pScanMacOui;
14500 cds_message.type = WMA_SET_SCAN_MAC_OUI_REQ;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014501 qdf_status = cds_mq_post_message(CDS_MQ_ID_WMA, &cds_message);
14502 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053014503 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014504 FL("Msg post Set Scan Mac OUI failed"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014505 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014506 }
14507 sme_release_global_lock(&pMac->sme);
14508 }
14509 return status;
14510}
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014511
14512#ifdef DHCP_SERVER_OFFLOAD
14513/* ---------------------------------------------------------------------------
14514 \fn sme_set_dhcp_srv_offload
14515 \brief SME API to set DHCP server offload info
14516 \param hHal
14517 \param pDhcpSrvInfo : DHCP server offload info struct
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014518 \- return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014519 -------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014520QDF_STATUS sme_set_dhcp_srv_offload(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014521 tSirDhcpSrvOffloadInfo *pDhcpSrvInfo)
14522{
14523 cds_msg_t cds_message;
14524 tSirDhcpSrvOffloadInfo *pSmeDhcpSrvInfo;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014525 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014526 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
14527
Anurag Chouhan600c3a02016-03-01 10:33:54 +053014528 pSmeDhcpSrvInfo = qdf_mem_malloc(sizeof(*pSmeDhcpSrvInfo));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014529
14530 if (!pSmeDhcpSrvInfo) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053014531 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014532 "%s: Not able to allocate memory for WMA_SET_DHCP_SERVER_OFFLOAD_CMD",
14533 __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014534 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014535 }
14536
14537 *pSmeDhcpSrvInfo = *pDhcpSrvInfo;
14538
14539 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014540 if (QDF_STATUS_SUCCESS == status) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014541 /* serialize the req through MC thread */
14542 cds_message.type = WMA_SET_DHCP_SERVER_OFFLOAD_CMD;
14543 cds_message.bodyptr = pSmeDhcpSrvInfo;
14544
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014545 if (!QDF_IS_STATUS_SUCCESS
Anurag Chouhan6d760662016-02-20 16:05:43 +053014546 (cds_mq_post_message(QDF_MODULE_ID_WMA, &cds_message))) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053014547 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014548 "%s: Not able to post WMA_SET_DHCP_SERVER_OFFLOAD_CMD to WMA!",
14549 __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053014550 qdf_mem_free(pSmeDhcpSrvInfo);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014551 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014552 }
14553 sme_release_global_lock(&pMac->sme);
14554 } else {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053014555 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014556 "%s: sme_acquire_global_lock error!", __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053014557 qdf_mem_free(pSmeDhcpSrvInfo);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014558 }
14559
14560 return status;
14561}
14562#endif /* DHCP_SERVER_OFFLOAD */
14563
14564#ifdef WLAN_FEATURE_GPIO_LED_FLASHING
14565/* ---------------------------------------------------------------------------
14566 \fn sme_set_led_flashing
14567 \brief API to set the Led flashing parameters.
14568 \param hHal - The handle returned by mac_open.
14569 \param x0, x1 - led flashing parameters
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014570 \return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014571 ---------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014572QDF_STATUS sme_set_led_flashing(tHalHandle hHal, uint8_t type,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014573 uint32_t x0, uint32_t x1)
14574{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014575 QDF_STATUS status = QDF_STATUS_SUCCESS;
14576 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014577 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
14578 cds_msg_t cds_message;
14579 tSirLedFlashingReq *ledflashing;
14580
Anurag Chouhan600c3a02016-03-01 10:33:54 +053014581 ledflashing = qdf_mem_malloc(sizeof(*ledflashing));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014582 if (!ledflashing) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053014583 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014584 FL
14585 ("Not able to allocate memory for WMA_LED_TIMING_REQ"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014586 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014587 }
14588
14589 ledflashing->pattern_id = type;
14590 ledflashing->led_x0 = x0;
14591 ledflashing->led_x1 = x1;
14592
14593 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014594 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014595 /* Serialize the req through MC thread */
14596 cds_message.bodyptr = ledflashing;
14597 cds_message.type = WMA_LED_FLASHING_REQ;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014598 qdf_status = cds_mq_post_message(CDS_MQ_ID_WMA, &cds_message);
14599 if (!QDF_IS_STATUS_SUCCESS(qdf_status))
14600 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014601 sme_release_global_lock(&pMac->sme);
14602 }
14603 return status;
14604}
14605#endif
14606
14607/**
14608 * sme_handle_dfS_chan_scan() - handle DFS channel configuration
14609 * @h_hal: corestack handler
14610 * @dfs_flag: flag indicating dfs channel enable/disable
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014611 * Return: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014612 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014613QDF_STATUS sme_handle_dfs_chan_scan(tHalHandle h_hal, uint8_t dfs_flag)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014614{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014615 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014616 tpAniSirGlobal mac = PMAC_STRUCT(h_hal);
14617
14618 status = sme_acquire_global_lock(&mac->sme);
14619
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014620 if (QDF_STATUS_SUCCESS == status) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014621
14622 mac->scan.fEnableDFSChnlScan = dfs_flag;
14623
14624 /* update the channel list to the firmware */
14625 status = csr_update_channel_list(mac);
14626
14627 sme_release_global_lock(&mac->sme);
14628 }
14629
14630 return status;
14631}
14632
Edhar, Mahesh Kumardf2ec122015-11-16 11:33:16 +053014633#ifdef FEATURE_WLAN_MCC_TO_SCC_SWITCH
14634/**
14635 * sme_validate_sap_channel_switch() - validate target channel switch w.r.t
14636 * concurreny rules set to avoid channel interference.
14637 * @hal - Hal context
14638 * @sap_ch - channel to switch
14639 * @sap_phy_mode - phy mode of SAP
14640 * @cc_switch_mode - concurreny switch mode
14641 * @session_id - sme session id.
14642 *
14643 * Return: true if there is no channel interference else return false
14644 */
14645bool sme_validate_sap_channel_switch(tHalHandle hal,
14646 uint16_t sap_ch, eCsrPhyMode sap_phy_mode, uint8_t cc_switch_mode,
14647 uint8_t session_id)
14648{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014649 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Edhar, Mahesh Kumardf2ec122015-11-16 11:33:16 +053014650 tpAniSirGlobal mac = PMAC_STRUCT(hal);
14651 tCsrRoamSession *session = CSR_GET_SESSION(mac, session_id);
14652 uint16_t intf_channel = 0;
14653
14654 if (!session)
14655 return false;
14656
14657 session->ch_switch_in_progress = true;
14658 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014659 if (QDF_IS_STATUS_SUCCESS(status)) {
Edhar, Mahesh Kumardf2ec122015-11-16 11:33:16 +053014660 intf_channel = csr_check_concurrent_channel_overlap(mac, sap_ch,
14661 sap_phy_mode,
14662 cc_switch_mode);
14663 sme_release_global_lock(&mac->sme);
14664 } else {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053014665 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Edhar, Mahesh Kumardf2ec122015-11-16 11:33:16 +053014666 FL("sme_acquire_global_lock error!"));
14667 session->ch_switch_in_progress = false;
14668 return false;
14669 }
14670
14671 session->ch_switch_in_progress = false;
14672 return (intf_channel == 0) ? true : false;
14673}
14674#endif
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014675
14676/**
14677 * sme_configure_stats_avg_factor() - function to config avg. stats factor
14678 * @hal: hal
14679 * @session_id: session ID
14680 * @stats_avg_factor: average stats factor
14681 *
14682 * This function configures the stats avg factor in firmware
14683 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014684 * Return: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014685 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014686QDF_STATUS sme_configure_stats_avg_factor(tHalHandle hal, uint8_t session_id,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014687 uint16_t stats_avg_factor)
14688{
14689 cds_msg_t msg;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014690 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014691 tpAniSirGlobal mac = PMAC_STRUCT(hal);
14692 struct sir_stats_avg_factor *stats_factor;
14693
Anurag Chouhan600c3a02016-03-01 10:33:54 +053014694 stats_factor = qdf_mem_malloc(sizeof(*stats_factor));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014695
14696 if (!stats_factor) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053014697 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014698 "%s: Not able to allocate memory for SIR_HAL_CONFIG_STATS_FACTOR",
14699 __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014700 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014701 }
14702
14703 status = sme_acquire_global_lock(&mac->sme);
14704
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014705 if (QDF_STATUS_SUCCESS == status) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014706
14707 stats_factor->vdev_id = session_id;
14708 stats_factor->stats_avg_factor = stats_avg_factor;
14709
14710 /* serialize the req through MC thread */
14711 msg.type = SIR_HAL_CONFIG_STATS_FACTOR;
14712 msg.bodyptr = stats_factor;
14713
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014714 if (!QDF_IS_STATUS_SUCCESS(
Anurag Chouhan6d760662016-02-20 16:05:43 +053014715 cds_mq_post_message(QDF_MODULE_ID_WMA, &msg))) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053014716 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014717 "%s: Not able to post SIR_HAL_CONFIG_STATS_FACTOR to WMA!",
14718 __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053014719 qdf_mem_free(stats_factor);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014720 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014721 }
14722 sme_release_global_lock(&mac->sme);
14723 } else {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053014724 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014725 "%s: sme_acquire_global_lock error!",
14726 __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053014727 qdf_mem_free(stats_factor);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014728 }
14729
14730 return status;
14731}
14732
14733/**
14734 * sme_configure_guard_time() - function to configure guard time
14735 * @hal: hal
14736 * @session_id: session id
14737 * @guard_time: guard time
14738 *
14739 * This function configures the guard time in firmware
14740 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014741 * Return: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014742 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014743QDF_STATUS sme_configure_guard_time(tHalHandle hal, uint8_t session_id,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014744 uint32_t guard_time)
14745{
14746 cds_msg_t msg;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014747 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014748 tpAniSirGlobal mac = PMAC_STRUCT(hal);
14749 struct sir_guard_time_request *g_time;
14750
Anurag Chouhan600c3a02016-03-01 10:33:54 +053014751 g_time = qdf_mem_malloc(sizeof(*g_time));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014752
14753 if (!g_time) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053014754 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014755 "%s: Not able to allocate memory for SIR_HAL_CONFIG_GUARD_TIME",
14756 __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014757 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014758 }
14759
14760 status = sme_acquire_global_lock(&mac->sme);
14761
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014762 if (QDF_STATUS_SUCCESS == status) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014763
14764 g_time->vdev_id = session_id;
14765 g_time->guard_time = guard_time;
14766
14767 /* serialize the req through MC thread */
14768 msg.type = SIR_HAL_CONFIG_GUARD_TIME;
14769 msg.bodyptr = g_time;
14770
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014771 if (!QDF_IS_STATUS_SUCCESS(
Anurag Chouhan6d760662016-02-20 16:05:43 +053014772 cds_mq_post_message(QDF_MODULE_ID_WMA, &msg))) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053014773 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014774 "%s: Not able to post SIR_HAL_CONFIG_GUARD_TIME to WMA!",
14775 __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053014776 qdf_mem_free(g_time);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014777 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014778 }
14779 sme_release_global_lock(&mac->sme);
14780 } else {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053014781 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014782 "%s: sme_acquire_global_lock error!",
14783 __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053014784 qdf_mem_free(g_time);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014785 }
14786
14787 return status;
14788}
14789
14790/**
14791 * sme_configure_modulated_dtim() - function to configure modulated dtim
14792 * @h_hal: SME API to enable/disable modulated DTIM instantaneously
14793 * @session_id: session ID
14794 * @modulated_dtim: modulated dtim value
14795 *
14796 * This function configures the modulated dtim in firmware
14797 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014798 * Return: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014799 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014800QDF_STATUS sme_configure_modulated_dtim(tHalHandle h_hal, uint8_t session_id,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014801 uint32_t modulated_dtim)
14802{
14803 cds_msg_t msg;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014804 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014805 tpAniSirGlobal mac = PMAC_STRUCT(h_hal);
14806 wma_cli_set_cmd_t *iwcmd;
14807
Anurag Chouhan600c3a02016-03-01 10:33:54 +053014808 iwcmd = qdf_mem_malloc(sizeof(*iwcmd));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014809 if (NULL == iwcmd) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053014810 QDF_TRACE(QDF_MODULE_ID_SME,
14811 QDF_TRACE_LEVEL_FATAL,
Anurag Chouhanf04e84f2016-03-03 10:12:12 +053014812 "%s: qdf_mem_malloc failed", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014813 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014814 }
14815
14816 status = sme_acquire_global_lock(&mac->sme);
14817
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014818 if (QDF_STATUS_SUCCESS == status) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014819
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014820 iwcmd->param_value = modulated_dtim;
14821 iwcmd->param_vdev_id = session_id;
14822 iwcmd->param_id = GEN_PARAM_MODULATED_DTIM;
14823 iwcmd->param_vp_dev = GEN_CMD;
14824 msg.type = WMA_CLI_SET_CMD;
14825 msg.reserved = 0;
14826 msg.bodyptr = (void *)iwcmd;
14827
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014828 if (!QDF_IS_STATUS_SUCCESS(
Anurag Chouhan6d760662016-02-20 16:05:43 +053014829 cds_mq_post_message(QDF_MODULE_ID_WMA, &msg))) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053014830 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014831 "%s: Not able to post GEN_PARAM_DYNAMIC_DTIM to WMA!",
14832 __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053014833 qdf_mem_free(iwcmd);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014834 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014835 }
14836 sme_release_global_lock(&mac->sme);
14837 } else {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053014838 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014839 "%s: sme_acquire_global_lock error!",
14840 __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053014841 qdf_mem_free(iwcmd);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014842 }
14843
14844 return status;
14845}
14846
14847/*
14848 * sme_wifi_start_logger() - Send the start/stop logging command to WMA
14849 * to either start/stop logging
14850 * @hal: HAL context
14851 * @start_log: Structure containing the wifi start logger params
14852 *
14853 * This function sends the start/stop logging command to WMA
14854 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014855 * Return: QDF_STATUS_SUCCESS on successful posting
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014856 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014857QDF_STATUS sme_wifi_start_logger(tHalHandle hal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014858 struct sir_wifi_start_log start_log)
14859{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014860 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014861 tpAniSirGlobal mac = PMAC_STRUCT(hal);
14862 cds_msg_t cds_message;
14863 struct sir_wifi_start_log *req_msg;
14864 uint32_t len;
14865
14866 len = sizeof(*req_msg);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053014867 req_msg = qdf_mem_malloc(len);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014868 if (!req_msg) {
Anurag Chouhan600c3a02016-03-01 10:33:54 +053014869 sms_log(mac, LOGE, FL("qdf_mem_malloc failed"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014870 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014871 }
14872
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014873 req_msg->verbose_level = start_log.verbose_level;
Poddar, Siddartheefe3482016-09-21 18:12:59 +053014874 req_msg->is_iwpriv_command = start_log.is_iwpriv_command;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014875 req_msg->ring_id = start_log.ring_id;
Srinivas Girigowdac34f11d2016-02-25 16:02:42 -080014876 req_msg->ini_triggered = start_log.ini_triggered;
14877 req_msg->user_triggered = start_log.user_triggered;
Poddar, Siddarth176c4362016-10-03 12:25:00 +053014878 req_msg->size = start_log.size;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014879
14880 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014881 if (status != QDF_STATUS_SUCCESS) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014882 sms_log(mac, LOGE,
14883 FL("sme_acquire_global_lock failed(status=%d)"),
14884 status);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053014885 qdf_mem_free(req_msg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014886 return status;
14887 }
14888
14889 /* Serialize the req through MC thread */
14890 cds_message.bodyptr = req_msg;
14891 cds_message.type = SIR_HAL_START_STOP_LOGGING;
14892 status = cds_mq_post_message(CDS_MQ_ID_WMA, &cds_message);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014893 if (!QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014894 sms_log(mac, LOGE,
Arun Khandavalli2476ef52016-04-26 20:19:43 +053014895 FL("cds_mq_post_message failed!(err=%d)"),
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014896 status);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053014897 qdf_mem_free(req_msg);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014898 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014899 }
14900 sme_release_global_lock(&mac->sme);
14901
14902 return status;
14903}
14904
14905/**
14906 * sme_neighbor_middle_of_roaming() - Function to know if
14907 * STA is in the middle of roaming states
14908 * @hal: Handle returned by macOpen
14909 * @sessionId: sessionId of the STA session
14910 *
14911 * This function is a wrapper to call
14912 * csr_neighbor_middle_of_roaming to know STA is in the
14913 * middle of roaming states
14914 *
14915 * Return: True or False
14916 *
14917 */
14918bool sme_neighbor_middle_of_roaming(tHalHandle hHal, uint8_t sessionId)
14919{
14920 return csr_neighbor_middle_of_roaming(PMAC_STRUCT(hHal), sessionId);
14921}
14922
14923/*
14924 * sme_send_flush_logs_cmd_to_fw() - Flush FW logs
14925 * @mac: MAC handle
14926 *
14927 * This function is used to send the command that will
14928 * be used to flush the logs in the firmware
14929 *
Deepak Dhamdhere0f076bd2016-06-02 11:29:21 -070014930 * Return: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014931 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014932QDF_STATUS sme_send_flush_logs_cmd_to_fw(tpAniSirGlobal mac)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014933{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014934 QDF_STATUS status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014935 cds_msg_t message;
14936
14937 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014938 if (status != QDF_STATUS_SUCCESS) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014939 sms_log(mac, LOGE,
14940 FL("sme_acquire_global_lock failed!(status=%d)"),
14941 status);
14942 return status;
14943 }
14944
14945 /* Serialize the req through MC thread */
14946 message.bodyptr = NULL;
14947 message.type = SIR_HAL_FLUSH_LOG_TO_FW;
14948 status = cds_mq_post_message(CDS_MQ_ID_WMA, &message);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014949 if (!QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014950 sms_log(mac, LOGE,
14951 FL("cds_mq_post_message failed!(err=%d)"),
14952 status);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014953 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014954 }
14955 sme_release_global_lock(&mac->sme);
14956 return status;
14957}
14958
14959/**
14960 * sme_enable_uapsd_for_ac() - enable uapsd for access catagory requerst to WMA
14961 * @cds_ctx: cds context
14962 * @sta_id: station id
14963 * @ac: access catagory
14964 * @tid: tid value
14965 * @pri: user priority
14966 * @srvc_int: service interval
14967 * @sus_int: suspend interval
14968 * @dir: tspec direction
14969 * @psb: PSB value
14970 * @sessionId: session id
14971 * @delay_interval: delay interval
14972 *
Anurag Chouhanf04e84f2016-03-03 10:12:12 +053014973 * Return: QDF status
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014974 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014975QDF_STATUS sme_enable_uapsd_for_ac(void *cds_ctx, uint8_t sta_id,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014976 sme_ac_enum_type ac, uint8_t tid,
14977 uint8_t pri, uint32_t srvc_int,
14978 uint32_t sus_int,
14979 sme_tspec_dir_type dir,
14980 uint8_t psb, uint32_t sessionId,
14981 uint32_t delay_interval)
14982{
14983 void *wma_handle;
14984 t_wma_trigger_uapsd_params uapsd_params;
14985 enum uapsd_ac access_category;
14986
14987 if (!psb) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053014988 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014989 "No need to configure auto trigger:psb is 0");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014990 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014991 }
14992
Anurag Chouhan6d760662016-02-20 16:05:43 +053014993 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014994 if (!wma_handle) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053014995 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014996 "wma_handle is NULL");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014997 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014998 }
14999
15000 switch (ac) {
15001 case SME_AC_BK:
15002 access_category = UAPSD_BK;
15003 break;
15004 case SME_AC_BE:
15005 access_category = UAPSD_BE;
15006 break;
15007 case SME_AC_VI:
15008 access_category = UAPSD_VI;
15009 break;
15010 case SME_AC_VO:
15011 access_category = UAPSD_VO;
15012 break;
15013 default:
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015014 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015015 }
15016
15017 uapsd_params.wmm_ac = access_category;
15018 uapsd_params.user_priority = pri;
15019 uapsd_params.service_interval = srvc_int;
15020 uapsd_params.delay_interval = delay_interval;
15021 uapsd_params.suspend_interval = sus_int;
15022
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015023 if (QDF_STATUS_SUCCESS !=
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015024 wma_trigger_uapsd_params(wma_handle, sessionId, &uapsd_params)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053015025 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015026 "Failed to Trigger Uapsd params for sessionId %d",
15027 sessionId);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015028 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015029 }
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015030 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015031}
15032
15033/**
15034 * sme_disable_uapsd_for_ac() - disable uapsed access catagory request to WMA
15035 * @cds_ctx: cds context
15036 * @sta_id: station id
15037 * @ac: access catagory
15038 * @sessionId: session id
15039 *
Anurag Chouhanf04e84f2016-03-03 10:12:12 +053015040 * Return: QDF status
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015041 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015042QDF_STATUS sme_disable_uapsd_for_ac(void *cds_ctx, uint8_t sta_id,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015043 sme_ac_enum_type ac,
15044 uint32_t sessionId)
15045{
15046 void *wma_handle;
15047 enum uapsd_ac access_category;
15048
15049 switch (ac) {
15050 case SME_AC_BK:
15051 access_category = UAPSD_BK;
15052 break;
15053 case SME_AC_BE:
15054 access_category = UAPSD_BE;
15055 break;
15056 case SME_AC_VI:
15057 access_category = UAPSD_VI;
15058 break;
15059 case SME_AC_VO:
15060 access_category = UAPSD_VO;
15061 break;
15062 default:
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015063 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015064 }
15065
Anurag Chouhan6d760662016-02-20 16:05:43 +053015066 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015067 if (!wma_handle) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053015068 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015069 "wma handle is NULL");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015070 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015071 }
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015072 if (QDF_STATUS_SUCCESS !=
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015073 wma_disable_uapsd_per_ac(wma_handle, sessionId, access_category)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053015074 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015075 "Failed to disable uapsd for ac %d for sessionId %d",
15076 ac, sessionId);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015077 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015078 }
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015079 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015080}
15081
15082/**
15083 * sme_update_nss() - SME API to change the number for spatial streams
15084 * (1 or 2)
15085 * @hal: Handle returned by mac open
15086 * @nss: Number of spatial streams
15087 *
15088 * This function is used to update the number of spatial streams supported.
15089 *
15090 * Return: Success upon successfully changing nss else failure
15091 *
15092 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015093QDF_STATUS sme_update_nss(tHalHandle h_hal, uint8_t nss)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015094{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015095 QDF_STATUS status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015096 tpAniSirGlobal mac_ctx = PMAC_STRUCT(h_hal);
15097 uint32_t i, value = 0;
15098 union {
15099 uint16_t cfg_value16;
15100 tSirMacHTCapabilityInfo ht_cap_info;
15101 } uHTCapabilityInfo;
15102 tCsrRoamSession *csr_session;
15103
15104 status = sme_acquire_global_lock(&mac_ctx->sme);
15105
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015106 if (QDF_STATUS_SUCCESS == status) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015107 mac_ctx->roam.configParam.enable2x2 = (nss == 1) ? 0 : 1;
15108
15109 /* get the HT capability info*/
15110 sme_cfg_get_int(mac_ctx, WNI_CFG_HT_CAP_INFO, &value);
15111 uHTCapabilityInfo.cfg_value16 = (0xFFFF & value);
15112
15113 for (i = 0; i < CSR_ROAM_SESSION_MAX; i++) {
15114 if (CSR_IS_SESSION_VALID(mac_ctx, i)) {
15115 csr_session = &mac_ctx->roam.roamSession[i];
15116 csr_session->htConfig.ht_tx_stbc =
15117 uHTCapabilityInfo.ht_cap_info.txSTBC;
15118 }
15119 }
15120
15121 sme_release_global_lock(&mac_ctx->sme);
15122 }
15123 return status;
15124}
15125
15126/**
Archana Ramachandran5041b252016-04-25 14:29:25 -070015127 * sme_update_user_configured_nss() - sets the nss based on user request
15128 * @hal: Pointer to HAL
15129 * @nss: number of streams
15130 *
15131 * Return: None
15132 */
15133void sme_update_user_configured_nss(tHalHandle hal, uint8_t nss)
15134{
15135 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
15136
15137 mac_ctx->user_configured_nss = nss;
15138}
15139
15140/**
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015141 * sme_set_rssi_threshold_breached_cb() - set rssi threshold breached callback
Arun Khandavalli4b55da72016-07-19 19:55:01 +053015142 * @h_hal: global hal handle
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015143 * @cb: callback function pointer
15144 *
15145 * This function stores the rssi threshold breached callback function.
15146 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015147 * Return: QDF_STATUS enumeration.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015148 */
Arun Khandavalli4b55da72016-07-19 19:55:01 +053015149QDF_STATUS sme_set_rssi_threshold_breached_cb(tHalHandle h_hal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015150 void (*cb)(void *, struct rssi_breach_event *))
15151{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015152 QDF_STATUS status = QDF_STATUS_SUCCESS;
Arun Khandavalli4b55da72016-07-19 19:55:01 +053015153 tpAniSirGlobal mac;
15154
15155 if (!h_hal) {
15156 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
15157 FL("hHal is not valid"));
15158 return QDF_STATUS_E_INVAL;
15159 }
15160 mac = PMAC_STRUCT(h_hal);
15161
15162 status = sme_acquire_global_lock(&mac->sme);
15163 if (!QDF_IS_STATUS_SUCCESS(status)) {
15164 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
15165 FL("sme_acquire_global_lock failed!(status=%d)"),
15166 status);
15167 return status;
15168 }
15169
15170 mac->sme.rssi_threshold_breached_cb = cb;
15171 sme_release_global_lock(&mac->sme);
15172 return status;
15173}
15174
15175/**
15176 * sme_set_rssi_threshold_breached_cb() - Reset rssi threshold breached callback
15177 * @hal: global hal handle
15178 *
15179 * This function de-registers the rssi threshold breached callback function.
15180 *
15181 * Return: QDF_STATUS enumeration.
15182 */
15183QDF_STATUS sme_reset_rssi_threshold_breached_cb(tHalHandle hal)
15184{
15185 QDF_STATUS status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015186 tpAniSirGlobal mac = PMAC_STRUCT(hal);
15187
15188 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015189 if (!QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015190 sms_log(mac, LOGE,
15191 FL("sme_acquire_global_lock failed!(status=%d)"),
15192 status);
15193 return status;
15194 }
15195
Arun Khandavalli4b55da72016-07-19 19:55:01 +053015196 mac->sme.rssi_threshold_breached_cb = NULL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015197 sme_release_global_lock(&mac->sme);
15198 return status;
15199}
15200
15201/**
15202 * sme_is_any_session_in_connected_state() - SME wrapper API to
15203 * check if any session is in connected state or not.
15204 *
15205 * @hal: Handle returned by mac open
15206 *
15207 * This function is used to check if any valid sme session is in
15208 * connected state or not.
15209 *
15210 * Return: true if any session is connected, else false.
15211 *
15212 */
15213bool sme_is_any_session_in_connected_state(tHalHandle h_hal)
15214{
15215 tpAniSirGlobal mac_ctx = PMAC_STRUCT(h_hal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015216 QDF_STATUS status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015217 bool ret = false;
15218
15219 status = sme_acquire_global_lock(&mac_ctx->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015220 if (QDF_STATUS_SUCCESS == status) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015221 ret = csr_is_any_session_in_connect_state(mac_ctx);
15222 sme_release_global_lock(&mac_ctx->sme);
15223 }
15224 return ret;
15225}
15226
15227/**
15228 * sme_set_rssi_monitoring() - set rssi monitoring
15229 * @hal: global hal handle
15230 * @input: request message
15231 *
15232 * This function constructs the vos message and fill in message type,
15233 * bodyptr with @input and posts it to WDA queue.
15234 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015235 * Return: QDF_STATUS enumeration
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015236 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015237QDF_STATUS sme_set_rssi_monitoring(tHalHandle hal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015238 struct rssi_monitor_req *input)
15239{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015240 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015241 tpAniSirGlobal mac = PMAC_STRUCT(hal);
15242 cds_msg_t cds_message;
15243 struct rssi_monitor_req *req_msg;
15244
15245 sms_log(mac, LOG1, FL("enter"));
Anurag Chouhan600c3a02016-03-01 10:33:54 +053015246 req_msg = qdf_mem_malloc(sizeof(*req_msg));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015247 if (!req_msg) {
15248 sms_log(mac, LOGE, FL("memory allocation failed"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015249 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015250 }
15251
15252 *req_msg = *input;
15253
15254 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015255 if (!QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015256 sms_log(mac, LOGE,
15257 FL("sme_acquire_global_lock failed!(status=%d)"),
15258 status);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053015259 qdf_mem_free(req_msg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015260 return status;
15261 }
15262
15263 /* Serialize the req through MC thread */
15264 cds_message.bodyptr = req_msg;
15265 cds_message.type = WMA_SET_RSSI_MONITOR_REQ;
15266 status = cds_mq_post_message(CDS_MQ_ID_WMA, &cds_message);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015267 if (!QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015268 sms_log(mac, LOGE,
15269 FL("cds_mq_post_message failed!(err=%d)"),
15270 status);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053015271 qdf_mem_free(req_msg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015272 }
15273 sme_release_global_lock(&mac->sme);
15274
15275 return status;
15276}
15277
15278/**
15279 * sme_fw_mem_dump() - Get FW memory dump
15280 * @hHal: hal handle
15281 * @recvd_req: received memory dump request.
15282 *
15283 * This API is invoked by HDD to indicate FW to start
15284 * dumping firmware memory.
15285 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015286 * Return: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015287 */
15288#ifdef WLAN_FEATURE_MEMDUMP
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015289QDF_STATUS sme_fw_mem_dump(tHalHandle hHal, void *recvd_req)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015290{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015291 QDF_STATUS status = QDF_STATUS_SUCCESS;
15292 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015293 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
15294 cds_msg_t msg;
15295 struct fw_dump_req *send_req;
15296 struct fw_dump_seg_req seg_req;
15297 int loop;
15298
Anurag Chouhan600c3a02016-03-01 10:33:54 +053015299 send_req = qdf_mem_malloc(sizeof(*send_req));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015300 if (!send_req) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053015301 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015302 FL("Memory allocation failed for WDA_FW_MEM_DUMP"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015303 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015304 }
Anurag Chouhan600c3a02016-03-01 10:33:54 +053015305 qdf_mem_copy(send_req, recvd_req, sizeof(*send_req));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015306
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053015307 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015308 FL("request_id:%d num_seg:%d"),
15309 send_req->request_id, send_req->num_seg);
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053015310 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015311 FL("Segment Information"));
15312 for (loop = 0; loop < send_req->num_seg; loop++) {
15313 seg_req = send_req->segment[loop];
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053015314 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015315 FL("seg_number:%d"), loop);
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053015316 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015317 FL("seg_id:%d start_addr_lo:0x%x start_addr_hi:0x%x"),
15318 seg_req.seg_id, seg_req.seg_start_addr_lo,
15319 seg_req.seg_start_addr_hi);
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053015320 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015321 FL("seg_length:%d dst_addr_lo:0x%x dst_addr_hi:0x%x"),
15322 seg_req.seg_length, seg_req.dst_addr_lo,
15323 seg_req.dst_addr_hi);
15324 }
15325
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015326 if (QDF_STATUS_SUCCESS == sme_acquire_global_lock(&pMac->sme)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015327 msg.bodyptr = send_req;
15328 msg.type = WMA_FW_MEM_DUMP_REQ;
15329 msg.reserved = 0;
15330
Anurag Chouhan6d760662016-02-20 16:05:43 +053015331 qdf_status = cds_mq_post_message(QDF_MODULE_ID_WMA, &msg);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015332 if (QDF_STATUS_SUCCESS != qdf_status) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053015333 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015334 FL("Not able to post WMA_FW_MEM_DUMP"));
Anurag Chouhan600c3a02016-03-01 10:33:54 +053015335 qdf_mem_free(send_req);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015336 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015337 }
15338 sme_release_global_lock(&pMac->sme);
15339 } else {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053015340 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015341 FL("Failed to acquire SME Global Lock"));
Anurag Chouhan600c3a02016-03-01 10:33:54 +053015342 qdf_mem_free(send_req);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015343 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015344 }
15345
15346 return status;
15347}
15348#else
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015349QDF_STATUS sme_fw_mem_dump(tHalHandle hHal, void *recvd_req)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015350{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015351 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015352}
15353#endif /* WLAN_FEATURE_MEMDUMP */
15354
15355/*
Manishekar Chandrasekaran7009f252016-04-21 19:14:15 +053015356 * sme_pdev_set_pcl() - Send WMI_PDEV_SET_PCL_CMDID to the WMA
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015357 * @hal: Handle returned by macOpen
15358 * @msg: PCL channel list and length structure
15359 *
Manishekar Chandrasekaran7009f252016-04-21 19:14:15 +053015360 * Sends the command to WMA to send WMI_PDEV_SET_PCL_CMDID to FW
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015361 * Return: QDF_STATUS_SUCCESS on successful posting
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015362 */
Manishekar Chandrasekaran7009f252016-04-21 19:14:15 +053015363QDF_STATUS sme_pdev_set_pcl(tHalHandle hal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015364 struct sir_pcl_list msg)
15365{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015366 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015367 tpAniSirGlobal mac = PMAC_STRUCT(hal);
15368 cds_msg_t cds_message;
Manishekar Chandrasekaran7009f252016-04-21 19:14:15 +053015369 struct wmi_pcl_chan_weights *req_msg;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015370 uint32_t len, i;
15371
15372 len = sizeof(*req_msg);
15373
Anurag Chouhan600c3a02016-03-01 10:33:54 +053015374 req_msg = qdf_mem_malloc(len);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015375 if (!req_msg) {
Anurag Chouhan600c3a02016-03-01 10:33:54 +053015376 sms_log(mac, LOGE, FL("qdf_mem_malloc failed"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015377 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015378 }
15379
Manishekar Chandrasekaran7009f252016-04-21 19:14:15 +053015380 for (i = 0; i < msg.pcl_len; i++) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015381 req_msg->pcl_list[i] = msg.pcl_list[i];
Manishekar Chandrasekaran7009f252016-04-21 19:14:15 +053015382 req_msg->weight_list[i] = msg.weight_list[i];
15383 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015384
15385 req_msg->pcl_len = msg.pcl_len;
15386
15387 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015388 if (status != QDF_STATUS_SUCCESS) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015389 sms_log(mac, LOGE,
Deepak Dhamdhere0f076bd2016-06-02 11:29:21 -070015390 FL("sme_acquire_global_lock failed!(status=%d)"),
15391 status);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053015392 qdf_mem_free(req_msg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015393 return status;
15394 }
15395
15396 /* Serialize the req through MC thread */
15397 cds_message.bodyptr = req_msg;
Manishekar Chandrasekaran7009f252016-04-21 19:14:15 +053015398 cds_message.type = SIR_HAL_PDEV_SET_PCL_TO_FW;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015399 status = cds_mq_post_message(CDS_MQ_ID_WMA, &cds_message);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015400 if (!QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015401 sms_log(mac, LOGE,
Deepak Dhamdhere0f076bd2016-06-02 11:29:21 -070015402 FL("cds_mq_post_message failed!(err=%d)"),
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015403 status);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053015404 qdf_mem_free(req_msg);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015405 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015406 }
15407 sme_release_global_lock(&mac->sme);
15408
15409 return status;
15410}
15411
15412/*
Manishekar Chandrasekarand9640342016-04-27 12:28:26 +053015413 * sme_pdev_set_hw_mode() - Send WMI_PDEV_SET_HW_MODE_CMDID to the WMA
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015414 * @hal: Handle returned by macOpen
15415 * @msg: HW mode structure containing hw mode and callback details
15416 *
Manishekar Chandrasekarand9640342016-04-27 12:28:26 +053015417 * Sends the command to CSR to send WMI_PDEV_SET_HW_MODE_CMDID to FW
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015418 * Return: QDF_STATUS_SUCCESS on successful posting
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015419 */
Manishekar Chandrasekarand9640342016-04-27 12:28:26 +053015420QDF_STATUS sme_pdev_set_hw_mode(tHalHandle hal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015421 struct sir_hw_mode msg)
15422{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015423 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015424 tpAniSirGlobal mac = PMAC_STRUCT(hal);
15425 tSmeCmd *cmd = NULL;
15426
15427 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015428 if (!QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015429 sms_log(mac, LOGE, FL("Failed to acquire lock"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015430 return QDF_STATUS_E_RESOURCES;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015431 }
15432
15433 cmd = sme_get_command_buffer(mac);
15434 if (!cmd) {
15435 sms_log(mac, LOGE, FL("Get command buffer failed"));
15436 sme_release_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015437 return QDF_STATUS_E_NULL_VALUE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015438 }
15439
15440 cmd->command = e_sme_command_set_hw_mode;
15441 cmd->u.set_hw_mode_cmd.hw_mode_index = msg.hw_mode_index;
15442 cmd->u.set_hw_mode_cmd.set_hw_mode_cb = msg.set_hw_mode_cb;
Chandrasekaran, Manishekaref70c0d2015-10-20 19:54:55 +053015443 cmd->u.set_hw_mode_cmd.reason = msg.reason;
15444 cmd->u.set_hw_mode_cmd.session_id = msg.session_id;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015445
Chandrasekaran, Manishekarce2172e2016-02-18 16:12:43 +053015446 sms_log(mac, LOG1,
15447 FL("Queuing set hw mode to CSR, session:%d reason:%d"),
15448 cmd->u.set_hw_mode_cmd.session_id,
15449 cmd->u.set_hw_mode_cmd.reason);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015450 csr_queue_sme_command(mac, cmd, false);
15451
15452 sme_release_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015453 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015454}
15455
15456/**
15457 * sme_register_hw_mode_trans_cb() - HW mode transition callback registration
15458 * @hal: Handle returned by macOpen
15459 * @callback: HDD callback to be registered
15460 *
15461 * Registers the HDD callback with SME. This callback will be invoked when
15462 * HW mode transition event is received from the FW
15463 *
15464 * Return: None
15465 */
15466void sme_register_hw_mode_trans_cb(tHalHandle hal,
15467 hw_mode_transition_cb callback)
15468{
15469 tpAniSirGlobal mac = PMAC_STRUCT(hal);
15470
15471 mac->sme.sme_hw_mode_trans_cb = callback;
15472 sms_log(mac, LOG1, FL("HW mode transition callback registered"));
15473}
15474
15475/**
15476 * sme_nss_update_request() - Send beacon templete update to FW with new
15477 * nss value
15478 * @hal: Handle returned by macOpen
15479 * @vdev_id: the session id
15480 * @new_nss: the new nss value
15481 * @cback: hdd callback
15482 * @next_action: next action to happen at policy mgr after beacon update
15483 *
15484 * Sends the command to CSR to send to PE
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015485 * Return: QDF_STATUS_SUCCESS on successful posting
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015486 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015487QDF_STATUS sme_nss_update_request(tHalHandle hHal, uint32_t vdev_id,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015488 uint8_t new_nss, void *cback, uint8_t next_action,
Chandrasekaran, Manishekarce2172e2016-02-18 16:12:43 +053015489 void *hdd_context,
15490 enum sir_conn_update_reason reason)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015491{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015492 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015493 tpAniSirGlobal mac = PMAC_STRUCT(hHal);
15494 tSmeCmd *cmd = NULL;
15495
15496 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015497 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015498 cmd = sme_get_command_buffer(mac);
15499 if (!cmd) {
15500 sms_log(mac, LOGE, FL("Get command buffer failed"));
15501 sme_release_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015502 return QDF_STATUS_E_NULL_VALUE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015503 }
15504 cmd->command = e_sme_command_nss_update;
15505 /* Sessionized modules may require this info */
15506 cmd->sessionId = vdev_id;
15507 cmd->u.nss_update_cmd.new_nss = new_nss;
15508 cmd->u.nss_update_cmd.session_id = vdev_id;
15509 cmd->u.nss_update_cmd.nss_update_cb = cback;
15510 cmd->u.nss_update_cmd.context = hdd_context;
15511 cmd->u.nss_update_cmd.next_action = next_action;
Chandrasekaran, Manishekarce2172e2016-02-18 16:12:43 +053015512 cmd->u.nss_update_cmd.reason = reason;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015513
15514 sms_log(mac, LOG1, FL("Queuing e_sme_command_nss_update to CSR"));
15515 csr_queue_sme_command(mac, cmd, false);
15516 sme_release_global_lock(&mac->sme);
15517 }
15518 return status;
15519}
15520
15521/**
15522 * sme_soc_set_dual_mac_config() - Set dual mac configurations
15523 * @hal: Handle returned by macOpen
15524 * @msg: Structure containing the dual mac config parameters
15525 *
15526 * Queues configuration information to CSR to configure
15527 * WLAN firmware for the dual MAC features
15528 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015529 * Return: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015530 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015531QDF_STATUS sme_soc_set_dual_mac_config(tHalHandle hal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015532 struct sir_dual_mac_config msg)
15533{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015534 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015535 tpAniSirGlobal mac = PMAC_STRUCT(hal);
15536 tSmeCmd *cmd;
15537
15538 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015539 if (!QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015540 sms_log(mac, LOGE, FL("Failed to acquire lock"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015541 return QDF_STATUS_E_RESOURCES;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015542 }
15543
15544 cmd = sme_get_command_buffer(mac);
15545 if (!cmd) {
15546 sms_log(mac, LOGE, FL("Get command buffer failed"));
15547 sme_release_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015548 return QDF_STATUS_E_NULL_VALUE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015549 }
15550
15551 cmd->command = e_sme_command_set_dual_mac_config;
15552 cmd->u.set_dual_mac_cmd.scan_config = msg.scan_config;
15553 cmd->u.set_dual_mac_cmd.fw_mode_config = msg.fw_mode_config;
15554 cmd->u.set_dual_mac_cmd.set_dual_mac_cb = msg.set_dual_mac_cb;
15555
15556 sms_log(mac, LOG1,
15557 FL("Queuing e_sme_command_set_dual_mac_config to CSR: %x %x"),
15558 cmd->u.set_dual_mac_cmd.scan_config,
15559 cmd->u.set_dual_mac_cmd.fw_mode_config);
15560 csr_queue_sme_command(mac, cmd, false);
15561
15562 sme_release_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015563 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015564}
15565
Ravi Joshi9e891ba2015-11-09 19:03:46 -080015566#ifdef FEATURE_LFR_SUBNET_DETECTION
15567/**
15568 * sme_gateway_param_update() - to update gateway parameters with WMA
15569 * @Hal: hal handle
15570 * @gw_params: request parameters from HDD
15571 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015572 * Return: QDF_STATUS
Ravi Joshi9e891ba2015-11-09 19:03:46 -080015573 *
15574 * This routine will update gateway parameters to WMA
15575 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015576QDF_STATUS sme_gateway_param_update(tHalHandle Hal,
Ravi Joshi9e891ba2015-11-09 19:03:46 -080015577 struct gateway_param_update_req *gw_params)
15578{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015579 QDF_STATUS qdf_status;
Ravi Joshi9e891ba2015-11-09 19:03:46 -080015580 cds_msg_t cds_message;
15581 struct gateway_param_update_req *request_buf;
15582
Anurag Chouhan600c3a02016-03-01 10:33:54 +053015583 request_buf = qdf_mem_malloc(sizeof(*request_buf));
Ravi Joshi9e891ba2015-11-09 19:03:46 -080015584 if (NULL == request_buf) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053015585 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Ravi Joshi9e891ba2015-11-09 19:03:46 -080015586 FL("Not able to allocate memory for gw param update request"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015587 return QDF_STATUS_E_NOMEM;
Ravi Joshi9e891ba2015-11-09 19:03:46 -080015588 }
15589
15590 *request_buf = *gw_params;
15591
15592 cds_message.type = WMA_GW_PARAM_UPDATE_REQ;
15593 cds_message.reserved = 0;
15594 cds_message.bodyptr = request_buf;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015595 qdf_status = cds_mq_post_message(CDS_MQ_ID_WMA, &cds_message);
15596 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053015597 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Ravi Joshi9e891ba2015-11-09 19:03:46 -080015598 FL("Not able to post WMA_GW_PARAM_UPDATE_REQ message to HAL"));
Anurag Chouhan600c3a02016-03-01 10:33:54 +053015599 qdf_mem_free(request_buf);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015600 return QDF_STATUS_E_FAILURE;
Ravi Joshi9e891ba2015-11-09 19:03:46 -080015601 }
15602
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015603 return QDF_STATUS_SUCCESS;
Ravi Joshi9e891ba2015-11-09 19:03:46 -080015604}
15605#endif /* FEATURE_LFR_SUBNET_DETECTION */
15606
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015607/**
Archana Ramachandrana20ef812015-11-13 16:12:13 -080015608 * sme_soc_set_antenna_mode() - set antenna mode
15609 * @hal: Handle returned by macOpen
15610 * @msg: Structure containing the antenna mode parameters
15611 *
15612 * Send the command to CSR to send
15613 * WMI_SOC_SET_ANTENNA_MODE_CMDID to FW
15614 *
15615 * Return: QDF_STATUS
15616 */
15617QDF_STATUS sme_soc_set_antenna_mode(tHalHandle hal,
15618 struct sir_antenna_mode_param *msg)
15619{
15620 QDF_STATUS status = QDF_STATUS_SUCCESS;
15621 tpAniSirGlobal mac = PMAC_STRUCT(hal);
15622 tSmeCmd *cmd;
15623
15624 if (NULL == msg) {
15625 sms_log(mac, LOGE, FL("antenna mode mesg is NULL"));
15626 return QDF_STATUS_E_FAILURE;
15627 }
15628
15629 status = sme_acquire_global_lock(&mac->sme);
15630 if (!QDF_IS_STATUS_SUCCESS(status)) {
15631 sms_log(mac, LOGE, FL("Failed to acquire lock"));
15632 return QDF_STATUS_E_RESOURCES;
15633 }
15634
15635 cmd = sme_get_command_buffer(mac);
15636 if (!cmd) {
15637 sme_release_global_lock(&mac->sme);
15638 sms_log(mac, LOGE, FL("Get command buffer failed"));
15639 return QDF_STATUS_E_NULL_VALUE;
15640 }
15641
15642 cmd->command = e_sme_command_set_antenna_mode;
15643 cmd->u.set_antenna_mode_cmd = *msg;
15644
15645 sms_log(mac, LOG1,
15646 FL("Queuing e_sme_command_set_antenna_mode to CSR: %d %d"),
15647 cmd->u.set_antenna_mode_cmd.num_rx_chains,
15648 cmd->u.set_antenna_mode_cmd.num_tx_chains);
15649
15650 csr_queue_sme_command(mac, cmd, false);
15651 sme_release_global_lock(&mac->sme);
15652
15653 return QDF_STATUS_SUCCESS;
15654}
15655
15656/**
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015657 * sme_set_peer_authorized() - call peer authorized callback
15658 * @peer_addr: peer mac address
15659 * @auth_cb: auth callback
15660 * @vdev_id: vdev id
15661 *
Anurag Chouhanf04e84f2016-03-03 10:12:12 +053015662 * Return: QDF Status
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015663 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015664QDF_STATUS sme_set_peer_authorized(uint8_t *peer_addr,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015665 sme_peer_authorized_fp auth_cb,
15666 uint32_t vdev_id)
15667{
15668 void *wma_handle;
15669
Anurag Chouhan6d760662016-02-20 16:05:43 +053015670 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015671 if (!wma_handle) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053015672 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015673 "wma handle is NULL");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015674 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015675 }
15676
15677 wma_set_peer_authorized_cb(wma_handle, auth_cb);
15678 return wma_set_peer_param(wma_handle, peer_addr, WMI_PEER_AUTHORIZE,
15679 1, vdev_id);
15680}
15681
15682/*
Amar Singhal7c1e8982016-05-19 15:08:09 -070015683 * sme_handle_set_fcc_channel() - set spec. tx power for non-fcc channel
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015684 * @hal: HAL pointer
Amar Singhal83a047a2016-05-19 15:56:11 -070015685 * @fcc_constraint: flag to enable/disable the constraint
15686 * @scan_pending: whether there is pending scan
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015687 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015688 * Return: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015689 */
Amar Singhal83a047a2016-05-19 15:56:11 -070015690QDF_STATUS sme_handle_set_fcc_channel(tHalHandle hal, bool fcc_constraint,
15691 bool scan_pending)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015692{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015693 QDF_STATUS status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015694 tpAniSirGlobal mac_ptr = PMAC_STRUCT(hal);
15695
15696 status = sme_acquire_global_lock(&mac_ptr->sme);
15697
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015698 if (QDF_STATUS_SUCCESS == status) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015699
15700 if (fcc_constraint != mac_ptr->scan.fcc_constraint) {
15701 mac_ptr->scan.fcc_constraint = fcc_constraint;
Amar Singhal83a047a2016-05-19 15:56:11 -070015702 if (scan_pending)
15703 mac_ptr->scan.defer_update_channel_list = true;
15704 else
15705 status = csr_update_channel_list(mac_ptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015706 /* update the channel list in firmware */
15707 status = csr_update_channel_list(mac_ptr);
15708 }
15709
15710 sme_release_global_lock(&mac_ptr->sme);
15711 }
15712
15713 return status;
15714}
15715/**
15716 * sme_setdef_dot11mode() - Updates pMac with default dot11mode
15717 * @hal: Global MAC pointer
15718 *
15719 * Return: NULL.
15720 */
15721void sme_setdef_dot11mode(tHalHandle hal)
15722{
15723 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
15724 csr_set_default_dot11_mode(mac_ctx);
15725}
15726
15727/**
15728 * sme_update_roam_scan_hi_rssi_scan_params() - update high rssi scan
15729 * params
15730 * @hal_handle - The handle returned by macOpen.
15731 * @session_id - Session Identifier
15732 * @notify_id - Identifies 1 of the 4 parameters to be modified
15733 * @val New value of the parameter
15734 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015735 * Return: QDF_STATUS - SME update config successful.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015736 * Other status means SME failed to update
15737 */
15738
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015739QDF_STATUS sme_update_roam_scan_hi_rssi_scan_params(tHalHandle hal_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015740 uint8_t session_id,
15741 uint32_t notify_id,
15742 int32_t val)
15743{
15744 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal_handle);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015745 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015746 tCsrNeighborRoamConfig *nr_config = NULL;
15747 tpCsrNeighborRoamControlInfo nr_info = NULL;
15748 uint32_t reason = 0;
15749
15750 status = sme_acquire_global_lock(&mac_ctx->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015751 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015752 nr_config = &mac_ctx->roam.configParam.neighborRoamConfig;
15753 nr_info = &mac_ctx->roam.neighborRoamInfo[session_id];
15754 switch (notify_id) {
15755 case eCSR_HI_RSSI_SCAN_MAXCOUNT_ID:
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053015756 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015757 "%s: gRoamScanHirssiMaxCount %d => %d",
15758 __func__, nr_config->nhi_rssi_scan_max_count,
15759 val);
15760 nr_config->nhi_rssi_scan_max_count = val;
15761 nr_info->cfgParams.hi_rssi_scan_max_count = val;
15762 reason = REASON_ROAM_SCAN_HI_RSSI_MAXCOUNT_CHANGED;
15763 break;
15764
15765 case eCSR_HI_RSSI_SCAN_RSSI_DELTA_ID:
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053015766 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015767 FL("gRoamScanHiRssiDelta %d => %d"),
15768 nr_config->nhi_rssi_scan_rssi_delta,
15769 val);
15770 nr_config->nhi_rssi_scan_rssi_delta = val;
15771 nr_info->cfgParams.hi_rssi_scan_rssi_delta = val;
15772 reason = REASON_ROAM_SCAN_HI_RSSI_DELTA_CHANGED;
15773 break;
15774
15775 case eCSR_HI_RSSI_SCAN_DELAY_ID:
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053015776 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015777 FL("gRoamScanHiRssiDelay %d => %d"),
15778 nr_config->nhi_rssi_scan_delay,
15779 val);
15780 nr_config->nhi_rssi_scan_delay = val;
15781 nr_info->cfgParams.hi_rssi_scan_delay = val;
15782 reason = REASON_ROAM_SCAN_HI_RSSI_DELAY_CHANGED;
15783 break;
15784
15785 case eCSR_HI_RSSI_SCAN_RSSI_UB_ID:
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053015786 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015787 FL("gRoamScanHiRssiUpperBound %d => %d"),
15788 nr_config->nhi_rssi_scan_rssi_ub,
15789 val);
15790 nr_config->nhi_rssi_scan_rssi_ub = val;
15791 nr_info->cfgParams.hi_rssi_scan_rssi_ub = val;
15792 reason = REASON_ROAM_SCAN_HI_RSSI_UB_CHANGED;
15793 break;
15794
15795 default:
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053015796 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015797 FL("invalid parameter notify_id %d"),
15798 notify_id);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015799 status = QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015800 break;
15801 }
15802 sme_release_global_lock(&mac_ctx->sme);
15803 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015804 if (mac_ctx->roam.configParam.isRoamOffloadScanEnabled &&
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015805 status == QDF_STATUS_SUCCESS) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015806 csr_roam_offload_scan(mac_ctx, session_id,
15807 ROAM_SCAN_OFFLOAD_UPDATE_CFG, reason);
15808 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015809
15810 return status;
15811}
15812
Krishna Kumaar Natarajan052c6e62015-09-28 15:32:55 -070015813/**
15814 * sme_update_tgt_services() - update the target services config.
15815 * @hal: HAL pointer.
15816 * @cfg: wma_tgt_services parameters.
15817 *
15818 * update the target services config.
15819 *
15820 * Return: None.
15821 */
15822void sme_update_tgt_services(tHalHandle hal, struct wma_tgt_services *cfg)
15823{
15824 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
15825
15826 mac_ctx->lteCoexAntShare = cfg->lte_coex_ant_share;
15827 mac_ctx->beacon_offload = cfg->beacon_offload;
mukul sharma72c8b222015-09-04 17:02:01 +053015828 mac_ctx->pmf_offload = cfg->pmf_offload;
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053015829 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO,
mukul sharma72c8b222015-09-04 17:02:01 +053015830 FL("mac_ctx->pmf_offload: %d"), mac_ctx->pmf_offload);
Krishna Kumaar Natarajan052c6e62015-09-28 15:32:55 -070015831
15832 return;
15833}
Masti, Narayanraddic4a7ab82015-11-25 15:41:10 +053015834
Chandrasekaran, Manishekar2859de42016-02-11 16:17:38 +053015835/**
15836 * sme_is_session_id_valid() - Check if the session id is valid
15837 * @hal: Pointer to HAL
15838 * @session_id: Session id
15839 *
15840 * Checks if the session id is valid or not
15841 *
15842 * Return: True is the session id is valid, false otherwise
15843 */
15844bool sme_is_session_id_valid(tHalHandle hal, uint32_t session_id)
15845{
15846 tpAniSirGlobal mac = PMAC_STRUCT(hal);
15847 if (!mac) {
Chandrasekaran, Manishekard3cb4772016-02-22 22:21:10 +053015848 /* Using QDF_TRACE since mac is not available for sms_log */
15849 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
15850 "%s: null mac pointer", __func__);
Chandrasekaran, Manishekar2859de42016-02-11 16:17:38 +053015851 return false;
15852 }
15853
15854 if (CSR_IS_SESSION_VALID(mac, session_id)) {
15855 return true;
15856 } else {
15857 sms_log(mac, LOGE,
15858 FL("invalid session id:%d"), session_id);
15859 return false;
15860 }
15861}
15862
Masti, Narayanraddic4a7ab82015-11-25 15:41:10 +053015863#ifdef FEATURE_WLAN_TDLS
15864
15865/**
15866 * sme_get_opclass() - determine operating class
15867 * @hal: Pointer to HAL
15868 * @channel: channel id
15869 * @bw_offset: bandwidth offset
15870 * @opclass: pointer to operating class
15871 *
15872 * Function will determine operating class from regdm_get_opclass_from_channel
15873 *
15874 * Return: none
15875 */
15876void sme_get_opclass(tHalHandle hal, uint8_t channel, uint8_t bw_offset,
15877 uint8_t *opclass)
15878{
15879 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
15880
15881 /* redgm opclass table contains opclass for 40MHz low primary,
15882 * 40MHz high primary and 20MHz. No support for 80MHz yet. So
15883 * first we will check if bit for 40MHz is set and if so find
15884 * matching opclass either with low primary or high primary
15885 * (a channel would never be in both) and then search for opclass
15886 * matching 20MHz, else for any BW.
15887 */
15888 if (bw_offset & (1 << BW_40_OFFSET_BIT)) {
Amar Singhal22995112016-01-22 10:42:33 -080015889 *opclass = cds_reg_dmn_get_opclass_from_channel(
Masti, Narayanraddic4a7ab82015-11-25 15:41:10 +053015890 mac_ctx->scan.countryCodeCurrent,
15891 channel, BW40_LOW_PRIMARY);
15892 if (!(*opclass)) {
Amar Singhal22995112016-01-22 10:42:33 -080015893 *opclass = cds_reg_dmn_get_opclass_from_channel(
Masti, Narayanraddic4a7ab82015-11-25 15:41:10 +053015894 mac_ctx->scan.countryCodeCurrent,
15895 channel, BW40_HIGH_PRIMARY);
15896 }
15897 } else if (bw_offset & (1 << BW_20_OFFSET_BIT)) {
Amar Singhal22995112016-01-22 10:42:33 -080015898 *opclass = cds_reg_dmn_get_opclass_from_channel(
Masti, Narayanraddic4a7ab82015-11-25 15:41:10 +053015899 mac_ctx->scan.countryCodeCurrent,
15900 channel, BW20);
15901 } else {
Amar Singhal22995112016-01-22 10:42:33 -080015902 *opclass = cds_reg_dmn_get_opclass_from_channel(
Masti, Narayanraddic4a7ab82015-11-25 15:41:10 +053015903 mac_ctx->scan.countryCodeCurrent,
15904 channel, BWALL);
15905 }
15906}
15907#endif
Ryan Hsu3c8f79f2015-12-02 16:45:09 -080015908
15909#ifdef FEATURE_GREEN_AP
15910/**
15911 * sme_send_egap_conf_params() - set the enhanced green ap configuration params
15912 * @enable: enable/disable the enhanced green ap feature
15913 * @inactivity_time: inactivity timeout value
15914 * @wait_time: wait timeout value
15915 * @flag: feature flag in bitmasp
15916 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015917 * Return: Return QDF_STATUS, otherwise appropriate failure code
Ryan Hsu3c8f79f2015-12-02 16:45:09 -080015918 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015919QDF_STATUS sme_send_egap_conf_params(uint32_t enable, uint32_t inactivity_time,
Ryan Hsu3c8f79f2015-12-02 16:45:09 -080015920 uint32_t wait_time, uint32_t flags)
15921{
15922 cds_msg_t message;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015923 QDF_STATUS status;
Ryan Hsu3c8f79f2015-12-02 16:45:09 -080015924 struct egap_conf_params *egap_params;
15925
Anurag Chouhan600c3a02016-03-01 10:33:54 +053015926 egap_params = qdf_mem_malloc(sizeof(*egap_params));
Ryan Hsu3c8f79f2015-12-02 16:45:09 -080015927 if (NULL == egap_params) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053015928 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Ryan Hsu3c8f79f2015-12-02 16:45:09 -080015929 "%s: fail to alloc egap_params", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015930 return QDF_STATUS_E_NOMEM;
Ryan Hsu3c8f79f2015-12-02 16:45:09 -080015931 }
15932
15933 egap_params->enable = enable;
15934 egap_params->inactivity_time = inactivity_time;
15935 egap_params->wait_time = wait_time;
15936 egap_params->flags = flags;
15937
15938 message.type = WMA_SET_EGAP_CONF_PARAMS;
15939 message.bodyptr = egap_params;
Anurag Chouhan6d760662016-02-20 16:05:43 +053015940 status = cds_mq_post_message(QDF_MODULE_ID_WMA, &message);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015941 if (!QDF_IS_STATUS_SUCCESS(status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053015942 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Ryan Hsu3c8f79f2015-12-02 16:45:09 -080015943 "%s: Not able to post msg to WMA!", __func__);
15944
Anurag Chouhan600c3a02016-03-01 10:33:54 +053015945 qdf_mem_free(egap_params);
Ryan Hsu3c8f79f2015-12-02 16:45:09 -080015946 }
15947 return status;
15948}
15949#endif
Sandeep Puligillae0875662016-02-12 16:09:21 -080015950
15951/**
Anurag Chouhanbf5e0e22016-09-12 12:54:09 +053015952 * sme_set_fw_test() - set fw test
15953 * @fw_test: fw test param
15954 *
15955 * Return: Return QDF_STATUS, otherwise appropriate failure code
15956 */
15957QDF_STATUS sme_set_fw_test(struct set_fwtest_params *fw_test)
15958{
15959 void *wma_handle;
15960
15961 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
15962 if (!wma_handle) {
15963 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
15964 "wma handle is NULL");
15965 return QDF_STATUS_E_FAILURE;
15966 }
15967 wma_process_fw_test_cmd(wma_handle, fw_test);
15968 return QDF_STATUS_SUCCESS;
15969}
15970
15971/**
Sandeep Puligillae0875662016-02-12 16:09:21 -080015972 * sme_ht40_stop_obss_scan() - ht40 obss stop scan
15973 * @hal: mac handel
15974 * @vdev_id: vdev identifier
15975 *
15976 * Return: Return QDF_STATUS, otherwise appropriate failure code
15977 */
15978QDF_STATUS sme_ht40_stop_obss_scan(tHalHandle hal, uint32_t vdev_id)
15979{
15980 void *wma_handle;
15981
15982 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
15983 if (!wma_handle) {
15984 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
15985 "wma handle is NULL");
15986 return QDF_STATUS_E_FAILURE;
15987 }
15988 wma_ht40_stop_obss_scan(wma_handle, vdev_id);
15989 return QDF_STATUS_SUCCESS;
15990}
Archana Ramachandran20d2e232016-02-11 16:58:40 -080015991
15992/**
15993 * sme_update_mimo_power_save() - Update MIMO power save
15994 * configuration
15995 * @hal: The handle returned by macOpen
15996 * @is_ht_smps_enabled: enable/disable ht smps
15997 * @ht_smps_mode: smps mode disabled/static/dynamic
Archana Ramachandranfec24812016-02-16 16:31:56 -080015998 * @send_smps_action: flag to send smps force mode command
15999 * to FW
Archana Ramachandran20d2e232016-02-11 16:58:40 -080016000 *
16001 * Return: QDF_STATUS if SME update mimo power save
16002 * configuration sucsess else failue status
16003 */
16004QDF_STATUS sme_update_mimo_power_save(tHalHandle hal,
16005 uint8_t is_ht_smps_enabled,
Archana Ramachandranfec24812016-02-16 16:31:56 -080016006 uint8_t ht_smps_mode,
16007 bool send_smps_action)
Archana Ramachandran20d2e232016-02-11 16:58:40 -080016008{
16009 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
Archana Ramachandranfec24812016-02-16 16:31:56 -080016010
Archana Ramachandran20d2e232016-02-11 16:58:40 -080016011 sms_log(mac_ctx, LOG1,
Archana Ramachandranfec24812016-02-16 16:31:56 -080016012 "SMPS enable: %d mode: %d send action: %d",
16013 is_ht_smps_enabled, ht_smps_mode,
16014 send_smps_action);
Archana Ramachandran20d2e232016-02-11 16:58:40 -080016015 mac_ctx->roam.configParam.enableHtSmps =
16016 is_ht_smps_enabled;
16017 mac_ctx->roam.configParam.htSmps = ht_smps_mode;
Archana Ramachandranfec24812016-02-16 16:31:56 -080016018 mac_ctx->roam.configParam.send_smps_action =
16019 send_smps_action;
Archana Ramachandran20d2e232016-02-11 16:58:40 -080016020
16021 return QDF_STATUS_SUCCESS;
16022}
16023
16024/**
16025 * sme_is_sta_smps_allowed() - check if the supported nss for
16026 * the session is greater than 1x1 to enable sta SMPS
16027 * @hal: The handle returned by macOpen
16028 * @session_id: session id
16029 *
16030 * Return: bool returns true if supported nss is greater than
16031 * 1x1 else false
16032 */
16033bool sme_is_sta_smps_allowed(tHalHandle hal, uint8_t session_id)
16034{
16035 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
16036 tCsrRoamSession *csr_session;
16037
Archana Ramachandran20d2e232016-02-11 16:58:40 -080016038 csr_session = CSR_GET_SESSION(mac_ctx, session_id);
16039 if (NULL == csr_session) {
16040 sms_log(mac_ctx, LOGE,
Sreelakshmi Konamki58697e12016-05-25 17:30:18 +053016041 FL("SME session not valid: %d"), session_id);
16042 return false;
16043 }
16044
16045 if (!CSR_IS_SESSION_VALID(mac_ctx, session_id)) {
16046 sms_log(mac_ctx, LOGE,
16047 FL("CSR session not valid: %d"), session_id);
Archana Ramachandran20d2e232016-02-11 16:58:40 -080016048 return false;
16049 }
16050
16051 return (csr_session->supported_nss_1x1 == true) ? false : true;
16052}
Gupta, Kapil4cb1d7d2016-04-16 18:16:25 -070016053
16054/**
16055 * sme_add_beacon_filter() - set the beacon filter configuration
16056 * @hal: The handle returned by macOpen
16057 * @session_id: session id
16058 * @ie_map: bitwise array of IEs
16059 *
16060 * Return: Return QDF_STATUS, otherwise appropriate failure code
16061 */
16062QDF_STATUS sme_add_beacon_filter(tHalHandle hal,
16063 uint32_t session_id,
16064 uint32_t *ie_map)
16065{
16066 cds_msg_t message;
16067 QDF_STATUS qdf_status;
16068 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
16069 struct beacon_filter_param *filter_param;
16070
16071 if (!CSR_IS_SESSION_VALID(mac_ctx, session_id)) {
16072 sms_log(mac_ctx, LOGE,
16073 "CSR session not valid: %d",
16074 session_id);
16075 return QDF_STATUS_E_FAILURE;
16076 }
16077
16078 filter_param = qdf_mem_malloc(sizeof(*filter_param));
16079 if (NULL == filter_param) {
16080 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
16081 "%s: fail to alloc filter_param", __func__);
16082 return QDF_STATUS_E_FAILURE;
16083 }
16084
16085 filter_param->vdev_id = session_id;
16086
16087 qdf_mem_copy(filter_param->ie_map, ie_map,
16088 BCN_FLT_MAX_ELEMS_IE_LIST * sizeof(uint32_t));
16089
16090 message.type = WMA_ADD_BCN_FILTER_CMDID;
16091 message.bodyptr = filter_param;
16092 qdf_status = cds_mq_post_message(QDF_MODULE_ID_WMA,
16093 &message);
16094 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
16095 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
16096 "%s: Not able to post msg to WDA!",
16097 __func__);
16098
16099 qdf_mem_free(filter_param);
16100 }
16101 return qdf_status;
16102}
16103
16104/**
16105 * sme_remove_beacon_filter() - set the beacon filter configuration
16106 * @hal: The handle returned by macOpen
16107 * @session_id: session id
16108 *
16109 * Return: Return QDF_STATUS, otherwise appropriate failure code
16110 */
16111QDF_STATUS sme_remove_beacon_filter(tHalHandle hal, uint32_t session_id)
16112{
16113 cds_msg_t message;
16114 QDF_STATUS qdf_status;
16115 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
16116 struct beacon_filter_param *filter_param;
16117
16118 if (!CSR_IS_SESSION_VALID(mac_ctx, session_id)) {
16119 sms_log(mac_ctx, LOGE,
16120 "CSR session not valid: %d",
16121 session_id);
16122 return QDF_STATUS_E_FAILURE;
16123 }
16124
16125 filter_param = qdf_mem_malloc(sizeof(*filter_param));
16126 if (NULL == filter_param) {
16127 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
16128 "%s: fail to alloc filter_param", __func__);
16129 return QDF_STATUS_E_FAILURE;
16130 }
16131
16132 filter_param->vdev_id = session_id;
16133
16134 message.type = WMA_REMOVE_BCN_FILTER_CMDID;
16135 message.bodyptr = filter_param;
16136 qdf_status = cds_mq_post_message(QDF_MODULE_ID_WMA,
16137 &message);
16138 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
16139 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
16140 "%s: Not able to post msg to WDA!",
16141 __func__);
16142
16143 qdf_mem_free(filter_param);
16144 }
16145 return qdf_status;
16146}
Arun Khandavalli2476ef52016-04-26 20:19:43 +053016147
Arun Khandavalli2476ef52016-04-26 20:19:43 +053016148/**
Kondabattini, Ganesh3f2d02c2016-09-13 12:23:47 +053016149 * sme_send_disassoc_req_frame - send disassoc req
16150 * @hal: handler to hal
16151 * @session_id: session id
16152 * @peer_mac: peer mac address
16153 * @reason: reason for disassociation
16154 * wait_for_ack: wait for acknowledgment
16155 *
16156 * function to send disassoc request to lim
16157 *
16158 * return: none
16159 */
16160void sme_send_disassoc_req_frame(tHalHandle hal, uint8_t session_id,
16161 uint8_t *peer_mac, uint16_t reason, uint8_t wait_for_ack)
16162{
16163 struct sme_send_disassoc_frm_req *msg;
16164 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
16165 A_UINT8 *buf;
16166 A_UINT16 tmp;
16167
16168 msg = qdf_mem_malloc(sizeof(struct sme_send_disassoc_frm_req));
16169
16170 if (NULL == msg)
16171 qdf_status = QDF_STATUS_E_FAILURE;
16172 else
16173 qdf_status = QDF_STATUS_SUCCESS;
16174
16175 if (!QDF_IS_STATUS_SUCCESS(qdf_status))
16176 return;
16177
Kondabattini, Ganesh3f2d02c2016-09-13 12:23:47 +053016178 msg->msg_type = (uint16_t) eWNI_SME_SEND_DISASSOC_FRAME;
16179
16180 msg->length = (uint16_t) sizeof(struct sme_send_disassoc_frm_req);
16181
16182 buf = &msg->session_id;
16183
16184 /* session id */
16185 *buf = (A_UINT8) session_id;
16186 buf += sizeof(A_UINT8);
16187
16188 /* transaction id */
16189 *buf = 0;
16190 *(buf + 1) = 0;
16191 buf += sizeof(A_UINT16);
16192
16193 /* Set the peer MAC address before sending the message to LIM */
16194 qdf_mem_copy(buf, peer_mac, QDF_MAC_ADDR_SIZE);
16195
16196 buf += QDF_MAC_ADDR_SIZE;
16197
16198 /* reasoncode */
16199 tmp = (uint16_t) reason;
16200 qdf_mem_copy(buf, &tmp, sizeof(uint16_t));
16201 buf += sizeof(uint16_t);
16202
16203 *buf = wait_for_ack;
16204 buf += sizeof(uint8_t);
16205
16206 qdf_status = cds_send_mb_message_to_mac(msg);
16207
16208 if (qdf_status != QDF_STATUS_SUCCESS)
16209 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
16210 FL("cds_send_mb_message Failed"));
16211}
16212
16213/**
Arun Khandavalli2476ef52016-04-26 20:19:43 +053016214 * sme_get_bpf_offload_capabilities() - Get length for BPF offload
16215 * @hal: Global HAL handle
16216 * This function constructs the cds message and fill in message type,
16217 * post the same to WDA.
16218 * Return: QDF_STATUS enumeration
16219 */
16220QDF_STATUS sme_get_bpf_offload_capabilities(tHalHandle hal)
16221{
16222 QDF_STATUS status = QDF_STATUS_SUCCESS;
16223 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
16224 cds_msg_t cds_msg;
16225
16226 sms_log(mac_ctx, LOG1, FL("enter"));
16227
16228 status = sme_acquire_global_lock(&mac_ctx->sme);
16229 if (QDF_STATUS_SUCCESS == status) {
16230 /* Serialize the req through MC thread */
16231 cds_msg.bodyptr = NULL;
16232 cds_msg.type = WDA_BPF_GET_CAPABILITIES_REQ;
16233 status = cds_mq_post_message(QDF_MODULE_ID_WMA, &cds_msg);
16234 if (!QDF_IS_STATUS_SUCCESS(status)) {
16235 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
16236 FL("Post bpf get offload msg fail"));
16237 status = QDF_STATUS_E_FAILURE;
16238 }
16239 sme_release_global_lock(&mac_ctx->sme);
16240 } else {
16241 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
16242 FL("sme_acquire_global_lock error"));
16243 }
16244 sms_log(mac_ctx, LOG1, FL("exit"));
16245 return status;
16246}
16247
16248
16249/**
16250 * sme_set_bpf_instructions() - Set BPF bpf filter instructions.
16251 * @hal: HAL handle
16252 * @bpf_set_offload: struct to set bpf filter instructions.
16253 *
16254 * Return: QDF_STATUS enumeration.
16255 */
16256QDF_STATUS sme_set_bpf_instructions(tHalHandle hal,
16257 struct sir_bpf_set_offload *req)
16258{
16259 QDF_STATUS status = QDF_STATUS_SUCCESS;
16260 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
16261 cds_msg_t cds_msg;
16262 struct sir_bpf_set_offload *set_offload;
16263
Arun Khandavallica198b52016-04-26 20:53:35 +053016264 set_offload = qdf_mem_malloc(sizeof(*set_offload) +
16265 req->current_length);
Arun Khandavalli2476ef52016-04-26 20:19:43 +053016266
16267 if (NULL == set_offload) {
16268 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
16269 FL("Failed to alloc set_offload"));
16270 return QDF_STATUS_E_NOMEM;
16271 }
16272
16273 set_offload->session_id = req->session_id;
16274 set_offload->filter_id = req->filter_id;
16275 set_offload->current_offset = req->current_offset;
16276 set_offload->total_length = req->total_length;
Rajeev Kumare5a16822016-07-27 13:11:42 -070016277 set_offload->current_length = req->current_length;
Arun Khandavalli2476ef52016-04-26 20:19:43 +053016278 if (set_offload->total_length) {
Arun Khandavallica198b52016-04-26 20:53:35 +053016279 set_offload->program = ((uint8_t *)set_offload) +
16280 sizeof(*set_offload);
Arun Khandavalli2476ef52016-04-26 20:19:43 +053016281 qdf_mem_copy(set_offload->program, req->program,
16282 set_offload->current_length);
16283 }
16284 status = sme_acquire_global_lock(&mac_ctx->sme);
16285 if (QDF_STATUS_SUCCESS == status) {
16286 /* Serialize the req through MC thread */
16287 cds_msg.bodyptr = set_offload;
16288 cds_msg.type = WDA_BPF_SET_INSTRUCTIONS_REQ;
16289 status = cds_mq_post_message(QDF_MODULE_ID_WMA, &cds_msg);
16290
16291 if (!QDF_IS_STATUS_SUCCESS(status)) {
16292 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
16293 FL("Post BPF set offload msg fail"));
16294 status = QDF_STATUS_E_FAILURE;
Arun Khandavalli2476ef52016-04-26 20:19:43 +053016295 qdf_mem_free(set_offload);
16296 }
16297 sme_release_global_lock(&mac_ctx->sme);
16298 } else {
16299 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
16300 FL("sme_acquire_global_lock failed"));
Arun Khandavalli2476ef52016-04-26 20:19:43 +053016301 qdf_mem_free(set_offload);
16302 }
16303 return status;
16304}
16305
16306/**
16307 * sme_bpf_offload_register_callback() - Register get bpf offload callbacK
16308 *
16309 * @hal - MAC global handle
16310 * @callback_routine - callback routine from HDD
16311 *
16312 * This API is invoked by HDD to register its callback in SME
16313 *
16314 * Return: QDF_STATUS
16315 */
16316QDF_STATUS sme_bpf_offload_register_callback(tHalHandle hal,
16317 void (*pbpf_get_offload_cb)(void *context,
16318 struct sir_bpf_get_offload *))
16319{
16320 QDF_STATUS status = QDF_STATUS_SUCCESS;
16321 tpAniSirGlobal mac = PMAC_STRUCT(hal);
16322
16323 status = sme_acquire_global_lock(&mac->sme);
16324 if (QDF_IS_STATUS_SUCCESS(status)) {
16325 mac->sme.pbpf_get_offload_cb = pbpf_get_offload_cb;
16326 sme_release_global_lock(&mac->sme);
16327 } else {
16328 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
16329 FL("sme_acquire_global_lock failed"));
16330 }
16331 return status;
16332}
Manjunathappa Prakash59f861d2016-04-21 10:33:31 -070016333
16334/**
Abhishek Singh1c676222016-05-09 14:20:28 +053016335 * sme_get_wni_dot11_mode() - return configured wni dot11mode
16336 * @hal: hal pointer
16337 *
16338 * Return: wni dot11 mode.
16339 */
16340uint32_t sme_get_wni_dot11_mode(tHalHandle hal)
16341{
16342 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
16343
16344 return csr_translate_to_wni_cfg_dot11_mode(mac_ctx,
16345 mac_ctx->roam.configParam.uCfgDot11Mode);
16346}
16347
16348/**
Arun Khandavalli4b55da72016-07-19 19:55:01 +053016349 * sme_bpf_offload_deregister_callback() - Register get bpf offload callbacK
16350 *
16351 * @h_hal - MAC global handle
16352 * @callback_routine - callback routine from HDD
16353 *
16354 * This API is invoked by HDD to de-register its callback in SME
16355 *
16356 * Return: QDF_STATUS Enumeration
16357 */
16358QDF_STATUS sme_bpf_offload_deregister_callback(tHalHandle h_hal)
16359{
16360 QDF_STATUS status = QDF_STATUS_SUCCESS;
16361 tpAniSirGlobal mac;
16362
16363 if (!h_hal) {
16364 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
16365 FL("hHal is not valid"));
16366 return QDF_STATUS_E_INVAL;
16367 }
16368
16369 mac = PMAC_STRUCT(h_hal);
16370
16371 status = sme_acquire_global_lock(&mac->sme);
16372 if (QDF_IS_STATUS_SUCCESS(status)) {
16373 mac->sme.pbpf_get_offload_cb = NULL;
16374 sme_release_global_lock(&mac->sme);
16375 } else {
16376 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
16377 FL("sme_acquire_global_lock failed"));
16378 }
16379 return status;
16380}
16381
16382
16383/**
Manjunathappa Prakash59f861d2016-04-21 10:33:31 -070016384 * sme_create_mon_session() - post message to create PE session for monitormode
16385 * operation
16386 * @hal_handle: Handle to the HAL
16387 * @bssid: pointer to bssid
16388 *
16389 * Return: QDF_STATUS_SUCCESS on success, non-zero error code on failure.
16390 */
16391QDF_STATUS sme_create_mon_session(tHalHandle hal_handle, tSirMacAddr bss_id)
16392{
16393 QDF_STATUS status = QDF_STATUS_E_FAILURE;
16394 struct sir_create_session *msg;
16395
16396 msg = qdf_mem_malloc(sizeof(*msg));
16397 if (NULL != msg) {
16398 msg->type = eWNI_SME_MON_INIT_SESSION;
16399 msg->msg_len = sizeof(*msg);
16400 qdf_mem_copy(msg->bss_id.bytes, bss_id, QDF_MAC_ADDR_SIZE);
16401 status = cds_send_mb_message_to_mac(msg);
16402 }
16403 return status;
16404}
Gupta, Kapil96c7f2f2016-04-25 19:13:41 +053016405
Gupta, Kapil96c7f2f2016-04-25 19:13:41 +053016406/**
16407 * sme_set_adaptive_dwelltime_config() - Update Adaptive dwelltime configuration
16408 * @hal: The handle returned by macOpen
16409 * @params: adaptive_dwelltime_params config
16410 *
16411 * Return: QDF_STATUS if adaptive dwell time update
16412 * configuration sucsess else failure status
16413 */
16414QDF_STATUS sme_set_adaptive_dwelltime_config(tHalHandle hal,
16415 struct adaptive_dwelltime_params *params)
16416{
16417 cds_msg_t message;
16418 QDF_STATUS status;
16419 struct adaptive_dwelltime_params *dwelltime_params;
16420
16421 dwelltime_params = qdf_mem_malloc(sizeof(*dwelltime_params));
16422 if (NULL == dwelltime_params) {
16423 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
16424 "%s: fail to alloc dwelltime_params", __func__);
16425 return QDF_STATUS_E_NOMEM;
16426 }
16427
16428 dwelltime_params->is_enabled = params->is_enabled;
16429 dwelltime_params->dwelltime_mode = params->dwelltime_mode;
16430 dwelltime_params->lpf_weight = params->lpf_weight;
16431 dwelltime_params->passive_mon_intval = params->passive_mon_intval;
16432 dwelltime_params->wifi_act_threshold = params->wifi_act_threshold;
16433
16434 message.type = WMA_SET_ADAPT_DWELLTIME_CONF_PARAMS;
16435 message.bodyptr = dwelltime_params;
16436 status = cds_mq_post_message(QDF_MODULE_ID_WMA, &message);
16437 if (!QDF_IS_STATUS_SUCCESS(status)) {
16438 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
16439 "%s: Not able to post msg to WMA!", __func__);
16440
16441 qdf_mem_free(dwelltime_params);
16442 }
16443 return status;
16444}
Naveen Rawata410c5a2016-09-19 14:22:33 -070016445
16446/**
16447 * sme_set_vdev_ies_per_band() - sends the per band IEs to vdev
16448 * @hal: Pointer to HAL
16449 * @vdev_id: vdev_id for which IE is targeted
16450 *
16451 * Return: None
16452 */
16453void sme_set_vdev_ies_per_band(tHalHandle hal, uint8_t vdev_id)
16454{
16455 tpAniSirGlobal p_mac = PMAC_STRUCT(hal);
16456 struct sir_set_vdev_ies_per_band *p_msg;
16457 QDF_STATUS status = QDF_STATUS_E_FAILURE;
16458
16459 p_msg = qdf_mem_malloc(sizeof(*p_msg));
16460 if (NULL == p_msg) {
16461 sms_log(p_mac, LOGE, FL("mem alloc failed for sme msg"));
16462 return;
16463 }
16464
16465 p_msg->vdev_id = vdev_id;
16466 p_msg->msg_type = eWNI_SME_SET_VDEV_IES_PER_BAND;
16467 p_msg->len = sizeof(*p_msg);
16468 sms_log(p_mac, LOG1,
16469 FL("sending eWNI_SME_SET_VDEV_IES_PER_BAND: vdev_id: %d "),
16470 vdev_id);
16471 status = cds_send_mb_message_to_mac(p_msg);
16472 if (QDF_STATUS_SUCCESS != status)
16473 sms_log(p_mac, LOGE,
16474 FL("Send eWNI_SME_SET_VDEV_IES_PER_BAND fail"));
16475}
16476
Kiran Kumar Lokere666bf852016-05-02 12:23:02 -070016477/**
16478 * sme_set_pdev_ht_vht_ies() - sends the set pdev IE req
16479 * @hal: Pointer to HAL
16480 * @enable2x2: 1x1 or 2x2 mode.
16481 *
16482 * Sends the set pdev IE req with Nss value.
16483 *
16484 * Return: None
16485 */
16486void sme_set_pdev_ht_vht_ies(tHalHandle hal, bool enable2x2)
16487{
16488 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
16489 struct sir_set_ht_vht_cfg *ht_vht_cfg;
16490 QDF_STATUS status = QDF_STATUS_E_FAILURE;
16491
Kiran Kumar Lokere666bf852016-05-02 12:23:02 -070016492 if (!((mac_ctx->roam.configParam.uCfgDot11Mode ==
16493 eCSR_CFG_DOT11_MODE_AUTO) ||
16494 (mac_ctx->roam.configParam.uCfgDot11Mode ==
16495 eCSR_CFG_DOT11_MODE_11N) ||
16496 (mac_ctx->roam.configParam.uCfgDot11Mode ==
16497 eCSR_CFG_DOT11_MODE_11N_ONLY) ||
16498 (mac_ctx->roam.configParam.uCfgDot11Mode ==
16499 eCSR_CFG_DOT11_MODE_11AC) ||
16500 (mac_ctx->roam.configParam.uCfgDot11Mode ==
16501 eCSR_CFG_DOT11_MODE_11AC_ONLY)))
16502 return;
16503
16504 status = sme_acquire_global_lock(&mac_ctx->sme);
16505 if (QDF_STATUS_SUCCESS == status) {
16506 ht_vht_cfg = qdf_mem_malloc(sizeof(*ht_vht_cfg));
16507 if (NULL == ht_vht_cfg) {
16508 sms_log(mac_ctx, LOGE,
16509 "%s: mem alloc failed for ht_vht_cfg",
16510 __func__);
16511 sme_release_global_lock(&mac_ctx->sme);
16512 return;
16513 }
16514
16515 ht_vht_cfg->pdev_id = 0;
16516 if (enable2x2)
16517 ht_vht_cfg->nss = 2;
16518 else
16519 ht_vht_cfg->nss = 1;
16520 ht_vht_cfg->dot11mode =
16521 (uint8_t)csr_translate_to_wni_cfg_dot11_mode(mac_ctx,
16522 mac_ctx->roam.configParam.uCfgDot11Mode);
16523
16524 ht_vht_cfg->msg_type = eWNI_SME_PDEV_SET_HT_VHT_IE;
16525 ht_vht_cfg->len = sizeof(*ht_vht_cfg);
16526 sms_log(mac_ctx, LOG1,
16527 FL("SET_HT_VHT_IE with nss %d, dot11mode %d"),
16528 ht_vht_cfg->nss,
16529 ht_vht_cfg->dot11mode);
16530 status = cds_send_mb_message_to_mac(ht_vht_cfg);
16531 if (QDF_STATUS_SUCCESS != status) {
16532 sms_log(mac_ctx, LOGE, FL(
16533 "Send SME_PDEV_SET_HT_VHT_IE fail"));
Kiran Kumar Lokere666bf852016-05-02 12:23:02 -070016534 }
16535 sme_release_global_lock(&mac_ctx->sme);
16536 }
16537 return;
16538}
16539
16540/**
16541 * sme_update_vdev_type_nss() - sets the nss per vdev type
16542 * @hal: Pointer to HAL
16543 * @max_supp_nss: max_supported Nss
16544 * @band: 5G or 2.4G band
16545 *
16546 * Sets the per band Nss for each vdev type based on INI and configured
16547 * chain mask value.
16548 *
16549 * Return: None
16550 */
16551void sme_update_vdev_type_nss(tHalHandle hal, uint8_t max_supp_nss,
16552 uint32_t vdev_type_nss, eCsrBand band)
16553{
16554 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
16555 struct vdev_type_nss *vdev_nss;
16556
16557 if (eCSR_BAND_5G == band)
16558 vdev_nss = &mac_ctx->vdev_type_nss_5g;
16559 else
16560 vdev_nss = &mac_ctx->vdev_type_nss_2g;
16561
16562 vdev_nss->sta = QDF_MIN(max_supp_nss, CFG_STA_NSS(vdev_type_nss));
16563 vdev_nss->sap = QDF_MIN(max_supp_nss, CFG_SAP_NSS(vdev_type_nss));
16564 vdev_nss->p2p_go = QDF_MIN(max_supp_nss,
16565 CFG_P2P_GO_NSS(vdev_type_nss));
16566 vdev_nss->p2p_cli = QDF_MIN(max_supp_nss,
16567 CFG_P2P_CLI_NSS(vdev_type_nss));
16568 vdev_nss->p2p_dev = QDF_MIN(max_supp_nss,
16569 CFG_P2P_DEV_NSS(vdev_type_nss));
16570 vdev_nss->ibss = QDF_MIN(max_supp_nss, CFG_IBSS_NSS(vdev_type_nss));
16571 vdev_nss->tdls = QDF_MIN(max_supp_nss, CFG_TDLS_NSS(vdev_type_nss));
16572 vdev_nss->ocb = QDF_MIN(max_supp_nss, CFG_OCB_NSS(vdev_type_nss));
16573
16574 sms_log(mac_ctx, LOG1,
16575 "band %d NSS:sta %d sap %d cli %d go %d dev %d ibss %d tdls %d ocb %d",
16576 band, vdev_nss->sta, vdev_nss->sap, vdev_nss->p2p_cli,
16577 vdev_nss->p2p_go, vdev_nss->p2p_dev, vdev_nss->ibss,
16578 vdev_nss->tdls, vdev_nss->ocb);
16579}
Peng Xu8fdaa492016-06-22 10:20:47 -070016580
16581/**
16582 * sme_register_p2p_lo_event() - Register for the p2p lo event
16583 * @hHal: reference to the HAL
16584 * @context: the context of the call
16585 * @callback: the callback to hdd
16586 *
16587 * This function registers the callback function for P2P listen
16588 * offload stop event.
16589 *
16590 * Return: none
16591 */
16592void sme_register_p2p_lo_event(tHalHandle hHal, void *context,
16593 p2p_lo_callback callback)
16594{
16595 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
16596 QDF_STATUS status = QDF_STATUS_E_FAILURE;
16597
16598 status = sme_acquire_global_lock(&pMac->sme);
16599 pMac->sme.p2p_lo_event_callback = callback;
16600 pMac->sme.p2p_lo_event_context = context;
16601 sme_release_global_lock(&pMac->sme);
16602}
Manjeet Singhf82ed072016-07-08 11:40:00 +053016603
16604/**
16605 * sme_process_mac_pwr_dbg_cmd() - enable mac pwr debugging
16606 * @hal: The handle returned by macOpen
16607 * @session_id: session id
16608 * @dbg_args: args for mac pwr debug command
16609 * Return: Return QDF_STATUS, otherwise appropriate failure code
16610 */
16611QDF_STATUS sme_process_mac_pwr_dbg_cmd(tHalHandle hal, uint32_t session_id,
16612 struct sir_mac_pwr_dbg_cmd*
16613 dbg_args)
16614{
16615 cds_msg_t message;
16616 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
16617 struct sir_mac_pwr_dbg_cmd *req;
16618 int i;
16619
16620 if (!CSR_IS_SESSION_VALID(mac_ctx, session_id)) {
16621 sms_log(mac_ctx, LOGE,
16622 "CSR session not valid: %d",
16623 session_id);
16624 return QDF_STATUS_E_FAILURE;
16625 }
16626
16627 req = qdf_mem_malloc(sizeof(*req));
16628 if (NULL == req) {
16629 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
16630 "%s: fail to alloc mac_pwr_dbg_args", __func__);
16631 return QDF_STATUS_E_FAILURE;
16632 }
16633 req->module_id = dbg_args->module_id;
16634 req->pdev_id = dbg_args->pdev_id;
16635 req->num_args = dbg_args->num_args;
16636 for (i = 0; i < req->num_args; i++)
16637 req->args[i] = dbg_args->args[i];
16638
16639 message.type = SIR_HAL_POWER_DBG_CMD;
16640 message.bodyptr = req;
16641
16642 if (!QDF_IS_STATUS_SUCCESS(cds_mq_post_message
16643 (QDF_MODULE_ID_WMA, &message))) {
16644 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
16645 "%s: Not able to post msg to WDA!",
16646 __func__);
16647 qdf_mem_free(req);
16648 }
16649 return QDF_STATUS_SUCCESS;
16650}
Tushnim Bhattacharyyaf44a9d82016-07-05 10:52:06 -070016651/**
16652 * sme_get_vdev_type_nss() - gets the nss per vdev type
16653 * @hal: Pointer to HAL
16654 * @dev_mode: connection type.
16655 * @nss2g: Pointer to the 2G Nss parameter.
16656 * @nss5g: Pointer to the 5G Nss parameter.
16657 *
16658 * Fills the 2G and 5G Nss values based on connection type.
16659 *
16660 * Return: None
16661 */
16662void sme_get_vdev_type_nss(tHalHandle hal, enum tQDF_ADAPTER_MODE dev_mode,
16663 uint8_t *nss_2g, uint8_t *nss_5g)
16664{
16665 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
16666 csr_get_vdev_type_nss(mac_ctx, dev_mode, nss_2g, nss_5g);
16667}
Agrawal Ashish21ba2572016-09-03 16:40:10 +053016668
16669/**
16670 * sme_update_sta_roam_policy() - update sta roam policy for
16671 * unsafe and DFS channels.
16672 * @hal_handle: hal handle for getting global mac struct
16673 * @dfs_mode: dfs mode which tell if dfs channel needs to be
16674 * skipped or not
16675 * @skip_unsafe_channels: Param to tell if driver needs to
16676 * skip unsafe channels or not.
16677 * @param session_id: sme_session_id
16678 *
16679 * sme_update_sta_roam_policy update sta rome policies to csr
16680 * this function will call csrUpdateChannelList as well
16681 * to include/exclude DFS channels and unsafe channels.
16682 *
16683 * Return: eHAL_STATUS_SUCCESS or non-zero on failure.
16684 */
16685QDF_STATUS sme_update_sta_roam_policy(tHalHandle hal_handle,
16686 enum sta_roam_policy_dfs_mode dfs_mode,
16687 bool skip_unsafe_channels,
16688 uint8_t session_id)
16689{
16690 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal_handle);
16691 QDF_STATUS status = QDF_STATUS_SUCCESS;
16692 tSmeConfigParams sme_config;
16693
16694 if (!mac_ctx) {
16695 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_FATAL,
16696 "%s: mac_ctx is null", __func__);
16697 return QDF_STATUS_E_FAILURE;
16698 }
16699 qdf_mem_zero(&sme_config, sizeof(sme_config));
16700 sme_get_config_param(hal_handle, &sme_config);
16701
16702 sme_config.csrConfig.sta_roam_policy_params.dfs_mode =
16703 dfs_mode;
16704 sme_config.csrConfig.sta_roam_policy_params.skip_unsafe_channels =
16705 skip_unsafe_channels;
16706
16707 sme_update_config(hal_handle, &sme_config);
16708
16709 status = csr_update_channel_list(mac_ctx);
16710 if (QDF_STATUS_SUCCESS != status) {
16711 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
16712 FL("failed to update the supported channel list"));
16713 }
16714 if (mac_ctx->roam.configParam.isRoamOffloadScanEnabled)
16715 csr_roam_offload_scan(mac_ctx, session_id,
16716 ROAM_SCAN_OFFLOAD_UPDATE_CFG,
16717 REASON_ROAM_SCAN_STA_ROAM_POLICY_CHANGED);
Selvaraj, Sridharebda0f22016-08-29 16:05:23 +053016718 return status;
16719}
16720
16721/**
16722 * sme_enable_disable_chanavoidind_event - configure ca event ind
16723 * @hal: handler to hal
16724 * @set_value: enable/disable
16725 *
16726 * function to enable/disable chan avoidance indication
16727 *
16728 * Return: QDF_STATUS
16729 */
16730QDF_STATUS sme_enable_disable_chanavoidind_event(tHalHandle hal,
16731 uint8_t set_value)
16732{
16733 QDF_STATUS status;
16734 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
16735 cds_msg_t msg;
16736
16737 sms_log(mac_ctx, LOG1, FL("set_value: %d"), set_value);
16738 status = sme_acquire_global_lock(&mac_ctx->sme);
16739 if (QDF_STATUS_SUCCESS == status) {
16740 qdf_mem_zero(&msg, sizeof(cds_msg_t));
16741 msg.type = WMA_SEND_FREQ_RANGE_CONTROL_IND;
16742 msg.bodyval = set_value;
16743 status = cds_mq_post_message(QDF_MODULE_ID_WMA, &msg);
16744 sme_release_global_lock(&mac_ctx->sme);
16745 return status;
16746 }
Deepak Dhamdhereb106ae52016-08-10 20:55:30 +053016747 return status;
16748}
Agrawal Ashish21ba2572016-09-03 16:40:10 +053016749
Deepak Dhamdhereb106ae52016-08-10 20:55:30 +053016750/*
16751 * sme_set_default_scan_ie() - API to send default scan IE to LIM
16752 * @hal: reference to the HAL
16753 * @session_id: current session ID
16754 * @ie_data: Pointer to Scan IE data
16755 * @ie_len: Length of @ie_data
16756 *
16757 * Return: QDF_STATUS
16758 */
16759QDF_STATUS sme_set_default_scan_ie(tHalHandle hal, uint16_t session_id,
16760 uint8_t *ie_data, uint16_t ie_len)
16761{
16762 QDF_STATUS status;
16763 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
16764 struct hdd_default_scan_ie *set_ie_params;
16765
16766 status = sme_acquire_global_lock(&mac_ctx->sme);
16767 if (QDF_IS_STATUS_SUCCESS(status)) {
16768 set_ie_params = qdf_mem_malloc(sizeof(*set_ie_params));
16769 if (!set_ie_params)
16770 status = QDF_STATUS_E_NOMEM;
16771 else {
16772 set_ie_params->message_type = eWNI_SME_DEFAULT_SCAN_IE;
16773 set_ie_params->length = sizeof(*set_ie_params);
16774 set_ie_params->session_id = session_id;
16775 set_ie_params->ie_len = ie_len;
16776 qdf_mem_copy(set_ie_params->ie_data, ie_data, ie_len);
16777 status = cds_send_mb_message_to_mac(set_ie_params);
16778 }
16779 sme_release_global_lock(&mac_ctx->sme);
16780 }
16781 sms_log(mac_ctx, LOG1, FL("Set default scan IE status %d"), status);
Agrawal Ashish21ba2572016-09-03 16:40:10 +053016782 return status;
16783}
Padma, Santhosh Kumard7cc0792016-06-28 18:54:12 +053016784
Padma, Santhosh Kumar72e7aec2016-10-12 17:23:44 +053016785#ifdef WLAN_FEATURE_DISA
Padma, Santhosh Kumard7cc0792016-06-28 18:54:12 +053016786/**
16787 * sme_encrypt_decrypt_msg() - handles encrypt/decrypt mesaage
16788 * @hal: HAL handle
16789 * @encrypt_decrypt_params: struct to set encryption/decryption params.
16790 *
16791 * Return: QDF_STATUS enumeration.
16792 */
16793QDF_STATUS sme_encrypt_decrypt_msg(tHalHandle hal,
16794 struct encrypt_decrypt_req_params *encrypt_decrypt_params)
16795{
16796 QDF_STATUS status = QDF_STATUS_SUCCESS;
16797 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
16798 cds_msg_t cds_msg;
16799 struct encrypt_decrypt_req_params *params;
16800 uint8_t *ptr;
16801
16802 ptr = qdf_mem_malloc(sizeof(*params) +
16803 encrypt_decrypt_params->data_len);
16804 if (ptr == NULL) {
16805 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
16806 FL("Failed to alloc memory for encrypt/decrypt params"));
16807 return QDF_STATUS_E_NOMEM;
16808 }
16809
16810 params = (struct encrypt_decrypt_req_params *)ptr;
16811
16812 *params = *encrypt_decrypt_params;
16813
16814 if (params->data_len) {
16815 params->data = ptr + sizeof(*params);
16816
16817 qdf_mem_copy(params->data, encrypt_decrypt_params->data,
16818 params->data_len);
16819 }
16820
16821 status = sme_acquire_global_lock(&mac_ctx->sme);
16822 if (status == QDF_STATUS_SUCCESS) {
16823 /* Serialize the req through MC thread */
16824 cds_msg.bodyptr = params;
16825 cds_msg.type = WMA_ENCRYPT_DECRYPT_MSG;
16826 status = cds_mq_post_message(QDF_MODULE_ID_WMA, &cds_msg);
16827
16828 if (!QDF_IS_STATUS_SUCCESS(status)) {
16829 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
16830 FL("Post encrypt/decrypt msg fail"));
16831 status = QDF_STATUS_E_FAILURE;
16832 qdf_mem_free(params);
16833 }
16834 sme_release_global_lock(&mac_ctx->sme);
16835 } else {
16836 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
16837 FL("sme_acquire_global_lock failed"));
16838 qdf_mem_free(params);
16839 }
16840 return status;
16841
16842}
16843
16844/**
16845 * sme_encrypt_decrypt_msg_register_callback() - Registers
16846 * encrypt/decrypt message callback
16847 *
16848 * @hal - MAC global handle
16849 * @callback_routine - callback routine from HDD
16850 *
16851 * This API is invoked by HDD to register its callback in SME
16852 *
16853 * Return: QDF_STATUS
16854 */
16855QDF_STATUS sme_encrypt_decrypt_msg_register_callback(tHalHandle hal,
16856 void (*encrypt_decrypt_cb)(void *hdd_context,
16857 struct sir_encrypt_decrypt_rsp_params
16858 *encrypt_decrypt_rsp_params))
16859{
16860 QDF_STATUS status = QDF_STATUS_SUCCESS;
16861 tpAniSirGlobal mac;
16862
16863 if (!hal) {
16864 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
16865 FL("hHal is not valid"));
16866 return QDF_STATUS_E_INVAL;
16867 }
16868
16869 mac = PMAC_STRUCT(hal);
16870
16871 status = sme_acquire_global_lock(&mac->sme);
16872 if (QDF_IS_STATUS_SUCCESS(status)) {
16873 mac->sme.encrypt_decrypt_cb = encrypt_decrypt_cb;
16874 sme_release_global_lock(&mac->sme);
16875 } else {
16876 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
16877 FL("sme_acquire_global_lock failed"));
16878 }
16879 return status;
16880}
16881
16882/**
16883 * sme_encrypt_decrypt_msg_deregister_callback() - Registers
16884 * encrypt/decrypt message callback
16885 *
16886 * @h_hal - MAC global handle
16887 * @callback_routine - callback routine from HDD
16888 *
16889 * This API is invoked by HDD to de-register its callback in SME
16890 *
16891 * Return: QDF_STATUS Enumeration
16892 */
16893QDF_STATUS sme_encrypt_decrypt_msg_deregister_callback(tHalHandle h_hal)
16894{
16895 QDF_STATUS status = QDF_STATUS_SUCCESS;
16896 tpAniSirGlobal mac;
16897
16898 if (!h_hal) {
16899 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
16900 FL("hHal is not valid"));
16901 return QDF_STATUS_E_INVAL;
16902 }
16903
16904 mac = PMAC_STRUCT(h_hal);
16905
16906 status = sme_acquire_global_lock(&mac->sme);
16907 if (QDF_IS_STATUS_SUCCESS(status)) {
16908 mac->sme.encrypt_decrypt_cb = NULL;
16909 sme_release_global_lock(&mac->sme);
16910 } else {
16911 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
16912 FL("sme_acquire_global_lock failed"));
16913 }
16914 return status;
16915}
Padma, Santhosh Kumar72e7aec2016-10-12 17:23:44 +053016916#endif
Agrawal Ashishb2d1a452016-05-05 12:23:58 +053016917
16918QDF_STATUS sme_set_cts2self_for_p2p_go(tHalHandle hal_handle)
16919{
Agrawal Ashishb2d1a452016-05-05 12:23:58 +053016920 void *wma_handle;
16921
16922 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
16923 if (!wma_handle) {
16924 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
16925 "wma_handle is NULL");
16926 return QDF_STATUS_E_FAILURE;
16927 }
Agrawal Ashishb2d1a452016-05-05 12:23:58 +053016928 if (QDF_STATUS_SUCCESS !=
16929 wma_set_cts2self_for_p2p_go(wma_handle, true)) {
16930 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
16931 "%s: Failed to set cts2self for p2p GO to firmware",
16932 __func__);
16933 return QDF_STATUS_E_FAILURE;
16934 }
16935 return QDF_STATUS_SUCCESS;
16936}
Agrawal, Ashish35b251d2016-09-08 19:21:03 +053016937/**
16938 * sme_update_tx_fail_cnt_threshold() - update tx fail count Threshold
16939 * @hal: Handle returned by mac_open
16940 * @session_id: Session ID on which tx fail count needs to be updated to FW
16941 * @tx_fail_count: Count for tx fail threshold after which FW will disconnect
16942 *
16943 * This function is used to set tx fail count threshold to firmware.
16944 * firmware will issue disocnnect with peer device once this threshold is
16945 * reached.
16946 *
16947 * Return: Return QDF_STATUS, otherwise appropriate failure code
16948 */
16949QDF_STATUS sme_update_tx_fail_cnt_threshold(tHalHandle hal_handle,
16950 uint8_t session_id, uint32_t tx_fail_count)
16951{
16952 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal_handle);
16953 QDF_STATUS status = QDF_STATUS_E_FAILURE;
16954 struct sme_tx_fail_cnt_threshold *tx_fail_cnt;
16955 cds_msg_t msg;
16956
16957 tx_fail_cnt = qdf_mem_malloc(sizeof(*tx_fail_cnt));
16958 if (NULL == tx_fail_cnt) {
16959 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
16960 "%s: fail to alloc filter_param", __func__);
16961 return QDF_STATUS_E_FAILURE;
16962 }
16963 sms_log(mac_ctx, LOG1,
16964 FL("session_id %d tx_fail_count: %d"),
16965 session_id, tx_fail_count);
16966 tx_fail_cnt->session_id = session_id;
16967 tx_fail_cnt->tx_fail_cnt_threshold = tx_fail_count;
16968
16969 qdf_mem_zero(&msg, sizeof(cds_msg_t));
16970 msg.type = SIR_HAL_UPDATE_TX_FAIL_CNT_TH;
16971 msg.reserved = 0;
16972 msg.bodyptr = tx_fail_cnt;
16973 status = cds_mq_post_message(QDF_MODULE_ID_WMA, &msg);
16974
16975 if (!QDF_IS_STATUS_SUCCESS(status)) {
16976 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
16977 FL("Not able to post Tx fail count message to WDA"));
16978 qdf_mem_free(tx_fail_cnt);
16979 }
16980
16981 return status;
16982}