blob: be6f4e1220f71269b48533f7e86c3032f767931c [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)
Mukul Sharmab7b575b2016-10-02 23:37:07 +0530627 cds_trigger_recovery(false);
Abhishek Singh5ea86532016-04-27 14:10:53 +0530628 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
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001645/*--------------------------------------------------------------------------
1646
1647 \brief sme_hdd_ready_ind() - SME sends eWNI_SME_SYS_READY_IND to PE to inform
1648 that the NIC is ready tio run.
1649
1650 The function is called by HDD at the end of initialization stage so PE/HAL can
1651 enable the NIC to running state.
1652
1653 This is a synchronous call
1654 \param hHal - The handle returned by mac_open.
1655
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301656 \return QDF_STATUS_SUCCESS - eWNI_SME_SYS_READY_IND is sent to PE
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001657 successfully.
1658
1659 Other status means SME failed to send the message to PE.
1660 \sa
1661
1662 --------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301663QDF_STATUS sme_hdd_ready_ind(tHalHandle hHal)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001664{
1665 tSirSmeReadyReq Msg;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301666 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001667 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
1668
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301669 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001670 TRACE_CODE_SME_RX_HDD_MSG_HDDREADYIND, NO_SESSION, 0));
1671 do {
1672
1673 Msg.messageType = eWNI_SME_SYS_READY_IND;
1674 Msg.length = sizeof(tSirSmeReadyReq);
1675 Msg.add_bssdescr_cb = csr_scan_process_single_bssdescr;
Varun Reddy Yeturud5939f82015-12-24 18:14:02 -08001676 Msg.csr_roam_synch_cb = csr_roam_synch_callback;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001677
1678
1679 if (eSIR_FAILURE != u_mac_post_ctrl_msg(hHal, (tSirMbMsg *) &Msg)) {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301680 status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001681 } else {
1682 sms_log(pMac, LOGE,
1683 "u_mac_post_ctrl_msg failed to send eWNI_SME_SYS_READY_IND");
1684 break;
1685 }
1686
1687 status = csr_ready(pMac);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301688 if (!QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001689 sms_log(pMac, LOGE,
1690 "csr_ready failed with status=%d",
1691 status);
1692 break;
1693 }
1694
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301695 if (QDF_STATUS_SUCCESS != rrm_ready(hHal)) {
1696 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001697 sms_log(pMac, LOGE, "rrm_ready failed");
1698 break;
1699 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001700 pMac->sme.state = SME_STATE_READY;
1701 } while (0);
1702
1703 return status;
1704}
1705
1706/*--------------------------------------------------------------------------
1707
1708 \brief sme_start() - Put all SME modules at ready state.
1709
1710 The function starts each module in SME, PMC, CSR, etc. . Upon
1711 successfully return, all modules are ready to run.
1712 This is a synchronous call
1713 \param hHal - The handle returned by mac_open.
1714
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301715 \return QDF_STATUS_SUCCESS - SME is ready.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001716
1717 Other status means SME is failed to start
1718 \sa
1719
1720 --------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301721QDF_STATUS sme_start(tHalHandle hHal)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001722{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301723 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001724 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
1725
1726 do {
1727 status = csr_start(pMac);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301728 if (!QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001729 sms_log(pMac, LOGE,
1730 "csr_start failed during smeStart with status=%d",
1731 status);
1732 break;
1733 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001734 pMac->sme.state = SME_STATE_START;
1735 } while (0);
1736
1737 return status;
1738}
1739
1740/**
1741 * sme_handle_scan_req() - Scan request handler
1742 * @mac_ctx: MAC global context
1743 * @msg: message buffer
1744 *
1745 * Scan request message from upper layer is handled as
1746 * part of this API
1747 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301748 * Return: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001749 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301750static QDF_STATUS sme_handle_scan_req(tpAniSirGlobal mac_ctx,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001751 void *msg)
1752{
1753 struct ani_scan_req *scan_msg;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301754 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001755 uint16_t session_id;
1756 csr_scan_completeCallback callback;
1757
1758 scan_msg = msg;
1759 session_id = scan_msg->session_id;
1760 callback = scan_msg->callback;
1761 status = csr_scan_request(mac_ctx, session_id,
1762 scan_msg->scan_param,
1763 callback, scan_msg->ctx);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301764 if (!QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001765 sms_log(mac_ctx, LOGE,
1766 FL("scan request failed. session_id %d"), session_id);
1767 }
1768 csr_scan_free_request(mac_ctx, scan_msg->scan_param);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05301769 qdf_mem_free(scan_msg->scan_param);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001770 return status;
1771}
1772
1773/**
1774 * sme_handle_roc_req() - Roc request handler
1775 * @mac_ctx: MAC global context
1776 * @msg: message buffer
1777 *
1778 * Roc request message from upper layer is handled as
1779 * part of this API
1780 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301781 * Return: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001782 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301783static QDF_STATUS sme_handle_roc_req(tHalHandle hal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001784 void *msg)
1785{
1786 struct ani_roc_req *roc_msg;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301787 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001788 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
1789 remainOnChanCallback callback;
1790
1791 if (msg == NULL) {
1792 sms_log(mac_ctx, LOGE, FL("ROC request is NULL"));
1793 return status;
1794 }
1795
1796 roc_msg = msg;
1797 callback = roc_msg->callback;
1798 status = p2p_remain_on_channel(hal, roc_msg->session_id,
1799 roc_msg->channel, roc_msg->duration, callback,
1800 roc_msg->ctx, roc_msg->is_p2pprobe_allowed,
1801 roc_msg->scan_id);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301802 if (!QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001803 sms_log(mac_ctx, LOGE,
1804 FL("scan request failed. session_id %d scan_id %d"),
1805 roc_msg->session_id, roc_msg->scan_id);
1806 }
1807 return status;
1808}
1809
1810#ifdef WLAN_FEATURE_11W
1811/*------------------------------------------------------------------
1812 *
1813 * Handle the unprotected management frame indication from LIM and
1814 * forward it to HDD.
1815 *
1816 *------------------------------------------------------------------*/
1817
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301818QDF_STATUS sme_unprotected_mgmt_frm_ind(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001819 tpSirSmeUnprotMgmtFrameInd pSmeMgmtFrm)
1820{
1821 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301822 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001823 tCsrRoamInfo pRoamInfo = { 0 };
1824 uint32_t SessionId = pSmeMgmtFrm->sessionId;
1825
1826 pRoamInfo.nFrameLength = pSmeMgmtFrm->frameLen;
1827 pRoamInfo.pbFrames = pSmeMgmtFrm->frameBuf;
1828 pRoamInfo.frameType = pSmeMgmtFrm->frameType;
1829
1830 /* forward the mgmt frame to HDD */
1831 csr_roam_call_callback(pMac, SessionId, &pRoamInfo, 0,
1832 eCSR_ROAM_UNPROT_MGMT_FRAME_IND, 0);
1833
1834 return status;
1835}
1836#endif
1837
1838/*------------------------------------------------------------------
1839 *
1840 * Handle the DFS Radar Event and indicate it to the SAP
1841 *
1842 *------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301843QDF_STATUS dfs_msg_processor(tpAniSirGlobal pMac, uint16_t msgType, void *pMsgBuf)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001844{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301845 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001846 tCsrRoamInfo roamInfo = { 0 };
1847 tSirSmeDfsEventInd *dfs_event;
1848 tSirSmeCSAIeTxCompleteRsp *csaIeTxCompleteRsp;
1849 uint32_t sessionId = 0;
1850 eRoamCmdStatus roamStatus;
1851 eCsrRoamResult roamResult;
1852 int i;
1853
1854 switch (msgType) {
1855 case eWNI_SME_DFS_RADAR_FOUND:
1856 {
1857 /* Radar found !! */
1858 dfs_event = (tSirSmeDfsEventInd *) pMsgBuf;
1859 if (NULL == dfs_event) {
1860 sms_log(pMac, LOGE,
1861 "%s: pMsg is NULL for eWNI_SME_DFS_RADAR_FOUND message",
1862 __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301863 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001864 }
1865 sessionId = dfs_event->sessionId;
1866 roamInfo.dfs_event.sessionId = sessionId;
1867 roamInfo.dfs_event.chan_list.nchannels =
1868 dfs_event->chan_list.nchannels;
1869 for (i = 0; i < dfs_event->chan_list.nchannels; i++) {
1870 roamInfo.dfs_event.chan_list.channels[i] =
1871 dfs_event->chan_list.channels[i];
1872 }
1873
1874 roamInfo.dfs_event.dfs_radar_status =
1875 dfs_event->dfs_radar_status;
1876 roamInfo.dfs_event.use_nol = dfs_event->use_nol;
1877
1878 roamStatus = eCSR_ROAM_DFS_RADAR_IND;
1879 roamResult = eCSR_ROAM_RESULT_DFS_RADAR_FOUND_IND;
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301880 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO_MED,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001881 "sapdfs: Radar indication event occurred");
1882 break;
1883 }
1884 case eWNI_SME_DFS_CSAIE_TX_COMPLETE_IND:
1885 {
1886 csaIeTxCompleteRsp =
1887 (tSirSmeCSAIeTxCompleteRsp *) pMsgBuf;
1888 if (NULL == csaIeTxCompleteRsp) {
1889 sms_log(pMac, LOGE,
1890 "%s: pMsg is NULL for eWNI_SME_DFS_CSAIE_TX_COMPLETE_IND",
1891 __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301892 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001893 }
1894 sessionId = csaIeTxCompleteRsp->sessionId;
1895 roamStatus = eCSR_ROAM_DFS_CHAN_SW_NOTIFY;
1896 roamResult = eCSR_ROAM_RESULT_DFS_CHANSW_UPDATE_SUCCESS;
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301897 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO_MED,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001898 "sapdfs: Received eWNI_SME_DFS_CSAIE_TX_COMPLETE_IND for session id [%d]",
1899 sessionId);
1900 break;
1901 }
1902 default:
1903 {
1904 sms_log(pMac, LOG1, "%s: Invalid DFS message = 0x%x",
1905 __func__, msgType);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301906 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001907 return status;
1908 }
1909 }
1910
1911 /* Indicate Radar Event to SAP */
1912 csr_roam_call_callback(pMac, sessionId, &roamInfo, 0,
1913 roamStatus, roamResult);
1914 return status;
1915}
1916
Abhishek Singh518323d2015-10-19 17:42:01 +05301917/**
1918 * sme_extended_change_channel_ind()- function to indicate ECSA
1919 * action frame is received in lim to SAP
1920 * @mac_ctx: pointer to global mac structure
1921 * @msg_buf: contain new channel and session id.
1922 *
1923 * This function is called to post ECSA action frame
1924 * receive event to SAP.
1925 *
1926 * Return: success if msg indicated to SAP else return failure
1927 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301928static QDF_STATUS sme_extended_change_channel_ind(tpAniSirGlobal mac_ctx,
Abhishek Singh518323d2015-10-19 17:42:01 +05301929 void *msg_buf)
1930{
1931 struct sir_sme_ext_cng_chan_ind *ext_chan_ind;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301932 QDF_STATUS status = QDF_STATUS_SUCCESS;
Abhishek Singh518323d2015-10-19 17:42:01 +05301933 uint32_t session_id = 0;
1934 tCsrRoamInfo roamInfo = {0};
1935 eRoamCmdStatus roam_status;
1936 eCsrRoamResult roam_result;
1937
1938
1939 ext_chan_ind = msg_buf;
1940 if (NULL == ext_chan_ind) {
1941 sms_log(mac_ctx, LOGE,
1942 FL("pMsg is NULL for eWNI_SME_EXT_CHANGE_CHANNEL_IND"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301943 return QDF_STATUS_E_FAILURE;
Abhishek Singh518323d2015-10-19 17:42:01 +05301944 }
1945 session_id = ext_chan_ind->session_id;
1946 roamInfo.target_channel = ext_chan_ind->new_channel;
1947 roam_status = eCSR_ROAM_EXT_CHG_CHNL_IND;
1948 roam_result = eCSR_ROAM_EXT_CHG_CHNL_UPDATE_IND;
1949 sms_log(mac_ctx, LOG1,
1950 FL("sapdfs: Received eWNI_SME_EXT_CHANGE_CHANNEL_IND for session id [%d]"),
1951 session_id);
1952
1953 /* Indicate Ext Channel Change event to SAP */
1954 csr_roam_call_callback(mac_ctx, session_id, &roamInfo, 0,
1955 roam_status, roam_result);
1956 return status;
1957}
1958
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001959/**
1960 * sme_process_fw_mem_dump_rsp - process fw memory dump response from WMA
1961 *
1962 * @mac_ctx: pointer to MAC handle.
1963 * @msg: pointer to received SME msg.
1964 *
1965 * This function process the received SME message and calls the corresponding
1966 * callback which was already registered with SME.
1967 *
1968 * Return: None
1969 */
1970#ifdef WLAN_FEATURE_MEMDUMP
1971static void sme_process_fw_mem_dump_rsp(tpAniSirGlobal mac_ctx, cds_msg_t *msg)
1972{
1973 if (msg->bodyptr) {
1974 if (mac_ctx->sme.fw_dump_callback)
1975 mac_ctx->sme.fw_dump_callback(mac_ctx->hHdd,
1976 (struct fw_dump_rsp *) msg->bodyptr);
1977 qdf_mem_free(msg->bodyptr);
1978 }
1979}
1980#else
1981static void sme_process_fw_mem_dump_rsp(tpAniSirGlobal mac_ctx, cds_msg_t *msg)
1982{
1983}
1984#endif
1985
1986#ifdef FEATURE_WLAN_ESE
1987/**
1988 * sme_update_is_ese_feature_enabled() - enable/disable ESE support at runtime
1989 * @hHal: HAL handle
1990 * @sessionId: session id
1991 * @isEseIniFeatureEnabled: ese ini enabled
1992 *
1993 * It is used at in the REG_DYNAMIC_VARIABLE macro definition of
1994 * isEseIniFeatureEnabled. This is a synchronous call
1995 *
1996 * Return: QDF_STATUS enumeration
1997 */
1998QDF_STATUS sme_update_is_ese_feature_enabled(tHalHandle hHal,
1999 uint8_t sessionId, const bool isEseIniFeatureEnabled)
2000{
2001 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
2002
2003 if (pMac->roam.configParam.isEseIniFeatureEnabled ==
2004 isEseIniFeatureEnabled) {
2005 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO,
2006 "%s: ESE Mode is already enabled or disabled, nothing to do (returning) old(%d) new(%d)",
2007 __func__,
2008 pMac->roam.configParam.isEseIniFeatureEnabled,
2009 isEseIniFeatureEnabled);
2010 return QDF_STATUS_SUCCESS;
2011 }
2012
2013 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO,
2014 "%s: EseEnabled is changed from %d to %d", __func__,
2015 pMac->roam.configParam.isEseIniFeatureEnabled,
2016 isEseIniFeatureEnabled);
2017 pMac->roam.configParam.isEseIniFeatureEnabled = isEseIniFeatureEnabled;
Varun Reddy Yeturuff4feb02016-04-20 12:26:11 -07002018 csr_neighbor_roam_update_fast_roaming_enabled(
2019 pMac, sessionId, isEseIniFeatureEnabled);
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08002020
2021 if (true == isEseIniFeatureEnabled)
2022 sme_update_fast_transition_enabled(hHal, true);
2023
2024 if (pMac->roam.configParam.isRoamOffloadScanEnabled)
2025 csr_roam_offload_scan(pMac, sessionId,
2026 ROAM_SCAN_OFFLOAD_UPDATE_CFG,
2027 REASON_ESE_INI_CFG_CHANGED);
2028
2029 return QDF_STATUS_SUCCESS;
2030}
2031
2032/**
2033 * sme_set_plm_request() - set plm request
2034 * @hHal: HAL handle
2035 * @pPlmReq: Pointer to input plm request
2036 *
2037 * Return: QDF_STATUS enumeration
2038 */
2039QDF_STATUS sme_set_plm_request(tHalHandle hHal, tpSirPlmReq pPlmReq)
2040{
2041 QDF_STATUS status;
2042 bool ret = false;
2043 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
2044 uint8_t ch_list[WNI_CFG_VALID_CHANNEL_LIST] = { 0 };
2045 uint8_t count, valid_count = 0;
2046 cds_msg_t msg;
2047 tCsrRoamSession *pSession = CSR_GET_SESSION(pMac, pPlmReq->sessionId);
2048
2049 status = sme_acquire_global_lock(&pMac->sme);
2050 if (!QDF_IS_STATUS_SUCCESS(status))
2051 return status;
2052
2053 if (!pSession) {
2054 sms_log(pMac, LOGE, FL("session %d not found"),
2055 pPlmReq->sessionId);
2056 sme_release_global_lock(&pMac->sme);
2057 return QDF_STATUS_E_FAILURE;
2058 }
2059
2060 if (!pSession->sessionActive) {
2061 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
2062 FL("Invalid Sessionid"));
2063 sme_release_global_lock(&pMac->sme);
2064 return QDF_STATUS_E_FAILURE;
2065 }
2066
2067 if (!pPlmReq->enable)
2068 goto send_plm_start;
2069 /* validating channel numbers */
2070 for (count = 0; count < pPlmReq->plmNumCh; count++) {
2071 ret = csr_is_supported_channel(pMac, pPlmReq->plmChList[count]);
2072 if (ret && pPlmReq->plmChList[count] > 14) {
2073 if (CHANNEL_STATE_DFS == cds_get_channel_state(
2074 pPlmReq->plmChList[count])) {
2075 /* DFS channel is provided, no PLM bursts can be
2076 * transmitted. Ignoring these channels.
2077 */
2078 QDF_TRACE(QDF_MODULE_ID_SME,
2079 QDF_TRACE_LEVEL_INFO,
2080 FL("DFS channel %d ignored for PLM"),
2081 pPlmReq->plmChList[count]);
2082 continue;
2083 }
2084 } else if (!ret) {
2085 /* Not supported, ignore the channel */
2086 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO,
2087 FL("Unsupported channel %d ignored for PLM"),
2088 pPlmReq->plmChList[count]);
2089 continue;
2090 }
2091 ch_list[valid_count] = pPlmReq->plmChList[count];
2092 valid_count++;
2093 } /* End of for () */
2094
2095 /* Copying back the valid channel list to plm struct */
2096 qdf_mem_set((void *)pPlmReq->plmChList,
2097 pPlmReq->plmNumCh, 0);
2098 if (valid_count)
2099 qdf_mem_copy(pPlmReq->plmChList, ch_list,
2100 valid_count);
2101 /* All are invalid channels, FW need to send the PLM
2102 * report with "incapable" bit set.
2103 */
2104 pPlmReq->plmNumCh = valid_count;
2105
2106send_plm_start:
2107 /* PLM START */
2108 msg.type = WMA_SET_PLM_REQ;
2109 msg.reserved = 0;
2110 msg.bodyptr = pPlmReq;
2111
2112 if (!QDF_IS_STATUS_SUCCESS(cds_mq_post_message(QDF_MODULE_ID_WMA,
2113 &msg))) {
2114 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
2115 FL("Not able to post WMA_SET_PLM_REQ to WMA"));
2116 sme_release_global_lock(&pMac->sme);
2117 return QDF_STATUS_E_FAILURE;
2118 }
2119
2120 sme_release_global_lock(&pMac->sme);
2121 return status;
2122}
2123
2124/**
2125 * sme_tsm_ie_ind() - sme tsm ie indication
2126 * @hHal: HAL handle
2127 * @pSmeTsmIeInd: Pointer to tsm ie indication
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002128 *
2129 * Handle the tsm ie indication from LIM and forward it to HDD.
2130 *
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08002131 * Return: QDF_STATUS enumeration
2132 */
2133static QDF_STATUS sme_tsm_ie_ind(tHalHandle hHal, tSirSmeTsmIEInd *pSmeTsmIeInd)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002134{
2135 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302136 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002137 tCsrRoamInfo pRoamInfo = { 0 };
2138 uint32_t SessionId = pSmeTsmIeInd->sessionId;
2139 pRoamInfo.tsmIe.tsid = pSmeTsmIeInd->tsmIe.tsid;
2140 pRoamInfo.tsmIe.state = pSmeTsmIeInd->tsmIe.state;
2141 pRoamInfo.tsmIe.msmt_interval = pSmeTsmIeInd->tsmIe.msmt_interval;
2142 /* forward the tsm ie information to HDD */
2143 csr_roam_call_callback(pMac,
2144 SessionId, &pRoamInfo, 0, eCSR_ROAM_TSM_IE_IND, 0);
2145 return status;
2146}
2147
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08002148/**
2149 * sme_set_cckm_ie() - set cckm ie
2150 * @hHal: HAL handle
2151 * @sessionId: session id
2152 * @pCckmIe: Pointer to CCKM Ie
2153 * @cckmIeLen: Length of @pCckmIe
2154 *
2155 * Function to store the CCKM IE passed from supplicant and use
2156 * it while packing reassociation request.
2157 *
2158 * Return: QDF_STATUS enumeration
2159 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302160QDF_STATUS sme_set_cckm_ie(tHalHandle hHal, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002161 uint8_t *pCckmIe, uint8_t cckmIeLen)
2162{
2163 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302164 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002165 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302166 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002167 csr_set_cckm_ie(pMac, sessionId, pCckmIe, cckmIeLen);
2168 sme_release_global_lock(&pMac->sme);
2169 }
2170 return status;
2171}
2172
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08002173/**
2174 * sme_set_ese_beacon_request() - set ese beacon request
2175 * @hHal: HAL handle
2176 * @sessionId: session id
2177 * @pEseBcnReq: Ese beacon report
2178 *
2179 * function to set ESE beacon request parameters
2180 *
2181 * Return: QDF_STATUS enumeration
2182 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302183QDF_STATUS sme_set_ese_beacon_request(tHalHandle hHal, const uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002184 const tCsrEseBeaconReq *pEseBcnReq)
2185{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302186 QDF_STATUS status = eSIR_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002187 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
2188 tpSirBeaconReportReqInd pSmeBcnReportReq = NULL;
2189 tCsrEseBeaconReqParams *pBeaconReq = NULL;
2190 uint8_t counter = 0;
2191 tCsrRoamSession *pSession = CSR_GET_SESSION(pMac, sessionId);
2192 tpRrmSMEContext pSmeRrmContext = &pMac->rrm.rrmSmeContext;
2193
2194 if (pSmeRrmContext->eseBcnReqInProgress == true) {
2195 sms_log(pMac, LOGE,
2196 "A Beacon Report Req is already in progress");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302197 return QDF_STATUS_E_RESOURCES;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002198 }
2199
2200 /* Store the info in RRM context */
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302201 qdf_mem_copy(&pSmeRrmContext->eseBcnReqInfo, pEseBcnReq,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002202 sizeof(tCsrEseBeaconReq));
2203
2204 /* Prepare the request to send to SME. */
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302205 pSmeBcnReportReq = qdf_mem_malloc(sizeof(tSirBeaconReportReqInd));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002206 if (NULL == pSmeBcnReportReq) {
2207 sms_log(pMac, LOGP,
2208 "Memory Allocation Failure!!! ESE BcnReq Ind to SME");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302209 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002210 }
2211
2212 pSmeRrmContext->eseBcnReqInProgress = true;
2213
2214 sms_log(pMac, LOGE, "Sending Beacon Report Req to SME");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002215
2216 pSmeBcnReportReq->messageType = eWNI_SME_BEACON_REPORT_REQ_IND;
2217 pSmeBcnReportReq->length = sizeof(tSirBeaconReportReqInd);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302218 qdf_mem_copy(pSmeBcnReportReq->bssId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002219 pSession->connectedProfile.bssid.bytes,
2220 sizeof(tSirMacAddr));
2221 pSmeBcnReportReq->channelInfo.channelNum = 255;
2222 pSmeBcnReportReq->channelList.numChannels = pEseBcnReq->numBcnReqIe;
2223 pSmeBcnReportReq->msgSource = eRRM_MSG_SOURCE_ESE_UPLOAD;
2224
2225 for (counter = 0; counter < pEseBcnReq->numBcnReqIe; counter++) {
2226 pBeaconReq =
2227 (tCsrEseBeaconReqParams *) &pEseBcnReq->bcnReq[counter];
2228 pSmeBcnReportReq->fMeasurementtype[counter] =
2229 pBeaconReq->scanMode;
2230 pSmeBcnReportReq->measurementDuration[counter] =
2231 SYS_TU_TO_MS(pBeaconReq->measurementDuration);
2232 pSmeBcnReportReq->channelList.channelNumber[counter] =
2233 pBeaconReq->channel;
2234 }
2235
2236 status = sme_rrm_process_beacon_report_req_ind(pMac, pSmeBcnReportReq);
2237
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302238 if (status != QDF_STATUS_SUCCESS)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002239 pSmeRrmContext->eseBcnReqInProgress = false;
2240
Hanumanth Reddy Pothula7f7a2712016-09-07 18:44:47 +05302241 qdf_mem_free(pSmeBcnReportReq);
2242
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002243 return status;
2244}
2245
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08002246/**
2247 * sme_get_tsm_stats() - SME get tsm stats
2248 * @hHal: HAL handle
2249 * @callback: SME sends back the requested stats using the callback
2250 * @staId: The station ID for which the stats is requested for
2251 * @bssId: bssid
2252 * @pContext: user context to be passed back along with the callback
2253 * @p_cds_context: CDS context
2254 * @tid: Traffic id
2255 *
2256 * API register a callback to get TSM Stats.
2257 *
2258 * Return: QDF_STATUS enumeration
2259 */
2260QDF_STATUS sme_get_tsm_stats(tHalHandle hHal,
2261 tCsrTsmStatsCallback callback,
2262 uint8_t staId, struct qdf_mac_addr bssId,
2263 void *pContext, void *p_cds_context, uint8_t tid)
2264{
2265 QDF_STATUS status = QDF_STATUS_E_FAILURE;
2266 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
2267
2268 status = sme_acquire_global_lock(&pMac->sme);
2269 if (QDF_IS_STATUS_SUCCESS(status)) {
2270 status = csr_get_tsm_stats(pMac, callback,
2271 staId, bssId, pContext,
2272 p_cds_context, tid);
2273 sme_release_global_lock(&pMac->sme);
2274 }
2275 return status;
2276}
2277
2278/**
2279 * sme_set_ese_roam_scan_channel_list() - To set ese roam scan channel list
2280 * @hHal: pointer HAL handle returned by mac_open
2281 * @sessionId: sme session id
2282 * @pChannelList: Output channel list
2283 * @numChannels: Output number of channels
2284 *
2285 * This routine is called to set ese roam scan channel list.
2286 * This is a synchronous call
2287 *
2288 * Return: QDF_STATUS
2289 */
2290QDF_STATUS sme_set_ese_roam_scan_channel_list(tHalHandle hHal,
2291 uint8_t sessionId,
2292 uint8_t *pChannelList,
2293 uint8_t numChannels)
2294{
2295 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
2296 QDF_STATUS status = QDF_STATUS_SUCCESS;
Naveen Rawatc36f7eb2016-11-10 20:01:03 -08002297 tpCsrNeighborRoamControlInfo pNeighborRoamInfo = NULL;
2298 tpCsrChannelInfo curchnl_list_info = NULL;
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08002299 uint8_t oldChannelList[WNI_CFG_VALID_CHANNEL_LIST_LEN * 2] = { 0 };
2300 uint8_t newChannelList[128] = { 0 };
2301 uint8_t i = 0, j = 0;
2302
Naveen Rawatc36f7eb2016-11-10 20:01:03 -08002303 if (sessionId >= CSR_ROAM_SESSION_MAX) {
2304 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
2305 FL("Invalid sme session id: %d"), sessionId);
2306 return QDF_STATUS_E_INVAL;
2307 }
2308
2309 pNeighborRoamInfo = &pMac->roam.neighborRoamInfo[sessionId];
2310 curchnl_list_info =
2311 &pNeighborRoamInfo->roamChannelInfo.currentChannelListInfo;
2312
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08002313 status = sme_acquire_global_lock(&pMac->sme);
2314 if (!QDF_IS_STATUS_SUCCESS(status)) {
2315 if (pMac->roam.configParam.isRoamOffloadScanEnabled)
2316 csr_roam_offload_scan(pMac, sessionId,
2317 ROAM_SCAN_OFFLOAD_UPDATE_CFG,
2318 REASON_CHANNEL_LIST_CHANGED);
2319 return status;
2320 }
2321 if (NULL != curchnl_list_info->ChannelList) {
2322 for (i = 0; i < curchnl_list_info->numOfChannels; i++) {
2323 j += snprintf(oldChannelList + j,
2324 sizeof(oldChannelList) - j, "%d",
2325 curchnl_list_info->ChannelList[i]);
2326 }
2327 }
2328 status = csr_create_roam_scan_channel_list(pMac, sessionId,
2329 pChannelList, numChannels,
2330 csr_get_current_band(hHal));
2331 if (QDF_IS_STATUS_SUCCESS(status)) {
2332 if (NULL != curchnl_list_info->ChannelList) {
2333 j = 0;
2334 for (i = 0; i < curchnl_list_info->numOfChannels; i++) {
2335 j += snprintf(newChannelList + j,
2336 sizeof(newChannelList) - j, "%d",
2337 curchnl_list_info->ChannelList[i]);
2338 }
2339 }
2340 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
2341 "ESE roam scan chnl list successfully set to %s-old value is %s-roam state is %d",
2342 newChannelList, oldChannelList,
2343 pNeighborRoamInfo->neighborRoamState);
2344 }
2345 sme_release_global_lock(&pMac->sme);
2346 if (pMac->roam.configParam.isRoamOffloadScanEnabled)
2347 csr_roam_offload_scan(pMac, sessionId,
2348 ROAM_SCAN_OFFLOAD_UPDATE_CFG,
2349 REASON_CHANNEL_LIST_CHANGED);
2350 return status;
2351}
2352
2353#endif /* FEATURE_WLAN_ESE */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002354
Jeff Johnson49c02f92016-10-07 10:29:09 -07002355static
2356QDF_STATUS sme_ibss_peer_info_response_handler(tHalHandle hHal,
2357 tpSirIbssGetPeerInfoRspParams
2358 pIbssPeerInfoParams)
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08002359{
2360 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
2361
2362 if (NULL == pMac) {
2363 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_FATAL,
2364 "%s: pMac is null", __func__);
2365 return QDF_STATUS_E_FAILURE;
2366 }
2367 if (pMac->sme.peerInfoParams.peerInfoCbk == NULL) {
2368 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
2369 "%s: HDD callback is null", __func__);
2370 return QDF_STATUS_E_FAILURE;
2371 }
2372 pMac->sme.peerInfoParams.peerInfoCbk(pMac->sme.peerInfoParams.pUserData,
2373 &pIbssPeerInfoParams->
2374 ibssPeerInfoRspParams);
2375 return QDF_STATUS_SUCCESS;
2376}
2377
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002378/**
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002379 * sme_process_dual_mac_config_resp() - Process set Dual mac config response
2380 * @mac: Global MAC pointer
2381 * @msg: Dual mac config response
2382 *
2383 * Processes the dual mac configuration response and invokes the HDD callback
2384 * to process further
2385 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302386static QDF_STATUS sme_process_dual_mac_config_resp(tpAniSirGlobal mac,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002387 uint8_t *msg)
2388{
2389 tListElem *entry = NULL;
2390 tSmeCmd *command = NULL;
2391 bool found;
2392 dual_mac_cb callback = NULL;
2393 struct sir_dual_mac_config_resp *param;
2394
2395 param = (struct sir_dual_mac_config_resp *)msg;
2396 if (!param) {
2397 sms_log(mac, LOGE, FL("Dual mac config resp param is NULL"));
2398 /* Not returning. Need to check if active command list
2399 * needs to be freed
2400 */
2401 }
2402
2403 entry = csr_ll_peek_head(&mac->sme.smeCmdActiveList,
2404 LL_ACCESS_LOCK);
2405 if (!entry) {
2406 sms_log(mac, LOGE, FL("No cmd found in active list"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302407 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002408 }
2409
2410 command = GET_BASE_ADDR(entry, tSmeCmd, Link);
2411 if (!command) {
2412 sms_log(mac, LOGE, FL("Base address is NULL"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302413 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002414 }
2415
2416 if (e_sme_command_set_dual_mac_config != command->command) {
2417 sms_log(mac, LOGE, FL("Command mismatch!"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302418 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002419 }
2420
2421 callback = command->u.set_dual_mac_cmd.set_dual_mac_cb;
2422 if (callback) {
2423 if (!param) {
2424 sms_log(mac, LOGE,
2425 FL("Callback failed-Dual mac config is NULL"));
2426 } else {
2427 sms_log(mac, LOG1,
2428 FL("Calling HDD callback for Dual mac config"));
2429 callback(param->status,
2430 command->u.set_dual_mac_cmd.scan_config,
2431 command->u.set_dual_mac_cmd.fw_mode_config);
2432 }
2433 } else {
2434 sms_log(mac, LOGE, FL("Callback does not exist"));
2435 }
2436
2437 found = csr_ll_remove_entry(&mac->sme.smeCmdActiveList, entry,
2438 LL_ACCESS_LOCK);
2439 if (found)
2440 /* Now put this command back on the available command list */
2441 sme_release_command(mac, command);
2442
2443 sme_process_pending_queue(mac);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302444 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002445}
2446
Archana Ramachandrana20ef812015-11-13 16:12:13 -08002447/**
2448 * sme_process_antenna_mode_resp() - Process set antenna mode
2449 * response
2450 * @mac: Global MAC pointer
2451 * @msg: antenna mode response
2452 *
2453 * Processes the antenna mode response and invokes the HDD
2454 * callback to process further
2455 */
2456static QDF_STATUS sme_process_antenna_mode_resp(tpAniSirGlobal mac,
2457 uint8_t *msg)
2458{
2459 tListElem *entry;
2460 tSmeCmd *command;
2461 bool found;
2462 antenna_mode_cb callback;
2463 struct sir_antenna_mode_resp *param;
2464
2465 param = (struct sir_antenna_mode_resp *)msg;
2466 if (!param) {
2467 sms_log(mac, LOGE, FL("set antenna mode resp is NULL"));
2468 /* Not returning. Need to check if active command list
2469 * needs to be freed
2470 */
2471 }
2472
2473 entry = csr_ll_peek_head(&mac->sme.smeCmdActiveList,
2474 LL_ACCESS_LOCK);
2475 if (!entry) {
2476 sms_log(mac, LOGE, FL("No cmd found in active list"));
2477 return QDF_STATUS_E_FAILURE;
2478 }
2479
2480 command = GET_BASE_ADDR(entry, tSmeCmd, Link);
2481 if (!command) {
2482 sms_log(mac, LOGE, FL("Base address is NULL"));
2483 return QDF_STATUS_E_FAILURE;
2484 }
2485
2486 if (e_sme_command_set_antenna_mode != command->command) {
2487 sms_log(mac, LOGE, FL("Command mismatch!"));
2488 return QDF_STATUS_E_FAILURE;
2489 }
2490
2491 callback =
2492 command->u.set_antenna_mode_cmd.set_antenna_mode_resp;
2493 if (callback) {
2494 if (!param) {
2495 sms_log(mac, LOGE,
2496 FL("Set antenna mode call back is NULL"));
2497 } else {
2498 sms_log(mac, LOG1,
2499 FL("HDD callback for set antenna mode"));
2500 callback(param->status);
2501 }
2502 } else {
2503 sms_log(mac, LOGE, FL("Callback does not exist"));
2504 }
2505
2506 found = csr_ll_remove_entry(&mac->sme.smeCmdActiveList, entry,
2507 LL_ACCESS_LOCK);
2508 if (found)
2509 /* Now put this command back on the available command list */
2510 sme_release_command(mac, command);
2511
2512 sme_process_pending_queue(mac);
2513 return QDF_STATUS_SUCCESS;
2514}
2515
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002516/*--------------------------------------------------------------------------
2517
2518 \brief sme_process_msg() - The main message processor for SME.
2519
2520 The function is called by a message dispatcher when to process a message
2521 targeted for SME.
2522
2523 This is a synchronous call
2524 \param hHal - The handle returned by mac_open.
2525 \param pMsg - A pointer to a caller allocated object of tSirMsgQ.
2526
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302527 \return QDF_STATUS_SUCCESS - SME successfully process the message.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002528
2529 Other status means SME failed to process the message to HAL.
2530 \sa
2531
2532 --------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302533QDF_STATUS sme_process_msg(tHalHandle hHal, cds_msg_t *pMsg)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002534{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302535 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002536 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
2537
2538 if (pMsg == NULL) {
2539 sms_log(pMac, LOGE, "Empty message for SME");
2540 return status;
2541 }
2542 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302543 if (!QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002544 sms_log(pMac, LOGW, FL("Locking failed, bailing out"));
2545 if (pMsg->bodyptr)
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302546 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002547 return status;
2548 }
2549 if (!SME_IS_START(pMac)) {
2550 sms_log(pMac, LOGW, FL("message type %d in stop state ignored"),
2551 pMsg->type);
2552 if (pMsg->bodyptr)
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302553 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002554 goto release_lock;
2555 }
2556 switch (pMsg->type) {
2557#ifdef WLAN_FEATURE_ROAM_OFFLOAD
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002558 case eWNI_SME_HO_FAIL_IND:
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302559 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002560 FL("LFR3: Rcvd eWNI_SME_HO_FAIL_IND"));
2561 csr_process_ho_fail_ind(pMac, pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302562 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002563 break;
2564#endif
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002565 case WNI_CFG_SET_CNF:
2566 case WNI_CFG_DNLD_CNF:
2567 case WNI_CFG_GET_RSP:
2568 case WNI_CFG_ADD_GRP_ADDR_CNF:
2569 case WNI_CFG_DEL_GRP_ADDR_CNF:
2570 break;
2571 case eWNI_SME_ADDTS_RSP:
2572 case eWNI_SME_DELTS_RSP:
2573 case eWNI_SME_DELTS_IND:
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002574 case eWNI_SME_FT_AGGR_QOS_RSP:
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002575 /* QoS */
2576 if (pMsg->bodyptr) {
2577#ifndef WLAN_MDM_CODE_REDUCTION_OPT
2578 status = sme_qos_msg_processor(pMac, pMsg->type,
2579 pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302580 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002581#endif
2582 } else {
2583 sms_log(pMac, LOGE, FL("Empty message for %d"),
2584 pMsg->type);
2585 }
2586 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002587 case eWNI_SME_NEIGHBOR_REPORT_IND:
2588 case eWNI_SME_BEACON_REPORT_REQ_IND:
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002589 if (pMsg->bodyptr) {
2590 status = sme_rrm_msg_processor(pMac, pMsg->type,
2591 pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302592 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002593 } else {
2594 sms_log(pMac, LOGE, FL("Empty message for %d"),
2595 pMsg->type);
2596 }
2597 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002598 case eWNI_SME_ADD_STA_SELF_RSP:
2599 if (pMsg->bodyptr) {
2600 status = csr_process_add_sta_session_rsp(pMac,
2601 pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302602 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002603 } else {
2604 sms_log(pMac, LOGE, FL("Empty message for %d"),
2605 pMsg->type);
2606 }
2607 break;
2608 case eWNI_SME_DEL_STA_SELF_RSP:
2609 if (pMsg->bodyptr) {
2610 status = csr_process_del_sta_session_rsp(pMac,
2611 pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302612 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002613 } else {
2614 sms_log(pMac, LOGE, FL("Empty message for %d"),
2615 pMsg->type);
2616 }
2617 break;
2618 case eWNI_SME_REMAIN_ON_CHN_RSP:
2619 if (pMsg->bodyptr) {
2620 status = sme_remain_on_chn_rsp(pMac, pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302621 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002622 } else {
2623 sms_log(pMac, LOGE, FL("Empty message for %d"),
2624 pMsg->type);
2625 }
2626 break;
2627 case eWNI_SME_REMAIN_ON_CHN_RDY_IND:
2628 if (pMsg->bodyptr) {
2629 status = sme_remain_on_chn_ready(pMac, pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302630 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002631 } else {
2632 sms_log(pMac, LOGE, FL("Empty message for %d"),
2633 pMsg->type);
2634 }
2635 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002636#ifdef FEATURE_WLAN_SCAN_PNO
2637 case eWNI_SME_PREF_NETWORK_FOUND_IND:
Sreelakshmi Konamki6a065362016-05-31 16:05:01 +05302638 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_RX_WMA_MSG,
2639 NO_SESSION, pMsg->type));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002640 if (pMsg->bodyptr) {
2641 status = sme_preferred_network_found_ind((void *)pMac,
2642 pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302643 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002644 } else {
2645 sms_log(pMac, LOGE, FL("Empty message for %d"),
2646 pMsg->type);
2647 }
2648 break;
2649#endif /* FEATURE_WLAN_SCAN_PNO */
2650 case eWNI_SME_CHANGE_COUNTRY_CODE:
2651 if (pMsg->bodyptr) {
2652 status = sme_handle_change_country_code((void *)pMac,
2653 pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302654 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002655 } else {
2656 sms_log(pMac, LOGE, FL("Empty message for %d"),
2657 pMsg->type);
2658 }
2659 break;
2660 case eWNI_SME_GENERIC_CHANGE_COUNTRY_CODE:
2661 if (pMsg->bodyptr) {
2662 status = sme_handle_generic_change_country_code(
2663 (void *)pMac, pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302664 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002665 } else {
2666 sms_log(pMac, LOGE, FL("Empty message for %d"),
2667 pMsg->type);
2668 }
2669 break;
2670 case eWNI_SME_SCAN_CMD:
2671 if (pMsg->bodyptr) {
2672 status = sme_handle_scan_req(pMac, pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302673 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002674 } else {
2675 sms_log(pMac, LOGE, FL("Empty message for %d"),
2676 pMsg->type);
2677 }
2678 break;
2679 case eWNI_SME_ROC_CMD:
2680 if (pMsg->bodyptr) {
2681 status = sme_handle_roc_req(hHal, pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302682 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002683 } else {
2684 sms_log(pMac, LOGE, FL("Empty message for %d"),
2685 pMsg->type);
2686 }
2687 break;
2688#ifdef FEATURE_WLAN_TDLS
2689 /*
2690 * command rescived from PE, SME tdls msg processor shall be called
2691 * to process commands recieved from PE
2692 */
2693 case eWNI_SME_TDLS_SEND_MGMT_RSP:
2694 case eWNI_SME_TDLS_ADD_STA_RSP:
2695 case eWNI_SME_TDLS_DEL_STA_RSP:
2696 case eWNI_SME_TDLS_DEL_STA_IND:
2697 case eWNI_SME_TDLS_DEL_ALL_PEER_IND:
2698 case eWNI_SME_MGMT_FRM_TX_COMPLETION_IND:
2699 case eWNI_SME_TDLS_LINK_ESTABLISH_RSP:
2700 case eWNI_SME_TDLS_SHOULD_DISCOVER:
2701 case eWNI_SME_TDLS_SHOULD_TEARDOWN:
2702 case eWNI_SME_TDLS_PEER_DISCONNECTED:
2703 if (pMsg->bodyptr) {
2704 status = tdls_msg_processor(pMac, pMsg->type,
2705 pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302706 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002707 } else {
2708 sms_log(pMac, LOGE, FL("Empty message for %d"),
2709 pMsg->type);
2710 }
2711 break;
2712#endif
2713#ifdef WLAN_FEATURE_11W
2714 case eWNI_SME_UNPROT_MGMT_FRM_IND:
2715 if (pMsg->bodyptr) {
2716 sme_unprotected_mgmt_frm_ind(pMac, pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302717 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002718 } else {
2719 sms_log(pMac, LOGE, FL("Empty message for %d"),
2720 pMsg->type);
2721 }
2722 break;
2723#endif
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08002724#ifdef FEATURE_WLAN_ESE
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002725 case eWNI_SME_TSM_IE_IND:
2726 if (pMsg->bodyptr) {
2727 sme_tsm_ie_ind(pMac, pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302728 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002729 } else {
2730 sms_log(pMac, LOGE, FL("Empty message for %d"),
2731 pMsg->type);
2732 }
2733 break;
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08002734#endif /* FEATURE_WLAN_ESE */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002735 case eWNI_SME_ROAM_SCAN_OFFLOAD_RSP:
2736 status = csr_roam_offload_scan_rsp_hdlr((void *)pMac,
2737 pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302738 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002739 break;
2740#ifdef WLAN_FEATURE_GTK_OFFLOAD
2741 case eWNI_PMC_GTK_OFFLOAD_GETINFO_RSP:
Sreelakshmi Konamki6a065362016-05-31 16:05:01 +05302742 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_RX_WMA_MSG,
2743 NO_SESSION, pMsg->type));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002744 if (pMsg->bodyptr) {
2745 sme_process_get_gtk_info_rsp(pMac, pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302746 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002747 } else {
2748 sms_log(pMac, LOGE, FL("Empty message for %d"),
2749 pMsg->type);
2750 }
2751 break;
2752#endif
2753#ifdef FEATURE_WLAN_LPHB
2754 /* LPHB timeout indication arrived, send IND to client */
2755 case eWNI_SME_LPHB_IND:
Sreelakshmi Konamki6a065362016-05-31 16:05:01 +05302756 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_RX_WMA_MSG,
2757 NO_SESSION, pMsg->type));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002758 if (pMac->sme.pLphbIndCb)
2759 pMac->sme.pLphbIndCb(pMac->hHdd, pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302760 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002761 break;
2762#endif /* FEATURE_WLAN_LPHB */
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08002763 case eWNI_SME_IBSS_PEER_INFO_RSP:
2764 if (pMsg->bodyptr) {
Jeff Johnson49c02f92016-10-07 10:29:09 -07002765 sme_ibss_peer_info_response_handler(pMac,
2766 pMsg->bodyptr);
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08002767 qdf_mem_free(pMsg->bodyptr);
2768 } else {
2769 sms_log(pMac, LOGE, FL("Empty message for %d"),
2770 pMsg->type);
2771 }
2772 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002773 case eWNI_SME_READY_TO_SUSPEND_IND:
2774 if (pMsg->bodyptr) {
2775 sme_process_ready_to_suspend(pMac, pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302776 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002777 } else {
2778 sms_log(pMac, LOGE, FL("Empty message for %d"),
2779 pMsg->type);
2780 }
2781 break;
2782#ifdef WLAN_FEATURE_EXTWOW_SUPPORT
2783 case eWNI_SME_READY_TO_EXTWOW_IND:
2784 if (pMsg->bodyptr) {
Krishna Kumaar Natarajand9131902015-10-19 11:52:47 -07002785 sme_process_ready_to_ext_wow(pMac, pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302786 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002787 } else {
2788 sms_log(pMac, LOGE, FL("Empty message for %d"),
2789 pMsg->type);
2790 }
2791 break;
2792#endif
2793#ifdef FEATURE_WLAN_CH_AVOID
2794 /* channel avoid message arrived, send IND to client */
2795 case eWNI_SME_CH_AVOID_IND:
Sreelakshmi Konamki6a065362016-05-31 16:05:01 +05302796 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_RX_WMA_MSG,
2797 NO_SESSION, pMsg->type));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002798 if (pMac->sme.pChAvoidNotificationCb) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302799 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002800 FL("CH avoid notification"));
2801 pMac->sme.pChAvoidNotificationCb(pMac->hHdd,
2802 pMsg->bodyptr);
2803 }
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302804 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002805 break;
2806#endif /* FEATURE_WLAN_CH_AVOID */
2807#ifdef FEATURE_WLAN_AUTO_SHUTDOWN
2808 case eWNI_SME_AUTO_SHUTDOWN_IND:
2809 if (pMac->sme.pAutoShutdownNotificationCb) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302810 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002811 FL("Auto shutdown notification"));
2812 pMac->sme.pAutoShutdownNotificationCb();
2813 }
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302814 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002815 break;
2816#endif
2817 case eWNI_SME_DFS_RADAR_FOUND:
2818 case eWNI_SME_DFS_CSAIE_TX_COMPLETE_IND:
2819 status = dfs_msg_processor(pMac, pMsg->type, pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302820 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002821 break;
2822 case eWNI_SME_CHANNEL_CHANGE_RSP:
2823 if (pMsg->bodyptr) {
2824 status = sme_process_channel_change_resp(pMac,
2825 pMsg->type,
2826 pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302827 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002828 } else {
2829 sms_log(pMac, LOGE, FL("Empty message for %d"),
2830 pMsg->type);
2831 }
2832 break;
2833#ifdef WLAN_FEATURE_STATS_EXT
2834 case eWNI_SME_STATS_EXT_EVENT:
2835 if (pMsg->bodyptr) {
2836 status = sme_stats_ext_event(hHal, pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302837 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002838 } else {
2839 sms_log(pMac, LOGE, FL("Empty message for %d"),
2840 pMsg->type);
2841 }
2842 break;
2843#endif
2844 case eWNI_SME_LINK_SPEED_IND:
2845 if (pMac->sme.pLinkSpeedIndCb)
2846 pMac->sme.pLinkSpeedIndCb(pMsg->bodyptr,
2847 pMac->sme.pLinkSpeedCbContext);
2848 if (pMsg->bodyptr)
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302849 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002850 break;
2851 case eWNI_SME_CSA_OFFLOAD_EVENT:
2852 if (pMsg->bodyptr) {
2853 csr_scan_flush_bss_entry(pMac, pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302854 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002855 }
2856 break;
Manikandan Mohandcc21ba2016-03-15 14:31:56 -07002857 case eWNI_SME_TSF_EVENT:
2858 if (pMac->sme.get_tsf_cb) {
2859 pMac->sme.get_tsf_cb(pMac->sme.get_tsf_cxt,
2860 (struct stsf *)pMsg->bodyptr);
2861 }
2862 if (pMsg->bodyptr)
2863 qdf_mem_free(pMsg->bodyptr);
2864 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002865#ifdef WLAN_FEATURE_NAN
2866 case eWNI_SME_NAN_EVENT:
Sreelakshmi Konamki6a065362016-05-31 16:05:01 +05302867 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_RX_WMA_MSG,
2868 NO_SESSION, pMsg->type));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002869 if (pMsg->bodyptr) {
2870 sme_nan_event(hHal, pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302871 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002872 }
2873 break;
2874#endif /* WLAN_FEATURE_NAN */
2875 case eWNI_SME_LINK_STATUS_IND:
2876 {
2877 tAniGetLinkStatus *pLinkStatus =
2878 (tAniGetLinkStatus *) pMsg->bodyptr;
2879 if (pLinkStatus) {
2880 if (pMac->sme.linkStatusCallback) {
2881 pMac->sme.linkStatusCallback(
2882 pLinkStatus->linkStatus,
2883 pMac->sme.linkStatusContext);
2884 }
2885 pMac->sme.linkStatusCallback = NULL;
2886 pMac->sme.linkStatusContext = NULL;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302887 qdf_mem_free(pLinkStatus);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002888 }
2889 break;
2890 }
2891 case eWNI_SME_MSG_GET_TEMPERATURE_IND:
2892 if (pMac->sme.pGetTemperatureCb) {
2893 pMac->sme.pGetTemperatureCb(pMsg->bodyval,
2894 pMac->sme.pTemperatureCbContext);
2895 }
2896 break;
2897 case eWNI_SME_SNR_IND:
2898 {
2899 tAniGetSnrReq *pSnrReq = (tAniGetSnrReq *) pMsg->bodyptr;
2900 if (pSnrReq) {
2901 if (pSnrReq->snrCallback) {
2902 ((tCsrSnrCallback)
2903 (pSnrReq->snrCallback))
2904 (pSnrReq->snr, pSnrReq->staId,
2905 pSnrReq->pDevContext);
2906 }
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302907 qdf_mem_free(pSnrReq);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002908 }
2909 break;
2910 }
2911#ifdef FEATURE_WLAN_EXTSCAN
2912 case eWNI_SME_EXTSCAN_FULL_SCAN_RESULT_IND:
2913 if (pMac->sme.pExtScanIndCb)
2914 pMac->sme.pExtScanIndCb(pMac->hHdd,
2915 eSIR_EXTSCAN_FULL_SCAN_RESULT_IND,
2916 pMsg->bodyptr);
2917 else
2918 sms_log(pMac, LOGE,
2919 FL("callback not registered to process %d"),
2920 pMsg->type);
2921
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302922 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002923 break;
2924 case eWNI_SME_EPNO_NETWORK_FOUND_IND:
2925 if (pMac->sme.pExtScanIndCb)
2926 pMac->sme.pExtScanIndCb(pMac->hHdd,
2927 eSIR_EPNO_NETWORK_FOUND_IND,
2928 pMsg->bodyptr);
2929 else
2930 sms_log(pMac, LOGE,
2931 FL("callback not registered to process %d"),
2932 pMsg->type);
2933
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302934 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002935 break;
2936#endif
2937 case eWNI_SME_FW_DUMP_IND:
2938 sme_process_fw_mem_dump_rsp(pMac, pMsg);
2939 break;
2940 case eWNI_SME_SET_HW_MODE_RESP:
2941 if (pMsg->bodyptr) {
2942 status = sme_process_set_hw_mode_resp(pMac,
2943 pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302944 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002945 } else {
2946 sms_log(pMac, LOGE, FL("Empty message for %d"),
2947 pMsg->type);
2948 }
2949 break;
2950 case eWNI_SME_HW_MODE_TRANS_IND:
2951 if (pMsg->bodyptr) {
2952 status = sme_process_hw_mode_trans_ind(pMac,
2953 pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302954 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002955 } else {
2956 sms_log(pMac, LOGE, FL("Empty message for %d"),
2957 pMsg->type);
2958 }
2959 break;
2960 case eWNI_SME_NSS_UPDATE_RSP:
2961 if (pMsg->bodyptr) {
2962 status = sme_process_nss_update_resp(pMac,
2963 pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302964 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002965 } else {
2966 sms_log(pMac, LOGE, FL("Empty message for %d"),
2967 pMsg->type);
2968 }
2969 break;
2970 case eWNI_SME_OCB_SET_CONFIG_RSP:
2971 if (pMac->sme.ocb_set_config_callback) {
2972 pMac->sme.ocb_set_config_callback(
2973 pMac->sme.ocb_set_config_context,
2974 pMsg->bodyptr);
2975 } else {
2976 sms_log(pMac, LOGE, FL(
2977 "Message error. The callback is NULL."));
2978 }
2979 pMac->sme.ocb_set_config_callback = NULL;
2980 pMac->sme.ocb_set_config_context = NULL;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302981 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002982 break;
2983 case eWNI_SME_OCB_GET_TSF_TIMER_RSP:
2984 if (pMac->sme.ocb_get_tsf_timer_callback) {
2985 pMac->sme.ocb_get_tsf_timer_callback(
2986 pMac->sme.ocb_get_tsf_timer_context,
2987 pMsg->bodyptr);
2988 } else {
2989 sms_log(pMac, LOGE, FL(
2990 "Message error. The callback is NULL."));
2991 }
2992 pMac->sme.ocb_get_tsf_timer_callback = NULL;
2993 pMac->sme.ocb_get_tsf_timer_context = NULL;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302994 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002995 break;
2996 case eWNI_SME_DCC_GET_STATS_RSP:
2997 if (pMac->sme.dcc_get_stats_callback) {
2998 pMac->sme.dcc_get_stats_callback(
2999 pMac->sme.dcc_get_stats_context,
3000 pMsg->bodyptr);
3001 } else {
3002 sms_log(pMac, LOGE, FL(
3003 "Message error. The callback is NULL."));
3004 }
3005 pMac->sme.dcc_get_stats_callback = NULL;
3006 pMac->sme.dcc_get_stats_context = NULL;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303007 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003008 break;
3009 case eWNI_SME_DCC_UPDATE_NDL_RSP:
3010 if (pMac->sme.dcc_update_ndl_callback) {
3011 pMac->sme.dcc_update_ndl_callback(
3012 pMac->sme.dcc_update_ndl_context,
3013 pMsg->bodyptr);
3014 } else {
3015 sms_log(pMac, LOGE, FL(
3016 "Message error. The callback is NULL."));
3017 }
3018 pMac->sme.dcc_update_ndl_callback = NULL;
3019 pMac->sme.dcc_update_ndl_context = NULL;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303020 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003021 break;
3022 case eWNI_SME_DCC_STATS_EVENT:
3023 if (pMac->sme.dcc_stats_event_callback) {
3024 pMac->sme.dcc_stats_event_callback(
3025 pMac->sme.dcc_stats_event_context,
3026 pMsg->bodyptr);
3027 } else {
3028 sms_log(pMac, LOGE, FL(
3029 "Message error. The callback is NULL."));
3030 }
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_SET_DUAL_MAC_CFG_RESP:
3034 if (pMsg->bodyptr) {
3035 status = sme_process_dual_mac_config_resp(pMac,
3036 pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303037 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003038 } else {
3039 sms_log(pMac, LOGE, FL("Empty message for %d"),
3040 pMsg->type);
3041 }
3042 case eWNI_SME_SET_THERMAL_LEVEL_IND:
3043 if (pMac->sme.set_thermal_level_cb)
3044 pMac->sme.set_thermal_level_cb(pMac->hHdd,
3045 pMsg->bodyval);
3046 break;
Abhishek Singh518323d2015-10-19 17:42:01 +05303047 case eWNI_SME_EXT_CHANGE_CHANNEL_IND:
3048 status = sme_extended_change_channel_ind(pMac, pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303049 qdf_mem_free(pMsg->bodyptr);
Abhishek Singh518323d2015-10-19 17:42:01 +05303050 break;
Archana Ramachandrana20ef812015-11-13 16:12:13 -08003051 case eWNI_SME_SET_ANTENNA_MODE_RESP:
3052 if (pMsg->bodyptr) {
3053 status = sme_process_antenna_mode_resp(pMac,
3054 pMsg->bodyptr);
3055 qdf_mem_free(pMsg->bodyptr);
3056 } else {
3057 sms_log(pMac, LOGE, FL("Empty message for %d"),
3058 pMsg->type);
3059 }
3060 break;
Deepak Dhamdhere0f076bd2016-06-02 11:29:21 -07003061 case eWNI_SME_NDP_CONFIRM_IND:
3062 case eWNI_SME_NDP_NEW_PEER_IND:
3063 case eWNI_SME_NDP_INITIATOR_RSP:
Abhishek Singh4fef7472016-06-06 11:36:03 -07003064 case eWNI_SME_NDP_INDICATION:
3065 case eWNI_SME_NDP_RESPONDER_RSP:
Naveen Rawatf28315c2016-06-29 18:06:02 -07003066 case eWNI_SME_NDP_END_RSP:
Deepak Dhamdherea6d2f4c2016-06-04 00:24:52 -07003067 case eWNI_SME_NDP_END_IND:
3068 case eWNI_SME_NDP_PEER_DEPARTED_IND:
Deepak Dhamdhere0f076bd2016-06-02 11:29:21 -07003069 sme_ndp_msg_processor(pMac, pMsg);
3070 break;
Sreelakshmi Konamki58c72432016-11-09 17:06:44 +05303071 case eWNI_SME_LOST_LINK_INFO_IND:
3072 if (pMac->sme.lost_link_info_cb)
3073 pMac->sme.lost_link_info_cb(pMac->hHdd,
3074 (struct sir_lost_link_info *)pMsg->bodyptr);
3075 qdf_mem_free(pMsg->bodyptr);
3076 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003077 default:
3078
3079 if ((pMsg->type >= eWNI_SME_MSG_TYPES_BEGIN)
3080 && (pMsg->type <= eWNI_SME_MSG_TYPES_END)) {
3081 /* CSR */
3082 if (pMsg->bodyptr) {
3083 status = csr_msg_processor(hHal, pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303084 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003085 } else {
3086 sms_log(pMac, LOGE, FL("Empty message for %d"),
3087 pMsg->type);
3088 }
3089 } else {
3090 sms_log(pMac, LOGW, FL("Unknown message type %d"),
3091 pMsg->type);
3092 if (pMsg->bodyptr)
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303093 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003094 }
3095 } /* switch */
3096release_lock:
3097 sme_release_global_lock(&pMac->sme);
3098 return status;
3099}
3100
Krunal Sonid32c6bc2016-10-18 18:00:21 -07003101#ifdef NAPIER_CODE
3102QDF_STATUS sme_mc_process_handler(struct scheduler_msg *msg)
3103{
3104 tpAniSirGlobal mac_ctx = cds_get_context(QDF_MODULE_ID_SME);
3105
3106 if (mac_ctx == NULL) {
3107 QDF_ASSERT(0);
3108 return QDF_STATUS_E_FAILURE;
3109 }
3110
3111 return sme_process_msg((tHalHandle)mac_ctx, (cds_msg_t *)msg);
3112}
3113#endif
3114
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003115/**
3116 * sme_process_nss_update_resp() - Process nss update response
3117 * @mac: Global MAC pointer
3118 * @msg: nss update response
3119 *
3120 * Processes the nss update response and invokes the HDD
3121 * callback to process further
3122 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303123QDF_STATUS sme_process_nss_update_resp(tpAniSirGlobal mac, uint8_t *msg)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003124{
3125 tListElem *entry = NULL;
3126 tSmeCmd *command = NULL;
3127 bool found;
3128 nss_update_cb callback = NULL;
3129 struct sir_beacon_tx_complete_rsp *param;
3130
3131 param = (struct sir_beacon_tx_complete_rsp *)msg;
3132 if (!param) {
3133 sms_log(mac, LOGE, FL("nss update resp param is NULL"));
3134 /* Not returning. Need to check if active command list
3135 * needs to be freed
3136 */
3137 }
3138
3139 entry = csr_ll_peek_head(&mac->sme.smeCmdActiveList,
3140 LL_ACCESS_LOCK);
3141 if (!entry) {
3142 sms_log(mac, LOGE, FL("No cmd found in active list"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303143 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003144 }
3145
3146 command = GET_BASE_ADDR(entry, tSmeCmd, Link);
3147 if (!command) {
3148 sms_log(mac, LOGE, FL("Base address is NULL"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303149 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003150 }
3151
3152 if (e_sme_command_nss_update != command->command) {
3153 sms_log(mac, LOGE, FL("Command mismatch!"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303154 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003155 }
3156
3157 callback = command->u.nss_update_cmd.nss_update_cb;
3158 if (callback) {
3159 if (!param) {
3160 sms_log(mac, LOGE,
3161 FL("Callback failed since nss update params is NULL"));
3162 } else {
3163 sms_log(mac, LOGE,
3164 FL("Calling HDD callback for nss update response"));
3165 callback(command->u.nss_update_cmd.context,
3166 param->tx_status,
3167 param->session_id,
Chandrasekaran, Manishekarce2172e2016-02-18 16:12:43 +05303168 command->u.nss_update_cmd.next_action,
3169 command->u.nss_update_cmd.reason);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003170 }
3171 } else {
3172 sms_log(mac, LOGE, FL("Callback does not exisit"));
3173 }
3174
3175 found = csr_ll_remove_entry(&mac->sme.smeCmdActiveList, entry,
3176 LL_ACCESS_LOCK);
3177 if (found) {
3178 /* Now put this command back on the avilable command list */
3179 sme_release_command(mac, command);
3180 }
3181 sme_process_pending_queue(mac);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303182 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003183}
3184
3185/* No need to hold the global lock here because this function can only be called */
3186/* after sme_stop. */
3187void sme_free_msg(tHalHandle hHal, cds_msg_t *pMsg)
3188{
3189 if (pMsg) {
3190 if (pMsg->bodyptr) {
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303191 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003192 }
3193 }
3194
3195}
3196
3197/*--------------------------------------------------------------------------
3198
3199 \brief sme_stop() - Stop all SME modules and put them at idle state
3200
3201 The function stops each module in SME, PMC, CSR, etc. . Upon
3202 return, all modules are at idle state ready to start.
3203
3204 This is a synchronous call
3205 \param hHal - The handle returned by mac_open
3206 \param tHalStopType - reason for stopping
3207
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303208 \return QDF_STATUS_SUCCESS - SME is stopped.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003209
3210 Other status means SME is failed to stop but caller should still
3211 consider SME is stopped.
3212 \sa
3213
3214 --------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303215QDF_STATUS sme_stop(tHalHandle hHal, tHalStopType stopType)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003216{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303217 QDF_STATUS status = QDF_STATUS_E_FAILURE;
3218 QDF_STATUS fail_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003219 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
3220
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003221 p2p_stop(hHal);
3222
3223 status = csr_stop(pMac, stopType);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303224 if (!QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003225 sms_log(pMac, LOGE,
3226 "csr_stop failed during smeStop with status=%d", status);
3227 fail_status = status;
3228 }
3229
3230 purge_sme_cmd_list(pMac);
3231
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303232 if (!QDF_IS_STATUS_SUCCESS(fail_status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003233 status = fail_status;
3234 }
3235
3236 pMac->sme.state = SME_STATE_STOP;
3237
3238 return status;
3239}
3240
3241/*--------------------------------------------------------------------------
3242
3243 \brief sme_close() - Release all SME modules and their resources.
3244
3245 The function release each module in SME, PMC, CSR, etc. . Upon
3246 return, all modules are at closed state.
3247
3248 No SME APIs can be involved after smeClose except smeOpen.
3249 smeClose must be called before mac_close.
3250 This is a synchronous call
3251 \param hHal - The handle returned by mac_open
3252
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303253 \return QDF_STATUS_SUCCESS - SME is successfully close.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003254
3255 Other status means SME is failed to be closed but caller still cannot
3256 call any other SME functions except smeOpen.
3257 \sa
3258
3259 --------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303260QDF_STATUS sme_close(tHalHandle hHal)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003261{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303262 QDF_STATUS status = QDF_STATUS_E_FAILURE;
3263 QDF_STATUS fail_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003264 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
3265
3266 if (!pMac)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303267 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003268
3269 /* Note: pSession will be invalid from here on, do not access */
3270 status = csr_close(pMac);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303271 if (!QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003272 sms_log(pMac, LOGE,
3273 "csr_close failed during sme close with status=%d",
3274 status);
3275 fail_status = status;
3276 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003277#ifndef WLAN_MDM_CODE_REDUCTION_OPT
3278 status = sme_qos_close(pMac);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303279 if (!QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003280 sms_log(pMac, LOGE,
3281 "Qos close failed during sme close with status=%d",
3282 status);
3283 fail_status = status;
3284 }
3285#endif
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003286 status = sme_ps_close(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303287 if (!QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003288 sms_log(pMac, LOGE,
3289 "sme_ps_close failed during smeClose status=%d",
3290 status);
3291 fail_status = status;
3292 }
3293
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003294 status = rrm_close(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303295 if (!QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003296 sms_log(pMac, LOGE,
3297 "RRM close failed during sme close with status=%d",
3298 status);
3299 fail_status = status;
3300 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003301
3302 sme_p2p_close(hHal);
3303
3304 free_sme_cmd_list(pMac);
3305
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303306 if (!QDF_IS_STATUS_SUCCESS
Anurag Chouhana37b5b72016-02-21 14:53:42 +05303307 (qdf_mutex_destroy(&pMac->sme.lkSmeGlobalLock))) {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303308 fail_status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003309 }
3310
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303311 if (!QDF_IS_STATUS_SUCCESS(fail_status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003312 status = fail_status;
3313 }
3314
3315 pMac->sme.state = SME_STATE_STOP;
3316
3317 return status;
3318}
3319
3320/**
Abhishek Singhc9941602016-08-09 16:06:22 +05303321 * sme_remove_bssid_from_scan_list() - wrapper to remove the bssid from
3322 * scan list
3323 * @hal: hal context.
3324 * @bssid: bssid to be removed
3325 *
3326 * This function remove the given bssid from scan list.
3327 *
3328 * Return: QDF status.
3329 */
3330QDF_STATUS sme_remove_bssid_from_scan_list(tHalHandle hal,
3331 tSirMacAddr bssid)
3332{
3333 QDF_STATUS status = QDF_STATUS_E_FAILURE;
3334 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
3335
3336 status = sme_acquire_global_lock(&mac_ctx->sme);
3337 if (QDF_IS_STATUS_SUCCESS(status)) {
3338 csr_remove_bssid_from_scan_list(mac_ctx, bssid);
3339 sme_release_global_lock(&mac_ctx->sme);
3340 }
3341
3342 return status;
3343}
3344
3345/**
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003346 * sme_scan_request() - wrapper function to Request a 11d or full scan from CSR.
3347 * @hal: hal global context
3348 * @session_id: session id
3349 * @scan_req: scan req
3350 * @callback: a callback function that scan calls upon finish, will not
3351 * be called if csr_scan_request returns error
3352 * @ctx: a pointer passed in for the callback
3353 *
3354 * This is a wrapper function to Request a 11d or full scan from CSR. This is
3355 * an asynchronous call
3356 *
3357 * Return: Status of operation
3358 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303359QDF_STATUS sme_scan_request(tHalHandle hal, uint8_t session_id,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003360 tCsrScanRequest *scan_req,
3361 csr_scan_completeCallback callback, void *ctx)
3362{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303363 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003364 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
3365 struct ani_scan_req *scan_msg;
3366 cds_msg_t msg;
3367 uint32_t scan_req_id, scan_count;
3368
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303369 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003370 TRACE_CODE_SME_RX_HDD_MSG_SCAN_REQ, session_id,
3371 scan_req->scanType));
Chandrasekaran, Manishekar2859de42016-02-11 16:17:38 +05303372
3373 if (!CSR_IS_SESSION_VALID(mac_ctx, session_id)) {
3374 sms_log(mac_ctx, LOGE, FL("Invalid session id:%d"),
3375 session_id);
3376 return status;
3377 }
3378
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003379 if (!mac_ctx->scan.fScanEnable) {
3380 sms_log(mac_ctx, LOGE, FL("fScanEnable false"));
3381 return status;
3382 }
3383
3384 scan_count = csr_ll_count(&mac_ctx->sme.smeScanCmdActiveList);
3385 if (scan_count >= mac_ctx->scan.max_scan_count) {
3386 sms_log(mac_ctx, LOGE, FL("Max scan reached"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303387 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003388 }
3389 wma_get_scan_id(&scan_req_id);
3390 scan_req->scan_id = scan_req_id;
3391
3392 status = sme_acquire_global_lock(&mac_ctx->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303393 if (!QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003394 sms_log(mac_ctx, LOGE, FL("Unable to acquire lock"));
3395 return status;
3396 }
3397 sms_log(mac_ctx, LOG1, FL(" called"));
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303398 scan_msg = qdf_mem_malloc(sizeof(struct ani_scan_req));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003399 if (NULL == scan_msg) {
3400 sms_log(mac_ctx, LOGE,
3401 " scan_req: failed to allocate mem for msg");
3402 sme_release_global_lock(&mac_ctx->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303403 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003404 }
3405 scan_msg->msg_type = eWNI_SME_SCAN_CMD;
3406 scan_msg->msg_len = (uint16_t) sizeof(struct ani_scan_req);
3407 scan_msg->session_id = session_id;
3408 scan_msg->callback = callback;
3409 scan_msg->ctx = ctx;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303410 scan_msg->scan_param = qdf_mem_malloc(sizeof(tCsrScanRequest));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003411 if (NULL == scan_msg->scan_param) {
3412 sms_log(mac_ctx, LOGE,
3413 "scan_req:failed to allocate mem for scanreq");
3414 sme_release_global_lock(&mac_ctx->sme);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303415 qdf_mem_free(scan_msg);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303416 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003417 }
3418 csr_scan_copy_request(mac_ctx, scan_msg->scan_param, scan_req);
3419 msg.type = eWNI_SME_SCAN_CMD;
3420 msg.bodyptr = scan_msg;
3421 msg.reserved = 0;
3422 msg.bodyval = 0;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303423 if (QDF_STATUS_SUCCESS !=
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003424 cds_mq_post_message(CDS_MQ_ID_SME, &msg)) {
3425 sms_log(mac_ctx, LOGE,
3426 " sme_scan_req failed to post msg");
3427 csr_scan_free_request(mac_ctx, scan_msg->scan_param);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303428 qdf_mem_free(scan_msg->scan_param);
3429 qdf_mem_free(scan_msg);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303430 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003431 }
3432 sme_release_global_lock(&mac_ctx->sme);
3433 return status;
3434}
3435
3436/* ---------------------------------------------------------------------------
3437 \fn sme_scan_get_result
3438 \brief a wrapper function to request scan results from CSR.
3439 This is a synchronous call
3440 \param pFilter - If pFilter is NULL, all cached results are returned
3441 \param phResult - an object for the result.
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303442 \return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003443 ---------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303444QDF_STATUS sme_scan_get_result(tHalHandle hHal, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003445 tCsrScanResultFilter *pFilter,
3446 tScanResultHandle *phResult)
3447{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303448 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003449 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
3450
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303451 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003452 TRACE_CODE_SME_RX_HDD_MSG_SCAN_GET_RESULTS, sessionId,
3453 0));
3454 sms_log(pMac, LOG2, FL("enter"));
3455 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303456 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003457 status = csr_scan_get_result(hHal, pFilter, phResult);
3458 sme_release_global_lock(&pMac->sme);
3459 }
3460 sms_log(pMac, LOG2, FL("exit status %d"), status);
3461
3462 return status;
3463}
3464
3465/**
3466 * sme_get_ap_channel_from_scan_cache() - a wrapper function to get AP's
3467 * channel id from CSR by filtering the
3468 * result which matches our roam profile.
3469 * @profile: SAP adapter
3470 * @ap_chnl_id: pointer to channel id of SAP. Fill the value after finding the
3471 * best ap from scan cache.
3472 *
3473 * This function is written to get AP's channel id from CSR by filtering
3474 * the result which matches our roam profile. This is a synchronous call.
3475 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303476 * Return: QDF_STATUS.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003477 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303478QDF_STATUS sme_get_ap_channel_from_scan_cache(tHalHandle hal_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003479 tCsrRoamProfile *profile,
3480 tScanResultHandle *scan_cache,
3481 uint8_t *ap_chnl_id)
3482{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303483 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003484 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal_handle);
3485 tCsrScanResultFilter *scan_filter = NULL;
3486 tScanResultHandle filtered_scan_result = NULL;
3487 tSirBssDescription first_ap_profile;
3488
3489 if (NULL == mac_ctx) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303490 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003491 FL("mac_ctx is NULL"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303492 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003493 }
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303494 scan_filter = qdf_mem_malloc(sizeof(tCsrScanResultFilter));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003495 if (NULL == scan_filter) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303496 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003497 FL("scan_filter mem alloc failed"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303498 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003499 } else {
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303500 qdf_mem_set(&first_ap_profile, sizeof(tSirBssDescription), 0);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003501
3502 if (NULL == profile) {
3503 scan_filter->EncryptionType.numEntries = 1;
3504 scan_filter->EncryptionType.encryptionType[0]
3505 = eCSR_ENCRYPT_TYPE_NONE;
3506 } else {
3507 /* Here is the profile we need to connect to */
3508 status = csr_roam_prepare_filter_from_profile(mac_ctx,
3509 profile,
3510 scan_filter);
3511 }
3512
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303513 if (QDF_STATUS_SUCCESS == status) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003514 /* Save the WPS info */
3515 if (NULL != profile) {
3516 scan_filter->bWPSAssociation =
3517 profile->bWPSAssociation;
3518 scan_filter->bOSENAssociation =
3519 profile->bOSENAssociation;
3520 } else {
3521 scan_filter->bWPSAssociation = 0;
3522 scan_filter->bOSENAssociation = 0;
3523 }
3524 } else {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303525 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003526 FL("Preparing the profile filter failed"));
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303527 qdf_mem_free(scan_filter);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303528 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003529 }
3530 }
3531 status = sme_acquire_global_lock(&mac_ctx->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303532 if (QDF_STATUS_SUCCESS == status) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003533 status = csr_scan_get_result(hal_handle, scan_filter,
3534 &filtered_scan_result);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303535 if (QDF_STATUS_SUCCESS == status) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003536 csr_get_bssdescr_from_scan_handle(filtered_scan_result,
3537 &first_ap_profile);
3538 *scan_cache = filtered_scan_result;
3539 if (0 != first_ap_profile.channelId) {
3540 *ap_chnl_id = first_ap_profile.channelId;
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303541 QDF_TRACE(QDF_MODULE_ID_SME,
3542 QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003543 FL("Found best AP & its on chnl[%d]"),
3544 first_ap_profile.channelId);
3545 } else {
3546 /*
3547 * This means scan result is empty
3548 * so set the channel to zero, caller should
3549 * take of zero channel id case.
3550 */
3551 *ap_chnl_id = 0;
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303552 QDF_TRACE(QDF_MODULE_ID_SME,
3553 QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003554 FL("Scan is empty, set chnl to 0"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303555 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003556 }
3557 } else {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303558 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003559 FL("Failed to get scan get result"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303560 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003561 }
3562 csr_free_scan_filter(mac_ctx, scan_filter);
3563 sme_release_global_lock(&mac_ctx->sme);
3564 } else {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303565 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003566 FL("Aquiring lock failed"));
Krunal Sonif9882222016-01-22 17:16:50 -08003567 csr_free_scan_filter(mac_ctx, scan_filter);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303568 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003569 }
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303570 qdf_mem_free(scan_filter);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003571 return status;
3572}
3573
3574/**
3575 * sme_store_joinreq_param() - This function will pass station's join
3576 * request to store to csr.
3577 * @hal_handle: pointer to hal context.
3578 * @profile: pointer to station's roam profile.
3579 * @scan_cache: pointer to station's scan cache.
3580 * @roam_id: reference to roam_id variable being passed.
3581 * @session_id: station's session id.
3582 *
3583 * This function will pass station's join request further down to csr
3584 * to store it. this stored parameter will be used later.
3585 *
3586 * Return: true or false based on function's overall success.
3587 **/
3588bool sme_store_joinreq_param(tHalHandle hal_handle,
3589 tCsrRoamProfile *profile,
3590 tScanResultHandle scan_cache,
3591 uint32_t *roam_id,
3592 uint32_t session_id)
3593{
3594 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal_handle);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303595 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003596 bool ret_status = true;
3597
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303598 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003599 TRACE_CODE_SME_RX_HDD_STORE_JOIN_REQ,
3600 session_id, 0));
3601 status = sme_acquire_global_lock(&mac_ctx->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303602 if (QDF_STATUS_SUCCESS == status) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003603 if (false == csr_store_joinreq_param(mac_ctx, profile,
3604 scan_cache, roam_id, session_id)) {
3605 ret_status = false;
3606 }
3607 sme_release_global_lock(&mac_ctx->sme);
3608 } else {
3609 ret_status = false;
3610 }
3611
3612 return ret_status;
3613}
3614
3615/**
3616 * sme_clear_joinreq_param() - This function will pass station's clear
3617 * the join request to csr.
3618 * @hal_handle: pointer to hal context.
3619 * @session_id: station's session id.
3620 *
3621 * This function will pass station's clear join request further down to csr
3622 * to cleanup.
3623 *
3624 * Return: true or false based on function's overall success.
3625 **/
3626bool sme_clear_joinreq_param(tHalHandle hal_handle,
3627 uint32_t session_id)
3628{
3629 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal_handle);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303630 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003631 bool ret_status = true;
3632
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303633 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003634 TRACE_CODE_SME_RX_HDD_CLEAR_JOIN_REQ,
3635 session_id, 0));
3636 status = sme_acquire_global_lock(&mac_ctx->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303637 if (QDF_STATUS_SUCCESS == status) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003638 if (false == csr_clear_joinreq_param(mac_ctx,
3639 session_id)) {
3640 ret_status = false;
3641 }
3642 sme_release_global_lock(&mac_ctx->sme);
3643 } else {
3644 ret_status = false;
3645 }
3646
3647 return ret_status;
3648}
3649
3650/**
3651 * sme_issue_stored_joinreq() - This function will issues station's stored
3652 * the join request to csr.
3653 * @hal_handle: pointer to hal context.
3654 * @roam_id: reference to roam_id variable being passed.
3655 * @session_id: station's session id.
3656 *
3657 * This function will issue station's stored join request further down to csr
3658 * to proceed forward.
3659 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303660 * Return: QDF_STATUS_SUCCESS or QDF_STATUS_E_FAILURE.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003661 **/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303662QDF_STATUS sme_issue_stored_joinreq(tHalHandle hal_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003663 uint32_t *roam_id,
3664 uint32_t session_id)
3665{
3666 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal_handle);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303667 QDF_STATUS status = QDF_STATUS_E_FAILURE;
3668 QDF_STATUS ret_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003669
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303670 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003671 TRACE_CODE_SME_RX_HDD_ISSUE_JOIN_REQ,
3672 session_id, 0));
3673 status = sme_acquire_global_lock(&mac_ctx->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303674 if (QDF_STATUS_SUCCESS == status) {
3675 if (QDF_STATUS_SUCCESS != csr_issue_stored_joinreq(mac_ctx,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003676 roam_id,
3677 session_id)) {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303678 ret_status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003679 }
3680 sme_release_global_lock(&mac_ctx->sme);
3681 } else {
3682 csr_clear_joinreq_param(mac_ctx, session_id);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303683 ret_status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003684 }
3685 return ret_status;
3686}
3687
3688/* ---------------------------------------------------------------------------
3689 \fn sme_scan_flush_result
3690 \brief a wrapper function to request CSR to clear scan results.
3691 This is a synchronous call
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303692 \return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003693 ---------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303694QDF_STATUS sme_scan_flush_result(tHalHandle hHal)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003695{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303696 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003697 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
3698
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303699 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003700 TRACE_CODE_SME_RX_HDD_MSG_SCAN_FLUSH_RESULTS,
3701 0, 0));
3702 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303703 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003704 status = csr_scan_flush_result(hHal);
3705 sme_release_global_lock(&pMac->sme);
3706 }
3707
3708 return status;
3709}
3710
3711/* ---------------------------------------------------------------------------
3712 \fn sme_filter_scan_results
3713 \brief a wrapper function to request CSR to clear scan results.
3714 This is a synchronous call
3715 \param tHalHandle - HAL context handle
3716 \param sessionId - session id
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303717 \return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003718 ---------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303719QDF_STATUS sme_filter_scan_results(tHalHandle hHal, uint8_t sessionId)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003720{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303721 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003722 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
3723
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303724 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003725 TRACE_CODE_SME_RX_HDD_MSG_SCAN_FLUSH_RESULTS,
3726 sessionId, 0));
3727 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303728 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003729 csr_scan_filter_results(pMac);
3730 sme_release_global_lock(&pMac->sme);
3731 }
3732
3733 return status;
3734}
3735
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303736QDF_STATUS sme_scan_flush_p2p_result(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_E_FAILURE;
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_P2PRESULTS,
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 status = csr_scan_flush_selective_result(hHal, true);
3747 sme_release_global_lock(&pMac->sme);
3748 }
3749
3750 return status;
3751}
3752
3753/* ---------------------------------------------------------------------------
3754 \fn sme_scan_result_get_first
3755 \brief a wrapper function to request CSR to returns the first element of
3756 scan result.
3757 This is a synchronous call
3758 \param hScanResult - returned from csr_scan_get_result
3759 \return tCsrScanResultInfo * - NULL if no result
3760 ---------------------------------------------------------------------------*/
3761tCsrScanResultInfo *sme_scan_result_get_first(tHalHandle hHal,
3762 tScanResultHandle hScanResult)
3763{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303764 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003765 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
3766 tCsrScanResultInfo *pRet = NULL;
3767
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303768 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003769 TRACE_CODE_SME_RX_HDD_MSG_SCAN_RESULT_GETFIRST,
3770 NO_SESSION, 0));
3771 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303772 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003773 pRet = csr_scan_result_get_first(pMac, hScanResult);
3774 sme_release_global_lock(&pMac->sme);
3775 }
3776
3777 return pRet;
3778}
3779
3780/* ---------------------------------------------------------------------------
3781 \fn sme_scan_result_get_next
3782 \brief a wrapper function to request CSR to returns the next element of
3783 scan result. It can be called without calling csr_scan_result_get_first
3784 first
3785 This is a synchronous call
3786 \param hScanResult - returned from csr_scan_get_result
3787 \return Null if no result or reach the end
3788 ---------------------------------------------------------------------------*/
3789tCsrScanResultInfo *sme_scan_result_get_next(tHalHandle hHal,
3790 tScanResultHandle hScanResult)
3791{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303792 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003793 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
3794 tCsrScanResultInfo *pRet = NULL;
3795
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003796 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303797 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003798 pRet = csr_scan_result_get_next(pMac, hScanResult);
3799 sme_release_global_lock(&pMac->sme);
3800 }
3801
3802 return pRet;
3803}
3804
3805/* ---------------------------------------------------------------------------
3806 \fn sme_scan_result_purge
3807 \brief a wrapper function to request CSR to remove all items(tCsrScanResult)
3808 in the list and free memory for each item
3809 This is a synchronous call
3810 \param hScanResult - returned from csr_scan_get_result. hScanResult is
3811 considered gone by
3812 calling this function and even before this function reutrns.
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303813 \return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003814 ---------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303815QDF_STATUS sme_scan_result_purge(tHalHandle hHal, tScanResultHandle hScanResult)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003816{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303817 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003818 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
3819
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303820 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003821 TRACE_CODE_SME_RX_HDD_MSG_SCAN_RESULT_PURGE,
3822 NO_SESSION, 0));
3823 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303824 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003825 status = csr_scan_result_purge(hHal, hScanResult);
3826 sme_release_global_lock(&pMac->sme);
3827 }
3828
3829 return status;
3830}
3831
3832/* ---------------------------------------------------------------------------
3833 \fn sme_scan_get_pmkid_candidate_list
3834 \brief a wrapper function to return the PMKID candidate list
3835 This is a synchronous call
3836 \param pPmkidList - caller allocated buffer point to an array of
3837 tPmkidCandidateInfo
3838 \param pNumItems - pointer to a variable that has the number of
3839 tPmkidCandidateInfo allocated when retruning, this is
3840 either the number needed or number of items put into
3841 pPmkidList
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303842 \return QDF_STATUS - when fail, it usually means the buffer allocated is not
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003843 big enough and pNumItems
3844 has the number of tPmkidCandidateInfo.
3845 \Note: pNumItems is a number of tPmkidCandidateInfo,
3846 not sizeof(tPmkidCandidateInfo) * something
3847 ---------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303848QDF_STATUS sme_scan_get_pmkid_candidate_list(tHalHandle hHal, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003849 tPmkidCandidateInfo *pPmkidList,
3850 uint32_t *pNumItems)
3851{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303852 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003853 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
3854
3855 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303856 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003857 status =
3858 csr_scan_get_pmkid_candidate_list(pMac, sessionId,
3859 pPmkidList,
3860 pNumItems);
3861 sme_release_global_lock(&pMac->sme);
3862 }
3863
3864 return status;
3865}
3866
3867eCsrPhyMode sme_get_phy_mode(tHalHandle hHal)
3868{
3869 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
3870 return pMac->roam.configParam.phyMode;
3871}
3872
3873/* ---------------------------------------------------------------------------
3874 \fn sme_get_channel_bonding_mode5_g
3875 \brief get the channel bonding mode for 5G band
3876 \param hHal - HAL handle
3877 \return channel bonding mode for 5G
3878 ---------------------------------------------------------------------------*/
3879uint32_t sme_get_channel_bonding_mode5_g(tHalHandle hHal)
3880{
3881 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
3882 tSmeConfigParams smeConfig;
3883
3884 sme_get_config_param(pMac, &smeConfig);
3885
3886 return smeConfig.csrConfig.channelBondingMode5GHz;
3887}
3888
3889/* ---------------------------------------------------------------------------
3890 \fn sme_get_channel_bonding_mode24_g
3891 \brief get the channel bonding mode for 2.4G band
3892 \param hHal - HAL handle
3893 \return channel bonding mode for 2.4G
3894 ---------------------------------------------------------------------------*/
3895uint32_t sme_get_channel_bonding_mode24_g(tHalHandle hHal)
3896{
3897 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
3898 tSmeConfigParams smeConfig;
3899
3900 sme_get_config_param(pMac, &smeConfig);
3901
3902 return smeConfig.csrConfig.channelBondingMode24GHz;
3903}
3904
3905/* ---------------------------------------------------------------------------
3906 \fn sme_roam_connect
3907 \brief a wrapper function to request CSR to inititiate an association
3908 This is an asynchronous call.
3909 \param sessionId - the sessionId returned by sme_open_session.
3910 \param pProfile - description of the network to which to connect
3911 \param hBssListIn - a list of BSS descriptor to roam to. It is returned
3912 from csr_scan_get_result
3913 \param pRoamId - to get back the request ID
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303914 \return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003915 ---------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303916QDF_STATUS sme_roam_connect(tHalHandle hHal, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003917 tCsrRoamProfile *pProfile, uint32_t *pRoamId)
3918{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303919 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003920 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
3921
3922 if (!pMac) {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303923 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003924 }
3925
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303926 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003927 TRACE_CODE_SME_RX_HDD_MSG_CONNECT, sessionId, 0));
3928 sms_log(pMac, LOG2, FL("enter"));
3929 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303930 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003931 if (CSR_IS_SESSION_VALID(pMac, sessionId)) {
3932 status =
3933 csr_roam_connect(pMac, sessionId, pProfile,
3934 pRoamId);
3935 } else {
3936 sms_log(pMac, LOGE, FL("invalid sessionID %d"),
3937 sessionId);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303938 status = QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003939 }
3940 sme_release_global_lock(&pMac->sme);
3941 } else {
3942 sms_log(pMac, LOGE, FL("sme_acquire_global_lock failed"));
3943 }
3944
3945 return status;
3946}
3947
3948/* ---------------------------------------------------------------------------
3949
3950 \fn sme_set_phy_mode
3951
3952 \brief Changes the PhyMode.
3953
3954 \param hHal - The handle returned by mac_open.
3955
3956 \param phyMode new phyMode which is to set
3957
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303958 \return QDF_STATUS SUCCESS.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003959
3960 -------------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303961QDF_STATUS sme_set_phy_mode(tHalHandle hHal, eCsrPhyMode phyMode)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003962{
3963 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
3964
3965 if (NULL == pMac) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303966 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003967 "%s: invalid context", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303968 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003969 }
3970
3971 pMac->roam.configParam.phyMode = phyMode;
3972 pMac->roam.configParam.uCfgDot11Mode =
3973 csr_get_cfg_dot11_mode_from_csr_phy_mode(NULL,
3974 pMac->roam.configParam.phyMode,
3975 pMac->roam.configParam.
3976 ProprietaryRatesEnabled);
3977
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303978 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003979}
3980
3981/* ---------------------------------------------------------------------------
3982 \fn sme_roam_reassoc
3983 \brief a wrapper function to request CSR to inititiate a re-association
3984 \param pProfile - can be NULL to join the currently connected AP. In that
3985 case modProfileFields should carry the modified field(s) which could trigger
3986 reassoc
3987 \param modProfileFields - fields which are part of tCsrRoamConnectedProfile
3988 that might need modification dynamically once STA is up & running and this
3989 could trigger a reassoc
3990 \param pRoamId - to get back the request ID
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303991 \return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003992 -------------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303993QDF_STATUS sme_roam_reassoc(tHalHandle hHal, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003994 tCsrRoamProfile *pProfile,
3995 tCsrRoamModifyProfileFields modProfileFields,
3996 uint32_t *pRoamId, bool fForce)
3997{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303998 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003999 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
4000
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05304001 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004002 TRACE_CODE_SME_RX_HDD_ROAM_REASSOC, sessionId, 0));
4003 sms_log(pMac, LOG2, FL("enter"));
4004 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304005 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004006 if (CSR_IS_SESSION_VALID(pMac, sessionId)) {
4007 if ((NULL == pProfile) && (fForce == 1)) {
4008 status =
4009 csr_reassoc(pMac, sessionId,
4010 &modProfileFields, pRoamId,
4011 fForce);
4012 } else {
4013 status =
4014 csr_roam_reassoc(pMac, sessionId, pProfile,
4015 modProfileFields, pRoamId);
4016 }
4017 } else {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304018 status = QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004019 }
4020 sme_release_global_lock(&pMac->sme);
4021 }
4022
4023 return status;
4024}
4025
4026/* ---------------------------------------------------------------------------
4027 \fn sme_roam_connect_to_last_profile
4028 \brief a wrapper function to request CSR to disconnect and reconnect with
4029 the same profile
4030 This is an asynchronous call.
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304031 \return QDF_STATUS. It returns fail if currently connected
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004032 ---------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304033QDF_STATUS sme_roam_connect_to_last_profile(tHalHandle hHal, uint8_t sessionId)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004034{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304035 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004036 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
4037
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05304038 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004039 TRACE_CODE_SME_RX_HDD_ROAM_GET_CONNECTPROFILE,
4040 sessionId, 0));
4041 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304042 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004043 if (CSR_IS_SESSION_VALID(pMac, sessionId)) {
4044 status = csr_roam_connect_to_last_profile(pMac, sessionId);
4045 } else {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304046 status = QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004047 }
4048 sme_release_global_lock(&pMac->sme);
4049 }
4050
4051 return status;
4052}
4053
4054/* ---------------------------------------------------------------------------
4055 \fn sme_roam_disconnect
4056 \brief a wrapper function to request CSR to disconnect from a network
4057 This is an asynchronous call.
4058 \param reason -- To indicate the reason for disconnecting. Currently, only
4059 eCSR_DISCONNECT_REASON_MIC_ERROR is meanful.
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304060 \return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004061 ---------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304062QDF_STATUS sme_roam_disconnect(tHalHandle hHal, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004063 eCsrRoamDisconnectReason reason)
4064{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304065 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004066 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
4067
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05304068 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004069 TRACE_CODE_SME_RX_HDD_ROAM_DISCONNECT, sessionId,
4070 reason));
4071 sms_log(pMac, LOG2, FL("enter"));
4072 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304073 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004074 if (CSR_IS_SESSION_VALID(pMac, sessionId)) {
4075 status = csr_roam_disconnect(pMac, sessionId, reason);
4076 } else {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304077 status = QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004078 }
4079 sme_release_global_lock(&pMac->sme);
4080 }
4081
4082 return status;
4083}
4084
Abhishek Singhca408032016-09-13 15:26:12 +05304085/* sme_dhcp_done_ind() - send dhcp done ind
4086 * @hal: hal context
4087 * @session_id: session id
4088 *
4089 * Return: void.
4090 */
4091void sme_dhcp_done_ind(tHalHandle hal, uint8_t session_id)
4092{
4093 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
4094 tCsrRoamSession *session;
4095
4096 if (!mac_ctx)
4097 return;
4098
4099 session = CSR_GET_SESSION(mac_ctx, session_id);
4100 if (!session) {
4101 sms_log(mac_ctx, LOGE,
4102 FL("session %d not found"), session_id);
4103 return;
4104 }
4105 session->dhcp_done = true;
4106}
4107
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004108/* ---------------------------------------------------------------------------
4109 \fn sme_roam_stop_bss
4110 \brief To stop BSS for Soft AP. This is an asynchronous API.
4111 \param hHal - Global structure
4112 \param sessionId - sessionId of SoftAP
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304113 \return QDF_STATUS SUCCESS Roam callback will be called to indicate actual results
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004114 -------------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304115QDF_STATUS sme_roam_stop_bss(tHalHandle hHal, uint8_t sessionId)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004116{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304117 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004118 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
4119
4120 sms_log(pMac, LOG2, FL("enter"));
4121 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304122 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004123 if (CSR_IS_SESSION_VALID(pMac, sessionId)) {
4124 status = csr_roam_issue_stop_bss_cmd(pMac, sessionId, true);
4125 } else {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304126 status = QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004127 }
4128 sme_release_global_lock(&pMac->sme);
4129 }
4130
4131 return status;
4132}
4133
Deepthi Gowrib3bfefd2016-09-13 15:14:34 +05304134/**
4135 * sme_roam_disconnect_sta() - disassociate a station
4136 * @hHal: Global structure
4137 * @sessionId: SessionId of SoftAP
4138 * @p_del_sta_params: Pointer to parameters of the station to disassoc
4139 *
4140 * To disassociate a station. This is an asynchronous API.
4141 *
4142 * Return: QDF_STATUS_SUCCESS on success.Roam callback will
4143 * be called to indicate actual result.
4144 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304145QDF_STATUS sme_roam_disconnect_sta(tHalHandle hHal, uint8_t sessionId,
Deepthi Gowrib3bfefd2016-09-13 15:14:34 +05304146 struct tagCsrDelStaParams *p_del_sta_params)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004147{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304148 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004149 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
4150
4151 if (NULL == pMac) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05304152 QDF_ASSERT(0);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004153 return status;
4154 }
4155
4156 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304157 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004158 if (CSR_IS_SESSION_VALID(pMac, sessionId)) {
4159 status = csr_roam_issue_disassociate_sta_cmd(pMac,
Deepthi Gowrib3bfefd2016-09-13 15:14:34 +05304160 sessionId, p_del_sta_params);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004161 } else {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304162 status = QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004163 }
4164 sme_release_global_lock(&pMac->sme);
4165 }
4166
4167 return status;
4168}
4169
4170/**
4171 * sme_roam_deauth_sta() - deauthenticate a station
4172 * @hHal: Global structure
4173 * @sessionId: SessionId of SoftAP
4174 * @pDelStaParams: Pointer to parameters of the station to deauthenticate
4175 *
4176 * To disassociate a station. This is an asynchronous API.
4177 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304178 * Return: QDF_STATUS_SUCCESS on success or another QDF_STATUS error
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004179 * code on error. Roam callback will be called to indicate actual
4180 * result
4181 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304182QDF_STATUS sme_roam_deauth_sta(tHalHandle hHal, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004183 struct tagCsrDelStaParams *pDelStaParams)
4184{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304185 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004186 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
4187
4188 if (NULL == pMac) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05304189 QDF_ASSERT(0);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004190 return status;
4191 }
4192
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05304193 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Sreelakshmi Konamki6744cff2015-09-07 12:10:39 +05304194 TRACE_CODE_SME_RX_HDD_MSG_DEAUTH_STA,
4195 sessionId, pDelStaParams->reason_code));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004196 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304197 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004198 if (CSR_IS_SESSION_VALID(pMac, sessionId)) {
4199 status =
4200 csr_roam_issue_deauth_sta_cmd(pMac, sessionId,
4201 pDelStaParams);
4202 } else {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304203 status = QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004204 }
4205 sme_release_global_lock(&pMac->sme);
4206 }
4207
4208 return status;
4209}
4210
4211/* ---------------------------------------------------------------------------
4212 \fn sme_roam_tkip_counter_measures
4213 \brief To start or stop TKIP counter measures. This is an asynchronous API.
4214 \param sessionId - sessionId of SoftAP
4215 \param pPeerMacAddr - Caller allocated memory filled with peer MAC address (6 bytes)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304216 \return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004217 -------------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304218QDF_STATUS sme_roam_tkip_counter_measures(tHalHandle hHal, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004219 bool bEnable)
4220{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304221 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004222 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
4223
4224 if (NULL == pMac) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05304225 QDF_ASSERT(0);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004226 return status;
4227 }
4228
4229 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304230 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004231 if (CSR_IS_SESSION_VALID(pMac, sessionId)) {
4232 status =
4233 csr_roam_issue_tkip_counter_measures(pMac, sessionId,
4234 bEnable);
4235 } else {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304236 status = QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004237 }
4238 sme_release_global_lock(&pMac->sme);
4239 }
4240
4241 return status;
4242}
4243
4244/* ---------------------------------------------------------------------------
4245 \fn sme_roam_get_associated_stas
4246 \brief To probe the list of associated stations from various modules
4247 of CORE stack.
4248 \This is an asynchronous API.
4249 \param sessionId - sessionId of SoftAP
4250 \param modId - Module from whom list of associtated stations is
4251 to be probed. If an invalid module is passed then
Anurag Chouhan6d760662016-02-20 16:05:43 +05304252 by default QDF_MODULE_ID_PE will be probed.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004253 \param pUsrContext - Opaque HDD context
4254 \param pfnSapEventCallback - Sap event callback in HDD
4255 \param pAssocBuf - Caller allocated memory to be filled with associatd
4256 stations info
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304257 \return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004258 -------------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304259QDF_STATUS sme_roam_get_associated_stas(tHalHandle hHal, uint8_t sessionId,
Anurag Chouhan6d760662016-02-20 16:05:43 +05304260 QDF_MODULE_ID modId, void *pUsrContext,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004261 void *pfnSapEventCallback,
4262 uint8_t *pAssocStasBuf)
4263{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304264 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004265 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
4266
4267 if (NULL == pMac) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05304268 QDF_ASSERT(0);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004269 return status;
4270 }
4271
4272 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304273 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004274 if (CSR_IS_SESSION_VALID(pMac, sessionId)) {
4275 status =
4276 csr_roam_get_associated_stas(pMac, sessionId, modId,
4277 pUsrContext,
4278 pfnSapEventCallback,
4279 pAssocStasBuf);
4280 } else {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304281 status = QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004282 }
4283 sme_release_global_lock(&pMac->sme);
4284 }
4285
4286 return status;
4287}
4288
4289/* ---------------------------------------------------------------------------
4290 \fn sme_roam_get_wps_session_overlap
4291 \brief To get the WPS PBC session overlap information.
4292 \This is an asynchronous API.
4293 \param sessionId - sessionId of SoftAP
4294 \param pUsrContext - Opaque HDD context
4295 \param pfnSapEventCallback - Sap event callback in HDD
4296 \pRemoveMac - pointer to Mac address which needs to be removed from session
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304297 \return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004298 -------------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304299QDF_STATUS sme_roam_get_wps_session_overlap(tHalHandle hHal, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004300 void *pUsrContext, void
4301 *pfnSapEventCallback,
Anurag Chouhan6d760662016-02-20 16:05:43 +05304302 struct qdf_mac_addr pRemoveMac)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004303{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304304 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004305 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
4306
4307 if (NULL == pMac) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05304308 QDF_ASSERT(0);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004309 return status;
4310 }
4311
4312 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304313 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004314 if (CSR_IS_SESSION_VALID(pMac, sessionId)) {
4315 status =
4316 csr_roam_get_wps_session_overlap(pMac, sessionId,
4317 pUsrContext,
4318 pfnSapEventCallback,
4319 pRemoveMac);
4320 } else {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304321 status = QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004322 }
4323 sme_release_global_lock(&pMac->sme);
4324 }
4325
4326 return status;
4327}
4328
4329/* ---------------------------------------------------------------------------
4330 \fn sme_roam_get_connect_state
4331 \brief a wrapper function to request CSR to return the current connect state
4332 of Roaming
4333 This is a synchronous call.
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304334 \return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004335 ---------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304336QDF_STATUS sme_roam_get_connect_state(tHalHandle hHal, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004337 eCsrConnectState *pState)
4338{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304339 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004340 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
4341
4342 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304343 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004344 if (CSR_IS_SESSION_VALID(pMac, sessionId)) {
4345 status =
4346 csr_roam_get_connect_state(pMac, sessionId, pState);
4347 } else {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304348 status = QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004349 }
4350 sme_release_global_lock(&pMac->sme);
4351 }
4352
4353 return status;
4354}
4355
4356/* ---------------------------------------------------------------------------
4357 \fn sme_roam_get_connect_profile
4358 \brief a wrapper function to request CSR to return the current connect
4359 profile. Caller must call csr_roam_free_connect_profile after it is done
4360 and before reuse for another csr_roam_get_connect_profile call.
4361 This is a synchronous call.
4362 \param pProfile - pointer to a caller allocated structure
4363 tCsrRoamConnectedProfile
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304364 \return QDF_STATUS. Failure if not connected
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004365 ---------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304366QDF_STATUS sme_roam_get_connect_profile(tHalHandle hHal, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004367 tCsrRoamConnectedProfile *pProfile)
4368{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304369 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004370 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
4371
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05304372 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004373 TRACE_CODE_SME_RX_HDD_ROAM_GET_CONNECTPROFILE,
4374 sessionId, 0));
4375 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304376 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004377 if (CSR_IS_SESSION_VALID(pMac, sessionId)) {
4378 status =
4379 csr_roam_get_connect_profile(pMac, sessionId, pProfile);
4380 } else {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304381 status = QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004382 }
4383 sme_release_global_lock(&pMac->sme);
4384 }
4385
4386 return status;
4387}
4388
Naveen Rawatdf0a7e72016-01-06 18:35:53 -08004389/**
4390 * sme_roam_free_connect_profile - a wrapper function to request CSR to free and
4391 * reinitialize the profile returned previously by csr_roam_get_connect_profile.
4392 *
4393 * @profile - pointer to a caller allocated structure tCsrRoamConnectedProfile
4394 *
4395 * Return: none
4396 */
4397void sme_roam_free_connect_profile(tCsrRoamConnectedProfile *profile)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004398{
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05304399 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004400 TRACE_CODE_SME_RX_HDD_ROAM_FREE_CONNECTPROFILE,
4401 NO_SESSION, 0));
Naveen Rawatdf0a7e72016-01-06 18:35:53 -08004402 csr_roam_free_connect_profile(profile);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004403}
4404
4405/* ---------------------------------------------------------------------------
4406 \fn sme_roam_set_pmkid_cache
4407 \brief a wrapper function to request CSR to return the PMKID candidate list
4408 This is a synchronous call.
4409 \param pPMKIDCache - caller allocated buffer point to an array of
4410 tPmkidCacheInfo
4411 \param numItems - a variable that has the number of tPmkidCacheInfo
4412 allocated when retruning, this is either the number needed
4413 or number of items put into pPMKIDCache
4414 \param update_entire_cache - this bool value specifies if the entire pmkid
4415 cache should be overwritten or should it be
4416 updated entry by entry.
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304417 \return QDF_STATUS - when fail, it usually means the buffer allocated is not
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004418 big enough and pNumItems has the number of
4419 tPmkidCacheInfo.
4420 \Note: pNumItems is a number of tPmkidCacheInfo,
4421 not sizeof(tPmkidCacheInfo) * something
4422 ---------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304423QDF_STATUS sme_roam_set_pmkid_cache(tHalHandle hHal, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004424 tPmkidCacheInfo *pPMKIDCache,
4425 uint32_t numItems, bool update_entire_cache)
4426{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304427 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004428 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
4429
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05304430 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004431 TRACE_CODE_SME_RX_HDD_ROAM_SET_PMKIDCACHE, sessionId,
4432 numItems));
4433 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304434 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004435 if (CSR_IS_SESSION_VALID(pMac, sessionId)) {
4436 status =
4437 csr_roam_set_pmkid_cache(pMac, sessionId, pPMKIDCache,
4438 numItems, update_entire_cache);
4439 } else {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304440 status = QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004441 }
4442 sme_release_global_lock(&pMac->sme);
4443 }
4444
4445 return status;
4446}
4447
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304448QDF_STATUS sme_roam_del_pmkid_from_cache(tHalHandle hHal, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004449 const uint8_t *pBSSId, bool flush_cache)
4450{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304451 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004452 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Sreelakshmi Konamki6744cff2015-09-07 12:10:39 +05304453
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05304454 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Sreelakshmi Konamki6744cff2015-09-07 12:10:39 +05304455 TRACE_CODE_SME_RX_HDD_ROAM_DEL_PMKIDCACHE,
4456 sessionId, flush_cache));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004457 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304458 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004459 if (CSR_IS_SESSION_VALID(pMac, sessionId)) {
4460 status = csr_roam_del_pmkid_from_cache(pMac, sessionId,
4461 pBSSId, flush_cache);
4462 } else {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304463 status = QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004464 }
4465 sme_release_global_lock(&pMac->sme);
4466 }
4467 return status;
4468}
4469
4470#ifdef WLAN_FEATURE_ROAM_OFFLOAD
4471/* ---------------------------------------------------------------------------
4472 * \fn sme_roam_set_psk_pmk
4473 * \brief a wrapper function to request CSR to save PSK/PMK
4474 * This is a synchronous call.
4475 * \param hHal - Global structure
4476 * \param sessionId - SME sessionId
4477 * \param pPSK_PMK - pointer to an array of Psk[]/Pmk
4478 * \param pmk_len - Length could be only 16 bytes in case if LEAP
4479 * connections. Need to pass this information to
4480 * firmware.
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304481 * \return QDF_STATUS -status whether PSK/PMK is set or not
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004482 *---------------------------------------------------------------------------
4483 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304484QDF_STATUS sme_roam_set_psk_pmk(tHalHandle hHal, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004485 uint8_t *pPSK_PMK, size_t pmk_len)
4486{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304487 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004488 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
4489 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304490 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004491 if (CSR_IS_SESSION_VALID(pMac, sessionId)) {
4492 status =
4493 csr_roam_set_psk_pmk(pMac, sessionId, pPSK_PMK,
4494 pmk_len);
4495 } else {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304496 status = QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004497 }
4498 sme_release_global_lock(&pMac->sme);
4499 }
4500 return status;
4501}
4502#endif
4503/* ---------------------------------------------------------------------------
4504 \fn sme_roam_get_security_req_ie
4505 \brief a wrapper function to request CSR to return the WPA or RSN or WAPI IE CSR
4506 passes to PE to JOIN request or START_BSS request
4507 This is a synchronous call.
4508 \param pLen - caller allocated memory that has the length of pBuf as input.
4509 Upon returned, *pLen has the needed or IE length in pBuf.
4510 \param pBuf - Caller allocated memory that contain the IE field, if any,
4511 upon return
4512 \param secType - Specifies whether looking for WPA/WPA2/WAPI IE
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304513 \return QDF_STATUS - when fail, it usually means the buffer allocated is not
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004514 big enough
4515 ---------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304516QDF_STATUS sme_roam_get_security_req_ie(tHalHandle hHal, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004517 uint32_t *pLen, uint8_t *pBuf,
4518 eCsrSecurityType secType)
4519{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304520 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004521 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
4522
4523 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304524 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004525 if (CSR_IS_SESSION_VALID(pMac, sessionId)) {
4526 status =
4527 csr_roam_get_wpa_rsn_req_ie(hHal, sessionId, pLen, pBuf);
4528 } else {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304529 status = QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004530 }
4531 sme_release_global_lock(&pMac->sme);
4532 }
4533
4534 return status;
4535}
4536
4537/* ---------------------------------------------------------------------------
4538 \fn sme_roam_get_security_rsp_ie
4539 \brief a wrapper function to request CSR to return the WPA or RSN or
4540 WAPI IE from the beacon or probe rsp if connected
4541 This is a synchronous call.
4542 \param pLen - caller allocated memory that has the length of pBuf as input.
4543 Upon returned, *pLen has the needed or IE length in pBuf.
4544 \param pBuf - Caller allocated memory that contain the IE field, if any,
4545 upon return
4546 \param secType - Specifies whether looking for WPA/WPA2/WAPI IE
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304547 \return QDF_STATUS - when fail, it usually means the buffer allocated is not
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004548 big enough
4549 ---------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304550QDF_STATUS sme_roam_get_security_rsp_ie(tHalHandle hHal, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004551 uint32_t *pLen, uint8_t *pBuf,
4552 eCsrSecurityType secType)
4553{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304554 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004555 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
4556
4557 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304558 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004559 if (CSR_IS_SESSION_VALID(pMac, sessionId)) {
4560 status =
4561 csr_roam_get_wpa_rsn_rsp_ie(pMac, sessionId, pLen, pBuf);
4562 } else {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304563 status = QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004564 }
4565 sme_release_global_lock(&pMac->sme);
4566 }
4567
4568 return status;
4569
4570}
4571
4572/* ---------------------------------------------------------------------------
4573 \fn sme_roam_get_num_pmkid_cache
4574 \brief a wrapper function to request CSR to return number of PMKID cache
4575 entries
4576 This is a synchronous call.
4577 \return uint32_t - the number of PMKID cache entries
4578 ---------------------------------------------------------------------------*/
4579uint32_t sme_roam_get_num_pmkid_cache(tHalHandle hHal, uint8_t sessionId)
4580{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304581 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004582 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
4583 uint32_t numPmkidCache = 0;
4584
4585 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304586 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004587 if (CSR_IS_SESSION_VALID(pMac, sessionId)) {
4588 numPmkidCache =
4589 csr_roam_get_num_pmkid_cache(pMac, sessionId);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304590 status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004591 } else {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304592 status = QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004593 }
4594 sme_release_global_lock(&pMac->sme);
4595 }
4596
4597 return numPmkidCache;
4598}
4599
4600/* ---------------------------------------------------------------------------
4601 \fn sme_roam_get_pmkid_cache
4602 \brief a wrapper function to request CSR to return PMKID cache from CSR
4603 This is a synchronous call.
4604 \param pNum - caller allocated memory that has the space of the number of
4605 pBuf tPmkidCacheInfo as input. Upon returned, *pNum has the
4606 needed or actually number in tPmkidCacheInfo.
4607 \param pPmkidCache - Caller allocated memory that contains PMKID cache, if
4608 any, upon return
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304609 \return QDF_STATUS - when fail, it usually means the buffer allocated is not
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004610 big enough
4611 ---------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304612QDF_STATUS sme_roam_get_pmkid_cache(tHalHandle hHal, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004613 uint32_t *pNum, tPmkidCacheInfo *pPmkidCache)
4614{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304615 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004616 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
4617
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05304618 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004619 TRACE_CODE_SME_RX_HDD_ROAM_GET_PMKIDCACHE, sessionId,
4620 0));
4621 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304622 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004623 if (CSR_IS_SESSION_VALID(pMac, sessionId)) {
4624 status =
4625 csr_roam_get_pmkid_cache(pMac, sessionId, pNum,
4626 pPmkidCache);
4627 } else {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304628 status = QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004629 }
4630 sme_release_global_lock(&pMac->sme);
4631 }
4632
4633 return status;
4634}
4635
4636/* ---------------------------------------------------------------------------
4637 \fn sme_get_config_param
4638 \brief a wrapper function that HDD calls to get the global settings
4639 currently maintained by CSR.
4640 This is a synchronous call.
4641 \param pParam - caller allocated memory
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304642 \return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004643 ---------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304644QDF_STATUS sme_get_config_param(tHalHandle hHal, tSmeConfigParams *pParam)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004645{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304646 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004647 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
4648
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05304649 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004650 TRACE_CODE_SME_RX_HDD_GET_CONFIGPARAM, NO_SESSION, 0));
4651 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304652 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004653 status = csr_get_config_param(pMac, &pParam->csrConfig);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304654 if (status != QDF_STATUS_SUCCESS) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004655 sms_log(pMac, LOGE, "%s csr_get_config_param failed",
4656 __func__);
4657 sme_release_global_lock(&pMac->sme);
4658 return status;
4659 }
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304660 qdf_mem_copy(&pParam->rrmConfig,
Krunal Soni1878d3a2016-01-14 13:00:44 -08004661 &pMac->rrm.rrmSmeContext.rrmConfig,
4662 sizeof(pMac->rrm.rrmSmeContext.rrmConfig));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004663 sme_release_global_lock(&pMac->sme);
4664 }
4665
4666 return status;
4667}
4668
4669/**
4670 * sme_cfg_set_int() - Sets the cfg parameter value.
4671 * @hal: Handle to hal.
4672 * @cfg_id: Configuration parameter ID.
4673 * @value: value to be saved in the cfg parameter.
4674 *
4675 * This function sets the string value in cfg parameter.
4676 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304677 * Return: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004678 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304679QDF_STATUS sme_cfg_set_int(tHalHandle hal, uint16_t cfg_id, uint32_t value)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004680{
4681 tpAniSirGlobal pmac = PMAC_STRUCT(hal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304682 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004683
4684 if (eSIR_SUCCESS != cfg_set_int(pmac, cfg_id, value))
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304685 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004686
4687 return status;
4688}
4689
4690/**
4691 * sme_cfg_set_str() - Sets the cfg parameter string.
4692 * @hal: Handle to hal.
4693 * @cfg_id: Configuration parameter ID.
4694 * @str: Pointer to the string buffer.
4695 * @length: Length of the string.
4696 *
4697 * This function sets the string value in cfg parameter.
4698 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304699 * Return: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004700 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304701QDF_STATUS sme_cfg_set_str(tHalHandle hal, uint16_t cfg_id, uint8_t *str,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004702 uint32_t length)
4703{
4704 tpAniSirGlobal pmac = PMAC_STRUCT(hal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304705 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004706
4707 if (eSIR_SUCCESS != cfg_set_str(pmac, cfg_id, str, length))
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304708 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004709
4710 return status;
4711}
4712
4713/**
4714 * sme_cfg_get_int() - Gets the cfg parameter value.
4715 * @hal: Handle to hal.
4716 * @cfg_id: Configuration parameter ID.
4717 * @cfg_value: Pointer to variable in which cfg value
4718 * will be saved.
4719 *
4720 * This function gets the value of the cfg parameter.
4721 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304722 * Return: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004723 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304724QDF_STATUS sme_cfg_get_int(tHalHandle hal, uint16_t cfg_id, uint32_t *cfg_value)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004725{
4726 tpAniSirGlobal pmac = PMAC_STRUCT(hal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304727 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004728
4729 if (eSIR_SUCCESS != wlan_cfg_get_int(pmac, cfg_id, cfg_value))
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304730 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004731
4732 return status;
4733}
4734
4735/**
4736 * sme_cfg_get_str() - Gets the cfg parameter string.
4737 * @hal: Handle to hal.
4738 * @cfg_id: Configuration parameter ID.
4739 * @str: Pointer to the string buffer.
4740 * @length: Pointer to length of the string.
4741 *
4742 * This function gets the string value of the cfg parameter.
4743 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304744 * Return: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004745 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304746QDF_STATUS sme_cfg_get_str(tHalHandle hal, uint16_t cfg_id, uint8_t *str,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004747 uint32_t *length)
4748{
4749 tpAniSirGlobal pmac = PMAC_STRUCT(hal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304750 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004751
4752 if (eSIR_SUCCESS != wlan_cfg_get_str(pmac, cfg_id, str, length))
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304753 status = QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004754
4755 return status;
4756}
4757
4758/* ---------------------------------------------------------------------------
4759 \fn sme_get_modify_profile_fields
4760 \brief HDD or SME - QOS calls this function to get the current values of
4761 connected profile fields, changing which can cause reassoc.
4762 This function must be called after CFG is downloaded and STA is in connected
4763 state. Also, make sure to call this function to get the current profile
4764 fields before calling the reassoc. So that pModifyProfileFields will have
4765 all the latest values plus the one(s) has been updated as part of reassoc
4766 request.
4767 \param pModifyProfileFields - pointer to the connected profile fields
4768 changing which can cause reassoc
4769
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304770 \return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004771 -------------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304772QDF_STATUS sme_get_modify_profile_fields(tHalHandle hHal, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004773 tCsrRoamModifyProfileFields *
4774 pModifyProfileFields)
4775{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304776 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004777 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
4778
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05304779 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004780 TRACE_CODE_SME_RX_HDD_GET_MODPROFFIELDS, sessionId,
4781 0));
4782 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304783 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004784 if (CSR_IS_SESSION_VALID(pMac, sessionId)) {
4785 status =
4786 csr_get_modify_profile_fields(pMac, sessionId,
4787 pModifyProfileFields);
4788 } else {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304789 status = QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004790 }
4791 sme_release_global_lock(&pMac->sme);
4792 }
4793
4794 return status;
4795}
4796
4797/* ---------------------------------------------------------------------------
4798 \fn sme_set_dhcp_till_power_active_flag
4799 \brief Sets/Clears DHCP related flag to disable/enable auto PS
4800 \param hal - The handle returned by mac_open.
4801 ---------------------------------------------------------------------------*/
4802void sme_set_dhcp_till_power_active_flag(tHalHandle hal, uint8_t flag)
4803{
4804 tpAniSirGlobal mac = PMAC_STRUCT(hal);
4805 struct ps_global_info *ps_global_info = &mac->sme.ps_global_info;
4806
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05304807 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004808 TRACE_CODE_SME_RX_HDD_SET_DHCP_FLAG, NO_SESSION,
4809 flag));
4810 /* Set/Clear the DHCP flag which will disable/enable auto PS */
4811 ps_global_info->remain_in_power_active_till_dhcp = flag;
4812}
4813
4814/* ---------------------------------------------------------------------------
4815 \fn sme_register11d_scan_done_callback
4816 \brief Register a routine of type csr_scan_completeCallback which is
4817 called whenever an 11d scan is done
4818 \param hHal - The handle returned by mac_open.
4819 \param callback - 11d scan complete routine to be registered
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304820 \return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004821 ---------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304822QDF_STATUS sme_register11d_scan_done_callback(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004823 csr_scan_completeCallback callback)
4824{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304825 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004826 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
4827
4828 pMac->scan.callback11dScanDone = callback;
4829
4830 return status;
4831}
4832
Arun Khandavalli4b55da72016-07-19 19:55:01 +05304833/**
4834 * sme_deregister11d_scan_done_callback() - De-register scandone callback
4835 * @h_hal: Handler return by mac_open
4836 *
4837 * This function De-registers the scandone callback to SME
4838 *
4839 * Return: None
4840 */
4841void sme_deregister11d_scan_done_callback(tHalHandle h_hal)
4842{
4843 tpAniSirGlobal pmac;
4844
4845 if (!h_hal) {
4846 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
4847 FL("hHal is not valid"));
4848 return;
4849 }
4850
4851 pmac = PMAC_STRUCT(h_hal);
4852 pmac->scan.callback11dScanDone = NULL;
4853}
4854
4855
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004856#ifdef FEATURE_OEM_DATA_SUPPORT
4857/**
4858 * sme_register_oem_data_rsp_callback() - Register a routine of
4859 * type send_oem_data_rsp_msg
4860 * @h_hal: Handle returned by mac_open.
4861 * @callback: Callback to send response
4862 * to oem application.
4863 *
4864 * sme_oem_data_rsp_callback is used to register sme_send_oem_data_rsp_msg
4865 * callback function.
4866 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304867 * Return: QDF_STATUS.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004868 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304869QDF_STATUS sme_register_oem_data_rsp_callback(tHalHandle h_hal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004870 sme_send_oem_data_rsp_msg callback)
4871{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304872 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004873 tpAniSirGlobal pmac = PMAC_STRUCT(h_hal);
4874
Krishna Kumaar Natarajanbbbf2ef2016-08-03 14:06:26 -07004875 pmac->sme.oem_data_rsp_callback = callback;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004876
4877 return status;
4878
4879}
Arun Khandavalli4b55da72016-07-19 19:55:01 +05304880
4881/**
4882 * sme_deregister_oem_data_rsp_callback() - De-register OEM datarsp callback
4883 * @h_hal: Handler return by mac_open
4884 * This function De-registers the OEM data response callback to SME
4885 *
4886 * Return: None
4887 */
4888void sme_deregister_oem_data_rsp_callback(tHalHandle h_hal)
4889{
4890 tpAniSirGlobal pmac;
4891
4892 if (!h_hal) {
4893 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
4894 FL("hHal is not valid"));
4895 return;
4896 }
4897 pmac = PMAC_STRUCT(h_hal);
4898
Krishna Kumaar Natarajanbbbf2ef2016-08-03 14:06:26 -07004899 pmac->sme.oem_data_rsp_callback = NULL;
Arun Khandavalli4b55da72016-07-19 19:55:01 +05304900}
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004901#endif
4902
4903/**
Krishna Kumaar Natarajan53ca2902015-12-04 14:01:46 -08004904 * sme_oem_update_capability() - update UMAC's oem related capability.
4905 * @hal: Handle returned by mac_open
4906 * @oem_cap: pointer to oem_capability
4907 *
4908 * This function updates OEM capability to UMAC. Currently RTT
4909 * related capabilities are updated. More capabilities can be
4910 * added in future.
4911 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304912 * Return: QDF_STATUS
Krishna Kumaar Natarajan53ca2902015-12-04 14:01:46 -08004913 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304914QDF_STATUS sme_oem_update_capability(tHalHandle hal,
Krishna Kumaar Natarajan53ca2902015-12-04 14:01:46 -08004915 struct sme_oem_capability *cap)
4916{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304917 QDF_STATUS status = QDF_STATUS_SUCCESS;
Krishna Kumaar Natarajan53ca2902015-12-04 14:01:46 -08004918 tpAniSirGlobal pmac = PMAC_STRUCT(hal);
4919 uint8_t *bytes;
4920
4921 bytes = pmac->rrm.rrmSmeContext.rrmConfig.rm_capability;
4922
4923 if (cap->ftm_rr)
4924 bytes[4] |= RM_CAP_FTM_RANGE_REPORT;
4925 if (cap->lci_capability)
4926 bytes[4] |= RM_CAP_CIVIC_LOC_MEASUREMENT;
4927
4928 return status;
4929}
4930
4931/**
4932 * sme_oem_get_capability() - get oem capability
4933 * @hal: Handle returned by mac_open
4934 * @oem_cap: pointer to oem_capability
4935 *
4936 * This function is used to get the OEM capability from UMAC.
4937 * Currently RTT related capabilities are received. More
4938 * capabilities can be added in future.
4939 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304940 * Return: QDF_STATUS
Krishna Kumaar Natarajan53ca2902015-12-04 14:01:46 -08004941 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304942QDF_STATUS sme_oem_get_capability(tHalHandle hal,
Krishna Kumaar Natarajan53ca2902015-12-04 14:01:46 -08004943 struct sme_oem_capability *cap)
4944{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304945 QDF_STATUS status = QDF_STATUS_SUCCESS;
Krishna Kumaar Natarajan53ca2902015-12-04 14:01:46 -08004946 tpAniSirGlobal pmac = PMAC_STRUCT(hal);
4947 uint8_t *bytes;
4948
4949 bytes = pmac->rrm.rrmSmeContext.rrmConfig.rm_capability;
4950
4951 cap->ftm_rr = bytes[4] & RM_CAP_FTM_RANGE_REPORT;
4952 cap->lci_capability = bytes[4] & RM_CAP_CIVIC_LOC_MEASUREMENT;
4953
4954 return status;
4955}
4956
4957/**
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004958 * sme_register_ftm_msg_processor() - registers hdd ftm message processor
4959 * function to MAC/SYS
4960 *
4961 * @hal: hal handle
4962 * @callback: hdd function that has to be registered
4963 *
4964 * Return: void
4965 */
4966void sme_register_ftm_msg_processor(tHalHandle hal,
4967 hdd_ftm_msg_processor callback)
4968{
4969 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
4970
4971 if (mac_ctx == NULL) {
Naveen Rawatcf684762016-06-27 15:30:24 -07004972 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
4973 FL("mac ctx is NULL"));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004974 return;
4975 }
Naveen Rawatcf684762016-06-27 15:30:24 -07004976
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004977 mac_ctx->ftm_msg_processor_callback = callback;
4978 return;
4979}
4980
4981/**
4982 * sme_wow_add_pattern() - add a wow pattern in fw
4983 * @hHal: handle returned by mac_open
4984 * @pattern: pointer to input pattern
4985 *
4986 * Add a pattern for Pattern Byte Matching in WoW mode. Firmware will
4987 * do a pattern match on these patterns when WoW is enabled during system
4988 * suspend.
4989 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304990 * Return: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004991 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304992QDF_STATUS sme_wow_add_pattern(tHalHandle hal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004993 struct wow_add_pattern *pattern,
4994 uint8_t session_id)
4995{
4996 tpAniSirGlobal pMac = PMAC_STRUCT(hal);
4997 struct wow_add_pattern *ptrn;
4998 tSirRetStatus ret_code = eSIR_SUCCESS;
4999 tSirMsgQ msg_q;
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05305000 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005001 TRACE_CODE_SME_RX_HDD_WOWL_ADDBCAST_PATTERN, session_id,
5002 0));
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305003 ptrn = qdf_mem_malloc(sizeof(*ptrn));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005004 if (NULL == ptrn) {
5005 sms_log(pMac, LOGP,
5006 FL("Fail to allocate memory for WoWLAN Add Bcast Pattern "));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305007 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005008 }
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305009 (void)qdf_mem_copy(ptrn, pattern, sizeof(*ptrn));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005010
5011 msg_q.type = WMA_WOW_ADD_PTRN;
5012 msg_q.reserved = 0;
5013 msg_q.bodyptr = ptrn;
5014 msg_q.bodyval = 0;
5015
5016 sms_log(pMac, LOG1, FL("Sending WMA_WOWL_ADD_BCAST_PTRN to HAL"));
5017 ret_code = wma_post_ctrl_msg(pMac, &msg_q);
5018 if (eSIR_SUCCESS != ret_code) {
5019 sms_log(pMac, LOGE,
5020 FL("Posting WMA_WOWL_ADD_BCAST_PTRN failed, reason=%X"),
5021 ret_code);
5022 }
5023 return ret_code;
5024}
5025
5026/**
5027 * sme_wow_delete_pattern() - delete user configured wow pattern in target
5028 * @hHal: handle returned by mac_open.
5029 * @pattern: pointer to delete pattern parameter
5030 * @sessionId: session id
5031 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305032 * Return: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005033 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305034QDF_STATUS sme_wow_delete_pattern(tHalHandle hal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005035 struct wow_delete_pattern *pattern, uint8_t sessionId)
5036{
5037 tpAniSirGlobal pMac = PMAC_STRUCT(hal);
5038 struct wow_delete_pattern *delete_ptrn;
5039 tSirRetStatus ret_code = eSIR_SUCCESS;
5040 tSirMsgQ msg_q;
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05305041 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005042 TRACE_CODE_SME_RX_HDD_WOWL_DELBCAST_PATTERN, sessionId,
5043 0));
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305044 delete_ptrn = qdf_mem_malloc(sizeof(*delete_ptrn));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005045 if (NULL == delete_ptrn) {
5046 sms_log(pMac, LOGP,
5047 FL("Fail to allocate memory for WoWLAN Delete Bcast Pattern "));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305048 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005049 }
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305050 (void)qdf_mem_copy(delete_ptrn, pattern, sizeof(*delete_ptrn));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005051 msg_q.type = WMA_WOW_DEL_PTRN;
5052 msg_q.reserved = 0;
5053 msg_q.bodyptr = delete_ptrn;
5054 msg_q.bodyval = 0;
5055
5056 sms_log(pMac, LOG1, FL("Sending WMA_WOWL_DEL_BCAST_PTRN"));
5057
5058 ret_code = wma_post_ctrl_msg(pMac, &msg_q);
5059 if (eSIR_SUCCESS != ret_code) {
5060 sms_log(pMac, LOGE,
5061 FL("Posting WMA_WOWL_DEL_BCAST_PTRN failed, reason=%X"),
5062 ret_code);
5063 }
5064 return ret_code;
5065}
5066
5067/**
5068 * sme_enter_wowl(): SME API exposed to HDD to request enabling of WOWL mode.
5069 * @hal_ctx - The handle returned by mac_open.
5070 * @enter_wowl_callback_routine - Callback routine provided by HDD.
5071 * Used for success/failure notification by SME
5072 * @enter_wowl_callback_context - A cookie passed by HDD, that is passed
5073 * back to HDD at the time of callback.
5074 * @wake_reason_ind_cb - Callback routine provided by HDD.
5075 * Used for Wake Reason Indication by SME
5076 * @wake_reason_ind_cb_ctx - A cookie passed by HDD, that is passed
5077 * back to HDD at the time of callback.
5078 *
5079 * WoWLAN works on top of BMPS mode.
5080 * If the device is not in BMPS mode,
5081 * SME will will cache the information that
5082 * WOWL has been enabled and attempt to put the device
5083 * in BMPS. On entry into BMPS, SME will enable the
5084 * WOWL mode.
5085 * Note 1: If we exit BMPS mode (someone requests full power),
5086 * we will NOT resume WOWL when we go back to BMPS again.
5087 * Request for full power (while in WOWL mode) means disable
5088 * WOWL and go to full power.
5089 * Note 2: Both UAPSD and WOWL work on top of BMPS.
5090 * On entry into BMPS, SME will give priority to UAPSD and
5091 * enable only UAPSD if both UAPSD and WOWL are required.
5092 * Currently there is no requirement or use case to support
5093 * UAPSD and WOWL at the same time.
5094 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305095 * Return: QDF_STATUS
5096 * QDF_STATUS_SUCCESS Device is already in WoWLAN mode
5097 * QDF_STATUS_E_FAILURE Device cannot enter WoWLAN mode.
5098 * QDF_STATUS_PMC_PENDING Request accepted. SME will enable
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005099 * WOWL after BMPS mode is entered.
5100 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305101QDF_STATUS sme_enter_wowl(tHalHandle hal_ctx,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005102 void (*enter_wowl_callback_routine)(void
5103 *callback_context,
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305104 QDF_STATUS status),
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005105 void *enter_wowl_callback_context,
5106#ifdef WLAN_WAKEUP_EVENTS
5107 void (*wakeIndicationCB)(void *callback_context,
5108 tpSirWakeReasonInd
5109 wake_reason_ind),
5110 void *wakeIndicationCBContext,
5111#endif /* WLAN_WAKEUP_EVENTS */
5112 tpSirSmeWowlEnterParams wowl_enter_params,
5113 uint8_t session_id)
5114{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305115 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005116 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal_ctx);
5117 struct ps_global_info *ps_global_info = &mac_ctx->sme.ps_global_info;
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05305118 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005119 TRACE_CODE_SME_RX_HDD_ENTER_WOWL, session_id, 0));
5120
5121 /* cache the WOWL information */
5122 ps_global_info->ps_params[session_id].wowl_enter_params =
5123 *wowl_enter_params;
5124 ps_global_info->ps_params[session_id].enter_wowl_callback_routine =
5125 enter_wowl_callback_routine;
5126 ps_global_info->ps_params[session_id].enter_wowl_callback_context =
5127 enter_wowl_callback_context;
5128#ifdef WLAN_WAKEUP_EVENTS
5129 /* Cache the Wake Reason Indication callback information */
5130 ps_global_info->ps_params[session_id].wake_reason_ind_cb =
5131 wakeIndicationCB;
5132 ps_global_info->ps_params[session_id].wake_reason_ind_cb_ctx =
5133 wakeIndicationCBContext;
5134#endif /* WLAN_WAKEUP_EVENTS */
5135
5136 status = sme_ps_process_command(mac_ctx, session_id, SME_PS_WOWL_ENTER);
5137 return status;
5138}
5139/**
5140 *sme_exit_wowl(): SME API exposed to HDD to request exit from WoWLAN mode.
5141 * @hal_ctx - The handle returned by mac_open.
5142 * @wowl_exit_params - Carries info on which smesession
5143 * wowl exit is requested.
5144 *
5145 * SME will initiate exit from WoWLAN mode and device will be
5146 * put in BMPS mode.
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305147 * Return QDF_STATUS
5148 * QDF_STATUS_E_FAILURE Device cannot exit WoWLAN mode.
5149 * QDF_STATUS_SUCCESS Request accepted to exit WoWLAN mode.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005150 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305151QDF_STATUS sme_exit_wowl(tHalHandle hal_ctx,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005152 tpSirSmeWowlExitParams wowl_exit_params)
5153{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305154 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005155 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal_ctx);
5156 uint8_t session_id;
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05305157 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005158 TRACE_CODE_SME_RX_HDD_EXIT_WOWL, NO_SESSION, 0));
5159 session_id = wowl_exit_params->sessionId;
5160 status = sme_ps_process_command(mac_ctx, session_id, SME_PS_WOWL_EXIT);
5161 return status;
5162}
5163
5164/**
5165 * sme_roam_set_key() - To set encryption key.
5166 * @hal: hal global context
5167 * @session_id: session id
5168 * @set_key: pointer to a caller allocated object of tCsrSetContextInfo
5169 * @ptr_roam_id: Upon success return, this is the id caller can use to
5170 * identify the request in roamcallback
5171 *
5172 * This function should be called only when connected. This is an asynchronous
5173 * API.
5174 *
5175 * Return: Status of operation
5176 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305177QDF_STATUS sme_roam_set_key(tHalHandle hal, uint8_t session_id,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005178 tCsrRoamSetKey *set_key, uint32_t *ptr_roam_id)
5179{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305180 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005181 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
5182 uint32_t roam_id;
5183 uint32_t i;
5184 tCsrRoamSession *session = NULL;
5185 struct ps_global_info *ps_global_info = &mac_ctx->sme.ps_global_info;
5186
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05305187 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_RX_HDD_SET_KEY,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005188 session_id, 0));
5189 if (set_key->keyLength > CSR_MAX_KEY_LEN) {
5190 sms_log(mac_ctx, LOGE, FL("Invalid key length %d"),
5191 set_key->keyLength);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305192 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005193 }
5194 /*Once Setkey is done, we can go in BMPS */
5195 if (set_key->keyLength)
5196 ps_global_info->remain_in_power_active_till_dhcp = false;
5197
5198 status = sme_acquire_global_lock(&mac_ctx->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305199 if (!QDF_IS_STATUS_SUCCESS(status))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005200 return status;
5201
5202 roam_id = GET_NEXT_ROAM_ID(&mac_ctx->roam);
5203 if (ptr_roam_id)
5204 *ptr_roam_id = roam_id;
5205
5206 sms_log(mac_ctx, LOG2, FL("keyLength %d"), set_key->keyLength);
5207 for (i = 0; i < set_key->keyLength; i++)
5208 sms_log(mac_ctx, LOG2, FL("%02x"), set_key->Key[i]);
5209
5210 sms_log(mac_ctx, LOG2, "\n session_id=%d roam_id=%d", session_id,
5211 roam_id);
5212 session = CSR_GET_SESSION(mac_ctx, session_id);
5213 if (!session) {
5214 sms_log(mac_ctx, LOGE, FL("session %d not found"), session_id);
5215 sme_release_global_lock(&mac_ctx->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305216 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005217 }
5218 if (CSR_IS_INFRA_AP(&session->connectedProfile)
5219 && set_key->keyDirection == eSIR_TX_DEFAULT) {
5220 if ((eCSR_ENCRYPT_TYPE_WEP40 == set_key->encType)
5221 || (eCSR_ENCRYPT_TYPE_WEP40_STATICKEY ==
5222 set_key->encType)) {
5223 session->pCurRoamProfile->negotiatedUCEncryptionType =
5224 eCSR_ENCRYPT_TYPE_WEP40_STATICKEY;
5225 }
5226 if ((eCSR_ENCRYPT_TYPE_WEP104 == set_key->encType)
5227 || (eCSR_ENCRYPT_TYPE_WEP104_STATICKEY ==
5228 set_key->encType)) {
5229 session->pCurRoamProfile->negotiatedUCEncryptionType =
5230 eCSR_ENCRYPT_TYPE_WEP104_STATICKEY;
5231 }
5232 }
5233 status = csr_roam_set_key(mac_ctx, session_id, set_key, roam_id);
5234 sme_release_global_lock(&mac_ctx->sme);
5235 return status;
5236}
5237
Masti, Narayanraddiab712a72016-08-04 11:59:11 +05305238/**
5239 * sme_roam_set_default_key_index - To set default wep key idx
5240 * @hal: pointer to hal handler
5241 * @session_id: session id
5242 * @default_idx: default wep key index
5243 *
5244 * This function prepares a message and post to WMA to set wep default
5245 * key index
5246 *
5247 * Return: Success:QDF_STATUS_SUCCESS Failure: Error value
5248 */
5249QDF_STATUS sme_roam_set_default_key_index(tHalHandle hal, uint8_t session_id,
5250 uint8_t default_idx)
5251{
5252 cds_msg_t msg;
5253 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
5254 struct wep_update_default_key_idx *update_key;
5255
5256 update_key = qdf_mem_malloc(sizeof(*update_key));
5257 if (!update_key) {
5258 sms_log(mac_ctx, LOGE,
5259 FL("Failed to allocate memory for update key"));
5260 return QDF_STATUS_E_NOMEM;
5261 }
5262
5263 update_key->session_id = session_id;
5264 update_key->default_idx = default_idx;
5265
5266 msg.type = WMA_UPDATE_WEP_DEFAULT_KEY;
5267 msg.reserved = 0;
5268 msg.bodyptr = (void *)update_key;
5269
5270 if (QDF_STATUS_SUCCESS !=
5271 cds_mq_post_message(QDF_MODULE_ID_WMA, &msg)) {
5272 sms_log(mac_ctx, LOGE,
5273 FL("Failed to post WMA_UPDATE_WEP_DEFAULT_KEY to WMA"));
5274 qdf_mem_free(update_key);
5275 return QDF_STATUS_E_FAILURE;
5276 }
5277
5278 return QDF_STATUS_SUCCESS;
5279}
5280
5281
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005282/* ---------------------------------------------------------------------------
5283 \fn sme_get_rssi
5284 \brief a wrapper function that client calls to register a callback to get
5285 RSSI
5286
5287 \param hHal - HAL handle for device
5288 \param callback - SME sends back the requested stats using the callback
5289 \param staId - The station ID for which the stats is requested for
5290 \param bssid - The bssid of the connected session
5291 \param lastRSSI - RSSI value at time of request. In case fw cannot provide
5292 RSSI, do not hold up but return this value.
5293 \param pContext - user context to be passed back along with the callback
5294 \param p_cds_context - cds context
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305295 \return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005296 ---------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305297QDF_STATUS sme_get_rssi(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005298 tCsrRssiCallback callback,
Anurag Chouhan6d760662016-02-20 16:05:43 +05305299 uint8_t staId, struct qdf_mac_addr bssId, int8_t lastRSSI,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005300 void *pContext, void *p_cds_context)
5301{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305302 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005303 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
5304
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05305305 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005306 TRACE_CODE_SME_RX_HDD_GET_RSSI, NO_SESSION, 0));
5307 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305308 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005309 status = csr_get_rssi(pMac, callback,
5310 staId, bssId, lastRSSI,
5311 pContext, p_cds_context);
5312 sme_release_global_lock(&pMac->sme);
5313 }
5314 return status;
5315}
5316
5317/* ---------------------------------------------------------------------------
5318 \fn sme_get_snr
5319 \brief a wrapper function that client calls to register a callback to
5320 get SNR
5321
5322 \param callback - SME sends back the requested stats using the callback
5323 \param staId - The station ID for which the stats is requested for
5324 \param pContext - user context to be passed back along with the callback
5325 \param p_cds_context - cds context
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305326 \return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005327 ---------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305328QDF_STATUS sme_get_snr(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005329 tCsrSnrCallback callback,
Anurag Chouhan6d760662016-02-20 16:05:43 +05305330 uint8_t staId, struct qdf_mac_addr bssId, void *pContext)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005331{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305332 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005333 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
5334
5335 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305336 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005337 status = csr_get_snr(pMac, callback, staId, bssId, pContext);
5338 sme_release_global_lock(&pMac->sme);
5339 }
5340 return status;
5341}
5342
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005343/* ---------------------------------------------------------------------------
5344 \fn sme_get_statistics
5345 \brief a wrapper function that client calls to register a callback to get
5346 different PHY level statistics from CSR.
5347
5348 \param requesterId - different client requesting for statistics,
5349 HDD, UMA/GAN etc
5350 \param statsMask - The different category/categories of stats requester
5351 is looking for
5352 \param callback - SME sends back the requested stats using the callback
5353 \param periodicity - If requester needs periodic update in millisec, 0 means
5354 it's an one time request
5355 \param cache - If requester is happy with cached stats
5356 \param staId - The station ID for which the stats is requested for
5357 \param pContext - user context to be passed back along with the callback
5358 \param sessionId - sme session interface
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305359 \return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005360 ---------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305361QDF_STATUS sme_get_statistics(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005362 eCsrStatsRequesterType requesterId,
5363 uint32_t statsMask, tCsrStatsCallback callback,
5364 uint32_t periodicity, bool cache, uint8_t staId,
5365 void *pContext, uint8_t sessionId)
5366{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305367 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005368 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
5369
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05305370 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005371 TRACE_CODE_SME_RX_HDD_GET_STATS, NO_SESSION,
5372 periodicity));
5373 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305374 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005375 status =
5376 csr_get_statistics(pMac, requesterId, statsMask, callback,
5377 periodicity, cache, staId, pContext,
5378 sessionId);
5379 sme_release_global_lock(&pMac->sme);
5380 }
5381
5382 return status;
5383
5384}
5385
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305386QDF_STATUS sme_get_link_status(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005387 tCsrLinkStatusCallback callback,
5388 void *pContext, uint8_t sessionId)
5389{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305390 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005391 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
5392 tAniGetLinkStatus *pMsg;
5393 cds_msg_t cds_message;
5394
5395 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305396 if (QDF_IS_STATUS_SUCCESS(status)) {
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305397 pMsg = qdf_mem_malloc(sizeof(tAniGetLinkStatus));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005398 if (NULL == pMsg) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05305399 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005400 "%s: Not able to allocate memory for link status",
5401 __func__);
5402 sme_release_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305403 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005404 }
5405
5406 pMsg->msgType = WMA_LINK_STATUS_GET_REQ;
5407 pMsg->msgLen = (uint16_t) sizeof(tAniGetLinkStatus);
5408 pMsg->sessionId = sessionId;
5409 pMac->sme.linkStatusContext = pContext;
5410 pMac->sme.linkStatusCallback = callback;
5411
5412 cds_message.type = WMA_LINK_STATUS_GET_REQ;
5413 cds_message.bodyptr = pMsg;
5414 cds_message.reserved = 0;
5415
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305416 if (!QDF_IS_STATUS_SUCCESS
Anurag Chouhan6d760662016-02-20 16:05:43 +05305417 (cds_mq_post_message(QDF_MODULE_ID_WMA, &cds_message))) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05305418 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005419 "%s: Post LINK STATUS MSG fail", __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305420 qdf_mem_free(pMsg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005421 pMac->sme.linkStatusContext = NULL;
5422 pMac->sme.linkStatusCallback = NULL;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305423 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005424 }
5425
5426 sme_release_global_lock(&pMac->sme);
5427 }
5428
5429 return status;
5430}
5431
5432/* ---------------------------------------------------------------------------
5433
5434 \fn sme_get_country_code
5435
5436 \brief To return the current country code. If no country code is applied,
5437 default country code is used to fill the buffer.
5438 If 11d supported is turned off, an error is return and the last
5439 applied/default country code is used.
5440 This is a synchronous API.
5441
5442 \param pBuf - pointer to a caller allocated buffer for returned country code.
5443
5444 \param pbLen For input, this parameter indicates how big is the buffer.
5445 Upon return, this parameter has the number of bytes for
5446 country. If pBuf doesn't have enough space, this function
5447 returns fail status and this parameter contains the number
5448 that is needed.
5449
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305450 \return QDF_STATUS SUCCESS.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005451
5452 FAILURE or RESOURCES The API finished and failed.
5453
5454 -------------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305455QDF_STATUS sme_get_country_code(tHalHandle hHal, uint8_t *pBuf, uint8_t *pbLen)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005456{
5457 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
5458
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05305459 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005460 TRACE_CODE_SME_RX_HDD_GET_CNTRYCODE, NO_SESSION, 0));
5461
5462 return csr_get_country_code(pMac, pBuf, pbLen);
5463}
5464
5465/**
5466 * sme_apply_channel_power_info_to_fw() - sends channel info to fw
5467 * @hHal: hal handle
5468 *
5469 * This function sends the channel power info to firmware
5470 *
5471 * Return: none
5472 */
5473void sme_apply_channel_power_info_to_fw(tHalHandle hHal)
5474{
5475 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
5476
5477 csr_apply_channel_power_info_wrapper(pMac);
5478}
5479
5480/* some support functions */
5481bool sme_is11d_supported(tHalHandle hHal)
5482{
5483 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
5484
5485 return csr_is11d_supported(pMac);
5486}
5487
5488bool sme_is11h_supported(tHalHandle hHal)
5489{
5490 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
5491
5492 return csr_is11h_supported(pMac);
5493}
5494
5495bool sme_is_wmm_supported(tHalHandle hHal)
5496{
5497 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
5498
5499 return csr_is_wmm_supported(pMac);
5500}
5501
5502/* ---------------------------------------------------------------------------
5503
5504 \fn sme_change_country_code
5505
5506 \brief Change Country code from upperlayer during WLAN driver operation.
5507 This is a synchronous API.
5508
5509 \param hHal - The handle returned by mac_open.
5510
5511 \param pCountry New Country Code String
5512
5513 \param sendRegHint If we want to send reg hint to nl80211
5514
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305515 \return QDF_STATUS SUCCESS.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005516
5517 FAILURE or RESOURCES The API finished and failed.
5518
5519 -------------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305520QDF_STATUS sme_change_country_code(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005521 tSmeChangeCountryCallback callback,
5522 uint8_t *pCountry,
5523 void *pContext,
5524 void *p_cds_context,
5525 tAniBool countryFromUserSpace,
5526 tAniBool sendRegHint)
5527{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305528 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005529 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
5530 cds_msg_t msg;
5531 tAniChangeCountryCodeReq *pMsg;
5532
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05305533 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005534 TRACE_CODE_SME_RX_HDD_CHANGE_CNTRYCODE, NO_SESSION,
5535 0));
5536 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305537 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005538 sms_log(pMac, LOG1, FL(" called"));
5539
5540 if ((pMac->roam.configParam.Is11dSupportEnabledOriginal == true)
5541 && (!pMac->roam.configParam.
5542 fSupplicantCountryCodeHasPriority)) {
5543
5544 sms_log(pMac, LOGW,
5545 "Set Country Code Fail since the STA is associated and userspace does not have priority ");
5546
5547 sme_release_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305548 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005549 return status;
5550 }
5551
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305552 pMsg = qdf_mem_malloc(sizeof(tAniChangeCountryCodeReq));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005553 if (NULL == pMsg) {
5554 sms_log(pMac, LOGE,
5555 " csrChangeCountryCode: failed to allocate mem for req");
5556 sme_release_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305557 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005558 }
5559
5560 pMsg->msgType = eWNI_SME_CHANGE_COUNTRY_CODE;
5561 pMsg->msgLen = (uint16_t) sizeof(tAniChangeCountryCodeReq);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305562 qdf_mem_copy(pMsg->countryCode, pCountry, 3);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005563 pMsg->countryFromUserSpace = countryFromUserSpace;
5564 pMsg->sendRegHint = sendRegHint;
5565 pMsg->changeCCCallback = callback;
5566 pMsg->pDevContext = pContext;
5567 pMsg->p_cds_context = p_cds_context;
5568
5569 msg.type = eWNI_SME_CHANGE_COUNTRY_CODE;
5570 msg.bodyptr = pMsg;
5571 msg.reserved = 0;
5572
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305573 if (QDF_STATUS_SUCCESS !=
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005574 cds_mq_post_message(CDS_MQ_ID_SME, &msg)) {
5575 sms_log(pMac, LOGE,
5576 " sme_change_country_code failed to post msg to self ");
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305577 qdf_mem_free((void *)pMsg);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305578 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005579 }
5580 sms_log(pMac, LOG1, FL(" returned"));
5581 sme_release_global_lock(&pMac->sme);
5582 }
5583
5584 return status;
5585}
5586
5587/*--------------------------------------------------------------------------
5588
5589 \fn sme_generic_change_country_code
5590
5591 \brief Change Country code from upperlayer during WLAN driver operation.
5592 This is a synchronous API.
5593
5594 \param hHal - The handle returned by mac_open.
5595
5596 \param pCountry New Country Code String
5597
5598 \param reg_domain regulatory domain
5599
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305600 \return QDF_STATUS SUCCESS.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005601
5602 FAILURE or RESOURCES The API finished and failed.
5603
5604 -----------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305605QDF_STATUS sme_generic_change_country_code(tHalHandle hHal,
Amar Singhal7f1f3ec2015-10-13 17:14:08 -07005606 uint8_t *pCountry)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005607{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305608 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005609 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
5610 cds_msg_t msg;
5611 tAniGenericChangeCountryCodeReq *pMsg;
5612
5613 if (NULL == pMac) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05305614 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_FATAL,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005615 "%s: pMac is null", __func__);
5616 return status;
5617 }
5618
5619 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305620 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005621 sms_log(pMac, LOG1, FL(" called"));
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305622 pMsg = qdf_mem_malloc(sizeof(tAniGenericChangeCountryCodeReq));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005623
5624 if (NULL == pMsg) {
5625 sms_log(pMac, LOGE,
5626 " sme_generic_change_country_code: failed to allocate mem for req");
5627 sme_release_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305628 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005629 }
5630
5631 pMsg->msgType = eWNI_SME_GENERIC_CHANGE_COUNTRY_CODE;
5632 pMsg->msgLen =
5633 (uint16_t) sizeof(tAniGenericChangeCountryCodeReq);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305634 qdf_mem_copy(pMsg->countryCode, pCountry, 2);
Amar Singhal7f1f3ec2015-10-13 17:14:08 -07005635 pMsg->countryCode[2] = ' ';
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005636
5637 msg.type = eWNI_SME_GENERIC_CHANGE_COUNTRY_CODE;
5638 msg.bodyptr = pMsg;
5639 msg.reserved = 0;
5640
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305641 if (QDF_STATUS_SUCCESS !=
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005642 cds_mq_post_message(CDS_MQ_ID_SME, &msg)) {
5643 sms_log(pMac, LOGE,
5644 "sme_generic_change_country_code failed to post msg to self");
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305645 qdf_mem_free(pMsg);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305646 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005647 }
5648 sms_log(pMac, LOG1, FL(" returned"));
5649 sme_release_global_lock(&pMac->sme);
5650 }
5651
5652 return status;
5653}
5654
5655/* ---------------------------------------------------------------------------
5656
5657 \fn sme_dhcp_start_ind
5658
5659 \brief API to signal the FW about the DHCP Start event.
5660
5661 \param hHal - HAL handle for device.
5662
5663 \param device_mode - mode(AP,SAP etc) of the device.
5664
5665 \param macAddr - MAC address of the adapter.
5666
5667 \param sessionId - session ID.
5668
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305669 \return QDF_STATUS SUCCESS.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005670
5671 FAILURE or RESOURCES The API finished and failed.
5672 --------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305673QDF_STATUS sme_dhcp_start_ind(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005674 uint8_t device_mode,
5675 uint8_t *macAddr, uint8_t sessionId)
5676{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305677 QDF_STATUS status;
5678 QDF_STATUS qdf_status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005679 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
5680 cds_msg_t cds_message;
5681 tAniDHCPInd *pMsg;
5682 tCsrRoamSession *pSession;
5683
5684 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305685 if (QDF_STATUS_SUCCESS == status) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005686 pSession = CSR_GET_SESSION(pMac, sessionId);
5687
5688 if (!pSession) {
5689 sms_log(pMac, LOGE, FL("session %d not found "),
5690 sessionId);
5691 sme_release_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305692 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005693 }
Arif Hussain3316f402016-11-10 13:08:03 -08005694 pSession->dhcp_done = false;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005695
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305696 pMsg = (tAniDHCPInd *) qdf_mem_malloc(sizeof(tAniDHCPInd));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005697 if (NULL == pMsg) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05305698 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005699 "%s: Not able to allocate memory for dhcp start",
5700 __func__);
5701 sme_release_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305702 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005703 }
5704 pMsg->msgType = WMA_DHCP_START_IND;
5705 pMsg->msgLen = (uint16_t) sizeof(tAniDHCPInd);
5706 pMsg->device_mode = device_mode;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305707 qdf_mem_copy(pMsg->adapterMacAddr.bytes, macAddr,
Anurag Chouhan6d760662016-02-20 16:05:43 +05305708 QDF_MAC_ADDR_SIZE);
Anurag Chouhanc5548422016-02-24 18:33:27 +05305709 qdf_copy_macaddr(&pMsg->peerMacAddr,
Srinivas Girigowda296105a2015-09-24 16:31:16 -07005710 &pSession->connectedProfile.bssid);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005711
5712 cds_message.type = WMA_DHCP_START_IND;
5713 cds_message.bodyptr = pMsg;
5714 cds_message.reserved = 0;
Sreelakshmi Konamki6a065362016-05-31 16:05:01 +05305715 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
5716 sessionId, cds_message.type));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305717 qdf_status = cds_mq_post_message(CDS_MQ_ID_WMA, &cds_message);
5718 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05305719 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005720 "%s: Post DHCP Start MSG fail", __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305721 qdf_mem_free(pMsg);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305722 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005723 }
5724 sme_release_global_lock(&pMac->sme);
5725 }
5726 return status;
5727}
5728
5729/* ---------------------------------------------------------------------------
5730 \fn sme_dhcp_stop_ind
5731
5732 \brief API to signal the FW about the DHCP complete event.
5733
5734 \param hHal - HAL handle for device.
5735
5736 \param device_mode - mode(AP, SAP etc) of the device.
5737
5738 \param macAddr - MAC address of the adapter.
5739
5740 \param sessionId - session ID.
5741
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305742 \return QDF_STATUS SUCCESS.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005743 FAILURE or RESOURCES The API finished and failed.
5744 --------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305745QDF_STATUS sme_dhcp_stop_ind(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005746 uint8_t device_mode,
5747 uint8_t *macAddr, uint8_t sessionId)
5748{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305749 QDF_STATUS status;
5750 QDF_STATUS qdf_status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005751 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
5752 cds_msg_t cds_message;
5753 tAniDHCPInd *pMsg;
5754 tCsrRoamSession *pSession;
5755
5756 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305757 if (QDF_STATUS_SUCCESS == status) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005758 pSession = CSR_GET_SESSION(pMac, sessionId);
5759
5760 if (!pSession) {
5761 sms_log(pMac, LOGE, FL("session %d not found "),
5762 sessionId);
5763 sme_release_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305764 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005765 }
Arif Hussain3316f402016-11-10 13:08:03 -08005766 pSession->dhcp_done = true;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005767
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305768 pMsg = (tAniDHCPInd *) qdf_mem_malloc(sizeof(tAniDHCPInd));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005769 if (NULL == pMsg) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05305770 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005771 "%s: Not able to allocate memory for dhcp stop",
5772 __func__);
5773 sme_release_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305774 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005775 }
5776
5777 pMsg->msgType = WMA_DHCP_STOP_IND;
5778 pMsg->msgLen = (uint16_t) sizeof(tAniDHCPInd);
5779 pMsg->device_mode = device_mode;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305780 qdf_mem_copy(pMsg->adapterMacAddr.bytes, macAddr,
Anurag Chouhan6d760662016-02-20 16:05:43 +05305781 QDF_MAC_ADDR_SIZE);
Anurag Chouhanc5548422016-02-24 18:33:27 +05305782 qdf_copy_macaddr(&pMsg->peerMacAddr,
Srinivas Girigowda296105a2015-09-24 16:31:16 -07005783 &pSession->connectedProfile.bssid);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005784
5785 cds_message.type = WMA_DHCP_STOP_IND;
5786 cds_message.bodyptr = pMsg;
5787 cds_message.reserved = 0;
Sreelakshmi Konamki6a065362016-05-31 16:05:01 +05305788 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
5789 sessionId, cds_message.type));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305790 qdf_status = cds_mq_post_message(CDS_MQ_ID_WMA, &cds_message);
5791 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05305792 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005793 "%s: Post DHCP Stop MSG fail", __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305794 qdf_mem_free(pMsg);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305795 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005796 }
5797
5798 sme_release_global_lock(&pMac->sme);
5799 }
5800 return status;
5801}
5802
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08005803/*---------------------------------------------------------------------------
5804
5805 \fn sme_TXFailMonitorStopInd
5806
5807 \brief API to signal the FW to start monitoring TX failures
5808
5809 \return QDF_STATUS SUCCESS.
5810
5811 FAILURE or RESOURCES The API finished and failed.
5812 --------------------------------------------------------------------------*/
5813QDF_STATUS sme_tx_fail_monitor_start_stop_ind(tHalHandle hHal, uint8_t tx_fail_count,
5814 void *txFailIndCallback)
5815{
5816 QDF_STATUS status;
5817 QDF_STATUS qdf_status;
5818 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
5819 cds_msg_t cds_message;
5820 tAniTXFailMonitorInd *pMsg;
5821
5822 status = sme_acquire_global_lock(&pMac->sme);
5823 if (QDF_STATUS_SUCCESS == status) {
5824 pMsg = (tAniTXFailMonitorInd *)
5825 qdf_mem_malloc(sizeof(tAniTXFailMonitorInd));
5826 if (NULL == pMsg) {
5827 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
5828 "%s: Failed to allocate memory", __func__);
5829 sme_release_global_lock(&pMac->sme);
5830 return QDF_STATUS_E_NOMEM;
5831 }
5832
5833 pMsg->msgType = WMA_TX_FAIL_MONITOR_IND;
5834 pMsg->msgLen = (uint16_t) sizeof(tAniTXFailMonitorInd);
5835
5836 /* tx_fail_count = 0 should disable the Monitoring in FW */
5837 pMsg->tx_fail_count = tx_fail_count;
5838 pMsg->txFailIndCallback = txFailIndCallback;
5839
5840 cds_message.type = WMA_TX_FAIL_MONITOR_IND;
5841 cds_message.bodyptr = pMsg;
5842 cds_message.reserved = 0;
5843
5844 qdf_status = cds_mq_post_message(CDS_MQ_ID_WMA, &cds_message);
5845 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
5846 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
5847 "%s: Post TX Fail monitor Start MSG fail",
5848 __func__);
5849 qdf_mem_free(pMsg);
5850 status = QDF_STATUS_E_FAILURE;
5851 }
5852 sme_release_global_lock(&pMac->sme);
5853 }
5854 return status;
5855}
5856
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005857/* ---------------------------------------------------------------------------
5858 \fn sme_set_cfg_privacy
5859 \brief API to set configure privacy parameters
5860 \param hHal - The handle returned by mac_open.
5861 \param pProfile - Pointer CSR Roam profile.
5862 \param fPrivacy - This parameter indicates status of privacy
5863
5864 \return void
5865 ---------------------------------------------------------------------------*/
5866void sme_set_cfg_privacy(tHalHandle hHal,
5867 tCsrRoamProfile *pProfile, bool fPrivacy)
5868{
5869 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05305870 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005871 TRACE_CODE_SME_RX_HDD_SET_CFGPRIVACY, NO_SESSION, 0));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305872 if (QDF_STATUS_SUCCESS == sme_acquire_global_lock(&pMac->sme)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005873 csr_set_cfg_privacy(pMac, pProfile, fPrivacy);
5874 sme_release_global_lock(&pMac->sme);
5875 }
5876}
5877
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005878/* ---------------------------------------------------------------------------
5879 \fn sme_neighbor_report_request
5880 \brief API to request neighbor report.
5881 \param hHal - The handle returned by mac_open.
5882 \param pRrmNeighborReq - Pointer to a caller allocated object of type
5883 tRrmNeighborReq. Caller owns the memory and is
5884 responsible for freeing it.
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305885 \return QDF_STATUS
5886 QDF_STATUS_E_FAILURE - failure
5887 QDF_STATUS_SUCCESS success
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005888 ---------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305889QDF_STATUS sme_neighbor_report_request(tHalHandle hHal, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005890 tpRrmNeighborReq pRrmNeighborReq,
5891 tpRrmNeighborRspCallbackInfo callbackInfo)
5892{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305893 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005894 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05305895 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005896 TRACE_CODE_SME_RX_HDD_NEIGHBOR_REPORTREQ, NO_SESSION,
5897 0));
5898
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305899 if (QDF_STATUS_SUCCESS == sme_acquire_global_lock(&pMac->sme)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005900 status =
5901 sme_rrm_neighbor_report_request(hHal, sessionId,
5902 pRrmNeighborReq, callbackInfo);
5903 sme_release_global_lock(&pMac->sme);
5904 }
5905
5906 return status;
5907}
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005908
5909void sms_log(tpAniSirGlobal pMac, uint32_t loglevel, const char *pString, ...)
5910{
5911#ifdef WLAN_DEBUG
5912 /* Verify against current log level */
5913 if (loglevel >
5914 pMac->utils.gLogDbgLevel[LOG_INDEX_FOR_MODULE(SIR_SMS_MODULE_ID)])
5915 return;
5916 else {
5917 va_list marker;
5918
5919 va_start(marker, pString); /* Initialize variable arguments. */
5920
5921 log_debug(pMac, SIR_SMS_MODULE_ID, loglevel, pString, marker);
5922
5923 va_end(marker); /* Reset variable arguments. */
5924 }
5925#endif
5926}
5927
5928/* ---------------------------------------------------------------------------
5929 \fn sme_get_wcnss_wlan_compiled_version
5930 \brief This API returns the version of the WCNSS WLAN API with
5931 which the HOST driver was built
5932 \param hHal - The handle returned by mac_open.
5933 \param pVersion - Points to the Version structure to be filled
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305934 \return QDF_STATUS
5935 QDF_STATUS_E_INVAL - failure
5936 QDF_STATUS_SUCCESS success
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005937 ---------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305938QDF_STATUS sme_get_wcnss_wlan_compiled_version(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005939 tSirVersionType *pVersion)
5940{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305941 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005942 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
5943
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305944 if (QDF_STATUS_SUCCESS == sme_acquire_global_lock(&pMac->sme)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005945 if (pVersion != NULL)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305946 status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005947 else
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305948 status = QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005949
5950 sme_release_global_lock(&pMac->sme);
5951 }
5952
5953 return status;
5954}
5955
5956/* ---------------------------------------------------------------------------
5957 \fn sme_get_wcnss_wlan_reported_version
5958 \brief This API returns the version of the WCNSS WLAN API with
5959 which the WCNSS driver reports it was built
5960 \param hHal - The handle returned by mac_open.
5961 \param pVersion - Points to the Version structure to be filled
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305962 \return QDF_STATUS
5963 QDF_STATUS_E_INVAL - failure
5964 QDF_STATUS_SUCCESS success
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005965 ---------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305966QDF_STATUS sme_get_wcnss_wlan_reported_version(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005967 tSirVersionType *pVersion)
5968{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305969 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005970 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
5971
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305972 if (QDF_STATUS_SUCCESS == sme_acquire_global_lock(&pMac->sme)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005973 if (pVersion != NULL)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305974 status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005975 else
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305976 status = QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005977
5978 sme_release_global_lock(&pMac->sme);
5979 }
5980
5981 return status;
5982}
5983
5984/* ---------------------------------------------------------------------------
5985 \fn sme_get_wcnss_software_version
5986 \brief This API returns the version string of the WCNSS driver
5987 \param hHal - The handle returned by mac_open.
5988 \param pVersion - Points to the Version string buffer to be filled
5989 \param versionBufferSize - THe size of the Version string buffer
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305990 \return QDF_STATUS
5991 QDF_STATUS_E_INVAL - failure
5992 QDF_STATUS_SUCCESS success
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005993 ---------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305994QDF_STATUS sme_get_wcnss_software_version(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005995 uint8_t *pVersion,
5996 uint32_t versionBufferSize)
5997{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305998 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005999 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
6000 v_CONTEXT_t cds_context = cds_get_global_context();
6001
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306002 if (QDF_STATUS_SUCCESS == sme_acquire_global_lock(&pMac->sme)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006003 if (pVersion != NULL) {
6004 status =
6005 wma_get_wcnss_software_version(cds_context,
6006 pVersion,
6007 versionBufferSize);
6008 } else {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306009 status = QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006010 }
6011 sme_release_global_lock(&pMac->sme);
6012 }
6013
6014 return status;
6015}
6016
6017/* ---------------------------------------------------------------------------
6018 \fn sme_get_wcnss_hardware_version
6019 \brief This API returns the version string of the WCNSS hardware
6020 \param hHal - The handle returned by mac_open.
6021 \param pVersion - Points to the Version string buffer to be filled
6022 \param versionBufferSize - THe size of the Version string buffer
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306023 \return QDF_STATUS
6024 QDF_STATUS_E_INVAL - failure
6025 QDF_STATUS_SUCCESS success
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006026 ---------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306027QDF_STATUS sme_get_wcnss_hardware_version(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006028 uint8_t *pVersion,
6029 uint32_t versionBufferSize)
6030{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306031 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006032 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
6033
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306034 if (QDF_STATUS_SUCCESS == sme_acquire_global_lock(&pMac->sme)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006035 if (pVersion != NULL)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306036 status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006037 else
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306038 status = QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006039
6040 sme_release_global_lock(&pMac->sme);
6041 }
6042
6043 return status;
6044}
6045
6046#ifdef FEATURE_WLAN_WAPI
6047
6048/* ---------------------------------------------------------------------------
6049 \fn sme_scan_get_bkid_candidate_list
6050 \brief a wrapper function to return the BKID candidate list
6051 \param pBkidList - caller allocated buffer point to an array of
6052 tBkidCandidateInfo
6053 \param pNumItems - pointer to a variable that has the number of
6054 tBkidCandidateInfo allocated when retruning, this is
6055 either the number needed or number of items put into
6056 pPmkidList
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306057 \return QDF_STATUS - when fail, it usually means the buffer allocated is not
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006058 big enough and pNumItems
6059 has the number of tBkidCandidateInfo.
6060 \Note: pNumItems is a number of tBkidCandidateInfo,
6061 not sizeof(tBkidCandidateInfo) * something
6062 ---------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306063QDF_STATUS sme_scan_get_bkid_candidate_list(tHalHandle hHal, uint32_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006064 tBkidCandidateInfo *pBkidList,
6065 uint32_t *pNumItems)
6066{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306067 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006068 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
6069
6070 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306071 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006072 status =
6073 csr_scan_get_bkid_candidate_list(pMac, sessionId, pBkidList,
6074 pNumItems);
6075 sme_release_global_lock(&pMac->sme);
6076 }
6077
6078 return status;
6079}
6080#endif /* FEATURE_WLAN_WAPI */
6081
6082#ifdef FEATURE_OEM_DATA_SUPPORT
Krishna Kumaar Natarajanc5e06ac2016-06-30 16:49:19 -07006083/**
6084 * sme_oem_data_req() - send oem data request to WMA
6085 * @hal: HAL handle
6086 * @hdd_oem_req: OEM data request from HDD
6087 *
6088 * Return: QDF_STATUS
6089 */
Krishna Kumaar Natarajanc1fa17d2016-08-03 14:19:20 -07006090QDF_STATUS sme_oem_data_req(tHalHandle hal, struct oem_data_req *hdd_oem_req)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006091{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306092 QDF_STATUS status = QDF_STATUS_SUCCESS;
Krishna Kumaar Natarajanc5e06ac2016-06-30 16:49:19 -07006093 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
Krishna Kumaar Natarajanc1fa17d2016-08-03 14:19:20 -07006094 struct oem_data_req *oem_data_req;
Krishna Kumaar Natarajanc5e06ac2016-06-30 16:49:19 -07006095 void *wma_handle;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006096
Krishna Kumaar Natarajanc5e06ac2016-06-30 16:49:19 -07006097 sms_log(mac_ctx, LOG1, FL("enter"));
6098 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
6099 if (!wma_handle) {
6100 sms_log(mac_ctx, LOGE, FL("wma_handle is NULL"));
6101 return QDF_STATUS_E_FAILURE;
6102 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006103
Krishna Kumaar Natarajanc5e06ac2016-06-30 16:49:19 -07006104 oem_data_req = qdf_mem_malloc(sizeof(*oem_data_req));
6105 if (!oem_data_req) {
6106 sms_log(mac_ctx, LOGE, FL("mem alloc failed"));
6107 return QDF_STATUS_E_NOMEM;
6108 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006109
Krishna Kumaar Natarajanc5e06ac2016-06-30 16:49:19 -07006110 oem_data_req->data_len = hdd_oem_req->data_len;
6111 oem_data_req->data = qdf_mem_malloc(oem_data_req->data_len);
6112 if (!oem_data_req->data) {
6113 sms_log(mac_ctx, LOGE, FL("mem alloc failed"));
6114 return QDF_STATUS_E_NOMEM;
6115 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006116
Krishna Kumaar Natarajanc5e06ac2016-06-30 16:49:19 -07006117 qdf_mem_copy(oem_data_req->data, hdd_oem_req->data,
6118 oem_data_req->data_len);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006119
Krishna Kumaar Natarajanc5e06ac2016-06-30 16:49:19 -07006120 status = wma_start_oem_data_req(wma_handle, oem_data_req);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006121
Krishna Kumaar Natarajanc5e06ac2016-06-30 16:49:19 -07006122 if (!QDF_IS_STATUS_SUCCESS(status)) {
6123 sms_log(mac_ctx, LOGE, FL("Post oem data request msg fail"));
6124 } else {
6125 sms_log(mac_ctx, LOG1,
6126 FL("OEM request(length: %d) sent to WMA"),
6127 oem_data_req->data_len);
6128 }
6129
6130 if (oem_data_req->data_len)
6131 qdf_mem_free(oem_data_req->data);
6132 qdf_mem_free(oem_data_req);
6133
6134 sms_log(mac_ctx, LOG1, FL("exit"));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006135 return status;
6136}
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006137#endif /*FEATURE_OEM_DATA_SUPPORT */
6138
6139/*--------------------------------------------------------------------------
6140
6141 \brief sme_open_session() - Open a session for scan/roam operation.
6142
6143 This is a synchronous API.
6144
6145 \param hHal - The handle returned by mac_open.
6146 \param callback - A pointer to the function caller specifies for
6147 roam/connect status indication
6148 \param pContext - The context passed with callback
6149 \param pSelfMacAddr - Caller allocated memory filled with self MAC address
6150 (6 bytes)
6151 \param pbSessionId - pointer to a caller allocated buffer for returned session ID
6152
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306153 \return QDF_STATUS_SUCCESS - session is opened. sessionId returned.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006154
6155 Other status means SME is failed to open the session.
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306156 QDF_STATUS_E_RESOURCES - no more session available.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006157 \sa
6158
6159 --------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306160QDF_STATUS sme_open_session(tHalHandle hHal, csr_roam_completeCallback callback,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006161 void *pContext,
6162 uint8_t *pSelfMacAddr, uint8_t *pbSessionId,
6163 uint32_t type, uint32_t subType)
6164{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306165 QDF_STATUS status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006166 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
6167
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05306168 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_HIGH,
Peng Xu66162de2016-02-11 17:01:20 -08006169 "%s: type=%d, subType=%d addr:%pM",
6170 __func__, type, subType, pSelfMacAddr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006171
6172 if (NULL == pbSessionId) {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306173 status = QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006174 } else {
6175 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306176 if (QDF_IS_STATUS_SUCCESS(status)) {
Peng Xu66162de2016-02-11 17:01:20 -08006177 status = csr_roam_open_session(pMac, callback, pContext,
6178 pSelfMacAddr,
6179 pbSessionId, type,
6180 subType);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006181
6182 sme_release_global_lock(&pMac->sme);
6183 }
6184 }
6185 if (NULL != pbSessionId)
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05306186 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006187 TRACE_CODE_SME_RX_HDD_OPEN_SESSION,
6188 *pbSessionId, 0));
6189
6190 return status;
6191}
6192
6193/*--------------------------------------------------------------------------
6194
6195 \brief sme_close_session() - Open a session for scan/roam operation.
6196
6197 This is a synchronous API.
6198
6199 \param hHal - The handle returned by mac_open.
6200
6201 \param sessionId - A previous opened session's ID.
6202
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306203 \return QDF_STATUS_SUCCESS - session is closed.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006204
6205 Other status means SME is failed to open the session.
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306206 QDF_STATUS_E_INVAL - session is not opened.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006207 \sa
6208
6209 --------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306210QDF_STATUS sme_close_session(tHalHandle hHal, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006211 csr_roamSessionCloseCallback callback,
6212 void *pContext)
6213{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306214 QDF_STATUS status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006215 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
6216
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05306217 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006218 TRACE_CODE_SME_RX_HDD_CLOSE_SESSION, sessionId, 0));
6219 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306220 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006221 status = csr_roam_close_session(pMac, sessionId, false,
6222 callback, pContext);
6223
6224 sme_release_global_lock(&pMac->sme);
6225 }
6226
6227 return status;
6228}
6229
6230/* ---------------------------------------------------------------------------
6231
6232 \fn sme_roam_update_apwpsie
6233
6234 \brief To update AP's WPS IE. This function should be called after SME AP session is created
6235 This is an asynchronous API.
6236
6237 \param pAPWPSIES - pointer to a caller allocated object of tSirAPWPSIEs
6238
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306239 \return QDF_STATUS – SUCCESS –
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006240
6241 FAILURE or RESOURCES – The API finished and failed.
6242
6243 -------------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306244QDF_STATUS sme_roam_update_apwpsie(tHalHandle hHal, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006245 tSirAPWPSIEs *pAPWPSIES)
6246{
6247
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306248 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006249 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
6250
6251 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306252 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006253
6254 status = csr_roam_update_apwpsie(pMac, sessionId, pAPWPSIES);
6255
6256 sme_release_global_lock(&pMac->sme);
6257 }
6258
6259 return status;
6260}
6261
6262/* ---------------------------------------------------------------------------
6263
6264 \fn sme_roam_update_apwparsni_es
6265
6266 \brief To update AP's WPA/RSN IEs. This function should be called after SME AP session is created
6267 This is an asynchronous API.
6268
6269 \param pAPSirRSNie - pointer to a caller allocated object of tSirRSNie with WPS/RSN IEs
6270
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306271 \return QDF_STATUS – SUCCESS –
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006272
6273 FAILURE or RESOURCES – The API finished and failed.
6274
6275 -------------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306276QDF_STATUS sme_roam_update_apwparsni_es(tHalHandle hHal, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006277 tSirRSNie *pAPSirRSNie)
6278{
6279
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306280 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006281 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
6282
6283 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306284 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006285
6286 status = csr_roam_update_wparsni_es(pMac, sessionId, pAPSirRSNie);
6287
6288 sme_release_global_lock(&pMac->sme);
6289 }
6290
6291 return status;
6292}
6293
6294/* ---------------------------------------------------------------------------
6295
6296 \fn sme_change_mcc_beacon_interval
6297
6298 \brief To update P2P-GO beaconInterval. This function should be called after
6299 disassociating all the station is done
6300 This is an asynchronous API.
6301
6302 \param
6303
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306304 \return QDF_STATUS SUCCESS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006305 FAILURE or RESOURCES
6306 The API finished and failed.
6307
6308 -------------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306309QDF_STATUS sme_change_mcc_beacon_interval(tHalHandle hHal, uint8_t sessionId)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006310{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306311 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006312 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
6313
6314 sms_log(pMac, LOG1, FL("Update Beacon PARAMS "));
6315 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306316 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006317 status = csr_send_chng_mcc_beacon_interval(pMac, sessionId);
6318 sme_release_global_lock(&pMac->sme);
6319 }
6320 return status;
6321}
6322
6323/**
6324 * sme_set_host_offload(): API to set the host offload feature.
6325 * @hHal: The handle returned by mac_open.
6326 * @sessionId: Session Identifier
6327 * @request: Pointer to the offload request.
6328 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306329 * Return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006330 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306331QDF_STATUS sme_set_host_offload(tHalHandle hHal, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006332 tpSirHostOffloadReq request)
6333{
6334 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306335 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006336
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05306337 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006338 TRACE_CODE_SME_RX_HDD_SET_HOSTOFFLOAD, sessionId, 0));
6339 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306340 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006341#ifdef WLAN_NS_OFFLOAD
6342 if (SIR_IPV6_NS_OFFLOAD == request->offloadType) {
6343 status = sme_set_ps_ns_offload(hHal, request,
6344 sessionId);
6345 } else
6346#endif /* WLAN_NS_OFFLOAD */
6347 {
6348 status = sme_set_ps_host_offload(hHal, request,
6349 sessionId);
6350 }
6351 sme_release_global_lock(&pMac->sme);
6352 }
6353
6354 return status;
6355}
6356
6357#ifdef WLAN_FEATURE_GTK_OFFLOAD
6358/**
6359 * sme_set_gtk_offload(): API to set GTK offload information.
6360 * @hHal: The handle returned by mac_open.
6361 * @sessionId: Session Identifier
6362 * @pGtkOffload: Pointer to the GTK offload request..
6363 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306364 * Return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006365 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306366QDF_STATUS sme_set_gtk_offload(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006367 tpSirGtkOffloadParams pGtkOffload,
6368 uint8_t sessionId)
6369{
6370 tpSirGtkOffloadParams request_buf;
6371 cds_msg_t msg;
6372 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
6373 tCsrRoamSession *pSession = CSR_GET_SESSION(pMac, sessionId);
6374
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05306375 QDF_TRACE(QDF_MODULE_ID_HDD, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006376 "%s: KeyReplayCounter: %lld", __func__,
6377 pGtkOffload->ullKeyReplayCounter);
6378
6379 if (NULL == pSession) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05306380 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006381 "%s: Session not found ", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306382 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006383 }
6384
Anurag Chouhan600c3a02016-03-01 10:33:54 +05306385 request_buf = qdf_mem_malloc(sizeof(*request_buf));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006386 if (NULL == request_buf) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05306387 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006388 FL("Not able to allocate memory for GTK offload request"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306389 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006390 }
6391
Anurag Chouhanc5548422016-02-24 18:33:27 +05306392 qdf_copy_macaddr(&pGtkOffload->bssid,
Srinivas Girigowda2213b1d2015-11-20 17:10:11 -08006393 &pSession->connectedProfile.bssid);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006394
6395 *request_buf = *pGtkOffload;
6396
6397 msg.type = WMA_GTK_OFFLOAD_REQ;
6398 msg.reserved = 0;
6399 msg.bodyptr = request_buf;
Sreelakshmi Konamki6a065362016-05-31 16:05:01 +05306400 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
6401 sessionId, msg.type));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306402 if (!QDF_IS_STATUS_SUCCESS
Anurag Chouhan6d760662016-02-20 16:05:43 +05306403 (cds_mq_post_message(QDF_MODULE_ID_WMA, &msg))) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05306404 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006405 FL("Not able to post SIR_HAL_SET_GTK_OFFLOAD message to HAL"));
Anurag Chouhan600c3a02016-03-01 10:33:54 +05306406 qdf_mem_free(request_buf);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306407 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006408 }
6409
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306410 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006411}
6412
6413/**
6414 * sme_get_gtk_offload(): API to get GTK offload information
6415 * @hHal: The handle returned by mac_open.
6416 * @callback_routine: callback_routine.
6417 * @sessionId: Session Identifier.
6418 * callback_context: callback_context.
6419 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306420 * Return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006421 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306422QDF_STATUS sme_get_gtk_offload(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006423 gtk_offload_get_info_callback callback_routine,
6424 void *callback_context, uint8_t session_id)
6425{
6426 tpSirGtkOffloadGetInfoRspParams request_buf;
6427 cds_msg_t msg;
6428 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
6429 tCsrRoamSession *pSession = CSR_GET_SESSION(pMac, session_id);
6430
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05306431 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO, "%s: Entered",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006432 __func__);
6433
6434 if (NULL == pSession) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05306435 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Srinivas Girigowda2213b1d2015-11-20 17:10:11 -08006436 "%s: Session not found", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306437 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006438 }
6439
Anurag Chouhan600c3a02016-03-01 10:33:54 +05306440 request_buf = qdf_mem_malloc(sizeof(*request_buf));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006441 if (NULL == request_buf) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05306442 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006443 FL("Not able to allocate memory for Get GTK offload request"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306444 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006445 }
6446
Anurag Chouhanc5548422016-02-24 18:33:27 +05306447 qdf_copy_macaddr(&request_buf->bssid,
Srinivas Girigowda2213b1d2015-11-20 17:10:11 -08006448 &pSession->connectedProfile.bssid);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006449
6450 msg.type = WMA_GTK_OFFLOAD_GETINFO_REQ;
6451 msg.reserved = 0;
6452 msg.bodyptr = request_buf;
6453
6454 /* Cache the Get GTK Offload callback information */
6455 if (NULL != pMac->sme.gtk_offload_get_info_cb) {
6456
6457 /* Do we need to check if the callback is in use? */
6458 /* Because we are not sending the same message again
6459 * when it is pending,
6460 * the only case when the callback is not NULL is that
6461 * the previous message was timed out or failed.
6462 * So, it will be safe to set the callback in this case.
6463 */
6464 }
6465
6466 pMac->sme.gtk_offload_get_info_cb = callback_routine;
6467 pMac->sme.gtk_offload_get_info_cb_context = callback_context;
Sreelakshmi Konamki6a065362016-05-31 16:05:01 +05306468 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
6469 session_id, msg.type));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306470 if (!QDF_IS_STATUS_SUCCESS
Anurag Chouhan6d760662016-02-20 16:05:43 +05306471 (cds_mq_post_message(QDF_MODULE_ID_WMA, &msg))) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05306472 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006473 FL("Not able to post WMA_GTK_OFFLOAD_GETINFO_REQ message to WMA"));
Anurag Chouhan600c3a02016-03-01 10:33:54 +05306474 qdf_mem_free(request_buf);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306475 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006476 }
6477
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306478 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006479}
6480#endif /* WLAN_FEATURE_GTK_OFFLOAD */
6481
6482/* ---------------------------------------------------------------------------
6483 \fn sme_set_keep_alive
6484 \brief API to set the Keep Alive feature.
6485 \param hHal - The handle returned by mac_open.
6486 \param request - Pointer to the Keep Alive request.
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306487 \return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006488 ---------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306489QDF_STATUS sme_set_keep_alive(tHalHandle hHal, uint8_t session_id,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006490 tpSirKeepAliveReq request)
6491{
6492 tpSirKeepAliveReq request_buf;
6493 cds_msg_t msg;
6494 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
6495 tCsrRoamSession *pSession = CSR_GET_SESSION(pMac, session_id);
6496
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05306497 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO_LOW,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006498 FL("WMA_SET_KEEP_ALIVE message"));
6499
6500 if (pSession == NULL) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05306501 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006502 FL("Session not Found"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306503 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006504 }
Anurag Chouhan600c3a02016-03-01 10:33:54 +05306505 request_buf = qdf_mem_malloc(sizeof(tSirKeepAliveReq));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006506 if (NULL == request_buf) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05306507 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006508 FL("Not able to allocate memory for keep alive request"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306509 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006510 }
6511
Anurag Chouhanc5548422016-02-24 18:33:27 +05306512 qdf_copy_macaddr(&request->bssid, &pSession->connectedProfile.bssid);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05306513 qdf_mem_copy(request_buf, request, sizeof(tSirKeepAliveReq));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006514
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05306515 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO_LOW,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006516 "buff TP %d input TP %d ", request_buf->timePeriod,
6517 request->timePeriod);
6518 request_buf->sessionId = session_id;
6519
6520 msg.type = WMA_SET_KEEP_ALIVE;
6521 msg.reserved = 0;
6522 msg.bodyptr = request_buf;
Sreelakshmi Konamki6a065362016-05-31 16:05:01 +05306523 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
6524 session_id, msg.type));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306525 if (QDF_STATUS_SUCCESS !=
Anurag Chouhan6d760662016-02-20 16:05:43 +05306526 cds_mq_post_message(QDF_MODULE_ID_WMA, &msg)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05306527 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006528 FL("Not able to post WMA_SET_KEEP_ALIVE message to WMA"));
Anurag Chouhan600c3a02016-03-01 10:33:54 +05306529 qdf_mem_free(request_buf);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306530 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006531 }
6532
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306533 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006534}
6535
6536#ifdef FEATURE_WLAN_SCAN_PNO
6537/* ---------------------------------------------------------------------------
6538 \fn sme_set_preferred_network_list
6539 \brief API to set the Preferred Network List Offload feature.
6540 \param hHal - The handle returned by mac_open.
6541 \param request - Pointer to the offload request.
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306542 \return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006543 ---------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306544QDF_STATUS sme_set_preferred_network_list(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006545 tpSirPNOScanReq request,
6546 uint8_t sessionId,
6547 void (*callback_routine)(void *callback_context,
6548 tSirPrefNetworkFoundInd
6549 *pPrefNetworkFoundInd),
6550 void *callback_context)
6551{
6552 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306553 QDF_STATUS status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006554
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05306555 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Sreelakshmi Konamki6744cff2015-09-07 12:10:39 +05306556 TRACE_CODE_SME_RX_HDD_PREF_NET_LIST,
6557 sessionId, request->ucNetworksCount));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006558 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306559 if (QDF_IS_STATUS_SUCCESS(status)) {
Dustin Brownf27bce82016-11-03 12:52:27 -07006560 status = sme_set_ps_preferred_network_list(hHal, request,
6561 sessionId,
6562 callback_routine,
6563 callback_context);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006564 sme_release_global_lock(&pMac->sme);
6565 }
6566
6567 return status;
6568}
6569
6570#endif /* FEATURE_WLAN_SCAN_PNO */
6571
6572/* ---------------------------------------------------------------------------
6573 \fn sme_abort_mac_scan
6574 \brief API to cancel MAC scan.
6575 \param hHal - The handle returned by mac_open.
6576 \param sessionId - sessionId on which we need to abort scan.
6577 \param reason - Reason to abort the scan.
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306578 \return QDF_STATUS
6579 QDF_STATUS_E_FAILURE - failure
6580 QDF_STATUS_SUCCESS success
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006581 ---------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306582QDF_STATUS sme_abort_mac_scan(tHalHandle hHal, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006583 eCsrAbortReason reason)
6584{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306585 QDF_STATUS status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006586 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
6587
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05306588 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006589 TRACE_CODE_SME_RX_HDD_ABORT_MACSCAN, NO_SESSION, 0));
6590 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306591 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006592 status = csr_scan_abort_mac_scan(pMac, sessionId, reason);
6593
6594 sme_release_global_lock(&pMac->sme);
6595 }
6596
6597 return status;
6598}
6599
6600/* ----------------------------------------------------------------------------
6601 \fn sme_get_operation_channel
6602 \brief API to get current channel on which STA is parked
6603 this function gives channel information only of infra station or IBSS station
6604 \param hHal, pointer to memory location and sessionId
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306605 \returns QDF_STATUS_SUCCESS
6606 QDF_STATUS_E_FAILURE
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006607 -------------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306608QDF_STATUS sme_get_operation_channel(tHalHandle hHal, uint32_t *pChannel,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006609 uint8_t sessionId)
6610{
6611 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
6612 tCsrRoamSession *pSession;
6613
6614 if (CSR_IS_SESSION_VALID(pMac, sessionId)) {
6615 pSession = CSR_GET_SESSION(pMac, sessionId);
6616
6617 if ((pSession->connectedProfile.BSSType ==
6618 eCSR_BSS_TYPE_INFRASTRUCTURE)
6619 || (pSession->connectedProfile.BSSType ==
6620 eCSR_BSS_TYPE_IBSS)
6621 || (pSession->connectedProfile.BSSType ==
6622 eCSR_BSS_TYPE_INFRA_AP)
6623 || (pSession->connectedProfile.BSSType ==
6624 eCSR_BSS_TYPE_START_IBSS)) {
6625 *pChannel = pSession->connectedProfile.operationChannel;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306626 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006627 }
6628 }
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306629 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006630} /* sme_get_operation_channel ends here */
6631
Abhishek Singh7996eb72015-12-30 17:24:02 +05306632/**
Selvaraj, Sridhar4577a9b2016-09-04 15:17:07 +05306633 * sme_register_p2p_ack_ind_callback() - p2p ack indication callback
6634 * @hal: hal pointer
6635 * @callback: callback pointer to be registered
6636 *
6637 * This function is used to register a callback to PE for p2p ack
6638 * indication
6639 *
6640 * Return: Success if msg is posted to PE else Failure.
6641 */
6642QDF_STATUS sme_register_p2p_ack_ind_callback(tHalHandle hal,
6643 sir_p2p_ack_ind_callback callback)
6644{
6645 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
6646 struct sir_sme_p2p_ack_ind_cb_req *msg;
6647 QDF_STATUS status = QDF_STATUS_SUCCESS;
6648 sms_log(mac_ctx, LOG1, FL(": ENTER"));
6649 status = sme_acquire_global_lock(&mac_ctx->sme);
6650 if (QDF_IS_STATUS_SUCCESS(status)) {
6651 msg = qdf_mem_malloc(sizeof(*msg));
6652 if (NULL == msg) {
6653 sms_log(mac_ctx, LOGE,
6654 FL("Failed to allocate memory"));
6655 sme_release_global_lock(&mac_ctx->sme);
6656 return QDF_STATUS_E_NOMEM;
6657 }
Selvaraj, Sridhar4577a9b2016-09-04 15:17:07 +05306658 msg->message_type = eWNI_SME_REGISTER_P2P_ACK_CB;
6659 msg->length = sizeof(*msg);
6660
6661 msg->callback = callback;
6662 status = cds_send_mb_message_to_mac(msg);
6663 sme_release_global_lock(&mac_ctx->sme);
6664 return status;
6665 }
6666 return status;
6667}
6668
6669/**
Abhishek Singh7996eb72015-12-30 17:24:02 +05306670 * sme_register_mgmt_frame_ind_callback() - Register a callback for
6671 * management frame indication to PE.
6672 *
6673 * @hal: hal pointer
6674 * @callback: callback pointer to be registered
6675 *
6676 * This function is used to register a callback for management
6677 * frame indication to PE.
6678 *
6679 * Return: Success if msg is posted to PE else Failure.
6680 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306681QDF_STATUS sme_register_mgmt_frame_ind_callback(tHalHandle hal,
Abhishek Singh7996eb72015-12-30 17:24:02 +05306682 sir_mgmt_frame_ind_callback callback)
6683{
6684 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
6685 struct sir_sme_mgmt_frame_cb_req *msg;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306686 QDF_STATUS status = QDF_STATUS_SUCCESS;
Abhishek Singh7996eb72015-12-30 17:24:02 +05306687
6688 sms_log(mac_ctx, LOG1, FL(": ENTER"));
6689
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306690 if (QDF_STATUS_SUCCESS ==
Abhishek Singh7996eb72015-12-30 17:24:02 +05306691 sme_acquire_global_lock(&mac_ctx->sme)) {
Anurag Chouhan600c3a02016-03-01 10:33:54 +05306692 msg = qdf_mem_malloc(sizeof(*msg));
Abhishek Singh7996eb72015-12-30 17:24:02 +05306693 if (NULL == msg) {
6694 sms_log(mac_ctx, LOGE,
6695 FL("Not able to allocate memory for eWNI_SME_REGISTER_MGMT_FRAME_CB"));
6696 sme_release_global_lock(&mac_ctx->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306697 return QDF_STATUS_E_NOMEM;
Abhishek Singh7996eb72015-12-30 17:24:02 +05306698 }
Abhishek Singh7996eb72015-12-30 17:24:02 +05306699 msg->message_type = eWNI_SME_REGISTER_MGMT_FRAME_CB;
6700 msg->length = sizeof(*msg);
6701
6702 msg->callback = callback;
6703 status = cds_send_mb_message_to_mac(msg);
6704 sme_release_global_lock(&mac_ctx->sme);
6705 return status;
6706 }
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306707 return QDF_STATUS_E_FAILURE;
Abhishek Singh7996eb72015-12-30 17:24:02 +05306708}
6709
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006710/* ---------------------------------------------------------------------------
6711
6712 \fn sme_RegisterMgtFrame
6713
6714 \brief To register managment frame of specified type and subtype.
6715 \param frameType - type of the frame that needs to be passed to HDD.
6716 \param matchData - data which needs to be matched before passing frame
6717 to HDD.
6718 \param matchDataLen - Length of matched data.
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306719 \return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006720 -------------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306721QDF_STATUS sme_register_mgmt_frame(tHalHandle hHal, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006722 uint16_t frameType, uint8_t *matchData,
6723 uint16_t matchLen)
6724{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306725 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006726 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
6727
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05306728 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006729 TRACE_CODE_SME_RX_HDD_REGISTER_MGMTFR, sessionId, 0));
6730 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306731 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006732 tSirRegisterMgmtFrame *pMsg;
6733 uint16_t len;
6734 tCsrRoamSession *pSession = CSR_GET_SESSION(pMac, sessionId);
6735
6736 if (!CSR_IS_SESSION_ANY(sessionId) && !pSession) {
6737 sms_log(pMac, LOGE, FL(" session %d not found "),
6738 sessionId);
6739 sme_release_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306740 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006741 }
6742
6743 if (!CSR_IS_SESSION_ANY(sessionId) && !pSession->sessionActive) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05306744 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006745 "%s Invalid Sessionid", __func__);
6746 sme_release_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306747 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006748 }
6749
6750 len = sizeof(tSirRegisterMgmtFrame) + matchLen;
6751
Anurag Chouhan600c3a02016-03-01 10:33:54 +05306752 pMsg = qdf_mem_malloc(len);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006753 if (NULL == pMsg)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306754 status = QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006755 else {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006756 pMsg->messageType = eWNI_SME_REGISTER_MGMT_FRAME_REQ;
6757 pMsg->length = len;
6758 pMsg->sessionId = sessionId;
6759 pMsg->registerFrame = true;
6760 pMsg->frameType = frameType;
6761 pMsg->matchLen = matchLen;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05306762 qdf_mem_copy(pMsg->matchData, matchData, matchLen);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006763 status = cds_send_mb_message_to_mac(pMsg);
6764 }
6765 sme_release_global_lock(&pMac->sme);
6766 }
6767 return status;
6768}
6769
6770/* ---------------------------------------------------------------------------
6771
6772 \fn sme_DeregisterMgtFrame
6773
6774 \brief To De-register managment frame of specified type and subtype.
6775 \param frameType - type of the frame that needs to be passed to HDD.
6776 \param matchData - data which needs to be matched before passing frame
6777 to HDD.
6778 \param matchDataLen - Length of matched data.
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306779 \return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006780 -------------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306781QDF_STATUS sme_deregister_mgmt_frame(tHalHandle hHal, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006782 uint16_t frameType, uint8_t *matchData,
6783 uint16_t matchLen)
6784{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306785 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006786 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
6787
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05306788 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006789 TRACE_CODE_SME_RX_HDD_DEREGISTER_MGMTFR, sessionId,
6790 0));
6791 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306792 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006793 tSirRegisterMgmtFrame *pMsg;
6794 uint16_t len;
6795 tCsrRoamSession *pSession = CSR_GET_SESSION(pMac, sessionId);
6796
6797 if (!CSR_IS_SESSION_ANY(sessionId) && !pSession) {
6798 sms_log(pMac, LOGE, FL(" session %d not found "),
6799 sessionId);
6800 sme_release_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306801 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006802 }
6803
6804 if (!CSR_IS_SESSION_ANY(sessionId) && !pSession->sessionActive) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05306805 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006806 "%s Invalid Sessionid", __func__);
6807 sme_release_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306808 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006809 }
6810
6811 len = sizeof(tSirRegisterMgmtFrame) + matchLen;
6812
Anurag Chouhan600c3a02016-03-01 10:33:54 +05306813 pMsg = qdf_mem_malloc(len);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006814 if (NULL == pMsg)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306815 status = QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006816 else {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006817 pMsg->messageType = eWNI_SME_REGISTER_MGMT_FRAME_REQ;
6818 pMsg->length = len;
6819 pMsg->registerFrame = false;
6820 pMsg->frameType = frameType;
6821 pMsg->matchLen = matchLen;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05306822 qdf_mem_copy(pMsg->matchData, matchData, matchLen);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006823 status = cds_send_mb_message_to_mac(pMsg);
6824 }
6825 sme_release_global_lock(&pMac->sme);
6826 }
6827 return status;
6828}
6829
6830/**
6831 * sme_remain_on_channel - API to request remain on channel for 'x' duration
6832 *
6833 * @hHal: pointer to MAC handle
6834 * @session_id: Session identifier
6835 * @channel: channel information
6836 * @duration: duration in ms
6837 * @callback: HDD registered callback to process reaminOnChannelRsp
6838 * @context: HDD Callback param
6839 * @scan_id: scan identifier
6840 *
6841 * This function process the roc request and generates scan identifier.s
6842 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306843 * Return: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006844 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306845QDF_STATUS sme_remain_on_channel(tHalHandle hHal, uint8_t session_id,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006846 uint8_t channel, uint32_t duration,
6847 remainOnChanCallback callback,
6848 void *pContext, uint8_t isP2PProbeReqAllowed,
6849 uint32_t *scan_id)
6850{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306851 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006852 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hHal);
6853 uint32_t san_req_id, scan_count;
6854 struct ani_roc_req *roc_msg;
6855 cds_msg_t msg;
6856
6857
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05306858 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006859 TRACE_CODE_SME_RX_HDD_REMAIN_ONCHAN, session_id, 0));
6860
6861 scan_count = csr_ll_count(&mac_ctx->sme.smeScanCmdActiveList);
6862 if (scan_count >= mac_ctx->scan.max_scan_count) {
6863 sms_log(mac_ctx, LOGE, FL("Max scan reached"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306864 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006865 }
6866
6867 wma_get_scan_id(&san_req_id);
6868 *scan_id = san_req_id;
6869 status = sme_acquire_global_lock(&mac_ctx->sme);
6870
6871 sms_log(mac_ctx, LOG1, FL(" called"));
Anurag Chouhan600c3a02016-03-01 10:33:54 +05306872 roc_msg = qdf_mem_malloc(sizeof(struct ani_roc_req));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006873 if (NULL == roc_msg) {
6874 sms_log(mac_ctx, LOGE,
6875 " scan_req: failed to allocate mem for msg");
6876 sme_release_global_lock(&mac_ctx->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306877 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006878 }
6879 roc_msg->msg_type = eWNI_SME_ROC_CMD;
6880 roc_msg->msg_len = (uint16_t) sizeof(struct ani_roc_req);
6881 roc_msg->session_id = session_id;
6882 roc_msg->callback = callback;
6883 roc_msg->duration = duration;
6884 roc_msg->channel = channel;
6885 roc_msg->is_p2pprobe_allowed = isP2PProbeReqAllowed;
6886 roc_msg->ctx = pContext;
6887 roc_msg->scan_id = *scan_id;
6888 msg.type = eWNI_SME_ROC_CMD;
6889 msg.bodyptr = roc_msg;
6890 msg.reserved = 0;
6891 msg.bodyval = 0;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306892 if (QDF_STATUS_SUCCESS !=
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006893 cds_mq_post_message(CDS_MQ_ID_SME, &msg)) {
6894 sms_log(mac_ctx, LOGE,
6895 " sme_scan_req failed to post msg");
Anurag Chouhan600c3a02016-03-01 10:33:54 +05306896 qdf_mem_free(roc_msg);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306897 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006898 }
6899 sme_release_global_lock(&mac_ctx->sme);
6900 return status;
6901}
6902
6903/* ---------------------------------------------------------------------------
6904 \fn sme_report_probe_req
6905 \brief API to enable/disable forwarding of probeReq to apps in p2p.
6906 \param hHal - The handle returned by mac_open.
6907 \param falg: to set the Probe request forarding to wpa_supplicant in listen state in p2p
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306908 \return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006909 ---------------------------------------------------------------------------*/
6910
6911#ifndef WLAN_FEATURE_CONCURRENT_P2P
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306912QDF_STATUS sme_report_probe_req(tHalHandle hHal, uint8_t flag)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006913{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306914 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006915 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
6916
6917 do {
6918 /* acquire the lock for the sme object */
6919 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306920 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006921 /* call set in context */
6922 pMac->p2pContext.probeReqForwarding = flag;
6923 /* release the lock for the sme object */
6924 sme_release_global_lock(&pMac->sme);
6925 }
6926 } while (0);
6927
6928 sms_log(pMac, LOGW, "exiting function %s", __func__);
6929
6930 return status;
6931}
6932
6933/* ---------------------------------------------------------------------------
6934 \fn sme_update_p2p_ie
6935 \brief API to set the P2p Ie in p2p context
6936 \param hHal - The handle returned by mac_open.
6937 \param p2pIe - Ptr to p2pIe from HDD.
6938 \param p2pIeLength: length of p2pIe
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306939 \return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006940 ---------------------------------------------------------------------------*/
6941
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306942QDF_STATUS sme_update_p2p_ie(tHalHandle hHal, void *p2pIe, uint32_t p2pIeLength)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006943{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306944 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006945 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
6946
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05306947 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006948 TRACE_CODE_SME_RX_HDD_UPDATE_P2P_IE, NO_SESSION, 0));
6949 /* acquire the lock for the sme object */
6950 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306951 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006952 if (NULL != pMac->p2pContext.probeRspIe) {
Anurag Chouhan600c3a02016-03-01 10:33:54 +05306953 qdf_mem_free(pMac->p2pContext.probeRspIe);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006954 pMac->p2pContext.probeRspIeLength = 0;
6955 }
6956
Anurag Chouhan600c3a02016-03-01 10:33:54 +05306957 pMac->p2pContext.probeRspIe = qdf_mem_malloc(p2pIeLength);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006958 if (NULL == pMac->p2pContext.probeRspIe) {
6959 sms_log(pMac, LOGE, "%s: Unable to allocate P2P IE",
6960 __func__);
6961 pMac->p2pContext.probeRspIeLength = 0;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306962 status = QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006963 } else {
6964 pMac->p2pContext.probeRspIeLength = p2pIeLength;
6965
6966 sir_dump_buf(pMac, SIR_LIM_MODULE_ID, LOG2,
6967 pMac->p2pContext.probeRspIe,
6968 pMac->p2pContext.probeRspIeLength);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05306969 qdf_mem_copy((uint8_t *) pMac->p2pContext.probeRspIe,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006970 p2pIe, p2pIeLength);
6971 }
6972
6973 /* release the lock for the sme object */
6974 sme_release_global_lock(&pMac->sme);
6975 }
6976
6977 sms_log(pMac, LOG2, "exiting function %s", __func__);
6978
6979 return status;
6980}
6981#endif
6982
6983/* ---------------------------------------------------------------------------
6984 \fn sme_send_action
6985 \brief API to send action frame from supplicant.
6986 \param hHal - The handle returned by mac_open.
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306987 \return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006988 ---------------------------------------------------------------------------*/
6989
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306990QDF_STATUS sme_send_action(tHalHandle hHal, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006991 const uint8_t *pBuf, uint32_t len,
6992 uint16_t wait, bool noack,
6993 uint16_t channel_freq)
6994{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306995 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006996 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
6997
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05306998 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006999 TRACE_CODE_SME_RX_HDD_SEND_ACTION, sessionId, 0));
7000 /* acquire the lock for the sme object */
7001 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307002 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007003 p2p_send_action(hHal, sessionId, pBuf, len, wait, noack,
7004 channel_freq);
7005 /* release the lock for the sme object */
7006 sme_release_global_lock(&pMac->sme);
7007 }
7008
7009 sms_log(pMac, LOGW, "exiting function %s", __func__);
7010
7011 return status;
7012}
7013
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307014QDF_STATUS sme_cancel_remain_on_channel(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007015 uint8_t sessionId, uint32_t scan_id)
7016{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307017 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007018 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
7019
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05307020 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007021 TRACE_CODE_SME_RX_HDD_CANCEL_REMAIN_ONCHAN, sessionId,
7022 0));
7023 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307024 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007025 status = p2p_cancel_remain_on_channel(hHal, sessionId, scan_id);
7026 sme_release_global_lock(&pMac->sme);
7027 }
7028 return status;
7029}
7030
7031/* Power Save Related */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307032QDF_STATUS sme_p2p_set_ps(tHalHandle hHal, tP2pPsConfig *data)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007033{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307034 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007035 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
7036
7037 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307038 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007039 status = p2p_set_ps(hHal, data);
7040 sme_release_global_lock(&pMac->sme);
7041 }
7042 return status;
7043}
7044
7045/* ---------------------------------------------------------------------------
7046
7047 \fn sme_configure_rxp_filter
7048
7049 \brief
7050 SME will pass this request to lower mac to set/reset the filter on RXP for
7051 multicast & broadcast traffic.
7052
7053 \param
7054
7055 hHal - The handle returned by mac_open.
7056
7057 filterMask- Currently the API takes a 1 or 0 (set or reset) as filter.
7058 Basically to enable/disable the filter (to filter "all" mcbc traffic) based
7059 on this param. In future we can use this as a mask to set various types of
7060 filters as suggested below:
7061 FILTER_ALL_MULTICAST:
7062 FILTER_ALL_BROADCAST:
7063 FILTER_ALL_MULTICAST_BROADCAST:
7064
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307065 \return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007066
7067 --------------------------------------------------------------------------- */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307068QDF_STATUS sme_configure_rxp_filter(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007069 tpSirWlanSetRxpFilters wlanRxpFilterParam)
7070{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307071 QDF_STATUS status = QDF_STATUS_SUCCESS;
7072 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007073 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
7074 cds_msg_t cds_message;
7075
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05307076 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007077 TRACE_CODE_SME_RX_HDD_CONFIG_RXPFIL, NO_SESSION, 0));
7078 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307079 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007080 /* serialize the req through MC thread */
7081 cds_message.bodyptr = wlanRxpFilterParam;
7082 cds_message.type = WMA_CFG_RXP_FILTER_REQ;
Sreelakshmi Konamki6a065362016-05-31 16:05:01 +05307083 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
7084 NO_SESSION, cds_message.type));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307085 qdf_status = cds_mq_post_message(CDS_MQ_ID_WMA, &cds_message);
7086 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
7087 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007088 }
7089 sme_release_global_lock(&pMac->sme);
7090 }
7091 return status;
7092}
7093
7094/* ---------------------------------------------------------------------------
7095
7096 \fn sme_configure_suspend_ind
7097
7098 \brief
7099 SME will pass this request to lower mac to Indicate that the wlan needs to
7100 be suspended
7101
7102 \param
7103
7104 hHal - The handle returned by mac_open.
7105
7106 wlanSuspendParam- Depicts the wlan suspend params
7107
7108 csr_readyToSuspendCallback - Callback to be called when ready to suspend
7109 event is received.
7110 callback_context - Context associated with csr_readyToSuspendCallback.
7111
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307112 \return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007113
7114 --------------------------------------------------------------------------- */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307115QDF_STATUS sme_configure_suspend_ind(tHalHandle hHal,
Houston Hoffman7260ecb2015-10-05 18:43:07 -07007116 uint32_t conn_state_mask,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007117 csr_readyToSuspendCallback callback,
7118 void *callback_context)
7119{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307120 QDF_STATUS status = QDF_STATUS_SUCCESS;
7121 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007122 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
7123 cds_msg_t cds_message;
7124
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05307125 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007126 TRACE_CODE_SME_RX_HDD_CONFIG_SUSPENDIND, NO_SESSION,
7127 0));
7128
7129 pMac->readyToSuspendCallback = callback;
7130 pMac->readyToSuspendContext = callback_context;
7131
7132 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307133 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007134 /* serialize the req through MC thread */
Houston Hoffman7260ecb2015-10-05 18:43:07 -07007135 cds_message.bodyval = conn_state_mask;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007136 cds_message.type = WMA_WLAN_SUSPEND_IND;
Sreelakshmi Konamki6a065362016-05-31 16:05:01 +05307137 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
7138 NO_SESSION, cds_message.type));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307139 qdf_status = cds_mq_post_message(CDS_MQ_ID_WMA, &cds_message);
7140 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007141 pMac->readyToSuspendCallback = NULL;
7142 pMac->readyToSuspendContext = NULL;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307143 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007144 }
7145 sme_release_global_lock(&pMac->sme);
7146 }
7147
7148 return status;
7149}
7150
7151/* ---------------------------------------------------------------------------
7152
7153 \fn sme_configure_resume_req
7154
7155 \brief
7156 SME will pass this request to lower mac to Indicate that the wlan needs to
7157 be Resumed
7158
7159 \param
7160
7161 hHal - The handle returned by mac_open.
7162
7163 wlanResumeParam- Depicts the wlan resume params
7164
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307165 \return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007166
7167 --------------------------------------------------------------------------- */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307168QDF_STATUS sme_configure_resume_req(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007169 tpSirWlanResumeParam wlanResumeParam)
7170{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307171 QDF_STATUS status = QDF_STATUS_SUCCESS;
7172 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007173 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
7174 cds_msg_t cds_message;
7175
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05307176 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007177 TRACE_CODE_SME_RX_HDD_CONFIG_RESUMEREQ, NO_SESSION,
7178 0));
7179 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307180 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007181 /* serialize the req through MC thread */
7182 cds_message.bodyptr = wlanResumeParam;
7183 cds_message.type = WMA_WLAN_RESUME_REQ;
Sreelakshmi Konamki6a065362016-05-31 16:05:01 +05307184 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
7185 NO_SESSION, cds_message.type));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307186 qdf_status = cds_mq_post_message(CDS_MQ_ID_WMA, &cds_message);
7187 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
7188 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007189 }
7190 sme_release_global_lock(&pMac->sme);
7191 }
7192 return status;
7193}
7194
7195#ifdef WLAN_FEATURE_EXTWOW_SUPPORT
Krishna Kumaar Natarajand9131902015-10-19 11:52:47 -07007196/**
7197 * sme_configure_ext_wow() - configure Extr WoW
7198 * @hHal - The handle returned by mac_open.
7199 * @wlanExtParams - Depicts the wlan Ext params.
7200 * @callback - ext_wow callback to be registered.
7201 * @callback_context - ext_wow callback context
7202 *
7203 * SME will pass this request to lower mac to configure Extr WoW
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307204 * Return: QDF_STATUS
Krishna Kumaar Natarajand9131902015-10-19 11:52:47 -07007205 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307206QDF_STATUS sme_configure_ext_wow(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007207 tpSirExtWoWParams wlanExtParams,
7208 csr_readyToExtWoWCallback callback,
7209 void *callback_context)
7210{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307211 QDF_STATUS status = QDF_STATUS_SUCCESS;
7212 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007213 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
7214 cds_msg_t cds_message;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05307215 tpSirExtWoWParams MsgPtr = qdf_mem_malloc(sizeof(*MsgPtr));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007216
7217 if (!MsgPtr)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307218 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007219
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05307220 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007221 TRACE_CODE_SME_RX_HDD_CONFIG_EXTWOW, NO_SESSION, 0));
7222
7223 pMac->readyToExtWoWCallback = callback;
7224 pMac->readyToExtWoWContext = callback_context;
7225
7226 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307227 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007228
7229 /* serialize the req through MC thread */
Anurag Chouhan600c3a02016-03-01 10:33:54 +05307230 qdf_mem_copy(MsgPtr, wlanExtParams, sizeof(*MsgPtr));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007231 cds_message.bodyptr = MsgPtr;
7232 cds_message.type = WMA_WLAN_EXT_WOW;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307233 qdf_status = cds_mq_post_message(CDS_MQ_ID_WMA, &cds_message);
7234 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007235 pMac->readyToExtWoWCallback = NULL;
7236 pMac->readyToExtWoWContext = NULL;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05307237 qdf_mem_free(MsgPtr);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307238 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007239 }
7240 sme_release_global_lock(&pMac->sme);
7241 } else {
7242 pMac->readyToExtWoWCallback = NULL;
7243 pMac->readyToExtWoWContext = NULL;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05307244 qdf_mem_free(MsgPtr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007245 }
7246
7247 return status;
7248}
7249
7250/* ---------------------------------------------------------------------------
7251
7252 \fn sme_configure_app_type1_params
7253
7254 \brief
7255 SME will pass this request to lower mac to configure Indoor WoW parameters.
7256
7257 \param
7258
7259 hHal - The handle returned by mac_open.
7260
7261 wlanAppType1Params- Depicts the wlan App Type 1(Indoor) params
7262
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307263 \return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007264
7265 --------------------------------------------------------------------------- */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307266QDF_STATUS sme_configure_app_type1_params(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007267 tpSirAppType1Params wlanAppType1Params)
7268{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307269 QDF_STATUS status = QDF_STATUS_SUCCESS;
7270 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007271 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
7272 cds_msg_t cds_message;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05307273 tpSirAppType1Params MsgPtr = qdf_mem_malloc(sizeof(*MsgPtr));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007274
7275 if (!MsgPtr)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307276 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007277
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05307278 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007279 TRACE_CODE_SME_RX_HDD_CONFIG_APP_TYPE1, NO_SESSION,
7280 0));
7281
7282 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307283 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007284 /* serialize the req through MC thread */
Anurag Chouhan600c3a02016-03-01 10:33:54 +05307285 qdf_mem_copy(MsgPtr, wlanAppType1Params, sizeof(*MsgPtr));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007286 cds_message.bodyptr = MsgPtr;
7287 cds_message.type = WMA_WLAN_SET_APP_TYPE1_PARAMS;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307288 qdf_status = cds_mq_post_message(CDS_MQ_ID_WMA, &cds_message);
7289 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
Anurag Chouhan600c3a02016-03-01 10:33:54 +05307290 qdf_mem_free(MsgPtr);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307291 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007292 }
7293 sme_release_global_lock(&pMac->sme);
7294 } else {
Anurag Chouhan600c3a02016-03-01 10:33:54 +05307295 qdf_mem_free(MsgPtr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007296 }
7297
7298 return status;
7299}
7300
7301/* ---------------------------------------------------------------------------
7302
7303 \fn sme_configure_app_type2_params
7304
7305 \brief
7306 SME will pass this request to lower mac to configure Indoor WoW parameters.
7307
7308 \param
7309
7310 hHal - The handle returned by mac_open.
7311
7312 wlanAppType2Params- Depicts the wlan App Type 2 (Outdoor) params
7313
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307314 \return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007315
7316 --------------------------------------------------------------------------- */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307317QDF_STATUS sme_configure_app_type2_params(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007318 tpSirAppType2Params wlanAppType2Params)
7319{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307320 QDF_STATUS status = QDF_STATUS_SUCCESS;
7321 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007322 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
7323 cds_msg_t cds_message;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05307324 tpSirAppType2Params MsgPtr = qdf_mem_malloc(sizeof(*MsgPtr));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007325
7326 if (!MsgPtr)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307327 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007328
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05307329 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007330 TRACE_CODE_SME_RX_HDD_CONFIG_APP_TYPE2, NO_SESSION,
7331 0));
7332
7333 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307334 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007335 /* serialize the req through MC thread */
Anurag Chouhan600c3a02016-03-01 10:33:54 +05307336 qdf_mem_copy(MsgPtr, wlanAppType2Params, sizeof(*MsgPtr));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007337 cds_message.bodyptr = MsgPtr;
7338 cds_message.type = WMA_WLAN_SET_APP_TYPE2_PARAMS;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307339 qdf_status = cds_mq_post_message(CDS_MQ_ID_WMA, &cds_message);
7340 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
Anurag Chouhan600c3a02016-03-01 10:33:54 +05307341 qdf_mem_free(MsgPtr);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307342 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007343 }
7344 sme_release_global_lock(&pMac->sme);
7345 } else {
Anurag Chouhan600c3a02016-03-01 10:33:54 +05307346 qdf_mem_free(MsgPtr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007347 }
7348
7349 return status;
7350}
7351#endif
7352
7353/* ---------------------------------------------------------------------------
7354
7355 \fn sme_get_infra_session_id
7356
7357 \brief To get the session ID for infra session, if connected
7358 This is a synchronous API.
7359
7360 \param hHal - The handle returned by mac_open.
7361
7362 \return sessionid, -1 if infra session is not connected
7363
7364 -------------------------------------------------------------------------------*/
7365int8_t sme_get_infra_session_id(tHalHandle hHal)
7366{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307367 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007368 int8_t sessionid = -1;
7369 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
7370
7371 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307372 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007373
7374 sessionid = csr_get_infra_session_id(pMac);
7375
7376 sme_release_global_lock(&pMac->sme);
7377 }
7378
7379 return sessionid;
7380}
7381
7382/* ---------------------------------------------------------------------------
7383
7384 \fn sme_get_infra_operation_channel
7385
7386 \brief To get the operating channel for infra session, if connected
7387 This is a synchronous API.
7388
7389 \param hHal - The handle returned by mac_open.
7390 \param sessionId - the sessionId returned by sme_open_session.
7391
7392 \return operating channel, 0 if infra session is not connected
7393
7394 -------------------------------------------------------------------------------*/
7395uint8_t sme_get_infra_operation_channel(tHalHandle hHal, uint8_t sessionId)
7396{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307397 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007398 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
7399 uint8_t channel = 0;
7400 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307401 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007402
7403 channel = csr_get_infra_operation_channel(pMac, sessionId);
7404
7405 sme_release_global_lock(&pMac->sme);
7406 }
7407
7408 return channel;
7409}
7410
7411/* This routine will return poerating channel on which other BSS is operating to be used for concurrency mode. */
7412/* If other BSS is not up or not connected it will return 0 */
7413uint8_t sme_get_concurrent_operation_channel(tHalHandle hHal)
7414{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307415 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007416 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
7417 uint8_t channel = 0;
7418 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307419 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007420
7421 channel = csr_get_concurrent_operation_channel(pMac);
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05307422 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO_HIGH, "%s: "
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007423 " Other Concurrent Channel = %d", __func__, channel);
7424 sme_release_global_lock(&pMac->sme);
7425 }
7426
7427 return channel;
7428}
7429
7430#ifdef FEATURE_WLAN_MCC_TO_SCC_SWITCH
7431uint16_t sme_check_concurrent_channel_overlap(tHalHandle hHal, uint16_t sap_ch,
7432 eCsrPhyMode sapPhyMode,
7433 uint8_t cc_switch_mode)
7434{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307435 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007436 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
7437 uint16_t channel = 0;
7438
7439 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307440 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007441 channel =
7442 csr_check_concurrent_channel_overlap(pMac, sap_ch, sapPhyMode,
7443 cc_switch_mode);
7444 sme_release_global_lock(&pMac->sme);
7445 }
7446
7447 return channel;
7448}
7449#endif
7450
7451#ifdef FEATURE_WLAN_SCAN_PNO
Varun Reddy Yeturub43fda12015-09-10 18:16:21 -07007452/**
7453 * sme_update_roam_pno_channel_prediction_config() - Update PNO config
Krunal Soni1878d3a2016-01-14 13:00:44 -08007454 * @csr_config: config from SME context
Varun Reddy Yeturub43fda12015-09-10 18:16:21 -07007455 * @hal: Global Hal handle
7456 * @copy_from_to: Used to specify the source and destination
7457 *
7458 * Copy the PNO channel prediction configuration parameters from
7459 * SME context to MAC context or vice-versa
7460 *
7461 * Return: None
7462 */
7463void sme_update_roam_pno_channel_prediction_config(
Krunal Soni1878d3a2016-01-14 13:00:44 -08007464 tHalHandle hal, tCsrConfigParam *csr_config,
Varun Reddy Yeturub43fda12015-09-10 18:16:21 -07007465 uint8_t copy_from_to)
7466{
7467 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
7468 if (copy_from_to == SME_CONFIG_TO_ROAM_CONFIG) {
7469 mac_ctx->roam.configParam.pno_channel_prediction =
Krunal Soni1878d3a2016-01-14 13:00:44 -08007470 csr_config->pno_channel_prediction;
Varun Reddy Yeturub43fda12015-09-10 18:16:21 -07007471 mac_ctx->roam.configParam.top_k_num_of_channels =
Krunal Soni1878d3a2016-01-14 13:00:44 -08007472 csr_config->top_k_num_of_channels;
Varun Reddy Yeturub43fda12015-09-10 18:16:21 -07007473 mac_ctx->roam.configParam.stationary_thresh =
Krunal Soni1878d3a2016-01-14 13:00:44 -08007474 csr_config->stationary_thresh;
Varun Reddy Yeturub43fda12015-09-10 18:16:21 -07007475 mac_ctx->roam.configParam.channel_prediction_full_scan =
Krunal Soni1878d3a2016-01-14 13:00:44 -08007476 csr_config->channel_prediction_full_scan;
Gupta, Kapil96c7f2f2016-04-25 19:13:41 +05307477 mac_ctx->roam.configParam.pnoscan_adaptive_dwell_mode =
7478 csr_config->pnoscan_adaptive_dwell_mode;
Varun Reddy Yeturub43fda12015-09-10 18:16:21 -07007479 } else if (copy_from_to == ROAM_CONFIG_TO_SME_CONFIG) {
Krunal Soni1878d3a2016-01-14 13:00:44 -08007480 csr_config->pno_channel_prediction =
Varun Reddy Yeturub43fda12015-09-10 18:16:21 -07007481 mac_ctx->roam.configParam.pno_channel_prediction;
Krunal Soni1878d3a2016-01-14 13:00:44 -08007482 csr_config->top_k_num_of_channels =
Varun Reddy Yeturub43fda12015-09-10 18:16:21 -07007483 mac_ctx->roam.configParam.top_k_num_of_channels;
Krunal Soni1878d3a2016-01-14 13:00:44 -08007484 csr_config->stationary_thresh =
Varun Reddy Yeturub43fda12015-09-10 18:16:21 -07007485 mac_ctx->roam.configParam.stationary_thresh;
Krunal Soni1878d3a2016-01-14 13:00:44 -08007486 csr_config->channel_prediction_full_scan =
Varun Reddy Yeturub43fda12015-09-10 18:16:21 -07007487 mac_ctx->roam.configParam.channel_prediction_full_scan;
Gupta, Kapil96c7f2f2016-04-25 19:13:41 +05307488 csr_config->pnoscan_adaptive_dwell_mode =
7489 mac_ctx->roam.configParam.pnoscan_adaptive_dwell_mode;
Varun Reddy Yeturub43fda12015-09-10 18:16:21 -07007490 }
7491
7492}
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007493/******************************************************************************
7494*
7495* Name: sme_preferred_network_found_ind
7496*
7497* Description:
7498* Invoke Preferred Network Found Indication
7499*
7500* Parameters:
7501* hHal - HAL handle for device
7502* pMsg - found network description
7503*
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307504* Returns: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007505*
7506******************************************************************************/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307507QDF_STATUS sme_preferred_network_found_ind(tHalHandle hHal, void *pMsg)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007508{
7509 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307510 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007511 tSirPrefNetworkFoundInd *pPrefNetworkFoundInd =
7512 (tSirPrefNetworkFoundInd *) pMsg;
7513 uint8_t dumpSsId[SIR_MAC_MAX_SSID_LENGTH + 1];
7514 uint8_t ssIdLength = 0;
7515
7516 if (NULL == pMsg) {
7517 sms_log(pMac, LOGE, "in %s msg ptr is NULL", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307518 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007519 }
7520
7521 if (pMac->pnoOffload) {
7522 /* Call Preferred Network Found Indication callback routine. */
7523 if (pMac->sme.pref_netw_found_cb != NULL) {
7524 pMac->sme.pref_netw_found_cb(pMac->sme.
7525 preferred_network_found_ind_cb_ctx,
7526 pPrefNetworkFoundInd);
7527 }
7528 return status;
7529 }
7530
7531 if (pPrefNetworkFoundInd->ssId.length > 0) {
7532 ssIdLength = CSR_MIN(SIR_MAC_MAX_SSID_LENGTH,
7533 pPrefNetworkFoundInd->ssId.length);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05307534 qdf_mem_copy(dumpSsId, pPrefNetworkFoundInd->ssId.ssId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007535 ssIdLength);
7536 dumpSsId[ssIdLength] = 0;
7537 sms_log(pMac, LOG2, "%s:SSID=%s frame length %d",
7538 __func__, dumpSsId, pPrefNetworkFoundInd->frameLength);
7539
7540 /* Flush scan results, So as to avoid indication/updation of
7541 * stale entries, which may not have aged out during APPS collapse
7542 */
7543 sme_scan_flush_result(hHal);
7544
7545 /* Save the frame to scan result */
7546 if (pPrefNetworkFoundInd->mesgLen >
7547 sizeof(tSirPrefNetworkFoundInd)) {
7548 /* we may have a frame */
7549 status = csr_scan_save_preferred_network_found(pMac,
7550 pPrefNetworkFoundInd);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307551 if (!QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007552 sms_log(pMac, LOGE,
7553 FL(" fail to save preferred network"));
7554 }
7555 } else {
7556 sms_log(pMac, LOGE,
7557 FL(" not enough data length %d needed %zu"),
7558 pPrefNetworkFoundInd->mesgLen,
7559 sizeof(tSirPrefNetworkFoundInd));
7560 }
7561
7562 /* Call Preferred Netowrk Found Indication callback routine. */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307563 if (QDF_IS_STATUS_SUCCESS(status)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007564 && (pMac->sme.pref_netw_found_cb != NULL)) {
7565 pMac->sme.pref_netw_found_cb(pMac->sme.
7566 preferred_network_found_ind_cb_ctx,
7567 pPrefNetworkFoundInd);
7568 }
7569 } else {
7570 sms_log(pMac, LOGE, "%s: callback failed - SSID is NULL",
7571 __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307572 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007573 }
7574
7575 return status;
7576}
7577
7578#endif /* FEATURE_WLAN_SCAN_PNO */
7579
Arun Khandavalli4b55da72016-07-19 19:55:01 +05307580/**
Manikandan Mohandcc21ba2016-03-15 14:31:56 -07007581 * sme_set_tsfcb() - Set callback for TSF capture
Manikandan Mohan976e7562016-03-15 16:33:31 -07007582 * @h_hal: Handler return by mac_open
Manikandan Mohandcc21ba2016-03-15 14:31:56 -07007583 * @cb_fn: Callback function pointer
7584 * @db_ctx: Callback data
7585 *
7586 * Return: QDF_STATUS
7587 */
Manikandan Mohan976e7562016-03-15 16:33:31 -07007588QDF_STATUS sme_set_tsfcb(tHalHandle h_hal,
Manikandan Mohandcc21ba2016-03-15 14:31:56 -07007589 int (*cb_fn)(void *cb_ctx, struct stsf *ptsf), void *cb_ctx)
7590{
Manikandan Mohan976e7562016-03-15 16:33:31 -07007591 tpAniSirGlobal mac = PMAC_STRUCT(h_hal);
Manikandan Mohandcc21ba2016-03-15 14:31:56 -07007592 QDF_STATUS status;
7593
Manikandan Mohan976e7562016-03-15 16:33:31 -07007594 status = sme_acquire_global_lock(&mac->sme);
Manikandan Mohandcc21ba2016-03-15 14:31:56 -07007595 if (QDF_IS_STATUS_SUCCESS(status)) {
Manikandan Mohan976e7562016-03-15 16:33:31 -07007596 mac->sme.get_tsf_cb = cb_fn;
7597 mac->sme.get_tsf_cxt = cb_ctx;
7598 sme_release_global_lock(&mac->sme);
Manikandan Mohandcc21ba2016-03-15 14:31:56 -07007599 }
7600 return status;
7601}
7602
Arun Khandavalli4b55da72016-07-19 19:55:01 +05307603/**
7604 * sme_reset_tsfcb() - Reset callback for TSF capture
7605 * @h_hal: Handler return by mac_open
7606 *
7607 * This function reset the tsf capture callback to SME
7608 *
7609 * Return: QDF_STATUS
7610 */
7611QDF_STATUS sme_reset_tsfcb(tHalHandle h_hal)
7612{
7613 tpAniSirGlobal mac;
7614 QDF_STATUS status;
7615
7616 if (!h_hal) {
7617 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
7618 FL("h_hal is not valid"));
7619 return QDF_STATUS_E_INVAL;
7620 }
7621 mac = PMAC_STRUCT(h_hal);
7622
7623 status = sme_acquire_global_lock(&mac->sme);
7624 if (QDF_IS_STATUS_SUCCESS(status)) {
7625 mac->sme.get_tsf_cb = NULL;
7626 mac->sme.get_tsf_cxt = NULL;
7627 sme_release_global_lock(&mac->sme);
7628 }
7629 return status;
7630}
7631
Manikandan Mohan976e7562016-03-15 16:33:31 -07007632#ifdef WLAN_FEATURE_TSF
7633/*
7634 * sme_set_tsf_gpio() - set gpio pin that be toggled when capture tef
7635 * @h_hal: Handler return by mac_open
7636 * @pinvalue: gpio pin id
7637 *
7638 * Return: QDF_STATUS
7639 */
7640QDF_STATUS sme_set_tsf_gpio(tHalHandle h_hal, uint32_t pinvalue)
7641{
7642 QDF_STATUS status;
7643 cds_msg_t tsf_msg = {0};
7644 tpAniSirGlobal mac = PMAC_STRUCT(h_hal);
7645
7646 status = sme_acquire_global_lock(&mac->sme);
7647 if (QDF_IS_STATUS_SUCCESS(status)) {
7648 tsf_msg.type = WMA_TSF_GPIO_PIN;
7649 tsf_msg.reserved = 0;
7650 tsf_msg.bodyval = pinvalue;
7651
7652 status = cds_mq_post_message(CDS_MQ_ID_WMA, &tsf_msg);
7653 if (!QDF_IS_STATUS_SUCCESS(status)) {
7654 sms_log(mac, LOGE, "Unable to post WMA_TSF_GPIO_PIN");
7655 status = QDF_STATUS_E_FAILURE;
7656 }
7657 sme_release_global_lock(&mac->sme);
7658 }
7659 return status;
7660}
7661#endif
7662
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307663QDF_STATUS sme_get_cfg_valid_channels(tHalHandle hHal, uint8_t *aValidChannels,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007664 uint32_t *len)
7665{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307666 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007667 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
7668
7669 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307670 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007671 status = csr_get_cfg_valid_channels(pMac, aValidChannels, len);
7672 sme_release_global_lock(&pMac->sme);
7673 }
7674
7675 return status;
7676}
7677
7678/* ---------------------------------------------------------------------------
7679
7680 \fn sme_handle_change_country_code
7681
7682 \brief Change Country code, Reg Domain and channel list
7683
7684 \details Country Code Priority
7685 If Supplicant country code is priority than 11d is disabled.
7686 If 11D is enabled, we update the country code after every scan.
7687 Hence when Supplicant country code is priority, we don't need 11D info.
7688 Country code from Supplicant is set as current courtry code.
7689 User can send reset command XX (instead of country code) to reset the
7690 country code to default values.
7691 If 11D is priority,
7692 Than Supplicant country code code is set to default code. But 11D code is set as current country code
7693
7694 \param pMac - The handle returned by mac_open.
7695 \param pMsgBuf - MSG Buffer
7696
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307697 \return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007698
7699 -------------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307700QDF_STATUS sme_handle_change_country_code(tpAniSirGlobal pMac, void *pMsgBuf)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007701{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307702 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007703 tAniChangeCountryCodeReq *pMsg;
7704 v_REGDOMAIN_t domainIdIoctl;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307705 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Amar Singhala297bfa2015-10-15 15:07:29 -07007706 static uint8_t default_country[CDS_COUNTRY_CODE_LEN + 1];
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007707 pMsg = (tAniChangeCountryCodeReq *) pMsgBuf;
7708
7709 /*
7710 * if the reset Supplicant country code command is triggered,
7711 * enable 11D, reset the country code and return
7712 */
Ankit Guptaa5076012016-09-14 11:32:19 -07007713 if (!qdf_mem_cmp(pMsg->countryCode, SME_INVALID_COUNTRY_CODE, 2)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007714 pMac->roam.configParam.Is11dSupportEnabled =
7715 pMac->roam.configParam.Is11dSupportEnabledOriginal;
7716
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307717 qdf_status = cds_read_default_country(default_country);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007718
7719 /* read the country code and use it */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307720 if (QDF_IS_STATUS_SUCCESS(qdf_status)) {
Anurag Chouhan600c3a02016-03-01 10:33:54 +05307721 qdf_mem_copy(pMsg->countryCode,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007722 default_country,
7723 WNI_CFG_COUNTRY_CODE_LEN);
7724 } else {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307725 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007726 return status;
7727 }
7728 /*
7729 * Update the 11d country to default country so that when
7730 * callback is received for this default country, driver will
7731 * not disable the 11d taking it as valid country by user.
7732 */
7733 sms_log(pMac, LOG1,
7734 FL("Set default country code (%c%c) as invalid country received"),
7735 pMsg->countryCode[0], pMsg->countryCode[1]);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05307736 qdf_mem_copy(pMac->scan.countryCode11d,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007737 pMsg->countryCode,
7738 WNI_CFG_COUNTRY_CODE_LEN);
7739 } else {
7740 /* if Supplicant country code has priority, disable 11d */
7741 if (pMac->roam.configParam.fSupplicantCountryCodeHasPriority &&
7742 pMsg->countryFromUserSpace) {
7743 pMac->roam.configParam.Is11dSupportEnabled = false;
7744 }
7745 }
7746
7747 if (pMac->roam.configParam.Is11dSupportEnabled)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307748 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007749
7750 /* Set Current Country code and Current Regulatory domain */
7751 status = csr_set_country_code(pMac, pMsg->countryCode);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307752 if (QDF_STATUS_SUCCESS != status) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007753 /* Supplicant country code failed. So give 11D priority */
7754 pMac->roam.configParam.Is11dSupportEnabled =
7755 pMac->roam.configParam.Is11dSupportEnabledOriginal;
7756 sms_log(pMac, LOGE, "Set Country Code Fail %d", status);
7757 return status;
7758 }
7759
7760 /* overwrite the defualt country code */
Anurag Chouhan600c3a02016-03-01 10:33:54 +05307761 qdf_mem_copy(pMac->scan.countryCodeDefault,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007762 pMac->scan.countryCodeCurrent, WNI_CFG_COUNTRY_CODE_LEN);
7763
7764 /* Get Domain ID from country code */
7765 status = csr_get_regulatory_domain_for_country(pMac,
7766 pMac->scan.countryCodeCurrent,
7767 (v_REGDOMAIN_t *) &
Amar Singhala297bfa2015-10-15 15:07:29 -07007768 domainIdIoctl,
7769 SOURCE_QUERY);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307770 if (status != QDF_STATUS_SUCCESS) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007771 sms_log(pMac, LOGE, FL(" fail to get regId %d"), domainIdIoctl);
7772 return status;
7773 } else if (REGDOMAIN_WORLD == domainIdIoctl) {
7774 /* Supplicant country code is invalid, so we are on world mode now. So
7775 give 11D chance to update */
7776 pMac->roam.configParam.Is11dSupportEnabled =
7777 pMac->roam.configParam.Is11dSupportEnabledOriginal;
7778 sms_log(pMac, LOG1, FL("Country Code unrecognized by driver"));
7779 }
7780
7781 status = wma_set_reg_domain(pMac, domainIdIoctl);
7782
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 set regId %d"), domainIdIoctl);
7785 return status;
7786 } else {
7787 /* if 11d has priority, clear currentCountryBssid & countryCode11d to get */
7788 /* set again if we find AP with 11d info during scan */
7789 if (!pMac->roam.configParam.fSupplicantCountryCodeHasPriority) {
7790 sms_log(pMac, LOGW,
7791 FL
7792 ("Clearing currentCountryBssid, countryCode11d"));
Anurag Chouhan600c3a02016-03-01 10:33:54 +05307793 qdf_mem_zero(&pMac->scan.currentCountryBssid,
Anurag Chouhan6d760662016-02-20 16:05:43 +05307794 sizeof(struct qdf_mac_addr));
Anurag Chouhan600c3a02016-03-01 10:33:54 +05307795 qdf_mem_zero(pMac->scan.countryCode11d,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007796 sizeof(pMac->scan.countryCode11d));
7797 }
7798 }
7799
7800 if (pMsg->changeCCCallback) {
7801 ((tSmeChangeCountryCallback) (pMsg->changeCCCallback))((void *)
7802 pMsg->
7803 pDevContext);
7804 }
7805
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307806 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007807}
7808
7809/**
Amar Singhal7f1f3ec2015-10-13 17:14:08 -07007810 * sme_handle_generic_change_country_code() - handles country ch req
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007811 * @mac_ctx: mac global context
7812 * @msg: request msg packet
7813 *
7814 * If Supplicant country code is priority than 11d is disabled.
7815 * If 11D is enabled, we update the country code after every scan.
7816 * Hence when Supplicant country code is priority, we don't need 11D info.
7817 * Country code from Supplicant is set as current country code.
7818 *
7819 * Return: status of operation
7820 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307821QDF_STATUS
Amar Singhal7f1f3ec2015-10-13 17:14:08 -07007822sme_handle_generic_change_country_code(tpAniSirGlobal mac_ctx,
7823 void *pMsgBuf)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007824{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307825 QDF_STATUS status = QDF_STATUS_SUCCESS;
Amar Singhal7f1f3ec2015-10-13 17:14:08 -07007826 v_REGDOMAIN_t reg_domain_id = 0;
Amar Singhalb6d0dc42016-10-19 09:45:05 -07007827 bool user_ctry_priority =
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007828 mac_ctx->roam.configParam.fSupplicantCountryCodeHasPriority;
Amar Singhal7f1f3ec2015-10-13 17:14:08 -07007829 tAniGenericChangeCountryCodeReq *msg = pMsgBuf;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007830
7831 sms_log(mac_ctx, LOG1, FL(" called"));
Amar Singhal7f1f3ec2015-10-13 17:14:08 -07007832
Amar Singhalb6d0dc42016-10-19 09:45:05 -07007833 if (!mac_ctx->is_11d_hint) {
7834 if (user_ctry_priority)
7835 mac_ctx->roam.configParam.Is11dSupportEnabled = false;
7836 else {
7837 if (mac_ctx->roam.configParam.Is11dSupportEnabled &&
7838 mac_ctx->scan.countryCode11d[0] != 0) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007839
Amar Singhalb6d0dc42016-10-19 09:45:05 -07007840 sms_log(mac_ctx, LOGW,
7841 FL("restore 11d"));
7842
7843 status = csr_get_regulatory_domain_for_country(
7844 mac_ctx,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007845 mac_ctx->scan.countryCode11d,
Amar Singhalb6d0dc42016-10-19 09:45:05 -07007846 &reg_domain_id,
Amar Singhala297bfa2015-10-15 15:07:29 -07007847 SOURCE_11D);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007848
Amar Singhalb6d0dc42016-10-19 09:45:05 -07007849 return QDF_STATUS_E_FAILURE;
7850 }
7851 }
7852 } else {
7853 /* if kernel gets invalid country code; it
7854 * resets the country code to world
7855 */
7856 if (('0' != msg->countryCode[0]) ||
7857 ('0' != msg->countryCode[1]))
7858 qdf_mem_copy(mac_ctx->scan.countryCode11d,
7859 msg->countryCode,
7860 WNI_CFG_COUNTRY_CODE_LEN);
7861 mac_ctx->is_11d_hint = false;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007862 }
Amar Singhal7f1f3ec2015-10-13 17:14:08 -07007863
Amar Singhalb6d0dc42016-10-19 09:45:05 -07007864 qdf_mem_copy(mac_ctx->scan.countryCodeCurrent,
7865 msg->countryCode,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007866 WNI_CFG_COUNTRY_CODE_LEN);
Amar Singhal9d5b1fe2016-10-16 20:16:05 -07007867
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007868 /* get the channels based on new cc */
7869 status = csr_get_channel_and_power_list(mac_ctx);
7870
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307871 if (status != QDF_STATUS_SUCCESS) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007872 sms_log(mac_ctx, LOGE, FL("fail to get Channels"));
7873 return status;
7874 }
Amar Singhalb6d0dc42016-10-19 09:45:05 -07007875
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007876 /* reset info based on new cc, and we are done */
7877 csr_apply_channel_power_info_wrapper(mac_ctx);
7878
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007879 csr_scan_filter_results(mac_ctx);
Amar Singhalb6d0dc42016-10-19 09:45:05 -07007880
7881 /* scans after the country is set by User hints or
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007882 * Country IE
7883 */
7884 mac_ctx->scan.curScanType = eSIR_ACTIVE_SCAN;
Amar Singhal9d5b1fe2016-10-16 20:16:05 -07007885
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007886 sme_disconnect_connected_sessions(mac_ctx);
Amar Singhalb6d0dc42016-10-19 09:45:05 -07007887
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007888 sms_log(mac_ctx, LOG1, FL(" returned"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307889 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007890}
7891
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007892static bool
7893sme_search_in_base_ch_lst(tpAniSirGlobal mac_ctx, uint8_t curr_ch)
7894{
7895 uint8_t i;
7896 tCsrChannel *ch_lst_info;
7897 ch_lst_info = &mac_ctx->scan.base_channels;
7898 for (i = 0; i < ch_lst_info->numChannels; i++) {
7899 if (ch_lst_info->channelList[i] == curr_ch)
7900 return true;
7901 }
7902
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007903 return false;
7904}
7905/**
7906 * sme_disconnect_connected_sessions() - Disconnect STA and P2P client session
7907 * if channel is not supported
7908 * @mac_ctx: mac global context
7909 *
7910 * If new country code does not support the channel on which STA/P2P client
7911 * is connetced, it sends the disconnect to the AP/P2P GO
7912 *
7913 * Return: void
7914 */
7915void sme_disconnect_connected_sessions(tpAniSirGlobal mac_ctx)
7916{
7917 uint8_t session_id, found = false;
7918 uint8_t curr_ch;
7919
7920 for (session_id = 0; session_id < CSR_ROAM_SESSION_MAX; session_id++) {
7921 if (!csr_is_session_client_and_connected(mac_ctx, session_id))
7922 continue;
7923 found = false;
7924 /* Session is connected.Check the channel */
7925 curr_ch = csr_get_infra_operation_channel(mac_ctx,
7926 session_id);
7927 sms_log(mac_ctx, LOGW,
7928 FL("Current Operating channel : %d, session :%d"),
7929 curr_ch, session_id);
7930 found = sme_search_in_base_ch_lst(mac_ctx, curr_ch);
7931 if (!found) {
7932 sms_log(mac_ctx, LOGW, FL("Disconnect Session :%d"),
7933 session_id);
7934 csr_roam_disconnect(mac_ctx, session_id,
7935 eCSR_DISCONNECT_REASON_UNSPECIFIED);
7936 }
7937 }
7938}
7939
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007940#ifdef WLAN_FEATURE_PACKET_FILTERING
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307941QDF_STATUS sme_8023_multicast_list(tHalHandle hHal, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007942 tpSirRcvFltMcAddrList pMulticastAddrs)
7943{
7944 tpSirRcvFltMcAddrList request_buf;
7945 cds_msg_t msg;
7946 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
7947 tCsrRoamSession *pSession = NULL;
7948
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05307949 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO, "%s: "
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007950 "ulMulticastAddrCnt=%d, multicastAddr[0]=%p", __func__,
7951 pMulticastAddrs->ulMulticastAddrCnt,
Srinivas Girigowda98530492015-11-20 17:39:24 -08007952 pMulticastAddrs->multicastAddr[0].bytes);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007953
Ravi Joshi4f447cb2016-07-19 13:42:01 -07007954 /* Find the connected Infra / P2P_client connected session */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007955 if (CSR_IS_SESSION_VALID(pMac, sessionId) &&
Ravi Joshi4f447cb2016-07-19 13:42:01 -07007956 (csr_is_conn_state_infra(pMac, sessionId) ||
7957 csr_is_ndi_started(pMac, sessionId))) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007958 pSession = CSR_GET_SESSION(pMac, sessionId);
7959 }
7960
7961 if (pSession == NULL) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05307962 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_WARN,
Srinivas Girigowdaf2599dd2015-11-16 18:20:46 -08007963 "%s: Unable to find the session Id: %d", __func__,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007964 sessionId);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307965 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007966 }
7967
Anurag Chouhan600c3a02016-03-01 10:33:54 +05307968 request_buf = qdf_mem_malloc(sizeof(tSirRcvFltMcAddrList));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007969 if (NULL == request_buf) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05307970 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007971 "%s: Not able to "
7972 "allocate memory for 8023 Multicast List request",
7973 __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307974 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007975 }
7976
Ravi Joshi4f447cb2016-07-19 13:42:01 -07007977 if (!csr_is_conn_state_connected_infra(pMac, sessionId) &&
7978 !csr_is_ndi_started(pMac, sessionId)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05307979 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Ravi Joshi4f447cb2016-07-19 13:42:01 -07007980 "%s: Request ignored, session %d is not connected or started",
7981 __func__, sessionId);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05307982 qdf_mem_free(request_buf);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307983 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007984 }
7985
Anurag Chouhan600c3a02016-03-01 10:33:54 +05307986 qdf_mem_copy(request_buf, pMulticastAddrs,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007987 sizeof(tSirRcvFltMcAddrList));
7988
Anurag Chouhanc5548422016-02-24 18:33:27 +05307989 qdf_copy_macaddr(&request_buf->self_macaddr, &pSession->selfMacAddr);
7990 qdf_copy_macaddr(&request_buf->bssid,
Srinivas Girigowda98530492015-11-20 17:39:24 -08007991 &pSession->connectedProfile.bssid);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007992
7993 msg.type = WMA_8023_MULTICAST_LIST_REQ;
7994 msg.reserved = 0;
7995 msg.bodyptr = request_buf;
Sreelakshmi Konamki6a065362016-05-31 16:05:01 +05307996 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
7997 sessionId, msg.type));
Anurag Chouhan6d760662016-02-20 16:05:43 +05307998 if (QDF_STATUS_SUCCESS != cds_mq_post_message(QDF_MODULE_ID_WMA, &msg)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05307999 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008000 "%s: Not able to "
8001 "post WMA_8023_MULTICAST_LIST message to WMA",
8002 __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308003 qdf_mem_free(request_buf);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308004 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008005 }
8006
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308007 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008008}
8009
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308010QDF_STATUS sme_receive_filter_set_filter(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008011 tpSirRcvPktFilterCfgType pRcvPktFilterCfg,
8012 uint8_t sessionId)
8013{
8014 tpSirRcvPktFilterCfgType request_buf;
8015 int32_t allocSize;
8016 cds_msg_t msg;
8017 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
8018 tCsrRoamSession *pSession = CSR_GET_SESSION(pMac, sessionId);
8019 uint8_t idx = 0;
8020
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308021 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO, "%s: filterType=%d, "
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008022 "filterId = %d", __func__,
8023 pRcvPktFilterCfg->filterType, pRcvPktFilterCfg->filterId);
8024
8025 allocSize = sizeof(tSirRcvPktFilterCfgType);
8026
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308027 request_buf = qdf_mem_malloc(allocSize);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008028
8029 if (NULL == request_buf) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308030 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008031 "%s: Not able to "
8032 "allocate memory for Receive Filter Set Filter request",
8033 __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308034 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008035 }
8036
8037 if (NULL == pSession) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308038 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008039 "%s: Session Not found ", __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308040 qdf_mem_free(request_buf);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308041 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008042 }
8043
Anurag Chouhanc5548422016-02-24 18:33:27 +05308044 qdf_copy_macaddr(&pRcvPktFilterCfg->self_macaddr,
Srinivas Girigowda98530492015-11-20 17:39:24 -08008045 &pSession->selfMacAddr);
Anurag Chouhanc5548422016-02-24 18:33:27 +05308046 qdf_copy_macaddr(&pRcvPktFilterCfg->bssid,
Srinivas Girigowda98530492015-11-20 17:39:24 -08008047 &pSession->connectedProfile.bssid);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308048 qdf_mem_copy(request_buf, pRcvPktFilterCfg, allocSize);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008049
8050 msg.type = WMA_RECEIVE_FILTER_SET_FILTER_REQ;
8051 msg.reserved = 0;
8052 msg.bodyptr = request_buf;
Sreelakshmi Konamki6a065362016-05-31 16:05:01 +05308053 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
8054 sessionId, msg.type));
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308055 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO, "Pkt Flt Req : "
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008056 "FT %d FID %d ",
8057 request_buf->filterType, request_buf->filterId);
8058
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308059 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO, "Pkt Flt Req : "
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008060 "params %d CT %d",
8061 request_buf->numFieldParams, request_buf->coalesceTime);
8062
8063 for (idx = 0; idx < request_buf->numFieldParams; idx++) {
8064
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308065 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008066 "Proto %d Comp Flag %d ",
8067 request_buf->paramsData[idx].protocolLayer,
8068 request_buf->paramsData[idx].cmpFlag);
8069
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308070 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008071 "Data Offset %d Data Len %d",
8072 request_buf->paramsData[idx].dataOffset,
8073 request_buf->paramsData[idx].dataLength);
8074
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308075 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008076 "CData: %d:%d:%d:%d:%d:%d",
8077 request_buf->paramsData[idx].compareData[0],
8078 request_buf->paramsData[idx].compareData[1],
8079 request_buf->paramsData[idx].compareData[2],
8080 request_buf->paramsData[idx].compareData[3],
8081 request_buf->paramsData[idx].compareData[4],
8082 request_buf->paramsData[idx].compareData[5]);
8083
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308084 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008085 "MData: %d:%d:%d:%d:%d:%d",
8086 request_buf->paramsData[idx].dataMask[0],
8087 request_buf->paramsData[idx].dataMask[1],
8088 request_buf->paramsData[idx].dataMask[2],
8089 request_buf->paramsData[idx].dataMask[3],
8090 request_buf->paramsData[idx].dataMask[4],
8091 request_buf->paramsData[idx].dataMask[5]);
8092
8093 }
8094
Anurag Chouhan6d760662016-02-20 16:05:43 +05308095 if (QDF_STATUS_SUCCESS != cds_mq_post_message(QDF_MODULE_ID_WMA, &msg)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308096 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008097 "%s: Not able to post "
8098 "WMA_RECEIVE_FILTER_SET_FILTER message to WMA",
8099 __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308100 qdf_mem_free(request_buf);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308101 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008102 }
8103
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308104 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008105}
8106
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308107QDF_STATUS sme_receive_filter_clear_filter(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008108 tpSirRcvFltPktClearParam
8109 pRcvFltPktClearParam, uint8_t sessionId)
8110{
8111 tpSirRcvFltPktClearParam request_buf;
8112 cds_msg_t msg;
8113 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
8114 tCsrRoamSession *pSession = CSR_GET_SESSION(pMac, sessionId);
8115
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308116 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO, "%s: filterId = %d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008117 __func__, pRcvFltPktClearParam->filterId);
8118
Srinivas Girigowda98530492015-11-20 17:39:24 -08008119 if (NULL == pSession) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308120 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Srinivas Girigowda98530492015-11-20 17:39:24 -08008121 "%s: Session Not found", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308122 return QDF_STATUS_E_FAILURE;
Srinivas Girigowda98530492015-11-20 17:39:24 -08008123 }
8124
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308125 request_buf = qdf_mem_malloc(sizeof(tSirRcvFltPktClearParam));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008126 if (NULL == request_buf) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308127 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008128 "%s: Not able to allocate memory for Receive Filter "
8129 "Clear Filter request", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308130 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008131 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008132
Anurag Chouhanc5548422016-02-24 18:33:27 +05308133 qdf_copy_macaddr(&pRcvFltPktClearParam->self_macaddr,
Srinivas Girigowda98530492015-11-20 17:39:24 -08008134 &pSession->selfMacAddr);
Anurag Chouhanc5548422016-02-24 18:33:27 +05308135 qdf_copy_macaddr(&pRcvFltPktClearParam->bssid,
Srinivas Girigowda98530492015-11-20 17:39:24 -08008136 &pSession->connectedProfile.bssid);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008137
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308138 qdf_mem_copy(request_buf, pRcvFltPktClearParam,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008139 sizeof(tSirRcvFltPktClearParam));
8140
8141 msg.type = WMA_RECEIVE_FILTER_CLEAR_FILTER_REQ;
8142 msg.reserved = 0;
8143 msg.bodyptr = request_buf;
Sreelakshmi Konamki6a065362016-05-31 16:05:01 +05308144 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
8145 sessionId, msg.type));
Anurag Chouhan6d760662016-02-20 16:05:43 +05308146 if (QDF_STATUS_SUCCESS != cds_mq_post_message(QDF_MODULE_ID_WMA, &msg)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308147 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008148 "%s: Not able to post "
8149 "WMA_RECEIVE_FILTER_CLEAR_FILTER message to WMA",
8150 __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308151 qdf_mem_free(request_buf);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308152 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008153 }
8154
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308155 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008156}
8157#endif /* WLAN_FEATURE_PACKET_FILTERING */
8158
8159/* ---------------------------------------------------------------------------
8160
8161 \fn sme_is_channel_valid
8162
8163 \brief To check if the channel is valid for currently established domain
8164 This is a synchronous API.
8165
8166 \param hHal - The handle returned by mac_open.
8167 \param channel - channel to verify
8168
8169 \return true/false, true if channel is valid
8170
8171 -------------------------------------------------------------------------------*/
8172bool sme_is_channel_valid(tHalHandle hHal, uint8_t channel)
8173{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308174 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008175 bool valid = false;
8176 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
8177
8178 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308179 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008180
8181 valid = csr_roam_is_channel_valid(pMac, channel);
8182
8183 sme_release_global_lock(&pMac->sme);
8184 }
8185
8186 return valid;
8187}
8188
8189/* ---------------------------------------------------------------------------
8190 \fn sme_set_freq_band
8191 \brief Used to set frequency band.
8192 \param hHal
8193 \param sessionId - Session Identifier
8194 \eBand band value to be configured
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308195 \- return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008196 -------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308197QDF_STATUS sme_set_freq_band(tHalHandle hHal, uint8_t sessionId, eCsrBand eBand)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008198{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308199 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008200 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
8201
8202 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308203 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008204 status = csr_set_band(hHal, sessionId, eBand);
8205 sme_release_global_lock(&pMac->sme);
8206 }
8207 return status;
8208}
8209
8210/* ---------------------------------------------------------------------------
8211 \fn sme_get_freq_band
8212 \brief Used to get the current band settings.
8213 \param hHal
8214 \pBand pointer to hold band value
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308215 \- return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008216 -------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308217QDF_STATUS sme_get_freq_band(tHalHandle hHal, eCsrBand *pBand)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008218{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308219 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008220 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
8221
8222 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308223 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008224 *pBand = csr_get_current_band(hHal);
8225 sme_release_global_lock(&pMac->sme);
8226 }
8227 return status;
8228}
8229
8230/* ---------------------------------------------------------------------------
8231 \fn sme_set_max_tx_power_per_band
8232
8233 \brief Set the Maximum Transmit Power specific to band dynamically.
8234 Note: this setting will not persist over reboots.
8235
8236 \param band
8237 \param power to set in dB
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308238 \- return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008239
8240 ----------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308241QDF_STATUS sme_set_max_tx_power_per_band(eCsrBand band, int8_t dB)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008242{
8243 cds_msg_t msg;
8244 tpMaxTxPowerPerBandParams pMaxTxPowerPerBandParams = NULL;
8245
8246 pMaxTxPowerPerBandParams =
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308247 qdf_mem_malloc(sizeof(tMaxTxPowerPerBandParams));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008248 if (NULL == pMaxTxPowerPerBandParams) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308249 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008250 "%s:Not able to allocate memory for pMaxTxPowerPerBandParams",
8251 __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308252 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008253 }
8254
8255 pMaxTxPowerPerBandParams->power = dB;
8256 pMaxTxPowerPerBandParams->bandInfo = band;
8257
8258 msg.type = WMA_SET_MAX_TX_POWER_PER_BAND_REQ;
8259 msg.reserved = 0;
8260 msg.bodyptr = pMaxTxPowerPerBandParams;
Sreelakshmi Konamki6a065362016-05-31 16:05:01 +05308261 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
8262 NO_SESSION, msg.type));
Anurag Chouhan6d760662016-02-20 16:05:43 +05308263 if (QDF_STATUS_SUCCESS != cds_mq_post_message(QDF_MODULE_ID_WMA, &msg)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308264 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008265 "%s:Not able to post WMA_SET_MAX_TX_POWER_PER_BAND_REQ",
8266 __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308267 qdf_mem_free(pMaxTxPowerPerBandParams);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308268 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008269 }
8270
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308271 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008272}
8273
8274/* ---------------------------------------------------------------------------
8275
8276 \fn sme_set_max_tx_power
8277
8278 \brief Set the Maximum Transmit Power dynamically. Note: this setting will
8279 not persist over reboots.
8280
8281 \param hHal
8282 \param pBssid BSSID to set the power cap for
8283 \param pBssid pSelfMacAddress self MAC Address
8284 \param pBssid power to set in dB
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308285 \- return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008286
8287 -------------------------------------------------------------------------------*/
Anurag Chouhan6d760662016-02-20 16:05:43 +05308288QDF_STATUS sme_set_max_tx_power(tHalHandle hHal, struct qdf_mac_addr pBssid,
8289 struct qdf_mac_addr pSelfMacAddress, int8_t dB)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008290{
8291 cds_msg_t msg;
8292 tpMaxTxPowerParams pMaxTxParams = NULL;
8293
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308294 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008295 TRACE_CODE_SME_RX_HDD_SET_MAXTXPOW, NO_SESSION, 0));
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308296 pMaxTxParams = qdf_mem_malloc(sizeof(tMaxTxPowerParams));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008297 if (NULL == pMaxTxParams) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308298 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008299 "%s: Not able to allocate memory for pMaxTxParams",
8300 __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308301 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008302 }
8303
Anurag Chouhanc5548422016-02-24 18:33:27 +05308304 qdf_copy_macaddr(&pMaxTxParams->bssId, &pBssid);
8305 qdf_copy_macaddr(&pMaxTxParams->selfStaMacAddr, &pSelfMacAddress);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008306 pMaxTxParams->power = dB;
8307
8308 msg.type = WMA_SET_MAX_TX_POWER_REQ;
8309 msg.reserved = 0;
8310 msg.bodyptr = pMaxTxParams;
8311
Anurag Chouhan6d760662016-02-20 16:05:43 +05308312 if (QDF_STATUS_SUCCESS != cds_mq_post_message(QDF_MODULE_ID_WMA, &msg)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308313 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008314 "%s: Not able to post WMA_SET_MAX_TX_POWER_REQ message to WMA",
8315 __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308316 qdf_mem_free(pMaxTxParams);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308317 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008318 }
8319
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308320 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008321}
8322
8323/* ---------------------------------------------------------------------------
8324
8325 \fn sme_set_custom_mac_addr
8326
8327 \brief Set the customer Mac Address.
8328
8329 \param customMacAddr customer MAC Address
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308330 \- return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008331
8332 ---------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308333QDF_STATUS sme_set_custom_mac_addr(tSirMacAddr customMacAddr)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008334{
8335 cds_msg_t msg;
8336 tSirMacAddr *pBaseMacAddr;
8337
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308338 pBaseMacAddr = qdf_mem_malloc(sizeof(tSirMacAddr));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008339 if (NULL == pBaseMacAddr) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308340 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008341 FL("Not able to allocate memory for pBaseMacAddr"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308342 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008343 }
8344
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308345 qdf_mem_copy(*pBaseMacAddr, customMacAddr, sizeof(tSirMacAddr));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008346
8347 msg.type = SIR_HAL_SET_BASE_MACADDR_IND;
8348 msg.reserved = 0;
8349 msg.bodyptr = pBaseMacAddr;
8350
Anurag Chouhan6d760662016-02-20 16:05:43 +05308351 if (QDF_STATUS_SUCCESS != cds_mq_post_message(QDF_MODULE_ID_WMA, &msg)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308352 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008353 FL
8354 ("Not able to post SIR_HAL_SET_BASE_MACADDR_IND message to WMA"));
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308355 qdf_mem_free(pBaseMacAddr);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308356 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008357 }
8358
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308359 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008360}
8361
8362/* ----------------------------------------------------------------------------
8363 \fn sme_set_tx_power
8364 \brief Set Transmit Power dynamically.
8365 \param hHal
8366 \param sessionId Target Session ID
8367 \pBSSId BSSID
8368 \dev_mode dev_mode such as station, P2PGO, SAP
8369 \param dBm power to set
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308370 \- return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008371 ---------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308372QDF_STATUS sme_set_tx_power(tHalHandle hHal, uint8_t sessionId,
Anurag Chouhan6d760662016-02-20 16:05:43 +05308373 struct qdf_mac_addr pBSSId,
8374 enum tQDF_ADAPTER_MODE dev_mode, int dBm)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008375{
8376 cds_msg_t msg;
8377 tpMaxTxPowerParams pTxParams = NULL;
8378 int8_t power = (int8_t) dBm;
8379
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308380 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008381 TRACE_CODE_SME_RX_HDD_SET_TXPOW, sessionId, 0));
8382
8383 /* make sure there is no overflow */
8384 if ((int)power != dBm) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308385 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008386 "%s: error, invalid power = %d", __func__, dBm);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308387 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008388 }
8389
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308390 pTxParams = qdf_mem_malloc(sizeof(tMaxTxPowerParams));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008391 if (NULL == pTxParams) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308392 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008393 "%s: Not able to allocate memory for pTxParams",
8394 __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308395 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008396 }
8397
Anurag Chouhanc5548422016-02-24 18:33:27 +05308398 qdf_copy_macaddr(&pTxParams->bssId, &pBSSId);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008399 pTxParams->power = power; /* unit is dBm */
8400 pTxParams->dev_mode = dev_mode;
8401 msg.type = WMA_SET_TX_POWER_REQ;
8402 msg.reserved = 0;
8403 msg.bodyptr = pTxParams;
8404
Anurag Chouhan6d760662016-02-20 16:05:43 +05308405 if (QDF_STATUS_SUCCESS != cds_mq_post_message(QDF_MODULE_ID_WMA, &msg)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308406 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008407 "%s: failed to post WMA_SET_TX_POWER_REQ to WMA",
8408 __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308409 qdf_mem_free(pTxParams);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308410 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008411 }
8412
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308413 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008414}
8415
Selvaraj, Sridhar7231c5f2016-09-28 12:42:33 +05308416QDF_STATUS sme_update_session_param(tHalHandle hal, uint8_t session_id,
8417 uint32_t param_type, uint32_t param_val)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008418{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308419 QDF_STATUS status = QDF_STATUS_SUCCESS;
Selvaraj, Sridhar7231c5f2016-09-28 12:42:33 +05308420 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008421 uint16_t len;
8422
Selvaraj, Sridhar7231c5f2016-09-28 12:42:33 +05308423 status = sme_acquire_global_lock(&mac_ctx->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308424 if (QDF_IS_STATUS_SUCCESS(status)) {
Selvaraj, Sridhar7231c5f2016-09-28 12:42:33 +05308425 struct sir_update_session_param *msg;
8426 tCsrRoamSession *session = CSR_GET_SESSION(mac_ctx, session_id);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008427
Selvaraj, Sridhar7231c5f2016-09-28 12:42:33 +05308428 if (!session) {
8429 sms_log(mac_ctx, LOGE, FL("session %d not found"),
8430 session_id);
8431 sme_release_global_lock(&mac_ctx->sme);
8432 return status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008433 }
8434
Selvaraj, Sridhar7231c5f2016-09-28 12:42:33 +05308435 if (!session->sessionActive)
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308436 QDF_ASSERT(0);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008437
Selvaraj, Sridhar7231c5f2016-09-28 12:42:33 +05308438 len = sizeof(*msg);
8439 msg = qdf_mem_malloc(len);
8440 if (!msg)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308441 status = QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008442 else {
Selvaraj, Sridhar7231c5f2016-09-28 12:42:33 +05308443 msg->message_type = eWNI_SME_SESSION_UPDATE_PARAM;
8444 msg->length = len;
8445 msg->session_id = session_id;
8446 msg->param_type = param_type;
8447 msg->param_val = param_val;
8448 status = cds_send_mb_message_to_mac(msg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008449 }
Selvaraj, Sridhar7231c5f2016-09-28 12:42:33 +05308450 sme_release_global_lock(&mac_ctx->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008451 }
8452 return status;
8453}
8454
8455/* ---------------------------------------------------------------------------
8456
8457 \fn sme_set_tm_level
8458 \brief Set Thermal Mitigation Level to RIVA
8459 \param hHal - The handle returned by mac_open.
8460 \param newTMLevel - new Thermal Mitigation Level
8461 \param tmMode - Thermal Mitigation handle mode, default 0
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308462 \return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008463 ---------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308464QDF_STATUS sme_set_tm_level(tHalHandle hHal, uint16_t newTMLevel, uint16_t tmMode)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008465{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308466 QDF_STATUS status = QDF_STATUS_SUCCESS;
8467 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008468 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
8469 cds_msg_t cds_message;
8470 tAniSetTmLevelReq *setTmLevelReq = NULL;
8471
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308472 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008473 TRACE_CODE_SME_RX_HDD_SET_TMLEVEL, NO_SESSION, 0));
8474 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308475 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008476 setTmLevelReq =
8477 (tAniSetTmLevelReq *)
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308478 qdf_mem_malloc(sizeof(tAniSetTmLevelReq));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008479 if (NULL == setTmLevelReq) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308480 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008481 "%s: Not able to allocate memory for sme_set_tm_level",
8482 __func__);
8483 sme_release_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308484 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008485 }
8486
8487 setTmLevelReq->tmMode = tmMode;
8488 setTmLevelReq->newTmLevel = newTMLevel;
8489
8490 /* serialize the req through MC thread */
8491 cds_message.bodyptr = setTmLevelReq;
8492 cds_message.type = WMA_SET_TM_LEVEL_REQ;
Sreelakshmi Konamki6a065362016-05-31 16:05:01 +05308493 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
8494 NO_SESSION, cds_message.type));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308495 qdf_status = cds_mq_post_message(CDS_MQ_ID_WMA, &cds_message);
8496 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308497 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008498 "%s: Post Set TM Level MSG fail", __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308499 qdf_mem_free(setTmLevelReq);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308500 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008501 }
8502 sme_release_global_lock(&pMac->sme);
8503 }
8504 return status;
8505}
8506
8507/*---------------------------------------------------------------------------
8508
8509 \brief sme_feature_caps_exchange() - SME interface to exchange capabilities between
8510 Host and FW.
8511
8512 \param hHal - HAL handle for device
8513
8514 \return NONE
8515
8516 ---------------------------------------------------------------------------*/
8517void sme_feature_caps_exchange(tHalHandle hHal)
8518{
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308519 MTRACE(qdf_trace
Anurag Chouhan6d760662016-02-20 16:05:43 +05308520 (QDF_MODULE_ID_SME, TRACE_CODE_SME_RX_HDD_CAPS_EXCH, NO_SESSION,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008521 0));
8522}
8523
8524/*---------------------------------------------------------------------------
8525
8526 \brief sme_disable_feature_capablity() - SME interface to disable Active mode offload capablity
8527 in Host.
8528
8529 \param hHal - HAL handle for device
8530
8531 \return NONE
8532
8533 ---------------------------------------------------------------------------*/
8534void sme_disable_feature_capablity(uint8_t feature_index)
8535{
8536}
8537
8538/* ---------------------------------------------------------------------------
8539 \fn sme_reset_power_values_for5_g
8540 \brief Reset the power values for 5G band with default power values.
8541 \param hHal - HAL handle for device
8542 \- return NONE
8543 -------------------------------------------------------------------------*/
8544void sme_reset_power_values_for5_g(tHalHandle hHal)
8545{
8546 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308547 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008548 TRACE_CODE_SME_RX_HDD_RESET_PW5G, NO_SESSION, 0));
8549 csr_save_channel_power_for_band(pMac, true);
8550 csr_apply_power2_current(pMac); /* Store the channel+power info in the global place: Cfg */
8551}
8552
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008553/* ---------------------------------------------------------------------------
8554 \fn sme_update_roam_prefer5_g_hz
8555 \brief enable/disable Roam prefer 5G runtime option
8556 This function is called through dynamic setConfig callback function
8557 to configure the Roam prefer 5G runtime option
8558 \param hHal - HAL handle for device
8559 \param nRoamPrefer5GHz Enable/Disable Roam prefer 5G runtime option
8560 \- return Success or failure
8561 -------------------------------------------------------------------------*/
8562
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308563QDF_STATUS sme_update_roam_prefer5_g_hz(tHalHandle hHal, bool nRoamPrefer5GHz)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008564{
8565 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308566 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008567
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308568 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008569 TRACE_CODE_SME_RX_HDD_UPDATE_RP5G, NO_SESSION, 0));
8570 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308571 if (QDF_IS_STATUS_SUCCESS(status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308572 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008573 "%s: gRoamPrefer5GHz is changed from %d to %d",
8574 __func__, pMac->roam.configParam.nRoamPrefer5GHz,
8575 nRoamPrefer5GHz);
8576 pMac->roam.configParam.nRoamPrefer5GHz = nRoamPrefer5GHz;
8577 sme_release_global_lock(&pMac->sme);
8578 }
8579
8580 return status;
8581}
8582
8583/* ---------------------------------------------------------------------------
8584 \fn sme_set_roam_intra_band
8585 \brief enable/disable Intra band roaming
8586 This function is called through dynamic setConfig callback function
8587 to configure the intra band roaming
8588 \param hHal - HAL handle for device
8589 \param nRoamIntraBand Enable/Disable Intra band roaming
8590 \- return Success or failure
8591 -------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308592QDF_STATUS sme_set_roam_intra_band(tHalHandle hHal, const bool nRoamIntraBand)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008593{
8594 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308595 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008596
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308597 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008598 TRACE_CODE_SME_RX_HDD_SET_ROAMIBAND, NO_SESSION, 0));
8599 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308600 if (QDF_IS_STATUS_SUCCESS(status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308601 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008602 "%s: gRoamIntraBand is changed from %d to %d",
8603 __func__, pMac->roam.configParam.nRoamIntraBand,
8604 nRoamIntraBand);
8605 pMac->roam.configParam.nRoamIntraBand = nRoamIntraBand;
8606 sme_release_global_lock(&pMac->sme);
8607 }
8608
8609 return status;
8610}
8611
8612/* ---------------------------------------------------------------------------
8613 \fn sme_update_roam_scan_n_probes
8614 \brief function to update roam scan N probes
8615 This function is called through dynamic setConfig callback function
8616 to update roam scan N probes
8617 \param hHal - HAL handle for device
8618 \param sessionId - Session Identifier
8619 \param nProbes number of probe requests to be sent out
8620 \- return Success or failure
8621 -------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308622QDF_STATUS sme_update_roam_scan_n_probes(tHalHandle hHal, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008623 const uint8_t nProbes)
8624{
8625 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308626 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008627
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308628 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008629 TRACE_CODE_SME_RX_HDD_UPDATE_ROAM_SCAN_N_PROBES,
8630 NO_SESSION, 0));
8631 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308632 if (QDF_IS_STATUS_SUCCESS(status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308633 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008634 "%s: gRoamScanNProbes is changed from %d to %d",
8635 __func__, pMac->roam.configParam.nProbes, nProbes);
8636 pMac->roam.configParam.nProbes = nProbes;
8637 sme_release_global_lock(&pMac->sme);
8638 }
8639 if (pMac->roam.configParam.isRoamOffloadScanEnabled) {
8640 csr_roam_offload_scan(pMac, sessionId,
8641 ROAM_SCAN_OFFLOAD_UPDATE_CFG,
8642 REASON_NPROBES_CHANGED);
8643 }
8644 return status;
8645}
8646
8647/* ---------------------------------------------------------------------------
8648 \fn sme_update_roam_scan_home_away_time
8649 \brief function to update roam scan Home away time
8650 This function is called through dynamic setConfig callback function
8651 to update roam scan home away time
8652 \param hHal - HAL handle for device
8653 \param sessionId - Session Identifier
8654 \param nRoamScanAwayTime Scan home away time
8655 \param bSendOffloadCmd If true then send offload command to firmware
8656 If false then command is not sent to firmware
8657 \- return Success or failure
8658 -------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308659QDF_STATUS sme_update_roam_scan_home_away_time(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008660 uint8_t sessionId,
8661 const uint16_t nRoamScanHomeAwayTime,
8662 const bool bSendOffloadCmd)
8663{
8664 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308665 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008666
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308667 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008668 TRACE_CODE_SME_RX_HDD_UPDATE_ROAM_SCAN_HOME_AWAY_TIME,
8669 NO_SESSION, 0));
8670 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308671 if (QDF_IS_STATUS_SUCCESS(status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308672 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008673 "%s: gRoamScanHomeAwayTime is changed from %d to %d",
8674 __func__,
8675 pMac->roam.configParam.nRoamScanHomeAwayTime,
8676 nRoamScanHomeAwayTime);
8677 pMac->roam.configParam.nRoamScanHomeAwayTime =
8678 nRoamScanHomeAwayTime;
8679 sme_release_global_lock(&pMac->sme);
8680 }
8681 if (pMac->roam.configParam.isRoamOffloadScanEnabled && bSendOffloadCmd) {
8682 csr_roam_offload_scan(pMac, sessionId,
8683 ROAM_SCAN_OFFLOAD_UPDATE_CFG,
8684 REASON_HOME_AWAY_TIME_CHANGED);
8685 }
8686 return status;
8687}
8688
Abhishek Singh518323d2015-10-19 17:42:01 +05308689/**
8690 * sme_ext_change_channel()- function to post send ECSA
8691 * action frame to csr.
8692 * @hHal: Hal context
8693 * @channel: new channel to switch
8694 * @session_id: senssion it should be sent on.
8695 *
8696 * This function is called to post ECSA frame to csr.
8697 *
8698 * Return: success if msg is sent else return failure
8699 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308700QDF_STATUS sme_ext_change_channel(tHalHandle h_hal, uint32_t channel,
Abhishek Singh518323d2015-10-19 17:42:01 +05308701 uint8_t session_id)
8702{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308703 QDF_STATUS status = QDF_STATUS_SUCCESS;
Abhishek Singh518323d2015-10-19 17:42:01 +05308704 tpAniSirGlobal mac_ctx = PMAC_STRUCT(h_hal);
8705 uint8_t channel_state;
8706
8707 sms_log(mac_ctx, LOGE, FL(" Set Channel %d "), channel);
8708 channel_state =
8709 cds_get_channel_state(channel);
8710
8711 if (CHANNEL_STATE_DISABLE == channel_state) {
8712 sms_log(mac_ctx, LOGE, FL(" Invalid channel %d "), channel);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308713 return QDF_STATUS_E_INVAL;
Abhishek Singh518323d2015-10-19 17:42:01 +05308714 }
8715
8716 status = sme_acquire_global_lock(&mac_ctx->sme);
8717
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308718 if (QDF_STATUS_SUCCESS == status) {
Abhishek Singh518323d2015-10-19 17:42:01 +05308719 /* update the channel list to the firmware */
8720 status = csr_send_ext_change_channel(mac_ctx,
8721 channel, session_id);
8722 sme_release_global_lock(&mac_ctx->sme);
8723 }
8724
8725 return status;
8726}
8727
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008728/* ---------------------------------------------------------------------------
8729 \fn sme_get_roam_intra_band
8730 \brief get Intra band roaming
8731 \param hHal - HAL handle for device
8732 \- return Success or failure
8733 -------------------------------------------------------------------------*/
8734bool sme_get_roam_intra_band(tHalHandle hHal)
8735{
8736 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308737 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008738 TRACE_CODE_SME_RX_HDD_GET_ROAMIBAND, NO_SESSION, 0));
8739 return pMac->roam.configParam.nRoamIntraBand;
8740}
8741
8742/* ---------------------------------------------------------------------------
8743 \fn sme_get_roam_scan_n_probes
8744 \brief get N Probes
8745 \param hHal - HAL handle for device
8746 \- return Success or failure
8747 -------------------------------------------------------------------------*/
8748uint8_t sme_get_roam_scan_n_probes(tHalHandle hHal)
8749{
8750 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
8751 return pMac->roam.configParam.nProbes;
8752}
8753
8754/* ---------------------------------------------------------------------------
8755 \fn sme_get_roam_scan_home_away_time
8756 \brief get Roam scan home away time
8757 \param hHal - HAL handle for device
8758 \- return Success or failure
8759 -------------------------------------------------------------------------*/
8760uint16_t sme_get_roam_scan_home_away_time(tHalHandle hHal)
8761{
8762 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
8763 return pMac->roam.configParam.nRoamScanHomeAwayTime;
8764}
8765
8766/* ---------------------------------------------------------------------------
8767 \fn sme_update_roam_rssi_diff
8768 \brief Update RoamRssiDiff
8769 This function is called through dynamic setConfig callback function
8770 to configure RoamRssiDiff
8771 Usage: adb shell iwpriv wlan0 setConfig RoamRssiDiff=[0 .. 125]
8772 \param hHal - HAL handle for device
8773 \param sessionId - Session Identifier
8774 \param RoamRssiDiff - minimum rssi difference between potential
8775 candidate and current AP.
8776 \- return Success or failure
8777 -------------------------------------------------------------------------*/
8778
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308779QDF_STATUS sme_update_roam_rssi_diff(tHalHandle hHal, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008780 uint8_t RoamRssiDiff)
8781{
8782 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308783 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008784
Naveen Rawatc36f7eb2016-11-10 20:01:03 -08008785 if (sessionId >= CSR_ROAM_SESSION_MAX) {
8786 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
8787 FL("Invalid sme session id: %d"), sessionId);
8788 return QDF_STATUS_E_INVAL;
8789 }
8790
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008791 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308792 if (QDF_IS_STATUS_SUCCESS(status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308793 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008794 "LFR runtime successfully set roam rssi diff to %d - old value is %d - roam state is %s",
8795 RoamRssiDiff,
8796 pMac->roam.configParam.RoamRssiDiff,
8797 mac_trace_get_neighbour_roam_state(pMac->roam.
8798 neighborRoamInfo
8799 [sessionId].
8800 neighborRoamState));
8801 pMac->roam.configParam.RoamRssiDiff = RoamRssiDiff;
8802 sme_release_global_lock(&pMac->sme);
8803 }
Naveen Rawatc36f7eb2016-11-10 20:01:03 -08008804
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008805 if (pMac->roam.configParam.isRoamOffloadScanEnabled) {
8806 csr_roam_offload_scan(pMac, sessionId,
8807 ROAM_SCAN_OFFLOAD_UPDATE_CFG,
8808 REASON_RSSI_DIFF_CHANGED);
8809 }
8810 return status;
8811}
8812
8813/*--------------------------------------------------------------------------
8814 \brief sme_update_fast_transition_enabled() - enable/disable Fast Transition
8815 support at runtime
8816 It is used at in the REG_DYNAMIC_VARIABLE macro definition of
8817 isFastTransitionEnabled.
8818 This is a synchronous call
8819 \param hHal - The handle returned by mac_open.
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308820 \return QDF_STATUS_SUCCESS - SME update isFastTransitionEnabled config
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008821 successfully.
8822 Other status means SME is failed to update isFastTransitionEnabled.
8823 \sa
8824 --------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308825QDF_STATUS sme_update_fast_transition_enabled(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008826 bool isFastTransitionEnabled)
8827{
8828 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308829 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008830
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308831 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008832 TRACE_CODE_SME_RX_HDD_UPDATE_FTENABLED, NO_SESSION,
8833 0));
8834 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308835 if (QDF_IS_STATUS_SUCCESS(status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308836 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008837 "%s: FastTransitionEnabled is changed from %d to %d",
8838 __func__,
8839 pMac->roam.configParam.isFastTransitionEnabled,
8840 isFastTransitionEnabled);
8841 pMac->roam.configParam.isFastTransitionEnabled =
8842 isFastTransitionEnabled;
8843 sme_release_global_lock(&pMac->sme);
8844 }
8845
8846 return status;
8847}
8848
8849/* ---------------------------------------------------------------------------
8850 \fn sme_update_wes_mode
8851 \brief Update WES Mode
8852 This function is called through dynamic setConfig callback function
8853 to configure isWESModeEnabled
8854 \param hHal - HAL handle for device
8855 \param isWESModeEnabled - WES mode
8856 \param sessionId - Session Identifier
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308857 \return QDF_STATUS_SUCCESS - SME update isWESModeEnabled config successfully.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008858 Other status means SME is failed to update isWESModeEnabled.
8859 -------------------------------------------------------------------------*/
8860
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308861QDF_STATUS sme_update_wes_mode(tHalHandle hHal, bool isWESModeEnabled,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008862 uint8_t sessionId)
8863{
8864 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308865 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008866
Naveen Rawatc36f7eb2016-11-10 20:01:03 -08008867 if (sessionId >= CSR_ROAM_SESSION_MAX) {
8868 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
8869 FL("Invalid sme session id: %d"), sessionId);
8870 return QDF_STATUS_E_INVAL;
8871 }
8872
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008873 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));
Naveen Rawatc36f7eb2016-11-10 20:01:03 -08008909
8910 if (sessionId >= CSR_ROAM_SESSION_MAX) {
8911 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
8912 FL("Invalid sme session id: %d"), sessionId);
8913 return QDF_STATUS_E_INVAL;
8914 }
8915
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008916 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308917 if (QDF_IS_STATUS_SUCCESS(status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308918 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008919 "LFR runtime successfully set roam scan control to %d - old value is %d - roam state is %s",
8920 roamScanControl,
8921 pMac->roam.configParam.nRoamScanControl,
8922 mac_trace_get_neighbour_roam_state(pMac->roam.
8923 neighborRoamInfo
8924 [sessionId].
8925 neighborRoamState));
8926 pMac->roam.configParam.nRoamScanControl = roamScanControl;
8927 if (0 == roamScanControl) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308928 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008929 "LFR runtime successfully cleared roam scan cache");
8930 csr_flush_cfg_bg_scan_roam_channel_list(pMac, sessionId);
8931 if (pMac->roam.configParam.isRoamOffloadScanEnabled) {
8932 csr_roam_offload_scan(pMac, sessionId,
8933 ROAM_SCAN_OFFLOAD_UPDATE_CFG,
8934 REASON_FLUSH_CHANNEL_LIST);
8935 }
8936 }
8937 sme_release_global_lock(&pMac->sme);
8938 }
8939 return status;
8940}
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008941
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008942/*--------------------------------------------------------------------------
8943 \brief sme_update_is_fast_roam_ini_feature_enabled() - enable/disable LFR
8944 support at runtime
8945 It is used at in the REG_DYNAMIC_VARIABLE macro definition of
8946 isFastRoamIniFeatureEnabled.
8947 This is a synchronous call
8948 \param hHal - The handle returned by mac_open.
8949 \param sessionId - Session Identifier
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308950 \return QDF_STATUS_SUCCESS - SME update isFastRoamIniFeatureEnabled config
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008951 successfully.
8952 Other status means SME is failed to update isFastRoamIniFeatureEnabled.
8953 \sa
8954 --------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308955QDF_STATUS sme_update_is_fast_roam_ini_feature_enabled
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008956 (tHalHandle hHal,
8957 uint8_t sessionId, const bool isFastRoamIniFeatureEnabled) {
8958 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
8959
8960 if (pMac->roam.configParam.isFastRoamIniFeatureEnabled ==
8961 isFastRoamIniFeatureEnabled) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308962 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008963 "%s: FastRoam is already enabled or disabled, nothing to do (returning) old(%d) new(%d)",
8964 __func__,
8965 pMac->roam.configParam.isFastRoamIniFeatureEnabled,
8966 isFastRoamIniFeatureEnabled);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308967 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008968 }
8969
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308970 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008971 "%s: FastRoamEnabled is changed from %d to %d", __func__,
8972 pMac->roam.configParam.isFastRoamIniFeatureEnabled,
8973 isFastRoamIniFeatureEnabled);
8974 pMac->roam.configParam.isFastRoamIniFeatureEnabled =
8975 isFastRoamIniFeatureEnabled;
8976 csr_neighbor_roam_update_fast_roaming_enabled(pMac, sessionId,
8977 isFastRoamIniFeatureEnabled);
8978
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308979 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008980}
8981
Mukul Sharma69c44cd2016-09-12 18:33:57 +05308982/**
8983 * sme_config_fast_roaming() - enable/disable LFR support at runtime
8984 * @hal - The handle returned by macOpen.
8985 * @session_id - Session Identifier
8986 * @is_fast_roam_enabled - flag to enable/disable roaming
8987 *
8988 * When Supplicant issues enabled/disable fast roaming on the basis
8989 * of the Bssid modification in network block (e.g. AutoJoin mode N/W block)
8990 *
8991 * Return: QDF_STATUS
8992 */
8993
8994QDF_STATUS sme_config_fast_roaming(tHalHandle hal, uint8_t session_id,
8995 const bool is_fast_roam_enabled)
8996{
8997 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
Sreelakshmi Konamkibda5bbf2016-09-12 18:38:10 +05308998 tCsrRoamSession *session = CSR_GET_SESSION(mac_ctx, session_id);
Mukul Sharma69c44cd2016-09-12 18:33:57 +05308999 QDF_STATUS status;
9000
9001 if (!mac_ctx->roam.configParam.isFastRoamIniFeatureEnabled) {
9002 sms_log(mac_ctx, LOGE, FL("Fast roam is disabled through ini"));
9003 if (!is_fast_roam_enabled)
9004 return QDF_STATUS_SUCCESS;
9005 return QDF_STATUS_E_FAILURE;
9006 }
Sreelakshmi Konamkibda5bbf2016-09-12 18:38:10 +05309007
9008 if (is_fast_roam_enabled && session && session->pCurRoamProfile)
9009 session->pCurRoamProfile->do_not_roam = false;
9010
Mukul Sharma69c44cd2016-09-12 18:33:57 +05309011 status = csr_neighbor_roam_update_fast_roaming_enabled(mac_ctx,
9012 session_id, is_fast_roam_enabled);
9013 if (!QDF_IS_STATUS_SUCCESS(status)) {
9014 sms_log(mac_ctx, LOGE,
9015 FL("csr_neighbor_roam_update_fast_roaming_enabled failed"));
9016 return QDF_STATUS_E_FAILURE;
9017 }
9018
9019 return QDF_STATUS_SUCCESS;
9020}
9021
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009022/*--------------------------------------------------------------------------
9023 \brief sme_update_is_mawc_ini_feature_enabled() -
9024 Enable/disable LFR MAWC support at runtime
9025 It is used at in the REG_DYNAMIC_VARIABLE macro definition of
9026 isMAWCIniFeatureEnabled.
9027 This is a synchronous call
9028 \param hHal - The handle returned by mac_open.
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309029 \return QDF_STATUS_SUCCESS - SME update MAWCEnabled config successfully.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009030 Other status means SME is failed to update MAWCEnabled.
9031 \sa
9032 --------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309033QDF_STATUS sme_update_is_mawc_ini_feature_enabled(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009034 const bool MAWCEnabled)
9035{
9036 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309037 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009038
9039 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309040 if (QDF_IS_STATUS_SUCCESS(status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05309041 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009042 "%s: MAWCEnabled is changed from %d to %d", __func__,
9043 pMac->roam.configParam.MAWCEnabled, MAWCEnabled);
9044 pMac->roam.configParam.MAWCEnabled = MAWCEnabled;
9045 sme_release_global_lock(&pMac->sme);
9046 }
9047
9048 return status;
9049
9050}
9051
9052/*--------------------------------------------------------------------------
9053 \brief sme_stop_roaming() - Stop roaming for a given sessionId
9054 This is a synchronous call
9055 \param hHal - The handle returned by mac_open
9056 \param sessionId - Session Identifier
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309057 \return QDF_STATUS_SUCCESS on success
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009058 Other status on failure
9059 \sa
9060 --------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309061QDF_STATUS sme_stop_roaming(tHalHandle hHal, uint8_t sessionId, uint8_t reason)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009062{
9063 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309064 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009065
9066 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309067 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009068 csr_roam_offload_scan(pMac, sessionId, ROAM_SCAN_OFFLOAD_STOP,
9069 reason);
9070 sme_release_global_lock(&pMac->sme);
9071 }
9072
9073 return status;
9074}
9075
9076/*--------------------------------------------------------------------------
9077 \brief sme_start_roaming() - Start roaming for a given sessionId
9078 This is a synchronous call
9079 \param hHal - The handle returned by mac_open
9080 \param sessionId - Session Identifier
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309081 \return QDF_STATUS_SUCCESS on success
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009082 Other status on failure
9083 \sa
9084 --------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309085QDF_STATUS sme_start_roaming(tHalHandle hHal, uint8_t sessionId, uint8_t reason)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009086{
9087 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309088 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009089
9090 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309091 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009092 csr_roam_offload_scan(pMac, sessionId, ROAM_SCAN_OFFLOAD_START,
9093 reason);
9094 sme_release_global_lock(&pMac->sme);
9095 }
9096
9097 return status;
9098}
9099
9100/*--------------------------------------------------------------------------
9101 \brief sme_update_enable_fast_roam_in_concurrency() - enable/disable LFR if
9102 Concurrent session exists
9103 This is a synchronuous call
9104 \param hHal - The handle returned by mac_open.
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309105 \return QDF_STATUS_SUCCESS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009106 Other status means SME is failed
9107 \sa
9108 --------------------------------------------------------------------------*/
9109
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309110QDF_STATUS sme_update_enable_fast_roam_in_concurrency(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009111 bool
9112 bFastRoamInConIniFeatureEnabled)
9113{
9114
9115 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309116 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009117
9118 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309119 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009120 pMac->roam.configParam.bFastRoamInConIniFeatureEnabled =
9121 bFastRoamInConIniFeatureEnabled;
9122 if (0 == pMac->roam.configParam.isRoamOffloadScanEnabled) {
9123 pMac->roam.configParam.bFastRoamInConIniFeatureEnabled =
9124 0;
9125 }
9126 sme_release_global_lock(&pMac->sme);
9127 }
9128
9129 return status;
9130}
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009131
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009132/*--------------------------------------------------------------------------
9133 \brief sme_update_config_fw_rssi_monitoring() - enable/disable firmware RSSI
9134 Monitoring at runtime
9135 It is used at in the REG_DYNAMIC_VARIABLE macro definition of
9136 fEnableFwRssiMonitoring.
9137 This is a synchronous call
9138 \param hHal - The handle returned by mac_open.
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309139 \return QDF_STATUS_SUCCESS - SME update fEnableFwRssiMonitoring.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009140 config successfully.
9141 Other status means SME is failed to update fEnableFwRssiMonitoring.
9142 \sa
9143 --------------------------------------------------------------------------*/
9144
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309145QDF_STATUS sme_update_config_fw_rssi_monitoring(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009146 bool fEnableFwRssiMonitoring)
9147{
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05309148 QDF_STATUS qdf_ret_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009149
9150 if (sme_cfg_set_int (hHal, WNI_CFG_PS_ENABLE_RSSI_MONITOR,
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309151 fEnableFwRssiMonitoring) == QDF_STATUS_E_FAILURE) {
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05309152 qdf_ret_status = QDF_STATUS_E_FAILURE;
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05309153 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009154 "Could not pass on WNI_CFG_PS_RSSI_MONITOR to CFG");
9155 }
9156
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05309157 return qdf_ret_status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009158}
9159
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009160/* ---------------------------------------------------------------------------
9161 \fn sme_set_roam_opportunistic_scan_threshold_diff
9162 \brief Update Opportunistic Scan threshold diff
9163 This function is called through dynamic setConfig callback function
9164 to configure nOpportunisticThresholdDiff
9165 \param hHal - HAL handle for device
9166 \param sessionId - Session Identifier
9167 \param nOpportunisticThresholdDiff - Opportunistic Scan threshold diff
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309168 \return QDF_STATUS_SUCCESS - SME update nOpportunisticThresholdDiff config
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009169 successfully.
9170 else SME is failed to update nOpportunisticThresholdDiff.
9171 -------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309172QDF_STATUS sme_set_roam_opportunistic_scan_threshold_diff(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009173 uint8_t sessionId,
9174 const uint8_t
9175 nOpportunisticThresholdDiff)
9176{
9177 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309178 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009179
9180 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309181 if (QDF_IS_STATUS_SUCCESS(status)) {
Varun Reddy Yeturuff4feb02016-04-20 12:26:11 -07009182 status = csr_neighbor_roam_update_config(pMac, sessionId,
9183 nOpportunisticThresholdDiff,
9184 REASON_OPPORTUNISTIC_THRESH_DIFF_CHANGED);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309185 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009186 pMac->roam.configParam.neighborRoamConfig.
9187 nOpportunisticThresholdDiff =
9188 nOpportunisticThresholdDiff;
9189 }
9190 sme_release_global_lock(&pMac->sme);
9191 }
9192 return status;
9193}
9194
9195/*--------------------------------------------------------------------------
9196 \fn sme_get_roam_opportunistic_scan_threshold_diff()
9197 \brief gets Opportunistic Scan threshold diff
9198 This is a synchronous call
9199 \param hHal - The handle returned by mac_open
9200 \return uint8_t - nOpportunisticThresholdDiff
9201 \sa
9202 --------------------------------------------------------------------------*/
9203uint8_t sme_get_roam_opportunistic_scan_threshold_diff(tHalHandle hHal)
9204{
9205 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
9206 return pMac->roam.configParam.neighborRoamConfig.
9207 nOpportunisticThresholdDiff;
9208}
9209
9210/* ---------------------------------------------------------------------------
9211 \fn sme_set_roam_rescan_rssi_diff
9212 \brief Update roam rescan rssi diff
9213 This function is called through dynamic setConfig callback function
9214 to configure nRoamRescanRssiDiff
9215 \param hHal - HAL handle for device
9216 \param sessionId - Session Identifier
9217 \param nRoamRescanRssiDiff - roam rescan rssi diff
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309218 \return QDF_STATUS_SUCCESS - SME update nRoamRescanRssiDiff config
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009219 successfully.
9220 else SME is failed to update nRoamRescanRssiDiff.
9221 -------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309222QDF_STATUS sme_set_roam_rescan_rssi_diff(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009223 uint8_t sessionId,
9224 const uint8_t nRoamRescanRssiDiff)
9225{
9226 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309227 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009228
9229 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309230 if (QDF_IS_STATUS_SUCCESS(status)) {
Varun Reddy Yeturuff4feb02016-04-20 12:26:11 -07009231 status = csr_neighbor_roam_update_config(pMac, sessionId,
9232 nRoamRescanRssiDiff,
9233 REASON_ROAM_RESCAN_RSSI_DIFF_CHANGED);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309234 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009235 pMac->roam.configParam.neighborRoamConfig.
9236 nRoamRescanRssiDiff = nRoamRescanRssiDiff;
9237 }
9238 sme_release_global_lock(&pMac->sme);
9239 }
9240 return status;
9241}
9242
9243/*--------------------------------------------------------------------------
9244 \fn sme_get_roam_rescan_rssi_diff
9245 \brief gets roam rescan rssi diff
9246 This is a synchronous call
9247 \param hHal - The handle returned by mac_open
9248 \return int8_t - nRoamRescanRssiDiff
9249 \sa
9250 --------------------------------------------------------------------------*/
9251uint8_t sme_get_roam_rescan_rssi_diff(tHalHandle hHal)
9252{
9253 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
9254 return pMac->roam.configParam.neighborRoamConfig.nRoamRescanRssiDiff;
9255}
9256
9257/* ---------------------------------------------------------------------------
9258 \fn sme_set_roam_bmiss_first_bcnt
9259 \brief Update Roam count for first beacon miss
9260 This function is called through dynamic setConfig callback function
9261 to configure nRoamBmissFirstBcnt
9262 \param hHal - HAL handle for device
9263 \param sessionId - Session Identifier
9264 \param nRoamBmissFirstBcnt - Roam first bmiss count
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309265 \return QDF_STATUS_SUCCESS - SME update nRoamBmissFirstBcnt
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009266 successfully.
9267 else SME is failed to update nRoamBmissFirstBcnt
9268 -------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309269QDF_STATUS sme_set_roam_bmiss_first_bcnt(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009270 uint8_t sessionId,
9271 const uint8_t nRoamBmissFirstBcnt)
9272{
9273 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309274 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009275
9276 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309277 if (QDF_IS_STATUS_SUCCESS(status)) {
Varun Reddy Yeturuff4feb02016-04-20 12:26:11 -07009278 status = csr_neighbor_roam_update_config(pMac, sessionId,
9279 nRoamBmissFirstBcnt,
9280 REASON_ROAM_BMISS_FIRST_BCNT_CHANGED);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309281 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009282 pMac->roam.configParam.neighborRoamConfig.
9283 nRoamBmissFirstBcnt = nRoamBmissFirstBcnt;
9284 }
9285 sme_release_global_lock(&pMac->sme);
9286 }
9287 return status;
9288}
9289
9290/* ---------------------------------------------------------------------------
9291 \fn sme_get_roam_bmiss_first_bcnt
9292 \brief get neighbor roam beacon miss first count
9293 \param hHal - The handle returned by mac_open.
9294 \return uint8_t - neighbor roam beacon miss first count
9295 -------------------------------------------------------------------------*/
9296uint8_t sme_get_roam_bmiss_first_bcnt(tHalHandle hHal)
9297{
9298 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
9299 return pMac->roam.configParam.neighborRoamConfig.nRoamBmissFirstBcnt;
9300}
9301
9302/* ---------------------------------------------------------------------------
9303 \fn sme_set_roam_bmiss_final_bcnt
9304 \brief Update Roam count for final beacon miss
9305 This function is called through dynamic setConfig callback function
9306 to configure nRoamBmissFinalBcnt
9307 \param hHal - HAL handle for device
9308 \param sessionId - Session Identifier
9309 \param nRoamBmissFinalBcnt - Roam final bmiss count
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309310 \return QDF_STATUS_SUCCESS - SME update nRoamBmissFinalBcnt
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009311 successfully.
9312 else SME is failed to update nRoamBmissFinalBcnt
9313 -------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309314QDF_STATUS sme_set_roam_bmiss_final_bcnt(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009315 uint8_t sessionId,
9316 const uint8_t nRoamBmissFinalBcnt)
9317{
9318 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309319 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009320
9321 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309322 if (QDF_IS_STATUS_SUCCESS(status)) {
Varun Reddy Yeturuff4feb02016-04-20 12:26:11 -07009323 status = csr_neighbor_roam_update_config(pMac, sessionId,
9324 nRoamBmissFinalBcnt,
9325 REASON_ROAM_BMISS_FINAL_BCNT_CHANGED);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309326 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009327 pMac->roam.configParam.neighborRoamConfig.
9328 nRoamBmissFinalBcnt = nRoamBmissFinalBcnt;
9329 }
9330 sme_release_global_lock(&pMac->sme);
9331 }
9332 return status;
9333}
9334
9335/*--------------------------------------------------------------------------
9336 \fn sme_get_roam_bmiss_final_bcnt
9337 \brief gets Roam count for final beacon miss
9338 This is a synchronous call
9339 \param hHal - The handle returned by mac_open
9340 \return uint8_t - nRoamBmissFinalBcnt
9341 \sa
9342 --------------------------------------------------------------------------*/
9343uint8_t sme_get_roam_bmiss_final_bcnt(tHalHandle hHal)
9344{
9345 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
9346 return pMac->roam.configParam.neighborRoamConfig.nRoamBmissFinalBcnt;
9347}
9348
9349/* ---------------------------------------------------------------------------
9350 \fn sme_set_roam_beacon_rssi_weight
9351 \brief Update Roam beacon rssi weight
9352 This function is called through dynamic setConfig callback function
9353 to configure nRoamBeaconRssiWeight
9354 \param hHal - HAL handle for device
9355 \param sessionId - Session Identifier
9356 \param nRoamBeaconRssiWeight - Roam beacon rssi weight
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309357 \return QDF_STATUS_SUCCESS - SME update nRoamBeaconRssiWeight config
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009358 successfully.
9359 else SME is failed to update nRoamBeaconRssiWeight
9360 -------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309361QDF_STATUS sme_set_roam_beacon_rssi_weight(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009362 uint8_t sessionId,
9363 const uint8_t nRoamBeaconRssiWeight)
9364{
9365 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309366 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009367
9368 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309369 if (QDF_IS_STATUS_SUCCESS(status)) {
Varun Reddy Yeturuff4feb02016-04-20 12:26:11 -07009370 status = csr_neighbor_roam_update_config(pMac, sessionId,
9371 nRoamBeaconRssiWeight,
9372 REASON_ROAM_BEACON_RSSI_WEIGHT_CHANGED);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309373 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009374 pMac->roam.configParam.neighborRoamConfig.
9375 nRoamBeaconRssiWeight = nRoamBeaconRssiWeight;
9376 }
9377 sme_release_global_lock(&pMac->sme);
9378 }
9379 return status;
9380}
9381
9382/*--------------------------------------------------------------------------
9383 \fn sme_get_roam_beacon_rssi_weight
9384 \brief gets Roam beacon rssi weight
9385 This is a synchronous call
9386 \param hHal - The handle returned by mac_open
9387 \return uint8_t - nRoamBeaconRssiWeight
9388 \sa
9389 --------------------------------------------------------------------------*/
9390uint8_t sme_get_roam_beacon_rssi_weight(tHalHandle hHal)
9391{
9392 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
9393 return pMac->roam.configParam.neighborRoamConfig.nRoamBeaconRssiWeight;
9394}
9395
9396/*--------------------------------------------------------------------------
9397 \brief sme_set_neighbor_lookup_rssi_threshold() - update neighbor lookup
9398 rssi threshold
9399 This is a synchronous call
9400 \param hHal - The handle returned by mac_open.
9401 \param sessionId - Session Identifier
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309402 \return QDF_STATUS_SUCCESS - SME update config successful.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009403 Other status means SME is failed to update
9404 \sa
9405 --------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309406QDF_STATUS sme_set_neighbor_lookup_rssi_threshold
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009407 (tHalHandle hHal, uint8_t sessionId, uint8_t neighborLookupRssiThreshold) {
9408 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309409 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009410
9411 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309412 if (QDF_IS_STATUS_SUCCESS(status)) {
Varun Reddy Yeturuff4feb02016-04-20 12:26:11 -07009413 status = csr_neighbor_roam_update_config(pMac,
9414 sessionId, neighborLookupRssiThreshold,
9415 REASON_LOOKUP_THRESH_CHANGED);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309416 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009417 pMac->roam.configParam.neighborRoamConfig.
9418 nNeighborLookupRssiThreshold =
9419 neighborLookupRssiThreshold;
9420 }
9421 sme_release_global_lock(&pMac->sme);
9422 }
9423 return status;
9424}
9425
9426/*--------------------------------------------------------------------------
9427 \brief sme_set_delay_before_vdev_stop() - update delay before VDEV_STOP
9428 This is a synchronous call
9429 \param hal - The handle returned by macOpen.
9430 \param session_id - Session Identifier
9431 \param delay_before_vdev_stop - value to be set
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309432 \return QDF_STATUS_SUCCESS - SME update config successful.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009433 Other status means SME is failed to update
9434 \sa
9435 --------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309436QDF_STATUS sme_set_delay_before_vdev_stop(tHalHandle hal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009437 uint8_t session_id,
9438 uint8_t delay_before_vdev_stop)
9439{
9440 tpAniSirGlobal pMac = PMAC_STRUCT(hal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309441 QDF_STATUS status = QDF_STATUS_SUCCESS;
Naveen Rawatc36f7eb2016-11-10 20:01:03 -08009442
9443 if (session_id >= CSR_ROAM_SESSION_MAX) {
9444 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
9445 FL("Invalid sme session id: %d"), session_id);
9446 return QDF_STATUS_E_INVAL;
9447 }
9448
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009449 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309450 if (QDF_IS_STATUS_SUCCESS(status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05309451 QDF_TRACE(QDF_MODULE_ID_SME,
9452 QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009453 FL("LFR param delay_before_vdev_stop changed from %d to %d"),
9454 pMac->roam.configParam.neighborRoamConfig.
9455 delay_before_vdev_stop,
9456 delay_before_vdev_stop);
9457 pMac->roam.neighborRoamInfo[session_id].cfgParams.
9458 delay_before_vdev_stop = delay_before_vdev_stop;
9459 pMac->roam.configParam.neighborRoamConfig.
9460 delay_before_vdev_stop = delay_before_vdev_stop;
9461 sme_release_global_lock(&pMac->sme);
9462 }
9463 return status;
9464}
9465
9466/*--------------------------------------------------------------------------
9467 \brief sme_get_neighbor_lookup_rssi_threshold() - get neighbor lookup
9468 rssi threshold
9469 This is a synchronous call
9470 \param hHal - The handle returned by mac_open.
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309471 \return QDF_STATUS_SUCCESS - SME update config successful.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009472 Other status means SME is failed to update
9473 \sa
9474 --------------------------------------------------------------------------*/
9475uint8_t sme_get_neighbor_lookup_rssi_threshold(tHalHandle hHal)
9476{
9477 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
9478 return pMac->roam.configParam.neighborRoamConfig.
9479 nNeighborLookupRssiThreshold;
9480}
9481
9482/*--------------------------------------------------------------------------
9483 \brief sme_set_neighbor_scan_refresh_period() - set neighbor scan results
9484 refresh period
9485 This is a synchronous call
9486 \param hHal - The handle returned by mac_open.
9487 \param sessionId - Session Identifier
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309488 \return QDF_STATUS_SUCCESS - SME update config successful.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009489 Other status means SME is failed to update
9490 \sa
9491 --------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309492QDF_STATUS sme_set_neighbor_scan_refresh_period
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009493 (tHalHandle hHal,
9494 uint8_t sessionId, uint16_t neighborScanResultsRefreshPeriod) {
9495 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309496 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009497 tCsrNeighborRoamConfig *pNeighborRoamConfig = NULL;
9498 tpCsrNeighborRoamControlInfo pNeighborRoamInfo = NULL;
9499
Naveen Rawatc36f7eb2016-11-10 20:01:03 -08009500 if (sessionId >= CSR_ROAM_SESSION_MAX) {
9501 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
9502 FL("Invalid sme session id: %d"), sessionId);
9503 return QDF_STATUS_E_INVAL;
9504 }
9505
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009506 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309507 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009508 pNeighborRoamConfig =
9509 &pMac->roam.configParam.neighborRoamConfig;
9510 pNeighborRoamInfo = &pMac->roam.neighborRoamInfo[sessionId];
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05309511 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009512 "LFR runtime successfully set roam scan refresh period to %d- old value is %d - roam state is %s",
9513 neighborScanResultsRefreshPeriod,
9514 pMac->roam.configParam.neighborRoamConfig.
9515 nNeighborResultsRefreshPeriod,
9516 mac_trace_get_neighbour_roam_state(pMac->roam.
9517 neighborRoamInfo
9518 [sessionId].
9519 neighborRoamState));
9520 pNeighborRoamConfig->nNeighborResultsRefreshPeriod =
9521 neighborScanResultsRefreshPeriod;
9522 pNeighborRoamInfo->cfgParams.neighborResultsRefreshPeriod =
9523 neighborScanResultsRefreshPeriod;
9524
9525 sme_release_global_lock(&pMac->sme);
9526 }
9527 if (pMac->roam.configParam.isRoamOffloadScanEnabled) {
9528 csr_roam_offload_scan(pMac, sessionId,
9529 ROAM_SCAN_OFFLOAD_UPDATE_CFG,
9530 REASON_NEIGHBOR_SCAN_REFRESH_PERIOD_CHANGED);
9531 }
9532 return status;
9533}
9534
9535/*--------------------------------------------------------------------------
9536 \brief sme_update_roam_scan_offload_enabled() - enable/disable roam scan
9537 offload feaure
9538 It is used at in the REG_DYNAMIC_VARIABLE macro definition of
9539 gRoamScanOffloadEnabled.
9540 This is a synchronous call
9541 \param hHal - The handle returned by mac_open.
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309542 \return QDF_STATUS_SUCCESS - SME update config successfully.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009543 Other status means SME is failed to update.
9544 \sa
9545 --------------------------------------------------------------------------*/
9546
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309547QDF_STATUS sme_update_roam_scan_offload_enabled(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009548 bool nRoamScanOffloadEnabled)
9549{
9550 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309551 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009552
9553 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309554 if (QDF_IS_STATUS_SUCCESS(status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05309555 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009556 FL
9557 ("gRoamScanOffloadEnabled is changed from %d to %d"),
9558 pMac->roam.configParam.isRoamOffloadScanEnabled,
9559 nRoamScanOffloadEnabled);
9560 pMac->roam.configParam.isRoamOffloadScanEnabled =
9561 nRoamScanOffloadEnabled;
9562 sme_release_global_lock(&pMac->sme);
9563 }
9564
9565 return status;
9566}
9567
9568/*--------------------------------------------------------------------------
9569 \brief sme_get_neighbor_scan_refresh_period() - get neighbor scan results
9570 refresh period
9571 This is a synchronous call
9572 \param hHal - The handle returned by mac_open.
9573 \return uint16_t - Neighbor scan results refresh period value
9574 \sa
9575 --------------------------------------------------------------------------*/
9576uint16_t sme_get_neighbor_scan_refresh_period(tHalHandle hHal)
9577{
9578 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
9579 return pMac->roam.configParam.neighborRoamConfig.
9580 nNeighborResultsRefreshPeriod;
9581}
9582
9583/*--------------------------------------------------------------------------
9584 \brief sme_get_empty_scan_refresh_period() - get empty scan refresh period
9585 This is a synchronuous call
9586 \param hHal - The handle returned by mac_open.
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309587 \return QDF_STATUS_SUCCESS - SME update config successful.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009588 Other status means SME is failed to update
9589 \sa
9590 --------------------------------------------------------------------------*/
9591uint16_t sme_get_empty_scan_refresh_period(tHalHandle hHal)
9592{
9593 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
9594 return pMac->roam.configParam.neighborRoamConfig.
9595 nEmptyScanRefreshPeriod;
9596}
9597
9598/* ---------------------------------------------------------------------------
9599 \fn sme_update_empty_scan_refresh_period
9600 \brief Update nEmptyScanRefreshPeriod
9601 This function is called through dynamic setConfig callback function
9602 to configure nEmptyScanRefreshPeriod
9603 Usage: adb shell iwpriv wlan0 setConfig
9604 nEmptyScanRefreshPeriod=[0 .. 60]
9605 \param hHal - HAL handle for device
9606 \param sessionId - Session Identifier
9607 \param nEmptyScanRefreshPeriod - scan period following empty scan results.
9608 \- return Success or failure
9609 -------------------------------------------------------------------------*/
9610
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309611QDF_STATUS sme_update_empty_scan_refresh_period(tHalHandle hHal, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009612 uint16_t nEmptyScanRefreshPeriod)
9613{
9614 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309615 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009616 tCsrNeighborRoamConfig *pNeighborRoamConfig = NULL;
9617 tpCsrNeighborRoamControlInfo pNeighborRoamInfo = NULL;
9618
Naveen Rawatc36f7eb2016-11-10 20:01:03 -08009619 if (sessionId >= CSR_ROAM_SESSION_MAX) {
9620 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
9621 FL("Invalid sme session id: %d"), sessionId);
9622 return QDF_STATUS_E_INVAL;
9623 }
9624
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009625 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309626 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009627 pNeighborRoamConfig =
9628 &pMac->roam.configParam.neighborRoamConfig;
9629 pNeighborRoamInfo = &pMac->roam.neighborRoamInfo[sessionId];
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05309630 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009631 "LFR runtime successfully set roam scan period to %d -old value is %d - roam state is %s",
9632 nEmptyScanRefreshPeriod,
9633 pMac->roam.configParam.neighborRoamConfig.
9634 nEmptyScanRefreshPeriod,
9635 mac_trace_get_neighbour_roam_state(pMac->roam.
9636 neighborRoamInfo
9637 [sessionId].
9638 neighborRoamState));
9639 pNeighborRoamConfig->nEmptyScanRefreshPeriod =
9640 nEmptyScanRefreshPeriod;
9641 pNeighborRoamInfo->cfgParams.emptyScanRefreshPeriod =
9642 nEmptyScanRefreshPeriod;
9643 sme_release_global_lock(&pMac->sme);
9644 }
9645 if (pMac->roam.configParam.isRoamOffloadScanEnabled) {
9646 csr_roam_offload_scan(pMac, sessionId,
9647 ROAM_SCAN_OFFLOAD_UPDATE_CFG,
9648 REASON_EMPTY_SCAN_REF_PERIOD_CHANGED);
9649 }
9650 return status;
9651}
9652
9653/* ---------------------------------------------------------------------------
9654 \fn sme_set_neighbor_scan_min_chan_time
9655 \brief Update nNeighborScanMinChanTime
9656 This function is called through dynamic setConfig callback function
9657 to configure gNeighborScanChannelMinTime
9658 Usage: adb shell iwpriv wlan0 setConfig
9659 gNeighborScanChannelMinTime=[0 .. 60]
9660 \param hHal - HAL handle for device
9661 \param nNeighborScanMinChanTime - Channel minimum dwell time
9662 \param sessionId - Session Identifier
9663 \- return Success or failure
9664 -------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309665QDF_STATUS sme_set_neighbor_scan_min_chan_time(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009666 const uint16_t
9667 nNeighborScanMinChanTime,
9668 uint8_t sessionId)
9669{
9670 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309671 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009672
Naveen Rawatc36f7eb2016-11-10 20:01:03 -08009673 if (sessionId >= CSR_ROAM_SESSION_MAX) {
9674 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
9675 FL("Invalid sme session id: %d"), sessionId);
9676 return QDF_STATUS_E_INVAL;
9677 }
9678
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009679 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309680 if (QDF_IS_STATUS_SUCCESS(status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05309681 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009682 "LFR runtime successfully set channel min dwell time to %d - old value is %d - roam state is %s",
9683 nNeighborScanMinChanTime,
9684 pMac->roam.configParam.neighborRoamConfig.
9685 nNeighborScanMinChanTime,
9686 mac_trace_get_neighbour_roam_state(pMac->roam.
9687 neighborRoamInfo
9688 [sessionId].
9689 neighborRoamState));
9690
9691 pMac->roam.configParam.neighborRoamConfig.
9692 nNeighborScanMinChanTime = nNeighborScanMinChanTime;
9693 pMac->roam.neighborRoamInfo[sessionId].cfgParams.
9694 minChannelScanTime = nNeighborScanMinChanTime;
9695 sme_release_global_lock(&pMac->sme);
9696 }
9697
9698 return status;
9699}
9700
9701/* ---------------------------------------------------------------------------
9702 \fn sme_set_neighbor_scan_max_chan_time
9703 \brief Update nNeighborScanMaxChanTime
9704 This function is called through dynamic setConfig callback function
9705 to configure gNeighborScanChannelMaxTime
9706 Usage: adb shell iwpriv wlan0 setConfig
9707 gNeighborScanChannelMaxTime=[0 .. 60]
9708 \param hHal - HAL handle for device
9709 \param sessionId - Session Identifier
9710 \param nNeighborScanMinChanTime - Channel maximum dwell time
9711 \- return Success or failure
9712 -------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309713QDF_STATUS sme_set_neighbor_scan_max_chan_time(tHalHandle hHal, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009714 const uint16_t
9715 nNeighborScanMaxChanTime)
9716{
9717 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309718 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009719 tCsrNeighborRoamConfig *pNeighborRoamConfig = NULL;
9720 tpCsrNeighborRoamControlInfo pNeighborRoamInfo = NULL;
9721
Naveen Rawatc36f7eb2016-11-10 20:01:03 -08009722 if (sessionId >= CSR_ROAM_SESSION_MAX) {
9723 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
9724 FL("Invalid sme session id: %d"), sessionId);
9725 return QDF_STATUS_E_INVAL;
9726 }
9727
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009728 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309729 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009730 pNeighborRoamConfig =
9731 &pMac->roam.configParam.neighborRoamConfig;
9732 pNeighborRoamInfo = &pMac->roam.neighborRoamInfo[sessionId];
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05309733 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009734 "LFR runtime successfully set channel max dwell time to %d - old value is %d - roam state is %s",
9735 nNeighborScanMaxChanTime,
9736 pMac->roam.configParam.neighborRoamConfig.
9737 nNeighborScanMaxChanTime,
9738 mac_trace_get_neighbour_roam_state(pMac->roam.
9739 neighborRoamInfo
9740 [sessionId].
9741 neighborRoamState));
9742 pNeighborRoamConfig->nNeighborScanMaxChanTime =
9743 nNeighborScanMaxChanTime;
9744 pNeighborRoamInfo->cfgParams.maxChannelScanTime =
9745 nNeighborScanMaxChanTime;
9746 sme_release_global_lock(&pMac->sme);
9747 }
9748 if (pMac->roam.configParam.isRoamOffloadScanEnabled) {
9749 csr_roam_offload_scan(pMac, sessionId,
9750 ROAM_SCAN_OFFLOAD_UPDATE_CFG,
9751 REASON_SCAN_CH_TIME_CHANGED);
9752 }
9753
9754 return status;
9755}
9756
9757/* ---------------------------------------------------------------------------
9758 \fn sme_get_neighbor_scan_min_chan_time
9759 \brief get neighbor scan min channel time
9760 \param hHal - The handle returned by mac_open.
9761 \param sessionId - Session Identifier
9762 \return uint16_t - channel min time value
9763 -------------------------------------------------------------------------*/
9764uint16_t sme_get_neighbor_scan_min_chan_time(tHalHandle hHal, uint8_t sessionId)
9765{
9766 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Naveen Rawatc36f7eb2016-11-10 20:01:03 -08009767
9768 if (sessionId >= CSR_ROAM_SESSION_MAX) {
9769 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
9770 FL("Invalid sme session id: %d"), sessionId);
9771 return 0;
9772 }
9773
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009774 return pMac->roam.neighborRoamInfo[sessionId].cfgParams.
9775 minChannelScanTime;
9776}
9777
9778/* ---------------------------------------------------------------------------
9779 \fn sme_get_neighbor_roam_state
9780 \brief get neighbor roam state
9781 \param hHal - The handle returned by mac_open.
9782 \param sessionId - Session Identifier
9783 \return uint32_t - neighbor roam state
9784 -------------------------------------------------------------------------*/
9785uint32_t sme_get_neighbor_roam_state(tHalHandle hHal, uint8_t sessionId)
9786{
9787 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Naveen Rawatc36f7eb2016-11-10 20:01:03 -08009788
9789 if (sessionId >= CSR_ROAM_SESSION_MAX) {
9790 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
9791 FL("Invalid sme session id: %d"), sessionId);
9792 return 0;
9793 }
9794
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009795 return pMac->roam.neighborRoamInfo[sessionId].neighborRoamState;
9796}
9797
9798/* ---------------------------------------------------------------------------
9799 \fn sme_get_current_roam_state
9800 \brief get current roam state
9801 \param hHal - The handle returned by mac_open.
9802 \param sessionId - Session Identifier
9803 \return uint32_t - current roam state
9804 -------------------------------------------------------------------------*/
9805uint32_t sme_get_current_roam_state(tHalHandle hHal, uint8_t sessionId)
9806{
9807 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
9808 return pMac->roam.curState[sessionId];
9809}
9810
9811/* ---------------------------------------------------------------------------
9812 \fn sme_get_current_roam_sub_state
9813 \brief get neighbor roam sub state
9814 \param hHal - The handle returned by mac_open.
9815 \param sessionId - Session Identifier
9816 \return uint32_t - current roam sub state
9817 -------------------------------------------------------------------------*/
9818uint32_t sme_get_current_roam_sub_state(tHalHandle hHal, uint8_t sessionId)
9819{
9820 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
9821 return pMac->roam.curSubState[sessionId];
9822}
9823
9824/* ---------------------------------------------------------------------------
9825 \fn sme_get_lim_sme_state
9826 \brief get Lim Sme state
9827 \param hHal - The handle returned by mac_open.
9828 \return uint32_t - Lim Sme state
9829 -------------------------------------------------------------------------*/
9830uint32_t sme_get_lim_sme_state(tHalHandle hHal)
9831{
9832 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
9833 return pMac->lim.gLimSmeState;
9834}
9835
9836/* ---------------------------------------------------------------------------
9837 \fn sme_get_lim_mlm_state
9838 \brief get Lim Mlm state
9839 \param hHal - The handle returned by mac_open.
9840 \return uint32_t - Lim Mlm state
9841 -------------------------------------------------------------------------*/
9842uint32_t sme_get_lim_mlm_state(tHalHandle hHal)
9843{
9844 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
9845 return pMac->lim.gLimMlmState;
9846}
9847
9848/* ---------------------------------------------------------------------------
9849 \fn sme_is_lim_session_valid
9850 \brief is Lim session valid
9851 \param hHal - The handle returned by mac_open.
9852 \param sessionId - Session Identifier
9853 \return bool - true or false
9854 -------------------------------------------------------------------------*/
9855bool sme_is_lim_session_valid(tHalHandle hHal, uint8_t sessionId)
9856{
9857 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Hanumantha Reddy Pothula589fd702015-11-17 15:25:16 +05309858
9859 if (sessionId > pMac->lim.maxBssId)
9860 return false;
9861
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009862 return pMac->lim.gpSession[sessionId].valid;
9863}
9864
9865/* ---------------------------------------------------------------------------
9866 \fn sme_get_lim_sme_session_state
9867 \brief get Lim Sme session state
9868 \param hHal - The handle returned by mac_open.
9869 \param sessionId - Session Identifier
9870 \return uint32_t - Lim Sme session state
9871 -------------------------------------------------------------------------*/
9872uint32_t sme_get_lim_sme_session_state(tHalHandle hHal, uint8_t sessionId)
9873{
9874 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
9875 return pMac->lim.gpSession[sessionId].limSmeState;
9876}
9877
9878/* ---------------------------------------------------------------------------
9879 \fn sme_get_lim_mlm_session_state
9880 \brief get Lim Mlm session state
9881 \param hHal - The handle returned by mac_open.
9882 \param sessionId - Session Identifier
9883 \return uint32_t - Lim Mlm session state
9884 -------------------------------------------------------------------------*/
9885uint32_t sme_get_lim_mlm_session_state(tHalHandle hHal, uint8_t sessionId)
9886{
9887 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
9888 return pMac->lim.gpSession[sessionId].limMlmState;
9889}
9890
9891/* ---------------------------------------------------------------------------
9892 \fn sme_get_neighbor_scan_max_chan_time
9893 \brief get neighbor scan max channel time
9894 \param hHal - The handle returned by mac_open.
9895 \param sessionId - Session Identifier
9896 \return uint16_t - channel max time value
9897 -------------------------------------------------------------------------*/
9898uint16_t sme_get_neighbor_scan_max_chan_time(tHalHandle hHal, uint8_t sessionId)
9899{
9900 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Naveen Rawatc36f7eb2016-11-10 20:01:03 -08009901
9902 if (sessionId >= CSR_ROAM_SESSION_MAX) {
9903 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
9904 FL("Invalid sme session id: %d"), sessionId);
9905 return 0;
9906 }
9907
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009908 return pMac->roam.neighborRoamInfo[sessionId].cfgParams.
9909 maxChannelScanTime;
9910}
9911
9912/* ---------------------------------------------------------------------------
9913 \fn sme_set_neighbor_scan_period
9914 \brief Update nNeighborScanPeriod
9915 This function is called through dynamic setConfig callback function
9916 to configure nNeighborScanPeriod
9917 Usage: adb shell iwpriv wlan0 setConfig
9918 nNeighborScanPeriod=[0 .. 1000]
9919 \param hHal - HAL handle for device
9920 \param sessionId - Session Identifier
9921 \param nNeighborScanPeriod - neighbor scan period
9922 \- return Success or failure
9923 -------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309924QDF_STATUS sme_set_neighbor_scan_period(tHalHandle hHal, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009925 const uint16_t nNeighborScanPeriod)
9926{
9927 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309928 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009929 tCsrNeighborRoamConfig *pNeighborRoamConfig = NULL;
9930 tpCsrNeighborRoamControlInfo pNeighborRoamInfo = NULL;
9931
Naveen Rawatc36f7eb2016-11-10 20:01:03 -08009932 if (sessionId >= CSR_ROAM_SESSION_MAX) {
9933 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
9934 FL("Invalid sme session id: %d"), sessionId);
9935 return QDF_STATUS_E_INVAL;
9936 }
9937
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009938 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309939 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009940 pNeighborRoamConfig =
9941 &pMac->roam.configParam.neighborRoamConfig;
9942 pNeighborRoamInfo = &pMac->roam.neighborRoamInfo[sessionId];
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05309943 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009944 "LFR runtime successfully set neighbor scan period to %d"
9945 " - old value is %d - roam state is %s",
9946 nNeighborScanPeriod,
9947 pMac->roam.configParam.neighborRoamConfig.
9948 nNeighborScanTimerPeriod,
9949 mac_trace_get_neighbour_roam_state(pMac->roam.
9950 neighborRoamInfo
9951 [sessionId].
9952 neighborRoamState));
9953 pNeighborRoamConfig->nNeighborScanTimerPeriod =
9954 nNeighborScanPeriod;
9955 pNeighborRoamInfo->cfgParams.neighborScanPeriod =
9956 nNeighborScanPeriod;
9957 sme_release_global_lock(&pMac->sme);
9958 }
9959 if (pMac->roam.configParam.isRoamOffloadScanEnabled) {
9960 csr_roam_offload_scan(pMac, sessionId,
9961 ROAM_SCAN_OFFLOAD_UPDATE_CFG,
9962 REASON_SCAN_HOME_TIME_CHANGED);
9963 }
9964
9965 return status;
9966}
9967
9968/* ---------------------------------------------------------------------------
9969 \fn sme_get_neighbor_scan_period
9970 \brief get neighbor scan period
9971 \param hHal - The handle returned by mac_open.
9972 \param sessionId - Session Identifier
9973 \return uint16_t - neighbor scan period
9974 -------------------------------------------------------------------------*/
9975uint16_t sme_get_neighbor_scan_period(tHalHandle hHal, uint8_t sessionId)
9976{
9977 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Naveen Rawatc36f7eb2016-11-10 20:01:03 -08009978
9979 if (sessionId >= CSR_ROAM_SESSION_MAX) {
9980 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
9981 FL("Invalid sme session id: %d"), sessionId);
9982 return 0;
9983 }
9984
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009985 return pMac->roam.neighborRoamInfo[sessionId].cfgParams.
9986 neighborScanPeriod;
9987}
9988
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009989
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009990
9991/*--------------------------------------------------------------------------
9992 \brief sme_get_roam_rssi_diff() - get Roam rssi diff
9993 This is a synchronous call
9994 \param hHal - The handle returned by mac_open.
9995 \return uint16_t - Rssi diff value
9996 \sa
9997 --------------------------------------------------------------------------*/
9998uint8_t sme_get_roam_rssi_diff(tHalHandle hHal)
9999{
10000 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
10001 return pMac->roam.configParam.RoamRssiDiff;
10002}
10003
10004/**
10005 * sme_change_roam_scan_channel_list() - to change scan channel list
10006 * @hHal: pointer HAL handle returned by mac_open
10007 * @sessionId: sme session id
10008 * @pChannelList: Output channel list
10009 * @numChannels: Output number of channels
10010 *
10011 * This routine is called to Change roam scan channel list.
10012 * This is a synchronous call
10013 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010014 * Return: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010015 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010016QDF_STATUS sme_change_roam_scan_channel_list(tHalHandle hHal, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010017 uint8_t *pChannelList,
10018 uint8_t numChannels)
10019{
10020 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010021 QDF_STATUS status = QDF_STATUS_SUCCESS;
Naveen Rawatc36f7eb2016-11-10 20:01:03 -080010022 tpCsrNeighborRoamControlInfo pNeighborRoamInfo = NULL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010023 uint8_t oldChannelList[WNI_CFG_VALID_CHANNEL_LIST_LEN * 2] = { 0 };
10024 uint8_t newChannelList[WNI_CFG_VALID_CHANNEL_LIST_LEN * 2] = { 0 };
10025 uint8_t i = 0, j = 0;
10026 tCsrChannelInfo *chan_info;
10027
Naveen Rawatc36f7eb2016-11-10 20:01:03 -080010028 if (sessionId >= CSR_ROAM_SESSION_MAX) {
10029 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
10030 FL("Invalid sme session id: %d"), sessionId);
10031 return QDF_STATUS_E_INVAL;
10032 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010033
Naveen Rawatc36f7eb2016-11-10 20:01:03 -080010034 pNeighborRoamInfo = &pMac->roam.neighborRoamInfo[sessionId];
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010035 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010036 if (!QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010037 if (pMac->roam.configParam.isRoamOffloadScanEnabled)
10038 csr_roam_offload_scan(pMac, sessionId,
10039 ROAM_SCAN_OFFLOAD_UPDATE_CFG,
10040 REASON_CHANNEL_LIST_CHANGED);
10041 return status;
10042 }
10043 chan_info = &pNeighborRoamInfo->cfgParams.channelInfo;
10044
10045 if (NULL != chan_info->ChannelList) {
10046 for (i = 0; i < chan_info->numOfChannels; i++) {
10047 if (j < sizeof(oldChannelList))
10048 j += snprintf(oldChannelList + j,
10049 sizeof(oldChannelList) -
10050 j, "%d",
10051 chan_info->ChannelList[i]);
10052 else
10053 break;
10054 }
10055 }
10056 csr_flush_cfg_bg_scan_roam_channel_list(pMac, sessionId);
10057 csr_create_bg_scan_roam_channel_list(pMac, sessionId, pChannelList,
10058 numChannels);
10059 sme_set_roam_scan_control(hHal, sessionId, 1);
10060 if (NULL != chan_info->ChannelList) {
10061 j = 0;
10062 for (i = 0; i < chan_info->numOfChannels; i++) {
10063 if (j < sizeof(newChannelList))
10064 j += snprintf(newChannelList + j,
10065 sizeof(newChannelList) -
10066 j, " %d",
10067 chan_info->ChannelList[i]);
10068 else
10069 break;
10070 }
10071 }
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053010072 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010073 FL("LFR runtime successfully set roam scan channels to %s - old value is %s - roam state is %d"),
10074 newChannelList, oldChannelList,
10075 pMac->roam.neighborRoamInfo[sessionId].neighborRoamState);
10076 sme_release_global_lock(&pMac->sme);
10077
10078 if (pMac->roam.configParam.isRoamOffloadScanEnabled)
10079 csr_roam_offload_scan(pMac, sessionId,
10080 ROAM_SCAN_OFFLOAD_UPDATE_CFG,
10081 REASON_CHANNEL_LIST_CHANGED);
10082 return status;
10083}
10084
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010085/**
10086 * sme_get_roam_scan_channel_list() - To get roam scan channel list
10087 * @hHal: HAL pointer
10088 * @pChannelList: Output channel list
10089 * @pNumChannels: Output number of channels
10090 * @sessionId: Session Identifier
10091 *
10092 * To get roam scan channel list This is a synchronous call
10093 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010094 * Return: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010095 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010096QDF_STATUS sme_get_roam_scan_channel_list(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010097 uint8_t *pChannelList, uint8_t *pNumChannels,
10098 uint8_t sessionId)
10099{
10100 int i = 0;
10101 uint8_t *pOutPtr = pChannelList;
10102 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Naveen Rawatc36f7eb2016-11-10 20:01:03 -080010103 tpCsrNeighborRoamControlInfo pNeighborRoamInfo = NULL;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010104 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010105
Naveen Rawatc36f7eb2016-11-10 20:01:03 -080010106 if (sessionId >= CSR_ROAM_SESSION_MAX) {
10107 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
10108 FL("Invalid sme session id: %d"), sessionId);
10109 return QDF_STATUS_E_INVAL;
10110 }
10111
10112 pNeighborRoamInfo = &pMac->roam.neighborRoamInfo[sessionId];
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010113 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010114 if (!QDF_IS_STATUS_SUCCESS(status))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010115 return status;
10116 if (NULL == pNeighborRoamInfo->cfgParams.channelInfo.ChannelList) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053010117 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_WARN,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010118 FL("Roam Scan channel list is NOT yet initialized"));
10119 *pNumChannels = 0;
10120 sme_release_global_lock(&pMac->sme);
10121 return status;
10122 }
10123
10124 *pNumChannels = pNeighborRoamInfo->cfgParams.channelInfo.numOfChannels;
10125 for (i = 0; i < (*pNumChannels); i++) {
10126 pOutPtr[i] =
10127 pNeighborRoamInfo->cfgParams.channelInfo.ChannelList[i];
10128 }
10129 pOutPtr[i] = '\0';
10130 sme_release_global_lock(&pMac->sme);
10131 return status;
10132}
10133
10134/*--------------------------------------------------------------------------
10135 \brief sme_get_is_ese_feature_enabled() - get ESE feature enabled or not
10136 This is a synchronuous call
10137 \param hHal - The handle returned by mac_open.
10138 \return true (1) - if the ESE feature is enabled
10139 false (0) - if feature is disabled (compile or runtime)
10140 \sa
10141 --------------------------------------------------------------------------*/
10142bool sme_get_is_ese_feature_enabled(tHalHandle hHal)
10143{
10144#ifdef FEATURE_WLAN_ESE
10145 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
10146 return csr_roam_is_ese_ini_feature_enabled(pMac);
10147#else
10148 return false;
10149#endif
10150}
10151
10152/*--------------------------------------------------------------------------
10153 \brief sme_get_wes_mode() - get WES Mode
10154 This is a synchronous call
10155 \param hHal - The handle returned by mac_open
10156 \return uint8_t - WES Mode Enabled(1)/Disabled(0)
10157 \sa
10158 --------------------------------------------------------------------------*/
10159bool sme_get_wes_mode(tHalHandle hHal)
10160{
10161 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
10162 return pMac->roam.configParam.isWESModeEnabled;
10163}
10164
10165/*--------------------------------------------------------------------------
10166 \brief sme_get_roam_scan_control() - get scan control
10167 This is a synchronous call
10168 \param hHal - The handle returned by mac_open.
10169 \return bool - Enabled(1)/Disabled(0)
10170 \sa
10171 --------------------------------------------------------------------------*/
10172bool sme_get_roam_scan_control(tHalHandle hHal)
10173{
10174 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
10175 return pMac->roam.configParam.nRoamScanControl;
10176}
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010177
10178/*--------------------------------------------------------------------------
10179 \brief sme_get_is_lfr_feature_enabled() - get LFR feature enabled or not
10180 This is a synchronuous call
10181 \param hHal - The handle returned by mac_open.
10182 \return true (1) - if the feature is enabled
10183 false (0) - if feature is disabled (compile or runtime)
10184 \sa
10185 --------------------------------------------------------------------------*/
10186bool sme_get_is_lfr_feature_enabled(tHalHandle hHal)
10187{
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010188 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
10189 return pMac->roam.configParam.isFastRoamIniFeatureEnabled;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010190}
10191
10192/*--------------------------------------------------------------------------
10193 \brief sme_get_is_ft_feature_enabled() - get FT feature enabled or not
10194 This is a synchronuous call
10195 \param hHal - The handle returned by mac_open.
10196 \return true (1) - if the feature is enabled
10197 false (0) - if feature is disabled (compile or runtime)
10198 \sa
10199 --------------------------------------------------------------------------*/
10200bool sme_get_is_ft_feature_enabled(tHalHandle hHal)
10201{
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010202 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
10203 return pMac->roam.configParam.isFastTransitionEnabled;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010204}
10205
10206/* ---------------------------------------------------------------------------
10207 \fn sme_is_feature_supported_by_fw
10208 \brief Check if an feature is enabled by FW
10209
10210 \param feattEnumValue - Enumeration value from placeHolderInCapBitmap
10211 \- return 1/0 (true/false)
10212 -------------------------------------------------------------------------*/
10213uint8_t sme_is_feature_supported_by_fw(uint8_t featEnumValue)
10214{
10215 return IS_FEATURE_SUPPORTED_BY_FW(featEnumValue);
10216}
10217
10218#ifdef FEATURE_WLAN_TDLS
10219
10220/* ---------------------------------------------------------------------------
10221 \fn sme_send_tdls_link_establish_params
10222 \brief API to send TDLS Peer Link Establishment Parameters.
10223
10224 \param peerMac - peer's Mac Adress.
10225 \param tdlsLinkEstablishParams - TDLS Peer Link Establishment Parameters
Anurag Chouhanf04e84f2016-03-03 10:12:12 +053010226 \- return QDF_STATUS_SUCCES
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010227 -------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010228QDF_STATUS sme_send_tdls_link_establish_params(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010229 uint8_t sessionId,
10230 const tSirMacAddr peerMac,
10231 tCsrTdlsLinkEstablishParams *
10232 tdlsLinkEstablishParams)
10233{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010234 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010235 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
10236
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053010237 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Sreelakshmi Konamki6744cff2015-09-07 12:10:39 +053010238 TRACE_CODE_SME_RX_HDD_TDLS_LINK_ESTABLISH_PARAM,
10239 sessionId,
10240 tdlsLinkEstablishParams->isOffChannelSupported));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010241 status = sme_acquire_global_lock(&pMac->sme);
10242
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010243 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010244 status = csr_tdls_send_link_establish_params(hHal, sessionId,
10245 peerMac, tdlsLinkEstablishParams);
10246 sme_release_global_lock(&pMac->sme);
10247 }
10248 return status;
10249}
10250
10251/* ---------------------------------------------------------------------------
10252 \fn sme_send_tdls_mgmt_frame
10253 \brief API to send TDLS management frames.
10254
10255 \param peerMac - peer's Mac Adress.
10256 \param frame_type - Type of TDLS mgmt frame to be sent.
10257 \param dialog - dialog token used in the frame.
10258 \param status - status to be incuded in the frame.
10259 \param peerCapability - peer cpabilities
10260 \param buf - additional IEs to be included
10261 \param len - lenght of additional Ies
10262 \param responder - Tdls request type
Anurag Chouhanf04e84f2016-03-03 10:12:12 +053010263 \- return QDF_STATUS_SUCCES
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010264 -------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010265QDF_STATUS sme_send_tdls_mgmt_frame(tHalHandle hHal, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010266 const tSirMacAddr peerMac,
10267 uint8_t frame_type,
10268 uint8_t dialog, uint16_t statusCode,
10269 uint32_t peerCapability, uint8_t *buf,
10270 uint8_t len, uint8_t responder)
10271{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010272 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010273 tCsrTdlsSendMgmt sendTdlsReq = { {0} };
10274 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
10275
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053010276 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Sreelakshmi Konamki6744cff2015-09-07 12:10:39 +053010277 TRACE_CODE_SME_RX_HDD_TDLS_SEND_MGMT_FRAME,
10278 sessionId, statusCode));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010279 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010280 if (QDF_IS_STATUS_SUCCESS(status)) {
Anurag Chouhan600c3a02016-03-01 10:33:54 +053010281 qdf_mem_copy(sendTdlsReq.peerMac, peerMac, sizeof(tSirMacAddr));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010282 sendTdlsReq.frameType = frame_type;
10283 sendTdlsReq.buf = buf;
10284 sendTdlsReq.len = len;
10285 sendTdlsReq.dialog = dialog;
10286 sendTdlsReq.statusCode = statusCode;
10287 sendTdlsReq.responder = responder;
10288 sendTdlsReq.peerCapability = peerCapability;
10289
10290 status = csr_tdls_send_mgmt_req(hHal, sessionId, &sendTdlsReq);
10291
10292 sme_release_global_lock(&pMac->sme);
10293 }
10294
10295 return status;
10296
10297}
10298
10299/* ---------------------------------------------------------------------------
10300 \fn sme_change_tdls_peer_sta
10301 \brief API to Update TDLS peer sta parameters.
10302
10303 \param peerMac - peer's Mac Adress.
10304 \param staParams - Peer Station Parameters
Anurag Chouhanf04e84f2016-03-03 10:12:12 +053010305 \- return QDF_STATUS_SUCCES
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010306 -------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010307QDF_STATUS sme_change_tdls_peer_sta(tHalHandle hHal, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010308 const tSirMacAddr peerMac,
10309 tCsrStaParams *pstaParams)
10310{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010311 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010312 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
10313
10314 if (NULL == pstaParams) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053010315 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010316 "%s :pstaParams is NULL", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010317 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010318 }
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053010319 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Sreelakshmi Konamki6744cff2015-09-07 12:10:39 +053010320 TRACE_CODE_SME_RX_HDD_TDLS_CHANGE_PEER_STA,
10321 sessionId, pstaParams->capability));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010322 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010323 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010324 status = csr_tdls_change_peer_sta(hHal, sessionId, peerMac,
10325 pstaParams);
10326
10327 sme_release_global_lock(&pMac->sme);
10328 }
10329
10330 return status;
10331
10332}
10333
10334/* ---------------------------------------------------------------------------
10335 \fn sme_add_tdls_peer_sta
10336 \brief API to Add TDLS peer sta entry.
10337
10338 \param peerMac - peer's Mac Adress.
Anurag Chouhanf04e84f2016-03-03 10:12:12 +053010339 \- return QDF_STATUS_SUCCES
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010340 -------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010341QDF_STATUS sme_add_tdls_peer_sta(tHalHandle hHal, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010342 const tSirMacAddr peerMac)
10343{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010344 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010345 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
10346
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053010347 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Sreelakshmi Konamki6744cff2015-09-07 12:10:39 +053010348 TRACE_CODE_SME_RX_HDD_TDLS_ADD_PEER_STA,
10349 sessionId, 0));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010350 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010351 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010352 status = csr_tdls_add_peer_sta(hHal, sessionId, peerMac);
10353
10354 sme_release_global_lock(&pMac->sme);
10355 }
10356
10357 return status;
10358
10359}
10360
10361/* ---------------------------------------------------------------------------
10362 \fn sme_delete_tdls_peer_sta
10363 \brief API to Delete TDLS peer sta entry.
10364
10365 \param peerMac - peer's Mac Adress.
Anurag Chouhanf04e84f2016-03-03 10:12:12 +053010366 \- return QDF_STATUS_SUCCES
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010367 -------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010368QDF_STATUS sme_delete_tdls_peer_sta(tHalHandle hHal, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010369 const tSirMacAddr peerMac)
10370{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010371 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010372 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
10373
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053010374 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Sreelakshmi Konamki6744cff2015-09-07 12:10:39 +053010375 TRACE_CODE_SME_RX_HDD_TDLS_DEL_PEER_STA,
10376 sessionId, 0));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010377 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010378 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010379 status = csr_tdls_del_peer_sta(hHal, sessionId, peerMac);
10380
10381 sme_release_global_lock(&pMac->sme);
10382 }
10383
10384 return status;
10385
10386}
10387
10388/* ---------------------------------------------------------------------------
10389 \fn sme_set_tdls_power_save_prohibited
10390 \API to set/reset the is_tdls_power_save_prohibited.
10391
10392 \- return void
10393 -------------------------------------------------------------------------*/
10394void sme_set_tdls_power_save_prohibited(tHalHandle hHal, uint32_t sessionId,
10395 bool val)
10396{
10397 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
10398 struct ps_global_info *ps_global_info = &pMac->sme.ps_global_info;
10399 struct ps_params *ps_param = &ps_global_info->ps_params[sessionId];
10400 ps_param->is_tdls_power_save_prohibited = val;
10401 return;
10402}
10403
10404/* ---------------------------------------------------------------------------
10405 \fn sme_update_fw_tdls_state
10406
10407 \brief
10408 SME will send message to WMA to set TDLS state in f/w
10409
10410 \param
10411
10412 hHal - The handle returned by mac_open
10413
10414 psmeTdlsParams - TDLS state info to update in f/w
10415
10416 useSmeLock - Need to acquire SME Global Lock before state update or not
10417
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010418 \return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010419 --------------------------------------------------------------------------- */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010420QDF_STATUS sme_update_fw_tdls_state(tHalHandle hHal, void *psmeTdlsParams,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010421 bool useSmeLock)
10422{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010423 QDF_STATUS status = QDF_STATUS_SUCCESS;
10424 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010425 tpAniSirGlobal pMac = NULL;
10426 cds_msg_t cds_message;
10427
Mukul Sharmaeae172c2016-09-03 13:40:46 +053010428 pMac = PMAC_STRUCT(hHal);
10429 if (NULL == pMac) {
10430 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
10431 FL("pMac is Null"));
10432 return QDF_STATUS_E_FAILURE;
10433 }
10434
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010435 /* only acquire sme global lock before state update if asked to */
10436 if (useSmeLock) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010437 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010438 if (QDF_STATUS_SUCCESS != status)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010439 return status;
10440 }
10441
10442 /* serialize the req through MC thread */
10443 cds_message.bodyptr = psmeTdlsParams;
10444 cds_message.type = WMA_UPDATE_FW_TDLS_STATE;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010445 qdf_status = cds_mq_post_message(CDS_MQ_ID_WMA, &cds_message);
10446 if (!QDF_IS_STATUS_SUCCESS(qdf_status))
10447 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010448
10449 /* release the lock if it was acquired */
10450 if (useSmeLock)
10451 sme_release_global_lock(&pMac->sme);
10452
10453 return status;
10454}
10455
10456/**
10457 * sme_update_tdls_peer_state() - to update the state of TDLS peer
10458 * @hHal: The handle returned by mac_open
10459 * @peerStateParams: TDLS Peer state info to update in f/w
10460 *
10461 * SME will send message to WMA to set TDLS Peer state in f/w
10462 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010463 * Return: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010464 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010465QDF_STATUS sme_update_tdls_peer_state(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010466 tSmeTdlsPeerStateParams *peerStateParams)
10467{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010468 QDF_STATUS status = QDF_STATUS_SUCCESS;
10469 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010470 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
10471 tTdlsPeerStateParams *pTdlsPeerStateParams = NULL;
10472 tTdlsPeerCapParams *peer_cap = NULL;
10473 cds_msg_t cds_message;
10474 uint8_t num;
Kabilan Kannan44f65862016-06-28 23:46:51 -070010475 uint8_t peer_chan_len;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010476 uint8_t chanId;
10477 uint8_t i;
10478
10479 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010480 if (!QDF_IS_STATUS_SUCCESS(status))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010481 return status;
Anurag Chouhan600c3a02016-03-01 10:33:54 +053010482 pTdlsPeerStateParams = qdf_mem_malloc(sizeof(*pTdlsPeerStateParams));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010483 if (NULL == pTdlsPeerStateParams) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053010484 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010485 FL("failed to allocate mem for tdls peer state param"));
10486 sme_release_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010487 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010488 }
10489
Anurag Chouhan600c3a02016-03-01 10:33:54 +053010490 qdf_mem_copy(&pTdlsPeerStateParams->peerMacAddr,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010491 &peerStateParams->peerMacAddr, sizeof(tSirMacAddr));
10492 pTdlsPeerStateParams->vdevId = peerStateParams->vdevId;
10493 pTdlsPeerStateParams->peerState = peerStateParams->peerState;
10494
10495 switch (peerStateParams->peerState) {
10496 case eSME_TDLS_PEER_STATE_PEERING:
10497 pTdlsPeerStateParams->peerState =
10498 WMA_TDLS_PEER_STATE_PEERING;
10499 break;
10500
10501 case eSME_TDLS_PEER_STATE_CONNECTED:
10502 pTdlsPeerStateParams->peerState =
10503 WMA_TDLS_PEER_STATE_CONNECTED;
10504 break;
10505
10506 case eSME_TDLS_PEER_STATE_TEARDOWN:
10507 pTdlsPeerStateParams->peerState =
10508 WMA_TDLS_PEER_STATE_TEARDOWN;
10509 break;
10510
Kabilan Kannan421714b2015-11-23 04:44:59 -080010511 case eSME_TDLS_PEER_ADD_MAC_ADDR:
10512 pTdlsPeerStateParams->peerState = WMA_TDLS_PEER_ADD_MAC_ADDR;
10513 break;
10514
10515 case eSME_TDLS_PEER_REMOVE_MAC_ADDR:
10516 pTdlsPeerStateParams->peerState = WMA_TDLS_PEER_REMOVE_MAC_ADDR;
10517 break;
10518
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010519 default:
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053010520 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010521 FL("invalid peer state param (%d)"),
10522 peerStateParams->peerState);
Kabilan Kannan44f65862016-06-28 23:46:51 -070010523 goto error_return;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010524 }
10525 peer_cap = &(pTdlsPeerStateParams->peerCap);
10526 peer_cap->isPeerResponder =
10527 peerStateParams->peerCap.isPeerResponder;
10528 peer_cap->peerUapsdQueue =
10529 peerStateParams->peerCap.peerUapsdQueue;
10530 peer_cap->peerMaxSp =
10531 peerStateParams->peerCap.peerMaxSp;
10532 peer_cap->peerBuffStaSupport =
10533 peerStateParams->peerCap.peerBuffStaSupport;
10534 peer_cap->peerOffChanSupport =
10535 peerStateParams->peerCap.peerOffChanSupport;
10536 peer_cap->peerCurrOperClass =
10537 peerStateParams->peerCap.peerCurrOperClass;
10538 peer_cap->selfCurrOperClass =
10539 peerStateParams->peerCap.selfCurrOperClass;
10540
10541 num = 0;
Kabilan Kannan44f65862016-06-28 23:46:51 -070010542 peer_chan_len = peerStateParams->peerCap.peerChanLen;
10543
10544 if (peer_chan_len >= 0 &&
10545 peer_chan_len <= SME_TDLS_MAX_SUPP_CHANNELS) {
10546 for (i = 0; i < peerStateParams->peerCap.peerChanLen; i++) {
10547 chanId = peerStateParams->peerCap.peerChan[i];
10548 if (csr_roam_is_channel_valid(pMac, chanId) &&
10549 !(cds_get_channel_state(chanId) ==
10550 CHANNEL_STATE_DFS) &&
10551 !cds_is_dsrc_channel(cds_chan_to_freq(chanId))) {
10552 peer_cap->peerChan[num].chanId = chanId;
10553 peer_cap->peerChan[num].pwr =
10554 csr_get_cfg_max_tx_power(pMac, chanId);
10555 peer_cap->peerChan[num].dfsSet = false;
Archana Ramachandran63f64dd2016-04-28 15:13:35 -070010556 num++;
Kabilan Kannan44f65862016-06-28 23:46:51 -070010557 }
Archana Ramachandran63f64dd2016-04-28 15:13:35 -070010558 }
Kabilan Kannan44f65862016-06-28 23:46:51 -070010559 } else {
10560 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
10561 FL("invalid peer channel len (%d)"),
10562 peer_chan_len);
10563 goto error_return;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010564 }
Kabilan Kannan44f65862016-06-28 23:46:51 -070010565
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010566 peer_cap->peerChanLen = num;
10567 peer_cap->peerOperClassLen =
10568 peerStateParams->peerCap.peerOperClassLen;
10569 for (i = 0; i < HAL_TDLS_MAX_SUPP_OPER_CLASSES; i++) {
10570 peer_cap->peerOperClass[i] =
10571 peerStateParams->peerCap.peerOperClass[i];
10572 }
10573
10574 peer_cap->prefOffChanNum =
10575 peerStateParams->peerCap.prefOffChanNum;
10576 peer_cap->prefOffChanBandwidth =
10577 peerStateParams->peerCap.prefOffChanBandwidth;
Masti, Narayanraddic4a7ab82015-11-25 15:41:10 +053010578 peer_cap->opClassForPrefOffChan =
10579 peerStateParams->peerCap.opClassForPrefOffChan;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010580
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010581 cds_message.type = WMA_UPDATE_TDLS_PEER_STATE;
10582 cds_message.reserved = 0;
10583 cds_message.bodyptr = pTdlsPeerStateParams;
10584
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010585 qdf_status = cds_mq_post_message(CDS_MQ_ID_WMA, &cds_message);
10586 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
Kabilan Kannan44f65862016-06-28 23:46:51 -070010587 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
10588 FL("cds_mq_post_message failed "));
10589 goto error_return;
10590 } else {
10591 goto success_return;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010592 }
Kabilan Kannan44f65862016-06-28 23:46:51 -070010593
10594error_return:
10595 status = QDF_STATUS_E_FAILURE;
10596 qdf_mem_free(pTdlsPeerStateParams);
10597success_return:
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010598 sme_release_global_lock(&pMac->sme);
10599 return status;
10600}
10601
10602/**
10603 * sme_send_tdls_chan_switch_req() - send tdls channel switch request
10604 * @hal: UMAC handler
10605 * @ch_switch_params: Pointer to the chan switch parameter structure
10606 *
10607 * API to set tdls channel switch parameters.
10608 *
Anurag Chouhanf04e84f2016-03-03 10:12:12 +053010609 * Return: QDF_STATUS_SUCCESS on success; another QDF_STATUS_** code otherwise
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010610 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010611QDF_STATUS sme_send_tdls_chan_switch_req(tHalHandle hal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010612 sme_tdls_chan_switch_params *ch_switch_params)
10613{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010614 QDF_STATUS status = QDF_STATUS_SUCCESS;
10615 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010616 tpAniSirGlobal mac = PMAC_STRUCT(hal);
10617 tdls_chan_switch_params *chan_switch_params = NULL;
10618 cds_msg_t cds_message;
10619
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053010620 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Sreelakshmi Konamki6744cff2015-09-07 12:10:39 +053010621 TRACE_CODE_SME_RX_HDD_TDLS_CHAN_SWITCH_REQ,
10622 NO_SESSION, ch_switch_params->tdls_off_channel));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010623 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010624 if (QDF_STATUS_SUCCESS != status)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010625 return status;
Anurag Chouhan600c3a02016-03-01 10:33:54 +053010626 chan_switch_params = qdf_mem_malloc(sizeof(*chan_switch_params));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010627 if (NULL == chan_switch_params) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053010628 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010629 FL("fail to alloc mem for tdls chan switch param"));
10630 sme_release_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010631 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010632 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010633
10634 switch (ch_switch_params->tdls_off_ch_mode) {
10635 case ENABLE_CHANSWITCH:
10636 chan_switch_params->tdls_sw_mode = WMA_TDLS_ENABLE_OFFCHANNEL;
10637 break;
10638
10639 case DISABLE_CHANSWITCH:
10640 chan_switch_params->tdls_sw_mode = WMA_TDLS_DISABLE_OFFCHANNEL;
10641 break;
10642
10643 default:
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053010644 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010645 FL("invalid off channel command (%d)"),
10646 ch_switch_params->tdls_off_ch_mode);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053010647 qdf_mem_free(chan_switch_params);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010648 sme_release_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010649 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010650 }
10651
Anurag Chouhan600c3a02016-03-01 10:33:54 +053010652 qdf_mem_copy(&chan_switch_params->peer_mac_addr,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010653 &ch_switch_params->peer_mac_addr, sizeof(tSirMacAddr));
10654 chan_switch_params->vdev_id = ch_switch_params->vdev_id;
10655 chan_switch_params->tdls_off_ch = ch_switch_params->tdls_off_channel;
10656 chan_switch_params->tdls_off_ch_bw_offset =
10657 ch_switch_params->tdls_off_ch_bw_offset;
10658 chan_switch_params->is_responder = ch_switch_params->is_responder;
Masti, Narayanraddic4a7ab82015-11-25 15:41:10 +053010659 chan_switch_params->oper_class = ch_switch_params->opclass;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010660
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053010661 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010662 FL("Country Code=%s, Req offset=%d, Selected Operate Class=%d"),
10663 mac->scan.countryCodeCurrent,
10664 chan_switch_params->tdls_off_ch_bw_offset,
10665 chan_switch_params->oper_class);
10666
10667 cds_message.type = WMA_TDLS_SET_OFFCHAN_MODE;
10668 cds_message.reserved = 0;
10669 cds_message.bodyptr = chan_switch_params;
10670
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010671 qdf_status = cds_mq_post_message(CDS_MQ_ID_WMA, &cds_message);
10672 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053010673 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010674 FL("Message Post failed status=%d"),
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010675 qdf_status);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053010676 qdf_mem_free(chan_switch_params);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010677 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010678 }
10679 sme_release_global_lock(&mac->sme);
10680 return status;
10681}
10682#endif /* FEATURE_WLAN_TDLS */
10683
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010684QDF_STATUS sme_get_link_speed(tHalHandle hHal, tSirLinkSpeedInfo *lsReq,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010685 void *plsContext,
10686 void (*pCallbackfn)(tSirLinkSpeedInfo *indParam,
10687 void *pContext))
10688{
10689
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010690 QDF_STATUS status = QDF_STATUS_SUCCESS;
10691 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010692 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
10693 cds_msg_t cds_message;
10694
10695 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010696 if (QDF_STATUS_SUCCESS == status) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010697 if ((NULL == pCallbackfn) &&
10698 (NULL == pMac->sme.pLinkSpeedIndCb)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053010699 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010700 "%s: Indication Call back did not registered",
10701 __func__);
10702 sme_release_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010703 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010704 } else if (NULL != pCallbackfn) {
10705 pMac->sme.pLinkSpeedCbContext = plsContext;
10706 pMac->sme.pLinkSpeedIndCb = pCallbackfn;
10707 }
10708 /* serialize the req through MC thread */
10709 cds_message.bodyptr = lsReq;
10710 cds_message.type = WMA_GET_LINK_SPEED;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010711 qdf_status = cds_mq_post_message(CDS_MQ_ID_WMA, &cds_message);
10712 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053010713 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010714 "%s: Post Link Speed msg fail", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010715 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010716 }
10717 sme_release_global_lock(&pMac->sme);
10718 }
10719 return status;
10720}
10721
10722
10723/*
10724 * SME API to enable/disable WLAN driver initiated SSR
10725 */
10726void sme_update_enable_ssr(tHalHandle hHal, bool enableSSR)
10727{
10728 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010729 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010730
10731 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010732 if (QDF_IS_STATUS_SUCCESS(status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053010733 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010734 "SSR level is changed %d", enableSSR);
10735 /* not serializing this messsage, as this is only going
10736 * to set a variable in WMA/WDI
10737 */
10738 WMA_SetEnableSSR(enableSSR);
10739 sme_release_global_lock(&pMac->sme);
10740 }
10741 return;
10742}
10743
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010744QDF_STATUS sme_check_ch_in_band(tpAniSirGlobal mac_ctx, uint8_t start_ch,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010745 uint8_t ch_cnt)
10746{
10747 uint8_t i;
10748 for (i = 0; i < ch_cnt; i++) {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010749 if (QDF_STATUS_SUCCESS != csr_is_valid_channel(mac_ctx,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010750 (start_ch + i*4)))
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010751 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010752 }
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010753 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010754}
10755
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010756/*convert the ini value to the ENUM used in csr and MAC for CB state*/
10757ePhyChanBondState sme_get_cb_phy_state_from_cb_ini_value(uint32_t cb_ini_value)
10758{
10759 return csr_convert_cb_ini_value_to_phy_cb_state(cb_ini_value);
10760}
10761
10762/*--------------------------------------------------------------------------
10763
10764 \brief sme_set_curr_device_mode() - Sets the current operating device mode.
10765 \param hHal - The handle returned by mac_open.
10766 \param currDeviceMode - Current operating device mode.
10767 --------------------------------------------------------------------------*/
10768
Peng Xuf5d60c82015-10-02 17:17:03 -070010769void sme_set_curr_device_mode(tHalHandle hHal,
Anurag Chouhan6d760662016-02-20 16:05:43 +053010770 enum tQDF_ADAPTER_MODE currDeviceMode)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010771{
10772 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
10773 pMac->sme.currDeviceMode = currDeviceMode;
10774 return;
10775}
10776
10777/*--------------------------------------------------------------------------
10778 \brief sme_handoff_request() - a wrapper function to Request a handoff
10779 from CSR.
10780 This is a synchronous call
10781 \param hHal - The handle returned by mac_open
10782 \param sessionId - Session Identifier
10783 \param pHandoffInfo - info provided by HDD with the handoff request (namely:
10784 BSSID, channel etc.)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010785 \return QDF_STATUS_SUCCESS - SME passed the request to CSR successfully.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010786 Other status means SME is failed to send the request.
10787 \sa
10788 --------------------------------------------------------------------------*/
10789
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010790QDF_STATUS sme_handoff_request(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010791 uint8_t sessionId,
10792 tCsrHandoffRequest *pHandoffInfo)
10793{
10794 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010795 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010796
10797 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010798 if (QDF_IS_STATUS_SUCCESS(status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053010799 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010800 "%s: invoked", __func__);
10801 status = csr_handoff_request(pMac, sessionId, pHandoffInfo);
10802 sme_release_global_lock(&pMac->sme);
10803 }
10804
10805 return status;
10806}
10807
10808#ifdef IPA_OFFLOAD
10809/* ---------------------------------------------------------------------------
10810 \fn sme_ipa_offload_enable_disable
10811 \brief API to enable/disable IPA offload
10812 \param hal - The handle returned by macOpen.
10813 \param session_id - Session Identifier
10814 \param request - Pointer to the offload request.
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010815 \return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010816 ---------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010817QDF_STATUS sme_ipa_offload_enable_disable(tHalHandle hal, uint8_t session_id,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010818 struct sir_ipa_offload_enable_disable *request)
10819{
10820 tpAniSirGlobal pMac = PMAC_STRUCT(hal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010821 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010822 struct sir_ipa_offload_enable_disable *request_buf;
10823 cds_msg_t msg;
10824
10825 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010826 if (QDF_STATUS_SUCCESS == status) {
Anurag Chouhan600c3a02016-03-01 10:33:54 +053010827 request_buf = qdf_mem_malloc(sizeof(*request_buf));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010828 if (NULL == request_buf) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053010829 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Jeff Johnson4fa74ce2016-11-08 11:06:02 -080010830 FL("Not able to allocate memory for IPA_OFFLOAD_ENABLE_DISABLE"));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010831 sme_release_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010832 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010833 }
10834
10835 request_buf->offload_type = request->offload_type;
10836 request_buf->vdev_id = request->vdev_id;
10837 request_buf->enable = request->enable;
10838
10839 msg.type = WMA_IPA_OFFLOAD_ENABLE_DISABLE;
10840 msg.reserved = 0;
10841 msg.bodyptr = request_buf;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010842 if (!QDF_IS_STATUS_SUCCESS(
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010843 cds_mq_post_message(CDS_MQ_ID_WMA, &msg))) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053010844 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Jeff Johnson4fa74ce2016-11-08 11:06:02 -080010845 FL("Not able to post WMA_IPA_OFFLOAD_ENABLE_DISABLE message to WMA"));
Anurag Chouhan600c3a02016-03-01 10:33:54 +053010846 qdf_mem_free(request_buf);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010847 sme_release_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010848 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010849 }
10850
10851 sme_release_global_lock(&pMac->sme);
10852 }
10853
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010854 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010855}
10856#endif /* IPA_OFFLOAD */
10857
10858/*
10859 * SME API to check if there is any infra station or
10860 * P2P client is connected
10861 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010862QDF_STATUS sme_is_sta_p2p_client_connected(tHalHandle hHal)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010863{
10864 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
10865 if (csr_is_infra_connected(pMac)) {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010866 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010867 }
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010868 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010869}
10870
10871#ifdef FEATURE_WLAN_LPHB
10872/* ---------------------------------------------------------------------------
10873 \fn sme_lphb_config_req
10874 \API to make configuration LPHB within FW.
10875 \param hHal - The handle returned by mac_open
10876 \param lphdReq - LPHB request argument by client
10877 \param pCallbackfn - LPHB timeout notification callback function pointer
10878 \- return Configuration message posting status, SUCCESS or Fail
10879 -------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010880QDF_STATUS sme_lphb_config_req
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010881 (tHalHandle hHal,
10882 tSirLPHBReq *lphdReq,
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010883 void (*pCallbackfn)(void *pHddCtx, tSirLPHBInd * indParam)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010884 ) {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010885 QDF_STATUS status = QDF_STATUS_SUCCESS;
10886 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010887 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
10888 cds_msg_t cds_message;
10889
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053010890 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Sreelakshmi Konamki6744cff2015-09-07 12:10:39 +053010891 TRACE_CODE_SME_RX_HDD_LPHB_CONFIG_REQ,
10892 NO_SESSION, lphdReq->cmd));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010893 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010894 if (QDF_STATUS_SUCCESS == status) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010895 if ((LPHB_SET_EN_PARAMS_INDID == lphdReq->cmd) &&
10896 (NULL == pCallbackfn) && (NULL == pMac->sme.pLphbIndCb)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053010897 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010898 "%s: Indication Call back did not registered",
10899 __func__);
10900 sme_release_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010901 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010902 } else if (NULL != pCallbackfn) {
10903 pMac->sme.pLphbIndCb = pCallbackfn;
10904 }
10905
10906 /* serialize the req through MC thread */
10907 cds_message.bodyptr = lphdReq;
10908 cds_message.type = WMA_LPHB_CONF_REQ;
Sreelakshmi Konamki6a065362016-05-31 16:05:01 +053010909 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
10910 NO_SESSION, cds_message.type));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010911 qdf_status = cds_mq_post_message(CDS_MQ_ID_WMA, &cds_message);
10912 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053010913 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010914 "%s: Post Config LPHB MSG fail", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010915 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010916 }
10917 sme_release_global_lock(&pMac->sme);
10918 }
10919
10920 return status;
10921}
10922#endif /* FEATURE_WLAN_LPHB */
10923/*--------------------------------------------------------------------------
10924 \brief sme_enable_disable_split_scan() - a wrapper function to set the split
10925 scan parameter.
10926 This is a synchronous call
10927 \param hHal - The handle returned by mac_open
10928 \return NONE.
10929 \sa
10930 --------------------------------------------------------------------------*/
10931void sme_enable_disable_split_scan(tHalHandle hHal, uint8_t nNumStaChan,
10932 uint8_t nNumP2PChan)
10933{
10934 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
10935
10936 pMac->roam.configParam.nNumStaChanCombinedConc = nNumStaChan;
10937 pMac->roam.configParam.nNumP2PChanCombinedConc = nNumP2PChan;
10938
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053010939 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010940 "%s: SCAN nNumStaChanCombinedConc : %d,"
10941 "nNumP2PChanCombinedConc : %d ",
10942 __func__, nNumStaChan, nNumP2PChan);
10943
10944 return;
10945
10946}
10947
10948/**
10949 * sme_add_periodic_tx_ptrn() - Add Periodic TX Pattern
10950 * @hal: global hal handle
10951 * @addPeriodicTxPtrnParams: request message
10952 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010953 * Return: QDF_STATUS enumeration
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010954 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010955QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010956sme_add_periodic_tx_ptrn(tHalHandle hal,
10957 struct sSirAddPeriodicTxPtrn *addPeriodicTxPtrnParams)
10958{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010959 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010960 tpAniSirGlobal mac = PMAC_STRUCT(hal);
10961 struct sSirAddPeriodicTxPtrn *req_msg;
10962 cds_msg_t msg;
10963
10964 sms_log(mac, LOG1, FL("enter"));
10965
Anurag Chouhan600c3a02016-03-01 10:33:54 +053010966 req_msg = qdf_mem_malloc(sizeof(*req_msg));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010967 if (!req_msg) {
10968 sms_log(mac, LOGE, FL("memory allocation failed"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010969 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010970 }
10971
10972 *req_msg = *addPeriodicTxPtrnParams;
10973
10974 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010975 if (!QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010976 sms_log(mac, LOGE,
10977 FL("sme_acquire_global_lock failed!(status=%d)"),
10978 status);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053010979 qdf_mem_free(req_msg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010980 return status;
10981 }
10982
10983 /* Serialize the req through MC thread */
10984 msg.bodyptr = req_msg;
10985 msg.type = WMA_ADD_PERIODIC_TX_PTRN_IND;
Sreelakshmi Konamki6a065362016-05-31 16:05:01 +053010986 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
10987 NO_SESSION, msg.type));
Anurag Chouhan6d760662016-02-20 16:05:43 +053010988 status = cds_mq_post_message(QDF_MODULE_ID_WMA, &msg);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010989 if (!QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010990 sms_log(mac, LOGE,
10991 FL("cds_mq_post_message failed!(err=%d)"),
10992 status);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053010993 qdf_mem_free(req_msg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010994 }
10995 sme_release_global_lock(&mac->sme);
10996 return status;
10997}
10998
10999/**
11000 * sme_del_periodic_tx_ptrn() - Delete Periodic TX Pattern
11001 * @hal: global hal handle
11002 * @delPeriodicTxPtrnParams: request message
11003 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011004 * Return: QDF_STATUS enumeration
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011005 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011006QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011007sme_del_periodic_tx_ptrn(tHalHandle hal,
11008 struct sSirDelPeriodicTxPtrn *delPeriodicTxPtrnParams)
11009{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011010 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011011 tpAniSirGlobal mac = PMAC_STRUCT(hal);
11012 struct sSirDelPeriodicTxPtrn *req_msg;
11013 cds_msg_t msg;
11014
11015 sms_log(mac, LOG1, FL("enter"));
11016
Anurag Chouhan600c3a02016-03-01 10:33:54 +053011017 req_msg = qdf_mem_malloc(sizeof(*req_msg));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011018 if (!req_msg) {
11019 sms_log(mac, LOGE, FL("memory allocation failed"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011020 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011021 }
11022
11023 *req_msg = *delPeriodicTxPtrnParams;
11024
11025 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011026 if (!QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011027 sms_log(mac, LOGE,
11028 FL("sme_acquire_global_lock failed!(status=%d)"),
11029 status);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053011030 qdf_mem_free(req_msg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011031 return status;
11032 }
11033
11034 /* Serialize the req through MC thread */
11035 msg.bodyptr = req_msg;
11036 msg.type = WMA_DEL_PERIODIC_TX_PTRN_IND;
Sreelakshmi Konamki6a065362016-05-31 16:05:01 +053011037 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
11038 NO_SESSION, msg.type));
Anurag Chouhan6d760662016-02-20 16:05:43 +053011039 status = cds_mq_post_message(QDF_MODULE_ID_WMA, &msg);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011040 if (!QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011041 sms_log(mac, LOGE,
11042 FL("cds_mq_post_message failed!(err=%d)"),
11043 status);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053011044 qdf_mem_free(req_msg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011045 }
11046 sme_release_global_lock(&mac->sme);
11047 return status;
11048}
11049
Rajeev Kumar8e3e2832015-11-06 16:02:54 -080011050/**
11051 * sme_enable_rmc() - enables RMC
11052 * @hHal : Pointer to global HAL handle
11053 * @sessionId : Session ID
11054 *
11055 * Return: QDF_STATUS
11056 */
11057QDF_STATUS sme_enable_rmc(tHalHandle hHal, uint32_t sessionId)
11058{
11059 QDF_STATUS status = QDF_STATUS_E_FAILURE;
11060 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
11061 cds_msg_t cds_message;
11062 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
11063
11064 sms_log(pMac, LOG1, FL("enable RMC"));
11065 status = sme_acquire_global_lock(&pMac->sme);
11066 if (QDF_IS_STATUS_SUCCESS(status)) {
11067 cds_message.bodyptr = NULL;
11068 cds_message.type = WMA_RMC_ENABLE_IND;
11069 qdf_status = cds_mq_post_message(CDS_MQ_ID_WMA, &cds_message);
11070 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
11071 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
11072 "%s: failed to post message to WMA",
11073 __func__);
11074 status = QDF_STATUS_E_FAILURE;
11075 }
11076 sme_release_global_lock(&pMac->sme);
11077 }
11078 return status;
11079}
11080
11081/**
11082 * sme_disable_rmc() - disables RMC
11083 * @hHal : Pointer to global HAL handle
11084 * @sessionId : Session ID
11085 *
11086 * Return: QDF_STATUS
11087 */
11088QDF_STATUS sme_disable_rmc(tHalHandle hHal, uint32_t sessionId)
11089{
11090 QDF_STATUS status = QDF_STATUS_E_FAILURE;
11091 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
11092 cds_msg_t cds_message;
11093 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
11094
11095 sms_log(pMac, LOG1, FL("disable RMC"));
11096 status = sme_acquire_global_lock(&pMac->sme);
11097 if (QDF_IS_STATUS_SUCCESS(status)) {
11098 cds_message.bodyptr = NULL;
11099 cds_message.type = WMA_RMC_DISABLE_IND;
11100 qdf_status = cds_mq_post_message(CDS_MQ_ID_WMA, &cds_message);
11101 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
11102 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
11103 "%s: failed to post message to WMA",
11104 __func__);
11105 status = QDF_STATUS_E_FAILURE;
11106 }
11107 sme_release_global_lock(&pMac->sme);
11108 }
11109 return status;
11110}
11111
11112/**
11113 * sme_send_rmc_action_period() - sends RMC action period param to target
11114 * @hHal : Pointer to global HAL handle
11115 * @sessionId : Session ID
11116 *
11117 * Return: QDF_STATUS
11118 */
11119QDF_STATUS sme_send_rmc_action_period(tHalHandle hHal, uint32_t sessionId)
11120{
11121 QDF_STATUS status = QDF_STATUS_SUCCESS;
11122 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
11123 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
11124 cds_msg_t cds_message;
11125
11126 status = sme_acquire_global_lock(&pMac->sme);
11127 if (QDF_STATUS_SUCCESS == status) {
11128 cds_message.bodyptr = NULL;
11129 cds_message.type = WMA_RMC_ACTION_PERIOD_IND;
11130 qdf_status = cds_mq_post_message(CDS_MQ_ID_WMA, &cds_message);
11131 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
11132 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
11133 "%s: failed to post message to WMA",
11134 __func__);
11135 status = QDF_STATUS_E_FAILURE;
11136 }
11137 sme_release_global_lock(&pMac->sme);
11138 }
11139
11140 return status;
11141}
11142
11143/**
11144 * sme_request_ibss_peer_info() - request ibss peer info
11145 * @hHal : Pointer to global HAL handle
11146 * @pUserData : Pointer to user data
11147 * @peerInfoCbk : Peer info callback
11148 * @allPeerInfoReqd : All peer info required or not
11149 * @staIdx : sta index
11150 *
11151 * Return: QDF_STATUS
11152 */
11153QDF_STATUS sme_request_ibss_peer_info(tHalHandle hHal, void *pUserData,
11154 pIbssPeerInfoCb peerInfoCbk,
11155 bool allPeerInfoReqd, uint8_t staIdx)
11156{
11157 QDF_STATUS status = QDF_STATUS_E_FAILURE;
11158 QDF_STATUS qdf_status = QDF_STATUS_E_FAILURE;
11159 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
11160 cds_msg_t cds_message;
11161 tSirIbssGetPeerInfoReqParams *pIbssInfoReqParams;
11162
11163 status = sme_acquire_global_lock(&pMac->sme);
11164 if (QDF_STATUS_SUCCESS == status) {
11165 pMac->sme.peerInfoParams.peerInfoCbk = peerInfoCbk;
11166 pMac->sme.peerInfoParams.pUserData = pUserData;
11167
11168 pIbssInfoReqParams = (tSirIbssGetPeerInfoReqParams *)
11169 qdf_mem_malloc(sizeof(tSirIbssGetPeerInfoReqParams));
11170 if (NULL == pIbssInfoReqParams) {
11171 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
11172 "%s: Not able to allocate memory for dhcp start",
11173 __func__);
11174 sme_release_global_lock(&pMac->sme);
11175 return QDF_STATUS_E_NOMEM;
11176 }
11177 pIbssInfoReqParams->allPeerInfoReqd = allPeerInfoReqd;
11178 pIbssInfoReqParams->staIdx = staIdx;
11179
11180 cds_message.type = WMA_GET_IBSS_PEER_INFO_REQ;
11181 cds_message.bodyptr = pIbssInfoReqParams;
11182 cds_message.reserved = 0;
11183
11184 qdf_status = cds_mq_post_message(CDS_MQ_ID_WMA, &cds_message);
11185 if (QDF_STATUS_SUCCESS != qdf_status) {
11186 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
11187 "%s: Post WMA_GET_IBSS_PEER_INFO_REQ MSG failed",
11188 __func__);
11189 qdf_mem_free(pIbssInfoReqParams);
11190 qdf_status = QDF_STATUS_E_FAILURE;
11191 }
11192 sme_release_global_lock(&pMac->sme);
11193 }
11194
11195 return qdf_status;
11196}
11197
11198/* ---------------------------------------------------------------------------
11199 \fn sme_send_cesium_enable_ind
11200 \brief Used to send proprietary cesium enable indication to fw
11201 \param hHal
11202 \param sessionId
11203 \- return QDF_STATUS
11204 -------------------------------------------------------------------------*/
11205QDF_STATUS sme_send_cesium_enable_ind(tHalHandle hHal, uint32_t sessionId)
11206{
11207 QDF_STATUS status = QDF_STATUS_SUCCESS;
11208 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
11209 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
11210 cds_msg_t cds_message;
11211
11212 status = sme_acquire_global_lock(&pMac->sme);
11213 if (QDF_STATUS_SUCCESS == status) {
11214 cds_message.bodyptr = NULL;
11215 cds_message.type = WMA_IBSS_CESIUM_ENABLE_IND;
11216 qdf_status = cds_mq_post_message(CDS_MQ_ID_WMA, &cds_message);
11217 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
11218 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
11219 "%s: failed to post message to WMA",
11220 __func__);
11221 status = QDF_STATUS_E_FAILURE;
11222 }
11223 sme_release_global_lock(&pMac->sme);
11224 }
11225
11226 return status;
11227}
11228
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011229void sme_get_command_q_status(tHalHandle hHal)
11230{
11231 tSmeCmd *pTempCmd = NULL;
11232 tListElem *pEntry;
11233 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
11234
11235 if (NULL == pMac) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053011236 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011237 "%s: pMac is NULL", __func__);
11238 return;
11239 }
11240
11241 pEntry = csr_ll_peek_head(&pMac->sme.smeCmdActiveList, LL_ACCESS_LOCK);
11242 if (pEntry) {
11243 pTempCmd = GET_BASE_ADDR(pEntry, tSmeCmd, Link);
11244 }
11245 sms_log(pMac, LOGE, "Currently smeCmdActiveList has command (0x%X)",
11246 (pTempCmd) ? pTempCmd->command : eSmeNoCommand);
11247 if (pTempCmd) {
11248 if (eSmeCsrCommandMask & pTempCmd->command) {
11249 /* CSR command is stuck. See what the reason code is for that command */
11250 dump_csr_command_info(pMac, pTempCmd);
11251 }
11252 } /* if(pTempCmd) */
11253
11254 sms_log(pMac, LOGE, "Currently smeCmdPendingList has %d commands",
11255 csr_ll_count(&pMac->sme.smeCmdPendingList));
11256
11257 sms_log(pMac, LOGE, "Currently roamCmdPendingList has %d commands",
11258 csr_ll_count(&pMac->roam.roamCmdPendingList));
11259
11260 return;
11261}
Kiran Kumar Lokere1aa9c9a2016-10-05 18:50:59 -070011262/**
11263 * sme_set_prefer_80MHz_over_160MHz() - API to set sta_prefer_80MHz_over_160MHz
11264 * @hal: The handle returned by macOpen
11265 * @sta_prefer_80MHz_over_160MHz: sta_prefer_80MHz_over_160MHz config param
11266 */
11267void sme_set_prefer_80MHz_over_160MHz(tHalHandle hal,
11268 bool sta_prefer_80MHz_over_160MHz)
11269{
11270 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
11271 mac_ctx->sta_prefer_80MHz_over_160MHz = sta_prefer_80MHz_over_160MHz;
11272}
11273
Agrawal Ashishb141b092016-09-02 19:59:26 +053011274#ifdef WLAN_FEATURE_DSRC
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011275/**
11276 * sme_set_dot11p_config() - API to set the 802.11p config
11277 * @hHal: The handle returned by macOpen
11278 * @enable_dot11p: 802.11p config param
11279 */
11280void sme_set_dot11p_config(tHalHandle hHal, bool enable_dot11p)
11281{
11282 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
11283 pMac->enable_dot11p = enable_dot11p;
11284}
11285
11286/**
11287 * copy_sir_ocb_config() - Performs deep copy of an OCB configuration
11288 * @src: the source configuration
11289 *
11290 * Return: pointer to the copied OCB configuration
11291 */
11292static struct sir_ocb_config *sme_copy_sir_ocb_config(
11293 struct sir_ocb_config *src)
11294{
11295 struct sir_ocb_config *dst;
11296 uint32_t length;
11297 void *cursor;
11298
11299 length = sizeof(*src) +
11300 src->channel_count * sizeof(*src->channels) +
11301 src->schedule_size * sizeof(*src->schedule) +
11302 src->dcc_ndl_chan_list_len +
11303 src->dcc_ndl_active_state_list_len;
11304
Anurag Chouhan600c3a02016-03-01 10:33:54 +053011305 dst = qdf_mem_malloc(length);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011306 if (!dst)
11307 return NULL;
11308
11309 *dst = *src;
11310
11311 cursor = dst;
11312 cursor += sizeof(*dst);
11313 dst->channels = cursor;
11314 cursor += src->channel_count * sizeof(*src->channels);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053011315 qdf_mem_copy(dst->channels, src->channels,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011316 src->channel_count * sizeof(*src->channels));
11317 dst->schedule = cursor;
11318 cursor += src->schedule_size * sizeof(*src->schedule);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053011319 qdf_mem_copy(dst->schedule, src->schedule,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011320 src->schedule_size * sizeof(*src->schedule));
11321 dst->dcc_ndl_chan_list = cursor;
11322 cursor += src->dcc_ndl_chan_list_len;
Anurag Chouhan600c3a02016-03-01 10:33:54 +053011323 qdf_mem_copy(dst->dcc_ndl_chan_list, src->dcc_ndl_chan_list,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011324 src->dcc_ndl_chan_list_len);
11325 dst->dcc_ndl_active_state_list = cursor;
11326 cursor += src->dcc_ndl_active_state_list_len;
Anurag Chouhan600c3a02016-03-01 10:33:54 +053011327 qdf_mem_copy(dst->dcc_ndl_active_state_list,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011328 src->dcc_ndl_active_state_list,
11329 src->dcc_ndl_active_state_list_len);
11330 return dst;
11331}
11332
11333/**
11334 * sme_ocb_set_config() - Set the OCB configuration
11335 * @hHal: reference to the HAL
11336 * @context: the context of the call
11337 * @callback: the callback to hdd
11338 * @config: the OCB configuration
11339 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011340 * Return: QDF_STATUS_SUCCESS on success, QDF_STATUS_E_FAILURE on failure
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011341 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011342QDF_STATUS sme_ocb_set_config(tHalHandle hHal, void *context,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011343 ocb_callback callback,
11344 struct sir_ocb_config *config)
11345{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011346 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011347 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
11348 cds_msg_t msg = {0};
11349 struct sir_ocb_config *msg_body;
11350
11351 /* Lock the SME structure */
11352 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011353 if (!QDF_IS_STATUS_SUCCESS(status))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011354 return status;
11355
11356 /*
11357 * Check if there is a pending request and return an error if one
11358 * exists
11359 */
11360 if (pMac->sme.ocb_set_config_callback) {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011361 status = QDF_STATUS_E_BUSY;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011362 goto end;
11363 }
11364
11365 msg_body = sme_copy_sir_ocb_config(config);
11366
11367 if (!msg_body) {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011368 status = QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011369 goto end;
11370 }
11371
11372 msg.type = WMA_OCB_SET_CONFIG_CMD;
11373 msg.bodyptr = msg_body;
11374
11375 /* Set the request callback and context */
11376 pMac->sme.ocb_set_config_callback = callback;
11377 pMac->sme.ocb_set_config_context = context;
11378
Anurag Chouhan6d760662016-02-20 16:05:43 +053011379 status = cds_mq_post_message(QDF_MODULE_ID_WMA, &msg);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011380 if (!QDF_IS_STATUS_SUCCESS(status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053011381 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011382 FL("Error posting message to WDA: %d"), status);
11383 pMac->sme.ocb_set_config_callback = callback;
11384 pMac->sme.ocb_set_config_context = context;
Anurag Chouhan600c3a02016-03-01 10:33:54 +053011385 qdf_mem_free(msg_body);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011386 goto end;
11387 }
11388
11389end:
11390 sme_release_global_lock(&pMac->sme);
11391
11392 return status;
11393}
11394
11395/**
11396 * sme_ocb_set_utc_time() - Set the OCB UTC time
11397 * @hHal: reference to the HAL
11398 * @utc: the UTC time struct
11399 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011400 * Return: QDF_STATUS_SUCCESS on success, QDF_STATUS_E_FAILURE on failure
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011401 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011402QDF_STATUS sme_ocb_set_utc_time(tHalHandle hHal, struct sir_ocb_utc *utc)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011403{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011404 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011405 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
11406 cds_msg_t msg = {0};
11407 struct sir_ocb_utc *sme_utc;
11408
11409 /* Lock the SME structure */
11410 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011411 if (!QDF_IS_STATUS_SUCCESS(status))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011412 return status;
11413
Anurag Chouhan600c3a02016-03-01 10:33:54 +053011414 sme_utc = qdf_mem_malloc(sizeof(*sme_utc));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011415 if (!sme_utc) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053011416 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011417 FL("Malloc failed"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011418 status = QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011419 goto end;
11420 }
11421 *sme_utc = *utc;
11422
11423 msg.type = WMA_OCB_SET_UTC_TIME_CMD;
11424 msg.reserved = 0;
11425 msg.bodyptr = sme_utc;
Anurag Chouhan6d760662016-02-20 16:05:43 +053011426 status = cds_mq_post_message(QDF_MODULE_ID_WMA, &msg);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011427 if (!QDF_IS_STATUS_SUCCESS(status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053011428 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011429 FL("Not able to post message to WDA"));
Anurag Chouhan600c3a02016-03-01 10:33:54 +053011430 qdf_mem_free(utc);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011431 goto end;
11432 }
11433
11434end:
11435 sme_release_global_lock(&pMac->sme);
11436
11437 return status;
11438}
11439
11440/**
11441 * sme_ocb_start_timing_advert() - Start sending timing advert frames
11442 * @hHal: reference to the HAL
11443 * @timing_advert: the timing advertisement struct
11444 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011445 * Return: QDF_STATUS_SUCCESS on success, QDF_STATUS_E_FAILURE on failure
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011446 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011447QDF_STATUS sme_ocb_start_timing_advert(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011448 struct sir_ocb_timing_advert *timing_advert)
11449{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011450 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011451 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
11452 cds_msg_t msg = {0};
11453 void *buf;
11454 struct sir_ocb_timing_advert *sme_timing_advert;
11455
11456 /* Lock the SME structure */
11457 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011458 if (!QDF_IS_STATUS_SUCCESS(status))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011459 return status;
11460
Anurag Chouhan600c3a02016-03-01 10:33:54 +053011461 buf = qdf_mem_malloc(sizeof(*sme_timing_advert) +
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011462 timing_advert->template_length);
11463 if (!buf) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053011464 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011465 FL("Not able to allocate memory for start TA"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011466 status = QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011467 goto end;
11468 }
11469
11470 sme_timing_advert = (struct sir_ocb_timing_advert *)buf;
11471 *sme_timing_advert = *timing_advert;
11472 sme_timing_advert->template_value = buf + sizeof(*sme_timing_advert);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053011473 qdf_mem_copy(sme_timing_advert->template_value,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011474 timing_advert->template_value, timing_advert->template_length);
11475
11476 msg.type = WMA_OCB_START_TIMING_ADVERT_CMD;
11477 msg.reserved = 0;
11478 msg.bodyptr = buf;
Anurag Chouhan6d760662016-02-20 16:05:43 +053011479 status = cds_mq_post_message(QDF_MODULE_ID_WMA, &msg);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011480 if (!QDF_IS_STATUS_SUCCESS(status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053011481 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011482 FL("Not able to post msg to WDA"));
11483 goto end;
11484 }
11485
11486end:
11487 sme_release_global_lock(&pMac->sme);
11488
11489 return status;
11490}
11491
11492/**
11493 * sme_ocb_stop_timing_advert() - Stop sending timing advert frames on a channel
11494 * @hHal: reference to the HAL
11495 * @timing_advert: the timing advertisement struct
11496 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011497 * Return: QDF_STATUS_SUCCESS on success, QDF_STATUS_E_FAILURE on failure
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011498 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011499QDF_STATUS sme_ocb_stop_timing_advert(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011500 struct sir_ocb_timing_advert *timing_advert)
11501{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011502 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011503 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
11504 cds_msg_t msg = {0};
11505 struct sir_ocb_timing_advert *sme_timing_advert;
11506
11507 /* Lock the SME structure */
11508 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011509 if (!QDF_IS_STATUS_SUCCESS(status))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011510 return status;
11511
Anurag Chouhan600c3a02016-03-01 10:33:54 +053011512 sme_timing_advert = qdf_mem_malloc(sizeof(*timing_advert));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011513 if (!sme_timing_advert) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053011514 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011515 FL("Not able to allocate memory for stop TA"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011516 status = QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011517 goto end;
11518 }
11519 *sme_timing_advert = *timing_advert;
11520
11521 msg.type = WMA_OCB_STOP_TIMING_ADVERT_CMD;
11522 msg.reserved = 0;
11523 msg.bodyptr = sme_timing_advert;
Anurag Chouhan6d760662016-02-20 16:05:43 +053011524 status = cds_mq_post_message(QDF_MODULE_ID_WMA, &msg);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011525 if (!QDF_IS_STATUS_SUCCESS(status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053011526 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011527 FL("Not able to post msg to WDA"));
11528 goto end;
11529 }
11530
11531end:
11532 sme_release_global_lock(&pMac->sme);
11533
11534 return status;
11535}
11536
11537/**
Naveen Rawatb4d37622015-11-13 16:15:25 -080011538 * sme_ocb_gen_timing_advert_frame() - generate TA frame and populate the buffer
11539 * @hal_handle: reference to the HAL
11540 * @self_addr: the self MAC address
11541 * @buf: the buffer that will contain the frame
11542 * @timestamp_offset: return for the offset of the timestamp field
11543 * @time_value_offset: return for the time_value field in the TA IE
11544 *
11545 * Return: the length of the buffer.
11546 */
11547int sme_ocb_gen_timing_advert_frame(tHalHandle hal_handle,
11548 tSirMacAddr self_addr, uint8_t **buf,
11549 uint32_t *timestamp_offset,
11550 uint32_t *time_value_offset)
11551{
11552 int template_length;
11553 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal_handle);
11554
11555 template_length = sch_gen_timing_advert_frame(mac_ctx, self_addr, buf,
11556 timestamp_offset,
11557 time_value_offset);
11558 return template_length;
11559}
11560/**
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011561 * sme_ocb_get_tsf_timer() - Get the TSF timer value
11562 * @hHal: reference to the HAL
11563 * @context: the context of the call
11564 * @callback: the callback to hdd
11565 * @request: the TSF timer request
11566 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011567 * Return: QDF_STATUS_SUCCESS on success, QDF_STATUS_E_FAILURE on failure
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011568 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011569QDF_STATUS sme_ocb_get_tsf_timer(tHalHandle hHal, void *context,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011570 ocb_callback callback,
11571 struct sir_ocb_get_tsf_timer *request)
11572{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011573 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011574 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
11575 cds_msg_t msg = {0};
11576 struct sir_ocb_get_tsf_timer *msg_body;
11577
11578 /* Lock the SME structure */
11579 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011580 if (!QDF_IS_STATUS_SUCCESS(status))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011581 return status;
11582
11583 /* Allocate memory for the WMI request, and copy the parameter */
Anurag Chouhan600c3a02016-03-01 10:33:54 +053011584 msg_body = qdf_mem_malloc(sizeof(*msg_body));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011585 if (!msg_body) {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011586 status = QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011587 goto end;
11588 }
11589 *msg_body = *request;
11590
11591 msg.type = WMA_OCB_GET_TSF_TIMER_CMD;
11592 msg.bodyptr = msg_body;
11593
11594 /* Set the request callback and the context */
11595 pMac->sme.ocb_get_tsf_timer_callback = callback;
11596 pMac->sme.ocb_get_tsf_timer_context = context;
11597
11598 /* Post the message to WDA */
Anurag Chouhan6d760662016-02-20 16:05:43 +053011599 status = cds_mq_post_message(QDF_MODULE_ID_WMA, &msg);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011600 if (!QDF_IS_STATUS_SUCCESS(status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053011601 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011602 FL("Error posting message to WDA: %d"), status);
11603 pMac->sme.ocb_get_tsf_timer_callback = NULL;
11604 pMac->sme.ocb_get_tsf_timer_context = NULL;
Anurag Chouhan600c3a02016-03-01 10:33:54 +053011605 qdf_mem_free(msg_body);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011606 goto end;
11607 }
11608
11609end:
11610 sme_release_global_lock(&pMac->sme);
11611
11612 return status;
11613}
11614
11615/**
11616 * sme_dcc_get_stats() - Get the DCC stats
11617 * @hHal: reference to the HAL
11618 * @context: the context of the call
11619 * @callback: the callback to hdd
11620 * @request: the get DCC stats request
11621 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011622 * Return: QDF_STATUS_SUCCESS on success, QDF_STATUS_E_FAILURE on failure
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011623 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011624QDF_STATUS sme_dcc_get_stats(tHalHandle hHal, void *context,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011625 ocb_callback callback,
11626 struct sir_dcc_get_stats *request)
11627{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011628 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011629 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
11630 cds_msg_t msg = {0};
11631 struct sir_dcc_get_stats *msg_body;
11632
11633 /* Lock the SME structure */
11634 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011635 if (!QDF_IS_STATUS_SUCCESS(status))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011636 return status;
11637
11638 /* Allocate memory for the WMI request, and copy the parameter */
Anurag Chouhan600c3a02016-03-01 10:33:54 +053011639 msg_body = qdf_mem_malloc(sizeof(*msg_body) +
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011640 request->request_array_len);
11641 if (!msg_body) {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011642 status = QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011643 goto end;
11644 }
11645 *msg_body = *request;
11646 msg_body->request_array = (void *)msg_body + sizeof(*msg_body);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053011647 qdf_mem_copy(msg_body->request_array, request->request_array,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011648 request->request_array_len);
11649
11650 msg.type = WMA_DCC_GET_STATS_CMD;
11651 msg.bodyptr = msg_body;
11652
11653 /* Set the request callback and context */
11654 pMac->sme.dcc_get_stats_callback = callback;
11655 pMac->sme.dcc_get_stats_context = context;
11656
Anurag Chouhan6d760662016-02-20 16:05:43 +053011657 status = cds_mq_post_message(QDF_MODULE_ID_WMA, &msg);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011658 if (!QDF_IS_STATUS_SUCCESS(status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053011659 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011660 FL("Error posting message to WDA: %d"), status);
11661 pMac->sme.dcc_get_stats_callback = callback;
11662 pMac->sme.dcc_get_stats_context = context;
Anurag Chouhan600c3a02016-03-01 10:33:54 +053011663 qdf_mem_free(msg_body);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011664 goto end;
11665 }
11666
11667end:
11668 sme_release_global_lock(&pMac->sme);
11669
11670 return status;
11671}
11672
11673/**
11674 * sme_dcc_clear_stats() - Clear the DCC stats
11675 * @hHal: reference to the HAL
11676 * @vdev_id: vdev id for OCB interface
11677 * @dcc_stats_bitmap: the entries in the stats to clear
11678 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011679 * Return: QDF_STATUS_SUCCESS on success, QDF_STATUS_E_FAILURE on failure
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011680 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011681QDF_STATUS sme_dcc_clear_stats(tHalHandle hHal, uint32_t vdev_id,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011682 uint32_t dcc_stats_bitmap)
11683{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011684 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011685 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
11686 cds_msg_t msg = {0};
11687 struct sir_dcc_clear_stats *request;
11688
11689 /* Lock the SME structure */
11690 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011691 if (!QDF_IS_STATUS_SUCCESS(status))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011692 return status;
11693
Anurag Chouhan600c3a02016-03-01 10:33:54 +053011694 request = qdf_mem_malloc(sizeof(struct sir_dcc_clear_stats));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011695 if (!request) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053011696 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011697 FL("Not able to allocate memory"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011698 status = QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011699 goto end;
11700 }
11701
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011702 request->vdev_id = vdev_id;
11703 request->dcc_stats_bitmap = dcc_stats_bitmap;
11704
11705 msg.type = WMA_DCC_CLEAR_STATS_CMD;
11706 msg.bodyptr = request;
11707
Anurag Chouhan6d760662016-02-20 16:05:43 +053011708 status = cds_mq_post_message(QDF_MODULE_ID_WMA, &msg);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011709 if (!QDF_IS_STATUS_SUCCESS(status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053011710 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011711 FL("Not able to post msg to WDA"));
Anurag Chouhan600c3a02016-03-01 10:33:54 +053011712 qdf_mem_free(request);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011713 goto end;
11714 }
11715
11716end:
11717 sme_release_global_lock(&pMac->sme);
11718
11719 return status;
11720}
11721
11722/**
11723 * sme_dcc_update_ndl() - Update the DCC settings
11724 * @hHal: reference to the HAL
11725 * @context: the context of the call
11726 * @callback: the callback to hdd
11727 * @request: the update DCC request
11728 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011729 * Return: QDF_STATUS_SUCCESS on success, QDF_STATUS_E_FAILURE on failure
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011730 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011731QDF_STATUS sme_dcc_update_ndl(tHalHandle hHal, void *context,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011732 ocb_callback callback,
11733 struct sir_dcc_update_ndl *request)
11734{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011735 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011736 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
11737 cds_msg_t msg = {0};
11738 struct sir_dcc_update_ndl *msg_body;
11739
11740 /* Lock the SME structure */
11741 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011742 if (!QDF_IS_STATUS_SUCCESS(status))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011743 return status;
11744
11745 /* Allocate memory for the WMI request, and copy the parameter */
Anurag Chouhan600c3a02016-03-01 10:33:54 +053011746 msg_body = qdf_mem_malloc(sizeof(*msg_body) +
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011747 request->dcc_ndl_chan_list_len +
11748 request->dcc_ndl_active_state_list_len);
11749 if (!msg_body) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053011750 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011751 FL("Failed to allocate memory"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011752 status = QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011753 goto end;
11754 }
11755
11756 *msg_body = *request;
11757
11758 msg_body->dcc_ndl_chan_list = (void *)msg_body + sizeof(*msg_body);
11759 msg_body->dcc_ndl_active_state_list = msg_body->dcc_ndl_chan_list +
11760 request->dcc_ndl_chan_list_len;
Anurag Chouhan600c3a02016-03-01 10:33:54 +053011761 qdf_mem_copy(msg_body->dcc_ndl_chan_list, request->dcc_ndl_chan_list,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011762 request->dcc_ndl_active_state_list_len);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053011763 qdf_mem_copy(msg_body->dcc_ndl_active_state_list,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011764 request->dcc_ndl_active_state_list,
11765 request->dcc_ndl_active_state_list_len);
11766
11767 msg.type = WMA_DCC_UPDATE_NDL_CMD;
11768 msg.bodyptr = msg_body;
11769
11770 /* Set the request callback and the context */
11771 pMac->sme.dcc_update_ndl_callback = callback;
11772 pMac->sme.dcc_update_ndl_context = context;
11773
Anurag Chouhan6d760662016-02-20 16:05:43 +053011774 status = cds_mq_post_message(QDF_MODULE_ID_WMA, &msg);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011775 if (!QDF_IS_STATUS_SUCCESS(status)) {
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 FL("Error posting message to WDA: %d"), status);
11778 pMac->sme.dcc_update_ndl_callback = NULL;
11779 pMac->sme.dcc_update_ndl_context = NULL;
Anurag Chouhan600c3a02016-03-01 10:33:54 +053011780 qdf_mem_free(msg_body);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011781 goto end;
11782 }
11783
11784end:
11785 sme_release_global_lock(&pMac->sme);
11786
11787 return status;
11788}
11789
11790/**
11791 * sme_register_for_dcc_stats_event() - Register for the periodic DCC stats
11792 * event
11793 * @hHal: reference to the HAL
11794 * @context: the context of the call
11795 * @callback: the callback to hdd
11796 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011797 * Return: QDF_STATUS_SUCCESS on success, QDF_STATUS_E_FAILURE on failure
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011798 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011799QDF_STATUS sme_register_for_dcc_stats_event(tHalHandle hHal, void *context,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011800 ocb_callback callback)
11801{
11802 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011803 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011804
11805 status = sme_acquire_global_lock(&pMac->sme);
11806 pMac->sme.dcc_stats_event_callback = callback;
11807 pMac->sme.dcc_stats_event_context = context;
11808 sme_release_global_lock(&pMac->sme);
11809
11810 return 0;
11811}
11812
Arun Khandavalli4b55da72016-07-19 19:55:01 +053011813/**
11814 * sme_deregister_for_dcc_stats_event() - De-Register for the periodic DCC stats
11815 * event
11816 * @h_hal: Hal Handle
11817 *
11818 * This function de-registers the DCC perioc stats callback
11819 *
11820 * Return: QDF_STATUS Enumeration
11821 */
11822QDF_STATUS sme_deregister_for_dcc_stats_event(tHalHandle h_hal)
11823{
11824 tpAniSirGlobal mac;
11825 QDF_STATUS status;
11826
11827 if (!h_hal) {
11828 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
11829 FL("h_hal is not valid"));
11830 return QDF_STATUS_E_INVAL;
11831 }
11832 mac = PMAC_STRUCT(h_hal);
11833
11834 status = sme_acquire_global_lock(&mac->sme);
11835 if (!QDF_IS_STATUS_SUCCESS(status)) {
11836 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
11837 FL("Failed to acquire global lock"));
11838 return status;
11839 }
11840 mac->sme.dcc_stats_event_callback = NULL;
11841 mac->sme.dcc_stats_event_context = NULL;
11842 sme_release_global_lock(&mac->sme);
11843
11844 return status;
11845}
Agrawal Ashishb141b092016-09-02 19:59:26 +053011846#endif
Arun Khandavalli4b55da72016-07-19 19:55:01 +053011847
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011848void sme_get_recovery_stats(tHalHandle hHal)
11849{
11850 uint8_t i;
11851
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053011852 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011853 "Self Recovery Stats");
11854 for (i = 0; i < MAX_ACTIVE_CMD_STATS; i++) {
11855 if (eSmeNoCommand !=
11856 g_self_recovery_stats.activeCmdStats[i].command) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053011857 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011858 "timestamp %llu: command 0x%0X: reason %d: session %d",
11859 g_self_recovery_stats.activeCmdStats[i].
11860 timestamp,
11861 g_self_recovery_stats.activeCmdStats[i].command,
11862 g_self_recovery_stats.activeCmdStats[i].reason,
11863 g_self_recovery_stats.activeCmdStats[i].
11864 sessionId);
11865 }
11866 }
11867}
11868
11869/**
11870 * sme_save_active_cmd_stats() - To save active command stats
11871 * @hHal: HAL context
11872 *
11873 * This routine is to save active command stats
11874 *
11875 * Return: None
11876 */
Jeff Johnson49c02f92016-10-07 10:29:09 -070011877static void sme_save_active_cmd_stats(tHalHandle hHal)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011878{
11879 tSmeCmd *pTempCmd = NULL;
11880 tListElem *pEntry;
11881 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
11882 uint8_t statidx = 0;
11883 tActiveCmdStats *actv_cmd_stat = NULL;
11884
11885 if (NULL == pMac) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053011886 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011887 FL("pMac is NULL"));
11888 return;
11889 }
11890
11891 pEntry = csr_ll_peek_head(&pMac->sme.smeCmdActiveList, LL_ACCESS_LOCK);
11892 if (pEntry)
11893 pTempCmd = GET_BASE_ADDR(pEntry, tSmeCmd, Link);
11894
11895 if (!pTempCmd)
11896 return;
11897
11898 if (eSmeCsrCommandMask & pTempCmd->command) {
11899 statidx = g_self_recovery_stats.cmdStatsIndx;
11900 actv_cmd_stat = &g_self_recovery_stats.activeCmdStats[statidx];
11901 actv_cmd_stat->command = pTempCmd->command;
11902 actv_cmd_stat->sessionId = pTempCmd->sessionId;
11903 actv_cmd_stat->timestamp = cds_get_monotonic_boottime();
11904 if (eSmeCommandRoam == pTempCmd->command)
11905 actv_cmd_stat->reason = pTempCmd->u.roamCmd.roamReason;
11906 else if (eSmeCommandScan == pTempCmd->command)
11907 actv_cmd_stat->reason = pTempCmd->u.scanCmd.reason;
11908 else
11909 actv_cmd_stat->reason = 0xFF;
11910
11911 g_self_recovery_stats.cmdStatsIndx =
11912 ((g_self_recovery_stats.cmdStatsIndx + 1) &
11913 (MAX_ACTIVE_CMD_STATS - 1));
11914 }
11915 return;
11916}
11917
11918void active_list_cmd_timeout_handle(void *userData)
11919{
Abhishek Singh5ea86532016-04-27 14:10:53 +053011920 tHalHandle hal = (tHalHandle)userData;
11921 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
Kapil Gupta63ddab22016-08-09 16:41:24 +053011922 tListElem *entry;
11923 tSmeCmd *temp_cmd = NULL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011924
Abhishek Singh5ea86532016-04-27 14:10:53 +053011925 if (NULL == mac_ctx) {
11926 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
11927 "%s: mac_ctx is null", __func__);
11928 return;
11929 }
11930 /* Return if no cmd pending in active list as
11931 * in this case we should not be here.
11932 */
11933 if (0 == csr_ll_count(&mac_ctx->sme.smeCmdActiveList))
11934 return;
11935 sms_log(mac_ctx, LOGE,
11936 FL("Active List command timeout Cmd List Count %d"),
11937 csr_ll_count(&mac_ctx->sme.smeCmdActiveList));
11938 sme_get_command_q_status(hal);
11939
11940 if (mac_ctx->roam.configParam.enable_fatal_event)
11941 cds_flush_logs(WLAN_LOG_TYPE_FATAL,
11942 WLAN_LOG_INDICATOR_HOST_DRIVER,
11943 WLAN_LOG_REASON_SME_COMMAND_STUCK,
11944 false,
11945 mac_ctx->sme.enableSelfRecovery ? true : false);
11946 else
11947 qdf_trace_dump_all(mac_ctx, 0, 0, 500, 0);
11948
Kapil Gupta63ddab22016-08-09 16:41:24 +053011949 entry = csr_ll_peek_head(&mac_ctx->sme.smeCmdActiveList,
11950 LL_ACCESS_LOCK);
11951 if (entry)
11952 temp_cmd = GET_BASE_ADDR(entry, tSmeCmd, Link);
11953 /* Ignore if ROC took more than 120 sec */
11954 if (temp_cmd && (eSmeCommandRemainOnChannel == temp_cmd->command))
11955 return;
11956
Abhishek Singh5ea86532016-04-27 14:10:53 +053011957 if (mac_ctx->sme.enableSelfRecovery) {
11958 sme_save_active_cmd_stats(hal);
Mukul Sharmab7b575b2016-10-02 23:37:07 +053011959 cds_trigger_recovery(false);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011960 } else {
Abhishek Singh5ea86532016-04-27 14:10:53 +053011961 if (!mac_ctx->roam.configParam.enable_fatal_event &&
11962 !(cds_is_load_or_unload_in_progress() ||
11963 cds_is_driver_recovering()))
11964 QDF_BUG(0);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011965 }
11966}
11967
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011968QDF_STATUS sme_notify_modem_power_state(tHalHandle hHal, uint32_t value)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011969{
11970 cds_msg_t msg;
11971 tpSirModemPowerStateInd request_buf;
11972 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
11973
11974 if (NULL == pMac) {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011975 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011976 }
11977
Anurag Chouhan600c3a02016-03-01 10:33:54 +053011978 request_buf = qdf_mem_malloc(sizeof(tSirModemPowerStateInd));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011979 if (NULL == request_buf) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053011980 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011981 "%s: Not able to allocate memory for MODEM POWER STATE IND",
11982 __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011983 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011984 }
11985
11986 request_buf->param = value;
11987
11988 msg.type = WMA_MODEM_POWER_STATE_IND;
11989 msg.reserved = 0;
11990 msg.bodyptr = request_buf;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011991 if (!QDF_IS_STATUS_SUCCESS
Anurag Chouhan6d760662016-02-20 16:05:43 +053011992 (cds_mq_post_message(QDF_MODULE_ID_WMA, &msg))) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053011993 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011994 "%s: Not able to post WMA_MODEM_POWER_STATE_IND message"
11995 " to WMA", __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053011996 qdf_mem_free(request_buf);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011997 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011998 }
11999
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012000 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012001}
12002
12003#ifdef QCA_HT_2040_COEX
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012004QDF_STATUS sme_notify_ht2040_mode(tHalHandle hHal, uint16_t staId,
Anurag Chouhan6d760662016-02-20 16:05:43 +053012005 struct qdf_mac_addr macAddrSTA,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012006 uint8_t sessionId,
12007 uint8_t channel_type)
12008{
12009 cds_msg_t msg;
12010 tUpdateVHTOpMode *pHtOpMode = NULL;
12011 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
12012
12013 if (NULL == pMac) {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012014 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012015 }
12016
Anurag Chouhan600c3a02016-03-01 10:33:54 +053012017 pHtOpMode = qdf_mem_malloc(sizeof(tUpdateVHTOpMode));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012018 if (NULL == pHtOpMode) {
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: Not able to allocate memory for setting OP mode",
12021 __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012022 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012023 }
12024
12025 switch (channel_type) {
12026 case eHT_CHAN_HT20:
12027 pHtOpMode->opMode = eHT_CHANNEL_WIDTH_20MHZ;
12028 break;
12029
12030 case eHT_CHAN_HT40MINUS:
12031 case eHT_CHAN_HT40PLUS:
12032 pHtOpMode->opMode = eHT_CHANNEL_WIDTH_40MHZ;
12033 break;
12034
12035 default:
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053012036 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012037 "%s: Invalid OP mode", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012038 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012039 }
12040
12041 pHtOpMode->staId = staId,
Anurag Chouhan600c3a02016-03-01 10:33:54 +053012042 qdf_mem_copy(pHtOpMode->peer_mac, macAddrSTA.bytes,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012043 sizeof(tSirMacAddr));
12044 pHtOpMode->smesessionId = sessionId;
12045
12046 msg.type = WMA_UPDATE_OP_MODE;
12047 msg.reserved = 0;
12048 msg.bodyptr = pHtOpMode;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012049 if (!QDF_IS_STATUS_SUCCESS
Anurag Chouhan6d760662016-02-20 16:05:43 +053012050 (cds_mq_post_message(QDF_MODULE_ID_WMA, &msg))) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053012051 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012052 "%s: Not able to post WMA_UPDATE_OP_MODE message"
12053 " to WMA", __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053012054 qdf_mem_free(pHtOpMode);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012055 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012056 }
12057
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053012058 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012059 "%s: Notifed FW about OP mode: %d for staId=%d",
12060 __func__, pHtOpMode->opMode, staId);
12061
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012062 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012063}
12064
12065/* ---------------------------------------------------------------------------
12066
12067 \fn sme_set_ht2040_mode
12068
12069 \brief To update HT Operation beacon IE.
12070
12071 \param
12072
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012073 \return QDF_STATUS SUCCESS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012074 FAILURE or RESOURCES
12075 The API finished and failed.
12076
12077 -------------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012078QDF_STATUS sme_set_ht2040_mode(tHalHandle hHal, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012079 uint8_t channel_type, bool obssEnabled)
12080{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012081 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012082 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
12083 ePhyChanBondState cbMode;
12084
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053012085 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012086 "%s: Update HT operation beacon IE, channel_type=%d",
12087 __func__, channel_type);
12088
12089 switch (channel_type) {
12090 case eHT_CHAN_HT20:
12091 cbMode = PHY_SINGLE_CHANNEL_CENTERED;
12092 break;
12093 case eHT_CHAN_HT40MINUS:
12094 cbMode = PHY_DOUBLE_CHANNEL_HIGH_PRIMARY;
12095 break;
12096 case eHT_CHAN_HT40PLUS:
12097 cbMode = PHY_DOUBLE_CHANNEL_LOW_PRIMARY;
12098 break;
12099 default:
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053012100 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012101 "%s:Error!!! Invalid HT20/40 mode !", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012102 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012103 }
12104 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012105 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012106 status = csr_set_ht2040_mode(pMac, sessionId,
12107 cbMode, obssEnabled);
12108 sme_release_global_lock(&pMac->sme);
12109 }
12110 return status;
12111}
12112
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012113#endif
12114
12115/*
12116 * SME API to enable/disable idle mode powersave
12117 * This should be called only if powersave offload
12118 * is enabled
12119 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012120QDF_STATUS sme_set_idle_powersave_config(void *cds_context,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012121 tHalHandle hHal, uint32_t value)
12122{
Anurag Chouhan6d760662016-02-20 16:05:43 +053012123 void *wmaContext = cds_get_context(QDF_MODULE_ID_WMA);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012124 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
12125
12126 if (NULL == wmaContext) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053012127 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012128 "%s: wmaContext is NULL", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012129 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012130 }
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053012131 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012132 " Idle Ps Set Value %d", value);
12133
12134 pMac->imps_enabled = false;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012135 if (QDF_STATUS_SUCCESS != wma_set_idle_ps_config(wmaContext, value)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053012136 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012137 " Failed to Set Idle Ps Value %d", value);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012138 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012139 }
12140 if (value)
12141 pMac->imps_enabled = true;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012142 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012143}
12144
12145int16_t sme_get_ht_config(tHalHandle hHal, uint8_t session_id, uint16_t ht_capab)
12146{
12147 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
12148 tCsrRoamSession *pSession = CSR_GET_SESSION(pMac, session_id);
12149
12150 if (NULL == pSession) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053012151 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012152 "%s: pSession is NULL", __func__);
12153 return -EIO;
12154 }
12155 switch (ht_capab) {
12156 case WNI_CFG_HT_CAP_INFO_ADVANCE_CODING:
12157 return pSession->htConfig.ht_rx_ldpc;
12158 case WNI_CFG_HT_CAP_INFO_TX_STBC:
12159 return pSession->htConfig.ht_tx_stbc;
12160 case WNI_CFG_HT_CAP_INFO_RX_STBC:
12161 return pSession->htConfig.ht_rx_stbc;
12162 case WNI_CFG_HT_CAP_INFO_SHORT_GI_20MHZ:
Sandeep Puligilla607f34a2016-05-25 14:37:47 -070012163 return pSession->htConfig.ht_sgi20;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012164 case WNI_CFG_HT_CAP_INFO_SHORT_GI_40MHZ:
Sandeep Puligilla607f34a2016-05-25 14:37:47 -070012165 return pSession->htConfig.ht_sgi40;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012166 default:
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053012167 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012168 "invalid ht capability");
12169 return -EIO;
12170 }
12171}
12172
12173int sme_update_ht_config(tHalHandle hHal, uint8_t sessionId, uint16_t htCapab,
12174 int value)
12175{
12176 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
12177 tCsrRoamSession *pSession = CSR_GET_SESSION(pMac, sessionId);
12178
12179 if (NULL == pSession) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053012180 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012181 "%s: pSession is NULL", __func__);
12182 return -EIO;
12183 }
12184
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012185 if (QDF_STATUS_SUCCESS != wma_set_htconfig(sessionId, htCapab, value)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053012186 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012187 "Failed to set ht capability in target");
12188 return -EIO;
12189 }
12190
12191 switch (htCapab) {
12192 case WNI_CFG_HT_CAP_INFO_ADVANCE_CODING:
12193 pSession->htConfig.ht_rx_ldpc = value;
12194 break;
12195 case WNI_CFG_HT_CAP_INFO_TX_STBC:
12196 pSession->htConfig.ht_tx_stbc = value;
12197 break;
12198 case WNI_CFG_HT_CAP_INFO_RX_STBC:
12199 pSession->htConfig.ht_rx_stbc = value;
12200 break;
12201 case WNI_CFG_HT_CAP_INFO_SHORT_GI_20MHZ:
Sandeep Puligilla607f34a2016-05-25 14:37:47 -070012202 pSession->htConfig.ht_sgi20 = value;
12203 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012204 case WNI_CFG_HT_CAP_INFO_SHORT_GI_40MHZ:
Sandeep Puligilla607f34a2016-05-25 14:37:47 -070012205 pSession->htConfig.ht_sgi40 = value;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012206 break;
12207 }
12208
12209 return 0;
12210}
12211
12212#define HT20_SHORT_GI_MCS7_RATE 722
12213/* ---------------------------------------------------------------------------
12214 \fn sme_send_rate_update_ind
12215 \brief API to Update rate
12216 \param hHal - The handle returned by mac_open
12217 \param rateUpdateParams - Pointer to rate update params
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012218 \return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012219 ---------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012220QDF_STATUS sme_send_rate_update_ind(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012221 tSirRateUpdateInd *rateUpdateParams)
12222{
12223 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012224 QDF_STATUS status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012225 cds_msg_t msg;
Anurag Chouhan600c3a02016-03-01 10:33:54 +053012226 tSirRateUpdateInd *rate_upd = qdf_mem_malloc(sizeof(tSirRateUpdateInd));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012227
12228 if (rate_upd == NULL) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053012229 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012230 "Rate update struct alloc failed");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012231 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012232 }
12233 *rate_upd = *rateUpdateParams;
12234
12235 if (rate_upd->mcastDataRate24GHz == HT20_SHORT_GI_MCS7_RATE)
12236 rate_upd->mcastDataRate24GHzTxFlag =
12237 eHAL_TX_RATE_HT20 | eHAL_TX_RATE_SGI;
12238 else if (rate_upd->reliableMcastDataRate ==
12239 HT20_SHORT_GI_MCS7_RATE)
12240 rate_upd->reliableMcastDataRateTxFlag =
12241 eHAL_TX_RATE_HT20 | eHAL_TX_RATE_SGI;
12242
12243 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012244 if (QDF_STATUS_SUCCESS == status) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012245 msg.type = WMA_RATE_UPDATE_IND;
12246 msg.bodyptr = rate_upd;
Sreelakshmi Konamki6a065362016-05-31 16:05:01 +053012247 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
12248 NO_SESSION, msg.type));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012249 if (!QDF_IS_STATUS_SUCCESS
Anurag Chouhan6d760662016-02-20 16:05:43 +053012250 (cds_mq_post_message(QDF_MODULE_ID_WMA, &msg))) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053012251 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012252 "%s: Not able "
12253 "to post WMA_SET_RMC_RATE_IND to WMA!",
12254 __func__);
12255
12256 sme_release_global_lock(&pMac->sme);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053012257 qdf_mem_free(rate_upd);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012258 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012259 }
12260
12261 sme_release_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012262 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012263 }
12264
12265 return status;
12266}
12267
12268/**
Kondabattini, Ganeshe4f18e02016-09-13 13:01:22 +053012269 * sme_update_access_policy_vendor_ie() - update vendor ie and access policy.
12270 * @hal: Pointer to the mac context
12271 * @session_id: sme session id
12272 * @vendor_ie: vendor ie
12273 * @access_policy: vendor ie access policy
12274 *
12275 * This function updates the vendor ie and access policy to lim.
12276 *
12277 * Return: success or failure.
12278 */
12279QDF_STATUS sme_update_access_policy_vendor_ie(tHalHandle hal,
12280 uint8_t session_id, uint8_t *vendor_ie, int access_policy)
12281{
12282 struct sme_update_access_policy_vendor_ie *msg;
12283 uint16_t msg_len;
12284 QDF_STATUS status = QDF_STATUS_E_FAILURE;
12285 tpAniSirGlobal mac = PMAC_STRUCT(hal);
12286
12287 msg_len = sizeof(*msg);
12288
12289 msg = qdf_mem_malloc(msg_len);
12290 if (!msg) {
12291 sms_log(mac, LOGE,
12292 "failed to allocate memory for sme_update_access_policy_vendor_ie");
12293 return QDF_STATUS_E_FAILURE;
12294 }
12295
Kondabattini, Ganeshe4f18e02016-09-13 13:01:22 +053012296 msg->msg_type = (uint16_t)eWNI_SME_UPDATE_ACCESS_POLICY_VENDOR_IE;
12297 msg->length = (uint16_t)msg_len;
12298
12299 qdf_mem_copy(&msg->ie[0], vendor_ie, sizeof(msg->ie));
12300
12301 msg->sme_session_id = session_id;
12302 msg->access_policy = access_policy;
12303
12304 sms_log(mac, LOG1, "sme_session_id %hu, access_policy %d", session_id,
12305 access_policy);
12306
12307 status = cds_send_mb_message_to_mac(msg);
12308
12309 return status;
12310}
12311
12312/**
Agrawal Ashishda3e9502016-09-21 17:43:51 +053012313 * sme_update_short_retry_limit_threshold() - update short frame retry limit TH
12314 * @hal: Handle returned by mac_open
12315 * @session_id: Session ID on which short frame retry limit needs to be
12316 * updated to FW
12317 * @short_limit_count_th: Retry count TH to retry short frame.
12318 *
12319 * This function is used to configure count to retry short frame.
12320 *
12321 * Return: QDF_STATUS
12322 */
12323QDF_STATUS sme_update_short_retry_limit_threshold(tHalHandle hal_handle,
12324 struct sme_short_retry_limit *short_retry_limit_th)
12325{
12326 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal_handle);
12327 QDF_STATUS status = QDF_STATUS_SUCCESS;
12328 struct sme_short_retry_limit *srl;
12329 cds_msg_t msg;
12330
12331 srl = qdf_mem_malloc(sizeof(*srl));
12332 if (NULL == srl) {
12333 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
12334 "%s: fail to alloc short retry limit", __func__);
12335 return QDF_STATUS_E_FAILURE;
12336 }
12337 sms_log(mac_ctx, LOG1, FL("session_id %d short retry limit count: %d"),
12338 short_retry_limit_th->session_id,
12339 short_retry_limit_th->short_retry_limit);
12340
12341 srl->session_id = short_retry_limit_th->session_id;
12342 srl->short_retry_limit = short_retry_limit_th->short_retry_limit;
12343
12344 qdf_mem_zero(&msg, sizeof(msg));
12345 msg.type = SIR_HAL_SHORT_RETRY_LIMIT_CNT;
12346 msg.reserved = 0;
12347 msg.bodyptr = srl;
12348 status = cds_mq_post_message(QDF_MODULE_ID_WMA, &msg);
12349 if (status != QDF_STATUS_SUCCESS) {
12350 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
12351 FL("Not able to post short retry limit count to WDA"));
12352 qdf_mem_free(srl);
12353 return QDF_STATUS_E_FAILURE;
12354 }
12355
12356 return status;
12357}
12358
12359/**
12360 * sme_update_long_retry_limit_threshold() - update long retry limit TH
12361 * @hal: Handle returned by mac_open
12362 * @session_id: Session ID on which long frames retry TH needs to be updated
12363 * to FW
12364 * @long_limit_count_th: Retry count to retry long frame.
12365 *
12366 * This function is used to configure TH to retry long frame.
12367 *
12368 * Return: QDF_STATUS
12369*/
12370QDF_STATUS sme_update_long_retry_limit_threshold(tHalHandle hal_handle,
12371 struct sme_long_retry_limit *long_retry_limit_th)
12372{
12373 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal_handle);
12374 QDF_STATUS status = QDF_STATUS_SUCCESS;
12375 struct sme_long_retry_limit *lrl;
12376 cds_msg_t msg;
12377
12378 lrl = qdf_mem_malloc(sizeof(*lrl));
12379 if (NULL == lrl) {
12380 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
12381 "%s: fail to alloc long retry limit", __func__);
12382 return QDF_STATUS_E_FAILURE;
12383 }
12384 sms_log(mac_ctx, LOG1, FL("session_id %d long retry limit count: %d"),
12385 long_retry_limit_th->session_id,
12386 long_retry_limit_th->long_retry_limit);
12387
12388 lrl->session_id = long_retry_limit_th->session_id;
12389 lrl->long_retry_limit = long_retry_limit_th->long_retry_limit;
12390
12391 qdf_mem_zero(&msg, sizeof(msg));
12392 msg.type = SIR_HAL_LONG_RETRY_LIMIT_CNT;
12393 msg.reserved = 0;
12394 msg.bodyptr = lrl;
12395 status = cds_mq_post_message(QDF_MODULE_ID_WMA, &msg);
12396
12397 if (status != QDF_STATUS_SUCCESS) {
12398 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
12399 FL("Not able to post long retry limit count to WDA"));
12400 qdf_mem_free(lrl);
12401 return QDF_STATUS_E_FAILURE;
12402 }
12403
12404 return status;
12405}
12406
12407/**
Agrawal, Ashish4e5fa1c2016-09-21 19:03:43 +053012408 * sme_update_sta_inactivity_timeout(): Update sta_inactivity_timeout to FW
12409 * @hal: Handle returned by mac_open
12410 * @session_id: Session ID on which sta_inactivity_timeout needs
12411 * to be updated to FW
12412 * @sta_inactivity_timeout: sta inactivity timeout.
12413 *
12414 * If a station does not send anything in sta_inactivity_timeout seconds, an
12415 * empty data frame is sent to it in order to verify whether it is
12416 * still in range. If this frame is not ACKed, the station will be
12417 * disassociated and then deauthenticated.
12418 *
12419 * Return: QDF_STATUS_SUCCESS or non-zero on failure.
12420*/
12421QDF_STATUS sme_update_sta_inactivity_timeout(tHalHandle hal_handle,
12422 struct sme_sta_inactivity_timeout *sta_inactivity_timer)
12423{
12424 struct sme_sta_inactivity_timeout *inactivity_time;
12425 void *wma_handle;
12426
12427 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
12428 inactivity_time = qdf_mem_malloc(sizeof(*inactivity_time));
12429 if (NULL == inactivity_time) {
12430 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
12431 "%s: fail to alloc inactivity_time", __func__);
12432 return QDF_STATUS_E_FAILURE;
12433 }
12434 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO,
12435 FL("sta_inactivity_timeout: %d"),
12436 sta_inactivity_timer->sta_inactivity_timeout);
12437 inactivity_time->session_id = sta_inactivity_timer->session_id;
12438 inactivity_time->sta_inactivity_timeout =
12439 sta_inactivity_timer->sta_inactivity_timeout;
12440
12441 wma_update_sta_inactivity_timeout(wma_handle,
12442 inactivity_time);
12443 return QDF_STATUS_SUCCESS;
12444}
12445
12446/**
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012447 * sme_get_reg_info() - To get registration info
12448 * @hHal: HAL context
12449 * @chanId: channel id
12450 * @regInfo1: first reg info to fill
12451 * @regInfo2: second reg info to fill
12452 *
12453 * This routine will give you reg info
12454 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012455 * Return: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012456 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012457QDF_STATUS sme_get_reg_info(tHalHandle hHal, uint8_t chanId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012458 uint32_t *regInfo1, uint32_t *regInfo2)
12459{
12460 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012461 QDF_STATUS status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012462 uint8_t i;
12463 bool found = false;
12464
12465 status = sme_acquire_global_lock(&pMac->sme);
12466 *regInfo1 = 0;
12467 *regInfo2 = 0;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012468 if (!QDF_IS_STATUS_SUCCESS(status))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012469 return status;
12470
12471 for (i = 0; i < WNI_CFG_VALID_CHANNEL_LIST_LEN; i++) {
Amar Singhala297bfa2015-10-15 15:07:29 -070012472 if (pMac->scan.defaultPowerTable[i].chan_num == chanId) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012473 SME_SET_CHANNEL_REG_POWER(*regInfo1,
Amar Singhala297bfa2015-10-15 15:07:29 -070012474 pMac->scan.defaultPowerTable[i].power);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012475
12476 SME_SET_CHANNEL_MAX_TX_POWER(*regInfo2,
Amar Singhala297bfa2015-10-15 15:07:29 -070012477 pMac->scan.defaultPowerTable[i].power);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012478 found = true;
12479 break;
12480 }
12481 }
12482 if (!found)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012483 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012484
12485 sme_release_global_lock(&pMac->sme);
12486 return status;
12487}
12488
12489#ifdef FEATURE_WLAN_AUTO_SHUTDOWN
12490/* ---------------------------------------------------------------------------
12491 \fn sme_auto_shutdown_cb
12492 \brief Used to plug in callback function for receiving auto shutdown evt
12493 \param hHal
12494 \param pCallbackfn : callback function pointer should be plugged in
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012495 \- return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012496 -------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012497QDF_STATUS sme_set_auto_shutdown_cb(tHalHandle hHal, void (*pCallbackfn)(void)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012498 ) {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012499 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012500 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
12501
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053012502 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012503 "%s: Plug in Auto shutdown event callback", __func__);
12504
12505 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012506 if (QDF_STATUS_SUCCESS == status) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012507 if (NULL != pCallbackfn) {
12508 pMac->sme.pAutoShutdownNotificationCb = pCallbackfn;
12509 }
12510 sme_release_global_lock(&pMac->sme);
12511 }
12512
12513 return status;
12514}
12515
12516/* ---------------------------------------------------------------------------
12517 \fn sme_set_auto_shutdown_timer
12518 \API to set auto shutdown timer value in FW.
12519 \param hHal - The handle returned by mac_open
12520 \param timer_val - The auto shutdown timer value to be set
12521 \- return Configuration message posting status, SUCCESS or Fail
12522 -------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012523QDF_STATUS sme_set_auto_shutdown_timer(tHalHandle hHal, uint32_t timer_val)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012524{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012525 QDF_STATUS status = QDF_STATUS_SUCCESS;
12526 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012527 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
12528 tSirAutoShutdownCmdParams *auto_sh_cmd;
12529 cds_msg_t cds_message;
12530
12531 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012532 if (QDF_STATUS_SUCCESS == status) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012533 auto_sh_cmd = (tSirAutoShutdownCmdParams *)
Anurag Chouhan600c3a02016-03-01 10:33:54 +053012534 qdf_mem_malloc(sizeof(tSirAutoShutdownCmdParams));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012535 if (auto_sh_cmd == NULL) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053012536 QDF_TRACE(QDF_MODULE_ID_HDD, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012537 "%s Request Buffer Alloc Fail", __func__);
12538 sme_release_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012539 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012540 }
12541
12542 auto_sh_cmd->timer_val = timer_val;
12543
12544 /* serialize the req through MC thread */
12545 cds_message.bodyptr = auto_sh_cmd;
12546 cds_message.type = WMA_SET_AUTO_SHUTDOWN_TIMER_REQ;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012547 qdf_status = cds_mq_post_message(CDS_MQ_ID_WMA, &cds_message);
12548 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053012549 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012550 "%s: Post Auto shutdown MSG fail", __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053012551 qdf_mem_free(auto_sh_cmd);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012552 sme_release_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012553 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012554 }
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053012555 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012556 "%s: Posted Auto shutdown MSG", __func__);
12557 sme_release_global_lock(&pMac->sme);
12558 }
12559
12560 return status;
12561}
12562#endif
12563
12564#ifdef FEATURE_WLAN_CH_AVOID
12565/* ---------------------------------------------------------------------------
12566 \fn sme_add_ch_avoid_callback
12567 \brief Used to plug in callback function
12568 Which notify channel may not be used with SAP or P2PGO mode.
12569 Notification come from FW.
12570 \param hHal
12571 \param pCallbackfn : callback function pointer should be plugged in
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012572 \- return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012573 -------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012574QDF_STATUS sme_add_ch_avoid_callback
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012575 (tHalHandle hHal, void (*pCallbackfn)(void *pAdapter, void *indParam)
12576 ) {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012577 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012578 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
12579
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053012580 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012581 "%s: Plug in CH AVOID CB", __func__);
12582
12583 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012584 if (QDF_STATUS_SUCCESS == status) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012585 if (NULL != pCallbackfn) {
12586 pMac->sme.pChAvoidNotificationCb = pCallbackfn;
12587 }
12588 sme_release_global_lock(&pMac->sme);
12589 }
12590
12591 return status;
12592}
12593
12594/* ---------------------------------------------------------------------------
12595 \fn sme_ch_avoid_update_req
12596 \API to request channel avoidance update from FW.
12597 \param hHal - The handle returned by mac_open
12598 \param update_type - The udpate_type parameter of this request call
12599 \- return Configuration message posting status, SUCCESS or Fail
12600 -------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012601QDF_STATUS sme_ch_avoid_update_req(tHalHandle hHal)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012602{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012603 QDF_STATUS status = QDF_STATUS_SUCCESS;
12604 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012605 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
12606 tSirChAvoidUpdateReq *cauReq;
12607 cds_msg_t cds_message;
12608
12609 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012610 if (QDF_STATUS_SUCCESS == status) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012611 cauReq = (tSirChAvoidUpdateReq *)
Anurag Chouhan600c3a02016-03-01 10:33:54 +053012612 qdf_mem_malloc(sizeof(tSirChAvoidUpdateReq));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012613 if (NULL == cauReq) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053012614 QDF_TRACE(QDF_MODULE_ID_HDD, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012615 "%s Request Buffer Alloc Fail", __func__);
12616 sme_release_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012617 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012618 }
12619
12620 cauReq->reserved_param = 0;
12621
12622 /* serialize the req through MC thread */
12623 cds_message.bodyptr = cauReq;
12624 cds_message.type = WMA_CH_AVOID_UPDATE_REQ;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012625 qdf_status = cds_mq_post_message(CDS_MQ_ID_WMA, &cds_message);
12626 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053012627 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012628 "%s: Post Ch Avoid Update MSG fail",
12629 __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053012630 qdf_mem_free(cauReq);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012631 sme_release_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012632 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012633 }
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053012634 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012635 "%s: Posted Ch Avoid Update MSG", __func__);
12636 sme_release_global_lock(&pMac->sme);
12637 }
12638
12639 return status;
12640}
12641#endif /* FEATURE_WLAN_CH_AVOID */
12642
12643/**
12644 * sme_set_miracast() - Function to set miracast value to UMAC
12645 * @hal: Handle returned by macOpen
12646 * @filter_type: 0-Disabled, 1-Source, 2-sink
12647 *
12648 * This function passes down the value of miracast set by
12649 * framework to UMAC
12650 *
12651 * Return: Configuration message posting status, SUCCESS or Fail
12652 *
12653 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012654QDF_STATUS sme_set_miracast(tHalHandle hal, uint8_t filter_type)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012655{
12656 cds_msg_t msg;
12657 uint32_t *val;
12658 tpAniSirGlobal mac_ptr = PMAC_STRUCT(hal);
12659
Anurag Chouhan600c3a02016-03-01 10:33:54 +053012660 val = qdf_mem_malloc(sizeof(*val));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012661 if (NULL == val || NULL == mac_ptr) {
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: Invalid pointer", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012664 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012665 }
12666
12667 *val = filter_type;
12668
12669 msg.type = SIR_HAL_SET_MIRACAST;
12670 msg.reserved = 0;
12671 msg.bodyptr = val;
12672
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012673 if (!QDF_IS_STATUS_SUCCESS(
Anurag Chouhan6d760662016-02-20 16:05:43 +053012674 cds_mq_post_message(QDF_MODULE_ID_WMA, &msg))) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053012675 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012676 "%s: Not able to post WDA_SET_MAS_ENABLE_DISABLE to WMA!",
12677 __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053012678 qdf_mem_free(val);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012679 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012680 }
12681
12682 mac_ptr->sme.miracast_value = filter_type;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012683 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012684}
12685
12686/**
12687 * sme_set_mas() - Function to set MAS value to UMAC
12688 * @val: 1-Enable, 0-Disable
12689 *
12690 * This function passes down the value of MAS to the UMAC. A
12691 * value of 1 will enable MAS and a value of 0 will disable MAS
12692 *
12693 * Return: Configuration message posting status, SUCCESS or Fail
12694 *
12695 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012696QDF_STATUS sme_set_mas(uint32_t val)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012697{
12698 cds_msg_t msg;
12699 uint32_t *ptr_val;
12700
Anurag Chouhan600c3a02016-03-01 10:33:54 +053012701 ptr_val = qdf_mem_malloc(sizeof(*ptr_val));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012702 if (NULL == ptr_val) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053012703 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012704 "%s: could not allocate ptr_val", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012705 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012706 }
12707
12708 *ptr_val = val;
12709
12710 msg.type = SIR_HAL_SET_MAS;
12711 msg.reserved = 0;
12712 msg.bodyptr = ptr_val;
12713
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012714 if (!QDF_IS_STATUS_SUCCESS(
Anurag Chouhan6d760662016-02-20 16:05:43 +053012715 cds_mq_post_message(QDF_MODULE_ID_WMA, &msg))) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053012716 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012717 "%s: Not able to post WDA_SET_MAS_ENABLE_DISABLE to WMA!",
12718 __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053012719 qdf_mem_free(ptr_val);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012720 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012721 }
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012722 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012723}
12724
Kiran Kumar Lokere999e58c2016-01-07 02:18:39 -080012725/**
12726 * sme_roam_channel_change_req() - Channel change to new target channel
12727 * @hHal: handle returned by mac_open
12728 * @bssid: mac address of BSS
12729 * @ch_params: target channel information
12730 * @profile: CSR profile
12731 *
12732 * API to Indicate Channel change to new target channel
12733 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012734 * Return: QDF_STATUS
Kiran Kumar Lokere999e58c2016-01-07 02:18:39 -080012735 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012736QDF_STATUS sme_roam_channel_change_req(tHalHandle hHal,
Amar Singhale4f28ee2015-10-21 14:36:56 -070012737 struct qdf_mac_addr bssid,
12738 struct ch_params_s *ch_params,
12739 tCsrRoamProfile *profile)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012740{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012741 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012742 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012743
12744 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012745 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012746
Kiran Kumar Lokere999e58c2016-01-07 02:18:39 -080012747 status = csr_roam_channel_change_req(pMac, bssid, ch_params,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012748 profile);
12749 sme_release_global_lock(&pMac->sme);
12750 }
12751 return status;
12752}
12753
12754/* -------------------------------------------------------------------------
12755 \fn sme_process_channel_change_resp
12756 \brief API to Indicate Channel change response message to SAP.
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012757 \return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012758 ---------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012759QDF_STATUS sme_process_channel_change_resp(tpAniSirGlobal pMac,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012760 uint16_t msg_type, void *pMsgBuf)
12761{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012762 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012763 tCsrRoamInfo proam_info = { 0 };
12764 eCsrRoamResult roamResult;
12765 tpSwitchChannelParams pChnlParams = (tpSwitchChannelParams) pMsgBuf;
12766 uint32_t SessionId = pChnlParams->peSessionId;
12767
12768 proam_info.channelChangeRespEvent =
12769 (tSirChanChangeResponse *)
Anurag Chouhan600c3a02016-03-01 10:33:54 +053012770 qdf_mem_malloc(sizeof(tSirChanChangeResponse));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012771 if (NULL == proam_info.channelChangeRespEvent) {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012772 status = QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012773 sms_log(pMac, LOGE,
12774 "Channel Change Event Allocation Failed: %d\n", status);
12775 return status;
12776 }
12777 if (msg_type == eWNI_SME_CHANNEL_CHANGE_RSP) {
12778 proam_info.channelChangeRespEvent->sessionId = SessionId;
12779 proam_info.channelChangeRespEvent->newChannelNumber =
12780 pChnlParams->channelNumber;
12781 proam_info.channelChangeRespEvent->secondaryChannelOffset =
12782 pChnlParams->ch_width;
12783
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012784 if (pChnlParams->status == QDF_STATUS_SUCCESS) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053012785 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO_MED,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012786 "sapdfs: Received success eWNI_SME_CHANNEL_CHANGE_RSP for sessionId[%d]",
12787 SessionId);
12788 proam_info.channelChangeRespEvent->channelChangeStatus =
12789 1;
12790 roamResult = eCSR_ROAM_RESULT_CHANNEL_CHANGE_SUCCESS;
12791 } else {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053012792 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO_MED,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012793 "sapdfs: Received failure eWNI_SME_CHANNEL_CHANGE_RSP for sessionId[%d]",
12794 SessionId);
12795 proam_info.channelChangeRespEvent->channelChangeStatus =
12796 0;
12797 roamResult = eCSR_ROAM_RESULT_CHANNEL_CHANGE_FAILURE;
12798 }
12799
12800 csr_roam_call_callback(pMac, SessionId, &proam_info, 0,
12801 eCSR_ROAM_SET_CHANNEL_RSP, roamResult);
12802
12803 } else {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012804 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012805 sms_log(pMac, LOGE, "Invalid Channel Change Resp Message: %d\n",
12806 status);
12807 }
Anurag Chouhan600c3a02016-03-01 10:33:54 +053012808 qdf_mem_free(proam_info.channelChangeRespEvent);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012809
12810 return status;
12811}
12812
12813/* -------------------------------------------------------------------------
12814 \fn sme_roam_start_beacon_req
12815 \brief API to Indicate LIM to start Beacon Tx
12816 \after SAP CAC Wait is completed.
12817 \param hHal - The handle returned by mac_open
12818 \param sessionId - session ID
12819 \param dfsCacWaitStatus - CAC WAIT status flag
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012820 \return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012821 ---------------------------------------------------------------------------*/
Anurag Chouhan6d760662016-02-20 16:05:43 +053012822QDF_STATUS sme_roam_start_beacon_req(tHalHandle hHal, struct qdf_mac_addr bssid,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012823 uint8_t dfsCacWaitStatus)
12824{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012825 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012826 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
12827 status = sme_acquire_global_lock(&pMac->sme);
12828
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012829 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012830 status = csr_roam_start_beacon_req(pMac, bssid, dfsCacWaitStatus);
12831 sme_release_global_lock(&pMac->sme);
12832 }
12833 return status;
12834}
12835
Kiran Kumar Lokere999e58c2016-01-07 02:18:39 -080012836/**
12837 * sme_roam_csa_ie_request() - request CSA IE transmission from PE
12838 * @hHal: handle returned by mac_open
12839 * @bssid: SAP bssid
12840 * @targetChannel: target channel information
12841 * @csaIeReqd: CSA IE Request
12842 * @ch_params: channel information
12843 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012844 * Return: QDF_STATUS
Kiran Kumar Lokere999e58c2016-01-07 02:18:39 -080012845 */
Anurag Chouhan6d760662016-02-20 16:05:43 +053012846QDF_STATUS sme_roam_csa_ie_request(tHalHandle hHal, struct qdf_mac_addr bssid,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012847 uint8_t targetChannel, uint8_t csaIeReqd,
Amar Singhale4f28ee2015-10-21 14:36:56 -070012848 struct ch_params_s *ch_params)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012849{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012850 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012851 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
12852 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012853 if (QDF_IS_STATUS_SUCCESS(status)) {
Kiran Kumar Lokere999e58c2016-01-07 02:18:39 -080012854 status = csr_roam_send_chan_sw_ie_request(pMac, bssid,
12855 targetChannel, csaIeReqd, ch_params);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012856 sme_release_global_lock(&pMac->sme);
12857 }
12858 return status;
12859}
12860
12861/* ---------------------------------------------------------------------------
12862 \fn sme_init_thermal_info
12863 \brief SME API to initialize the thermal mitigation parameters
12864 \param hHal
12865 \param thermalParam : thermal mitigation parameters
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012866 \- return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012867 -------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012868QDF_STATUS sme_init_thermal_info(tHalHandle hHal, tSmeThermalParams thermalParam)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012869{
12870 t_thermal_mgmt *pWmaParam;
12871 cds_msg_t msg;
12872 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
12873
Anurag Chouhan600c3a02016-03-01 10:33:54 +053012874 pWmaParam = (t_thermal_mgmt *) qdf_mem_malloc(sizeof(t_thermal_mgmt));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012875 if (NULL == pWmaParam) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053012876 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012877 "%s: could not allocate tThermalMgmt", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012878 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012879 }
12880
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012881 pWmaParam->thermalMgmtEnabled = thermalParam.smeThermalMgmtEnabled;
12882 pWmaParam->throttlePeriod = thermalParam.smeThrottlePeriod;
Poddar, Siddarth83905022016-04-16 17:56:08 -070012883
12884 pWmaParam->throttle_duty_cycle_tbl[0] =
12885 thermalParam.sme_throttle_duty_cycle_tbl[0];
12886 pWmaParam->throttle_duty_cycle_tbl[1] =
12887 thermalParam.sme_throttle_duty_cycle_tbl[1];
12888 pWmaParam->throttle_duty_cycle_tbl[2] =
12889 thermalParam.sme_throttle_duty_cycle_tbl[2];
12890 pWmaParam->throttle_duty_cycle_tbl[3] =
12891 thermalParam.sme_throttle_duty_cycle_tbl[3];
12892
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012893 pWmaParam->thermalLevels[0].minTempThreshold =
12894 thermalParam.smeThermalLevels[0].smeMinTempThreshold;
12895 pWmaParam->thermalLevels[0].maxTempThreshold =
12896 thermalParam.smeThermalLevels[0].smeMaxTempThreshold;
12897 pWmaParam->thermalLevels[1].minTempThreshold =
12898 thermalParam.smeThermalLevels[1].smeMinTempThreshold;
12899 pWmaParam->thermalLevels[1].maxTempThreshold =
12900 thermalParam.smeThermalLevels[1].smeMaxTempThreshold;
12901 pWmaParam->thermalLevels[2].minTempThreshold =
12902 thermalParam.smeThermalLevels[2].smeMinTempThreshold;
12903 pWmaParam->thermalLevels[2].maxTempThreshold =
12904 thermalParam.smeThermalLevels[2].smeMaxTempThreshold;
12905 pWmaParam->thermalLevels[3].minTempThreshold =
12906 thermalParam.smeThermalLevels[3].smeMinTempThreshold;
12907 pWmaParam->thermalLevels[3].maxTempThreshold =
12908 thermalParam.smeThermalLevels[3].smeMaxTempThreshold;
12909
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012910 if (QDF_STATUS_SUCCESS == sme_acquire_global_lock(&pMac->sme)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012911 msg.type = WMA_INIT_THERMAL_INFO_CMD;
12912 msg.bodyptr = pWmaParam;
12913
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012914 if (!QDF_IS_STATUS_SUCCESS
Anurag Chouhan6d760662016-02-20 16:05:43 +053012915 (cds_mq_post_message(QDF_MODULE_ID_WMA, &msg))) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053012916 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012917 "%s: Not able to post WMA_SET_THERMAL_INFO_CMD to WMA!",
12918 __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053012919 qdf_mem_free(pWmaParam);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012920 sme_release_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012921 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012922 }
12923 sme_release_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012924 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012925 }
Anurag Chouhan600c3a02016-03-01 10:33:54 +053012926 qdf_mem_free(pWmaParam);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012927 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012928}
12929
12930/**
12931 * sme_add_set_thermal_level_callback() - Plug in set thermal level callback
12932 * @hal: Handle returned by macOpen
12933 * @callback: sme_set_thermal_level_callback
12934 *
12935 * Plug in set thermal level callback
12936 *
12937 * Return: none
12938 */
12939void sme_add_set_thermal_level_callback(tHalHandle hal,
12940 sme_set_thermal_level_callback callback)
12941{
12942 tpAniSirGlobal pMac = PMAC_STRUCT(hal);
12943
12944 pMac->sme.set_thermal_level_cb = callback;
12945}
12946
12947/**
12948 * sme_set_thermal_level() - SME API to set the thermal mitigation level
12949 * @hal: Handler to HAL
12950 * @level: Thermal mitigation level
12951 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012952 * Return: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012953 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012954QDF_STATUS sme_set_thermal_level(tHalHandle hal, uint8_t level)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012955{
12956 cds_msg_t msg;
12957 tpAniSirGlobal pMac = PMAC_STRUCT(hal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012958 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012959
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012960 if (QDF_STATUS_SUCCESS == sme_acquire_global_lock(&pMac->sme)) {
Anurag Chouhan600c3a02016-03-01 10:33:54 +053012961 qdf_mem_set(&msg, sizeof(msg), 0);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012962 msg.type = WMA_SET_THERMAL_LEVEL;
12963 msg.bodyval = level;
12964
Anurag Chouhan6d760662016-02-20 16:05:43 +053012965 qdf_status = cds_mq_post_message(QDF_MODULE_ID_WMA, &msg);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012966 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053012967 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012968 "%s: Not able to post WMA_SET_THERMAL_LEVEL to WMA!",
12969 __func__);
12970 sme_release_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012971 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012972 }
12973 sme_release_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012974 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012975 }
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012976 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012977}
12978
12979/* ---------------------------------------------------------------------------
12980 \fn sme_txpower_limit
12981 \brief SME API to set txpower limits
12982 \param hHal
12983 \param psmetx : power limits for 2g/5g
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012984 \- return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012985 -------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012986QDF_STATUS sme_txpower_limit(tHalHandle hHal, tSirTxPowerLimit *psmetx)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012987{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012988 QDF_STATUS status = QDF_STATUS_SUCCESS;
12989 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012990 cds_msg_t cds_message;
12991 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Prashanth Bhatta75fa9a12016-01-11 18:30:08 -080012992 tSirTxPowerLimit *tx_power_limit;
12993
Anurag Chouhan600c3a02016-03-01 10:33:54 +053012994 tx_power_limit = qdf_mem_malloc(sizeof(*tx_power_limit));
Prashanth Bhatta75fa9a12016-01-11 18:30:08 -080012995 if (!tx_power_limit) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053012996 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prashanth Bhatta75fa9a12016-01-11 18:30:08 -080012997 "%s: Memory allocation for TxPowerLimit failed!",
12998 __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012999 return QDF_STATUS_E_FAILURE;
Prashanth Bhatta75fa9a12016-01-11 18:30:08 -080013000 }
13001
13002 *tx_power_limit = *psmetx;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013003
13004 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013005 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013006 cds_message.type = WMA_TX_POWER_LIMIT;
13007 cds_message.reserved = 0;
Prashanth Bhatta75fa9a12016-01-11 18:30:08 -080013008 cds_message.bodyptr = tx_power_limit;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013009
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013010 qdf_status = cds_mq_post_message(CDS_MQ_ID_WMA, &cds_message);
13011 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053013012 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013013 "%s: not able to post WMA_TX_POWER_LIMIT",
13014 __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013015 status = QDF_STATUS_E_FAILURE;
Anurag Chouhan600c3a02016-03-01 10:33:54 +053013016 qdf_mem_free(tx_power_limit);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013017 }
13018 sme_release_global_lock(&pMac->sme);
13019 }
13020 return status;
13021}
13022
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013023QDF_STATUS sme_update_connect_debug(tHalHandle hHal, uint32_t set_value)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013024{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013025 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013026 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
13027 pMac->fEnableDebugLog = set_value;
13028 return status;
13029}
13030
13031/* ---------------------------------------------------------------------------
13032 \fn sme_ap_disable_intra_bss_fwd
13033
13034 \brief
13035 SME will send message to WMA to set Intra BSS in txrx
13036
13037 \param
13038
13039 hHal - The handle returned by mac_open
13040
13041 sessionId - session id ( vdev id)
13042
13043 disablefwd - bool value that indicate disable intrabss fwd disable
13044
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013045 \return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013046 --------------------------------------------------------------------------- */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013047QDF_STATUS sme_ap_disable_intra_bss_fwd(tHalHandle hHal, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013048 bool disablefwd)
13049{
13050 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013051 int status = QDF_STATUS_SUCCESS;
13052 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013053 cds_msg_t cds_message;
13054 tpDisableIntraBssFwd pSapDisableIntraFwd = NULL;
13055
13056 /* Prepare the request to send to SME. */
Anurag Chouhan600c3a02016-03-01 10:33:54 +053013057 pSapDisableIntraFwd = qdf_mem_malloc(sizeof(tDisableIntraBssFwd));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013058 if (NULL == pSapDisableIntraFwd) {
13059 sms_log(pMac, LOGP, "Memory Allocation Failure!!! %s", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013060 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013061 }
13062
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013063 pSapDisableIntraFwd->sessionId = sessionId;
13064 pSapDisableIntraFwd->disableintrabssfwd = disablefwd;
13065
13066 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013067 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013068 /* serialize the req through MC thread */
13069 cds_message.bodyptr = pSapDisableIntraFwd;
13070 cds_message.type = WMA_SET_SAP_INTRABSS_DIS;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013071 qdf_status = cds_mq_post_message(CDS_MQ_ID_WMA, &cds_message);
13072 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
13073 status = QDF_STATUS_E_FAILURE;
Anurag Chouhan600c3a02016-03-01 10:33:54 +053013074 qdf_mem_free(pSapDisableIntraFwd);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013075 }
13076 sme_release_global_lock(&pMac->sme);
13077 }
13078 return status;
13079}
13080
13081#ifdef WLAN_FEATURE_STATS_EXT
13082
13083/******************************************************************************
13084 \fn sme_stats_ext_register_callback
13085
13086 \brief
13087 a function called to register the callback that send vendor event for stats
13088 ext
13089
13090 \param callback - callback to be registered
13091******************************************************************************/
13092void sme_stats_ext_register_callback(tHalHandle hHal, StatsExtCallback callback)
13093{
13094 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
13095
13096 pMac->sme.StatsExtCallback = callback;
13097}
13098
Arun Khandavalli4b55da72016-07-19 19:55:01 +053013099/**
13100 * sme_stats_ext_deregister_callback() - De-register ext stats callback
13101 * @h_hal: Hal Handle
13102 *
13103 * This function is called to de initialize the HDD NAN feature. Currently
13104 * the only operation required is to de-register a callback with SME.
13105 *
13106 * Return: None
13107 */
13108void sme_stats_ext_deregister_callback(tHalHandle h_hal)
13109{
13110 tpAniSirGlobal pmac;
13111
13112 if (!h_hal) {
13113 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
13114 FL("hHal is not valid"));
13115 return;
13116 }
13117
13118 pmac = PMAC_STRUCT(h_hal);
13119 pmac->sme.StatsExtCallback = NULL;
13120}
13121
13122
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013123/******************************************************************************
13124 \fn sme_stats_ext_request
13125
13126 \brief
13127 a function called when HDD receives STATS EXT vendor command from userspace
13128
13129 \param sessionID - vdevID for the stats ext request
13130
13131 \param input - Stats Ext Request structure ptr
13132
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013133 \return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013134******************************************************************************/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013135QDF_STATUS sme_stats_ext_request(uint8_t session_id, tpStatsExtRequestReq input)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013136{
13137 cds_msg_t msg;
13138 tpStatsExtRequest data;
13139 size_t data_len;
13140
13141 data_len = sizeof(tStatsExtRequest) + input->request_data_len;
Anurag Chouhan600c3a02016-03-01 10:33:54 +053013142 data = qdf_mem_malloc(data_len);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013143
13144 if (data == NULL) {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013145 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013146 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013147 data->vdev_id = session_id;
13148 data->request_data_len = input->request_data_len;
13149 if (input->request_data_len) {
Anurag Chouhan600c3a02016-03-01 10:33:54 +053013150 qdf_mem_copy(data->request_data,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013151 input->request_data, input->request_data_len);
13152 }
13153
13154 msg.type = WMA_STATS_EXT_REQUEST;
13155 msg.reserved = 0;
13156 msg.bodyptr = data;
13157
Anurag Chouhan6d760662016-02-20 16:05:43 +053013158 if (QDF_STATUS_SUCCESS != cds_mq_post_message(QDF_MODULE_ID_WMA, &msg)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053013159 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013160 "%s: Not able to post WMA_STATS_EXT_REQUEST message to WMA",
13161 __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053013162 qdf_mem_free(data);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013163 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013164 }
13165
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013166 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013167}
13168
13169/******************************************************************************
13170 \fn sme_stats_ext_event
13171
13172 \brief
13173 a callback function called when SME received eWNI_SME_STATS_EXT_EVENT
13174 response from WMA
13175
13176 \param hHal - HAL handle for device
13177 \param pMsg - Message body passed from WMA; includes NAN header
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013178 \return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013179******************************************************************************/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013180QDF_STATUS sme_stats_ext_event(tHalHandle hHal, void *pMsg)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013181{
13182 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013183 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013184
13185 if (NULL == pMsg) {
13186 sms_log(pMac, LOGE, "in %s msg ptr is NULL", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013187 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013188 } else {
13189 sms_log(pMac, LOG2, "SME: entering %s", __func__);
13190
13191 if (pMac->sme.StatsExtCallback) {
13192 pMac->sme.StatsExtCallback(pMac->hHdd,
13193 (tpStatsExtEvent) pMsg);
13194 }
13195 }
13196
13197 return status;
13198}
13199
13200#endif
13201
13202/* ---------------------------------------------------------------------------
13203 \fn sme_update_dfs_scan_mode
13204 \brief Update DFS roam scan mode
13205 This function is called through dynamic setConfig callback function
13206 to configure allowDFSChannelRoam.
13207 \param hHal - HAL handle for device
13208 \param sessionId - Session Identifier
13209 \param allowDFSChannelRoam - DFS roaming scan mode 0 (disable),
13210 1 (passive), 2 (active)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013211 \return QDF_STATUS_SUCCESS - SME update DFS roaming scan config
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013212 successfully.
13213 Other status means SME failed to update DFS roaming scan config.
13214 \sa
13215 -------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013216QDF_STATUS sme_update_dfs_scan_mode(tHalHandle hHal, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013217 uint8_t allowDFSChannelRoam)
13218{
13219 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013220 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013221
Naveen Rawatc36f7eb2016-11-10 20:01:03 -080013222 if (sessionId >= CSR_ROAM_SESSION_MAX) {
13223 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
13224 FL("Invalid sme session id: %d"), sessionId);
13225 return QDF_STATUS_E_INVAL;
13226 }
13227
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013228 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013229 if (QDF_IS_STATUS_SUCCESS(status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053013230 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013231 "LFR runtime successfully set AllowDFSChannelRoam Mode to "
13232 "%d - old value is %d - roam state is %s",
13233 allowDFSChannelRoam,
13234 pMac->roam.configParam.allowDFSChannelRoam,
13235 mac_trace_get_neighbour_roam_state(pMac->roam.
13236 neighborRoamInfo
13237 [sessionId].
13238 neighborRoamState));
13239 pMac->roam.configParam.allowDFSChannelRoam =
13240 allowDFSChannelRoam;
13241 sme_release_global_lock(&pMac->sme);
13242 }
13243 if (pMac->roam.configParam.isRoamOffloadScanEnabled) {
13244 csr_roam_offload_scan(pMac, sessionId,
13245 ROAM_SCAN_OFFLOAD_UPDATE_CFG,
13246 REASON_ROAM_DFS_SCAN_MODE_CHANGED);
13247 }
13248
13249 return status;
13250}
13251
13252/*--------------------------------------------------------------------------
13253 \brief sme_get_dfs_scan_mode() - get DFS roam scan mode
13254 This is a synchronous call
13255 \param hHal - The handle returned by mac_open.
13256 \return DFS roaming scan mode 0 (disable), 1 (passive), 2 (active)
13257 \sa
13258 --------------------------------------------------------------------------*/
13259uint8_t sme_get_dfs_scan_mode(tHalHandle hHal)
13260{
13261 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
13262 return pMac->roam.configParam.allowDFSChannelRoam;
13263}
13264
13265/*----------------------------------------------------------------------------
13266 \fn sme_modify_add_ie
13267 \brief This function sends msg to updates the additional IE buffers in PE
13268 \param hHal - global structure
13269 \param pModifyIE - pointer to tModifyIE structure
13270 \param updateType - type of buffer
13271 \- return Success or failure
13272 -----------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013273QDF_STATUS sme_modify_add_ie(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013274 tSirModifyIE *pModifyIE, eUpdateIEsType updateType)
13275{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013276 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013277 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
13278 status = sme_acquire_global_lock(&pMac->sme);
13279
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013280 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013281 status = csr_roam_modify_add_ies(pMac, pModifyIE, updateType);
13282 sme_release_global_lock(&pMac->sme);
13283 }
13284 return status;
13285}
13286
13287/*----------------------------------------------------------------------------
13288 \fn sme_update_add_ie
13289 \brief This function sends msg to updates the additional IE buffers in PE
13290 \param hHal - global structure
13291 \param pUpdateIE - pointer to structure tUpdateIE
13292 \param updateType - type of buffer
13293 \- return Success or failure
13294 -----------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013295QDF_STATUS sme_update_add_ie(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013296 tSirUpdateIE *pUpdateIE, eUpdateIEsType updateType)
13297{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013298 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013299 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
13300 status = sme_acquire_global_lock(&pMac->sme);
13301
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013302 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013303 status = csr_roam_update_add_ies(pMac, pUpdateIE, updateType);
13304 sme_release_global_lock(&pMac->sme);
13305 }
13306 return status;
13307}
13308
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013309/**
13310 * sme_update_dsc_pto_up_mapping()
13311 * @hHal: HAL context
13312 * @dscpmapping: pointer to DSCP mapping structure
13313 * @sessionId: SME session id
13314 *
13315 * This routine is called to update dscp mapping
13316 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013317 * Return: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013318 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013319QDF_STATUS sme_update_dsc_pto_up_mapping(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013320 sme_QosWmmUpType *dscpmapping,
13321 uint8_t sessionId)
13322{
13323 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013324 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013325 uint8_t i, j, peSessionId;
13326 tCsrRoamSession *pCsrSession = NULL;
13327 tpPESession pSession = NULL;
13328
13329 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013330 if (!QDF_IS_STATUS_SUCCESS(status))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013331 return status;
13332 pCsrSession = CSR_GET_SESSION(pMac, sessionId);
13333 if (pCsrSession == NULL) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053013334 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013335 FL("Session lookup fails for CSR session"));
13336 sme_release_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013337 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013338 }
13339 if (!CSR_IS_SESSION_VALID(pMac, sessionId)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053013340 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013341 FL("Invalid session Id %u"), sessionId);
13342 sme_release_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013343 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013344 }
13345
13346 pSession = pe_find_session_by_bssid(pMac,
13347 pCsrSession->connectedProfile.bssid.bytes,
13348 &peSessionId);
13349
13350 if (pSession == NULL) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053013351 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013352 FL(" Session lookup fails for BSSID"));
13353 sme_release_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013354 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013355 }
13356
13357 if (!pSession->QosMapSet.present) {
Anurag Chouhan05d124f2016-09-03 16:21:50 +053013358 hdd_notice("QOS Mapping IE not present");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013359 sme_release_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013360 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013361 }
13362 for (i = 0; i < SME_QOS_WMM_UP_MAX; i++) {
13363 for (j = pSession->QosMapSet.dscp_range[i][0];
13364 j <= pSession->QosMapSet.dscp_range[i][1];
13365 j++) {
13366 if ((pSession->QosMapSet.dscp_range[i][0] == 255)
13367 && (pSession->QosMapSet.dscp_range[i][1] ==
13368 255)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053013369 QDF_TRACE(QDF_MODULE_ID_SME,
13370 QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013371 FL("User Priority %d isn't used"), i);
13372 break;
13373 } else {
13374 dscpmapping[j] = i;
13375 }
13376 }
13377 }
13378 for (i = 0; i < pSession->QosMapSet.num_dscp_exceptions; i++)
13379 if (pSession->QosMapSet.dscp_exceptions[i][0] != 255)
13380 dscpmapping[pSession->QosMapSet.dscp_exceptions[i][0]] =
13381 pSession->QosMapSet.dscp_exceptions[i][1];
13382
13383 sme_release_global_lock(&pMac->sme);
13384 return status;
13385}
13386
13387/* ---------------------------------------------------------------------------
13388 \fn sme_abort_roam_scan
13389 \brief API to abort current roam scan cycle by roam scan offload module.
13390 \param hHal - The handle returned by mac_open.
13391 \param sessionId - Session Identifier
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013392 \return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013393 ---------------------------------------------------------------------------*/
13394
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013395QDF_STATUS sme_abort_roam_scan(tHalHandle hHal, uint8_t sessionId)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013396{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013397 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013398 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
13399
13400 sms_log(pMac, LOGW, "entering function %s", __func__);
13401 if (pMac->roam.configParam.isRoamOffloadScanEnabled) {
13402 /* acquire the lock for the sme object */
13403 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013404 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013405 csr_roam_offload_scan(pMac, sessionId,
13406 ROAM_SCAN_OFFLOAD_ABORT_SCAN,
13407 REASON_ROAM_ABORT_ROAM_SCAN);
13408 /* release the lock for the sme object */
13409 sme_release_global_lock(&pMac->sme);
13410 }
13411 }
13412
13413 return status;
13414}
13415
13416#ifdef FEATURE_WLAN_EXTSCAN
13417/**
13418 * sme_get_valid_channels_by_band() - to fetch valid channels filtered by band
13419 * @hHal: HAL context
13420 * @wifiBand: RF band information
13421 * @aValidChannels: output array to store channel info
13422 * @pNumChannels: output number of channels
13423 *
13424 * SME API to fetch all valid channels filtered by band
13425 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013426 * Return: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013427 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013428QDF_STATUS sme_get_valid_channels_by_band(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013429 uint8_t wifiBand,
13430 uint32_t *aValidChannels,
13431 uint8_t *pNumChannels)
13432{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013433 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013434 uint8_t chanList[WNI_CFG_VALID_CHANNEL_LIST_LEN] = { 0 };
13435 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
13436 uint8_t numChannels = 0;
13437 uint8_t i = 0;
13438 uint32_t totValidChannels = WNI_CFG_VALID_CHANNEL_LIST_LEN;
13439
13440 if (!aValidChannels || !pNumChannels) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053013441 sms_log(pMac, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013442 FL("Output channel list/NumChannels is NULL"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013443 return QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013444 }
13445
13446 if ((wifiBand < WIFI_BAND_UNSPECIFIED) || (wifiBand >= WIFI_BAND_MAX)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053013447 sms_log(pMac, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013448 FL("Invalid wifiBand (%d)"), wifiBand);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013449 return QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013450 }
13451
13452 status = sme_get_cfg_valid_channels(hHal, &chanList[0],
13453 &totValidChannels);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013454 if (!QDF_IS_STATUS_SUCCESS(status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053013455 sms_log(pMac, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013456 FL("Fail to get valid channel list (err=%d)"), status);
13457 return status;
13458 }
13459
13460 switch (wifiBand) {
13461 case WIFI_BAND_UNSPECIFIED:
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053013462 sms_log(pMac, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013463 FL("Unspec Band, return all (%d) valid channels"),
13464 totValidChannels);
13465 numChannels = totValidChannels;
13466 for (i = 0; i < totValidChannels; i++) {
13467 aValidChannels[i] = cds_chan_to_freq(chanList[i]);
13468 }
13469 break;
13470
13471 case WIFI_BAND_BG:
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053013472 sms_log(pMac, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013473 FL("WIFI_BAND_BG (2.4 GHz)"));
13474 for (i = 0; i < totValidChannels; i++) {
13475 if (CDS_IS_CHANNEL_24GHZ(chanList[i])) {
13476 aValidChannels[numChannels++] =
13477 cds_chan_to_freq(chanList[i]);
13478 }
13479 }
13480 break;
13481
13482 case WIFI_BAND_A:
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053013483 sms_log(pMac, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013484 FL("WIFI_BAND_A (5 GHz without DFS)"));
13485 for (i = 0; i < totValidChannels; i++) {
13486 if (CDS_IS_CHANNEL_5GHZ(chanList[i]) &&
13487 !CDS_IS_DFS_CH(chanList[i])) {
13488 aValidChannels[numChannels++] =
13489 cds_chan_to_freq(chanList[i]);
13490 }
13491 }
13492 break;
13493
13494 case WIFI_BAND_ABG:
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053013495 sms_log(pMac, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013496 FL("WIFI_BAND_ABG (2.4 GHz + 5 GHz; no DFS)"));
13497 for (i = 0; i < totValidChannels; i++) {
13498 if ((CDS_IS_CHANNEL_24GHZ(chanList[i]) ||
13499 CDS_IS_CHANNEL_5GHZ(chanList[i])) &&
13500 !CDS_IS_DFS_CH(chanList[i])) {
13501 aValidChannels[numChannels++] =
13502 cds_chan_to_freq(chanList[i]);
13503 }
13504 }
13505 break;
13506
13507 case WIFI_BAND_A_DFS_ONLY:
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053013508 sms_log(pMac, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013509 FL("WIFI_BAND_A_DFS (5 GHz DFS only)"));
13510 for (i = 0; i < totValidChannels; i++) {
13511 if (CDS_IS_CHANNEL_5GHZ(chanList[i]) &&
13512 CDS_IS_DFS_CH(chanList[i])) {
13513 aValidChannels[numChannels++] =
13514 cds_chan_to_freq(chanList[i]);
13515 }
13516 }
13517 break;
13518
13519 case WIFI_BAND_A_WITH_DFS:
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053013520 sms_log(pMac, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013521 FL("WIFI_BAND_A_WITH_DFS (5 GHz with DFS)"));
13522 for (i = 0; i < totValidChannels; i++) {
13523 if (CDS_IS_CHANNEL_5GHZ(chanList[i])) {
13524 aValidChannels[numChannels++] =
13525 cds_chan_to_freq(chanList[i]);
13526 }
13527 }
13528 break;
13529
13530 case WIFI_BAND_ABG_WITH_DFS:
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053013531 sms_log(pMac, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013532 FL("WIFI_BAND_ABG_WITH_DFS (2.4 GHz+5 GHz with DFS)"));
13533 for (i = 0; i < totValidChannels; i++) {
13534 if (CDS_IS_CHANNEL_24GHZ(chanList[i]) ||
13535 CDS_IS_CHANNEL_5GHZ(chanList[i])) {
13536 aValidChannels[numChannels++] =
13537 cds_chan_to_freq(chanList[i]);
13538 }
13539 }
13540 break;
13541
13542 default:
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053013543 sms_log(pMac, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013544 FL("Unknown wifiBand (%d))"), wifiBand);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013545 return QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013546 break;
13547 }
13548 *pNumChannels = numChannels;
13549
13550 return status;
13551}
13552
13553/* ---------------------------------------------------------------------------
13554 \fn sme_ext_scan_get_capabilities
13555 \brief SME API to fetch extscan capabilities
13556 \param hHal
13557 \param pReq: extscan capabilities structure
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013558 \- return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013559 -------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013560QDF_STATUS sme_ext_scan_get_capabilities(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013561 tSirGetExtScanCapabilitiesReqParams *
13562 pReq)
13563{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013564 QDF_STATUS status = QDF_STATUS_SUCCESS;
13565 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013566 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
13567 cds_msg_t cds_message;
13568
13569 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013570 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013571 /* Serialize the req through MC thread */
13572 cds_message.bodyptr = pReq;
13573 cds_message.type = WMA_EXTSCAN_GET_CAPABILITIES_REQ;
Sreelakshmi Konamki6a065362016-05-31 16:05:01 +053013574 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
13575 NO_SESSION, cds_message.type));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013576 qdf_status = cds_mq_post_message(CDS_MQ_ID_WMA, &cds_message);
13577 if (!QDF_IS_STATUS_SUCCESS(qdf_status))
13578 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013579
13580 sme_release_global_lock(&pMac->sme);
13581 }
13582 return status;
13583}
13584
13585/* ---------------------------------------------------------------------------
13586 \fn sme_ext_scan_start
13587 \brief SME API to issue extscan start
13588 \param hHal
13589 \param pStartCmd: extscan start structure
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013590 \- return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013591 -------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013592QDF_STATUS sme_ext_scan_start(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013593 tSirWifiScanCmdReqParams *pStartCmd)
13594{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013595 QDF_STATUS status = QDF_STATUS_SUCCESS;
13596 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013597 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
13598 cds_msg_t cds_message;
13599
13600 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013601 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013602 /* Serialize the req through MC thread */
13603 cds_message.bodyptr = pStartCmd;
13604 cds_message.type = WMA_EXTSCAN_START_REQ;
Sreelakshmi Konamki6a065362016-05-31 16:05:01 +053013605 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
13606 NO_SESSION, cds_message.type));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013607 qdf_status = cds_mq_post_message(CDS_MQ_ID_WMA, &cds_message);
13608 if (!QDF_IS_STATUS_SUCCESS(qdf_status))
13609 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013610
13611 sme_release_global_lock(&pMac->sme);
13612 }
13613 return status;
13614}
13615
13616/* ---------------------------------------------------------------------------
13617 \fn sme_ext_scan_stop
13618 \brief SME API to issue extscan stop
13619 \param hHal
13620 \param pStopReq: extscan stop structure
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013621 \- return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013622 -------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013623QDF_STATUS sme_ext_scan_stop(tHalHandle hHal, tSirExtScanStopReqParams *pStopReq)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013624{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013625 QDF_STATUS status = QDF_STATUS_SUCCESS;
13626 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013627 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
13628 cds_msg_t cds_message;
13629
13630 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013631 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013632 /* Serialize the req through MC thread */
13633 cds_message.bodyptr = pStopReq;
13634 cds_message.type = WMA_EXTSCAN_STOP_REQ;
Sreelakshmi Konamki6a065362016-05-31 16:05:01 +053013635 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
13636 NO_SESSION, cds_message.type));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013637 qdf_status = cds_mq_post_message(CDS_MQ_ID_WMA, &cds_message);
13638 if (!QDF_IS_STATUS_SUCCESS(qdf_status))
13639 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013640 sme_release_global_lock(&pMac->sme);
13641 }
13642 return status;
13643}
13644
13645/* ---------------------------------------------------------------------------
13646 \fn sme_set_bss_hotlist
13647 \brief SME API to set BSSID hotlist
13648 \param hHal
13649 \param pSetHotListReq: extscan set hotlist structure
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013650 \- return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013651 -------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013652QDF_STATUS sme_set_bss_hotlist(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013653 tSirExtScanSetBssidHotListReqParams *
13654 pSetHotListReq)
13655{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013656 QDF_STATUS status = QDF_STATUS_SUCCESS;
13657 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013658 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
13659 cds_msg_t cds_message;
13660
13661 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013662 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013663 /* Serialize the req through MC thread */
13664 cds_message.bodyptr = pSetHotListReq;
13665 cds_message.type = WMA_EXTSCAN_SET_BSSID_HOTLIST_REQ;
Sreelakshmi Konamki6a065362016-05-31 16:05:01 +053013666 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
13667 NO_SESSION, cds_message.type));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013668 qdf_status = cds_mq_post_message(CDS_MQ_ID_WMA, &cds_message);
13669 if (!QDF_IS_STATUS_SUCCESS(qdf_status))
13670 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013671
13672 sme_release_global_lock(&pMac->sme);
13673 }
13674 return status;
13675}
13676
13677/* ---------------------------------------------------------------------------
13678 \fn sme_reset_bss_hotlist
13679 \brief SME API to reset BSSID hotlist
13680 \param hHal
13681 \param pSetHotListReq: extscan set hotlist structure
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013682 \- return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013683 -------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013684QDF_STATUS sme_reset_bss_hotlist(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013685 tSirExtScanResetBssidHotlistReqParams *
13686 pResetReq)
13687{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013688 QDF_STATUS status = QDF_STATUS_SUCCESS;
13689 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013690 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
13691 cds_msg_t cds_message;
13692
13693 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013694 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013695 /* Serialize the req through MC thread */
13696 cds_message.bodyptr = pResetReq;
13697 cds_message.type = WMA_EXTSCAN_RESET_BSSID_HOTLIST_REQ;
Sreelakshmi Konamki6a065362016-05-31 16:05:01 +053013698 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
13699 NO_SESSION, cds_message.type));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013700 qdf_status = cds_mq_post_message(CDS_MQ_ID_WMA, &cds_message);
13701 if (!QDF_IS_STATUS_SUCCESS(qdf_status))
13702 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013703
13704 sme_release_global_lock(&pMac->sme);
13705 }
13706 return status;
13707}
13708
Manikandan Mohan80dea792016-04-28 16:36:48 -070013709/**
13710 * sme_send_wisa_params(): Pass WISA mode to WMA
13711 * @hal: HAL context
13712 * @wisa_params: pointer to WISA params struct
13713 * @sessionId: SME session id
13714 *
13715 * Pass WISA params to WMA
13716 *
13717 * Return: QDF_STATUS
13718 */
13719QDF_STATUS sme_set_wisa_params(tHalHandle hal,
13720 struct sir_wisa_params *wisa_params)
13721{
13722 QDF_STATUS status = QDF_STATUS_SUCCESS;
13723 tpAniSirGlobal mac = PMAC_STRUCT(hal);
13724 cds_msg_t cds_message;
13725 struct sir_wisa_params *cds_msg_wisa_params;
13726
13727 cds_msg_wisa_params = qdf_mem_malloc(sizeof(struct sir_wisa_params));
13728 if (!cds_msg_wisa_params)
13729 return QDF_STATUS_E_NOMEM;
13730
13731 *cds_msg_wisa_params = *wisa_params;
13732 status = sme_acquire_global_lock(&mac->sme);
13733 if (QDF_IS_STATUS_SUCCESS(status)) {
13734 cds_message.bodyptr = cds_msg_wisa_params;
13735 cds_message.type = WMA_SET_WISA_PARAMS;
13736 status = cds_mq_post_message(CDS_MQ_ID_WMA, &cds_message);
13737 sme_release_global_lock(&mac->sme);
13738 }
13739 return status;
13740}
13741
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013742/* ---------------------------------------------------------------------------
13743 \fn sme_set_significant_change
13744 \brief SME API to set significant change
13745 \param hHal
13746 \param pSetSignificantChangeReq: extscan set significant change structure
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013747 \- return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013748 -------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013749QDF_STATUS sme_set_significant_change(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013750 tSirExtScanSetSigChangeReqParams *
13751 pSetSignificantChangeReq)
13752{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013753 QDF_STATUS status = QDF_STATUS_SUCCESS;
13754 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013755 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
13756 cds_msg_t cds_message;
13757
13758 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013759 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013760 /* Serialize the req through MC thread */
13761 cds_message.bodyptr = pSetSignificantChangeReq;
13762 cds_message.type = WMA_EXTSCAN_SET_SIGNF_CHANGE_REQ;
Sreelakshmi Konamki6a065362016-05-31 16:05:01 +053013763 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
13764 NO_SESSION, cds_message.type));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013765 qdf_status = cds_mq_post_message(CDS_MQ_ID_WMA, &cds_message);
13766 if (!QDF_IS_STATUS_SUCCESS(qdf_status))
13767 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013768
13769 sme_release_global_lock(&pMac->sme);
13770 }
13771 return status;
13772}
13773
13774/* ---------------------------------------------------------------------------
13775 \fn sme_reset_significant_change
13776 \brief SME API to reset significant change
13777 \param hHal
13778 \param pResetReq: extscan reset significant change structure
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013779 \- return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013780 -------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013781QDF_STATUS sme_reset_significant_change(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013782 tSirExtScanResetSignificantChangeReqParams
13783 *pResetReq)
13784{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013785 QDF_STATUS status = QDF_STATUS_SUCCESS;
13786 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013787 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
13788 cds_msg_t cds_message;
13789
13790 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013791 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013792 /* Serialize the req through MC thread */
13793 cds_message.bodyptr = pResetReq;
13794 cds_message.type = WMA_EXTSCAN_RESET_SIGNF_CHANGE_REQ;
Sreelakshmi Konamki6a065362016-05-31 16:05:01 +053013795 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
13796 NO_SESSION, cds_message.type));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013797 qdf_status = cds_mq_post_message(CDS_MQ_ID_WMA, &cds_message);
13798 if (!QDF_IS_STATUS_SUCCESS(qdf_status))
13799 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013800
13801 sme_release_global_lock(&pMac->sme);
13802 }
13803 return status;
13804}
13805
13806/* ---------------------------------------------------------------------------
13807 \fn sme_get_cached_results
13808 \brief SME API to get cached results
13809 \param hHal
13810 \param pCachedResultsReq: extscan get cached results structure
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013811 \- return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013812 -------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013813QDF_STATUS sme_get_cached_results(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013814 tSirExtScanGetCachedResultsReqParams *
13815 pCachedResultsReq)
13816{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013817 QDF_STATUS status = QDF_STATUS_SUCCESS;
13818 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013819 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
13820 cds_msg_t cds_message;
13821
13822 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013823 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013824 /* Serialize the req through MC thread */
13825 cds_message.bodyptr = pCachedResultsReq;
13826 cds_message.type = WMA_EXTSCAN_GET_CACHED_RESULTS_REQ;
Sreelakshmi Konamki6a065362016-05-31 16:05:01 +053013827 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
13828 NO_SESSION, cds_message.type));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013829 qdf_status = cds_mq_post_message(CDS_MQ_ID_WMA, &cds_message);
13830 if (!QDF_IS_STATUS_SUCCESS(qdf_status))
13831 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013832
13833 sme_release_global_lock(&pMac->sme);
13834 }
13835 return status;
13836}
13837
13838/**
13839 * sme_set_epno_list() - set epno network list
Deepak Dhamdhere0f076bd2016-06-02 11:29:21 -070013840 * @hal: global hal handle
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013841 * @input: request message
13842 *
13843 * This function constructs the cds message and fill in message type,
13844 * bodyptr with %input and posts it to WDA queue.
13845 *
Deepak Dhamdhere0f076bd2016-06-02 11:29:21 -070013846 * Return: QDF_STATUS enumeration
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013847 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013848QDF_STATUS sme_set_epno_list(tHalHandle hal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013849 struct wifi_epno_params *input)
13850{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013851 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013852 tpAniSirGlobal mac = PMAC_STRUCT(hal);
13853 cds_msg_t cds_message;
13854 struct wifi_epno_params *req_msg;
13855 int len, i;
13856
13857 sms_log(mac, LOG1, FL("enter"));
13858 len = sizeof(*req_msg) +
13859 (input->num_networks * sizeof(struct wifi_epno_network));
Mukul Sharmae8c919f2016-10-02 20:35:15 +053013860
Anurag Chouhan600c3a02016-03-01 10:33:54 +053013861 req_msg = qdf_mem_malloc(len);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013862 if (!req_msg) {
Anurag Chouhan600c3a02016-03-01 10:33:54 +053013863 sms_log(mac, LOGE, FL("qdf_mem_malloc failed"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013864 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013865 }
13866
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013867 req_msg->num_networks = input->num_networks;
13868 req_msg->request_id = input->request_id;
13869 req_msg->session_id = input->session_id;
Mukul Sharmae8c919f2016-10-02 20:35:15 +053013870
13871 /* Fill only when num_networks are non zero */
13872 if (req_msg->num_networks) {
13873 req_msg->min_5ghz_rssi = input->min_5ghz_rssi;
13874 req_msg->min_24ghz_rssi = input->min_24ghz_rssi;
13875 req_msg->initial_score_max = input->initial_score_max;
13876 req_msg->same_network_bonus = input->same_network_bonus;
13877 req_msg->secure_bonus = input->secure_bonus;
13878 req_msg->band_5ghz_bonus = input->band_5ghz_bonus;
13879 req_msg->current_connection_bonus =
13880 input->current_connection_bonus;
13881
13882 for (i = 0; i < req_msg->num_networks; i++) {
13883 req_msg->networks[i].flags = input->networks[i].flags;
13884 req_msg->networks[i].auth_bit_field =
13885 input->networks[i].auth_bit_field;
13886 req_msg->networks[i].ssid.length =
13887 input->networks[i].ssid.length;
13888 qdf_mem_copy(req_msg->networks[i].ssid.ssId,
13889 input->networks[i].ssid.ssId,
13890 req_msg->networks[i].ssid.length);
13891 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013892 }
13893
13894 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013895 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013896 sms_log(mac, LOGE,
13897 FL("sme_acquire_global_lock failed!(status=%d)"),
13898 status);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053013899 qdf_mem_free(req_msg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013900 return status;
13901 }
13902
13903 /* Serialize the req through MC thread */
13904 cds_message.bodyptr = req_msg;
13905 cds_message.type = WMA_SET_EPNO_LIST_REQ;
13906 status = cds_mq_post_message(CDS_MQ_ID_WMA, &cds_message);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013907 if (!QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013908 sms_log(mac, LOGE,
13909 FL("cds_mq_post_message failed!(err=%d)"),
13910 status);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053013911 qdf_mem_free(req_msg);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013912 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013913 }
13914 sme_release_global_lock(&mac->sme);
13915 return status;
13916}
13917
13918/**
13919 * sme_set_passpoint_list() - set passpoint network list
13920 * @hal: global hal handle
13921 * @input: request message
13922 *
13923 * This function constructs the cds message and fill in message type,
13924 * bodyptr with @input and posts it to WDA queue.
13925 *
Deepak Dhamdhere0f076bd2016-06-02 11:29:21 -070013926 * Return: QDF_STATUS enumeration
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013927 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013928QDF_STATUS sme_set_passpoint_list(tHalHandle hal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013929 struct wifi_passpoint_req *input)
13930{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013931 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013932 tpAniSirGlobal mac = PMAC_STRUCT(hal);
13933 cds_msg_t cds_message;
13934 struct wifi_passpoint_req *req_msg;
13935 int len, i;
13936
13937 sms_log(mac, LOG1, FL("enter"));
13938 len = sizeof(*req_msg) +
13939 (input->num_networks * sizeof(struct wifi_passpoint_network));
Anurag Chouhan600c3a02016-03-01 10:33:54 +053013940 req_msg = qdf_mem_malloc(len);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013941 if (!req_msg) {
Anurag Chouhan600c3a02016-03-01 10:33:54 +053013942 sms_log(mac, LOGE, FL("qdf_mem_malloc failed"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013943 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013944 }
13945
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013946 req_msg->num_networks = input->num_networks;
13947 req_msg->request_id = input->request_id;
13948 req_msg->session_id = input->session_id;
13949 for (i = 0; i < req_msg->num_networks; i++) {
13950 req_msg->networks[i].id =
13951 input->networks[i].id;
Anurag Chouhan600c3a02016-03-01 10:33:54 +053013952 qdf_mem_copy(req_msg->networks[i].realm,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013953 input->networks[i].realm,
13954 strlen(input->networks[i].realm) + 1);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053013955 qdf_mem_copy(req_msg->networks[i].plmn,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013956 input->networks[i].plmn,
13957 SIR_PASSPOINT_PLMN_LEN);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053013958 qdf_mem_copy(req_msg->networks[i].roaming_consortium_ids,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013959 input->networks[i].roaming_consortium_ids,
13960 sizeof(req_msg->networks[i].roaming_consortium_ids));
13961 }
13962
13963 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013964 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013965 sms_log(mac, LOGE,
13966 FL("sme_acquire_global_lock failed!(status=%d)"),
13967 status);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053013968 qdf_mem_free(req_msg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013969 return status;
13970 }
13971
13972 /* Serialize the req through MC thread */
13973 cds_message.bodyptr = req_msg;
13974 cds_message.type = WMA_SET_PASSPOINT_LIST_REQ;
13975 status = cds_mq_post_message(CDS_MQ_ID_WMA, &cds_message);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013976 if (!QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013977 sms_log(mac, LOGE,
13978 FL("cds_mq_post_message failed!(err=%d)"),
13979 status);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053013980 qdf_mem_free(req_msg);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013981 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013982 }
13983 sme_release_global_lock(&mac->sme);
13984 return status;
13985}
13986
13987/**
13988 * sme_reset_passpoint_list() - reset passpoint network list
13989 * @hHal: global hal handle
13990 * @input: request message
13991 *
Deepak Dhamdhere0f076bd2016-06-02 11:29:21 -070013992 * Return: QDF_STATUS enumeration
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013993 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013994QDF_STATUS sme_reset_passpoint_list(tHalHandle hal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013995 struct wifi_passpoint_req *input)
13996{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013997 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013998 tpAniSirGlobal mac = PMAC_STRUCT(hal);
13999 cds_msg_t cds_message;
14000 struct wifi_passpoint_req *req_msg;
14001
14002 sms_log(mac, LOG1, FL("enter"));
Anurag Chouhan600c3a02016-03-01 10:33:54 +053014003 req_msg = qdf_mem_malloc(sizeof(*req_msg));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014004 if (!req_msg) {
Anurag Chouhan600c3a02016-03-01 10:33:54 +053014005 sms_log(mac, LOGE, FL("qdf_mem_malloc failed"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014006 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014007 }
14008
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014009 req_msg->request_id = input->request_id;
14010 req_msg->session_id = input->session_id;
14011
14012 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014013 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014014 sms_log(mac, LOGE,
14015 FL("sme_acquire_global_lock failed!(status=%d)"),
14016 status);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053014017 qdf_mem_free(req_msg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014018 return status;
14019 }
14020
14021 /* Serialize the req through MC thread */
14022 cds_message.bodyptr = req_msg;
14023 cds_message.type = WMA_RESET_PASSPOINT_LIST_REQ;
14024 status = cds_mq_post_message(CDS_MQ_ID_WMA, &cds_message);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014025 if (!QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014026 sms_log(mac, LOGE,
14027 FL("cds_mq_post_message failed!(err=%d)"),
14028 status);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053014029 qdf_mem_free(req_msg);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014030 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014031 }
14032 sme_release_global_lock(&mac->sme);
14033 return status;
14034}
14035
14036/**
14037 * sme_set_ssid_hotlist() - Set the SSID hotlist
14038 * @hal: SME handle
14039 * @request: set ssid hotlist request
14040 *
Deepak Dhamdhere0f076bd2016-06-02 11:29:21 -070014041 * Return: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014042 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014043QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014044sme_set_ssid_hotlist(tHalHandle hal,
14045 struct sir_set_ssid_hotlist_request *request)
14046{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014047 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014048 tpAniSirGlobal mac = PMAC_STRUCT(hal);
14049 cds_msg_t cds_message;
14050 struct sir_set_ssid_hotlist_request *set_req;
14051
Anurag Chouhan600c3a02016-03-01 10:33:54 +053014052 set_req = qdf_mem_malloc(sizeof(*set_req));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014053 if (!set_req) {
Anurag Chouhan600c3a02016-03-01 10:33:54 +053014054 sms_log(mac, LOGE, FL("qdf_mem_malloc failed"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014055 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014056 }
14057
14058 *set_req = *request;
14059 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014060 if (QDF_STATUS_SUCCESS == status) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014061 /* Serialize the req through MC thread */
14062 cds_message.bodyptr = set_req;
14063 cds_message.type = WMA_EXTSCAN_SET_SSID_HOTLIST_REQ;
14064 status = cds_mq_post_message(CDS_MQ_ID_WMA, &cds_message);
14065 sme_release_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014066 if (!QDF_IS_STATUS_SUCCESS(status)) {
Anurag Chouhan600c3a02016-03-01 10:33:54 +053014067 qdf_mem_free(set_req);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014068 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014069 }
14070 } else {
14071 sms_log(mac, LOGE,
14072 FL("sme_acquire_global_lock failed!(status=%d)"),
14073 status);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053014074 qdf_mem_free(set_req);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014075 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014076 }
14077 return status;
14078}
14079
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014080QDF_STATUS sme_ext_scan_register_callback(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014081 void (*pExtScanIndCb)(void *,
14082 const uint16_t,
14083 void *))
14084{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014085 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014086 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
14087
14088 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014089 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014090 pMac->sme.pExtScanIndCb = pExtScanIndCb;
14091 sme_release_global_lock(&pMac->sme);
14092 }
14093 return status;
14094}
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014095#endif /* FEATURE_WLAN_EXTSCAN */
14096
14097#ifdef WLAN_FEATURE_LINK_LAYER_STATS
14098
14099/* ---------------------------------------------------------------------------
14100 \fn sme_ll_stats_clear_req
14101 \brief SME API to clear Link Layer Statistics
14102 \param hHal
14103 \param pclearStatsReq: Link Layer clear stats request params structure
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014104 \- return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014105 -------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014106QDF_STATUS sme_ll_stats_clear_req(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014107 tSirLLStatsClearReq *pclearStatsReq)
14108{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014109 QDF_STATUS status = QDF_STATUS_SUCCESS;
14110 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014111 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
14112 cds_msg_t cds_message;
14113 tSirLLStatsClearReq *clear_stats_req;
14114
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053014115 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014116 "staId = %u", pclearStatsReq->staId);
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053014117 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014118 "statsClearReqMask = 0x%X",
14119 pclearStatsReq->statsClearReqMask);
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053014120 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014121 "stopReq = %u", pclearStatsReq->stopReq);
14122
Anurag Chouhan600c3a02016-03-01 10:33:54 +053014123 clear_stats_req = qdf_mem_malloc(sizeof(*clear_stats_req));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014124
14125 if (!clear_stats_req) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053014126 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014127 "%s: Not able to allocate memory for WMA_LL_STATS_CLEAR_REQ",
14128 __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014129 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014130 }
14131
14132 *clear_stats_req = *pclearStatsReq;
14133
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014134 if (QDF_STATUS_SUCCESS == sme_acquire_global_lock(&pMac->sme)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014135 /* Serialize the req through MC thread */
14136 cds_message.bodyptr = clear_stats_req;
14137 cds_message.type = WMA_LINK_LAYER_STATS_CLEAR_REQ;
Sreelakshmi Konamki6a065362016-05-31 16:05:01 +053014138 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
14139 NO_SESSION, cds_message.type));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014140 qdf_status = cds_mq_post_message(CDS_MQ_ID_WMA, &cds_message);
14141 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053014142 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014143 "%s: not able to post WMA_LL_STATS_CLEAR_REQ",
14144 __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053014145 qdf_mem_free(clear_stats_req);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014146 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014147 }
14148 sme_release_global_lock(&pMac->sme);
14149 } else {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053014150 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR, "%s: "
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014151 "sme_acquire_global_lock error", __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053014152 qdf_mem_free(clear_stats_req);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014153 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014154 }
14155
14156 return status;
14157}
14158
14159/* ---------------------------------------------------------------------------
14160 \fn sme_ll_stats_set_req
14161 \brief SME API to set the Link Layer Statistics
14162 \param hHal
14163 \param psetStatsReq: Link Layer set stats request params structure
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014164 \- return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014165 -------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014166QDF_STATUS sme_ll_stats_set_req(tHalHandle hHal, tSirLLStatsSetReq *psetStatsReq)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014167{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014168 QDF_STATUS status = QDF_STATUS_SUCCESS;
14169 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014170 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
14171 cds_msg_t cds_message;
14172 tSirLLStatsSetReq *set_stats_req;
14173
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053014174 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014175 "%s: MPDU Size = %u", __func__,
14176 psetStatsReq->mpduSizeThreshold);
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053014177 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014178 " Aggressive Stats Collections = %u",
14179 psetStatsReq->aggressiveStatisticsGathering);
14180
Anurag Chouhan600c3a02016-03-01 10:33:54 +053014181 set_stats_req = qdf_mem_malloc(sizeof(*set_stats_req));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014182
14183 if (!set_stats_req) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053014184 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014185 "%s: Not able to allocate memory for WMA_LL_STATS_SET_REQ",
14186 __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014187 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014188 }
14189
14190 *set_stats_req = *psetStatsReq;
14191
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014192 if (QDF_STATUS_SUCCESS == sme_acquire_global_lock(&pMac->sme)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014193 /* Serialize the req through MC thread */
14194 cds_message.bodyptr = set_stats_req;
14195 cds_message.type = WMA_LINK_LAYER_STATS_SET_REQ;
Sreelakshmi Konamki6a065362016-05-31 16:05:01 +053014196 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
14197 NO_SESSION, cds_message.type));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014198 qdf_status = cds_mq_post_message(CDS_MQ_ID_WMA, &cds_message);
14199 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053014200 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014201 "%s: not able to post WMA_LL_STATS_SET_REQ",
14202 __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053014203 qdf_mem_free(set_stats_req);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014204 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014205 }
14206 sme_release_global_lock(&pMac->sme);
14207 } else {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053014208 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR, "%s: "
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014209 "sme_acquire_global_lock error", __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053014210 qdf_mem_free(set_stats_req);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014211 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014212 }
14213
14214 return status;
14215}
14216
14217/* ---------------------------------------------------------------------------
14218 \fn sme_ll_stats_get_req
14219 \brief SME API to get the Link Layer Statistics
14220 \param hHal
14221 \param pgetStatsReq: Link Layer get stats request params structure
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014222 \- return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014223 -------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014224QDF_STATUS sme_ll_stats_get_req(tHalHandle hHal, tSirLLStatsGetReq *pgetStatsReq)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014225{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014226 QDF_STATUS status = QDF_STATUS_SUCCESS;
14227 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014228 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
14229 cds_msg_t cds_message;
14230 tSirLLStatsGetReq *get_stats_req;
14231
Anurag Chouhan600c3a02016-03-01 10:33:54 +053014232 get_stats_req = qdf_mem_malloc(sizeof(*get_stats_req));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014233
14234 if (!get_stats_req) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053014235 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014236 "%s: Not able to allocate memory for WMA_LL_STATS_GET_REQ",
14237 __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014238 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014239 }
14240
14241 *get_stats_req = *pgetStatsReq;
14242
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014243 if (QDF_STATUS_SUCCESS == sme_acquire_global_lock(&pMac->sme)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014244 /* Serialize the req through MC thread */
14245 cds_message.bodyptr = get_stats_req;
14246 cds_message.type = WMA_LINK_LAYER_STATS_GET_REQ;
Sreelakshmi Konamki6a065362016-05-31 16:05:01 +053014247 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
14248 NO_SESSION, cds_message.type));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014249 qdf_status = cds_mq_post_message(CDS_MQ_ID_WMA, &cds_message);
14250 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053014251 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014252 "%s: not able to post WMA_LL_STATS_GET_REQ",
14253 __func__);
14254
Anurag Chouhan600c3a02016-03-01 10:33:54 +053014255 qdf_mem_free(get_stats_req);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014256 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014257
14258 }
14259 sme_release_global_lock(&pMac->sme);
14260 } else {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053014261 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR, "%s: "
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014262 "sme_acquire_global_lock error", __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053014263 qdf_mem_free(get_stats_req);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014264 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014265 }
14266
14267 return status;
14268}
14269
14270/* ---------------------------------------------------------------------------
14271 \fn sme_set_link_layer_stats_ind_cb
14272 \brief SME API to trigger the stats are available after get request
14273 \param hHal
14274 \param callback_routine - HDD callback which needs to be invoked after
14275 getting status notification from FW
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014276 \- return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014277 -------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014278QDF_STATUS sme_set_link_layer_stats_ind_cb
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014279 (tHalHandle hHal,
14280 void (*callback_routine)(void *callbackCtx, int indType, void *pRsp)
14281 ) {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014282 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014283 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
14284
14285 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014286 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014287 pMac->sme.pLinkLayerStatsIndCallback = callback_routine;
14288 sme_release_global_lock(&pMac->sme);
14289 } else {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053014290 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR, "%s: "
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014291 "sme_acquire_global_lock error", __func__);
14292 }
14293
14294 return status;
14295}
14296
Arun Khandavalli4b55da72016-07-19 19:55:01 +053014297/**
14298 * sme_reset_link_layer_stats_ind_cb() - SME API to reset link layer stats
14299 * indication
14300 * @h_hal: Hal Handle
14301 *
14302 * This function reset's the link layer stats indication
14303 *
14304 * Return: QDF_STATUS Enumeration
14305 */
14306
14307QDF_STATUS sme_reset_link_layer_stats_ind_cb(tHalHandle h_hal)
14308{
14309 QDF_STATUS status;
14310 tpAniSirGlobal pmac;
14311
14312 if (!h_hal) {
14313 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
14314 FL("hHal is not valid"));
14315 return QDF_STATUS_E_INVAL;
14316 }
14317 pmac = PMAC_STRUCT(h_hal);
14318
14319 status = sme_acquire_global_lock(&pmac->sme);
14320 if (QDF_IS_STATUS_SUCCESS(status)) {
14321 pmac->sme.pLinkLayerStatsIndCallback = NULL;
14322 sme_release_global_lock(&pmac->sme);
14323 } else {
14324 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR, "%s: sme_acquire_global_lock error",
14325 __func__);
14326 }
14327
14328 return status;
14329}
14330
14331
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014332#endif /* WLAN_FEATURE_LINK_LAYER_STATS */
14333
14334/**
14335 * sme_fw_mem_dump_register_cb() - Register fw memory dump callback
14336 *
14337 * @hal - MAC global handle
14338 * @callback_routine - callback routine from HDD
14339 *
14340 * This API is invoked by HDD to register its callback in SME
14341 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014342 * Return: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014343 */
14344#ifdef WLAN_FEATURE_MEMDUMP
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014345QDF_STATUS sme_fw_mem_dump_register_cb(tHalHandle hal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014346 void (*callback_routine)(void *cb_context,
14347 struct fw_dump_rsp *rsp))
14348{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014349 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014350 tpAniSirGlobal pmac = PMAC_STRUCT(hal);
14351
14352 status = sme_acquire_global_lock(&pmac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014353 if (QDF_STATUS_SUCCESS == status) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014354 pmac->sme.fw_dump_callback = callback_routine;
14355 sme_release_global_lock(&pmac->sme);
14356 } else {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053014357 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014358 FL("sme_acquire_global_lock error"));
14359 }
14360
14361 return status;
14362}
14363#else
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014364QDF_STATUS sme_fw_mem_dump_register_cb(tHalHandle hal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014365 void (*callback_routine)(void *cb_context,
14366 struct fw_dump_rsp *rsp))
14367{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014368 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014369}
14370#endif /* WLAN_FEATURE_MEMDUMP */
14371
14372/**
14373 * sme_fw_mem_dump_unregister_cb() - Unregister fw memory dump callback
14374 *
14375 * @hHal - MAC global handle
14376 *
14377 * This API is invoked by HDD to unregister its callback in SME
14378 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014379 * Return: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014380 */
14381#ifdef WLAN_FEATURE_MEMDUMP
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014382QDF_STATUS sme_fw_mem_dump_unregister_cb(tHalHandle hal)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014383{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014384 QDF_STATUS status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014385 tpAniSirGlobal pmac = PMAC_STRUCT(hal);
14386
14387 status = sme_acquire_global_lock(&pmac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014388 if (QDF_STATUS_SUCCESS == status) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014389 pmac->sme.fw_dump_callback = NULL;
14390 sme_release_global_lock(&pmac->sme);
14391 } else {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053014392 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014393 FL("sme_acquire_global_lock error"));
14394 }
14395
14396 return status;
14397}
14398#else
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014399QDF_STATUS sme_fw_mem_dump_unregister_cb(tHalHandle hal)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014400{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014401 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014402}
14403#endif /* WLAN_FEATURE_MEMDUMP */
14404
14405#ifdef WLAN_FEATURE_ROAM_OFFLOAD
14406/*--------------------------------------------------------------------------
14407 \brief sme_update_roam_offload_enabled() - enable/disable roam offload feaure
14408 It is used at in the REG_DYNAMIC_VARIABLE macro definition of
14409 \param hHal - The handle returned by mac_open.
14410 \param nRoamOffloadEnabled - The bool to update with
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014411 \return QDF_STATUS_SUCCESS - SME update config successfully.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014412 Other status means SME is failed to update.
14413 \sa
14414 --------------------------------------------------------------------------*/
14415
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014416QDF_STATUS sme_update_roam_offload_enabled(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014417 bool nRoamOffloadEnabled)
14418{
14419 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014420 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014421
14422 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014423 if (QDF_IS_STATUS_SUCCESS(status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053014424 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014425 "%s: LFR3:gRoamOffloadEnabled is changed from %d to %d",
14426 __func__, pMac->roam.configParam.isRoamOffloadEnabled,
14427 nRoamOffloadEnabled);
14428 pMac->roam.configParam.isRoamOffloadEnabled =
14429 nRoamOffloadEnabled;
14430 sme_release_global_lock(&pMac->sme);
14431 }
14432
14433 return status;
14434}
14435
Deepak Dhamdheref2a7d8b2016-08-19 16:17:38 -070014436/**
14437 * sme_update_roam_key_mgmt_offload_enabled() - enable/disable key mgmt offload
14438 * This is a synchronous call
14439 * @hal_ctx: The handle returned by mac_open.
14440 * @session_id: Session Identifier
14441 * @key_mgmt_offload_enabled: key mgmt enable/disable flag
14442 * @okc_enabled: Opportunistic key caching enable/disable flag
14443 * Return: QDF_STATUS_SUCCESS - SME updated config successfully.
14444 * Other status means SME is failed to update.
14445 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014446
Deepak Dhamdheref2a7d8b2016-08-19 16:17:38 -070014447QDF_STATUS sme_update_roam_key_mgmt_offload_enabled(tHalHandle hal_ctx,
14448 uint8_t session_id,
14449 bool key_mgmt_offload_enabled,
14450 bool okc_enabled)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014451{
Deepak Dhamdheref2a7d8b2016-08-19 16:17:38 -070014452 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal_ctx);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014453 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014454
Deepak Dhamdheref2a7d8b2016-08-19 16:17:38 -070014455 status = sme_acquire_global_lock(&mac_ctx->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014456 if (QDF_IS_STATUS_SUCCESS(status)) {
Deepak Dhamdheref2a7d8b2016-08-19 16:17:38 -070014457 if (CSR_IS_SESSION_VALID(mac_ctx, session_id)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053014458 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO,
Deepak Dhamdheref2a7d8b2016-08-19 16:17:38 -070014459 "%s: LFR3: key_mgmt_offload_enabled changed to %d",
14460 __func__, key_mgmt_offload_enabled);
14461 status = csr_roam_set_key_mgmt_offload(mac_ctx,
14462 session_id,
14463 key_mgmt_offload_enabled,
14464 okc_enabled);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014465 } else {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014466 status = QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014467 }
Deepak Dhamdheref2a7d8b2016-08-19 16:17:38 -070014468 sme_release_global_lock(&mac_ctx->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014469 }
14470
14471 return status;
14472}
Prashanth Bhattabfc25292015-11-05 11:16:21 -080014473#endif
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014474
14475/* ---------------------------------------------------------------------------
14476 \fn sme_get_temperature
14477 \brief SME API to get the pdev temperature
14478 \param hHal
14479 \param temperature context
14480 \param pCallbackfn: callback fn with response (temperature)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014481 \- return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014482 -------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014483QDF_STATUS sme_get_temperature(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014484 void *tempContext,
14485 void (*pCallbackfn)(int temperature,
14486 void *pContext))
14487{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014488 QDF_STATUS status = QDF_STATUS_SUCCESS;
14489 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014490 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
14491 cds_msg_t cds_message;
14492
14493 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014494 if (QDF_STATUS_SUCCESS == status) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014495 if ((NULL == pCallbackfn) &&
14496 (NULL == pMac->sme.pGetTemperatureCb)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053014497 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014498 FL
14499 ("Indication Call back did not registered"));
14500 sme_release_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014501 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014502 } else if (NULL != pCallbackfn) {
14503 pMac->sme.pTemperatureCbContext = tempContext;
14504 pMac->sme.pGetTemperatureCb = pCallbackfn;
14505 }
14506 /* serialize the req through MC thread */
14507 cds_message.bodyptr = NULL;
14508 cds_message.type = WMA_GET_TEMPERATURE_REQ;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014509 qdf_status = cds_mq_post_message(CDS_MQ_ID_WMA, &cds_message);
14510 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053014511 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014512 FL("Post Get Temperature msg fail"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014513 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014514 }
14515 sme_release_global_lock(&pMac->sme);
14516 }
14517 return status;
14518}
14519
14520/* ---------------------------------------------------------------------------
14521 \fn sme_set_scanning_mac_oui
14522 \brief SME API to set scanning mac oui
14523 \param hHal
14524 \param pScanMacOui: Scanning Mac Oui (input 3 bytes)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014525 \- return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014526 -------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014527QDF_STATUS sme_set_scanning_mac_oui(tHalHandle hHal, tSirScanMacOui *pScanMacOui)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014528{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014529 QDF_STATUS status = QDF_STATUS_SUCCESS;
14530 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014531 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
14532 cds_msg_t cds_message;
14533
14534 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014535 if (QDF_STATUS_SUCCESS == status) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014536 /* Serialize the req through MC thread */
14537 cds_message.bodyptr = pScanMacOui;
14538 cds_message.type = WMA_SET_SCAN_MAC_OUI_REQ;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014539 qdf_status = cds_mq_post_message(CDS_MQ_ID_WMA, &cds_message);
14540 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053014541 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014542 FL("Msg post Set Scan Mac OUI failed"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014543 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014544 }
14545 sme_release_global_lock(&pMac->sme);
14546 }
14547 return status;
14548}
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014549
14550#ifdef DHCP_SERVER_OFFLOAD
14551/* ---------------------------------------------------------------------------
14552 \fn sme_set_dhcp_srv_offload
14553 \brief SME API to set DHCP server offload info
14554 \param hHal
14555 \param pDhcpSrvInfo : DHCP server offload info struct
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014556 \- return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014557 -------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014558QDF_STATUS sme_set_dhcp_srv_offload(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014559 tSirDhcpSrvOffloadInfo *pDhcpSrvInfo)
14560{
14561 cds_msg_t cds_message;
14562 tSirDhcpSrvOffloadInfo *pSmeDhcpSrvInfo;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014563 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014564 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
14565
Anurag Chouhan600c3a02016-03-01 10:33:54 +053014566 pSmeDhcpSrvInfo = qdf_mem_malloc(sizeof(*pSmeDhcpSrvInfo));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014567
14568 if (!pSmeDhcpSrvInfo) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053014569 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014570 "%s: Not able to allocate memory for WMA_SET_DHCP_SERVER_OFFLOAD_CMD",
14571 __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014572 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014573 }
14574
14575 *pSmeDhcpSrvInfo = *pDhcpSrvInfo;
14576
14577 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014578 if (QDF_STATUS_SUCCESS == status) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014579 /* serialize the req through MC thread */
14580 cds_message.type = WMA_SET_DHCP_SERVER_OFFLOAD_CMD;
14581 cds_message.bodyptr = pSmeDhcpSrvInfo;
14582
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014583 if (!QDF_IS_STATUS_SUCCESS
Anurag Chouhan6d760662016-02-20 16:05:43 +053014584 (cds_mq_post_message(QDF_MODULE_ID_WMA, &cds_message))) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053014585 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014586 "%s: Not able to post WMA_SET_DHCP_SERVER_OFFLOAD_CMD to WMA!",
14587 __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053014588 qdf_mem_free(pSmeDhcpSrvInfo);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014589 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014590 }
14591 sme_release_global_lock(&pMac->sme);
14592 } else {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053014593 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014594 "%s: sme_acquire_global_lock error!", __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053014595 qdf_mem_free(pSmeDhcpSrvInfo);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014596 }
14597
14598 return status;
14599}
14600#endif /* DHCP_SERVER_OFFLOAD */
14601
14602#ifdef WLAN_FEATURE_GPIO_LED_FLASHING
14603/* ---------------------------------------------------------------------------
14604 \fn sme_set_led_flashing
14605 \brief API to set the Led flashing parameters.
14606 \param hHal - The handle returned by mac_open.
14607 \param x0, x1 - led flashing parameters
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014608 \return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014609 ---------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014610QDF_STATUS sme_set_led_flashing(tHalHandle hHal, uint8_t type,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014611 uint32_t x0, uint32_t x1)
14612{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014613 QDF_STATUS status = QDF_STATUS_SUCCESS;
14614 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014615 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
14616 cds_msg_t cds_message;
14617 tSirLedFlashingReq *ledflashing;
14618
Anurag Chouhan600c3a02016-03-01 10:33:54 +053014619 ledflashing = qdf_mem_malloc(sizeof(*ledflashing));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014620 if (!ledflashing) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053014621 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014622 FL
14623 ("Not able to allocate memory for WMA_LED_TIMING_REQ"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014624 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014625 }
14626
14627 ledflashing->pattern_id = type;
14628 ledflashing->led_x0 = x0;
14629 ledflashing->led_x1 = x1;
14630
14631 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014632 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014633 /* Serialize the req through MC thread */
14634 cds_message.bodyptr = ledflashing;
14635 cds_message.type = WMA_LED_FLASHING_REQ;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014636 qdf_status = cds_mq_post_message(CDS_MQ_ID_WMA, &cds_message);
14637 if (!QDF_IS_STATUS_SUCCESS(qdf_status))
14638 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014639 sme_release_global_lock(&pMac->sme);
14640 }
14641 return status;
14642}
14643#endif
14644
14645/**
14646 * sme_handle_dfS_chan_scan() - handle DFS channel configuration
14647 * @h_hal: corestack handler
14648 * @dfs_flag: flag indicating dfs channel enable/disable
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014649 * Return: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014650 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014651QDF_STATUS sme_handle_dfs_chan_scan(tHalHandle h_hal, uint8_t dfs_flag)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014652{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014653 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014654 tpAniSirGlobal mac = PMAC_STRUCT(h_hal);
14655
14656 status = sme_acquire_global_lock(&mac->sme);
14657
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014658 if (QDF_STATUS_SUCCESS == status) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014659
14660 mac->scan.fEnableDFSChnlScan = dfs_flag;
14661
14662 /* update the channel list to the firmware */
14663 status = csr_update_channel_list(mac);
14664
14665 sme_release_global_lock(&mac->sme);
14666 }
14667
14668 return status;
14669}
14670
Edhar, Mahesh Kumardf2ec122015-11-16 11:33:16 +053014671#ifdef FEATURE_WLAN_MCC_TO_SCC_SWITCH
14672/**
14673 * sme_validate_sap_channel_switch() - validate target channel switch w.r.t
14674 * concurreny rules set to avoid channel interference.
14675 * @hal - Hal context
14676 * @sap_ch - channel to switch
14677 * @sap_phy_mode - phy mode of SAP
14678 * @cc_switch_mode - concurreny switch mode
14679 * @session_id - sme session id.
14680 *
14681 * Return: true if there is no channel interference else return false
14682 */
14683bool sme_validate_sap_channel_switch(tHalHandle hal,
14684 uint16_t sap_ch, eCsrPhyMode sap_phy_mode, uint8_t cc_switch_mode,
14685 uint8_t session_id)
14686{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014687 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Edhar, Mahesh Kumardf2ec122015-11-16 11:33:16 +053014688 tpAniSirGlobal mac = PMAC_STRUCT(hal);
14689 tCsrRoamSession *session = CSR_GET_SESSION(mac, session_id);
14690 uint16_t intf_channel = 0;
14691
14692 if (!session)
14693 return false;
14694
14695 session->ch_switch_in_progress = true;
14696 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014697 if (QDF_IS_STATUS_SUCCESS(status)) {
Edhar, Mahesh Kumardf2ec122015-11-16 11:33:16 +053014698 intf_channel = csr_check_concurrent_channel_overlap(mac, sap_ch,
14699 sap_phy_mode,
14700 cc_switch_mode);
14701 sme_release_global_lock(&mac->sme);
14702 } else {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053014703 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Edhar, Mahesh Kumardf2ec122015-11-16 11:33:16 +053014704 FL("sme_acquire_global_lock error!"));
14705 session->ch_switch_in_progress = false;
14706 return false;
14707 }
14708
14709 session->ch_switch_in_progress = false;
14710 return (intf_channel == 0) ? true : false;
14711}
14712#endif
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014713
14714/**
14715 * sme_configure_stats_avg_factor() - function to config avg. stats factor
14716 * @hal: hal
14717 * @session_id: session ID
14718 * @stats_avg_factor: average stats factor
14719 *
14720 * This function configures the stats avg factor in firmware
14721 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014722 * Return: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014723 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014724QDF_STATUS sme_configure_stats_avg_factor(tHalHandle hal, uint8_t session_id,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014725 uint16_t stats_avg_factor)
14726{
14727 cds_msg_t msg;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014728 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014729 tpAniSirGlobal mac = PMAC_STRUCT(hal);
14730 struct sir_stats_avg_factor *stats_factor;
14731
Anurag Chouhan600c3a02016-03-01 10:33:54 +053014732 stats_factor = qdf_mem_malloc(sizeof(*stats_factor));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014733
14734 if (!stats_factor) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053014735 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014736 "%s: Not able to allocate memory for SIR_HAL_CONFIG_STATS_FACTOR",
14737 __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014738 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014739 }
14740
14741 status = sme_acquire_global_lock(&mac->sme);
14742
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014743 if (QDF_STATUS_SUCCESS == status) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014744
14745 stats_factor->vdev_id = session_id;
14746 stats_factor->stats_avg_factor = stats_avg_factor;
14747
14748 /* serialize the req through MC thread */
14749 msg.type = SIR_HAL_CONFIG_STATS_FACTOR;
14750 msg.bodyptr = stats_factor;
14751
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014752 if (!QDF_IS_STATUS_SUCCESS(
Anurag Chouhan6d760662016-02-20 16:05:43 +053014753 cds_mq_post_message(QDF_MODULE_ID_WMA, &msg))) {
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 post SIR_HAL_CONFIG_STATS_FACTOR to WMA!",
14756 __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053014757 qdf_mem_free(stats_factor);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014758 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014759 }
14760 sme_release_global_lock(&mac->sme);
14761 } else {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053014762 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014763 "%s: sme_acquire_global_lock error!",
14764 __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053014765 qdf_mem_free(stats_factor);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014766 }
14767
14768 return status;
14769}
14770
14771/**
14772 * sme_configure_guard_time() - function to configure guard time
14773 * @hal: hal
14774 * @session_id: session id
14775 * @guard_time: guard time
14776 *
14777 * This function configures the guard time in firmware
14778 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014779 * Return: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014780 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014781QDF_STATUS sme_configure_guard_time(tHalHandle hal, uint8_t session_id,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014782 uint32_t guard_time)
14783{
14784 cds_msg_t msg;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014785 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014786 tpAniSirGlobal mac = PMAC_STRUCT(hal);
14787 struct sir_guard_time_request *g_time;
14788
Anurag Chouhan600c3a02016-03-01 10:33:54 +053014789 g_time = qdf_mem_malloc(sizeof(*g_time));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014790
14791 if (!g_time) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053014792 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014793 "%s: Not able to allocate memory for SIR_HAL_CONFIG_GUARD_TIME",
14794 __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014795 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014796 }
14797
14798 status = sme_acquire_global_lock(&mac->sme);
14799
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014800 if (QDF_STATUS_SUCCESS == status) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014801
14802 g_time->vdev_id = session_id;
14803 g_time->guard_time = guard_time;
14804
14805 /* serialize the req through MC thread */
14806 msg.type = SIR_HAL_CONFIG_GUARD_TIME;
14807 msg.bodyptr = g_time;
14808
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014809 if (!QDF_IS_STATUS_SUCCESS(
Anurag Chouhan6d760662016-02-20 16:05:43 +053014810 cds_mq_post_message(QDF_MODULE_ID_WMA, &msg))) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053014811 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014812 "%s: Not able to post SIR_HAL_CONFIG_GUARD_TIME to WMA!",
14813 __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053014814 qdf_mem_free(g_time);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014815 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014816 }
14817 sme_release_global_lock(&mac->sme);
14818 } else {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053014819 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014820 "%s: sme_acquire_global_lock error!",
14821 __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053014822 qdf_mem_free(g_time);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014823 }
14824
14825 return status;
14826}
14827
14828/**
14829 * sme_configure_modulated_dtim() - function to configure modulated dtim
14830 * @h_hal: SME API to enable/disable modulated DTIM instantaneously
14831 * @session_id: session ID
14832 * @modulated_dtim: modulated dtim value
14833 *
14834 * This function configures the modulated dtim in firmware
14835 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014836 * Return: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014837 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014838QDF_STATUS sme_configure_modulated_dtim(tHalHandle h_hal, uint8_t session_id,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014839 uint32_t modulated_dtim)
14840{
14841 cds_msg_t msg;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014842 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014843 tpAniSirGlobal mac = PMAC_STRUCT(h_hal);
14844 wma_cli_set_cmd_t *iwcmd;
14845
Anurag Chouhan600c3a02016-03-01 10:33:54 +053014846 iwcmd = qdf_mem_malloc(sizeof(*iwcmd));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014847 if (NULL == iwcmd) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053014848 QDF_TRACE(QDF_MODULE_ID_SME,
14849 QDF_TRACE_LEVEL_FATAL,
Anurag Chouhanf04e84f2016-03-03 10:12:12 +053014850 "%s: qdf_mem_malloc failed", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014851 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014852 }
14853
14854 status = sme_acquire_global_lock(&mac->sme);
14855
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014856 if (QDF_STATUS_SUCCESS == status) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014857
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014858 iwcmd->param_value = modulated_dtim;
14859 iwcmd->param_vdev_id = session_id;
14860 iwcmd->param_id = GEN_PARAM_MODULATED_DTIM;
14861 iwcmd->param_vp_dev = GEN_CMD;
14862 msg.type = WMA_CLI_SET_CMD;
14863 msg.reserved = 0;
14864 msg.bodyptr = (void *)iwcmd;
14865
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014866 if (!QDF_IS_STATUS_SUCCESS(
Anurag Chouhan6d760662016-02-20 16:05:43 +053014867 cds_mq_post_message(QDF_MODULE_ID_WMA, &msg))) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053014868 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014869 "%s: Not able to post GEN_PARAM_DYNAMIC_DTIM to WMA!",
14870 __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053014871 qdf_mem_free(iwcmd);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014872 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014873 }
14874 sme_release_global_lock(&mac->sme);
14875 } else {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053014876 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014877 "%s: sme_acquire_global_lock error!",
14878 __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053014879 qdf_mem_free(iwcmd);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014880 }
14881
14882 return status;
14883}
14884
14885/*
14886 * sme_wifi_start_logger() - Send the start/stop logging command to WMA
14887 * to either start/stop logging
14888 * @hal: HAL context
14889 * @start_log: Structure containing the wifi start logger params
14890 *
14891 * This function sends the start/stop logging command to WMA
14892 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014893 * Return: QDF_STATUS_SUCCESS on successful posting
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014894 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014895QDF_STATUS sme_wifi_start_logger(tHalHandle hal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014896 struct sir_wifi_start_log start_log)
14897{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014898 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014899 tpAniSirGlobal mac = PMAC_STRUCT(hal);
14900 cds_msg_t cds_message;
14901 struct sir_wifi_start_log *req_msg;
14902 uint32_t len;
14903
14904 len = sizeof(*req_msg);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053014905 req_msg = qdf_mem_malloc(len);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014906 if (!req_msg) {
Anurag Chouhan600c3a02016-03-01 10:33:54 +053014907 sms_log(mac, LOGE, FL("qdf_mem_malloc failed"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014908 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014909 }
14910
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014911 req_msg->verbose_level = start_log.verbose_level;
Poddar, Siddartheefe3482016-09-21 18:12:59 +053014912 req_msg->is_iwpriv_command = start_log.is_iwpriv_command;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014913 req_msg->ring_id = start_log.ring_id;
Srinivas Girigowdac34f11d2016-02-25 16:02:42 -080014914 req_msg->ini_triggered = start_log.ini_triggered;
14915 req_msg->user_triggered = start_log.user_triggered;
Poddar, Siddarth176c4362016-10-03 12:25:00 +053014916 req_msg->size = start_log.size;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014917
14918 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014919 if (status != QDF_STATUS_SUCCESS) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014920 sms_log(mac, LOGE,
14921 FL("sme_acquire_global_lock failed(status=%d)"),
14922 status);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053014923 qdf_mem_free(req_msg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014924 return status;
14925 }
14926
14927 /* Serialize the req through MC thread */
14928 cds_message.bodyptr = req_msg;
14929 cds_message.type = SIR_HAL_START_STOP_LOGGING;
14930 status = cds_mq_post_message(CDS_MQ_ID_WMA, &cds_message);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014931 if (!QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014932 sms_log(mac, LOGE,
Arun Khandavalli2476ef52016-04-26 20:19:43 +053014933 FL("cds_mq_post_message failed!(err=%d)"),
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014934 status);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053014935 qdf_mem_free(req_msg);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014936 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014937 }
14938 sme_release_global_lock(&mac->sme);
14939
14940 return status;
14941}
14942
14943/**
14944 * sme_neighbor_middle_of_roaming() - Function to know if
14945 * STA is in the middle of roaming states
14946 * @hal: Handle returned by macOpen
14947 * @sessionId: sessionId of the STA session
14948 *
14949 * This function is a wrapper to call
14950 * csr_neighbor_middle_of_roaming to know STA is in the
14951 * middle of roaming states
14952 *
14953 * Return: True or False
14954 *
14955 */
14956bool sme_neighbor_middle_of_roaming(tHalHandle hHal, uint8_t sessionId)
14957{
Sandeep Puligillaca631612016-11-08 11:53:52 -080014958 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hHal);
14959 bool val = false;
14960
14961 if (CSR_IS_SESSION_VALID(mac_ctx, sessionId))
14962 val = csr_neighbor_middle_of_roaming(mac_ctx, sessionId);
14963 else
14964 sms_log(mac_ctx, LOGE, FL("Invalid Sesion = %d"), sessionId);
14965 return val;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014966}
14967
14968/*
14969 * sme_send_flush_logs_cmd_to_fw() - Flush FW logs
14970 * @mac: MAC handle
14971 *
14972 * This function is used to send the command that will
14973 * be used to flush the logs in the firmware
14974 *
Deepak Dhamdhere0f076bd2016-06-02 11:29:21 -070014975 * Return: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014976 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014977QDF_STATUS sme_send_flush_logs_cmd_to_fw(tpAniSirGlobal mac)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014978{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014979 QDF_STATUS status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014980 cds_msg_t message;
14981
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014982 /* Serialize the req through MC thread */
14983 message.bodyptr = NULL;
14984 message.type = SIR_HAL_FLUSH_LOG_TO_FW;
14985 status = cds_mq_post_message(CDS_MQ_ID_WMA, &message);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014986 if (!QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014987 sms_log(mac, LOGE,
14988 FL("cds_mq_post_message failed!(err=%d)"),
14989 status);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014990 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014991 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014992 return status;
14993}
14994
14995/**
14996 * sme_enable_uapsd_for_ac() - enable uapsd for access catagory requerst to WMA
14997 * @cds_ctx: cds context
14998 * @sta_id: station id
14999 * @ac: access catagory
15000 * @tid: tid value
15001 * @pri: user priority
15002 * @srvc_int: service interval
15003 * @sus_int: suspend interval
15004 * @dir: tspec direction
15005 * @psb: PSB value
15006 * @sessionId: session id
15007 * @delay_interval: delay interval
15008 *
Anurag Chouhanf04e84f2016-03-03 10:12:12 +053015009 * Return: QDF status
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015010 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015011QDF_STATUS sme_enable_uapsd_for_ac(void *cds_ctx, uint8_t sta_id,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015012 sme_ac_enum_type ac, uint8_t tid,
15013 uint8_t pri, uint32_t srvc_int,
15014 uint32_t sus_int,
15015 sme_tspec_dir_type dir,
15016 uint8_t psb, uint32_t sessionId,
15017 uint32_t delay_interval)
15018{
15019 void *wma_handle;
15020 t_wma_trigger_uapsd_params uapsd_params;
15021 enum uapsd_ac access_category;
15022
15023 if (!psb) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053015024 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015025 "No need to configure auto trigger:psb is 0");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015026 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015027 }
15028
Anurag Chouhan6d760662016-02-20 16:05:43 +053015029 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015030 if (!wma_handle) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053015031 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015032 "wma_handle is NULL");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015033 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015034 }
15035
15036 switch (ac) {
15037 case SME_AC_BK:
15038 access_category = UAPSD_BK;
15039 break;
15040 case SME_AC_BE:
15041 access_category = UAPSD_BE;
15042 break;
15043 case SME_AC_VI:
15044 access_category = UAPSD_VI;
15045 break;
15046 case SME_AC_VO:
15047 access_category = UAPSD_VO;
15048 break;
15049 default:
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015050 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015051 }
15052
15053 uapsd_params.wmm_ac = access_category;
15054 uapsd_params.user_priority = pri;
15055 uapsd_params.service_interval = srvc_int;
15056 uapsd_params.delay_interval = delay_interval;
15057 uapsd_params.suspend_interval = sus_int;
15058
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015059 if (QDF_STATUS_SUCCESS !=
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015060 wma_trigger_uapsd_params(wma_handle, sessionId, &uapsd_params)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053015061 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015062 "Failed to Trigger Uapsd params for sessionId %d",
15063 sessionId);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015064 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015065 }
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015066 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015067}
15068
15069/**
15070 * sme_disable_uapsd_for_ac() - disable uapsed access catagory request to WMA
15071 * @cds_ctx: cds context
15072 * @sta_id: station id
15073 * @ac: access catagory
15074 * @sessionId: session id
15075 *
Anurag Chouhanf04e84f2016-03-03 10:12:12 +053015076 * Return: QDF status
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015077 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015078QDF_STATUS sme_disable_uapsd_for_ac(void *cds_ctx, uint8_t sta_id,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015079 sme_ac_enum_type ac,
15080 uint32_t sessionId)
15081{
15082 void *wma_handle;
15083 enum uapsd_ac access_category;
15084
15085 switch (ac) {
15086 case SME_AC_BK:
15087 access_category = UAPSD_BK;
15088 break;
15089 case SME_AC_BE:
15090 access_category = UAPSD_BE;
15091 break;
15092 case SME_AC_VI:
15093 access_category = UAPSD_VI;
15094 break;
15095 case SME_AC_VO:
15096 access_category = UAPSD_VO;
15097 break;
15098 default:
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015099 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015100 }
15101
Anurag Chouhan6d760662016-02-20 16:05:43 +053015102 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015103 if (!wma_handle) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053015104 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015105 "wma handle is NULL");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015106 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015107 }
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015108 if (QDF_STATUS_SUCCESS !=
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015109 wma_disable_uapsd_per_ac(wma_handle, sessionId, access_category)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053015110 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015111 "Failed to disable uapsd for ac %d for sessionId %d",
15112 ac, sessionId);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015113 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015114 }
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015115 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015116}
15117
15118/**
15119 * sme_update_nss() - SME API to change the number for spatial streams
15120 * (1 or 2)
15121 * @hal: Handle returned by mac open
15122 * @nss: Number of spatial streams
15123 *
15124 * This function is used to update the number of spatial streams supported.
15125 *
15126 * Return: Success upon successfully changing nss else failure
15127 *
15128 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015129QDF_STATUS sme_update_nss(tHalHandle h_hal, uint8_t nss)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015130{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015131 QDF_STATUS status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015132 tpAniSirGlobal mac_ctx = PMAC_STRUCT(h_hal);
15133 uint32_t i, value = 0;
15134 union {
15135 uint16_t cfg_value16;
15136 tSirMacHTCapabilityInfo ht_cap_info;
15137 } uHTCapabilityInfo;
15138 tCsrRoamSession *csr_session;
15139
15140 status = sme_acquire_global_lock(&mac_ctx->sme);
15141
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015142 if (QDF_STATUS_SUCCESS == status) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015143 mac_ctx->roam.configParam.enable2x2 = (nss == 1) ? 0 : 1;
15144
15145 /* get the HT capability info*/
15146 sme_cfg_get_int(mac_ctx, WNI_CFG_HT_CAP_INFO, &value);
15147 uHTCapabilityInfo.cfg_value16 = (0xFFFF & value);
15148
15149 for (i = 0; i < CSR_ROAM_SESSION_MAX; i++) {
15150 if (CSR_IS_SESSION_VALID(mac_ctx, i)) {
15151 csr_session = &mac_ctx->roam.roamSession[i];
15152 csr_session->htConfig.ht_tx_stbc =
15153 uHTCapabilityInfo.ht_cap_info.txSTBC;
15154 }
15155 }
15156
15157 sme_release_global_lock(&mac_ctx->sme);
15158 }
15159 return status;
15160}
15161
15162/**
Archana Ramachandran5041b252016-04-25 14:29:25 -070015163 * sme_update_user_configured_nss() - sets the nss based on user request
15164 * @hal: Pointer to HAL
15165 * @nss: number of streams
15166 *
15167 * Return: None
15168 */
15169void sme_update_user_configured_nss(tHalHandle hal, uint8_t nss)
15170{
15171 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
15172
15173 mac_ctx->user_configured_nss = nss;
15174}
15175
15176/**
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015177 * sme_set_rssi_threshold_breached_cb() - set rssi threshold breached callback
Arun Khandavalli4b55da72016-07-19 19:55:01 +053015178 * @h_hal: global hal handle
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015179 * @cb: callback function pointer
15180 *
15181 * This function stores the rssi threshold breached callback function.
15182 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015183 * Return: QDF_STATUS enumeration.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015184 */
Arun Khandavalli4b55da72016-07-19 19:55:01 +053015185QDF_STATUS sme_set_rssi_threshold_breached_cb(tHalHandle h_hal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015186 void (*cb)(void *, struct rssi_breach_event *))
15187{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015188 QDF_STATUS status = QDF_STATUS_SUCCESS;
Arun Khandavalli4b55da72016-07-19 19:55:01 +053015189 tpAniSirGlobal mac;
15190
15191 if (!h_hal) {
15192 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
15193 FL("hHal is not valid"));
15194 return QDF_STATUS_E_INVAL;
15195 }
15196 mac = PMAC_STRUCT(h_hal);
15197
15198 status = sme_acquire_global_lock(&mac->sme);
15199 if (!QDF_IS_STATUS_SUCCESS(status)) {
15200 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
15201 FL("sme_acquire_global_lock failed!(status=%d)"),
15202 status);
15203 return status;
15204 }
15205
15206 mac->sme.rssi_threshold_breached_cb = cb;
15207 sme_release_global_lock(&mac->sme);
15208 return status;
15209}
15210
15211/**
15212 * sme_set_rssi_threshold_breached_cb() - Reset rssi threshold breached callback
15213 * @hal: global hal handle
15214 *
15215 * This function de-registers the rssi threshold breached callback function.
15216 *
15217 * Return: QDF_STATUS enumeration.
15218 */
15219QDF_STATUS sme_reset_rssi_threshold_breached_cb(tHalHandle hal)
15220{
15221 QDF_STATUS status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015222 tpAniSirGlobal mac = PMAC_STRUCT(hal);
15223
15224 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015225 if (!QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015226 sms_log(mac, LOGE,
15227 FL("sme_acquire_global_lock failed!(status=%d)"),
15228 status);
15229 return status;
15230 }
15231
Arun Khandavalli4b55da72016-07-19 19:55:01 +053015232 mac->sme.rssi_threshold_breached_cb = NULL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015233 sme_release_global_lock(&mac->sme);
15234 return status;
15235}
15236
15237/**
15238 * sme_is_any_session_in_connected_state() - SME wrapper API to
15239 * check if any session is in connected state or not.
15240 *
15241 * @hal: Handle returned by mac open
15242 *
15243 * This function is used to check if any valid sme session is in
15244 * connected state or not.
15245 *
15246 * Return: true if any session is connected, else false.
15247 *
15248 */
15249bool sme_is_any_session_in_connected_state(tHalHandle h_hal)
15250{
15251 tpAniSirGlobal mac_ctx = PMAC_STRUCT(h_hal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015252 QDF_STATUS status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015253 bool ret = false;
15254
15255 status = sme_acquire_global_lock(&mac_ctx->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015256 if (QDF_STATUS_SUCCESS == status) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015257 ret = csr_is_any_session_in_connect_state(mac_ctx);
15258 sme_release_global_lock(&mac_ctx->sme);
15259 }
15260 return ret;
15261}
15262
15263/**
15264 * sme_set_rssi_monitoring() - set rssi monitoring
15265 * @hal: global hal handle
15266 * @input: request message
15267 *
15268 * This function constructs the vos message and fill in message type,
15269 * bodyptr with @input and posts it to WDA queue.
15270 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015271 * Return: QDF_STATUS enumeration
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015272 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015273QDF_STATUS sme_set_rssi_monitoring(tHalHandle hal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015274 struct rssi_monitor_req *input)
15275{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015276 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015277 tpAniSirGlobal mac = PMAC_STRUCT(hal);
15278 cds_msg_t cds_message;
15279 struct rssi_monitor_req *req_msg;
15280
15281 sms_log(mac, LOG1, FL("enter"));
Anurag Chouhan600c3a02016-03-01 10:33:54 +053015282 req_msg = qdf_mem_malloc(sizeof(*req_msg));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015283 if (!req_msg) {
15284 sms_log(mac, LOGE, FL("memory allocation failed"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015285 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015286 }
15287
15288 *req_msg = *input;
15289
15290 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015291 if (!QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015292 sms_log(mac, LOGE,
15293 FL("sme_acquire_global_lock failed!(status=%d)"),
15294 status);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053015295 qdf_mem_free(req_msg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015296 return status;
15297 }
15298
15299 /* Serialize the req through MC thread */
15300 cds_message.bodyptr = req_msg;
15301 cds_message.type = WMA_SET_RSSI_MONITOR_REQ;
15302 status = cds_mq_post_message(CDS_MQ_ID_WMA, &cds_message);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015303 if (!QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015304 sms_log(mac, LOGE,
15305 FL("cds_mq_post_message failed!(err=%d)"),
15306 status);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053015307 qdf_mem_free(req_msg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015308 }
15309 sme_release_global_lock(&mac->sme);
15310
15311 return status;
15312}
15313
15314/**
15315 * sme_fw_mem_dump() - Get FW memory dump
15316 * @hHal: hal handle
15317 * @recvd_req: received memory dump request.
15318 *
15319 * This API is invoked by HDD to indicate FW to start
15320 * dumping firmware memory.
15321 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015322 * Return: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015323 */
15324#ifdef WLAN_FEATURE_MEMDUMP
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015325QDF_STATUS sme_fw_mem_dump(tHalHandle hHal, void *recvd_req)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015326{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015327 QDF_STATUS status = QDF_STATUS_SUCCESS;
15328 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015329 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
15330 cds_msg_t msg;
15331 struct fw_dump_req *send_req;
15332 struct fw_dump_seg_req seg_req;
15333 int loop;
15334
Anurag Chouhan600c3a02016-03-01 10:33:54 +053015335 send_req = qdf_mem_malloc(sizeof(*send_req));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015336 if (!send_req) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053015337 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015338 FL("Memory allocation failed for WDA_FW_MEM_DUMP"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015339 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015340 }
Anurag Chouhan600c3a02016-03-01 10:33:54 +053015341 qdf_mem_copy(send_req, recvd_req, sizeof(*send_req));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015342
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053015343 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015344 FL("request_id:%d num_seg:%d"),
15345 send_req->request_id, send_req->num_seg);
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053015346 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015347 FL("Segment Information"));
15348 for (loop = 0; loop < send_req->num_seg; loop++) {
15349 seg_req = send_req->segment[loop];
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053015350 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015351 FL("seg_number:%d"), loop);
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053015352 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015353 FL("seg_id:%d start_addr_lo:0x%x start_addr_hi:0x%x"),
15354 seg_req.seg_id, seg_req.seg_start_addr_lo,
15355 seg_req.seg_start_addr_hi);
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053015356 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015357 FL("seg_length:%d dst_addr_lo:0x%x dst_addr_hi:0x%x"),
15358 seg_req.seg_length, seg_req.dst_addr_lo,
15359 seg_req.dst_addr_hi);
15360 }
15361
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015362 if (QDF_STATUS_SUCCESS == sme_acquire_global_lock(&pMac->sme)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015363 msg.bodyptr = send_req;
15364 msg.type = WMA_FW_MEM_DUMP_REQ;
15365 msg.reserved = 0;
15366
Anurag Chouhan6d760662016-02-20 16:05:43 +053015367 qdf_status = cds_mq_post_message(QDF_MODULE_ID_WMA, &msg);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015368 if (QDF_STATUS_SUCCESS != qdf_status) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053015369 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015370 FL("Not able to post WMA_FW_MEM_DUMP"));
Anurag Chouhan600c3a02016-03-01 10:33:54 +053015371 qdf_mem_free(send_req);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015372 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015373 }
15374 sme_release_global_lock(&pMac->sme);
15375 } else {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053015376 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015377 FL("Failed to acquire SME Global Lock"));
Anurag Chouhan600c3a02016-03-01 10:33:54 +053015378 qdf_mem_free(send_req);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015379 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015380 }
15381
15382 return status;
15383}
15384#else
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015385QDF_STATUS sme_fw_mem_dump(tHalHandle hHal, void *recvd_req)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015386{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015387 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015388}
15389#endif /* WLAN_FEATURE_MEMDUMP */
15390
15391/*
Manishekar Chandrasekaran7009f252016-04-21 19:14:15 +053015392 * sme_pdev_set_pcl() - Send WMI_PDEV_SET_PCL_CMDID to the WMA
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015393 * @hal: Handle returned by macOpen
15394 * @msg: PCL channel list and length structure
15395 *
Manishekar Chandrasekaran7009f252016-04-21 19:14:15 +053015396 * Sends the command to WMA to send WMI_PDEV_SET_PCL_CMDID to FW
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015397 * Return: QDF_STATUS_SUCCESS on successful posting
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015398 */
Manishekar Chandrasekaran7009f252016-04-21 19:14:15 +053015399QDF_STATUS sme_pdev_set_pcl(tHalHandle hal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015400 struct sir_pcl_list msg)
15401{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015402 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015403 tpAniSirGlobal mac = PMAC_STRUCT(hal);
15404 cds_msg_t cds_message;
Manishekar Chandrasekaran7009f252016-04-21 19:14:15 +053015405 struct wmi_pcl_chan_weights *req_msg;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015406 uint32_t len, i;
15407
15408 len = sizeof(*req_msg);
15409
Anurag Chouhan600c3a02016-03-01 10:33:54 +053015410 req_msg = qdf_mem_malloc(len);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015411 if (!req_msg) {
Anurag Chouhan600c3a02016-03-01 10:33:54 +053015412 sms_log(mac, LOGE, FL("qdf_mem_malloc failed"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015413 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015414 }
15415
Manishekar Chandrasekaran7009f252016-04-21 19:14:15 +053015416 for (i = 0; i < msg.pcl_len; i++) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015417 req_msg->pcl_list[i] = msg.pcl_list[i];
Manishekar Chandrasekaran7009f252016-04-21 19:14:15 +053015418 req_msg->weight_list[i] = msg.weight_list[i];
15419 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015420
15421 req_msg->pcl_len = msg.pcl_len;
15422
15423 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015424 if (status != QDF_STATUS_SUCCESS) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015425 sms_log(mac, LOGE,
Deepak Dhamdhere0f076bd2016-06-02 11:29:21 -070015426 FL("sme_acquire_global_lock failed!(status=%d)"),
15427 status);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053015428 qdf_mem_free(req_msg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015429 return status;
15430 }
15431
15432 /* Serialize the req through MC thread */
15433 cds_message.bodyptr = req_msg;
Manishekar Chandrasekaran7009f252016-04-21 19:14:15 +053015434 cds_message.type = SIR_HAL_PDEV_SET_PCL_TO_FW;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015435 status = cds_mq_post_message(CDS_MQ_ID_WMA, &cds_message);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015436 if (!QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015437 sms_log(mac, LOGE,
Deepak Dhamdhere0f076bd2016-06-02 11:29:21 -070015438 FL("cds_mq_post_message failed!(err=%d)"),
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015439 status);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053015440 qdf_mem_free(req_msg);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015441 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015442 }
15443 sme_release_global_lock(&mac->sme);
15444
15445 return status;
15446}
15447
15448/*
Manishekar Chandrasekarand9640342016-04-27 12:28:26 +053015449 * sme_pdev_set_hw_mode() - Send WMI_PDEV_SET_HW_MODE_CMDID to the WMA
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015450 * @hal: Handle returned by macOpen
15451 * @msg: HW mode structure containing hw mode and callback details
15452 *
Manishekar Chandrasekarand9640342016-04-27 12:28:26 +053015453 * Sends the command to CSR to send WMI_PDEV_SET_HW_MODE_CMDID to FW
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015454 * Return: QDF_STATUS_SUCCESS on successful posting
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015455 */
Manishekar Chandrasekarand9640342016-04-27 12:28:26 +053015456QDF_STATUS sme_pdev_set_hw_mode(tHalHandle hal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015457 struct sir_hw_mode msg)
15458{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015459 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015460 tpAniSirGlobal mac = PMAC_STRUCT(hal);
15461 tSmeCmd *cmd = NULL;
15462
15463 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015464 if (!QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015465 sms_log(mac, LOGE, FL("Failed to acquire lock"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015466 return QDF_STATUS_E_RESOURCES;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015467 }
15468
15469 cmd = sme_get_command_buffer(mac);
15470 if (!cmd) {
15471 sms_log(mac, LOGE, FL("Get command buffer failed"));
15472 sme_release_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015473 return QDF_STATUS_E_NULL_VALUE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015474 }
15475
15476 cmd->command = e_sme_command_set_hw_mode;
15477 cmd->u.set_hw_mode_cmd.hw_mode_index = msg.hw_mode_index;
15478 cmd->u.set_hw_mode_cmd.set_hw_mode_cb = msg.set_hw_mode_cb;
Chandrasekaran, Manishekaref70c0d2015-10-20 19:54:55 +053015479 cmd->u.set_hw_mode_cmd.reason = msg.reason;
15480 cmd->u.set_hw_mode_cmd.session_id = msg.session_id;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015481
Chandrasekaran, Manishekarce2172e2016-02-18 16:12:43 +053015482 sms_log(mac, LOG1,
15483 FL("Queuing set hw mode to CSR, session:%d reason:%d"),
15484 cmd->u.set_hw_mode_cmd.session_id,
15485 cmd->u.set_hw_mode_cmd.reason);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015486 csr_queue_sme_command(mac, cmd, false);
15487
15488 sme_release_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015489 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015490}
15491
15492/**
15493 * sme_register_hw_mode_trans_cb() - HW mode transition callback registration
15494 * @hal: Handle returned by macOpen
15495 * @callback: HDD callback to be registered
15496 *
15497 * Registers the HDD callback with SME. This callback will be invoked when
15498 * HW mode transition event is received from the FW
15499 *
15500 * Return: None
15501 */
15502void sme_register_hw_mode_trans_cb(tHalHandle hal,
15503 hw_mode_transition_cb callback)
15504{
15505 tpAniSirGlobal mac = PMAC_STRUCT(hal);
15506
15507 mac->sme.sme_hw_mode_trans_cb = callback;
15508 sms_log(mac, LOG1, FL("HW mode transition callback registered"));
15509}
15510
15511/**
15512 * sme_nss_update_request() - Send beacon templete update to FW with new
15513 * nss value
15514 * @hal: Handle returned by macOpen
15515 * @vdev_id: the session id
15516 * @new_nss: the new nss value
15517 * @cback: hdd callback
15518 * @next_action: next action to happen at policy mgr after beacon update
15519 *
15520 * Sends the command to CSR to send to PE
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015521 * Return: QDF_STATUS_SUCCESS on successful posting
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015522 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015523QDF_STATUS sme_nss_update_request(tHalHandle hHal, uint32_t vdev_id,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015524 uint8_t new_nss, void *cback, uint8_t next_action,
Chandrasekaran, Manishekarce2172e2016-02-18 16:12:43 +053015525 void *hdd_context,
15526 enum sir_conn_update_reason reason)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015527{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015528 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015529 tpAniSirGlobal mac = PMAC_STRUCT(hHal);
15530 tSmeCmd *cmd = NULL;
15531
15532 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015533 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015534 cmd = sme_get_command_buffer(mac);
15535 if (!cmd) {
15536 sms_log(mac, LOGE, FL("Get command buffer failed"));
15537 sme_release_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015538 return QDF_STATUS_E_NULL_VALUE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015539 }
15540 cmd->command = e_sme_command_nss_update;
15541 /* Sessionized modules may require this info */
15542 cmd->sessionId = vdev_id;
15543 cmd->u.nss_update_cmd.new_nss = new_nss;
15544 cmd->u.nss_update_cmd.session_id = vdev_id;
15545 cmd->u.nss_update_cmd.nss_update_cb = cback;
15546 cmd->u.nss_update_cmd.context = hdd_context;
15547 cmd->u.nss_update_cmd.next_action = next_action;
Chandrasekaran, Manishekarce2172e2016-02-18 16:12:43 +053015548 cmd->u.nss_update_cmd.reason = reason;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015549
15550 sms_log(mac, LOG1, FL("Queuing e_sme_command_nss_update to CSR"));
15551 csr_queue_sme_command(mac, cmd, false);
15552 sme_release_global_lock(&mac->sme);
15553 }
15554 return status;
15555}
15556
15557/**
15558 * sme_soc_set_dual_mac_config() - Set dual mac configurations
15559 * @hal: Handle returned by macOpen
15560 * @msg: Structure containing the dual mac config parameters
15561 *
15562 * Queues configuration information to CSR to configure
15563 * WLAN firmware for the dual MAC features
15564 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015565 * Return: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015566 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015567QDF_STATUS sme_soc_set_dual_mac_config(tHalHandle hal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015568 struct sir_dual_mac_config msg)
15569{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015570 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015571 tpAniSirGlobal mac = PMAC_STRUCT(hal);
15572 tSmeCmd *cmd;
15573
15574 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015575 if (!QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015576 sms_log(mac, LOGE, FL("Failed to acquire lock"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015577 return QDF_STATUS_E_RESOURCES;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015578 }
15579
15580 cmd = sme_get_command_buffer(mac);
15581 if (!cmd) {
15582 sms_log(mac, LOGE, FL("Get command buffer failed"));
15583 sme_release_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015584 return QDF_STATUS_E_NULL_VALUE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015585 }
15586
15587 cmd->command = e_sme_command_set_dual_mac_config;
15588 cmd->u.set_dual_mac_cmd.scan_config = msg.scan_config;
15589 cmd->u.set_dual_mac_cmd.fw_mode_config = msg.fw_mode_config;
15590 cmd->u.set_dual_mac_cmd.set_dual_mac_cb = msg.set_dual_mac_cb;
15591
15592 sms_log(mac, LOG1,
15593 FL("Queuing e_sme_command_set_dual_mac_config to CSR: %x %x"),
15594 cmd->u.set_dual_mac_cmd.scan_config,
15595 cmd->u.set_dual_mac_cmd.fw_mode_config);
15596 csr_queue_sme_command(mac, cmd, false);
15597
15598 sme_release_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015599 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015600}
15601
Ravi Joshi9e891ba2015-11-09 19:03:46 -080015602#ifdef FEATURE_LFR_SUBNET_DETECTION
15603/**
15604 * sme_gateway_param_update() - to update gateway parameters with WMA
15605 * @Hal: hal handle
15606 * @gw_params: request parameters from HDD
15607 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015608 * Return: QDF_STATUS
Ravi Joshi9e891ba2015-11-09 19:03:46 -080015609 *
15610 * This routine will update gateway parameters to WMA
15611 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015612QDF_STATUS sme_gateway_param_update(tHalHandle Hal,
Ravi Joshi9e891ba2015-11-09 19:03:46 -080015613 struct gateway_param_update_req *gw_params)
15614{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015615 QDF_STATUS qdf_status;
Ravi Joshi9e891ba2015-11-09 19:03:46 -080015616 cds_msg_t cds_message;
15617 struct gateway_param_update_req *request_buf;
15618
Anurag Chouhan600c3a02016-03-01 10:33:54 +053015619 request_buf = qdf_mem_malloc(sizeof(*request_buf));
Ravi Joshi9e891ba2015-11-09 19:03:46 -080015620 if (NULL == request_buf) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053015621 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Ravi Joshi9e891ba2015-11-09 19:03:46 -080015622 FL("Not able to allocate memory for gw param update request"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015623 return QDF_STATUS_E_NOMEM;
Ravi Joshi9e891ba2015-11-09 19:03:46 -080015624 }
15625
15626 *request_buf = *gw_params;
15627
15628 cds_message.type = WMA_GW_PARAM_UPDATE_REQ;
15629 cds_message.reserved = 0;
15630 cds_message.bodyptr = request_buf;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015631 qdf_status = cds_mq_post_message(CDS_MQ_ID_WMA, &cds_message);
15632 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053015633 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Ravi Joshi9e891ba2015-11-09 19:03:46 -080015634 FL("Not able to post WMA_GW_PARAM_UPDATE_REQ message to HAL"));
Anurag Chouhan600c3a02016-03-01 10:33:54 +053015635 qdf_mem_free(request_buf);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015636 return QDF_STATUS_E_FAILURE;
Ravi Joshi9e891ba2015-11-09 19:03:46 -080015637 }
15638
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015639 return QDF_STATUS_SUCCESS;
Ravi Joshi9e891ba2015-11-09 19:03:46 -080015640}
15641#endif /* FEATURE_LFR_SUBNET_DETECTION */
15642
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015643/**
Archana Ramachandrana20ef812015-11-13 16:12:13 -080015644 * sme_soc_set_antenna_mode() - set antenna mode
15645 * @hal: Handle returned by macOpen
15646 * @msg: Structure containing the antenna mode parameters
15647 *
15648 * Send the command to CSR to send
15649 * WMI_SOC_SET_ANTENNA_MODE_CMDID to FW
15650 *
15651 * Return: QDF_STATUS
15652 */
15653QDF_STATUS sme_soc_set_antenna_mode(tHalHandle hal,
15654 struct sir_antenna_mode_param *msg)
15655{
15656 QDF_STATUS status = QDF_STATUS_SUCCESS;
15657 tpAniSirGlobal mac = PMAC_STRUCT(hal);
15658 tSmeCmd *cmd;
15659
15660 if (NULL == msg) {
15661 sms_log(mac, LOGE, FL("antenna mode mesg is NULL"));
15662 return QDF_STATUS_E_FAILURE;
15663 }
15664
15665 status = sme_acquire_global_lock(&mac->sme);
15666 if (!QDF_IS_STATUS_SUCCESS(status)) {
15667 sms_log(mac, LOGE, FL("Failed to acquire lock"));
15668 return QDF_STATUS_E_RESOURCES;
15669 }
15670
15671 cmd = sme_get_command_buffer(mac);
15672 if (!cmd) {
15673 sme_release_global_lock(&mac->sme);
15674 sms_log(mac, LOGE, FL("Get command buffer failed"));
15675 return QDF_STATUS_E_NULL_VALUE;
15676 }
15677
15678 cmd->command = e_sme_command_set_antenna_mode;
15679 cmd->u.set_antenna_mode_cmd = *msg;
15680
15681 sms_log(mac, LOG1,
15682 FL("Queuing e_sme_command_set_antenna_mode to CSR: %d %d"),
15683 cmd->u.set_antenna_mode_cmd.num_rx_chains,
15684 cmd->u.set_antenna_mode_cmd.num_tx_chains);
15685
15686 csr_queue_sme_command(mac, cmd, false);
15687 sme_release_global_lock(&mac->sme);
15688
15689 return QDF_STATUS_SUCCESS;
15690}
15691
15692/**
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015693 * sme_set_peer_authorized() - call peer authorized callback
15694 * @peer_addr: peer mac address
15695 * @auth_cb: auth callback
15696 * @vdev_id: vdev id
15697 *
Anurag Chouhanf04e84f2016-03-03 10:12:12 +053015698 * Return: QDF Status
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015699 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015700QDF_STATUS sme_set_peer_authorized(uint8_t *peer_addr,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015701 sme_peer_authorized_fp auth_cb,
15702 uint32_t vdev_id)
15703{
15704 void *wma_handle;
15705
Anurag Chouhan6d760662016-02-20 16:05:43 +053015706 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015707 if (!wma_handle) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053015708 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015709 "wma handle is NULL");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015710 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015711 }
15712
15713 wma_set_peer_authorized_cb(wma_handle, auth_cb);
15714 return wma_set_peer_param(wma_handle, peer_addr, WMI_PEER_AUTHORIZE,
15715 1, vdev_id);
15716}
15717
15718/*
Amar Singhal7c1e8982016-05-19 15:08:09 -070015719 * sme_handle_set_fcc_channel() - set spec. tx power for non-fcc channel
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015720 * @hal: HAL pointer
Amar Singhal83a047a2016-05-19 15:56:11 -070015721 * @fcc_constraint: flag to enable/disable the constraint
15722 * @scan_pending: whether there is pending scan
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015723 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015724 * Return: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015725 */
Amar Singhal83a047a2016-05-19 15:56:11 -070015726QDF_STATUS sme_handle_set_fcc_channel(tHalHandle hal, bool fcc_constraint,
15727 bool scan_pending)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015728{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015729 QDF_STATUS status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015730 tpAniSirGlobal mac_ptr = PMAC_STRUCT(hal);
15731
15732 status = sme_acquire_global_lock(&mac_ptr->sme);
15733
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015734 if (QDF_STATUS_SUCCESS == status) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015735
15736 if (fcc_constraint != mac_ptr->scan.fcc_constraint) {
15737 mac_ptr->scan.fcc_constraint = fcc_constraint;
Amar Singhal83a047a2016-05-19 15:56:11 -070015738 if (scan_pending)
15739 mac_ptr->scan.defer_update_channel_list = true;
15740 else
15741 status = csr_update_channel_list(mac_ptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015742 }
15743
15744 sme_release_global_lock(&mac_ptr->sme);
15745 }
15746
15747 return status;
15748}
15749/**
15750 * sme_setdef_dot11mode() - Updates pMac with default dot11mode
15751 * @hal: Global MAC pointer
15752 *
15753 * Return: NULL.
15754 */
15755void sme_setdef_dot11mode(tHalHandle hal)
15756{
15757 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
15758 csr_set_default_dot11_mode(mac_ctx);
15759}
15760
15761/**
15762 * sme_update_roam_scan_hi_rssi_scan_params() - update high rssi scan
15763 * params
15764 * @hal_handle - The handle returned by macOpen.
15765 * @session_id - Session Identifier
15766 * @notify_id - Identifies 1 of the 4 parameters to be modified
15767 * @val New value of the parameter
15768 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015769 * Return: QDF_STATUS - SME update config successful.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015770 * Other status means SME failed to update
15771 */
15772
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015773QDF_STATUS sme_update_roam_scan_hi_rssi_scan_params(tHalHandle hal_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015774 uint8_t session_id,
15775 uint32_t notify_id,
15776 int32_t val)
15777{
15778 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal_handle);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015779 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015780 tCsrNeighborRoamConfig *nr_config = NULL;
15781 tpCsrNeighborRoamControlInfo nr_info = NULL;
15782 uint32_t reason = 0;
15783
Naveen Rawatc36f7eb2016-11-10 20:01:03 -080015784 if (session_id >= CSR_ROAM_SESSION_MAX) {
15785 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
15786 FL("Invalid sme session id: %d"), session_id);
15787 return QDF_STATUS_E_INVAL;
15788 }
15789
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015790 status = sme_acquire_global_lock(&mac_ctx->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015791 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015792 nr_config = &mac_ctx->roam.configParam.neighborRoamConfig;
15793 nr_info = &mac_ctx->roam.neighborRoamInfo[session_id];
15794 switch (notify_id) {
15795 case eCSR_HI_RSSI_SCAN_MAXCOUNT_ID:
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 "%s: gRoamScanHirssiMaxCount %d => %d",
15798 __func__, nr_config->nhi_rssi_scan_max_count,
15799 val);
15800 nr_config->nhi_rssi_scan_max_count = val;
15801 nr_info->cfgParams.hi_rssi_scan_max_count = val;
15802 reason = REASON_ROAM_SCAN_HI_RSSI_MAXCOUNT_CHANGED;
15803 break;
15804
15805 case eCSR_HI_RSSI_SCAN_RSSI_DELTA_ID:
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053015806 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015807 FL("gRoamScanHiRssiDelta %d => %d"),
15808 nr_config->nhi_rssi_scan_rssi_delta,
15809 val);
15810 nr_config->nhi_rssi_scan_rssi_delta = val;
15811 nr_info->cfgParams.hi_rssi_scan_rssi_delta = val;
15812 reason = REASON_ROAM_SCAN_HI_RSSI_DELTA_CHANGED;
15813 break;
15814
15815 case eCSR_HI_RSSI_SCAN_DELAY_ID:
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053015816 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015817 FL("gRoamScanHiRssiDelay %d => %d"),
15818 nr_config->nhi_rssi_scan_delay,
15819 val);
15820 nr_config->nhi_rssi_scan_delay = val;
15821 nr_info->cfgParams.hi_rssi_scan_delay = val;
15822 reason = REASON_ROAM_SCAN_HI_RSSI_DELAY_CHANGED;
15823 break;
15824
15825 case eCSR_HI_RSSI_SCAN_RSSI_UB_ID:
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053015826 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015827 FL("gRoamScanHiRssiUpperBound %d => %d"),
15828 nr_config->nhi_rssi_scan_rssi_ub,
15829 val);
15830 nr_config->nhi_rssi_scan_rssi_ub = val;
15831 nr_info->cfgParams.hi_rssi_scan_rssi_ub = val;
15832 reason = REASON_ROAM_SCAN_HI_RSSI_UB_CHANGED;
15833 break;
15834
15835 default:
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053015836 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015837 FL("invalid parameter notify_id %d"),
15838 notify_id);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015839 status = QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015840 break;
15841 }
15842 sme_release_global_lock(&mac_ctx->sme);
15843 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015844 if (mac_ctx->roam.configParam.isRoamOffloadScanEnabled &&
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015845 status == QDF_STATUS_SUCCESS) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015846 csr_roam_offload_scan(mac_ctx, session_id,
15847 ROAM_SCAN_OFFLOAD_UPDATE_CFG, reason);
15848 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015849
15850 return status;
15851}
15852
Krishna Kumaar Natarajan052c6e62015-09-28 15:32:55 -070015853/**
15854 * sme_update_tgt_services() - update the target services config.
15855 * @hal: HAL pointer.
15856 * @cfg: wma_tgt_services parameters.
15857 *
15858 * update the target services config.
15859 *
15860 * Return: None.
15861 */
15862void sme_update_tgt_services(tHalHandle hal, struct wma_tgt_services *cfg)
15863{
15864 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
15865
15866 mac_ctx->lteCoexAntShare = cfg->lte_coex_ant_share;
15867 mac_ctx->beacon_offload = cfg->beacon_offload;
mukul sharma72c8b222015-09-04 17:02:01 +053015868 mac_ctx->pmf_offload = cfg->pmf_offload;
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053015869 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO,
mukul sharma72c8b222015-09-04 17:02:01 +053015870 FL("mac_ctx->pmf_offload: %d"), mac_ctx->pmf_offload);
Krishna Kumaar Natarajan052c6e62015-09-28 15:32:55 -070015871
15872 return;
15873}
Masti, Narayanraddic4a7ab82015-11-25 15:41:10 +053015874
Chandrasekaran, Manishekar2859de42016-02-11 16:17:38 +053015875/**
15876 * sme_is_session_id_valid() - Check if the session id is valid
15877 * @hal: Pointer to HAL
15878 * @session_id: Session id
15879 *
15880 * Checks if the session id is valid or not
15881 *
15882 * Return: True is the session id is valid, false otherwise
15883 */
15884bool sme_is_session_id_valid(tHalHandle hal, uint32_t session_id)
15885{
15886 tpAniSirGlobal mac = PMAC_STRUCT(hal);
15887 if (!mac) {
Chandrasekaran, Manishekard3cb4772016-02-22 22:21:10 +053015888 /* Using QDF_TRACE since mac is not available for sms_log */
15889 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
15890 "%s: null mac pointer", __func__);
Chandrasekaran, Manishekar2859de42016-02-11 16:17:38 +053015891 return false;
15892 }
15893
15894 if (CSR_IS_SESSION_VALID(mac, session_id)) {
15895 return true;
15896 } else {
15897 sms_log(mac, LOGE,
15898 FL("invalid session id:%d"), session_id);
15899 return false;
15900 }
15901}
15902
Masti, Narayanraddic4a7ab82015-11-25 15:41:10 +053015903#ifdef FEATURE_WLAN_TDLS
15904
15905/**
15906 * sme_get_opclass() - determine operating class
15907 * @hal: Pointer to HAL
15908 * @channel: channel id
15909 * @bw_offset: bandwidth offset
15910 * @opclass: pointer to operating class
15911 *
15912 * Function will determine operating class from regdm_get_opclass_from_channel
15913 *
15914 * Return: none
15915 */
15916void sme_get_opclass(tHalHandle hal, uint8_t channel, uint8_t bw_offset,
15917 uint8_t *opclass)
15918{
15919 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
15920
15921 /* redgm opclass table contains opclass for 40MHz low primary,
15922 * 40MHz high primary and 20MHz. No support for 80MHz yet. So
15923 * first we will check if bit for 40MHz is set and if so find
15924 * matching opclass either with low primary or high primary
15925 * (a channel would never be in both) and then search for opclass
15926 * matching 20MHz, else for any BW.
15927 */
15928 if (bw_offset & (1 << BW_40_OFFSET_BIT)) {
Amar Singhal22995112016-01-22 10:42:33 -080015929 *opclass = cds_reg_dmn_get_opclass_from_channel(
Masti, Narayanraddic4a7ab82015-11-25 15:41:10 +053015930 mac_ctx->scan.countryCodeCurrent,
15931 channel, BW40_LOW_PRIMARY);
15932 if (!(*opclass)) {
Amar Singhal22995112016-01-22 10:42:33 -080015933 *opclass = cds_reg_dmn_get_opclass_from_channel(
Masti, Narayanraddic4a7ab82015-11-25 15:41:10 +053015934 mac_ctx->scan.countryCodeCurrent,
15935 channel, BW40_HIGH_PRIMARY);
15936 }
15937 } else if (bw_offset & (1 << BW_20_OFFSET_BIT)) {
Amar Singhal22995112016-01-22 10:42:33 -080015938 *opclass = cds_reg_dmn_get_opclass_from_channel(
Masti, Narayanraddic4a7ab82015-11-25 15:41:10 +053015939 mac_ctx->scan.countryCodeCurrent,
15940 channel, BW20);
15941 } else {
Amar Singhal22995112016-01-22 10:42:33 -080015942 *opclass = cds_reg_dmn_get_opclass_from_channel(
Masti, Narayanraddic4a7ab82015-11-25 15:41:10 +053015943 mac_ctx->scan.countryCodeCurrent,
15944 channel, BWALL);
15945 }
15946}
15947#endif
Ryan Hsu3c8f79f2015-12-02 16:45:09 -080015948
15949#ifdef FEATURE_GREEN_AP
15950/**
15951 * sme_send_egap_conf_params() - set the enhanced green ap configuration params
15952 * @enable: enable/disable the enhanced green ap feature
15953 * @inactivity_time: inactivity timeout value
15954 * @wait_time: wait timeout value
15955 * @flag: feature flag in bitmasp
15956 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015957 * Return: Return QDF_STATUS, otherwise appropriate failure code
Ryan Hsu3c8f79f2015-12-02 16:45:09 -080015958 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015959QDF_STATUS sme_send_egap_conf_params(uint32_t enable, uint32_t inactivity_time,
Ryan Hsu3c8f79f2015-12-02 16:45:09 -080015960 uint32_t wait_time, uint32_t flags)
15961{
15962 cds_msg_t message;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015963 QDF_STATUS status;
Ryan Hsu3c8f79f2015-12-02 16:45:09 -080015964 struct egap_conf_params *egap_params;
15965
Anurag Chouhan600c3a02016-03-01 10:33:54 +053015966 egap_params = qdf_mem_malloc(sizeof(*egap_params));
Ryan Hsu3c8f79f2015-12-02 16:45:09 -080015967 if (NULL == egap_params) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053015968 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Ryan Hsu3c8f79f2015-12-02 16:45:09 -080015969 "%s: fail to alloc egap_params", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015970 return QDF_STATUS_E_NOMEM;
Ryan Hsu3c8f79f2015-12-02 16:45:09 -080015971 }
15972
15973 egap_params->enable = enable;
15974 egap_params->inactivity_time = inactivity_time;
15975 egap_params->wait_time = wait_time;
15976 egap_params->flags = flags;
15977
15978 message.type = WMA_SET_EGAP_CONF_PARAMS;
15979 message.bodyptr = egap_params;
Anurag Chouhan6d760662016-02-20 16:05:43 +053015980 status = cds_mq_post_message(QDF_MODULE_ID_WMA, &message);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015981 if (!QDF_IS_STATUS_SUCCESS(status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053015982 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Ryan Hsu3c8f79f2015-12-02 16:45:09 -080015983 "%s: Not able to post msg to WMA!", __func__);
15984
Anurag Chouhan600c3a02016-03-01 10:33:54 +053015985 qdf_mem_free(egap_params);
Ryan Hsu3c8f79f2015-12-02 16:45:09 -080015986 }
15987 return status;
15988}
15989#endif
Sandeep Puligillae0875662016-02-12 16:09:21 -080015990
15991/**
Anurag Chouhanbf5e0e22016-09-12 12:54:09 +053015992 * sme_set_fw_test() - set fw test
15993 * @fw_test: fw test param
15994 *
15995 * Return: Return QDF_STATUS, otherwise appropriate failure code
15996 */
15997QDF_STATUS sme_set_fw_test(struct set_fwtest_params *fw_test)
15998{
15999 void *wma_handle;
16000
16001 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
16002 if (!wma_handle) {
16003 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
16004 "wma handle is NULL");
16005 return QDF_STATUS_E_FAILURE;
16006 }
16007 wma_process_fw_test_cmd(wma_handle, fw_test);
16008 return QDF_STATUS_SUCCESS;
16009}
16010
16011/**
Sandeep Puligillae0875662016-02-12 16:09:21 -080016012 * sme_ht40_stop_obss_scan() - ht40 obss stop scan
16013 * @hal: mac handel
16014 * @vdev_id: vdev identifier
16015 *
16016 * Return: Return QDF_STATUS, otherwise appropriate failure code
16017 */
16018QDF_STATUS sme_ht40_stop_obss_scan(tHalHandle hal, uint32_t vdev_id)
16019{
16020 void *wma_handle;
16021
16022 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
16023 if (!wma_handle) {
16024 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
16025 "wma handle is NULL");
16026 return QDF_STATUS_E_FAILURE;
16027 }
16028 wma_ht40_stop_obss_scan(wma_handle, vdev_id);
16029 return QDF_STATUS_SUCCESS;
16030}
Archana Ramachandran20d2e232016-02-11 16:58:40 -080016031
16032/**
16033 * sme_update_mimo_power_save() - Update MIMO power save
16034 * configuration
16035 * @hal: The handle returned by macOpen
16036 * @is_ht_smps_enabled: enable/disable ht smps
16037 * @ht_smps_mode: smps mode disabled/static/dynamic
Archana Ramachandranfec24812016-02-16 16:31:56 -080016038 * @send_smps_action: flag to send smps force mode command
16039 * to FW
Archana Ramachandran20d2e232016-02-11 16:58:40 -080016040 *
16041 * Return: QDF_STATUS if SME update mimo power save
16042 * configuration sucsess else failue status
16043 */
16044QDF_STATUS sme_update_mimo_power_save(tHalHandle hal,
16045 uint8_t is_ht_smps_enabled,
Archana Ramachandranfec24812016-02-16 16:31:56 -080016046 uint8_t ht_smps_mode,
16047 bool send_smps_action)
Archana Ramachandran20d2e232016-02-11 16:58:40 -080016048{
16049 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
Archana Ramachandranfec24812016-02-16 16:31:56 -080016050
Archana Ramachandran20d2e232016-02-11 16:58:40 -080016051 sms_log(mac_ctx, LOG1,
Archana Ramachandranfec24812016-02-16 16:31:56 -080016052 "SMPS enable: %d mode: %d send action: %d",
16053 is_ht_smps_enabled, ht_smps_mode,
16054 send_smps_action);
Archana Ramachandran20d2e232016-02-11 16:58:40 -080016055 mac_ctx->roam.configParam.enableHtSmps =
16056 is_ht_smps_enabled;
16057 mac_ctx->roam.configParam.htSmps = ht_smps_mode;
Archana Ramachandranfec24812016-02-16 16:31:56 -080016058 mac_ctx->roam.configParam.send_smps_action =
16059 send_smps_action;
Archana Ramachandran20d2e232016-02-11 16:58:40 -080016060
16061 return QDF_STATUS_SUCCESS;
16062}
16063
16064/**
16065 * sme_is_sta_smps_allowed() - check if the supported nss for
16066 * the session is greater than 1x1 to enable sta SMPS
16067 * @hal: The handle returned by macOpen
16068 * @session_id: session id
16069 *
16070 * Return: bool returns true if supported nss is greater than
16071 * 1x1 else false
16072 */
16073bool sme_is_sta_smps_allowed(tHalHandle hal, uint8_t session_id)
16074{
16075 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
16076 tCsrRoamSession *csr_session;
16077
Archana Ramachandran20d2e232016-02-11 16:58:40 -080016078 csr_session = CSR_GET_SESSION(mac_ctx, session_id);
16079 if (NULL == csr_session) {
16080 sms_log(mac_ctx, LOGE,
Sreelakshmi Konamki58697e12016-05-25 17:30:18 +053016081 FL("SME session not valid: %d"), session_id);
16082 return false;
16083 }
16084
16085 if (!CSR_IS_SESSION_VALID(mac_ctx, session_id)) {
16086 sms_log(mac_ctx, LOGE,
16087 FL("CSR session not valid: %d"), session_id);
Archana Ramachandran20d2e232016-02-11 16:58:40 -080016088 return false;
16089 }
16090
16091 return (csr_session->supported_nss_1x1 == true) ? false : true;
16092}
Gupta, Kapil4cb1d7d2016-04-16 18:16:25 -070016093
16094/**
16095 * sme_add_beacon_filter() - set the beacon filter configuration
16096 * @hal: The handle returned by macOpen
16097 * @session_id: session id
16098 * @ie_map: bitwise array of IEs
16099 *
16100 * Return: Return QDF_STATUS, otherwise appropriate failure code
16101 */
16102QDF_STATUS sme_add_beacon_filter(tHalHandle hal,
16103 uint32_t session_id,
16104 uint32_t *ie_map)
16105{
16106 cds_msg_t message;
16107 QDF_STATUS qdf_status;
16108 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
16109 struct beacon_filter_param *filter_param;
16110
16111 if (!CSR_IS_SESSION_VALID(mac_ctx, session_id)) {
16112 sms_log(mac_ctx, LOGE,
16113 "CSR session not valid: %d",
16114 session_id);
16115 return QDF_STATUS_E_FAILURE;
16116 }
16117
16118 filter_param = qdf_mem_malloc(sizeof(*filter_param));
16119 if (NULL == filter_param) {
16120 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
16121 "%s: fail to alloc filter_param", __func__);
16122 return QDF_STATUS_E_FAILURE;
16123 }
16124
16125 filter_param->vdev_id = session_id;
16126
16127 qdf_mem_copy(filter_param->ie_map, ie_map,
16128 BCN_FLT_MAX_ELEMS_IE_LIST * sizeof(uint32_t));
16129
16130 message.type = WMA_ADD_BCN_FILTER_CMDID;
16131 message.bodyptr = filter_param;
16132 qdf_status = cds_mq_post_message(QDF_MODULE_ID_WMA,
16133 &message);
16134 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
16135 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
16136 "%s: Not able to post msg to WDA!",
16137 __func__);
16138
16139 qdf_mem_free(filter_param);
16140 }
16141 return qdf_status;
16142}
16143
16144/**
16145 * sme_remove_beacon_filter() - set the beacon filter configuration
16146 * @hal: The handle returned by macOpen
16147 * @session_id: session id
16148 *
16149 * Return: Return QDF_STATUS, otherwise appropriate failure code
16150 */
16151QDF_STATUS sme_remove_beacon_filter(tHalHandle hal, uint32_t session_id)
16152{
16153 cds_msg_t message;
16154 QDF_STATUS qdf_status;
16155 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
16156 struct beacon_filter_param *filter_param;
16157
16158 if (!CSR_IS_SESSION_VALID(mac_ctx, session_id)) {
16159 sms_log(mac_ctx, LOGE,
16160 "CSR session not valid: %d",
16161 session_id);
16162 return QDF_STATUS_E_FAILURE;
16163 }
16164
16165 filter_param = qdf_mem_malloc(sizeof(*filter_param));
16166 if (NULL == filter_param) {
16167 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
16168 "%s: fail to alloc filter_param", __func__);
16169 return QDF_STATUS_E_FAILURE;
16170 }
16171
16172 filter_param->vdev_id = session_id;
16173
16174 message.type = WMA_REMOVE_BCN_FILTER_CMDID;
16175 message.bodyptr = filter_param;
16176 qdf_status = cds_mq_post_message(QDF_MODULE_ID_WMA,
16177 &message);
16178 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
16179 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
16180 "%s: Not able to post msg to WDA!",
16181 __func__);
16182
16183 qdf_mem_free(filter_param);
16184 }
16185 return qdf_status;
16186}
Arun Khandavalli2476ef52016-04-26 20:19:43 +053016187
Arun Khandavalli2476ef52016-04-26 20:19:43 +053016188/**
Kondabattini, Ganesh3f2d02c2016-09-13 12:23:47 +053016189 * sme_send_disassoc_req_frame - send disassoc req
16190 * @hal: handler to hal
16191 * @session_id: session id
16192 * @peer_mac: peer mac address
16193 * @reason: reason for disassociation
16194 * wait_for_ack: wait for acknowledgment
16195 *
16196 * function to send disassoc request to lim
16197 *
16198 * return: none
16199 */
16200void sme_send_disassoc_req_frame(tHalHandle hal, uint8_t session_id,
16201 uint8_t *peer_mac, uint16_t reason, uint8_t wait_for_ack)
16202{
16203 struct sme_send_disassoc_frm_req *msg;
16204 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
16205 A_UINT8 *buf;
16206 A_UINT16 tmp;
16207
16208 msg = qdf_mem_malloc(sizeof(struct sme_send_disassoc_frm_req));
16209
16210 if (NULL == msg)
16211 qdf_status = QDF_STATUS_E_FAILURE;
16212 else
16213 qdf_status = QDF_STATUS_SUCCESS;
16214
16215 if (!QDF_IS_STATUS_SUCCESS(qdf_status))
16216 return;
16217
Kondabattini, Ganesh3f2d02c2016-09-13 12:23:47 +053016218 msg->msg_type = (uint16_t) eWNI_SME_SEND_DISASSOC_FRAME;
16219
16220 msg->length = (uint16_t) sizeof(struct sme_send_disassoc_frm_req);
16221
16222 buf = &msg->session_id;
16223
16224 /* session id */
16225 *buf = (A_UINT8) session_id;
16226 buf += sizeof(A_UINT8);
16227
16228 /* transaction id */
16229 *buf = 0;
16230 *(buf + 1) = 0;
16231 buf += sizeof(A_UINT16);
16232
16233 /* Set the peer MAC address before sending the message to LIM */
16234 qdf_mem_copy(buf, peer_mac, QDF_MAC_ADDR_SIZE);
16235
16236 buf += QDF_MAC_ADDR_SIZE;
16237
16238 /* reasoncode */
16239 tmp = (uint16_t) reason;
16240 qdf_mem_copy(buf, &tmp, sizeof(uint16_t));
16241 buf += sizeof(uint16_t);
16242
16243 *buf = wait_for_ack;
16244 buf += sizeof(uint8_t);
16245
16246 qdf_status = cds_send_mb_message_to_mac(msg);
16247
16248 if (qdf_status != QDF_STATUS_SUCCESS)
16249 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
16250 FL("cds_send_mb_message Failed"));
16251}
16252
16253/**
Arun Khandavalli2476ef52016-04-26 20:19:43 +053016254 * sme_get_bpf_offload_capabilities() - Get length for BPF offload
16255 * @hal: Global HAL handle
16256 * This function constructs the cds message and fill in message type,
16257 * post the same to WDA.
16258 * Return: QDF_STATUS enumeration
16259 */
16260QDF_STATUS sme_get_bpf_offload_capabilities(tHalHandle hal)
16261{
16262 QDF_STATUS status = QDF_STATUS_SUCCESS;
16263 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
16264 cds_msg_t cds_msg;
16265
16266 sms_log(mac_ctx, LOG1, FL("enter"));
16267
16268 status = sme_acquire_global_lock(&mac_ctx->sme);
16269 if (QDF_STATUS_SUCCESS == status) {
16270 /* Serialize the req through MC thread */
16271 cds_msg.bodyptr = NULL;
16272 cds_msg.type = WDA_BPF_GET_CAPABILITIES_REQ;
16273 status = cds_mq_post_message(QDF_MODULE_ID_WMA, &cds_msg);
16274 if (!QDF_IS_STATUS_SUCCESS(status)) {
16275 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
16276 FL("Post bpf get offload msg fail"));
16277 status = QDF_STATUS_E_FAILURE;
16278 }
16279 sme_release_global_lock(&mac_ctx->sme);
16280 } else {
16281 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
16282 FL("sme_acquire_global_lock error"));
16283 }
16284 sms_log(mac_ctx, LOG1, FL("exit"));
16285 return status;
16286}
16287
16288
16289/**
16290 * sme_set_bpf_instructions() - Set BPF bpf filter instructions.
16291 * @hal: HAL handle
16292 * @bpf_set_offload: struct to set bpf filter instructions.
16293 *
16294 * Return: QDF_STATUS enumeration.
16295 */
16296QDF_STATUS sme_set_bpf_instructions(tHalHandle hal,
16297 struct sir_bpf_set_offload *req)
16298{
16299 QDF_STATUS status = QDF_STATUS_SUCCESS;
16300 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
16301 cds_msg_t cds_msg;
16302 struct sir_bpf_set_offload *set_offload;
16303
Arun Khandavallica198b52016-04-26 20:53:35 +053016304 set_offload = qdf_mem_malloc(sizeof(*set_offload) +
16305 req->current_length);
Arun Khandavalli2476ef52016-04-26 20:19:43 +053016306
16307 if (NULL == set_offload) {
16308 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
16309 FL("Failed to alloc set_offload"));
16310 return QDF_STATUS_E_NOMEM;
16311 }
16312
16313 set_offload->session_id = req->session_id;
16314 set_offload->filter_id = req->filter_id;
16315 set_offload->current_offset = req->current_offset;
16316 set_offload->total_length = req->total_length;
Rajeev Kumare5a16822016-07-27 13:11:42 -070016317 set_offload->current_length = req->current_length;
Arun Khandavalli2476ef52016-04-26 20:19:43 +053016318 if (set_offload->total_length) {
Arun Khandavallica198b52016-04-26 20:53:35 +053016319 set_offload->program = ((uint8_t *)set_offload) +
16320 sizeof(*set_offload);
Arun Khandavalli2476ef52016-04-26 20:19:43 +053016321 qdf_mem_copy(set_offload->program, req->program,
16322 set_offload->current_length);
16323 }
16324 status = sme_acquire_global_lock(&mac_ctx->sme);
16325 if (QDF_STATUS_SUCCESS == status) {
16326 /* Serialize the req through MC thread */
16327 cds_msg.bodyptr = set_offload;
16328 cds_msg.type = WDA_BPF_SET_INSTRUCTIONS_REQ;
16329 status = cds_mq_post_message(QDF_MODULE_ID_WMA, &cds_msg);
16330
16331 if (!QDF_IS_STATUS_SUCCESS(status)) {
16332 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
16333 FL("Post BPF set offload msg fail"));
16334 status = QDF_STATUS_E_FAILURE;
Arun Khandavalli2476ef52016-04-26 20:19:43 +053016335 qdf_mem_free(set_offload);
16336 }
16337 sme_release_global_lock(&mac_ctx->sme);
16338 } else {
16339 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
16340 FL("sme_acquire_global_lock failed"));
Arun Khandavalli2476ef52016-04-26 20:19:43 +053016341 qdf_mem_free(set_offload);
16342 }
16343 return status;
16344}
16345
16346/**
16347 * sme_bpf_offload_register_callback() - Register get bpf offload callbacK
16348 *
16349 * @hal - MAC global handle
16350 * @callback_routine - callback routine from HDD
16351 *
16352 * This API is invoked by HDD to register its callback in SME
16353 *
16354 * Return: QDF_STATUS
16355 */
16356QDF_STATUS sme_bpf_offload_register_callback(tHalHandle hal,
16357 void (*pbpf_get_offload_cb)(void *context,
16358 struct sir_bpf_get_offload *))
16359{
16360 QDF_STATUS status = QDF_STATUS_SUCCESS;
16361 tpAniSirGlobal mac = PMAC_STRUCT(hal);
16362
16363 status = sme_acquire_global_lock(&mac->sme);
16364 if (QDF_IS_STATUS_SUCCESS(status)) {
16365 mac->sme.pbpf_get_offload_cb = pbpf_get_offload_cb;
16366 sme_release_global_lock(&mac->sme);
16367 } else {
16368 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
16369 FL("sme_acquire_global_lock failed"));
16370 }
16371 return status;
16372}
Manjunathappa Prakash59f861d2016-04-21 10:33:31 -070016373
16374/**
Abhishek Singh1c676222016-05-09 14:20:28 +053016375 * sme_get_wni_dot11_mode() - return configured wni dot11mode
16376 * @hal: hal pointer
16377 *
16378 * Return: wni dot11 mode.
16379 */
16380uint32_t sme_get_wni_dot11_mode(tHalHandle hal)
16381{
16382 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
16383
16384 return csr_translate_to_wni_cfg_dot11_mode(mac_ctx,
16385 mac_ctx->roam.configParam.uCfgDot11Mode);
16386}
16387
16388/**
Arun Khandavalli4b55da72016-07-19 19:55:01 +053016389 * sme_bpf_offload_deregister_callback() - Register get bpf offload callbacK
16390 *
16391 * @h_hal - MAC global handle
16392 * @callback_routine - callback routine from HDD
16393 *
16394 * This API is invoked by HDD to de-register its callback in SME
16395 *
16396 * Return: QDF_STATUS Enumeration
16397 */
16398QDF_STATUS sme_bpf_offload_deregister_callback(tHalHandle h_hal)
16399{
16400 QDF_STATUS status = QDF_STATUS_SUCCESS;
16401 tpAniSirGlobal mac;
16402
16403 if (!h_hal) {
16404 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
16405 FL("hHal is not valid"));
16406 return QDF_STATUS_E_INVAL;
16407 }
16408
16409 mac = PMAC_STRUCT(h_hal);
16410
16411 status = sme_acquire_global_lock(&mac->sme);
16412 if (QDF_IS_STATUS_SUCCESS(status)) {
16413 mac->sme.pbpf_get_offload_cb = NULL;
16414 sme_release_global_lock(&mac->sme);
16415 } else {
16416 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
16417 FL("sme_acquire_global_lock failed"));
16418 }
16419 return status;
16420}
16421
16422
16423/**
Manjunathappa Prakash59f861d2016-04-21 10:33:31 -070016424 * sme_create_mon_session() - post message to create PE session for monitormode
16425 * operation
16426 * @hal_handle: Handle to the HAL
16427 * @bssid: pointer to bssid
16428 *
16429 * Return: QDF_STATUS_SUCCESS on success, non-zero error code on failure.
16430 */
16431QDF_STATUS sme_create_mon_session(tHalHandle hal_handle, tSirMacAddr bss_id)
16432{
16433 QDF_STATUS status = QDF_STATUS_E_FAILURE;
16434 struct sir_create_session *msg;
16435
16436 msg = qdf_mem_malloc(sizeof(*msg));
16437 if (NULL != msg) {
16438 msg->type = eWNI_SME_MON_INIT_SESSION;
16439 msg->msg_len = sizeof(*msg);
16440 qdf_mem_copy(msg->bss_id.bytes, bss_id, QDF_MAC_ADDR_SIZE);
16441 status = cds_send_mb_message_to_mac(msg);
16442 }
16443 return status;
16444}
Gupta, Kapil96c7f2f2016-04-25 19:13:41 +053016445
Gupta, Kapil96c7f2f2016-04-25 19:13:41 +053016446/**
16447 * sme_set_adaptive_dwelltime_config() - Update Adaptive dwelltime configuration
16448 * @hal: The handle returned by macOpen
16449 * @params: adaptive_dwelltime_params config
16450 *
16451 * Return: QDF_STATUS if adaptive dwell time update
16452 * configuration sucsess else failure status
16453 */
16454QDF_STATUS sme_set_adaptive_dwelltime_config(tHalHandle hal,
16455 struct adaptive_dwelltime_params *params)
16456{
16457 cds_msg_t message;
16458 QDF_STATUS status;
16459 struct adaptive_dwelltime_params *dwelltime_params;
16460
16461 dwelltime_params = qdf_mem_malloc(sizeof(*dwelltime_params));
16462 if (NULL == dwelltime_params) {
16463 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
16464 "%s: fail to alloc dwelltime_params", __func__);
16465 return QDF_STATUS_E_NOMEM;
16466 }
16467
16468 dwelltime_params->is_enabled = params->is_enabled;
16469 dwelltime_params->dwelltime_mode = params->dwelltime_mode;
16470 dwelltime_params->lpf_weight = params->lpf_weight;
16471 dwelltime_params->passive_mon_intval = params->passive_mon_intval;
16472 dwelltime_params->wifi_act_threshold = params->wifi_act_threshold;
16473
16474 message.type = WMA_SET_ADAPT_DWELLTIME_CONF_PARAMS;
16475 message.bodyptr = dwelltime_params;
16476 status = cds_mq_post_message(QDF_MODULE_ID_WMA, &message);
16477 if (!QDF_IS_STATUS_SUCCESS(status)) {
16478 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
16479 "%s: Not able to post msg to WMA!", __func__);
16480
16481 qdf_mem_free(dwelltime_params);
16482 }
16483 return status;
16484}
Naveen Rawata410c5a2016-09-19 14:22:33 -070016485
16486/**
16487 * sme_set_vdev_ies_per_band() - sends the per band IEs to vdev
16488 * @hal: Pointer to HAL
16489 * @vdev_id: vdev_id for which IE is targeted
16490 *
16491 * Return: None
16492 */
16493void sme_set_vdev_ies_per_band(tHalHandle hal, uint8_t vdev_id)
16494{
16495 tpAniSirGlobal p_mac = PMAC_STRUCT(hal);
16496 struct sir_set_vdev_ies_per_band *p_msg;
16497 QDF_STATUS status = QDF_STATUS_E_FAILURE;
16498
16499 p_msg = qdf_mem_malloc(sizeof(*p_msg));
16500 if (NULL == p_msg) {
16501 sms_log(p_mac, LOGE, FL("mem alloc failed for sme msg"));
16502 return;
16503 }
16504
16505 p_msg->vdev_id = vdev_id;
16506 p_msg->msg_type = eWNI_SME_SET_VDEV_IES_PER_BAND;
16507 p_msg->len = sizeof(*p_msg);
16508 sms_log(p_mac, LOG1,
16509 FL("sending eWNI_SME_SET_VDEV_IES_PER_BAND: vdev_id: %d "),
16510 vdev_id);
16511 status = cds_send_mb_message_to_mac(p_msg);
16512 if (QDF_STATUS_SUCCESS != status)
16513 sms_log(p_mac, LOGE,
16514 FL("Send eWNI_SME_SET_VDEV_IES_PER_BAND fail"));
16515}
16516
Kiran Kumar Lokere666bf852016-05-02 12:23:02 -070016517/**
16518 * sme_set_pdev_ht_vht_ies() - sends the set pdev IE req
16519 * @hal: Pointer to HAL
16520 * @enable2x2: 1x1 or 2x2 mode.
16521 *
16522 * Sends the set pdev IE req with Nss value.
16523 *
16524 * Return: None
16525 */
16526void sme_set_pdev_ht_vht_ies(tHalHandle hal, bool enable2x2)
16527{
16528 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
16529 struct sir_set_ht_vht_cfg *ht_vht_cfg;
16530 QDF_STATUS status = QDF_STATUS_E_FAILURE;
16531
Kiran Kumar Lokere666bf852016-05-02 12:23:02 -070016532 if (!((mac_ctx->roam.configParam.uCfgDot11Mode ==
16533 eCSR_CFG_DOT11_MODE_AUTO) ||
16534 (mac_ctx->roam.configParam.uCfgDot11Mode ==
16535 eCSR_CFG_DOT11_MODE_11N) ||
16536 (mac_ctx->roam.configParam.uCfgDot11Mode ==
16537 eCSR_CFG_DOT11_MODE_11N_ONLY) ||
16538 (mac_ctx->roam.configParam.uCfgDot11Mode ==
16539 eCSR_CFG_DOT11_MODE_11AC) ||
16540 (mac_ctx->roam.configParam.uCfgDot11Mode ==
16541 eCSR_CFG_DOT11_MODE_11AC_ONLY)))
16542 return;
16543
16544 status = sme_acquire_global_lock(&mac_ctx->sme);
16545 if (QDF_STATUS_SUCCESS == status) {
16546 ht_vht_cfg = qdf_mem_malloc(sizeof(*ht_vht_cfg));
16547 if (NULL == ht_vht_cfg) {
16548 sms_log(mac_ctx, LOGE,
16549 "%s: mem alloc failed for ht_vht_cfg",
16550 __func__);
16551 sme_release_global_lock(&mac_ctx->sme);
16552 return;
16553 }
16554
16555 ht_vht_cfg->pdev_id = 0;
16556 if (enable2x2)
16557 ht_vht_cfg->nss = 2;
16558 else
16559 ht_vht_cfg->nss = 1;
16560 ht_vht_cfg->dot11mode =
16561 (uint8_t)csr_translate_to_wni_cfg_dot11_mode(mac_ctx,
16562 mac_ctx->roam.configParam.uCfgDot11Mode);
16563
16564 ht_vht_cfg->msg_type = eWNI_SME_PDEV_SET_HT_VHT_IE;
16565 ht_vht_cfg->len = sizeof(*ht_vht_cfg);
16566 sms_log(mac_ctx, LOG1,
16567 FL("SET_HT_VHT_IE with nss %d, dot11mode %d"),
16568 ht_vht_cfg->nss,
16569 ht_vht_cfg->dot11mode);
16570 status = cds_send_mb_message_to_mac(ht_vht_cfg);
16571 if (QDF_STATUS_SUCCESS != status) {
16572 sms_log(mac_ctx, LOGE, FL(
16573 "Send SME_PDEV_SET_HT_VHT_IE fail"));
Kiran Kumar Lokere666bf852016-05-02 12:23:02 -070016574 }
16575 sme_release_global_lock(&mac_ctx->sme);
16576 }
16577 return;
16578}
16579
16580/**
16581 * sme_update_vdev_type_nss() - sets the nss per vdev type
16582 * @hal: Pointer to HAL
16583 * @max_supp_nss: max_supported Nss
16584 * @band: 5G or 2.4G band
16585 *
16586 * Sets the per band Nss for each vdev type based on INI and configured
16587 * chain mask value.
16588 *
16589 * Return: None
16590 */
16591void sme_update_vdev_type_nss(tHalHandle hal, uint8_t max_supp_nss,
16592 uint32_t vdev_type_nss, eCsrBand band)
16593{
16594 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
16595 struct vdev_type_nss *vdev_nss;
16596
16597 if (eCSR_BAND_5G == band)
16598 vdev_nss = &mac_ctx->vdev_type_nss_5g;
16599 else
16600 vdev_nss = &mac_ctx->vdev_type_nss_2g;
16601
16602 vdev_nss->sta = QDF_MIN(max_supp_nss, CFG_STA_NSS(vdev_type_nss));
16603 vdev_nss->sap = QDF_MIN(max_supp_nss, CFG_SAP_NSS(vdev_type_nss));
16604 vdev_nss->p2p_go = QDF_MIN(max_supp_nss,
16605 CFG_P2P_GO_NSS(vdev_type_nss));
16606 vdev_nss->p2p_cli = QDF_MIN(max_supp_nss,
16607 CFG_P2P_CLI_NSS(vdev_type_nss));
16608 vdev_nss->p2p_dev = QDF_MIN(max_supp_nss,
16609 CFG_P2P_DEV_NSS(vdev_type_nss));
16610 vdev_nss->ibss = QDF_MIN(max_supp_nss, CFG_IBSS_NSS(vdev_type_nss));
16611 vdev_nss->tdls = QDF_MIN(max_supp_nss, CFG_TDLS_NSS(vdev_type_nss));
16612 vdev_nss->ocb = QDF_MIN(max_supp_nss, CFG_OCB_NSS(vdev_type_nss));
16613
16614 sms_log(mac_ctx, LOG1,
16615 "band %d NSS:sta %d sap %d cli %d go %d dev %d ibss %d tdls %d ocb %d",
16616 band, vdev_nss->sta, vdev_nss->sap, vdev_nss->p2p_cli,
16617 vdev_nss->p2p_go, vdev_nss->p2p_dev, vdev_nss->ibss,
16618 vdev_nss->tdls, vdev_nss->ocb);
16619}
Peng Xu8fdaa492016-06-22 10:20:47 -070016620
16621/**
16622 * sme_register_p2p_lo_event() - Register for the p2p lo event
16623 * @hHal: reference to the HAL
16624 * @context: the context of the call
16625 * @callback: the callback to hdd
16626 *
16627 * This function registers the callback function for P2P listen
16628 * offload stop event.
16629 *
16630 * Return: none
16631 */
16632void sme_register_p2p_lo_event(tHalHandle hHal, void *context,
16633 p2p_lo_callback callback)
16634{
16635 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
16636 QDF_STATUS status = QDF_STATUS_E_FAILURE;
16637
16638 status = sme_acquire_global_lock(&pMac->sme);
16639 pMac->sme.p2p_lo_event_callback = callback;
16640 pMac->sme.p2p_lo_event_context = context;
16641 sme_release_global_lock(&pMac->sme);
16642}
Manjeet Singhf82ed072016-07-08 11:40:00 +053016643
16644/**
16645 * sme_process_mac_pwr_dbg_cmd() - enable mac pwr debugging
16646 * @hal: The handle returned by macOpen
16647 * @session_id: session id
16648 * @dbg_args: args for mac pwr debug command
16649 * Return: Return QDF_STATUS, otherwise appropriate failure code
16650 */
16651QDF_STATUS sme_process_mac_pwr_dbg_cmd(tHalHandle hal, uint32_t session_id,
16652 struct sir_mac_pwr_dbg_cmd*
16653 dbg_args)
16654{
16655 cds_msg_t message;
16656 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
16657 struct sir_mac_pwr_dbg_cmd *req;
16658 int i;
16659
16660 if (!CSR_IS_SESSION_VALID(mac_ctx, session_id)) {
16661 sms_log(mac_ctx, LOGE,
16662 "CSR session not valid: %d",
16663 session_id);
16664 return QDF_STATUS_E_FAILURE;
16665 }
16666
16667 req = qdf_mem_malloc(sizeof(*req));
16668 if (NULL == req) {
16669 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
16670 "%s: fail to alloc mac_pwr_dbg_args", __func__);
16671 return QDF_STATUS_E_FAILURE;
16672 }
16673 req->module_id = dbg_args->module_id;
16674 req->pdev_id = dbg_args->pdev_id;
16675 req->num_args = dbg_args->num_args;
16676 for (i = 0; i < req->num_args; i++)
16677 req->args[i] = dbg_args->args[i];
16678
16679 message.type = SIR_HAL_POWER_DBG_CMD;
16680 message.bodyptr = req;
16681
16682 if (!QDF_IS_STATUS_SUCCESS(cds_mq_post_message
16683 (QDF_MODULE_ID_WMA, &message))) {
16684 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
16685 "%s: Not able to post msg to WDA!",
16686 __func__);
16687 qdf_mem_free(req);
16688 }
16689 return QDF_STATUS_SUCCESS;
16690}
Tushnim Bhattacharyyaf44a9d82016-07-05 10:52:06 -070016691/**
16692 * sme_get_vdev_type_nss() - gets the nss per vdev type
16693 * @hal: Pointer to HAL
16694 * @dev_mode: connection type.
16695 * @nss2g: Pointer to the 2G Nss parameter.
16696 * @nss5g: Pointer to the 5G Nss parameter.
16697 *
16698 * Fills the 2G and 5G Nss values based on connection type.
16699 *
16700 * Return: None
16701 */
16702void sme_get_vdev_type_nss(tHalHandle hal, enum tQDF_ADAPTER_MODE dev_mode,
16703 uint8_t *nss_2g, uint8_t *nss_5g)
16704{
16705 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
16706 csr_get_vdev_type_nss(mac_ctx, dev_mode, nss_2g, nss_5g);
16707}
Agrawal Ashish21ba2572016-09-03 16:40:10 +053016708
16709/**
16710 * sme_update_sta_roam_policy() - update sta roam policy for
16711 * unsafe and DFS channels.
16712 * @hal_handle: hal handle for getting global mac struct
16713 * @dfs_mode: dfs mode which tell if dfs channel needs to be
16714 * skipped or not
16715 * @skip_unsafe_channels: Param to tell if driver needs to
16716 * skip unsafe channels or not.
16717 * @param session_id: sme_session_id
16718 *
16719 * sme_update_sta_roam_policy update sta rome policies to csr
16720 * this function will call csrUpdateChannelList as well
16721 * to include/exclude DFS channels and unsafe channels.
16722 *
16723 * Return: eHAL_STATUS_SUCCESS or non-zero on failure.
16724 */
16725QDF_STATUS sme_update_sta_roam_policy(tHalHandle hal_handle,
16726 enum sta_roam_policy_dfs_mode dfs_mode,
16727 bool skip_unsafe_channels,
16728 uint8_t session_id)
16729{
16730 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal_handle);
16731 QDF_STATUS status = QDF_STATUS_SUCCESS;
16732 tSmeConfigParams sme_config;
16733
16734 if (!mac_ctx) {
16735 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_FATAL,
16736 "%s: mac_ctx is null", __func__);
16737 return QDF_STATUS_E_FAILURE;
16738 }
16739 qdf_mem_zero(&sme_config, sizeof(sme_config));
16740 sme_get_config_param(hal_handle, &sme_config);
16741
16742 sme_config.csrConfig.sta_roam_policy_params.dfs_mode =
16743 dfs_mode;
16744 sme_config.csrConfig.sta_roam_policy_params.skip_unsafe_channels =
16745 skip_unsafe_channels;
16746
16747 sme_update_config(hal_handle, &sme_config);
16748
16749 status = csr_update_channel_list(mac_ctx);
16750 if (QDF_STATUS_SUCCESS != status) {
16751 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
16752 FL("failed to update the supported channel list"));
16753 }
16754 if (mac_ctx->roam.configParam.isRoamOffloadScanEnabled)
16755 csr_roam_offload_scan(mac_ctx, session_id,
16756 ROAM_SCAN_OFFLOAD_UPDATE_CFG,
16757 REASON_ROAM_SCAN_STA_ROAM_POLICY_CHANGED);
Selvaraj, Sridharebda0f22016-08-29 16:05:23 +053016758 return status;
16759}
16760
16761/**
16762 * sme_enable_disable_chanavoidind_event - configure ca event ind
16763 * @hal: handler to hal
16764 * @set_value: enable/disable
16765 *
16766 * function to enable/disable chan avoidance indication
16767 *
16768 * Return: QDF_STATUS
16769 */
16770QDF_STATUS sme_enable_disable_chanavoidind_event(tHalHandle hal,
16771 uint8_t set_value)
16772{
16773 QDF_STATUS status;
16774 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
16775 cds_msg_t msg;
16776
16777 sms_log(mac_ctx, LOG1, FL("set_value: %d"), set_value);
16778 status = sme_acquire_global_lock(&mac_ctx->sme);
16779 if (QDF_STATUS_SUCCESS == status) {
16780 qdf_mem_zero(&msg, sizeof(cds_msg_t));
16781 msg.type = WMA_SEND_FREQ_RANGE_CONTROL_IND;
16782 msg.bodyval = set_value;
16783 status = cds_mq_post_message(QDF_MODULE_ID_WMA, &msg);
16784 sme_release_global_lock(&mac_ctx->sme);
16785 return status;
16786 }
Deepak Dhamdhereb106ae52016-08-10 20:55:30 +053016787 return status;
16788}
Agrawal Ashish21ba2572016-09-03 16:40:10 +053016789
Deepak Dhamdhereb106ae52016-08-10 20:55:30 +053016790/*
16791 * sme_set_default_scan_ie() - API to send default scan IE to LIM
16792 * @hal: reference to the HAL
16793 * @session_id: current session ID
16794 * @ie_data: Pointer to Scan IE data
16795 * @ie_len: Length of @ie_data
16796 *
16797 * Return: QDF_STATUS
16798 */
16799QDF_STATUS sme_set_default_scan_ie(tHalHandle hal, uint16_t session_id,
16800 uint8_t *ie_data, uint16_t ie_len)
16801{
16802 QDF_STATUS status;
16803 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
16804 struct hdd_default_scan_ie *set_ie_params;
16805
16806 status = sme_acquire_global_lock(&mac_ctx->sme);
16807 if (QDF_IS_STATUS_SUCCESS(status)) {
16808 set_ie_params = qdf_mem_malloc(sizeof(*set_ie_params));
16809 if (!set_ie_params)
16810 status = QDF_STATUS_E_NOMEM;
16811 else {
16812 set_ie_params->message_type = eWNI_SME_DEFAULT_SCAN_IE;
16813 set_ie_params->length = sizeof(*set_ie_params);
16814 set_ie_params->session_id = session_id;
16815 set_ie_params->ie_len = ie_len;
16816 qdf_mem_copy(set_ie_params->ie_data, ie_data, ie_len);
16817 status = cds_send_mb_message_to_mac(set_ie_params);
16818 }
16819 sme_release_global_lock(&mac_ctx->sme);
16820 }
16821 sms_log(mac_ctx, LOG1, FL("Set default scan IE status %d"), status);
Agrawal Ashish21ba2572016-09-03 16:40:10 +053016822 return status;
16823}
Padma, Santhosh Kumard7cc0792016-06-28 18:54:12 +053016824
Padma, Santhosh Kumar72e7aec2016-10-12 17:23:44 +053016825#ifdef WLAN_FEATURE_DISA
Padma, Santhosh Kumard7cc0792016-06-28 18:54:12 +053016826/**
16827 * sme_encrypt_decrypt_msg() - handles encrypt/decrypt mesaage
16828 * @hal: HAL handle
16829 * @encrypt_decrypt_params: struct to set encryption/decryption params.
16830 *
16831 * Return: QDF_STATUS enumeration.
16832 */
16833QDF_STATUS sme_encrypt_decrypt_msg(tHalHandle hal,
16834 struct encrypt_decrypt_req_params *encrypt_decrypt_params)
16835{
16836 QDF_STATUS status = QDF_STATUS_SUCCESS;
16837 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
16838 cds_msg_t cds_msg;
16839 struct encrypt_decrypt_req_params *params;
16840 uint8_t *ptr;
16841
16842 ptr = qdf_mem_malloc(sizeof(*params) +
16843 encrypt_decrypt_params->data_len);
16844 if (ptr == NULL) {
16845 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
16846 FL("Failed to alloc memory for encrypt/decrypt params"));
16847 return QDF_STATUS_E_NOMEM;
16848 }
16849
16850 params = (struct encrypt_decrypt_req_params *)ptr;
16851
16852 *params = *encrypt_decrypt_params;
16853
16854 if (params->data_len) {
16855 params->data = ptr + sizeof(*params);
16856
16857 qdf_mem_copy(params->data, encrypt_decrypt_params->data,
16858 params->data_len);
16859 }
16860
16861 status = sme_acquire_global_lock(&mac_ctx->sme);
16862 if (status == QDF_STATUS_SUCCESS) {
16863 /* Serialize the req through MC thread */
16864 cds_msg.bodyptr = params;
16865 cds_msg.type = WMA_ENCRYPT_DECRYPT_MSG;
16866 status = cds_mq_post_message(QDF_MODULE_ID_WMA, &cds_msg);
16867
16868 if (!QDF_IS_STATUS_SUCCESS(status)) {
16869 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
16870 FL("Post encrypt/decrypt msg fail"));
16871 status = QDF_STATUS_E_FAILURE;
16872 qdf_mem_free(params);
16873 }
16874 sme_release_global_lock(&mac_ctx->sme);
16875 } else {
16876 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
16877 FL("sme_acquire_global_lock failed"));
16878 qdf_mem_free(params);
16879 }
16880 return status;
16881
16882}
16883
16884/**
16885 * sme_encrypt_decrypt_msg_register_callback() - Registers
16886 * encrypt/decrypt message callback
16887 *
16888 * @hal - MAC global handle
16889 * @callback_routine - callback routine from HDD
16890 *
16891 * This API is invoked by HDD to register its callback in SME
16892 *
16893 * Return: QDF_STATUS
16894 */
16895QDF_STATUS sme_encrypt_decrypt_msg_register_callback(tHalHandle hal,
16896 void (*encrypt_decrypt_cb)(void *hdd_context,
16897 struct sir_encrypt_decrypt_rsp_params
16898 *encrypt_decrypt_rsp_params))
16899{
16900 QDF_STATUS status = QDF_STATUS_SUCCESS;
16901 tpAniSirGlobal mac;
16902
16903 if (!hal) {
16904 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
16905 FL("hHal is not valid"));
16906 return QDF_STATUS_E_INVAL;
16907 }
16908
16909 mac = PMAC_STRUCT(hal);
16910
16911 status = sme_acquire_global_lock(&mac->sme);
16912 if (QDF_IS_STATUS_SUCCESS(status)) {
16913 mac->sme.encrypt_decrypt_cb = encrypt_decrypt_cb;
16914 sme_release_global_lock(&mac->sme);
16915 } else {
16916 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
16917 FL("sme_acquire_global_lock failed"));
16918 }
16919 return status;
16920}
16921
16922/**
16923 * sme_encrypt_decrypt_msg_deregister_callback() - Registers
16924 * encrypt/decrypt message callback
16925 *
16926 * @h_hal - MAC global handle
16927 * @callback_routine - callback routine from HDD
16928 *
16929 * This API is invoked by HDD to de-register its callback in SME
16930 *
16931 * Return: QDF_STATUS Enumeration
16932 */
16933QDF_STATUS sme_encrypt_decrypt_msg_deregister_callback(tHalHandle h_hal)
16934{
16935 QDF_STATUS status = QDF_STATUS_SUCCESS;
16936 tpAniSirGlobal mac;
16937
16938 if (!h_hal) {
16939 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
16940 FL("hHal is not valid"));
16941 return QDF_STATUS_E_INVAL;
16942 }
16943
16944 mac = PMAC_STRUCT(h_hal);
16945
16946 status = sme_acquire_global_lock(&mac->sme);
16947 if (QDF_IS_STATUS_SUCCESS(status)) {
16948 mac->sme.encrypt_decrypt_cb = NULL;
16949 sme_release_global_lock(&mac->sme);
16950 } else {
16951 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
16952 FL("sme_acquire_global_lock failed"));
16953 }
16954 return status;
16955}
Padma, Santhosh Kumar72e7aec2016-10-12 17:23:44 +053016956#endif
Agrawal Ashishb2d1a452016-05-05 12:23:58 +053016957
16958QDF_STATUS sme_set_cts2self_for_p2p_go(tHalHandle hal_handle)
16959{
Agrawal Ashishb2d1a452016-05-05 12:23:58 +053016960 void *wma_handle;
16961
16962 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
16963 if (!wma_handle) {
16964 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
16965 "wma_handle is NULL");
16966 return QDF_STATUS_E_FAILURE;
16967 }
Agrawal Ashishb2d1a452016-05-05 12:23:58 +053016968 if (QDF_STATUS_SUCCESS !=
16969 wma_set_cts2self_for_p2p_go(wma_handle, true)) {
16970 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
16971 "%s: Failed to set cts2self for p2p GO to firmware",
16972 __func__);
16973 return QDF_STATUS_E_FAILURE;
16974 }
16975 return QDF_STATUS_SUCCESS;
16976}
Agrawal, Ashish35b251d2016-09-08 19:21:03 +053016977/**
16978 * sme_update_tx_fail_cnt_threshold() - update tx fail count Threshold
16979 * @hal: Handle returned by mac_open
16980 * @session_id: Session ID on which tx fail count needs to be updated to FW
16981 * @tx_fail_count: Count for tx fail threshold after which FW will disconnect
16982 *
16983 * This function is used to set tx fail count threshold to firmware.
16984 * firmware will issue disocnnect with peer device once this threshold is
16985 * reached.
16986 *
16987 * Return: Return QDF_STATUS, otherwise appropriate failure code
16988 */
16989QDF_STATUS sme_update_tx_fail_cnt_threshold(tHalHandle hal_handle,
16990 uint8_t session_id, uint32_t tx_fail_count)
16991{
16992 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal_handle);
16993 QDF_STATUS status = QDF_STATUS_E_FAILURE;
16994 struct sme_tx_fail_cnt_threshold *tx_fail_cnt;
16995 cds_msg_t msg;
16996
16997 tx_fail_cnt = qdf_mem_malloc(sizeof(*tx_fail_cnt));
16998 if (NULL == tx_fail_cnt) {
16999 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
17000 "%s: fail to alloc filter_param", __func__);
17001 return QDF_STATUS_E_FAILURE;
17002 }
17003 sms_log(mac_ctx, LOG1,
17004 FL("session_id %d tx_fail_count: %d"),
17005 session_id, tx_fail_count);
17006 tx_fail_cnt->session_id = session_id;
17007 tx_fail_cnt->tx_fail_cnt_threshold = tx_fail_count;
17008
17009 qdf_mem_zero(&msg, sizeof(cds_msg_t));
17010 msg.type = SIR_HAL_UPDATE_TX_FAIL_CNT_TH;
17011 msg.reserved = 0;
17012 msg.bodyptr = tx_fail_cnt;
17013 status = cds_mq_post_message(QDF_MODULE_ID_WMA, &msg);
17014
17015 if (!QDF_IS_STATUS_SUCCESS(status)) {
17016 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
17017 FL("Not able to post Tx fail count message to WDA"));
17018 qdf_mem_free(tx_fail_cnt);
17019 }
Sreelakshmi Konamki58c72432016-11-09 17:06:44 +053017020 return status;
17021}
Agrawal, Ashish35b251d2016-09-08 19:21:03 +053017022
Sreelakshmi Konamki58c72432016-11-09 17:06:44 +053017023QDF_STATUS sme_set_lost_link_info_cb(tHalHandle hal,
17024 void (*cb)(void *, struct sir_lost_link_info *))
17025{
17026 QDF_STATUS status = QDF_STATUS_SUCCESS;
17027 tpAniSirGlobal mac = PMAC_STRUCT(hal);
17028
17029 status = sme_acquire_global_lock(&mac->sme);
17030 if (QDF_IS_STATUS_SUCCESS(status)) {
17031 mac->sme.lost_link_info_cb = cb;
17032 sme_release_global_lock(&mac->sme);
17033 sms_log(mac, LOG1, FL("set lost link info callback"));
17034 } else {
17035 sms_log(mac, LOGE,
17036 FL("sme_acquire_global_lock error status %d"),
17037 status);
17038 }
Agrawal, Ashish35b251d2016-09-08 19:21:03 +053017039 return status;
17040}