blob: d027e0e8b4a8ce2c10587d02b5abea49db7c223b [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
3101/**
3102 * sme_process_nss_update_resp() - Process nss update response
3103 * @mac: Global MAC pointer
3104 * @msg: nss update response
3105 *
3106 * Processes the nss update response and invokes the HDD
3107 * callback to process further
3108 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303109QDF_STATUS sme_process_nss_update_resp(tpAniSirGlobal mac, uint8_t *msg)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003110{
3111 tListElem *entry = NULL;
3112 tSmeCmd *command = NULL;
3113 bool found;
3114 nss_update_cb callback = NULL;
3115 struct sir_beacon_tx_complete_rsp *param;
3116
3117 param = (struct sir_beacon_tx_complete_rsp *)msg;
3118 if (!param) {
3119 sms_log(mac, LOGE, FL("nss update resp param is NULL"));
3120 /* Not returning. Need to check if active command list
3121 * needs to be freed
3122 */
3123 }
3124
3125 entry = csr_ll_peek_head(&mac->sme.smeCmdActiveList,
3126 LL_ACCESS_LOCK);
3127 if (!entry) {
3128 sms_log(mac, LOGE, FL("No cmd found in active list"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303129 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003130 }
3131
3132 command = GET_BASE_ADDR(entry, tSmeCmd, Link);
3133 if (!command) {
3134 sms_log(mac, LOGE, FL("Base address is NULL"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303135 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003136 }
3137
3138 if (e_sme_command_nss_update != command->command) {
3139 sms_log(mac, LOGE, FL("Command mismatch!"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303140 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003141 }
3142
3143 callback = command->u.nss_update_cmd.nss_update_cb;
3144 if (callback) {
3145 if (!param) {
3146 sms_log(mac, LOGE,
3147 FL("Callback failed since nss update params is NULL"));
3148 } else {
3149 sms_log(mac, LOGE,
3150 FL("Calling HDD callback for nss update response"));
3151 callback(command->u.nss_update_cmd.context,
3152 param->tx_status,
3153 param->session_id,
Chandrasekaran, Manishekarce2172e2016-02-18 16:12:43 +05303154 command->u.nss_update_cmd.next_action,
3155 command->u.nss_update_cmd.reason);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003156 }
3157 } else {
3158 sms_log(mac, LOGE, FL("Callback does not exisit"));
3159 }
3160
3161 found = csr_ll_remove_entry(&mac->sme.smeCmdActiveList, entry,
3162 LL_ACCESS_LOCK);
3163 if (found) {
3164 /* Now put this command back on the avilable command list */
3165 sme_release_command(mac, command);
3166 }
3167 sme_process_pending_queue(mac);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303168 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003169}
3170
3171/* No need to hold the global lock here because this function can only be called */
3172/* after sme_stop. */
3173void sme_free_msg(tHalHandle hHal, cds_msg_t *pMsg)
3174{
3175 if (pMsg) {
3176 if (pMsg->bodyptr) {
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303177 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003178 }
3179 }
3180
3181}
3182
3183/*--------------------------------------------------------------------------
3184
3185 \brief sme_stop() - Stop all SME modules and put them at idle state
3186
3187 The function stops each module in SME, PMC, CSR, etc. . Upon
3188 return, all modules are at idle state ready to start.
3189
3190 This is a synchronous call
3191 \param hHal - The handle returned by mac_open
3192 \param tHalStopType - reason for stopping
3193
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303194 \return QDF_STATUS_SUCCESS - SME is stopped.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003195
3196 Other status means SME is failed to stop but caller should still
3197 consider SME is stopped.
3198 \sa
3199
3200 --------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303201QDF_STATUS sme_stop(tHalHandle hHal, tHalStopType stopType)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003202{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303203 QDF_STATUS status = QDF_STATUS_E_FAILURE;
3204 QDF_STATUS fail_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003205 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
3206
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003207 p2p_stop(hHal);
3208
3209 status = csr_stop(pMac, stopType);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303210 if (!QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003211 sms_log(pMac, LOGE,
3212 "csr_stop failed during smeStop with status=%d", status);
3213 fail_status = status;
3214 }
3215
3216 purge_sme_cmd_list(pMac);
3217
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303218 if (!QDF_IS_STATUS_SUCCESS(fail_status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003219 status = fail_status;
3220 }
3221
3222 pMac->sme.state = SME_STATE_STOP;
3223
3224 return status;
3225}
3226
3227/*--------------------------------------------------------------------------
3228
3229 \brief sme_close() - Release all SME modules and their resources.
3230
3231 The function release each module in SME, PMC, CSR, etc. . Upon
3232 return, all modules are at closed state.
3233
3234 No SME APIs can be involved after smeClose except smeOpen.
3235 smeClose must be called before mac_close.
3236 This is a synchronous call
3237 \param hHal - The handle returned by mac_open
3238
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303239 \return QDF_STATUS_SUCCESS - SME is successfully close.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003240
3241 Other status means SME is failed to be closed but caller still cannot
3242 call any other SME functions except smeOpen.
3243 \sa
3244
3245 --------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303246QDF_STATUS sme_close(tHalHandle hHal)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003247{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303248 QDF_STATUS status = QDF_STATUS_E_FAILURE;
3249 QDF_STATUS fail_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003250 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
3251
3252 if (!pMac)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303253 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003254
3255 /* Note: pSession will be invalid from here on, do not access */
3256 status = csr_close(pMac);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303257 if (!QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003258 sms_log(pMac, LOGE,
3259 "csr_close failed during sme close with status=%d",
3260 status);
3261 fail_status = status;
3262 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003263#ifndef WLAN_MDM_CODE_REDUCTION_OPT
3264 status = sme_qos_close(pMac);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303265 if (!QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003266 sms_log(pMac, LOGE,
3267 "Qos close failed during sme close with status=%d",
3268 status);
3269 fail_status = status;
3270 }
3271#endif
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003272 status = sme_ps_close(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303273 if (!QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003274 sms_log(pMac, LOGE,
3275 "sme_ps_close failed during smeClose status=%d",
3276 status);
3277 fail_status = status;
3278 }
3279
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003280 status = rrm_close(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303281 if (!QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003282 sms_log(pMac, LOGE,
3283 "RRM close failed during sme close with status=%d",
3284 status);
3285 fail_status = status;
3286 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003287
3288 sme_p2p_close(hHal);
3289
3290 free_sme_cmd_list(pMac);
3291
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303292 if (!QDF_IS_STATUS_SUCCESS
Anurag Chouhana37b5b72016-02-21 14:53:42 +05303293 (qdf_mutex_destroy(&pMac->sme.lkSmeGlobalLock))) {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303294 fail_status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003295 }
3296
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303297 if (!QDF_IS_STATUS_SUCCESS(fail_status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003298 status = fail_status;
3299 }
3300
3301 pMac->sme.state = SME_STATE_STOP;
3302
3303 return status;
3304}
3305
3306/**
Abhishek Singhc9941602016-08-09 16:06:22 +05303307 * sme_remove_bssid_from_scan_list() - wrapper to remove the bssid from
3308 * scan list
3309 * @hal: hal context.
3310 * @bssid: bssid to be removed
3311 *
3312 * This function remove the given bssid from scan list.
3313 *
3314 * Return: QDF status.
3315 */
3316QDF_STATUS sme_remove_bssid_from_scan_list(tHalHandle hal,
3317 tSirMacAddr bssid)
3318{
3319 QDF_STATUS status = QDF_STATUS_E_FAILURE;
3320 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
3321
3322 status = sme_acquire_global_lock(&mac_ctx->sme);
3323 if (QDF_IS_STATUS_SUCCESS(status)) {
3324 csr_remove_bssid_from_scan_list(mac_ctx, bssid);
3325 sme_release_global_lock(&mac_ctx->sme);
3326 }
3327
3328 return status;
3329}
3330
3331/**
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003332 * sme_scan_request() - wrapper function to Request a 11d or full scan from CSR.
3333 * @hal: hal global context
3334 * @session_id: session id
3335 * @scan_req: scan req
3336 * @callback: a callback function that scan calls upon finish, will not
3337 * be called if csr_scan_request returns error
3338 * @ctx: a pointer passed in for the callback
3339 *
3340 * This is a wrapper function to Request a 11d or full scan from CSR. This is
3341 * an asynchronous call
3342 *
3343 * Return: Status of operation
3344 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303345QDF_STATUS sme_scan_request(tHalHandle hal, uint8_t session_id,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003346 tCsrScanRequest *scan_req,
3347 csr_scan_completeCallback callback, void *ctx)
3348{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303349 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003350 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
3351 struct ani_scan_req *scan_msg;
3352 cds_msg_t msg;
3353 uint32_t scan_req_id, scan_count;
3354
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303355 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003356 TRACE_CODE_SME_RX_HDD_MSG_SCAN_REQ, session_id,
3357 scan_req->scanType));
Chandrasekaran, Manishekar2859de42016-02-11 16:17:38 +05303358
3359 if (!CSR_IS_SESSION_VALID(mac_ctx, session_id)) {
3360 sms_log(mac_ctx, LOGE, FL("Invalid session id:%d"),
3361 session_id);
3362 return status;
3363 }
3364
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003365 if (!mac_ctx->scan.fScanEnable) {
3366 sms_log(mac_ctx, LOGE, FL("fScanEnable false"));
3367 return status;
3368 }
3369
3370 scan_count = csr_ll_count(&mac_ctx->sme.smeScanCmdActiveList);
3371 if (scan_count >= mac_ctx->scan.max_scan_count) {
3372 sms_log(mac_ctx, LOGE, FL("Max scan reached"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303373 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003374 }
3375 wma_get_scan_id(&scan_req_id);
3376 scan_req->scan_id = scan_req_id;
3377
3378 status = sme_acquire_global_lock(&mac_ctx->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303379 if (!QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003380 sms_log(mac_ctx, LOGE, FL("Unable to acquire lock"));
3381 return status;
3382 }
3383 sms_log(mac_ctx, LOG1, FL(" called"));
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303384 scan_msg = qdf_mem_malloc(sizeof(struct ani_scan_req));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003385 if (NULL == scan_msg) {
3386 sms_log(mac_ctx, LOGE,
3387 " scan_req: failed to allocate mem for msg");
3388 sme_release_global_lock(&mac_ctx->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303389 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003390 }
3391 scan_msg->msg_type = eWNI_SME_SCAN_CMD;
3392 scan_msg->msg_len = (uint16_t) sizeof(struct ani_scan_req);
3393 scan_msg->session_id = session_id;
3394 scan_msg->callback = callback;
3395 scan_msg->ctx = ctx;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303396 scan_msg->scan_param = qdf_mem_malloc(sizeof(tCsrScanRequest));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003397 if (NULL == scan_msg->scan_param) {
3398 sms_log(mac_ctx, LOGE,
3399 "scan_req:failed to allocate mem for scanreq");
3400 sme_release_global_lock(&mac_ctx->sme);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303401 qdf_mem_free(scan_msg);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303402 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003403 }
3404 csr_scan_copy_request(mac_ctx, scan_msg->scan_param, scan_req);
3405 msg.type = eWNI_SME_SCAN_CMD;
3406 msg.bodyptr = scan_msg;
3407 msg.reserved = 0;
3408 msg.bodyval = 0;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303409 if (QDF_STATUS_SUCCESS !=
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003410 cds_mq_post_message(CDS_MQ_ID_SME, &msg)) {
3411 sms_log(mac_ctx, LOGE,
3412 " sme_scan_req failed to post msg");
3413 csr_scan_free_request(mac_ctx, scan_msg->scan_param);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303414 qdf_mem_free(scan_msg->scan_param);
3415 qdf_mem_free(scan_msg);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303416 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003417 }
3418 sme_release_global_lock(&mac_ctx->sme);
3419 return status;
3420}
3421
3422/* ---------------------------------------------------------------------------
3423 \fn sme_scan_get_result
3424 \brief a wrapper function to request scan results from CSR.
3425 This is a synchronous call
3426 \param pFilter - If pFilter is NULL, all cached results are returned
3427 \param phResult - an object for the result.
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303428 \return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003429 ---------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303430QDF_STATUS sme_scan_get_result(tHalHandle hHal, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003431 tCsrScanResultFilter *pFilter,
3432 tScanResultHandle *phResult)
3433{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303434 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003435 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
3436
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303437 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003438 TRACE_CODE_SME_RX_HDD_MSG_SCAN_GET_RESULTS, sessionId,
3439 0));
3440 sms_log(pMac, LOG2, FL("enter"));
3441 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303442 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003443 status = csr_scan_get_result(hHal, pFilter, phResult);
3444 sme_release_global_lock(&pMac->sme);
3445 }
3446 sms_log(pMac, LOG2, FL("exit status %d"), status);
3447
3448 return status;
3449}
3450
3451/**
3452 * sme_get_ap_channel_from_scan_cache() - a wrapper function to get AP's
3453 * channel id from CSR by filtering the
3454 * result which matches our roam profile.
3455 * @profile: SAP adapter
3456 * @ap_chnl_id: pointer to channel id of SAP. Fill the value after finding the
3457 * best ap from scan cache.
3458 *
3459 * This function is written to get AP's channel id from CSR by filtering
3460 * the result which matches our roam profile. This is a synchronous call.
3461 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303462 * Return: QDF_STATUS.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003463 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303464QDF_STATUS sme_get_ap_channel_from_scan_cache(tHalHandle hal_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003465 tCsrRoamProfile *profile,
3466 tScanResultHandle *scan_cache,
3467 uint8_t *ap_chnl_id)
3468{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303469 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003470 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal_handle);
3471 tCsrScanResultFilter *scan_filter = NULL;
3472 tScanResultHandle filtered_scan_result = NULL;
3473 tSirBssDescription first_ap_profile;
3474
3475 if (NULL == mac_ctx) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303476 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003477 FL("mac_ctx is NULL"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303478 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003479 }
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303480 scan_filter = qdf_mem_malloc(sizeof(tCsrScanResultFilter));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003481 if (NULL == scan_filter) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303482 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003483 FL("scan_filter mem alloc failed"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303484 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003485 } else {
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303486 qdf_mem_set(&first_ap_profile, sizeof(tSirBssDescription), 0);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003487
3488 if (NULL == profile) {
3489 scan_filter->EncryptionType.numEntries = 1;
3490 scan_filter->EncryptionType.encryptionType[0]
3491 = eCSR_ENCRYPT_TYPE_NONE;
3492 } else {
3493 /* Here is the profile we need to connect to */
3494 status = csr_roam_prepare_filter_from_profile(mac_ctx,
3495 profile,
3496 scan_filter);
3497 }
3498
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303499 if (QDF_STATUS_SUCCESS == status) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003500 /* Save the WPS info */
3501 if (NULL != profile) {
3502 scan_filter->bWPSAssociation =
3503 profile->bWPSAssociation;
3504 scan_filter->bOSENAssociation =
3505 profile->bOSENAssociation;
3506 } else {
3507 scan_filter->bWPSAssociation = 0;
3508 scan_filter->bOSENAssociation = 0;
3509 }
3510 } else {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303511 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003512 FL("Preparing the profile filter failed"));
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303513 qdf_mem_free(scan_filter);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303514 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003515 }
3516 }
3517 status = sme_acquire_global_lock(&mac_ctx->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303518 if (QDF_STATUS_SUCCESS == status) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003519 status = csr_scan_get_result(hal_handle, scan_filter,
3520 &filtered_scan_result);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303521 if (QDF_STATUS_SUCCESS == status) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003522 csr_get_bssdescr_from_scan_handle(filtered_scan_result,
3523 &first_ap_profile);
3524 *scan_cache = filtered_scan_result;
3525 if (0 != first_ap_profile.channelId) {
3526 *ap_chnl_id = first_ap_profile.channelId;
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303527 QDF_TRACE(QDF_MODULE_ID_SME,
3528 QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003529 FL("Found best AP & its on chnl[%d]"),
3530 first_ap_profile.channelId);
3531 } else {
3532 /*
3533 * This means scan result is empty
3534 * so set the channel to zero, caller should
3535 * take of zero channel id case.
3536 */
3537 *ap_chnl_id = 0;
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303538 QDF_TRACE(QDF_MODULE_ID_SME,
3539 QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003540 FL("Scan is empty, set chnl to 0"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303541 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003542 }
3543 } else {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303544 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003545 FL("Failed to get scan get result"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303546 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003547 }
3548 csr_free_scan_filter(mac_ctx, scan_filter);
3549 sme_release_global_lock(&mac_ctx->sme);
3550 } else {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303551 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003552 FL("Aquiring lock failed"));
Krunal Sonif9882222016-01-22 17:16:50 -08003553 csr_free_scan_filter(mac_ctx, scan_filter);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303554 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003555 }
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303556 qdf_mem_free(scan_filter);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003557 return status;
3558}
3559
3560/**
3561 * sme_store_joinreq_param() - This function will pass station's join
3562 * request to store to csr.
3563 * @hal_handle: pointer to hal context.
3564 * @profile: pointer to station's roam profile.
3565 * @scan_cache: pointer to station's scan cache.
3566 * @roam_id: reference to roam_id variable being passed.
3567 * @session_id: station's session id.
3568 *
3569 * This function will pass station's join request further down to csr
3570 * to store it. this stored parameter will be used later.
3571 *
3572 * Return: true or false based on function's overall success.
3573 **/
3574bool sme_store_joinreq_param(tHalHandle hal_handle,
3575 tCsrRoamProfile *profile,
3576 tScanResultHandle scan_cache,
3577 uint32_t *roam_id,
3578 uint32_t session_id)
3579{
3580 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal_handle);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303581 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003582 bool ret_status = true;
3583
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303584 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003585 TRACE_CODE_SME_RX_HDD_STORE_JOIN_REQ,
3586 session_id, 0));
3587 status = sme_acquire_global_lock(&mac_ctx->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303588 if (QDF_STATUS_SUCCESS == status) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003589 if (false == csr_store_joinreq_param(mac_ctx, profile,
3590 scan_cache, roam_id, session_id)) {
3591 ret_status = false;
3592 }
3593 sme_release_global_lock(&mac_ctx->sme);
3594 } else {
3595 ret_status = false;
3596 }
3597
3598 return ret_status;
3599}
3600
3601/**
3602 * sme_clear_joinreq_param() - This function will pass station's clear
3603 * the join request to csr.
3604 * @hal_handle: pointer to hal context.
3605 * @session_id: station's session id.
3606 *
3607 * This function will pass station's clear join request further down to csr
3608 * to cleanup.
3609 *
3610 * Return: true or false based on function's overall success.
3611 **/
3612bool sme_clear_joinreq_param(tHalHandle hal_handle,
3613 uint32_t session_id)
3614{
3615 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal_handle);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303616 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003617 bool ret_status = true;
3618
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303619 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003620 TRACE_CODE_SME_RX_HDD_CLEAR_JOIN_REQ,
3621 session_id, 0));
3622 status = sme_acquire_global_lock(&mac_ctx->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303623 if (QDF_STATUS_SUCCESS == status) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003624 if (false == csr_clear_joinreq_param(mac_ctx,
3625 session_id)) {
3626 ret_status = false;
3627 }
3628 sme_release_global_lock(&mac_ctx->sme);
3629 } else {
3630 ret_status = false;
3631 }
3632
3633 return ret_status;
3634}
3635
3636/**
3637 * sme_issue_stored_joinreq() - This function will issues station's stored
3638 * the join request to csr.
3639 * @hal_handle: pointer to hal context.
3640 * @roam_id: reference to roam_id variable being passed.
3641 * @session_id: station's session id.
3642 *
3643 * This function will issue station's stored join request further down to csr
3644 * to proceed forward.
3645 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303646 * Return: QDF_STATUS_SUCCESS or QDF_STATUS_E_FAILURE.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003647 **/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303648QDF_STATUS sme_issue_stored_joinreq(tHalHandle hal_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003649 uint32_t *roam_id,
3650 uint32_t session_id)
3651{
3652 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal_handle);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303653 QDF_STATUS status = QDF_STATUS_E_FAILURE;
3654 QDF_STATUS ret_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003655
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303656 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003657 TRACE_CODE_SME_RX_HDD_ISSUE_JOIN_REQ,
3658 session_id, 0));
3659 status = sme_acquire_global_lock(&mac_ctx->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303660 if (QDF_STATUS_SUCCESS == status) {
3661 if (QDF_STATUS_SUCCESS != csr_issue_stored_joinreq(mac_ctx,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003662 roam_id,
3663 session_id)) {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303664 ret_status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003665 }
3666 sme_release_global_lock(&mac_ctx->sme);
3667 } else {
3668 csr_clear_joinreq_param(mac_ctx, session_id);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303669 ret_status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003670 }
3671 return ret_status;
3672}
3673
3674/* ---------------------------------------------------------------------------
3675 \fn sme_scan_flush_result
3676 \brief a wrapper function to request CSR to clear scan results.
3677 This is a synchronous call
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303678 \return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003679 ---------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303680QDF_STATUS sme_scan_flush_result(tHalHandle hHal)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003681{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303682 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003683 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
3684
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303685 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003686 TRACE_CODE_SME_RX_HDD_MSG_SCAN_FLUSH_RESULTS,
3687 0, 0));
3688 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303689 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003690 status = csr_scan_flush_result(hHal);
3691 sme_release_global_lock(&pMac->sme);
3692 }
3693
3694 return status;
3695}
3696
3697/* ---------------------------------------------------------------------------
3698 \fn sme_filter_scan_results
3699 \brief a wrapper function to request CSR to clear scan results.
3700 This is a synchronous call
3701 \param tHalHandle - HAL context handle
3702 \param sessionId - session id
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303703 \return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003704 ---------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303705QDF_STATUS sme_filter_scan_results(tHalHandle hHal, uint8_t sessionId)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003706{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303707 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003708 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
3709
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303710 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003711 TRACE_CODE_SME_RX_HDD_MSG_SCAN_FLUSH_RESULTS,
3712 sessionId, 0));
3713 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303714 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003715 csr_scan_filter_results(pMac);
3716 sme_release_global_lock(&pMac->sme);
3717 }
3718
3719 return status;
3720}
3721
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303722QDF_STATUS sme_scan_flush_p2p_result(tHalHandle hHal, uint8_t sessionId)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003723{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303724 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003725 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
3726
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303727 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003728 TRACE_CODE_SME_RX_HDD_MSG_SCAN_FLUSH_P2PRESULTS,
3729 sessionId, 0));
3730 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303731 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003732 status = csr_scan_flush_selective_result(hHal, true);
3733 sme_release_global_lock(&pMac->sme);
3734 }
3735
3736 return status;
3737}
3738
3739/* ---------------------------------------------------------------------------
3740 \fn sme_scan_result_get_first
3741 \brief a wrapper function to request CSR to returns the first element of
3742 scan result.
3743 This is a synchronous call
3744 \param hScanResult - returned from csr_scan_get_result
3745 \return tCsrScanResultInfo * - NULL if no result
3746 ---------------------------------------------------------------------------*/
3747tCsrScanResultInfo *sme_scan_result_get_first(tHalHandle hHal,
3748 tScanResultHandle hScanResult)
3749{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303750 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003751 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
3752 tCsrScanResultInfo *pRet = NULL;
3753
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303754 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003755 TRACE_CODE_SME_RX_HDD_MSG_SCAN_RESULT_GETFIRST,
3756 NO_SESSION, 0));
3757 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303758 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003759 pRet = csr_scan_result_get_first(pMac, hScanResult);
3760 sme_release_global_lock(&pMac->sme);
3761 }
3762
3763 return pRet;
3764}
3765
3766/* ---------------------------------------------------------------------------
3767 \fn sme_scan_result_get_next
3768 \brief a wrapper function to request CSR to returns the next element of
3769 scan result. It can be called without calling csr_scan_result_get_first
3770 first
3771 This is a synchronous call
3772 \param hScanResult - returned from csr_scan_get_result
3773 \return Null if no result or reach the end
3774 ---------------------------------------------------------------------------*/
3775tCsrScanResultInfo *sme_scan_result_get_next(tHalHandle hHal,
3776 tScanResultHandle hScanResult)
3777{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303778 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003779 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
3780 tCsrScanResultInfo *pRet = NULL;
3781
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003782 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303783 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003784 pRet = csr_scan_result_get_next(pMac, hScanResult);
3785 sme_release_global_lock(&pMac->sme);
3786 }
3787
3788 return pRet;
3789}
3790
3791/* ---------------------------------------------------------------------------
3792 \fn sme_scan_result_purge
3793 \brief a wrapper function to request CSR to remove all items(tCsrScanResult)
3794 in the list and free memory for each item
3795 This is a synchronous call
3796 \param hScanResult - returned from csr_scan_get_result. hScanResult is
3797 considered gone by
3798 calling this function and even before this function reutrns.
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303799 \return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003800 ---------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303801QDF_STATUS sme_scan_result_purge(tHalHandle hHal, tScanResultHandle hScanResult)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003802{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303803 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003804 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
3805
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303806 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003807 TRACE_CODE_SME_RX_HDD_MSG_SCAN_RESULT_PURGE,
3808 NO_SESSION, 0));
3809 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303810 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003811 status = csr_scan_result_purge(hHal, hScanResult);
3812 sme_release_global_lock(&pMac->sme);
3813 }
3814
3815 return status;
3816}
3817
3818/* ---------------------------------------------------------------------------
3819 \fn sme_scan_get_pmkid_candidate_list
3820 \brief a wrapper function to return the PMKID candidate list
3821 This is a synchronous call
3822 \param pPmkidList - caller allocated buffer point to an array of
3823 tPmkidCandidateInfo
3824 \param pNumItems - pointer to a variable that has the number of
3825 tPmkidCandidateInfo allocated when retruning, this is
3826 either the number needed or number of items put into
3827 pPmkidList
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303828 \return QDF_STATUS - when fail, it usually means the buffer allocated is not
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003829 big enough and pNumItems
3830 has the number of tPmkidCandidateInfo.
3831 \Note: pNumItems is a number of tPmkidCandidateInfo,
3832 not sizeof(tPmkidCandidateInfo) * something
3833 ---------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303834QDF_STATUS sme_scan_get_pmkid_candidate_list(tHalHandle hHal, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003835 tPmkidCandidateInfo *pPmkidList,
3836 uint32_t *pNumItems)
3837{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303838 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003839 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
3840
3841 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303842 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003843 status =
3844 csr_scan_get_pmkid_candidate_list(pMac, sessionId,
3845 pPmkidList,
3846 pNumItems);
3847 sme_release_global_lock(&pMac->sme);
3848 }
3849
3850 return status;
3851}
3852
3853eCsrPhyMode sme_get_phy_mode(tHalHandle hHal)
3854{
3855 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
3856 return pMac->roam.configParam.phyMode;
3857}
3858
3859/* ---------------------------------------------------------------------------
3860 \fn sme_get_channel_bonding_mode5_g
3861 \brief get the channel bonding mode for 5G band
3862 \param hHal - HAL handle
3863 \return channel bonding mode for 5G
3864 ---------------------------------------------------------------------------*/
3865uint32_t sme_get_channel_bonding_mode5_g(tHalHandle hHal)
3866{
3867 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
3868 tSmeConfigParams smeConfig;
3869
3870 sme_get_config_param(pMac, &smeConfig);
3871
3872 return smeConfig.csrConfig.channelBondingMode5GHz;
3873}
3874
3875/* ---------------------------------------------------------------------------
3876 \fn sme_get_channel_bonding_mode24_g
3877 \brief get the channel bonding mode for 2.4G band
3878 \param hHal - HAL handle
3879 \return channel bonding mode for 2.4G
3880 ---------------------------------------------------------------------------*/
3881uint32_t sme_get_channel_bonding_mode24_g(tHalHandle hHal)
3882{
3883 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
3884 tSmeConfigParams smeConfig;
3885
3886 sme_get_config_param(pMac, &smeConfig);
3887
3888 return smeConfig.csrConfig.channelBondingMode24GHz;
3889}
3890
3891/* ---------------------------------------------------------------------------
3892 \fn sme_roam_connect
3893 \brief a wrapper function to request CSR to inititiate an association
3894 This is an asynchronous call.
3895 \param sessionId - the sessionId returned by sme_open_session.
3896 \param pProfile - description of the network to which to connect
3897 \param hBssListIn - a list of BSS descriptor to roam to. It is returned
3898 from csr_scan_get_result
3899 \param pRoamId - to get back the request ID
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303900 \return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003901 ---------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303902QDF_STATUS sme_roam_connect(tHalHandle hHal, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003903 tCsrRoamProfile *pProfile, uint32_t *pRoamId)
3904{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303905 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003906 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
3907
3908 if (!pMac) {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303909 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003910 }
3911
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303912 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003913 TRACE_CODE_SME_RX_HDD_MSG_CONNECT, sessionId, 0));
3914 sms_log(pMac, LOG2, FL("enter"));
3915 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303916 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003917 if (CSR_IS_SESSION_VALID(pMac, sessionId)) {
3918 status =
3919 csr_roam_connect(pMac, sessionId, pProfile,
3920 pRoamId);
3921 } else {
3922 sms_log(pMac, LOGE, FL("invalid sessionID %d"),
3923 sessionId);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303924 status = QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003925 }
3926 sme_release_global_lock(&pMac->sme);
3927 } else {
3928 sms_log(pMac, LOGE, FL("sme_acquire_global_lock failed"));
3929 }
3930
3931 return status;
3932}
3933
3934/* ---------------------------------------------------------------------------
3935
3936 \fn sme_set_phy_mode
3937
3938 \brief Changes the PhyMode.
3939
3940 \param hHal - The handle returned by mac_open.
3941
3942 \param phyMode new phyMode which is to set
3943
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303944 \return QDF_STATUS SUCCESS.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003945
3946 -------------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303947QDF_STATUS sme_set_phy_mode(tHalHandle hHal, eCsrPhyMode phyMode)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003948{
3949 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
3950
3951 if (NULL == pMac) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303952 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003953 "%s: invalid context", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303954 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003955 }
3956
3957 pMac->roam.configParam.phyMode = phyMode;
3958 pMac->roam.configParam.uCfgDot11Mode =
3959 csr_get_cfg_dot11_mode_from_csr_phy_mode(NULL,
3960 pMac->roam.configParam.phyMode,
3961 pMac->roam.configParam.
3962 ProprietaryRatesEnabled);
3963
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303964 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003965}
3966
3967/* ---------------------------------------------------------------------------
3968 \fn sme_roam_reassoc
3969 \brief a wrapper function to request CSR to inititiate a re-association
3970 \param pProfile - can be NULL to join the currently connected AP. In that
3971 case modProfileFields should carry the modified field(s) which could trigger
3972 reassoc
3973 \param modProfileFields - fields which are part of tCsrRoamConnectedProfile
3974 that might need modification dynamically once STA is up & running and this
3975 could trigger a reassoc
3976 \param pRoamId - to get back the request ID
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303977 \return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003978 -------------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303979QDF_STATUS sme_roam_reassoc(tHalHandle hHal, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003980 tCsrRoamProfile *pProfile,
3981 tCsrRoamModifyProfileFields modProfileFields,
3982 uint32_t *pRoamId, bool fForce)
3983{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303984 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003985 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
3986
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303987 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003988 TRACE_CODE_SME_RX_HDD_ROAM_REASSOC, sessionId, 0));
3989 sms_log(pMac, LOG2, FL("enter"));
3990 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303991 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003992 if (CSR_IS_SESSION_VALID(pMac, sessionId)) {
3993 if ((NULL == pProfile) && (fForce == 1)) {
3994 status =
3995 csr_reassoc(pMac, sessionId,
3996 &modProfileFields, pRoamId,
3997 fForce);
3998 } else {
3999 status =
4000 csr_roam_reassoc(pMac, sessionId, pProfile,
4001 modProfileFields, pRoamId);
4002 }
4003 } else {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304004 status = QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004005 }
4006 sme_release_global_lock(&pMac->sme);
4007 }
4008
4009 return status;
4010}
4011
4012/* ---------------------------------------------------------------------------
4013 \fn sme_roam_connect_to_last_profile
4014 \brief a wrapper function to request CSR to disconnect and reconnect with
4015 the same profile
4016 This is an asynchronous call.
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304017 \return QDF_STATUS. It returns fail if currently connected
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004018 ---------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304019QDF_STATUS sme_roam_connect_to_last_profile(tHalHandle hHal, uint8_t sessionId)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004020{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304021 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004022 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
4023
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05304024 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004025 TRACE_CODE_SME_RX_HDD_ROAM_GET_CONNECTPROFILE,
4026 sessionId, 0));
4027 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304028 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004029 if (CSR_IS_SESSION_VALID(pMac, sessionId)) {
4030 status = csr_roam_connect_to_last_profile(pMac, sessionId);
4031 } else {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304032 status = QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004033 }
4034 sme_release_global_lock(&pMac->sme);
4035 }
4036
4037 return status;
4038}
4039
4040/* ---------------------------------------------------------------------------
4041 \fn sme_roam_disconnect
4042 \brief a wrapper function to request CSR to disconnect from a network
4043 This is an asynchronous call.
4044 \param reason -- To indicate the reason for disconnecting. Currently, only
4045 eCSR_DISCONNECT_REASON_MIC_ERROR is meanful.
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304046 \return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004047 ---------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304048QDF_STATUS sme_roam_disconnect(tHalHandle hHal, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004049 eCsrRoamDisconnectReason reason)
4050{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304051 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004052 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
4053
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05304054 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004055 TRACE_CODE_SME_RX_HDD_ROAM_DISCONNECT, sessionId,
4056 reason));
4057 sms_log(pMac, LOG2, FL("enter"));
4058 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304059 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004060 if (CSR_IS_SESSION_VALID(pMac, sessionId)) {
4061 status = csr_roam_disconnect(pMac, sessionId, reason);
4062 } else {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304063 status = QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004064 }
4065 sme_release_global_lock(&pMac->sme);
4066 }
4067
4068 return status;
4069}
4070
Abhishek Singhca408032016-09-13 15:26:12 +05304071/* sme_dhcp_done_ind() - send dhcp done ind
4072 * @hal: hal context
4073 * @session_id: session id
4074 *
4075 * Return: void.
4076 */
4077void sme_dhcp_done_ind(tHalHandle hal, uint8_t session_id)
4078{
4079 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
4080 tCsrRoamSession *session;
4081
4082 if (!mac_ctx)
4083 return;
4084
4085 session = CSR_GET_SESSION(mac_ctx, session_id);
4086 if (!session) {
4087 sms_log(mac_ctx, LOGE,
4088 FL("session %d not found"), session_id);
4089 return;
4090 }
4091 session->dhcp_done = true;
4092}
4093
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004094/* ---------------------------------------------------------------------------
4095 \fn sme_roam_stop_bss
4096 \brief To stop BSS for Soft AP. This is an asynchronous API.
4097 \param hHal - Global structure
4098 \param sessionId - sessionId of SoftAP
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304099 \return QDF_STATUS SUCCESS Roam callback will be called to indicate actual results
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004100 -------------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304101QDF_STATUS sme_roam_stop_bss(tHalHandle hHal, uint8_t sessionId)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004102{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304103 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004104 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
4105
4106 sms_log(pMac, LOG2, FL("enter"));
4107 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304108 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004109 if (CSR_IS_SESSION_VALID(pMac, sessionId)) {
4110 status = csr_roam_issue_stop_bss_cmd(pMac, sessionId, true);
4111 } else {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304112 status = QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004113 }
4114 sme_release_global_lock(&pMac->sme);
4115 }
4116
4117 return status;
4118}
4119
Deepthi Gowrib3bfefd2016-09-13 15:14:34 +05304120/**
4121 * sme_roam_disconnect_sta() - disassociate a station
4122 * @hHal: Global structure
4123 * @sessionId: SessionId of SoftAP
4124 * @p_del_sta_params: Pointer to parameters of the station to disassoc
4125 *
4126 * To disassociate a station. This is an asynchronous API.
4127 *
4128 * Return: QDF_STATUS_SUCCESS on success.Roam callback will
4129 * be called to indicate actual result.
4130 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304131QDF_STATUS sme_roam_disconnect_sta(tHalHandle hHal, uint8_t sessionId,
Deepthi Gowrib3bfefd2016-09-13 15:14:34 +05304132 struct tagCsrDelStaParams *p_del_sta_params)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004133{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304134 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004135 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
4136
4137 if (NULL == pMac) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05304138 QDF_ASSERT(0);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004139 return status;
4140 }
4141
4142 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304143 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004144 if (CSR_IS_SESSION_VALID(pMac, sessionId)) {
4145 status = csr_roam_issue_disassociate_sta_cmd(pMac,
Deepthi Gowrib3bfefd2016-09-13 15:14:34 +05304146 sessionId, p_del_sta_params);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004147 } else {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304148 status = QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004149 }
4150 sme_release_global_lock(&pMac->sme);
4151 }
4152
4153 return status;
4154}
4155
4156/**
4157 * sme_roam_deauth_sta() - deauthenticate a station
4158 * @hHal: Global structure
4159 * @sessionId: SessionId of SoftAP
4160 * @pDelStaParams: Pointer to parameters of the station to deauthenticate
4161 *
4162 * To disassociate a station. This is an asynchronous API.
4163 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304164 * Return: QDF_STATUS_SUCCESS on success or another QDF_STATUS error
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004165 * code on error. Roam callback will be called to indicate actual
4166 * result
4167 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304168QDF_STATUS sme_roam_deauth_sta(tHalHandle hHal, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004169 struct tagCsrDelStaParams *pDelStaParams)
4170{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304171 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004172 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
4173
4174 if (NULL == pMac) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05304175 QDF_ASSERT(0);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004176 return status;
4177 }
4178
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05304179 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Sreelakshmi Konamki6744cff2015-09-07 12:10:39 +05304180 TRACE_CODE_SME_RX_HDD_MSG_DEAUTH_STA,
4181 sessionId, pDelStaParams->reason_code));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004182 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304183 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004184 if (CSR_IS_SESSION_VALID(pMac, sessionId)) {
4185 status =
4186 csr_roam_issue_deauth_sta_cmd(pMac, sessionId,
4187 pDelStaParams);
4188 } else {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304189 status = QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004190 }
4191 sme_release_global_lock(&pMac->sme);
4192 }
4193
4194 return status;
4195}
4196
4197/* ---------------------------------------------------------------------------
4198 \fn sme_roam_tkip_counter_measures
4199 \brief To start or stop TKIP counter measures. This is an asynchronous API.
4200 \param sessionId - sessionId of SoftAP
4201 \param pPeerMacAddr - Caller allocated memory filled with peer MAC address (6 bytes)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304202 \return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004203 -------------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304204QDF_STATUS sme_roam_tkip_counter_measures(tHalHandle hHal, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004205 bool bEnable)
4206{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304207 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004208 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
4209
4210 if (NULL == pMac) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05304211 QDF_ASSERT(0);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004212 return status;
4213 }
4214
4215 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304216 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004217 if (CSR_IS_SESSION_VALID(pMac, sessionId)) {
4218 status =
4219 csr_roam_issue_tkip_counter_measures(pMac, sessionId,
4220 bEnable);
4221 } else {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304222 status = QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004223 }
4224 sme_release_global_lock(&pMac->sme);
4225 }
4226
4227 return status;
4228}
4229
4230/* ---------------------------------------------------------------------------
4231 \fn sme_roam_get_associated_stas
4232 \brief To probe the list of associated stations from various modules
4233 of CORE stack.
4234 \This is an asynchronous API.
4235 \param sessionId - sessionId of SoftAP
4236 \param modId - Module from whom list of associtated stations is
4237 to be probed. If an invalid module is passed then
Anurag Chouhan6d760662016-02-20 16:05:43 +05304238 by default QDF_MODULE_ID_PE will be probed.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004239 \param pUsrContext - Opaque HDD context
4240 \param pfnSapEventCallback - Sap event callback in HDD
4241 \param pAssocBuf - Caller allocated memory to be filled with associatd
4242 stations info
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304243 \return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004244 -------------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304245QDF_STATUS sme_roam_get_associated_stas(tHalHandle hHal, uint8_t sessionId,
Anurag Chouhan6d760662016-02-20 16:05:43 +05304246 QDF_MODULE_ID modId, void *pUsrContext,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004247 void *pfnSapEventCallback,
4248 uint8_t *pAssocStasBuf)
4249{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304250 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004251 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
4252
4253 if (NULL == pMac) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05304254 QDF_ASSERT(0);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004255 return status;
4256 }
4257
4258 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304259 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004260 if (CSR_IS_SESSION_VALID(pMac, sessionId)) {
4261 status =
4262 csr_roam_get_associated_stas(pMac, sessionId, modId,
4263 pUsrContext,
4264 pfnSapEventCallback,
4265 pAssocStasBuf);
4266 } else {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304267 status = QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004268 }
4269 sme_release_global_lock(&pMac->sme);
4270 }
4271
4272 return status;
4273}
4274
4275/* ---------------------------------------------------------------------------
4276 \fn sme_roam_get_wps_session_overlap
4277 \brief To get the WPS PBC session overlap information.
4278 \This is an asynchronous API.
4279 \param sessionId - sessionId of SoftAP
4280 \param pUsrContext - Opaque HDD context
4281 \param pfnSapEventCallback - Sap event callback in HDD
4282 \pRemoveMac - pointer to Mac address which needs to be removed from session
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304283 \return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004284 -------------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304285QDF_STATUS sme_roam_get_wps_session_overlap(tHalHandle hHal, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004286 void *pUsrContext, void
4287 *pfnSapEventCallback,
Anurag Chouhan6d760662016-02-20 16:05:43 +05304288 struct qdf_mac_addr pRemoveMac)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004289{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304290 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004291 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
4292
4293 if (NULL == pMac) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05304294 QDF_ASSERT(0);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004295 return status;
4296 }
4297
4298 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304299 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004300 if (CSR_IS_SESSION_VALID(pMac, sessionId)) {
4301 status =
4302 csr_roam_get_wps_session_overlap(pMac, sessionId,
4303 pUsrContext,
4304 pfnSapEventCallback,
4305 pRemoveMac);
4306 } else {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304307 status = QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004308 }
4309 sme_release_global_lock(&pMac->sme);
4310 }
4311
4312 return status;
4313}
4314
4315/* ---------------------------------------------------------------------------
4316 \fn sme_roam_get_connect_state
4317 \brief a wrapper function to request CSR to return the current connect state
4318 of Roaming
4319 This is a synchronous call.
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304320 \return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004321 ---------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304322QDF_STATUS sme_roam_get_connect_state(tHalHandle hHal, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004323 eCsrConnectState *pState)
4324{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304325 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004326 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
4327
4328 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304329 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004330 if (CSR_IS_SESSION_VALID(pMac, sessionId)) {
4331 status =
4332 csr_roam_get_connect_state(pMac, sessionId, pState);
4333 } else {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304334 status = QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004335 }
4336 sme_release_global_lock(&pMac->sme);
4337 }
4338
4339 return status;
4340}
4341
4342/* ---------------------------------------------------------------------------
4343 \fn sme_roam_get_connect_profile
4344 \brief a wrapper function to request CSR to return the current connect
4345 profile. Caller must call csr_roam_free_connect_profile after it is done
4346 and before reuse for another csr_roam_get_connect_profile call.
4347 This is a synchronous call.
4348 \param pProfile - pointer to a caller allocated structure
4349 tCsrRoamConnectedProfile
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304350 \return QDF_STATUS. Failure if not connected
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004351 ---------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304352QDF_STATUS sme_roam_get_connect_profile(tHalHandle hHal, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004353 tCsrRoamConnectedProfile *pProfile)
4354{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304355 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004356 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
4357
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05304358 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004359 TRACE_CODE_SME_RX_HDD_ROAM_GET_CONNECTPROFILE,
4360 sessionId, 0));
4361 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304362 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004363 if (CSR_IS_SESSION_VALID(pMac, sessionId)) {
4364 status =
4365 csr_roam_get_connect_profile(pMac, sessionId, pProfile);
4366 } else {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304367 status = QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004368 }
4369 sme_release_global_lock(&pMac->sme);
4370 }
4371
4372 return status;
4373}
4374
Naveen Rawatdf0a7e72016-01-06 18:35:53 -08004375/**
4376 * sme_roam_free_connect_profile - a wrapper function to request CSR to free and
4377 * reinitialize the profile returned previously by csr_roam_get_connect_profile.
4378 *
4379 * @profile - pointer to a caller allocated structure tCsrRoamConnectedProfile
4380 *
4381 * Return: none
4382 */
4383void sme_roam_free_connect_profile(tCsrRoamConnectedProfile *profile)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004384{
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05304385 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004386 TRACE_CODE_SME_RX_HDD_ROAM_FREE_CONNECTPROFILE,
4387 NO_SESSION, 0));
Naveen Rawatdf0a7e72016-01-06 18:35:53 -08004388 csr_roam_free_connect_profile(profile);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004389}
4390
4391/* ---------------------------------------------------------------------------
4392 \fn sme_roam_set_pmkid_cache
4393 \brief a wrapper function to request CSR to return the PMKID candidate list
4394 This is a synchronous call.
4395 \param pPMKIDCache - caller allocated buffer point to an array of
4396 tPmkidCacheInfo
4397 \param numItems - a variable that has the number of tPmkidCacheInfo
4398 allocated when retruning, this is either the number needed
4399 or number of items put into pPMKIDCache
4400 \param update_entire_cache - this bool value specifies if the entire pmkid
4401 cache should be overwritten or should it be
4402 updated entry by entry.
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304403 \return QDF_STATUS - when fail, it usually means the buffer allocated is not
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004404 big enough and pNumItems has the number of
4405 tPmkidCacheInfo.
4406 \Note: pNumItems is a number of tPmkidCacheInfo,
4407 not sizeof(tPmkidCacheInfo) * something
4408 ---------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304409QDF_STATUS sme_roam_set_pmkid_cache(tHalHandle hHal, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004410 tPmkidCacheInfo *pPMKIDCache,
4411 uint32_t numItems, bool update_entire_cache)
4412{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304413 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004414 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
4415
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05304416 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004417 TRACE_CODE_SME_RX_HDD_ROAM_SET_PMKIDCACHE, sessionId,
4418 numItems));
4419 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304420 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004421 if (CSR_IS_SESSION_VALID(pMac, sessionId)) {
4422 status =
4423 csr_roam_set_pmkid_cache(pMac, sessionId, pPMKIDCache,
4424 numItems, update_entire_cache);
4425 } else {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304426 status = QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004427 }
4428 sme_release_global_lock(&pMac->sme);
4429 }
4430
4431 return status;
4432}
4433
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304434QDF_STATUS sme_roam_del_pmkid_from_cache(tHalHandle hHal, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004435 const uint8_t *pBSSId, bool flush_cache)
4436{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304437 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004438 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Sreelakshmi Konamki6744cff2015-09-07 12:10:39 +05304439
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05304440 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Sreelakshmi Konamki6744cff2015-09-07 12:10:39 +05304441 TRACE_CODE_SME_RX_HDD_ROAM_DEL_PMKIDCACHE,
4442 sessionId, flush_cache));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004443 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304444 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004445 if (CSR_IS_SESSION_VALID(pMac, sessionId)) {
4446 status = csr_roam_del_pmkid_from_cache(pMac, sessionId,
4447 pBSSId, flush_cache);
4448 } else {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304449 status = QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004450 }
4451 sme_release_global_lock(&pMac->sme);
4452 }
4453 return status;
4454}
4455
4456#ifdef WLAN_FEATURE_ROAM_OFFLOAD
4457/* ---------------------------------------------------------------------------
4458 * \fn sme_roam_set_psk_pmk
4459 * \brief a wrapper function to request CSR to save PSK/PMK
4460 * This is a synchronous call.
4461 * \param hHal - Global structure
4462 * \param sessionId - SME sessionId
4463 * \param pPSK_PMK - pointer to an array of Psk[]/Pmk
4464 * \param pmk_len - Length could be only 16 bytes in case if LEAP
4465 * connections. Need to pass this information to
4466 * firmware.
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304467 * \return QDF_STATUS -status whether PSK/PMK is set or not
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004468 *---------------------------------------------------------------------------
4469 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304470QDF_STATUS sme_roam_set_psk_pmk(tHalHandle hHal, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004471 uint8_t *pPSK_PMK, size_t pmk_len)
4472{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304473 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004474 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
4475 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304476 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004477 if (CSR_IS_SESSION_VALID(pMac, sessionId)) {
4478 status =
4479 csr_roam_set_psk_pmk(pMac, sessionId, pPSK_PMK,
4480 pmk_len);
4481 } else {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304482 status = QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004483 }
4484 sme_release_global_lock(&pMac->sme);
4485 }
4486 return status;
4487}
4488#endif
4489/* ---------------------------------------------------------------------------
4490 \fn sme_roam_get_security_req_ie
4491 \brief a wrapper function to request CSR to return the WPA or RSN or WAPI IE CSR
4492 passes to PE to JOIN request or START_BSS request
4493 This is a synchronous call.
4494 \param pLen - caller allocated memory that has the length of pBuf as input.
4495 Upon returned, *pLen has the needed or IE length in pBuf.
4496 \param pBuf - Caller allocated memory that contain the IE field, if any,
4497 upon return
4498 \param secType - Specifies whether looking for WPA/WPA2/WAPI IE
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304499 \return QDF_STATUS - when fail, it usually means the buffer allocated is not
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004500 big enough
4501 ---------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304502QDF_STATUS sme_roam_get_security_req_ie(tHalHandle hHal, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004503 uint32_t *pLen, uint8_t *pBuf,
4504 eCsrSecurityType secType)
4505{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304506 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004507 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
4508
4509 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304510 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004511 if (CSR_IS_SESSION_VALID(pMac, sessionId)) {
4512 status =
4513 csr_roam_get_wpa_rsn_req_ie(hHal, sessionId, pLen, pBuf);
4514 } else {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304515 status = QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004516 }
4517 sme_release_global_lock(&pMac->sme);
4518 }
4519
4520 return status;
4521}
4522
4523/* ---------------------------------------------------------------------------
4524 \fn sme_roam_get_security_rsp_ie
4525 \brief a wrapper function to request CSR to return the WPA or RSN or
4526 WAPI IE from the beacon or probe rsp if connected
4527 This is a synchronous call.
4528 \param pLen - caller allocated memory that has the length of pBuf as input.
4529 Upon returned, *pLen has the needed or IE length in pBuf.
4530 \param pBuf - Caller allocated memory that contain the IE field, if any,
4531 upon return
4532 \param secType - Specifies whether looking for WPA/WPA2/WAPI IE
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304533 \return QDF_STATUS - when fail, it usually means the buffer allocated is not
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004534 big enough
4535 ---------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304536QDF_STATUS sme_roam_get_security_rsp_ie(tHalHandle hHal, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004537 uint32_t *pLen, uint8_t *pBuf,
4538 eCsrSecurityType secType)
4539{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304540 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004541 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
4542
4543 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304544 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004545 if (CSR_IS_SESSION_VALID(pMac, sessionId)) {
4546 status =
4547 csr_roam_get_wpa_rsn_rsp_ie(pMac, sessionId, pLen, pBuf);
4548 } else {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304549 status = QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004550 }
4551 sme_release_global_lock(&pMac->sme);
4552 }
4553
4554 return status;
4555
4556}
4557
4558/* ---------------------------------------------------------------------------
4559 \fn sme_roam_get_num_pmkid_cache
4560 \brief a wrapper function to request CSR to return number of PMKID cache
4561 entries
4562 This is a synchronous call.
4563 \return uint32_t - the number of PMKID cache entries
4564 ---------------------------------------------------------------------------*/
4565uint32_t sme_roam_get_num_pmkid_cache(tHalHandle hHal, uint8_t sessionId)
4566{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304567 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004568 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
4569 uint32_t numPmkidCache = 0;
4570
4571 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304572 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004573 if (CSR_IS_SESSION_VALID(pMac, sessionId)) {
4574 numPmkidCache =
4575 csr_roam_get_num_pmkid_cache(pMac, sessionId);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304576 status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004577 } else {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304578 status = QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004579 }
4580 sme_release_global_lock(&pMac->sme);
4581 }
4582
4583 return numPmkidCache;
4584}
4585
4586/* ---------------------------------------------------------------------------
4587 \fn sme_roam_get_pmkid_cache
4588 \brief a wrapper function to request CSR to return PMKID cache from CSR
4589 This is a synchronous call.
4590 \param pNum - caller allocated memory that has the space of the number of
4591 pBuf tPmkidCacheInfo as input. Upon returned, *pNum has the
4592 needed or actually number in tPmkidCacheInfo.
4593 \param pPmkidCache - Caller allocated memory that contains PMKID cache, if
4594 any, upon return
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304595 \return QDF_STATUS - when fail, it usually means the buffer allocated is not
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004596 big enough
4597 ---------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304598QDF_STATUS sme_roam_get_pmkid_cache(tHalHandle hHal, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004599 uint32_t *pNum, tPmkidCacheInfo *pPmkidCache)
4600{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304601 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004602 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
4603
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05304604 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004605 TRACE_CODE_SME_RX_HDD_ROAM_GET_PMKIDCACHE, sessionId,
4606 0));
4607 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304608 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004609 if (CSR_IS_SESSION_VALID(pMac, sessionId)) {
4610 status =
4611 csr_roam_get_pmkid_cache(pMac, sessionId, pNum,
4612 pPmkidCache);
4613 } else {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304614 status = QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004615 }
4616 sme_release_global_lock(&pMac->sme);
4617 }
4618
4619 return status;
4620}
4621
4622/* ---------------------------------------------------------------------------
4623 \fn sme_get_config_param
4624 \brief a wrapper function that HDD calls to get the global settings
4625 currently maintained by CSR.
4626 This is a synchronous call.
4627 \param pParam - caller allocated memory
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304628 \return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004629 ---------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304630QDF_STATUS sme_get_config_param(tHalHandle hHal, tSmeConfigParams *pParam)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004631{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304632 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004633 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
4634
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05304635 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004636 TRACE_CODE_SME_RX_HDD_GET_CONFIGPARAM, NO_SESSION, 0));
4637 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304638 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004639 status = csr_get_config_param(pMac, &pParam->csrConfig);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304640 if (status != QDF_STATUS_SUCCESS) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004641 sms_log(pMac, LOGE, "%s csr_get_config_param failed",
4642 __func__);
4643 sme_release_global_lock(&pMac->sme);
4644 return status;
4645 }
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304646 qdf_mem_copy(&pParam->rrmConfig,
Krunal Soni1878d3a2016-01-14 13:00:44 -08004647 &pMac->rrm.rrmSmeContext.rrmConfig,
4648 sizeof(pMac->rrm.rrmSmeContext.rrmConfig));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004649 sme_release_global_lock(&pMac->sme);
4650 }
4651
4652 return status;
4653}
4654
4655/**
4656 * sme_cfg_set_int() - Sets the cfg parameter value.
4657 * @hal: Handle to hal.
4658 * @cfg_id: Configuration parameter ID.
4659 * @value: value to be saved in the cfg parameter.
4660 *
4661 * This function sets the string value in cfg parameter.
4662 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304663 * Return: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004664 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304665QDF_STATUS sme_cfg_set_int(tHalHandle hal, uint16_t cfg_id, uint32_t value)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004666{
4667 tpAniSirGlobal pmac = PMAC_STRUCT(hal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304668 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004669
4670 if (eSIR_SUCCESS != cfg_set_int(pmac, cfg_id, value))
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304671 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004672
4673 return status;
4674}
4675
4676/**
4677 * sme_cfg_set_str() - Sets the cfg parameter string.
4678 * @hal: Handle to hal.
4679 * @cfg_id: Configuration parameter ID.
4680 * @str: Pointer to the string buffer.
4681 * @length: Length of the string.
4682 *
4683 * This function sets the string value in cfg parameter.
4684 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304685 * Return: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004686 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304687QDF_STATUS sme_cfg_set_str(tHalHandle hal, uint16_t cfg_id, uint8_t *str,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004688 uint32_t length)
4689{
4690 tpAniSirGlobal pmac = PMAC_STRUCT(hal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304691 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004692
4693 if (eSIR_SUCCESS != cfg_set_str(pmac, cfg_id, str, length))
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304694 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004695
4696 return status;
4697}
4698
4699/**
4700 * sme_cfg_get_int() - Gets the cfg parameter value.
4701 * @hal: Handle to hal.
4702 * @cfg_id: Configuration parameter ID.
4703 * @cfg_value: Pointer to variable in which cfg value
4704 * will be saved.
4705 *
4706 * This function gets the value of the cfg parameter.
4707 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304708 * Return: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004709 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304710QDF_STATUS sme_cfg_get_int(tHalHandle hal, uint16_t cfg_id, uint32_t *cfg_value)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004711{
4712 tpAniSirGlobal pmac = PMAC_STRUCT(hal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304713 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004714
4715 if (eSIR_SUCCESS != wlan_cfg_get_int(pmac, cfg_id, cfg_value))
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304716 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004717
4718 return status;
4719}
4720
4721/**
4722 * sme_cfg_get_str() - Gets the cfg parameter string.
4723 * @hal: Handle to hal.
4724 * @cfg_id: Configuration parameter ID.
4725 * @str: Pointer to the string buffer.
4726 * @length: Pointer to length of the string.
4727 *
4728 * This function gets the string value of the cfg parameter.
4729 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304730 * Return: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004731 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304732QDF_STATUS sme_cfg_get_str(tHalHandle hal, uint16_t cfg_id, uint8_t *str,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004733 uint32_t *length)
4734{
4735 tpAniSirGlobal pmac = PMAC_STRUCT(hal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304736 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004737
4738 if (eSIR_SUCCESS != wlan_cfg_get_str(pmac, cfg_id, str, length))
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304739 status = QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004740
4741 return status;
4742}
4743
4744/* ---------------------------------------------------------------------------
4745 \fn sme_get_modify_profile_fields
4746 \brief HDD or SME - QOS calls this function to get the current values of
4747 connected profile fields, changing which can cause reassoc.
4748 This function must be called after CFG is downloaded and STA is in connected
4749 state. Also, make sure to call this function to get the current profile
4750 fields before calling the reassoc. So that pModifyProfileFields will have
4751 all the latest values plus the one(s) has been updated as part of reassoc
4752 request.
4753 \param pModifyProfileFields - pointer to the connected profile fields
4754 changing which can cause reassoc
4755
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304756 \return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004757 -------------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304758QDF_STATUS sme_get_modify_profile_fields(tHalHandle hHal, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004759 tCsrRoamModifyProfileFields *
4760 pModifyProfileFields)
4761{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304762 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004763 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
4764
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05304765 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004766 TRACE_CODE_SME_RX_HDD_GET_MODPROFFIELDS, sessionId,
4767 0));
4768 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304769 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004770 if (CSR_IS_SESSION_VALID(pMac, sessionId)) {
4771 status =
4772 csr_get_modify_profile_fields(pMac, sessionId,
4773 pModifyProfileFields);
4774 } else {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304775 status = QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004776 }
4777 sme_release_global_lock(&pMac->sme);
4778 }
4779
4780 return status;
4781}
4782
4783/* ---------------------------------------------------------------------------
4784 \fn sme_set_dhcp_till_power_active_flag
4785 \brief Sets/Clears DHCP related flag to disable/enable auto PS
4786 \param hal - The handle returned by mac_open.
4787 ---------------------------------------------------------------------------*/
4788void sme_set_dhcp_till_power_active_flag(tHalHandle hal, uint8_t flag)
4789{
4790 tpAniSirGlobal mac = PMAC_STRUCT(hal);
4791 struct ps_global_info *ps_global_info = &mac->sme.ps_global_info;
4792
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05304793 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004794 TRACE_CODE_SME_RX_HDD_SET_DHCP_FLAG, NO_SESSION,
4795 flag));
4796 /* Set/Clear the DHCP flag which will disable/enable auto PS */
4797 ps_global_info->remain_in_power_active_till_dhcp = flag;
4798}
4799
4800/* ---------------------------------------------------------------------------
4801 \fn sme_register11d_scan_done_callback
4802 \brief Register a routine of type csr_scan_completeCallback which is
4803 called whenever an 11d scan is done
4804 \param hHal - The handle returned by mac_open.
4805 \param callback - 11d scan complete routine to be registered
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304806 \return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004807 ---------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304808QDF_STATUS sme_register11d_scan_done_callback(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004809 csr_scan_completeCallback callback)
4810{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304811 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004812 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
4813
4814 pMac->scan.callback11dScanDone = callback;
4815
4816 return status;
4817}
4818
Arun Khandavalli4b55da72016-07-19 19:55:01 +05304819/**
4820 * sme_deregister11d_scan_done_callback() - De-register scandone callback
4821 * @h_hal: Handler return by mac_open
4822 *
4823 * This function De-registers the scandone callback to SME
4824 *
4825 * Return: None
4826 */
4827void sme_deregister11d_scan_done_callback(tHalHandle h_hal)
4828{
4829 tpAniSirGlobal pmac;
4830
4831 if (!h_hal) {
4832 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
4833 FL("hHal is not valid"));
4834 return;
4835 }
4836
4837 pmac = PMAC_STRUCT(h_hal);
4838 pmac->scan.callback11dScanDone = NULL;
4839}
4840
4841
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004842#ifdef FEATURE_OEM_DATA_SUPPORT
4843/**
4844 * sme_register_oem_data_rsp_callback() - Register a routine of
4845 * type send_oem_data_rsp_msg
4846 * @h_hal: Handle returned by mac_open.
4847 * @callback: Callback to send response
4848 * to oem application.
4849 *
4850 * sme_oem_data_rsp_callback is used to register sme_send_oem_data_rsp_msg
4851 * callback function.
4852 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304853 * Return: QDF_STATUS.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004854 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304855QDF_STATUS sme_register_oem_data_rsp_callback(tHalHandle h_hal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004856 sme_send_oem_data_rsp_msg callback)
4857{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304858 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004859 tpAniSirGlobal pmac = PMAC_STRUCT(h_hal);
4860
Krishna Kumaar Natarajanbbbf2ef2016-08-03 14:06:26 -07004861 pmac->sme.oem_data_rsp_callback = callback;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004862
4863 return status;
4864
4865}
Arun Khandavalli4b55da72016-07-19 19:55:01 +05304866
4867/**
4868 * sme_deregister_oem_data_rsp_callback() - De-register OEM datarsp callback
4869 * @h_hal: Handler return by mac_open
4870 * This function De-registers the OEM data response callback to SME
4871 *
4872 * Return: None
4873 */
4874void sme_deregister_oem_data_rsp_callback(tHalHandle h_hal)
4875{
4876 tpAniSirGlobal pmac;
4877
4878 if (!h_hal) {
4879 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
4880 FL("hHal is not valid"));
4881 return;
4882 }
4883 pmac = PMAC_STRUCT(h_hal);
4884
Krishna Kumaar Natarajanbbbf2ef2016-08-03 14:06:26 -07004885 pmac->sme.oem_data_rsp_callback = NULL;
Arun Khandavalli4b55da72016-07-19 19:55:01 +05304886}
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004887#endif
4888
4889/**
Krishna Kumaar Natarajan53ca2902015-12-04 14:01:46 -08004890 * sme_oem_update_capability() - update UMAC's oem related capability.
4891 * @hal: Handle returned by mac_open
4892 * @oem_cap: pointer to oem_capability
4893 *
4894 * This function updates OEM capability to UMAC. Currently RTT
4895 * related capabilities are updated. More capabilities can be
4896 * added in future.
4897 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304898 * Return: QDF_STATUS
Krishna Kumaar Natarajan53ca2902015-12-04 14:01:46 -08004899 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304900QDF_STATUS sme_oem_update_capability(tHalHandle hal,
Krishna Kumaar Natarajan53ca2902015-12-04 14:01:46 -08004901 struct sme_oem_capability *cap)
4902{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304903 QDF_STATUS status = QDF_STATUS_SUCCESS;
Krishna Kumaar Natarajan53ca2902015-12-04 14:01:46 -08004904 tpAniSirGlobal pmac = PMAC_STRUCT(hal);
4905 uint8_t *bytes;
4906
4907 bytes = pmac->rrm.rrmSmeContext.rrmConfig.rm_capability;
4908
4909 if (cap->ftm_rr)
4910 bytes[4] |= RM_CAP_FTM_RANGE_REPORT;
4911 if (cap->lci_capability)
4912 bytes[4] |= RM_CAP_CIVIC_LOC_MEASUREMENT;
4913
4914 return status;
4915}
4916
4917/**
4918 * sme_oem_get_capability() - get oem capability
4919 * @hal: Handle returned by mac_open
4920 * @oem_cap: pointer to oem_capability
4921 *
4922 * This function is used to get the OEM capability from UMAC.
4923 * Currently RTT related capabilities are received. More
4924 * capabilities can be added in future.
4925 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304926 * Return: QDF_STATUS
Krishna Kumaar Natarajan53ca2902015-12-04 14:01:46 -08004927 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304928QDF_STATUS sme_oem_get_capability(tHalHandle hal,
Krishna Kumaar Natarajan53ca2902015-12-04 14:01:46 -08004929 struct sme_oem_capability *cap)
4930{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304931 QDF_STATUS status = QDF_STATUS_SUCCESS;
Krishna Kumaar Natarajan53ca2902015-12-04 14:01:46 -08004932 tpAniSirGlobal pmac = PMAC_STRUCT(hal);
4933 uint8_t *bytes;
4934
4935 bytes = pmac->rrm.rrmSmeContext.rrmConfig.rm_capability;
4936
4937 cap->ftm_rr = bytes[4] & RM_CAP_FTM_RANGE_REPORT;
4938 cap->lci_capability = bytes[4] & RM_CAP_CIVIC_LOC_MEASUREMENT;
4939
4940 return status;
4941}
4942
4943/**
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004944 * sme_register_ftm_msg_processor() - registers hdd ftm message processor
4945 * function to MAC/SYS
4946 *
4947 * @hal: hal handle
4948 * @callback: hdd function that has to be registered
4949 *
4950 * Return: void
4951 */
4952void sme_register_ftm_msg_processor(tHalHandle hal,
4953 hdd_ftm_msg_processor callback)
4954{
4955 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
4956
4957 if (mac_ctx == NULL) {
Naveen Rawatcf684762016-06-27 15:30:24 -07004958 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
4959 FL("mac ctx is NULL"));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004960 return;
4961 }
Naveen Rawatcf684762016-06-27 15:30:24 -07004962
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004963 mac_ctx->ftm_msg_processor_callback = callback;
4964 return;
4965}
4966
4967/**
4968 * sme_wow_add_pattern() - add a wow pattern in fw
4969 * @hHal: handle returned by mac_open
4970 * @pattern: pointer to input pattern
4971 *
4972 * Add a pattern for Pattern Byte Matching in WoW mode. Firmware will
4973 * do a pattern match on these patterns when WoW is enabled during system
4974 * suspend.
4975 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304976 * Return: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004977 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304978QDF_STATUS sme_wow_add_pattern(tHalHandle hal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004979 struct wow_add_pattern *pattern,
4980 uint8_t session_id)
4981{
4982 tpAniSirGlobal pMac = PMAC_STRUCT(hal);
4983 struct wow_add_pattern *ptrn;
4984 tSirRetStatus ret_code = eSIR_SUCCESS;
4985 tSirMsgQ msg_q;
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05304986 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004987 TRACE_CODE_SME_RX_HDD_WOWL_ADDBCAST_PATTERN, session_id,
4988 0));
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304989 ptrn = qdf_mem_malloc(sizeof(*ptrn));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004990 if (NULL == ptrn) {
4991 sms_log(pMac, LOGP,
4992 FL("Fail to allocate memory for WoWLAN Add Bcast Pattern "));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304993 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004994 }
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304995 (void)qdf_mem_copy(ptrn, pattern, sizeof(*ptrn));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004996
4997 msg_q.type = WMA_WOW_ADD_PTRN;
4998 msg_q.reserved = 0;
4999 msg_q.bodyptr = ptrn;
5000 msg_q.bodyval = 0;
5001
5002 sms_log(pMac, LOG1, FL("Sending WMA_WOWL_ADD_BCAST_PTRN to HAL"));
5003 ret_code = wma_post_ctrl_msg(pMac, &msg_q);
5004 if (eSIR_SUCCESS != ret_code) {
5005 sms_log(pMac, LOGE,
5006 FL("Posting WMA_WOWL_ADD_BCAST_PTRN failed, reason=%X"),
5007 ret_code);
5008 }
5009 return ret_code;
5010}
5011
5012/**
5013 * sme_wow_delete_pattern() - delete user configured wow pattern in target
5014 * @hHal: handle returned by mac_open.
5015 * @pattern: pointer to delete pattern parameter
5016 * @sessionId: session id
5017 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305018 * Return: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005019 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305020QDF_STATUS sme_wow_delete_pattern(tHalHandle hal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005021 struct wow_delete_pattern *pattern, uint8_t sessionId)
5022{
5023 tpAniSirGlobal pMac = PMAC_STRUCT(hal);
5024 struct wow_delete_pattern *delete_ptrn;
5025 tSirRetStatus ret_code = eSIR_SUCCESS;
5026 tSirMsgQ msg_q;
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05305027 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005028 TRACE_CODE_SME_RX_HDD_WOWL_DELBCAST_PATTERN, sessionId,
5029 0));
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305030 delete_ptrn = qdf_mem_malloc(sizeof(*delete_ptrn));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005031 if (NULL == delete_ptrn) {
5032 sms_log(pMac, LOGP,
5033 FL("Fail to allocate memory for WoWLAN Delete Bcast Pattern "));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305034 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005035 }
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305036 (void)qdf_mem_copy(delete_ptrn, pattern, sizeof(*delete_ptrn));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005037 msg_q.type = WMA_WOW_DEL_PTRN;
5038 msg_q.reserved = 0;
5039 msg_q.bodyptr = delete_ptrn;
5040 msg_q.bodyval = 0;
5041
5042 sms_log(pMac, LOG1, FL("Sending WMA_WOWL_DEL_BCAST_PTRN"));
5043
5044 ret_code = wma_post_ctrl_msg(pMac, &msg_q);
5045 if (eSIR_SUCCESS != ret_code) {
5046 sms_log(pMac, LOGE,
5047 FL("Posting WMA_WOWL_DEL_BCAST_PTRN failed, reason=%X"),
5048 ret_code);
5049 }
5050 return ret_code;
5051}
5052
5053/**
5054 * sme_enter_wowl(): SME API exposed to HDD to request enabling of WOWL mode.
5055 * @hal_ctx - The handle returned by mac_open.
5056 * @enter_wowl_callback_routine - Callback routine provided by HDD.
5057 * Used for success/failure notification by SME
5058 * @enter_wowl_callback_context - A cookie passed by HDD, that is passed
5059 * back to HDD at the time of callback.
5060 * @wake_reason_ind_cb - Callback routine provided by HDD.
5061 * Used for Wake Reason Indication by SME
5062 * @wake_reason_ind_cb_ctx - A cookie passed by HDD, that is passed
5063 * back to HDD at the time of callback.
5064 *
5065 * WoWLAN works on top of BMPS mode.
5066 * If the device is not in BMPS mode,
5067 * SME will will cache the information that
5068 * WOWL has been enabled and attempt to put the device
5069 * in BMPS. On entry into BMPS, SME will enable the
5070 * WOWL mode.
5071 * Note 1: If we exit BMPS mode (someone requests full power),
5072 * we will NOT resume WOWL when we go back to BMPS again.
5073 * Request for full power (while in WOWL mode) means disable
5074 * WOWL and go to full power.
5075 * Note 2: Both UAPSD and WOWL work on top of BMPS.
5076 * On entry into BMPS, SME will give priority to UAPSD and
5077 * enable only UAPSD if both UAPSD and WOWL are required.
5078 * Currently there is no requirement or use case to support
5079 * UAPSD and WOWL at the same time.
5080 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305081 * Return: QDF_STATUS
5082 * QDF_STATUS_SUCCESS Device is already in WoWLAN mode
5083 * QDF_STATUS_E_FAILURE Device cannot enter WoWLAN mode.
5084 * QDF_STATUS_PMC_PENDING Request accepted. SME will enable
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005085 * WOWL after BMPS mode is entered.
5086 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305087QDF_STATUS sme_enter_wowl(tHalHandle hal_ctx,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005088 void (*enter_wowl_callback_routine)(void
5089 *callback_context,
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305090 QDF_STATUS status),
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005091 void *enter_wowl_callback_context,
5092#ifdef WLAN_WAKEUP_EVENTS
5093 void (*wakeIndicationCB)(void *callback_context,
5094 tpSirWakeReasonInd
5095 wake_reason_ind),
5096 void *wakeIndicationCBContext,
5097#endif /* WLAN_WAKEUP_EVENTS */
5098 tpSirSmeWowlEnterParams wowl_enter_params,
5099 uint8_t session_id)
5100{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305101 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005102 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal_ctx);
5103 struct ps_global_info *ps_global_info = &mac_ctx->sme.ps_global_info;
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05305104 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005105 TRACE_CODE_SME_RX_HDD_ENTER_WOWL, session_id, 0));
5106
5107 /* cache the WOWL information */
5108 ps_global_info->ps_params[session_id].wowl_enter_params =
5109 *wowl_enter_params;
5110 ps_global_info->ps_params[session_id].enter_wowl_callback_routine =
5111 enter_wowl_callback_routine;
5112 ps_global_info->ps_params[session_id].enter_wowl_callback_context =
5113 enter_wowl_callback_context;
5114#ifdef WLAN_WAKEUP_EVENTS
5115 /* Cache the Wake Reason Indication callback information */
5116 ps_global_info->ps_params[session_id].wake_reason_ind_cb =
5117 wakeIndicationCB;
5118 ps_global_info->ps_params[session_id].wake_reason_ind_cb_ctx =
5119 wakeIndicationCBContext;
5120#endif /* WLAN_WAKEUP_EVENTS */
5121
5122 status = sme_ps_process_command(mac_ctx, session_id, SME_PS_WOWL_ENTER);
5123 return status;
5124}
5125/**
5126 *sme_exit_wowl(): SME API exposed to HDD to request exit from WoWLAN mode.
5127 * @hal_ctx - The handle returned by mac_open.
5128 * @wowl_exit_params - Carries info on which smesession
5129 * wowl exit is requested.
5130 *
5131 * SME will initiate exit from WoWLAN mode and device will be
5132 * put in BMPS mode.
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305133 * Return QDF_STATUS
5134 * QDF_STATUS_E_FAILURE Device cannot exit WoWLAN mode.
5135 * QDF_STATUS_SUCCESS Request accepted to exit WoWLAN mode.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005136 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305137QDF_STATUS sme_exit_wowl(tHalHandle hal_ctx,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005138 tpSirSmeWowlExitParams wowl_exit_params)
5139{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305140 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005141 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal_ctx);
5142 uint8_t session_id;
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05305143 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005144 TRACE_CODE_SME_RX_HDD_EXIT_WOWL, NO_SESSION, 0));
5145 session_id = wowl_exit_params->sessionId;
5146 status = sme_ps_process_command(mac_ctx, session_id, SME_PS_WOWL_EXIT);
5147 return status;
5148}
5149
5150/**
5151 * sme_roam_set_key() - To set encryption key.
5152 * @hal: hal global context
5153 * @session_id: session id
5154 * @set_key: pointer to a caller allocated object of tCsrSetContextInfo
5155 * @ptr_roam_id: Upon success return, this is the id caller can use to
5156 * identify the request in roamcallback
5157 *
5158 * This function should be called only when connected. This is an asynchronous
5159 * API.
5160 *
5161 * Return: Status of operation
5162 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305163QDF_STATUS sme_roam_set_key(tHalHandle hal, uint8_t session_id,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005164 tCsrRoamSetKey *set_key, uint32_t *ptr_roam_id)
5165{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305166 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005167 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
5168 uint32_t roam_id;
5169 uint32_t i;
5170 tCsrRoamSession *session = NULL;
5171 struct ps_global_info *ps_global_info = &mac_ctx->sme.ps_global_info;
5172
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05305173 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_RX_HDD_SET_KEY,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005174 session_id, 0));
5175 if (set_key->keyLength > CSR_MAX_KEY_LEN) {
5176 sms_log(mac_ctx, LOGE, FL("Invalid key length %d"),
5177 set_key->keyLength);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305178 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005179 }
5180 /*Once Setkey is done, we can go in BMPS */
5181 if (set_key->keyLength)
5182 ps_global_info->remain_in_power_active_till_dhcp = false;
5183
5184 status = sme_acquire_global_lock(&mac_ctx->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305185 if (!QDF_IS_STATUS_SUCCESS(status))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005186 return status;
5187
5188 roam_id = GET_NEXT_ROAM_ID(&mac_ctx->roam);
5189 if (ptr_roam_id)
5190 *ptr_roam_id = roam_id;
5191
5192 sms_log(mac_ctx, LOG2, FL("keyLength %d"), set_key->keyLength);
5193 for (i = 0; i < set_key->keyLength; i++)
5194 sms_log(mac_ctx, LOG2, FL("%02x"), set_key->Key[i]);
5195
5196 sms_log(mac_ctx, LOG2, "\n session_id=%d roam_id=%d", session_id,
5197 roam_id);
5198 session = CSR_GET_SESSION(mac_ctx, session_id);
5199 if (!session) {
5200 sms_log(mac_ctx, LOGE, FL("session %d not found"), session_id);
5201 sme_release_global_lock(&mac_ctx->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305202 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005203 }
5204 if (CSR_IS_INFRA_AP(&session->connectedProfile)
5205 && set_key->keyDirection == eSIR_TX_DEFAULT) {
5206 if ((eCSR_ENCRYPT_TYPE_WEP40 == set_key->encType)
5207 || (eCSR_ENCRYPT_TYPE_WEP40_STATICKEY ==
5208 set_key->encType)) {
5209 session->pCurRoamProfile->negotiatedUCEncryptionType =
5210 eCSR_ENCRYPT_TYPE_WEP40_STATICKEY;
5211 }
5212 if ((eCSR_ENCRYPT_TYPE_WEP104 == set_key->encType)
5213 || (eCSR_ENCRYPT_TYPE_WEP104_STATICKEY ==
5214 set_key->encType)) {
5215 session->pCurRoamProfile->negotiatedUCEncryptionType =
5216 eCSR_ENCRYPT_TYPE_WEP104_STATICKEY;
5217 }
5218 }
5219 status = csr_roam_set_key(mac_ctx, session_id, set_key, roam_id);
5220 sme_release_global_lock(&mac_ctx->sme);
5221 return status;
5222}
5223
Masti, Narayanraddiab712a72016-08-04 11:59:11 +05305224/**
5225 * sme_roam_set_default_key_index - To set default wep key idx
5226 * @hal: pointer to hal handler
5227 * @session_id: session id
5228 * @default_idx: default wep key index
5229 *
5230 * This function prepares a message and post to WMA to set wep default
5231 * key index
5232 *
5233 * Return: Success:QDF_STATUS_SUCCESS Failure: Error value
5234 */
5235QDF_STATUS sme_roam_set_default_key_index(tHalHandle hal, uint8_t session_id,
5236 uint8_t default_idx)
5237{
5238 cds_msg_t msg;
5239 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
5240 struct wep_update_default_key_idx *update_key;
5241
5242 update_key = qdf_mem_malloc(sizeof(*update_key));
5243 if (!update_key) {
5244 sms_log(mac_ctx, LOGE,
5245 FL("Failed to allocate memory for update key"));
5246 return QDF_STATUS_E_NOMEM;
5247 }
5248
5249 update_key->session_id = session_id;
5250 update_key->default_idx = default_idx;
5251
5252 msg.type = WMA_UPDATE_WEP_DEFAULT_KEY;
5253 msg.reserved = 0;
5254 msg.bodyptr = (void *)update_key;
5255
5256 if (QDF_STATUS_SUCCESS !=
5257 cds_mq_post_message(QDF_MODULE_ID_WMA, &msg)) {
5258 sms_log(mac_ctx, LOGE,
5259 FL("Failed to post WMA_UPDATE_WEP_DEFAULT_KEY to WMA"));
5260 qdf_mem_free(update_key);
5261 return QDF_STATUS_E_FAILURE;
5262 }
5263
5264 return QDF_STATUS_SUCCESS;
5265}
5266
5267
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005268/* ---------------------------------------------------------------------------
5269 \fn sme_get_rssi
5270 \brief a wrapper function that client calls to register a callback to get
5271 RSSI
5272
5273 \param hHal - HAL handle for device
5274 \param callback - SME sends back the requested stats using the callback
5275 \param staId - The station ID for which the stats is requested for
5276 \param bssid - The bssid of the connected session
5277 \param lastRSSI - RSSI value at time of request. In case fw cannot provide
5278 RSSI, do not hold up but return this value.
5279 \param pContext - user context to be passed back along with the callback
5280 \param p_cds_context - cds context
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305281 \return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005282 ---------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305283QDF_STATUS sme_get_rssi(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005284 tCsrRssiCallback callback,
Anurag Chouhan6d760662016-02-20 16:05:43 +05305285 uint8_t staId, struct qdf_mac_addr bssId, int8_t lastRSSI,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005286 void *pContext, void *p_cds_context)
5287{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305288 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005289 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
5290
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05305291 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005292 TRACE_CODE_SME_RX_HDD_GET_RSSI, NO_SESSION, 0));
5293 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305294 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005295 status = csr_get_rssi(pMac, callback,
5296 staId, bssId, lastRSSI,
5297 pContext, p_cds_context);
5298 sme_release_global_lock(&pMac->sme);
5299 }
5300 return status;
5301}
5302
5303/* ---------------------------------------------------------------------------
5304 \fn sme_get_snr
5305 \brief a wrapper function that client calls to register a callback to
5306 get SNR
5307
5308 \param callback - SME sends back the requested stats using the callback
5309 \param staId - The station ID for which the stats is requested for
5310 \param pContext - user context to be passed back along with the callback
5311 \param p_cds_context - cds context
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305312 \return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005313 ---------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305314QDF_STATUS sme_get_snr(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005315 tCsrSnrCallback callback,
Anurag Chouhan6d760662016-02-20 16:05:43 +05305316 uint8_t staId, struct qdf_mac_addr bssId, void *pContext)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005317{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305318 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005319 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
5320
5321 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305322 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005323 status = csr_get_snr(pMac, callback, staId, bssId, pContext);
5324 sme_release_global_lock(&pMac->sme);
5325 }
5326 return status;
5327}
5328
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005329/* ---------------------------------------------------------------------------
5330 \fn sme_get_statistics
5331 \brief a wrapper function that client calls to register a callback to get
5332 different PHY level statistics from CSR.
5333
5334 \param requesterId - different client requesting for statistics,
5335 HDD, UMA/GAN etc
5336 \param statsMask - The different category/categories of stats requester
5337 is looking for
5338 \param callback - SME sends back the requested stats using the callback
5339 \param periodicity - If requester needs periodic update in millisec, 0 means
5340 it's an one time request
5341 \param cache - If requester is happy with cached stats
5342 \param staId - The station ID for which the stats is requested for
5343 \param pContext - user context to be passed back along with the callback
5344 \param sessionId - sme session interface
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305345 \return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005346 ---------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305347QDF_STATUS sme_get_statistics(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005348 eCsrStatsRequesterType requesterId,
5349 uint32_t statsMask, tCsrStatsCallback callback,
5350 uint32_t periodicity, bool cache, uint8_t staId,
5351 void *pContext, uint8_t sessionId)
5352{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305353 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005354 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
5355
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05305356 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005357 TRACE_CODE_SME_RX_HDD_GET_STATS, NO_SESSION,
5358 periodicity));
5359 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305360 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005361 status =
5362 csr_get_statistics(pMac, requesterId, statsMask, callback,
5363 periodicity, cache, staId, pContext,
5364 sessionId);
5365 sme_release_global_lock(&pMac->sme);
5366 }
5367
5368 return status;
5369
5370}
5371
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305372QDF_STATUS sme_get_link_status(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005373 tCsrLinkStatusCallback callback,
5374 void *pContext, uint8_t sessionId)
5375{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305376 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005377 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
5378 tAniGetLinkStatus *pMsg;
5379 cds_msg_t cds_message;
5380
5381 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305382 if (QDF_IS_STATUS_SUCCESS(status)) {
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305383 pMsg = qdf_mem_malloc(sizeof(tAniGetLinkStatus));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005384 if (NULL == pMsg) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05305385 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005386 "%s: Not able to allocate memory for link status",
5387 __func__);
5388 sme_release_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305389 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005390 }
5391
5392 pMsg->msgType = WMA_LINK_STATUS_GET_REQ;
5393 pMsg->msgLen = (uint16_t) sizeof(tAniGetLinkStatus);
5394 pMsg->sessionId = sessionId;
5395 pMac->sme.linkStatusContext = pContext;
5396 pMac->sme.linkStatusCallback = callback;
5397
5398 cds_message.type = WMA_LINK_STATUS_GET_REQ;
5399 cds_message.bodyptr = pMsg;
5400 cds_message.reserved = 0;
5401
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305402 if (!QDF_IS_STATUS_SUCCESS
Anurag Chouhan6d760662016-02-20 16:05:43 +05305403 (cds_mq_post_message(QDF_MODULE_ID_WMA, &cds_message))) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05305404 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005405 "%s: Post LINK STATUS MSG fail", __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305406 qdf_mem_free(pMsg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005407 pMac->sme.linkStatusContext = NULL;
5408 pMac->sme.linkStatusCallback = NULL;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305409 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005410 }
5411
5412 sme_release_global_lock(&pMac->sme);
5413 }
5414
5415 return status;
5416}
5417
5418/* ---------------------------------------------------------------------------
5419
5420 \fn sme_get_country_code
5421
5422 \brief To return the current country code. If no country code is applied,
5423 default country code is used to fill the buffer.
5424 If 11d supported is turned off, an error is return and the last
5425 applied/default country code is used.
5426 This is a synchronous API.
5427
5428 \param pBuf - pointer to a caller allocated buffer for returned country code.
5429
5430 \param pbLen For input, this parameter indicates how big is the buffer.
5431 Upon return, this parameter has the number of bytes for
5432 country. If pBuf doesn't have enough space, this function
5433 returns fail status and this parameter contains the number
5434 that is needed.
5435
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305436 \return QDF_STATUS SUCCESS.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005437
5438 FAILURE or RESOURCES The API finished and failed.
5439
5440 -------------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305441QDF_STATUS sme_get_country_code(tHalHandle hHal, uint8_t *pBuf, uint8_t *pbLen)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005442{
5443 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
5444
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05305445 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005446 TRACE_CODE_SME_RX_HDD_GET_CNTRYCODE, NO_SESSION, 0));
5447
5448 return csr_get_country_code(pMac, pBuf, pbLen);
5449}
5450
5451/**
5452 * sme_apply_channel_power_info_to_fw() - sends channel info to fw
5453 * @hHal: hal handle
5454 *
5455 * This function sends the channel power info to firmware
5456 *
5457 * Return: none
5458 */
5459void sme_apply_channel_power_info_to_fw(tHalHandle hHal)
5460{
5461 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
5462
5463 csr_apply_channel_power_info_wrapper(pMac);
5464}
5465
5466/* some support functions */
5467bool sme_is11d_supported(tHalHandle hHal)
5468{
5469 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
5470
5471 return csr_is11d_supported(pMac);
5472}
5473
5474bool sme_is11h_supported(tHalHandle hHal)
5475{
5476 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
5477
5478 return csr_is11h_supported(pMac);
5479}
5480
5481bool sme_is_wmm_supported(tHalHandle hHal)
5482{
5483 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
5484
5485 return csr_is_wmm_supported(pMac);
5486}
5487
5488/* ---------------------------------------------------------------------------
5489
5490 \fn sme_change_country_code
5491
5492 \brief Change Country code from upperlayer during WLAN driver operation.
5493 This is a synchronous API.
5494
5495 \param hHal - The handle returned by mac_open.
5496
5497 \param pCountry New Country Code String
5498
5499 \param sendRegHint If we want to send reg hint to nl80211
5500
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305501 \return QDF_STATUS SUCCESS.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005502
5503 FAILURE or RESOURCES The API finished and failed.
5504
5505 -------------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305506QDF_STATUS sme_change_country_code(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005507 tSmeChangeCountryCallback callback,
5508 uint8_t *pCountry,
5509 void *pContext,
5510 void *p_cds_context,
5511 tAniBool countryFromUserSpace,
5512 tAniBool sendRegHint)
5513{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305514 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005515 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
5516 cds_msg_t msg;
5517 tAniChangeCountryCodeReq *pMsg;
5518
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05305519 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005520 TRACE_CODE_SME_RX_HDD_CHANGE_CNTRYCODE, NO_SESSION,
5521 0));
5522 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305523 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005524 sms_log(pMac, LOG1, FL(" called"));
5525
5526 if ((pMac->roam.configParam.Is11dSupportEnabledOriginal == true)
5527 && (!pMac->roam.configParam.
5528 fSupplicantCountryCodeHasPriority)) {
5529
5530 sms_log(pMac, LOGW,
5531 "Set Country Code Fail since the STA is associated and userspace does not have priority ");
5532
5533 sme_release_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305534 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005535 return status;
5536 }
5537
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305538 pMsg = qdf_mem_malloc(sizeof(tAniChangeCountryCodeReq));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005539 if (NULL == pMsg) {
5540 sms_log(pMac, LOGE,
5541 " csrChangeCountryCode: failed to allocate mem for req");
5542 sme_release_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305543 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005544 }
5545
5546 pMsg->msgType = eWNI_SME_CHANGE_COUNTRY_CODE;
5547 pMsg->msgLen = (uint16_t) sizeof(tAniChangeCountryCodeReq);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305548 qdf_mem_copy(pMsg->countryCode, pCountry, 3);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005549 pMsg->countryFromUserSpace = countryFromUserSpace;
5550 pMsg->sendRegHint = sendRegHint;
5551 pMsg->changeCCCallback = callback;
5552 pMsg->pDevContext = pContext;
5553 pMsg->p_cds_context = p_cds_context;
5554
5555 msg.type = eWNI_SME_CHANGE_COUNTRY_CODE;
5556 msg.bodyptr = pMsg;
5557 msg.reserved = 0;
5558
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305559 if (QDF_STATUS_SUCCESS !=
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005560 cds_mq_post_message(CDS_MQ_ID_SME, &msg)) {
5561 sms_log(pMac, LOGE,
5562 " sme_change_country_code failed to post msg to self ");
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305563 qdf_mem_free((void *)pMsg);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305564 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005565 }
5566 sms_log(pMac, LOG1, FL(" returned"));
5567 sme_release_global_lock(&pMac->sme);
5568 }
5569
5570 return status;
5571}
5572
5573/*--------------------------------------------------------------------------
5574
5575 \fn sme_generic_change_country_code
5576
5577 \brief Change Country code from upperlayer during WLAN driver operation.
5578 This is a synchronous API.
5579
5580 \param hHal - The handle returned by mac_open.
5581
5582 \param pCountry New Country Code String
5583
5584 \param reg_domain regulatory domain
5585
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305586 \return QDF_STATUS SUCCESS.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005587
5588 FAILURE or RESOURCES The API finished and failed.
5589
5590 -----------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305591QDF_STATUS sme_generic_change_country_code(tHalHandle hHal,
Amar Singhal7f1f3ec2015-10-13 17:14:08 -07005592 uint8_t *pCountry)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005593{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305594 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005595 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
5596 cds_msg_t msg;
5597 tAniGenericChangeCountryCodeReq *pMsg;
5598
5599 if (NULL == pMac) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05305600 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_FATAL,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005601 "%s: pMac is null", __func__);
5602 return status;
5603 }
5604
5605 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305606 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005607 sms_log(pMac, LOG1, FL(" called"));
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305608 pMsg = qdf_mem_malloc(sizeof(tAniGenericChangeCountryCodeReq));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005609
5610 if (NULL == pMsg) {
5611 sms_log(pMac, LOGE,
5612 " sme_generic_change_country_code: failed to allocate mem for req");
5613 sme_release_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305614 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005615 }
5616
5617 pMsg->msgType = eWNI_SME_GENERIC_CHANGE_COUNTRY_CODE;
5618 pMsg->msgLen =
5619 (uint16_t) sizeof(tAniGenericChangeCountryCodeReq);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305620 qdf_mem_copy(pMsg->countryCode, pCountry, 2);
Amar Singhal7f1f3ec2015-10-13 17:14:08 -07005621 pMsg->countryCode[2] = ' ';
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005622
5623 msg.type = eWNI_SME_GENERIC_CHANGE_COUNTRY_CODE;
5624 msg.bodyptr = pMsg;
5625 msg.reserved = 0;
5626
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305627 if (QDF_STATUS_SUCCESS !=
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005628 cds_mq_post_message(CDS_MQ_ID_SME, &msg)) {
5629 sms_log(pMac, LOGE,
5630 "sme_generic_change_country_code failed to post msg to self");
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305631 qdf_mem_free(pMsg);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305632 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005633 }
5634 sms_log(pMac, LOG1, FL(" returned"));
5635 sme_release_global_lock(&pMac->sme);
5636 }
5637
5638 return status;
5639}
5640
5641/* ---------------------------------------------------------------------------
5642
5643 \fn sme_dhcp_start_ind
5644
5645 \brief API to signal the FW about the DHCP Start event.
5646
5647 \param hHal - HAL handle for device.
5648
5649 \param device_mode - mode(AP,SAP etc) of the device.
5650
5651 \param macAddr - MAC address of the adapter.
5652
5653 \param sessionId - session ID.
5654
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305655 \return QDF_STATUS SUCCESS.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005656
5657 FAILURE or RESOURCES The API finished and failed.
5658 --------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305659QDF_STATUS sme_dhcp_start_ind(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005660 uint8_t device_mode,
5661 uint8_t *macAddr, uint8_t sessionId)
5662{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305663 QDF_STATUS status;
5664 QDF_STATUS qdf_status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005665 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
5666 cds_msg_t cds_message;
5667 tAniDHCPInd *pMsg;
5668 tCsrRoamSession *pSession;
5669
5670 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305671 if (QDF_STATUS_SUCCESS == status) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005672 pSession = CSR_GET_SESSION(pMac, sessionId);
5673
5674 if (!pSession) {
5675 sms_log(pMac, LOGE, FL("session %d not found "),
5676 sessionId);
5677 sme_release_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305678 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005679 }
Arif Hussain3316f402016-11-10 13:08:03 -08005680 pSession->dhcp_done = false;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005681
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305682 pMsg = (tAniDHCPInd *) qdf_mem_malloc(sizeof(tAniDHCPInd));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005683 if (NULL == pMsg) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05305684 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005685 "%s: Not able to allocate memory for dhcp start",
5686 __func__);
5687 sme_release_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305688 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005689 }
5690 pMsg->msgType = WMA_DHCP_START_IND;
5691 pMsg->msgLen = (uint16_t) sizeof(tAniDHCPInd);
5692 pMsg->device_mode = device_mode;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305693 qdf_mem_copy(pMsg->adapterMacAddr.bytes, macAddr,
Anurag Chouhan6d760662016-02-20 16:05:43 +05305694 QDF_MAC_ADDR_SIZE);
Anurag Chouhanc5548422016-02-24 18:33:27 +05305695 qdf_copy_macaddr(&pMsg->peerMacAddr,
Srinivas Girigowda296105a2015-09-24 16:31:16 -07005696 &pSession->connectedProfile.bssid);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005697
5698 cds_message.type = WMA_DHCP_START_IND;
5699 cds_message.bodyptr = pMsg;
5700 cds_message.reserved = 0;
Sreelakshmi Konamki6a065362016-05-31 16:05:01 +05305701 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
5702 sessionId, cds_message.type));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305703 qdf_status = cds_mq_post_message(CDS_MQ_ID_WMA, &cds_message);
5704 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05305705 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005706 "%s: Post DHCP Start MSG fail", __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305707 qdf_mem_free(pMsg);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305708 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005709 }
5710 sme_release_global_lock(&pMac->sme);
5711 }
5712 return status;
5713}
5714
5715/* ---------------------------------------------------------------------------
5716 \fn sme_dhcp_stop_ind
5717
5718 \brief API to signal the FW about the DHCP complete event.
5719
5720 \param hHal - HAL handle for device.
5721
5722 \param device_mode - mode(AP, SAP etc) of the device.
5723
5724 \param macAddr - MAC address of the adapter.
5725
5726 \param sessionId - session ID.
5727
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305728 \return QDF_STATUS SUCCESS.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005729 FAILURE or RESOURCES The API finished and failed.
5730 --------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305731QDF_STATUS sme_dhcp_stop_ind(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005732 uint8_t device_mode,
5733 uint8_t *macAddr, uint8_t sessionId)
5734{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305735 QDF_STATUS status;
5736 QDF_STATUS qdf_status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005737 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
5738 cds_msg_t cds_message;
5739 tAniDHCPInd *pMsg;
5740 tCsrRoamSession *pSession;
5741
5742 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305743 if (QDF_STATUS_SUCCESS == status) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005744 pSession = CSR_GET_SESSION(pMac, sessionId);
5745
5746 if (!pSession) {
5747 sms_log(pMac, LOGE, FL("session %d not found "),
5748 sessionId);
5749 sme_release_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305750 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005751 }
Arif Hussain3316f402016-11-10 13:08:03 -08005752 pSession->dhcp_done = true;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005753
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305754 pMsg = (tAniDHCPInd *) qdf_mem_malloc(sizeof(tAniDHCPInd));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005755 if (NULL == pMsg) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05305756 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005757 "%s: Not able to allocate memory for dhcp stop",
5758 __func__);
5759 sme_release_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305760 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005761 }
5762
5763 pMsg->msgType = WMA_DHCP_STOP_IND;
5764 pMsg->msgLen = (uint16_t) sizeof(tAniDHCPInd);
5765 pMsg->device_mode = device_mode;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305766 qdf_mem_copy(pMsg->adapterMacAddr.bytes, macAddr,
Anurag Chouhan6d760662016-02-20 16:05:43 +05305767 QDF_MAC_ADDR_SIZE);
Anurag Chouhanc5548422016-02-24 18:33:27 +05305768 qdf_copy_macaddr(&pMsg->peerMacAddr,
Srinivas Girigowda296105a2015-09-24 16:31:16 -07005769 &pSession->connectedProfile.bssid);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005770
5771 cds_message.type = WMA_DHCP_STOP_IND;
5772 cds_message.bodyptr = pMsg;
5773 cds_message.reserved = 0;
Sreelakshmi Konamki6a065362016-05-31 16:05:01 +05305774 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
5775 sessionId, cds_message.type));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305776 qdf_status = cds_mq_post_message(CDS_MQ_ID_WMA, &cds_message);
5777 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05305778 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005779 "%s: Post DHCP Stop MSG fail", __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305780 qdf_mem_free(pMsg);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305781 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005782 }
5783
5784 sme_release_global_lock(&pMac->sme);
5785 }
5786 return status;
5787}
5788
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08005789/*---------------------------------------------------------------------------
5790
5791 \fn sme_TXFailMonitorStopInd
5792
5793 \brief API to signal the FW to start monitoring TX failures
5794
5795 \return QDF_STATUS SUCCESS.
5796
5797 FAILURE or RESOURCES The API finished and failed.
5798 --------------------------------------------------------------------------*/
5799QDF_STATUS sme_tx_fail_monitor_start_stop_ind(tHalHandle hHal, uint8_t tx_fail_count,
5800 void *txFailIndCallback)
5801{
5802 QDF_STATUS status;
5803 QDF_STATUS qdf_status;
5804 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
5805 cds_msg_t cds_message;
5806 tAniTXFailMonitorInd *pMsg;
5807
5808 status = sme_acquire_global_lock(&pMac->sme);
5809 if (QDF_STATUS_SUCCESS == status) {
5810 pMsg = (tAniTXFailMonitorInd *)
5811 qdf_mem_malloc(sizeof(tAniTXFailMonitorInd));
5812 if (NULL == pMsg) {
5813 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
5814 "%s: Failed to allocate memory", __func__);
5815 sme_release_global_lock(&pMac->sme);
5816 return QDF_STATUS_E_NOMEM;
5817 }
5818
5819 pMsg->msgType = WMA_TX_FAIL_MONITOR_IND;
5820 pMsg->msgLen = (uint16_t) sizeof(tAniTXFailMonitorInd);
5821
5822 /* tx_fail_count = 0 should disable the Monitoring in FW */
5823 pMsg->tx_fail_count = tx_fail_count;
5824 pMsg->txFailIndCallback = txFailIndCallback;
5825
5826 cds_message.type = WMA_TX_FAIL_MONITOR_IND;
5827 cds_message.bodyptr = pMsg;
5828 cds_message.reserved = 0;
5829
5830 qdf_status = cds_mq_post_message(CDS_MQ_ID_WMA, &cds_message);
5831 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
5832 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
5833 "%s: Post TX Fail monitor Start MSG fail",
5834 __func__);
5835 qdf_mem_free(pMsg);
5836 status = QDF_STATUS_E_FAILURE;
5837 }
5838 sme_release_global_lock(&pMac->sme);
5839 }
5840 return status;
5841}
5842
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005843/* ---------------------------------------------------------------------------
5844 \fn sme_set_cfg_privacy
5845 \brief API to set configure privacy parameters
5846 \param hHal - The handle returned by mac_open.
5847 \param pProfile - Pointer CSR Roam profile.
5848 \param fPrivacy - This parameter indicates status of privacy
5849
5850 \return void
5851 ---------------------------------------------------------------------------*/
5852void sme_set_cfg_privacy(tHalHandle hHal,
5853 tCsrRoamProfile *pProfile, bool fPrivacy)
5854{
5855 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05305856 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005857 TRACE_CODE_SME_RX_HDD_SET_CFGPRIVACY, NO_SESSION, 0));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305858 if (QDF_STATUS_SUCCESS == sme_acquire_global_lock(&pMac->sme)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005859 csr_set_cfg_privacy(pMac, pProfile, fPrivacy);
5860 sme_release_global_lock(&pMac->sme);
5861 }
5862}
5863
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005864/* ---------------------------------------------------------------------------
5865 \fn sme_neighbor_report_request
5866 \brief API to request neighbor report.
5867 \param hHal - The handle returned by mac_open.
5868 \param pRrmNeighborReq - Pointer to a caller allocated object of type
5869 tRrmNeighborReq. Caller owns the memory and is
5870 responsible for freeing it.
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305871 \return QDF_STATUS
5872 QDF_STATUS_E_FAILURE - failure
5873 QDF_STATUS_SUCCESS success
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005874 ---------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305875QDF_STATUS sme_neighbor_report_request(tHalHandle hHal, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005876 tpRrmNeighborReq pRrmNeighborReq,
5877 tpRrmNeighborRspCallbackInfo callbackInfo)
5878{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305879 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005880 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05305881 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005882 TRACE_CODE_SME_RX_HDD_NEIGHBOR_REPORTREQ, NO_SESSION,
5883 0));
5884
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305885 if (QDF_STATUS_SUCCESS == sme_acquire_global_lock(&pMac->sme)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005886 status =
5887 sme_rrm_neighbor_report_request(hHal, sessionId,
5888 pRrmNeighborReq, callbackInfo);
5889 sme_release_global_lock(&pMac->sme);
5890 }
5891
5892 return status;
5893}
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005894
5895void sms_log(tpAniSirGlobal pMac, uint32_t loglevel, const char *pString, ...)
5896{
5897#ifdef WLAN_DEBUG
5898 /* Verify against current log level */
5899 if (loglevel >
5900 pMac->utils.gLogDbgLevel[LOG_INDEX_FOR_MODULE(SIR_SMS_MODULE_ID)])
5901 return;
5902 else {
5903 va_list marker;
5904
5905 va_start(marker, pString); /* Initialize variable arguments. */
5906
5907 log_debug(pMac, SIR_SMS_MODULE_ID, loglevel, pString, marker);
5908
5909 va_end(marker); /* Reset variable arguments. */
5910 }
5911#endif
5912}
5913
5914/* ---------------------------------------------------------------------------
5915 \fn sme_get_wcnss_wlan_compiled_version
5916 \brief This API returns the version of the WCNSS WLAN API with
5917 which the HOST driver was built
5918 \param hHal - The handle returned by mac_open.
5919 \param pVersion - Points to the Version structure to be filled
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305920 \return QDF_STATUS
5921 QDF_STATUS_E_INVAL - failure
5922 QDF_STATUS_SUCCESS success
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005923 ---------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305924QDF_STATUS sme_get_wcnss_wlan_compiled_version(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005925 tSirVersionType *pVersion)
5926{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305927 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005928 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
5929
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305930 if (QDF_STATUS_SUCCESS == sme_acquire_global_lock(&pMac->sme)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005931 if (pVersion != NULL)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305932 status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005933 else
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305934 status = QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005935
5936 sme_release_global_lock(&pMac->sme);
5937 }
5938
5939 return status;
5940}
5941
5942/* ---------------------------------------------------------------------------
5943 \fn sme_get_wcnss_wlan_reported_version
5944 \brief This API returns the version of the WCNSS WLAN API with
5945 which the WCNSS driver reports it was built
5946 \param hHal - The handle returned by mac_open.
5947 \param pVersion - Points to the Version structure to be filled
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305948 \return QDF_STATUS
5949 QDF_STATUS_E_INVAL - failure
5950 QDF_STATUS_SUCCESS success
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005951 ---------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305952QDF_STATUS sme_get_wcnss_wlan_reported_version(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005953 tSirVersionType *pVersion)
5954{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305955 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005956 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
5957
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305958 if (QDF_STATUS_SUCCESS == sme_acquire_global_lock(&pMac->sme)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005959 if (pVersion != NULL)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305960 status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005961 else
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305962 status = QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005963
5964 sme_release_global_lock(&pMac->sme);
5965 }
5966
5967 return status;
5968}
5969
5970/* ---------------------------------------------------------------------------
5971 \fn sme_get_wcnss_software_version
5972 \brief This API returns the version string of the WCNSS driver
5973 \param hHal - The handle returned by mac_open.
5974 \param pVersion - Points to the Version string buffer to be filled
5975 \param versionBufferSize - THe size of the Version string buffer
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305976 \return QDF_STATUS
5977 QDF_STATUS_E_INVAL - failure
5978 QDF_STATUS_SUCCESS success
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005979 ---------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305980QDF_STATUS sme_get_wcnss_software_version(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005981 uint8_t *pVersion,
5982 uint32_t versionBufferSize)
5983{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305984 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005985 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
5986 v_CONTEXT_t cds_context = cds_get_global_context();
5987
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305988 if (QDF_STATUS_SUCCESS == sme_acquire_global_lock(&pMac->sme)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005989 if (pVersion != NULL) {
5990 status =
5991 wma_get_wcnss_software_version(cds_context,
5992 pVersion,
5993 versionBufferSize);
5994 } else {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305995 status = QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005996 }
5997 sme_release_global_lock(&pMac->sme);
5998 }
5999
6000 return status;
6001}
6002
6003/* ---------------------------------------------------------------------------
6004 \fn sme_get_wcnss_hardware_version
6005 \brief This API returns the version string of the WCNSS hardware
6006 \param hHal - The handle returned by mac_open.
6007 \param pVersion - Points to the Version string buffer to be filled
6008 \param versionBufferSize - THe size of the Version string buffer
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306009 \return QDF_STATUS
6010 QDF_STATUS_E_INVAL - failure
6011 QDF_STATUS_SUCCESS success
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006012 ---------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306013QDF_STATUS sme_get_wcnss_hardware_version(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006014 uint8_t *pVersion,
6015 uint32_t versionBufferSize)
6016{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306017 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006018 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
6019
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306020 if (QDF_STATUS_SUCCESS == sme_acquire_global_lock(&pMac->sme)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006021 if (pVersion != NULL)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306022 status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006023 else
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306024 status = QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006025
6026 sme_release_global_lock(&pMac->sme);
6027 }
6028
6029 return status;
6030}
6031
6032#ifdef FEATURE_WLAN_WAPI
6033
6034/* ---------------------------------------------------------------------------
6035 \fn sme_scan_get_bkid_candidate_list
6036 \brief a wrapper function to return the BKID candidate list
6037 \param pBkidList - caller allocated buffer point to an array of
6038 tBkidCandidateInfo
6039 \param pNumItems - pointer to a variable that has the number of
6040 tBkidCandidateInfo allocated when retruning, this is
6041 either the number needed or number of items put into
6042 pPmkidList
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306043 \return QDF_STATUS - when fail, it usually means the buffer allocated is not
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006044 big enough and pNumItems
6045 has the number of tBkidCandidateInfo.
6046 \Note: pNumItems is a number of tBkidCandidateInfo,
6047 not sizeof(tBkidCandidateInfo) * something
6048 ---------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306049QDF_STATUS sme_scan_get_bkid_candidate_list(tHalHandle hHal, uint32_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006050 tBkidCandidateInfo *pBkidList,
6051 uint32_t *pNumItems)
6052{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306053 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006054 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
6055
6056 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306057 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006058 status =
6059 csr_scan_get_bkid_candidate_list(pMac, sessionId, pBkidList,
6060 pNumItems);
6061 sme_release_global_lock(&pMac->sme);
6062 }
6063
6064 return status;
6065}
6066#endif /* FEATURE_WLAN_WAPI */
6067
6068#ifdef FEATURE_OEM_DATA_SUPPORT
Krishna Kumaar Natarajanc5e06ac2016-06-30 16:49:19 -07006069/**
6070 * sme_oem_data_req() - send oem data request to WMA
6071 * @hal: HAL handle
6072 * @hdd_oem_req: OEM data request from HDD
6073 *
6074 * Return: QDF_STATUS
6075 */
Krishna Kumaar Natarajanc1fa17d2016-08-03 14:19:20 -07006076QDF_STATUS sme_oem_data_req(tHalHandle hal, struct oem_data_req *hdd_oem_req)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006077{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306078 QDF_STATUS status = QDF_STATUS_SUCCESS;
Krishna Kumaar Natarajanc5e06ac2016-06-30 16:49:19 -07006079 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
Krishna Kumaar Natarajanc1fa17d2016-08-03 14:19:20 -07006080 struct oem_data_req *oem_data_req;
Krishna Kumaar Natarajanc5e06ac2016-06-30 16:49:19 -07006081 void *wma_handle;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006082
Krishna Kumaar Natarajanc5e06ac2016-06-30 16:49:19 -07006083 sms_log(mac_ctx, LOG1, FL("enter"));
6084 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
6085 if (!wma_handle) {
6086 sms_log(mac_ctx, LOGE, FL("wma_handle is NULL"));
6087 return QDF_STATUS_E_FAILURE;
6088 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006089
Krishna Kumaar Natarajanc5e06ac2016-06-30 16:49:19 -07006090 oem_data_req = qdf_mem_malloc(sizeof(*oem_data_req));
6091 if (!oem_data_req) {
6092 sms_log(mac_ctx, LOGE, FL("mem alloc failed"));
6093 return QDF_STATUS_E_NOMEM;
6094 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006095
Krishna Kumaar Natarajanc5e06ac2016-06-30 16:49:19 -07006096 oem_data_req->data_len = hdd_oem_req->data_len;
6097 oem_data_req->data = qdf_mem_malloc(oem_data_req->data_len);
6098 if (!oem_data_req->data) {
6099 sms_log(mac_ctx, LOGE, FL("mem alloc failed"));
6100 return QDF_STATUS_E_NOMEM;
6101 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006102
Krishna Kumaar Natarajanc5e06ac2016-06-30 16:49:19 -07006103 qdf_mem_copy(oem_data_req->data, hdd_oem_req->data,
6104 oem_data_req->data_len);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006105
Krishna Kumaar Natarajanc5e06ac2016-06-30 16:49:19 -07006106 status = wma_start_oem_data_req(wma_handle, oem_data_req);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006107
Krishna Kumaar Natarajanc5e06ac2016-06-30 16:49:19 -07006108 if (!QDF_IS_STATUS_SUCCESS(status)) {
6109 sms_log(mac_ctx, LOGE, FL("Post oem data request msg fail"));
6110 } else {
6111 sms_log(mac_ctx, LOG1,
6112 FL("OEM request(length: %d) sent to WMA"),
6113 oem_data_req->data_len);
6114 }
6115
6116 if (oem_data_req->data_len)
6117 qdf_mem_free(oem_data_req->data);
6118 qdf_mem_free(oem_data_req);
6119
6120 sms_log(mac_ctx, LOG1, FL("exit"));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006121 return status;
6122}
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006123#endif /*FEATURE_OEM_DATA_SUPPORT */
6124
6125/*--------------------------------------------------------------------------
6126
6127 \brief sme_open_session() - Open a session for scan/roam operation.
6128
6129 This is a synchronous API.
6130
6131 \param hHal - The handle returned by mac_open.
6132 \param callback - A pointer to the function caller specifies for
6133 roam/connect status indication
6134 \param pContext - The context passed with callback
6135 \param pSelfMacAddr - Caller allocated memory filled with self MAC address
6136 (6 bytes)
6137 \param pbSessionId - pointer to a caller allocated buffer for returned session ID
6138
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306139 \return QDF_STATUS_SUCCESS - session is opened. sessionId returned.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006140
6141 Other status means SME is failed to open the session.
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306142 QDF_STATUS_E_RESOURCES - no more session available.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006143 \sa
6144
6145 --------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306146QDF_STATUS sme_open_session(tHalHandle hHal, csr_roam_completeCallback callback,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006147 void *pContext,
6148 uint8_t *pSelfMacAddr, uint8_t *pbSessionId,
6149 uint32_t type, uint32_t subType)
6150{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306151 QDF_STATUS status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006152 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
6153
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05306154 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_HIGH,
Peng Xu66162de2016-02-11 17:01:20 -08006155 "%s: type=%d, subType=%d addr:%pM",
6156 __func__, type, subType, pSelfMacAddr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006157
6158 if (NULL == pbSessionId) {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306159 status = QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006160 } else {
6161 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306162 if (QDF_IS_STATUS_SUCCESS(status)) {
Peng Xu66162de2016-02-11 17:01:20 -08006163 status = csr_roam_open_session(pMac, callback, pContext,
6164 pSelfMacAddr,
6165 pbSessionId, type,
6166 subType);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006167
6168 sme_release_global_lock(&pMac->sme);
6169 }
6170 }
6171 if (NULL != pbSessionId)
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05306172 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006173 TRACE_CODE_SME_RX_HDD_OPEN_SESSION,
6174 *pbSessionId, 0));
6175
6176 return status;
6177}
6178
6179/*--------------------------------------------------------------------------
6180
6181 \brief sme_close_session() - Open a session for scan/roam operation.
6182
6183 This is a synchronous API.
6184
6185 \param hHal - The handle returned by mac_open.
6186
6187 \param sessionId - A previous opened session's ID.
6188
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306189 \return QDF_STATUS_SUCCESS - session is closed.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006190
6191 Other status means SME is failed to open the session.
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306192 QDF_STATUS_E_INVAL - session is not opened.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006193 \sa
6194
6195 --------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306196QDF_STATUS sme_close_session(tHalHandle hHal, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006197 csr_roamSessionCloseCallback callback,
6198 void *pContext)
6199{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306200 QDF_STATUS status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006201 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
6202
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05306203 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006204 TRACE_CODE_SME_RX_HDD_CLOSE_SESSION, sessionId, 0));
6205 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306206 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006207 status = csr_roam_close_session(pMac, sessionId, false,
6208 callback, pContext);
6209
6210 sme_release_global_lock(&pMac->sme);
6211 }
6212
6213 return status;
6214}
6215
6216/* ---------------------------------------------------------------------------
6217
6218 \fn sme_roam_update_apwpsie
6219
6220 \brief To update AP's WPS IE. This function should be called after SME AP session is created
6221 This is an asynchronous API.
6222
6223 \param pAPWPSIES - pointer to a caller allocated object of tSirAPWPSIEs
6224
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306225 \return QDF_STATUS – SUCCESS –
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006226
6227 FAILURE or RESOURCES – The API finished and failed.
6228
6229 -------------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306230QDF_STATUS sme_roam_update_apwpsie(tHalHandle hHal, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006231 tSirAPWPSIEs *pAPWPSIES)
6232{
6233
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306234 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006235 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
6236
6237 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306238 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006239
6240 status = csr_roam_update_apwpsie(pMac, sessionId, pAPWPSIES);
6241
6242 sme_release_global_lock(&pMac->sme);
6243 }
6244
6245 return status;
6246}
6247
6248/* ---------------------------------------------------------------------------
6249
6250 \fn sme_roam_update_apwparsni_es
6251
6252 \brief To update AP's WPA/RSN IEs. This function should be called after SME AP session is created
6253 This is an asynchronous API.
6254
6255 \param pAPSirRSNie - pointer to a caller allocated object of tSirRSNie with WPS/RSN IEs
6256
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306257 \return QDF_STATUS – SUCCESS –
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006258
6259 FAILURE or RESOURCES – The API finished and failed.
6260
6261 -------------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306262QDF_STATUS sme_roam_update_apwparsni_es(tHalHandle hHal, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006263 tSirRSNie *pAPSirRSNie)
6264{
6265
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306266 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006267 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
6268
6269 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306270 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006271
6272 status = csr_roam_update_wparsni_es(pMac, sessionId, pAPSirRSNie);
6273
6274 sme_release_global_lock(&pMac->sme);
6275 }
6276
6277 return status;
6278}
6279
6280/* ---------------------------------------------------------------------------
6281
6282 \fn sme_change_mcc_beacon_interval
6283
6284 \brief To update P2P-GO beaconInterval. This function should be called after
6285 disassociating all the station is done
6286 This is an asynchronous API.
6287
6288 \param
6289
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306290 \return QDF_STATUS SUCCESS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006291 FAILURE or RESOURCES
6292 The API finished and failed.
6293
6294 -------------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306295QDF_STATUS sme_change_mcc_beacon_interval(tHalHandle hHal, uint8_t sessionId)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006296{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306297 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006298 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
6299
6300 sms_log(pMac, LOG1, FL("Update Beacon PARAMS "));
6301 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306302 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006303 status = csr_send_chng_mcc_beacon_interval(pMac, sessionId);
6304 sme_release_global_lock(&pMac->sme);
6305 }
6306 return status;
6307}
6308
6309/**
6310 * sme_set_host_offload(): API to set the host offload feature.
6311 * @hHal: The handle returned by mac_open.
6312 * @sessionId: Session Identifier
6313 * @request: Pointer to the offload request.
6314 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306315 * Return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006316 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306317QDF_STATUS sme_set_host_offload(tHalHandle hHal, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006318 tpSirHostOffloadReq request)
6319{
6320 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306321 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006322
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05306323 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006324 TRACE_CODE_SME_RX_HDD_SET_HOSTOFFLOAD, sessionId, 0));
6325 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306326 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006327#ifdef WLAN_NS_OFFLOAD
6328 if (SIR_IPV6_NS_OFFLOAD == request->offloadType) {
6329 status = sme_set_ps_ns_offload(hHal, request,
6330 sessionId);
6331 } else
6332#endif /* WLAN_NS_OFFLOAD */
6333 {
6334 status = sme_set_ps_host_offload(hHal, request,
6335 sessionId);
6336 }
6337 sme_release_global_lock(&pMac->sme);
6338 }
6339
6340 return status;
6341}
6342
6343#ifdef WLAN_FEATURE_GTK_OFFLOAD
6344/**
6345 * sme_set_gtk_offload(): API to set GTK offload information.
6346 * @hHal: The handle returned by mac_open.
6347 * @sessionId: Session Identifier
6348 * @pGtkOffload: Pointer to the GTK offload request..
6349 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306350 * Return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006351 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306352QDF_STATUS sme_set_gtk_offload(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006353 tpSirGtkOffloadParams pGtkOffload,
6354 uint8_t sessionId)
6355{
6356 tpSirGtkOffloadParams request_buf;
6357 cds_msg_t msg;
6358 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
6359 tCsrRoamSession *pSession = CSR_GET_SESSION(pMac, sessionId);
6360
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05306361 QDF_TRACE(QDF_MODULE_ID_HDD, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006362 "%s: KeyReplayCounter: %lld", __func__,
6363 pGtkOffload->ullKeyReplayCounter);
6364
6365 if (NULL == pSession) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05306366 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006367 "%s: Session not found ", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306368 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006369 }
6370
Anurag Chouhan600c3a02016-03-01 10:33:54 +05306371 request_buf = qdf_mem_malloc(sizeof(*request_buf));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006372 if (NULL == request_buf) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05306373 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006374 FL("Not able to allocate memory for GTK offload request"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306375 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006376 }
6377
Anurag Chouhanc5548422016-02-24 18:33:27 +05306378 qdf_copy_macaddr(&pGtkOffload->bssid,
Srinivas Girigowda2213b1d2015-11-20 17:10:11 -08006379 &pSession->connectedProfile.bssid);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006380
6381 *request_buf = *pGtkOffload;
6382
6383 msg.type = WMA_GTK_OFFLOAD_REQ;
6384 msg.reserved = 0;
6385 msg.bodyptr = request_buf;
Sreelakshmi Konamki6a065362016-05-31 16:05:01 +05306386 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
6387 sessionId, msg.type));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306388 if (!QDF_IS_STATUS_SUCCESS
Anurag Chouhan6d760662016-02-20 16:05:43 +05306389 (cds_mq_post_message(QDF_MODULE_ID_WMA, &msg))) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05306390 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006391 FL("Not able to post SIR_HAL_SET_GTK_OFFLOAD message to HAL"));
Anurag Chouhan600c3a02016-03-01 10:33:54 +05306392 qdf_mem_free(request_buf);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306393 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006394 }
6395
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306396 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006397}
6398
6399/**
6400 * sme_get_gtk_offload(): API to get GTK offload information
6401 * @hHal: The handle returned by mac_open.
6402 * @callback_routine: callback_routine.
6403 * @sessionId: Session Identifier.
6404 * callback_context: callback_context.
6405 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306406 * Return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006407 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306408QDF_STATUS sme_get_gtk_offload(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006409 gtk_offload_get_info_callback callback_routine,
6410 void *callback_context, uint8_t session_id)
6411{
6412 tpSirGtkOffloadGetInfoRspParams request_buf;
6413 cds_msg_t msg;
6414 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
6415 tCsrRoamSession *pSession = CSR_GET_SESSION(pMac, session_id);
6416
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05306417 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO, "%s: Entered",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006418 __func__);
6419
6420 if (NULL == pSession) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05306421 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Srinivas Girigowda2213b1d2015-11-20 17:10:11 -08006422 "%s: Session not found", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306423 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006424 }
6425
Anurag Chouhan600c3a02016-03-01 10:33:54 +05306426 request_buf = qdf_mem_malloc(sizeof(*request_buf));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006427 if (NULL == request_buf) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05306428 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006429 FL("Not able to allocate memory for Get GTK offload request"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306430 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006431 }
6432
Anurag Chouhanc5548422016-02-24 18:33:27 +05306433 qdf_copy_macaddr(&request_buf->bssid,
Srinivas Girigowda2213b1d2015-11-20 17:10:11 -08006434 &pSession->connectedProfile.bssid);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006435
6436 msg.type = WMA_GTK_OFFLOAD_GETINFO_REQ;
6437 msg.reserved = 0;
6438 msg.bodyptr = request_buf;
6439
6440 /* Cache the Get GTK Offload callback information */
6441 if (NULL != pMac->sme.gtk_offload_get_info_cb) {
6442
6443 /* Do we need to check if the callback is in use? */
6444 /* Because we are not sending the same message again
6445 * when it is pending,
6446 * the only case when the callback is not NULL is that
6447 * the previous message was timed out or failed.
6448 * So, it will be safe to set the callback in this case.
6449 */
6450 }
6451
6452 pMac->sme.gtk_offload_get_info_cb = callback_routine;
6453 pMac->sme.gtk_offload_get_info_cb_context = callback_context;
Sreelakshmi Konamki6a065362016-05-31 16:05:01 +05306454 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
6455 session_id, msg.type));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306456 if (!QDF_IS_STATUS_SUCCESS
Anurag Chouhan6d760662016-02-20 16:05:43 +05306457 (cds_mq_post_message(QDF_MODULE_ID_WMA, &msg))) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05306458 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006459 FL("Not able to post WMA_GTK_OFFLOAD_GETINFO_REQ message to WMA"));
Anurag Chouhan600c3a02016-03-01 10:33:54 +05306460 qdf_mem_free(request_buf);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306461 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006462 }
6463
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306464 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006465}
6466#endif /* WLAN_FEATURE_GTK_OFFLOAD */
6467
6468/* ---------------------------------------------------------------------------
6469 \fn sme_set_keep_alive
6470 \brief API to set the Keep Alive feature.
6471 \param hHal - The handle returned by mac_open.
6472 \param request - Pointer to the Keep Alive request.
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306473 \return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006474 ---------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306475QDF_STATUS sme_set_keep_alive(tHalHandle hHal, uint8_t session_id,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006476 tpSirKeepAliveReq request)
6477{
6478 tpSirKeepAliveReq request_buf;
6479 cds_msg_t msg;
6480 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
6481 tCsrRoamSession *pSession = CSR_GET_SESSION(pMac, session_id);
6482
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05306483 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO_LOW,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006484 FL("WMA_SET_KEEP_ALIVE message"));
6485
6486 if (pSession == NULL) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05306487 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006488 FL("Session not Found"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306489 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006490 }
Anurag Chouhan600c3a02016-03-01 10:33:54 +05306491 request_buf = qdf_mem_malloc(sizeof(tSirKeepAliveReq));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006492 if (NULL == request_buf) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05306493 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006494 FL("Not able to allocate memory for keep alive request"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306495 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006496 }
6497
Anurag Chouhanc5548422016-02-24 18:33:27 +05306498 qdf_copy_macaddr(&request->bssid, &pSession->connectedProfile.bssid);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05306499 qdf_mem_copy(request_buf, request, sizeof(tSirKeepAliveReq));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006500
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05306501 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO_LOW,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006502 "buff TP %d input TP %d ", request_buf->timePeriod,
6503 request->timePeriod);
6504 request_buf->sessionId = session_id;
6505
6506 msg.type = WMA_SET_KEEP_ALIVE;
6507 msg.reserved = 0;
6508 msg.bodyptr = request_buf;
Sreelakshmi Konamki6a065362016-05-31 16:05:01 +05306509 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
6510 session_id, msg.type));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306511 if (QDF_STATUS_SUCCESS !=
Anurag Chouhan6d760662016-02-20 16:05:43 +05306512 cds_mq_post_message(QDF_MODULE_ID_WMA, &msg)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05306513 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006514 FL("Not able to post WMA_SET_KEEP_ALIVE message to WMA"));
Anurag Chouhan600c3a02016-03-01 10:33:54 +05306515 qdf_mem_free(request_buf);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306516 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006517 }
6518
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306519 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006520}
6521
6522#ifdef FEATURE_WLAN_SCAN_PNO
6523/* ---------------------------------------------------------------------------
6524 \fn sme_set_preferred_network_list
6525 \brief API to set the Preferred Network List Offload feature.
6526 \param hHal - The handle returned by mac_open.
6527 \param request - Pointer to the offload request.
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306528 \return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006529 ---------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306530QDF_STATUS sme_set_preferred_network_list(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006531 tpSirPNOScanReq request,
6532 uint8_t sessionId,
6533 void (*callback_routine)(void *callback_context,
6534 tSirPrefNetworkFoundInd
6535 *pPrefNetworkFoundInd),
6536 void *callback_context)
6537{
6538 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306539 QDF_STATUS status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006540
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05306541 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Sreelakshmi Konamki6744cff2015-09-07 12:10:39 +05306542 TRACE_CODE_SME_RX_HDD_PREF_NET_LIST,
6543 sessionId, request->ucNetworksCount));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006544 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306545 if (QDF_IS_STATUS_SUCCESS(status)) {
Dustin Brownf27bce82016-11-03 12:52:27 -07006546 status = sme_set_ps_preferred_network_list(hHal, request,
6547 sessionId,
6548 callback_routine,
6549 callback_context);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006550 sme_release_global_lock(&pMac->sme);
6551 }
6552
6553 return status;
6554}
6555
6556#endif /* FEATURE_WLAN_SCAN_PNO */
6557
6558/* ---------------------------------------------------------------------------
6559 \fn sme_abort_mac_scan
6560 \brief API to cancel MAC scan.
6561 \param hHal - The handle returned by mac_open.
6562 \param sessionId - sessionId on which we need to abort scan.
6563 \param reason - Reason to abort the scan.
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306564 \return QDF_STATUS
6565 QDF_STATUS_E_FAILURE - failure
6566 QDF_STATUS_SUCCESS success
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006567 ---------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306568QDF_STATUS sme_abort_mac_scan(tHalHandle hHal, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006569 eCsrAbortReason reason)
6570{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306571 QDF_STATUS status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006572 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
6573
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05306574 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006575 TRACE_CODE_SME_RX_HDD_ABORT_MACSCAN, NO_SESSION, 0));
6576 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306577 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006578 status = csr_scan_abort_mac_scan(pMac, sessionId, reason);
6579
6580 sme_release_global_lock(&pMac->sme);
6581 }
6582
6583 return status;
6584}
6585
6586/* ----------------------------------------------------------------------------
6587 \fn sme_get_operation_channel
6588 \brief API to get current channel on which STA is parked
6589 this function gives channel information only of infra station or IBSS station
6590 \param hHal, pointer to memory location and sessionId
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306591 \returns QDF_STATUS_SUCCESS
6592 QDF_STATUS_E_FAILURE
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006593 -------------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306594QDF_STATUS sme_get_operation_channel(tHalHandle hHal, uint32_t *pChannel,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006595 uint8_t sessionId)
6596{
6597 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
6598 tCsrRoamSession *pSession;
6599
6600 if (CSR_IS_SESSION_VALID(pMac, sessionId)) {
6601 pSession = CSR_GET_SESSION(pMac, sessionId);
6602
6603 if ((pSession->connectedProfile.BSSType ==
6604 eCSR_BSS_TYPE_INFRASTRUCTURE)
6605 || (pSession->connectedProfile.BSSType ==
6606 eCSR_BSS_TYPE_IBSS)
6607 || (pSession->connectedProfile.BSSType ==
6608 eCSR_BSS_TYPE_INFRA_AP)
6609 || (pSession->connectedProfile.BSSType ==
6610 eCSR_BSS_TYPE_START_IBSS)) {
6611 *pChannel = pSession->connectedProfile.operationChannel;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306612 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006613 }
6614 }
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306615 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006616} /* sme_get_operation_channel ends here */
6617
Abhishek Singh7996eb72015-12-30 17:24:02 +05306618/**
Selvaraj, Sridhar4577a9b2016-09-04 15:17:07 +05306619 * sme_register_p2p_ack_ind_callback() - p2p ack indication callback
6620 * @hal: hal pointer
6621 * @callback: callback pointer to be registered
6622 *
6623 * This function is used to register a callback to PE for p2p ack
6624 * indication
6625 *
6626 * Return: Success if msg is posted to PE else Failure.
6627 */
6628QDF_STATUS sme_register_p2p_ack_ind_callback(tHalHandle hal,
6629 sir_p2p_ack_ind_callback callback)
6630{
6631 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
6632 struct sir_sme_p2p_ack_ind_cb_req *msg;
6633 QDF_STATUS status = QDF_STATUS_SUCCESS;
6634 sms_log(mac_ctx, LOG1, FL(": ENTER"));
6635 status = sme_acquire_global_lock(&mac_ctx->sme);
6636 if (QDF_IS_STATUS_SUCCESS(status)) {
6637 msg = qdf_mem_malloc(sizeof(*msg));
6638 if (NULL == msg) {
6639 sms_log(mac_ctx, LOGE,
6640 FL("Failed to allocate memory"));
6641 sme_release_global_lock(&mac_ctx->sme);
6642 return QDF_STATUS_E_NOMEM;
6643 }
Selvaraj, Sridhar4577a9b2016-09-04 15:17:07 +05306644 msg->message_type = eWNI_SME_REGISTER_P2P_ACK_CB;
6645 msg->length = sizeof(*msg);
6646
6647 msg->callback = callback;
6648 status = cds_send_mb_message_to_mac(msg);
6649 sme_release_global_lock(&mac_ctx->sme);
6650 return status;
6651 }
6652 return status;
6653}
6654
6655/**
Abhishek Singh7996eb72015-12-30 17:24:02 +05306656 * sme_register_mgmt_frame_ind_callback() - Register a callback for
6657 * management frame indication to PE.
6658 *
6659 * @hal: hal pointer
6660 * @callback: callback pointer to be registered
6661 *
6662 * This function is used to register a callback for management
6663 * frame indication to PE.
6664 *
6665 * Return: Success if msg is posted to PE else Failure.
6666 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306667QDF_STATUS sme_register_mgmt_frame_ind_callback(tHalHandle hal,
Abhishek Singh7996eb72015-12-30 17:24:02 +05306668 sir_mgmt_frame_ind_callback callback)
6669{
6670 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
6671 struct sir_sme_mgmt_frame_cb_req *msg;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306672 QDF_STATUS status = QDF_STATUS_SUCCESS;
Abhishek Singh7996eb72015-12-30 17:24:02 +05306673
6674 sms_log(mac_ctx, LOG1, FL(": ENTER"));
6675
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306676 if (QDF_STATUS_SUCCESS ==
Abhishek Singh7996eb72015-12-30 17:24:02 +05306677 sme_acquire_global_lock(&mac_ctx->sme)) {
Anurag Chouhan600c3a02016-03-01 10:33:54 +05306678 msg = qdf_mem_malloc(sizeof(*msg));
Abhishek Singh7996eb72015-12-30 17:24:02 +05306679 if (NULL == msg) {
6680 sms_log(mac_ctx, LOGE,
6681 FL("Not able to allocate memory for eWNI_SME_REGISTER_MGMT_FRAME_CB"));
6682 sme_release_global_lock(&mac_ctx->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306683 return QDF_STATUS_E_NOMEM;
Abhishek Singh7996eb72015-12-30 17:24:02 +05306684 }
Abhishek Singh7996eb72015-12-30 17:24:02 +05306685 msg->message_type = eWNI_SME_REGISTER_MGMT_FRAME_CB;
6686 msg->length = sizeof(*msg);
6687
6688 msg->callback = callback;
6689 status = cds_send_mb_message_to_mac(msg);
6690 sme_release_global_lock(&mac_ctx->sme);
6691 return status;
6692 }
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306693 return QDF_STATUS_E_FAILURE;
Abhishek Singh7996eb72015-12-30 17:24:02 +05306694}
6695
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006696/* ---------------------------------------------------------------------------
6697
6698 \fn sme_RegisterMgtFrame
6699
6700 \brief To register managment frame of specified type and subtype.
6701 \param frameType - type of the frame that needs to be passed to HDD.
6702 \param matchData - data which needs to be matched before passing frame
6703 to HDD.
6704 \param matchDataLen - Length of matched data.
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306705 \return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006706 -------------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306707QDF_STATUS sme_register_mgmt_frame(tHalHandle hHal, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006708 uint16_t frameType, uint8_t *matchData,
6709 uint16_t matchLen)
6710{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306711 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006712 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
6713
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05306714 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006715 TRACE_CODE_SME_RX_HDD_REGISTER_MGMTFR, sessionId, 0));
6716 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306717 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006718 tSirRegisterMgmtFrame *pMsg;
6719 uint16_t len;
6720 tCsrRoamSession *pSession = CSR_GET_SESSION(pMac, sessionId);
6721
6722 if (!CSR_IS_SESSION_ANY(sessionId) && !pSession) {
6723 sms_log(pMac, LOGE, FL(" session %d not found "),
6724 sessionId);
6725 sme_release_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306726 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006727 }
6728
6729 if (!CSR_IS_SESSION_ANY(sessionId) && !pSession->sessionActive) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05306730 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006731 "%s Invalid Sessionid", __func__);
6732 sme_release_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306733 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006734 }
6735
6736 len = sizeof(tSirRegisterMgmtFrame) + matchLen;
6737
Anurag Chouhan600c3a02016-03-01 10:33:54 +05306738 pMsg = qdf_mem_malloc(len);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006739 if (NULL == pMsg)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306740 status = QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006741 else {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006742 pMsg->messageType = eWNI_SME_REGISTER_MGMT_FRAME_REQ;
6743 pMsg->length = len;
6744 pMsg->sessionId = sessionId;
6745 pMsg->registerFrame = true;
6746 pMsg->frameType = frameType;
6747 pMsg->matchLen = matchLen;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05306748 qdf_mem_copy(pMsg->matchData, matchData, matchLen);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006749 status = cds_send_mb_message_to_mac(pMsg);
6750 }
6751 sme_release_global_lock(&pMac->sme);
6752 }
6753 return status;
6754}
6755
6756/* ---------------------------------------------------------------------------
6757
6758 \fn sme_DeregisterMgtFrame
6759
6760 \brief To De-register managment frame of specified type and subtype.
6761 \param frameType - type of the frame that needs to be passed to HDD.
6762 \param matchData - data which needs to be matched before passing frame
6763 to HDD.
6764 \param matchDataLen - Length of matched data.
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306765 \return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006766 -------------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306767QDF_STATUS sme_deregister_mgmt_frame(tHalHandle hHal, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006768 uint16_t frameType, uint8_t *matchData,
6769 uint16_t matchLen)
6770{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306771 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006772 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
6773
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05306774 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006775 TRACE_CODE_SME_RX_HDD_DEREGISTER_MGMTFR, sessionId,
6776 0));
6777 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306778 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006779 tSirRegisterMgmtFrame *pMsg;
6780 uint16_t len;
6781 tCsrRoamSession *pSession = CSR_GET_SESSION(pMac, sessionId);
6782
6783 if (!CSR_IS_SESSION_ANY(sessionId) && !pSession) {
6784 sms_log(pMac, LOGE, FL(" session %d not found "),
6785 sessionId);
6786 sme_release_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306787 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006788 }
6789
6790 if (!CSR_IS_SESSION_ANY(sessionId) && !pSession->sessionActive) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05306791 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006792 "%s Invalid Sessionid", __func__);
6793 sme_release_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306794 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006795 }
6796
6797 len = sizeof(tSirRegisterMgmtFrame) + matchLen;
6798
Anurag Chouhan600c3a02016-03-01 10:33:54 +05306799 pMsg = qdf_mem_malloc(len);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006800 if (NULL == pMsg)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306801 status = QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006802 else {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006803 pMsg->messageType = eWNI_SME_REGISTER_MGMT_FRAME_REQ;
6804 pMsg->length = len;
6805 pMsg->registerFrame = false;
6806 pMsg->frameType = frameType;
6807 pMsg->matchLen = matchLen;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05306808 qdf_mem_copy(pMsg->matchData, matchData, matchLen);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006809 status = cds_send_mb_message_to_mac(pMsg);
6810 }
6811 sme_release_global_lock(&pMac->sme);
6812 }
6813 return status;
6814}
6815
6816/**
6817 * sme_remain_on_channel - API to request remain on channel for 'x' duration
6818 *
6819 * @hHal: pointer to MAC handle
6820 * @session_id: Session identifier
6821 * @channel: channel information
6822 * @duration: duration in ms
6823 * @callback: HDD registered callback to process reaminOnChannelRsp
6824 * @context: HDD Callback param
6825 * @scan_id: scan identifier
6826 *
6827 * This function process the roc request and generates scan identifier.s
6828 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306829 * Return: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006830 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306831QDF_STATUS sme_remain_on_channel(tHalHandle hHal, uint8_t session_id,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006832 uint8_t channel, uint32_t duration,
6833 remainOnChanCallback callback,
6834 void *pContext, uint8_t isP2PProbeReqAllowed,
6835 uint32_t *scan_id)
6836{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306837 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006838 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hHal);
6839 uint32_t san_req_id, scan_count;
6840 struct ani_roc_req *roc_msg;
6841 cds_msg_t msg;
6842
6843
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05306844 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006845 TRACE_CODE_SME_RX_HDD_REMAIN_ONCHAN, session_id, 0));
6846
6847 scan_count = csr_ll_count(&mac_ctx->sme.smeScanCmdActiveList);
6848 if (scan_count >= mac_ctx->scan.max_scan_count) {
6849 sms_log(mac_ctx, LOGE, FL("Max scan reached"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306850 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006851 }
6852
6853 wma_get_scan_id(&san_req_id);
6854 *scan_id = san_req_id;
6855 status = sme_acquire_global_lock(&mac_ctx->sme);
6856
6857 sms_log(mac_ctx, LOG1, FL(" called"));
Anurag Chouhan600c3a02016-03-01 10:33:54 +05306858 roc_msg = qdf_mem_malloc(sizeof(struct ani_roc_req));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006859 if (NULL == roc_msg) {
6860 sms_log(mac_ctx, LOGE,
6861 " scan_req: failed to allocate mem for msg");
6862 sme_release_global_lock(&mac_ctx->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306863 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006864 }
6865 roc_msg->msg_type = eWNI_SME_ROC_CMD;
6866 roc_msg->msg_len = (uint16_t) sizeof(struct ani_roc_req);
6867 roc_msg->session_id = session_id;
6868 roc_msg->callback = callback;
6869 roc_msg->duration = duration;
6870 roc_msg->channel = channel;
6871 roc_msg->is_p2pprobe_allowed = isP2PProbeReqAllowed;
6872 roc_msg->ctx = pContext;
6873 roc_msg->scan_id = *scan_id;
6874 msg.type = eWNI_SME_ROC_CMD;
6875 msg.bodyptr = roc_msg;
6876 msg.reserved = 0;
6877 msg.bodyval = 0;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306878 if (QDF_STATUS_SUCCESS !=
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006879 cds_mq_post_message(CDS_MQ_ID_SME, &msg)) {
6880 sms_log(mac_ctx, LOGE,
6881 " sme_scan_req failed to post msg");
Anurag Chouhan600c3a02016-03-01 10:33:54 +05306882 qdf_mem_free(roc_msg);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306883 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006884 }
6885 sme_release_global_lock(&mac_ctx->sme);
6886 return status;
6887}
6888
6889/* ---------------------------------------------------------------------------
6890 \fn sme_report_probe_req
6891 \brief API to enable/disable forwarding of probeReq to apps in p2p.
6892 \param hHal - The handle returned by mac_open.
6893 \param falg: to set the Probe request forarding to wpa_supplicant in listen state in p2p
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306894 \return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006895 ---------------------------------------------------------------------------*/
6896
6897#ifndef WLAN_FEATURE_CONCURRENT_P2P
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306898QDF_STATUS sme_report_probe_req(tHalHandle hHal, uint8_t flag)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006899{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306900 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006901 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
6902
6903 do {
6904 /* acquire the lock for the sme object */
6905 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306906 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006907 /* call set in context */
6908 pMac->p2pContext.probeReqForwarding = flag;
6909 /* release the lock for the sme object */
6910 sme_release_global_lock(&pMac->sme);
6911 }
6912 } while (0);
6913
6914 sms_log(pMac, LOGW, "exiting function %s", __func__);
6915
6916 return status;
6917}
6918
6919/* ---------------------------------------------------------------------------
6920 \fn sme_update_p2p_ie
6921 \brief API to set the P2p Ie in p2p context
6922 \param hHal - The handle returned by mac_open.
6923 \param p2pIe - Ptr to p2pIe from HDD.
6924 \param p2pIeLength: length of p2pIe
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306925 \return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006926 ---------------------------------------------------------------------------*/
6927
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306928QDF_STATUS sme_update_p2p_ie(tHalHandle hHal, void *p2pIe, uint32_t p2pIeLength)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006929{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306930 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006931 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
6932
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05306933 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006934 TRACE_CODE_SME_RX_HDD_UPDATE_P2P_IE, NO_SESSION, 0));
6935 /* acquire the lock for the sme object */
6936 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306937 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006938 if (NULL != pMac->p2pContext.probeRspIe) {
Anurag Chouhan600c3a02016-03-01 10:33:54 +05306939 qdf_mem_free(pMac->p2pContext.probeRspIe);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006940 pMac->p2pContext.probeRspIeLength = 0;
6941 }
6942
Anurag Chouhan600c3a02016-03-01 10:33:54 +05306943 pMac->p2pContext.probeRspIe = qdf_mem_malloc(p2pIeLength);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006944 if (NULL == pMac->p2pContext.probeRspIe) {
6945 sms_log(pMac, LOGE, "%s: Unable to allocate P2P IE",
6946 __func__);
6947 pMac->p2pContext.probeRspIeLength = 0;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306948 status = QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006949 } else {
6950 pMac->p2pContext.probeRspIeLength = p2pIeLength;
6951
6952 sir_dump_buf(pMac, SIR_LIM_MODULE_ID, LOG2,
6953 pMac->p2pContext.probeRspIe,
6954 pMac->p2pContext.probeRspIeLength);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05306955 qdf_mem_copy((uint8_t *) pMac->p2pContext.probeRspIe,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006956 p2pIe, p2pIeLength);
6957 }
6958
6959 /* release the lock for the sme object */
6960 sme_release_global_lock(&pMac->sme);
6961 }
6962
6963 sms_log(pMac, LOG2, "exiting function %s", __func__);
6964
6965 return status;
6966}
6967#endif
6968
6969/* ---------------------------------------------------------------------------
6970 \fn sme_send_action
6971 \brief API to send action frame from supplicant.
6972 \param hHal - The handle returned by mac_open.
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306973 \return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006974 ---------------------------------------------------------------------------*/
6975
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306976QDF_STATUS sme_send_action(tHalHandle hHal, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006977 const uint8_t *pBuf, uint32_t len,
6978 uint16_t wait, bool noack,
6979 uint16_t channel_freq)
6980{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306981 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006982 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
6983
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05306984 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006985 TRACE_CODE_SME_RX_HDD_SEND_ACTION, sessionId, 0));
6986 /* acquire the lock for the sme object */
6987 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306988 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006989 p2p_send_action(hHal, sessionId, pBuf, len, wait, noack,
6990 channel_freq);
6991 /* release the lock for the sme object */
6992 sme_release_global_lock(&pMac->sme);
6993 }
6994
6995 sms_log(pMac, LOGW, "exiting function %s", __func__);
6996
6997 return status;
6998}
6999
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307000QDF_STATUS sme_cancel_remain_on_channel(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007001 uint8_t sessionId, uint32_t scan_id)
7002{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307003 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007004 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
7005
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05307006 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007007 TRACE_CODE_SME_RX_HDD_CANCEL_REMAIN_ONCHAN, sessionId,
7008 0));
7009 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307010 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007011 status = p2p_cancel_remain_on_channel(hHal, sessionId, scan_id);
7012 sme_release_global_lock(&pMac->sme);
7013 }
7014 return status;
7015}
7016
7017/* Power Save Related */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307018QDF_STATUS sme_p2p_set_ps(tHalHandle hHal, tP2pPsConfig *data)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007019{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307020 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007021 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
7022
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_set_ps(hHal, data);
7026 sme_release_global_lock(&pMac->sme);
7027 }
7028 return status;
7029}
7030
7031/* ---------------------------------------------------------------------------
7032
7033 \fn sme_configure_rxp_filter
7034
7035 \brief
7036 SME will pass this request to lower mac to set/reset the filter on RXP for
7037 multicast & broadcast traffic.
7038
7039 \param
7040
7041 hHal - The handle returned by mac_open.
7042
7043 filterMask- Currently the API takes a 1 or 0 (set or reset) as filter.
7044 Basically to enable/disable the filter (to filter "all" mcbc traffic) based
7045 on this param. In future we can use this as a mask to set various types of
7046 filters as suggested below:
7047 FILTER_ALL_MULTICAST:
7048 FILTER_ALL_BROADCAST:
7049 FILTER_ALL_MULTICAST_BROADCAST:
7050
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307051 \return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007052
7053 --------------------------------------------------------------------------- */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307054QDF_STATUS sme_configure_rxp_filter(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007055 tpSirWlanSetRxpFilters wlanRxpFilterParam)
7056{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307057 QDF_STATUS status = QDF_STATUS_SUCCESS;
7058 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007059 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
7060 cds_msg_t cds_message;
7061
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05307062 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007063 TRACE_CODE_SME_RX_HDD_CONFIG_RXPFIL, NO_SESSION, 0));
7064 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307065 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007066 /* serialize the req through MC thread */
7067 cds_message.bodyptr = wlanRxpFilterParam;
7068 cds_message.type = WMA_CFG_RXP_FILTER_REQ;
Sreelakshmi Konamki6a065362016-05-31 16:05:01 +05307069 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
7070 NO_SESSION, cds_message.type));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307071 qdf_status = cds_mq_post_message(CDS_MQ_ID_WMA, &cds_message);
7072 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
7073 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007074 }
7075 sme_release_global_lock(&pMac->sme);
7076 }
7077 return status;
7078}
7079
7080/* ---------------------------------------------------------------------------
7081
7082 \fn sme_configure_suspend_ind
7083
7084 \brief
7085 SME will pass this request to lower mac to Indicate that the wlan needs to
7086 be suspended
7087
7088 \param
7089
7090 hHal - The handle returned by mac_open.
7091
7092 wlanSuspendParam- Depicts the wlan suspend params
7093
7094 csr_readyToSuspendCallback - Callback to be called when ready to suspend
7095 event is received.
7096 callback_context - Context associated with csr_readyToSuspendCallback.
7097
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307098 \return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007099
7100 --------------------------------------------------------------------------- */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307101QDF_STATUS sme_configure_suspend_ind(tHalHandle hHal,
Houston Hoffman7260ecb2015-10-05 18:43:07 -07007102 uint32_t conn_state_mask,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007103 csr_readyToSuspendCallback callback,
7104 void *callback_context)
7105{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307106 QDF_STATUS status = QDF_STATUS_SUCCESS;
7107 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007108 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
7109 cds_msg_t cds_message;
7110
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05307111 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007112 TRACE_CODE_SME_RX_HDD_CONFIG_SUSPENDIND, NO_SESSION,
7113 0));
7114
7115 pMac->readyToSuspendCallback = callback;
7116 pMac->readyToSuspendContext = callback_context;
7117
7118 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307119 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007120 /* serialize the req through MC thread */
Houston Hoffman7260ecb2015-10-05 18:43:07 -07007121 cds_message.bodyval = conn_state_mask;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007122 cds_message.type = WMA_WLAN_SUSPEND_IND;
Sreelakshmi Konamki6a065362016-05-31 16:05:01 +05307123 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
7124 NO_SESSION, cds_message.type));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307125 qdf_status = cds_mq_post_message(CDS_MQ_ID_WMA, &cds_message);
7126 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007127 pMac->readyToSuspendCallback = NULL;
7128 pMac->readyToSuspendContext = NULL;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307129 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007130 }
7131 sme_release_global_lock(&pMac->sme);
7132 }
7133
7134 return status;
7135}
7136
7137/* ---------------------------------------------------------------------------
7138
7139 \fn sme_configure_resume_req
7140
7141 \brief
7142 SME will pass this request to lower mac to Indicate that the wlan needs to
7143 be Resumed
7144
7145 \param
7146
7147 hHal - The handle returned by mac_open.
7148
7149 wlanResumeParam- Depicts the wlan resume params
7150
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307151 \return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007152
7153 --------------------------------------------------------------------------- */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307154QDF_STATUS sme_configure_resume_req(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007155 tpSirWlanResumeParam wlanResumeParam)
7156{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307157 QDF_STATUS status = QDF_STATUS_SUCCESS;
7158 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007159 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
7160 cds_msg_t cds_message;
7161
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05307162 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007163 TRACE_CODE_SME_RX_HDD_CONFIG_RESUMEREQ, NO_SESSION,
7164 0));
7165 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307166 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007167 /* serialize the req through MC thread */
7168 cds_message.bodyptr = wlanResumeParam;
7169 cds_message.type = WMA_WLAN_RESUME_REQ;
Sreelakshmi Konamki6a065362016-05-31 16:05:01 +05307170 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
7171 NO_SESSION, cds_message.type));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307172 qdf_status = cds_mq_post_message(CDS_MQ_ID_WMA, &cds_message);
7173 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
7174 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007175 }
7176 sme_release_global_lock(&pMac->sme);
7177 }
7178 return status;
7179}
7180
7181#ifdef WLAN_FEATURE_EXTWOW_SUPPORT
Krishna Kumaar Natarajand9131902015-10-19 11:52:47 -07007182/**
7183 * sme_configure_ext_wow() - configure Extr WoW
7184 * @hHal - The handle returned by mac_open.
7185 * @wlanExtParams - Depicts the wlan Ext params.
7186 * @callback - ext_wow callback to be registered.
7187 * @callback_context - ext_wow callback context
7188 *
7189 * SME will pass this request to lower mac to configure Extr WoW
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307190 * Return: QDF_STATUS
Krishna Kumaar Natarajand9131902015-10-19 11:52:47 -07007191 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307192QDF_STATUS sme_configure_ext_wow(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007193 tpSirExtWoWParams wlanExtParams,
7194 csr_readyToExtWoWCallback callback,
7195 void *callback_context)
7196{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307197 QDF_STATUS status = QDF_STATUS_SUCCESS;
7198 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007199 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
7200 cds_msg_t cds_message;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05307201 tpSirExtWoWParams MsgPtr = qdf_mem_malloc(sizeof(*MsgPtr));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007202
7203 if (!MsgPtr)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307204 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007205
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05307206 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007207 TRACE_CODE_SME_RX_HDD_CONFIG_EXTWOW, NO_SESSION, 0));
7208
7209 pMac->readyToExtWoWCallback = callback;
7210 pMac->readyToExtWoWContext = callback_context;
7211
7212 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307213 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007214
7215 /* serialize the req through MC thread */
Anurag Chouhan600c3a02016-03-01 10:33:54 +05307216 qdf_mem_copy(MsgPtr, wlanExtParams, sizeof(*MsgPtr));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007217 cds_message.bodyptr = MsgPtr;
7218 cds_message.type = WMA_WLAN_EXT_WOW;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307219 qdf_status = cds_mq_post_message(CDS_MQ_ID_WMA, &cds_message);
7220 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007221 pMac->readyToExtWoWCallback = NULL;
7222 pMac->readyToExtWoWContext = NULL;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05307223 qdf_mem_free(MsgPtr);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307224 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007225 }
7226 sme_release_global_lock(&pMac->sme);
7227 } else {
7228 pMac->readyToExtWoWCallback = NULL;
7229 pMac->readyToExtWoWContext = NULL;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05307230 qdf_mem_free(MsgPtr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007231 }
7232
7233 return status;
7234}
7235
7236/* ---------------------------------------------------------------------------
7237
7238 \fn sme_configure_app_type1_params
7239
7240 \brief
7241 SME will pass this request to lower mac to configure Indoor WoW parameters.
7242
7243 \param
7244
7245 hHal - The handle returned by mac_open.
7246
7247 wlanAppType1Params- Depicts the wlan App Type 1(Indoor) params
7248
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307249 \return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007250
7251 --------------------------------------------------------------------------- */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307252QDF_STATUS sme_configure_app_type1_params(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007253 tpSirAppType1Params wlanAppType1Params)
7254{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307255 QDF_STATUS status = QDF_STATUS_SUCCESS;
7256 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007257 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
7258 cds_msg_t cds_message;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05307259 tpSirAppType1Params MsgPtr = qdf_mem_malloc(sizeof(*MsgPtr));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007260
7261 if (!MsgPtr)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307262 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007263
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05307264 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007265 TRACE_CODE_SME_RX_HDD_CONFIG_APP_TYPE1, NO_SESSION,
7266 0));
7267
7268 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307269 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007270 /* serialize the req through MC thread */
Anurag Chouhan600c3a02016-03-01 10:33:54 +05307271 qdf_mem_copy(MsgPtr, wlanAppType1Params, sizeof(*MsgPtr));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007272 cds_message.bodyptr = MsgPtr;
7273 cds_message.type = WMA_WLAN_SET_APP_TYPE1_PARAMS;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307274 qdf_status = cds_mq_post_message(CDS_MQ_ID_WMA, &cds_message);
7275 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
Anurag Chouhan600c3a02016-03-01 10:33:54 +05307276 qdf_mem_free(MsgPtr);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307277 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007278 }
7279 sme_release_global_lock(&pMac->sme);
7280 } else {
Anurag Chouhan600c3a02016-03-01 10:33:54 +05307281 qdf_mem_free(MsgPtr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007282 }
7283
7284 return status;
7285}
7286
7287/* ---------------------------------------------------------------------------
7288
7289 \fn sme_configure_app_type2_params
7290
7291 \brief
7292 SME will pass this request to lower mac to configure Indoor WoW parameters.
7293
7294 \param
7295
7296 hHal - The handle returned by mac_open.
7297
7298 wlanAppType2Params- Depicts the wlan App Type 2 (Outdoor) params
7299
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307300 \return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007301
7302 --------------------------------------------------------------------------- */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307303QDF_STATUS sme_configure_app_type2_params(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007304 tpSirAppType2Params wlanAppType2Params)
7305{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307306 QDF_STATUS status = QDF_STATUS_SUCCESS;
7307 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007308 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
7309 cds_msg_t cds_message;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05307310 tpSirAppType2Params MsgPtr = qdf_mem_malloc(sizeof(*MsgPtr));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007311
7312 if (!MsgPtr)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307313 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007314
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05307315 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007316 TRACE_CODE_SME_RX_HDD_CONFIG_APP_TYPE2, NO_SESSION,
7317 0));
7318
7319 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307320 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007321 /* serialize the req through MC thread */
Anurag Chouhan600c3a02016-03-01 10:33:54 +05307322 qdf_mem_copy(MsgPtr, wlanAppType2Params, sizeof(*MsgPtr));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007323 cds_message.bodyptr = MsgPtr;
7324 cds_message.type = WMA_WLAN_SET_APP_TYPE2_PARAMS;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307325 qdf_status = cds_mq_post_message(CDS_MQ_ID_WMA, &cds_message);
7326 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
Anurag Chouhan600c3a02016-03-01 10:33:54 +05307327 qdf_mem_free(MsgPtr);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307328 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007329 }
7330 sme_release_global_lock(&pMac->sme);
7331 } else {
Anurag Chouhan600c3a02016-03-01 10:33:54 +05307332 qdf_mem_free(MsgPtr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007333 }
7334
7335 return status;
7336}
7337#endif
7338
7339/* ---------------------------------------------------------------------------
7340
7341 \fn sme_get_infra_session_id
7342
7343 \brief To get the session ID for infra session, if connected
7344 This is a synchronous API.
7345
7346 \param hHal - The handle returned by mac_open.
7347
7348 \return sessionid, -1 if infra session is not connected
7349
7350 -------------------------------------------------------------------------------*/
7351int8_t sme_get_infra_session_id(tHalHandle hHal)
7352{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307353 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007354 int8_t sessionid = -1;
7355 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
7356
7357 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307358 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007359
7360 sessionid = csr_get_infra_session_id(pMac);
7361
7362 sme_release_global_lock(&pMac->sme);
7363 }
7364
7365 return sessionid;
7366}
7367
7368/* ---------------------------------------------------------------------------
7369
7370 \fn sme_get_infra_operation_channel
7371
7372 \brief To get the operating channel for infra session, if connected
7373 This is a synchronous API.
7374
7375 \param hHal - The handle returned by mac_open.
7376 \param sessionId - the sessionId returned by sme_open_session.
7377
7378 \return operating channel, 0 if infra session is not connected
7379
7380 -------------------------------------------------------------------------------*/
7381uint8_t sme_get_infra_operation_channel(tHalHandle hHal, uint8_t sessionId)
7382{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307383 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007384 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
7385 uint8_t channel = 0;
7386 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307387 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007388
7389 channel = csr_get_infra_operation_channel(pMac, sessionId);
7390
7391 sme_release_global_lock(&pMac->sme);
7392 }
7393
7394 return channel;
7395}
7396
7397/* This routine will return poerating channel on which other BSS is operating to be used for concurrency mode. */
7398/* If other BSS is not up or not connected it will return 0 */
7399uint8_t sme_get_concurrent_operation_channel(tHalHandle hHal)
7400{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307401 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007402 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
7403 uint8_t channel = 0;
7404 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307405 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007406
7407 channel = csr_get_concurrent_operation_channel(pMac);
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05307408 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO_HIGH, "%s: "
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007409 " Other Concurrent Channel = %d", __func__, channel);
7410 sme_release_global_lock(&pMac->sme);
7411 }
7412
7413 return channel;
7414}
7415
7416#ifdef FEATURE_WLAN_MCC_TO_SCC_SWITCH
7417uint16_t sme_check_concurrent_channel_overlap(tHalHandle hHal, uint16_t sap_ch,
7418 eCsrPhyMode sapPhyMode,
7419 uint8_t cc_switch_mode)
7420{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307421 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007422 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
7423 uint16_t channel = 0;
7424
7425 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307426 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007427 channel =
7428 csr_check_concurrent_channel_overlap(pMac, sap_ch, sapPhyMode,
7429 cc_switch_mode);
7430 sme_release_global_lock(&pMac->sme);
7431 }
7432
7433 return channel;
7434}
7435#endif
7436
7437#ifdef FEATURE_WLAN_SCAN_PNO
Varun Reddy Yeturub43fda12015-09-10 18:16:21 -07007438/**
7439 * sme_update_roam_pno_channel_prediction_config() - Update PNO config
Krunal Soni1878d3a2016-01-14 13:00:44 -08007440 * @csr_config: config from SME context
Varun Reddy Yeturub43fda12015-09-10 18:16:21 -07007441 * @hal: Global Hal handle
7442 * @copy_from_to: Used to specify the source and destination
7443 *
7444 * Copy the PNO channel prediction configuration parameters from
7445 * SME context to MAC context or vice-versa
7446 *
7447 * Return: None
7448 */
7449void sme_update_roam_pno_channel_prediction_config(
Krunal Soni1878d3a2016-01-14 13:00:44 -08007450 tHalHandle hal, tCsrConfigParam *csr_config,
Varun Reddy Yeturub43fda12015-09-10 18:16:21 -07007451 uint8_t copy_from_to)
7452{
7453 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
7454 if (copy_from_to == SME_CONFIG_TO_ROAM_CONFIG) {
7455 mac_ctx->roam.configParam.pno_channel_prediction =
Krunal Soni1878d3a2016-01-14 13:00:44 -08007456 csr_config->pno_channel_prediction;
Varun Reddy Yeturub43fda12015-09-10 18:16:21 -07007457 mac_ctx->roam.configParam.top_k_num_of_channels =
Krunal Soni1878d3a2016-01-14 13:00:44 -08007458 csr_config->top_k_num_of_channels;
Varun Reddy Yeturub43fda12015-09-10 18:16:21 -07007459 mac_ctx->roam.configParam.stationary_thresh =
Krunal Soni1878d3a2016-01-14 13:00:44 -08007460 csr_config->stationary_thresh;
Varun Reddy Yeturub43fda12015-09-10 18:16:21 -07007461 mac_ctx->roam.configParam.channel_prediction_full_scan =
Krunal Soni1878d3a2016-01-14 13:00:44 -08007462 csr_config->channel_prediction_full_scan;
Gupta, Kapil96c7f2f2016-04-25 19:13:41 +05307463 mac_ctx->roam.configParam.pnoscan_adaptive_dwell_mode =
7464 csr_config->pnoscan_adaptive_dwell_mode;
Varun Reddy Yeturub43fda12015-09-10 18:16:21 -07007465 } else if (copy_from_to == ROAM_CONFIG_TO_SME_CONFIG) {
Krunal Soni1878d3a2016-01-14 13:00:44 -08007466 csr_config->pno_channel_prediction =
Varun Reddy Yeturub43fda12015-09-10 18:16:21 -07007467 mac_ctx->roam.configParam.pno_channel_prediction;
Krunal Soni1878d3a2016-01-14 13:00:44 -08007468 csr_config->top_k_num_of_channels =
Varun Reddy Yeturub43fda12015-09-10 18:16:21 -07007469 mac_ctx->roam.configParam.top_k_num_of_channels;
Krunal Soni1878d3a2016-01-14 13:00:44 -08007470 csr_config->stationary_thresh =
Varun Reddy Yeturub43fda12015-09-10 18:16:21 -07007471 mac_ctx->roam.configParam.stationary_thresh;
Krunal Soni1878d3a2016-01-14 13:00:44 -08007472 csr_config->channel_prediction_full_scan =
Varun Reddy Yeturub43fda12015-09-10 18:16:21 -07007473 mac_ctx->roam.configParam.channel_prediction_full_scan;
Gupta, Kapil96c7f2f2016-04-25 19:13:41 +05307474 csr_config->pnoscan_adaptive_dwell_mode =
7475 mac_ctx->roam.configParam.pnoscan_adaptive_dwell_mode;
Varun Reddy Yeturub43fda12015-09-10 18:16:21 -07007476 }
7477
7478}
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007479/******************************************************************************
7480*
7481* Name: sme_preferred_network_found_ind
7482*
7483* Description:
7484* Invoke Preferred Network Found Indication
7485*
7486* Parameters:
7487* hHal - HAL handle for device
7488* pMsg - found network description
7489*
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307490* Returns: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007491*
7492******************************************************************************/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307493QDF_STATUS sme_preferred_network_found_ind(tHalHandle hHal, void *pMsg)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007494{
7495 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307496 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007497 tSirPrefNetworkFoundInd *pPrefNetworkFoundInd =
7498 (tSirPrefNetworkFoundInd *) pMsg;
7499 uint8_t dumpSsId[SIR_MAC_MAX_SSID_LENGTH + 1];
7500 uint8_t ssIdLength = 0;
7501
7502 if (NULL == pMsg) {
7503 sms_log(pMac, LOGE, "in %s msg ptr is NULL", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307504 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007505 }
7506
7507 if (pMac->pnoOffload) {
7508 /* Call Preferred Network Found Indication callback routine. */
7509 if (pMac->sme.pref_netw_found_cb != NULL) {
7510 pMac->sme.pref_netw_found_cb(pMac->sme.
7511 preferred_network_found_ind_cb_ctx,
7512 pPrefNetworkFoundInd);
7513 }
7514 return status;
7515 }
7516
7517 if (pPrefNetworkFoundInd->ssId.length > 0) {
7518 ssIdLength = CSR_MIN(SIR_MAC_MAX_SSID_LENGTH,
7519 pPrefNetworkFoundInd->ssId.length);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05307520 qdf_mem_copy(dumpSsId, pPrefNetworkFoundInd->ssId.ssId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007521 ssIdLength);
7522 dumpSsId[ssIdLength] = 0;
7523 sms_log(pMac, LOG2, "%s:SSID=%s frame length %d",
7524 __func__, dumpSsId, pPrefNetworkFoundInd->frameLength);
7525
7526 /* Flush scan results, So as to avoid indication/updation of
7527 * stale entries, which may not have aged out during APPS collapse
7528 */
7529 sme_scan_flush_result(hHal);
7530
7531 /* Save the frame to scan result */
7532 if (pPrefNetworkFoundInd->mesgLen >
7533 sizeof(tSirPrefNetworkFoundInd)) {
7534 /* we may have a frame */
7535 status = csr_scan_save_preferred_network_found(pMac,
7536 pPrefNetworkFoundInd);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307537 if (!QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007538 sms_log(pMac, LOGE,
7539 FL(" fail to save preferred network"));
7540 }
7541 } else {
7542 sms_log(pMac, LOGE,
7543 FL(" not enough data length %d needed %zu"),
7544 pPrefNetworkFoundInd->mesgLen,
7545 sizeof(tSirPrefNetworkFoundInd));
7546 }
7547
7548 /* Call Preferred Netowrk Found Indication callback routine. */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307549 if (QDF_IS_STATUS_SUCCESS(status)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007550 && (pMac->sme.pref_netw_found_cb != NULL)) {
7551 pMac->sme.pref_netw_found_cb(pMac->sme.
7552 preferred_network_found_ind_cb_ctx,
7553 pPrefNetworkFoundInd);
7554 }
7555 } else {
7556 sms_log(pMac, LOGE, "%s: callback failed - SSID is NULL",
7557 __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307558 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007559 }
7560
7561 return status;
7562}
7563
7564#endif /* FEATURE_WLAN_SCAN_PNO */
7565
Arun Khandavalli4b55da72016-07-19 19:55:01 +05307566/**
Manikandan Mohandcc21ba2016-03-15 14:31:56 -07007567 * sme_set_tsfcb() - Set callback for TSF capture
Manikandan Mohan976e7562016-03-15 16:33:31 -07007568 * @h_hal: Handler return by mac_open
Manikandan Mohandcc21ba2016-03-15 14:31:56 -07007569 * @cb_fn: Callback function pointer
7570 * @db_ctx: Callback data
7571 *
7572 * Return: QDF_STATUS
7573 */
Manikandan Mohan976e7562016-03-15 16:33:31 -07007574QDF_STATUS sme_set_tsfcb(tHalHandle h_hal,
Manikandan Mohandcc21ba2016-03-15 14:31:56 -07007575 int (*cb_fn)(void *cb_ctx, struct stsf *ptsf), void *cb_ctx)
7576{
Manikandan Mohan976e7562016-03-15 16:33:31 -07007577 tpAniSirGlobal mac = PMAC_STRUCT(h_hal);
Manikandan Mohandcc21ba2016-03-15 14:31:56 -07007578 QDF_STATUS status;
7579
Manikandan Mohan976e7562016-03-15 16:33:31 -07007580 status = sme_acquire_global_lock(&mac->sme);
Manikandan Mohandcc21ba2016-03-15 14:31:56 -07007581 if (QDF_IS_STATUS_SUCCESS(status)) {
Manikandan Mohan976e7562016-03-15 16:33:31 -07007582 mac->sme.get_tsf_cb = cb_fn;
7583 mac->sme.get_tsf_cxt = cb_ctx;
7584 sme_release_global_lock(&mac->sme);
Manikandan Mohandcc21ba2016-03-15 14:31:56 -07007585 }
7586 return status;
7587}
7588
Arun Khandavalli4b55da72016-07-19 19:55:01 +05307589/**
7590 * sme_reset_tsfcb() - Reset callback for TSF capture
7591 * @h_hal: Handler return by mac_open
7592 *
7593 * This function reset the tsf capture callback to SME
7594 *
7595 * Return: QDF_STATUS
7596 */
7597QDF_STATUS sme_reset_tsfcb(tHalHandle h_hal)
7598{
7599 tpAniSirGlobal mac;
7600 QDF_STATUS status;
7601
7602 if (!h_hal) {
7603 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
7604 FL("h_hal is not valid"));
7605 return QDF_STATUS_E_INVAL;
7606 }
7607 mac = PMAC_STRUCT(h_hal);
7608
7609 status = sme_acquire_global_lock(&mac->sme);
7610 if (QDF_IS_STATUS_SUCCESS(status)) {
7611 mac->sme.get_tsf_cb = NULL;
7612 mac->sme.get_tsf_cxt = NULL;
7613 sme_release_global_lock(&mac->sme);
7614 }
7615 return status;
7616}
7617
Manikandan Mohan976e7562016-03-15 16:33:31 -07007618#ifdef WLAN_FEATURE_TSF
7619/*
7620 * sme_set_tsf_gpio() - set gpio pin that be toggled when capture tef
7621 * @h_hal: Handler return by mac_open
7622 * @pinvalue: gpio pin id
7623 *
7624 * Return: QDF_STATUS
7625 */
7626QDF_STATUS sme_set_tsf_gpio(tHalHandle h_hal, uint32_t pinvalue)
7627{
7628 QDF_STATUS status;
7629 cds_msg_t tsf_msg = {0};
7630 tpAniSirGlobal mac = PMAC_STRUCT(h_hal);
7631
7632 status = sme_acquire_global_lock(&mac->sme);
7633 if (QDF_IS_STATUS_SUCCESS(status)) {
7634 tsf_msg.type = WMA_TSF_GPIO_PIN;
7635 tsf_msg.reserved = 0;
7636 tsf_msg.bodyval = pinvalue;
7637
7638 status = cds_mq_post_message(CDS_MQ_ID_WMA, &tsf_msg);
7639 if (!QDF_IS_STATUS_SUCCESS(status)) {
7640 sms_log(mac, LOGE, "Unable to post WMA_TSF_GPIO_PIN");
7641 status = QDF_STATUS_E_FAILURE;
7642 }
7643 sme_release_global_lock(&mac->sme);
7644 }
7645 return status;
7646}
7647#endif
7648
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307649QDF_STATUS sme_get_cfg_valid_channels(tHalHandle hHal, uint8_t *aValidChannels,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007650 uint32_t *len)
7651{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307652 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007653 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
7654
7655 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307656 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007657 status = csr_get_cfg_valid_channels(pMac, aValidChannels, len);
7658 sme_release_global_lock(&pMac->sme);
7659 }
7660
7661 return status;
7662}
7663
7664/* ---------------------------------------------------------------------------
7665
7666 \fn sme_handle_change_country_code
7667
7668 \brief Change Country code, Reg Domain and channel list
7669
7670 \details Country Code Priority
7671 If Supplicant country code is priority than 11d is disabled.
7672 If 11D is enabled, we update the country code after every scan.
7673 Hence when Supplicant country code is priority, we don't need 11D info.
7674 Country code from Supplicant is set as current courtry code.
7675 User can send reset command XX (instead of country code) to reset the
7676 country code to default values.
7677 If 11D is priority,
7678 Than Supplicant country code code is set to default code. But 11D code is set as current country code
7679
7680 \param pMac - The handle returned by mac_open.
7681 \param pMsgBuf - MSG Buffer
7682
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307683 \return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007684
7685 -------------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307686QDF_STATUS sme_handle_change_country_code(tpAniSirGlobal pMac, void *pMsgBuf)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007687{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307688 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007689 tAniChangeCountryCodeReq *pMsg;
7690 v_REGDOMAIN_t domainIdIoctl;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307691 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Amar Singhala297bfa2015-10-15 15:07:29 -07007692 static uint8_t default_country[CDS_COUNTRY_CODE_LEN + 1];
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007693 pMsg = (tAniChangeCountryCodeReq *) pMsgBuf;
7694
7695 /*
7696 * if the reset Supplicant country code command is triggered,
7697 * enable 11D, reset the country code and return
7698 */
Ankit Guptaa5076012016-09-14 11:32:19 -07007699 if (!qdf_mem_cmp(pMsg->countryCode, SME_INVALID_COUNTRY_CODE, 2)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007700 pMac->roam.configParam.Is11dSupportEnabled =
7701 pMac->roam.configParam.Is11dSupportEnabledOriginal;
7702
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307703 qdf_status = cds_read_default_country(default_country);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007704
7705 /* read the country code and use it */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307706 if (QDF_IS_STATUS_SUCCESS(qdf_status)) {
Anurag Chouhan600c3a02016-03-01 10:33:54 +05307707 qdf_mem_copy(pMsg->countryCode,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007708 default_country,
7709 WNI_CFG_COUNTRY_CODE_LEN);
7710 } else {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307711 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007712 return status;
7713 }
7714 /*
7715 * Update the 11d country to default country so that when
7716 * callback is received for this default country, driver will
7717 * not disable the 11d taking it as valid country by user.
7718 */
7719 sms_log(pMac, LOG1,
7720 FL("Set default country code (%c%c) as invalid country received"),
7721 pMsg->countryCode[0], pMsg->countryCode[1]);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05307722 qdf_mem_copy(pMac->scan.countryCode11d,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007723 pMsg->countryCode,
7724 WNI_CFG_COUNTRY_CODE_LEN);
7725 } else {
7726 /* if Supplicant country code has priority, disable 11d */
7727 if (pMac->roam.configParam.fSupplicantCountryCodeHasPriority &&
7728 pMsg->countryFromUserSpace) {
7729 pMac->roam.configParam.Is11dSupportEnabled = false;
7730 }
7731 }
7732
7733 if (pMac->roam.configParam.Is11dSupportEnabled)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307734 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007735
7736 /* Set Current Country code and Current Regulatory domain */
7737 status = csr_set_country_code(pMac, pMsg->countryCode);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307738 if (QDF_STATUS_SUCCESS != status) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007739 /* Supplicant country code failed. So give 11D priority */
7740 pMac->roam.configParam.Is11dSupportEnabled =
7741 pMac->roam.configParam.Is11dSupportEnabledOriginal;
7742 sms_log(pMac, LOGE, "Set Country Code Fail %d", status);
7743 return status;
7744 }
7745
7746 /* overwrite the defualt country code */
Anurag Chouhan600c3a02016-03-01 10:33:54 +05307747 qdf_mem_copy(pMac->scan.countryCodeDefault,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007748 pMac->scan.countryCodeCurrent, WNI_CFG_COUNTRY_CODE_LEN);
7749
7750 /* Get Domain ID from country code */
7751 status = csr_get_regulatory_domain_for_country(pMac,
7752 pMac->scan.countryCodeCurrent,
7753 (v_REGDOMAIN_t *) &
Amar Singhala297bfa2015-10-15 15:07:29 -07007754 domainIdIoctl,
7755 SOURCE_QUERY);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307756 if (status != QDF_STATUS_SUCCESS) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007757 sms_log(pMac, LOGE, FL(" fail to get regId %d"), domainIdIoctl);
7758 return status;
7759 } else if (REGDOMAIN_WORLD == domainIdIoctl) {
7760 /* Supplicant country code is invalid, so we are on world mode now. So
7761 give 11D chance to update */
7762 pMac->roam.configParam.Is11dSupportEnabled =
7763 pMac->roam.configParam.Is11dSupportEnabledOriginal;
7764 sms_log(pMac, LOG1, FL("Country Code unrecognized by driver"));
7765 }
7766
7767 status = wma_set_reg_domain(pMac, domainIdIoctl);
7768
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307769 if (status != QDF_STATUS_SUCCESS) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007770 sms_log(pMac, LOGE, FL(" fail to set regId %d"), domainIdIoctl);
7771 return status;
7772 } else {
7773 /* if 11d has priority, clear currentCountryBssid & countryCode11d to get */
7774 /* set again if we find AP with 11d info during scan */
7775 if (!pMac->roam.configParam.fSupplicantCountryCodeHasPriority) {
7776 sms_log(pMac, LOGW,
7777 FL
7778 ("Clearing currentCountryBssid, countryCode11d"));
Anurag Chouhan600c3a02016-03-01 10:33:54 +05307779 qdf_mem_zero(&pMac->scan.currentCountryBssid,
Anurag Chouhan6d760662016-02-20 16:05:43 +05307780 sizeof(struct qdf_mac_addr));
Anurag Chouhan600c3a02016-03-01 10:33:54 +05307781 qdf_mem_zero(pMac->scan.countryCode11d,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007782 sizeof(pMac->scan.countryCode11d));
7783 }
7784 }
7785
7786 if (pMsg->changeCCCallback) {
7787 ((tSmeChangeCountryCallback) (pMsg->changeCCCallback))((void *)
7788 pMsg->
7789 pDevContext);
7790 }
7791
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307792 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007793}
7794
7795/**
Amar Singhal7f1f3ec2015-10-13 17:14:08 -07007796 * sme_handle_generic_change_country_code() - handles country ch req
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007797 * @mac_ctx: mac global context
7798 * @msg: request msg packet
7799 *
7800 * If Supplicant country code is priority than 11d is disabled.
7801 * If 11D is enabled, we update the country code after every scan.
7802 * Hence when Supplicant country code is priority, we don't need 11D info.
7803 * Country code from Supplicant is set as current country code.
7804 *
7805 * Return: status of operation
7806 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307807QDF_STATUS
Amar Singhal7f1f3ec2015-10-13 17:14:08 -07007808sme_handle_generic_change_country_code(tpAniSirGlobal mac_ctx,
7809 void *pMsgBuf)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007810{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307811 QDF_STATUS status = QDF_STATUS_SUCCESS;
Amar Singhal7f1f3ec2015-10-13 17:14:08 -07007812 v_REGDOMAIN_t reg_domain_id = 0;
Amar Singhalb6d0dc42016-10-19 09:45:05 -07007813 bool user_ctry_priority =
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007814 mac_ctx->roam.configParam.fSupplicantCountryCodeHasPriority;
Amar Singhal7f1f3ec2015-10-13 17:14:08 -07007815 tAniGenericChangeCountryCodeReq *msg = pMsgBuf;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007816
7817 sms_log(mac_ctx, LOG1, FL(" called"));
Amar Singhal7f1f3ec2015-10-13 17:14:08 -07007818
Amar Singhalb6d0dc42016-10-19 09:45:05 -07007819 if (!mac_ctx->is_11d_hint) {
7820 if (user_ctry_priority)
7821 mac_ctx->roam.configParam.Is11dSupportEnabled = false;
7822 else {
7823 if (mac_ctx->roam.configParam.Is11dSupportEnabled &&
7824 mac_ctx->scan.countryCode11d[0] != 0) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007825
Amar Singhalb6d0dc42016-10-19 09:45:05 -07007826 sms_log(mac_ctx, LOGW,
7827 FL("restore 11d"));
7828
7829 status = csr_get_regulatory_domain_for_country(
7830 mac_ctx,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007831 mac_ctx->scan.countryCode11d,
Amar Singhalb6d0dc42016-10-19 09:45:05 -07007832 &reg_domain_id,
Amar Singhala297bfa2015-10-15 15:07:29 -07007833 SOURCE_11D);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007834
Amar Singhalb6d0dc42016-10-19 09:45:05 -07007835 return QDF_STATUS_E_FAILURE;
7836 }
7837 }
7838 } else {
7839 /* if kernel gets invalid country code; it
7840 * resets the country code to world
7841 */
7842 if (('0' != msg->countryCode[0]) ||
7843 ('0' != msg->countryCode[1]))
7844 qdf_mem_copy(mac_ctx->scan.countryCode11d,
7845 msg->countryCode,
7846 WNI_CFG_COUNTRY_CODE_LEN);
7847 mac_ctx->is_11d_hint = false;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007848 }
Amar Singhal7f1f3ec2015-10-13 17:14:08 -07007849
Amar Singhalb6d0dc42016-10-19 09:45:05 -07007850 qdf_mem_copy(mac_ctx->scan.countryCodeCurrent,
7851 msg->countryCode,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007852 WNI_CFG_COUNTRY_CODE_LEN);
Amar Singhal9d5b1fe2016-10-16 20:16:05 -07007853
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007854 /* get the channels based on new cc */
7855 status = csr_get_channel_and_power_list(mac_ctx);
7856
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307857 if (status != QDF_STATUS_SUCCESS) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007858 sms_log(mac_ctx, LOGE, FL("fail to get Channels"));
7859 return status;
7860 }
Amar Singhalb6d0dc42016-10-19 09:45:05 -07007861
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007862 /* reset info based on new cc, and we are done */
7863 csr_apply_channel_power_info_wrapper(mac_ctx);
7864
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007865 csr_scan_filter_results(mac_ctx);
Amar Singhalb6d0dc42016-10-19 09:45:05 -07007866
7867 /* scans after the country is set by User hints or
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007868 * Country IE
7869 */
7870 mac_ctx->scan.curScanType = eSIR_ACTIVE_SCAN;
Amar Singhal9d5b1fe2016-10-16 20:16:05 -07007871
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007872 sme_disconnect_connected_sessions(mac_ctx);
Amar Singhalb6d0dc42016-10-19 09:45:05 -07007873
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007874 sms_log(mac_ctx, LOG1, FL(" returned"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307875 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007876}
7877
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007878static bool
7879sme_search_in_base_ch_lst(tpAniSirGlobal mac_ctx, uint8_t curr_ch)
7880{
7881 uint8_t i;
7882 tCsrChannel *ch_lst_info;
7883 ch_lst_info = &mac_ctx->scan.base_channels;
7884 for (i = 0; i < ch_lst_info->numChannels; i++) {
7885 if (ch_lst_info->channelList[i] == curr_ch)
7886 return true;
7887 }
7888
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007889 return false;
7890}
7891/**
7892 * sme_disconnect_connected_sessions() - Disconnect STA and P2P client session
7893 * if channel is not supported
7894 * @mac_ctx: mac global context
7895 *
7896 * If new country code does not support the channel on which STA/P2P client
7897 * is connetced, it sends the disconnect to the AP/P2P GO
7898 *
7899 * Return: void
7900 */
7901void sme_disconnect_connected_sessions(tpAniSirGlobal mac_ctx)
7902{
7903 uint8_t session_id, found = false;
7904 uint8_t curr_ch;
7905
7906 for (session_id = 0; session_id < CSR_ROAM_SESSION_MAX; session_id++) {
7907 if (!csr_is_session_client_and_connected(mac_ctx, session_id))
7908 continue;
7909 found = false;
7910 /* Session is connected.Check the channel */
7911 curr_ch = csr_get_infra_operation_channel(mac_ctx,
7912 session_id);
7913 sms_log(mac_ctx, LOGW,
7914 FL("Current Operating channel : %d, session :%d"),
7915 curr_ch, session_id);
7916 found = sme_search_in_base_ch_lst(mac_ctx, curr_ch);
7917 if (!found) {
7918 sms_log(mac_ctx, LOGW, FL("Disconnect Session :%d"),
7919 session_id);
7920 csr_roam_disconnect(mac_ctx, session_id,
7921 eCSR_DISCONNECT_REASON_UNSPECIFIED);
7922 }
7923 }
7924}
7925
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007926#ifdef WLAN_FEATURE_PACKET_FILTERING
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307927QDF_STATUS sme_8023_multicast_list(tHalHandle hHal, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007928 tpSirRcvFltMcAddrList pMulticastAddrs)
7929{
7930 tpSirRcvFltMcAddrList request_buf;
7931 cds_msg_t msg;
7932 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
7933 tCsrRoamSession *pSession = NULL;
7934
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05307935 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO, "%s: "
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007936 "ulMulticastAddrCnt=%d, multicastAddr[0]=%p", __func__,
7937 pMulticastAddrs->ulMulticastAddrCnt,
Srinivas Girigowda98530492015-11-20 17:39:24 -08007938 pMulticastAddrs->multicastAddr[0].bytes);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007939
Ravi Joshi4f447cb2016-07-19 13:42:01 -07007940 /* Find the connected Infra / P2P_client connected session */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007941 if (CSR_IS_SESSION_VALID(pMac, sessionId) &&
Ravi Joshi4f447cb2016-07-19 13:42:01 -07007942 (csr_is_conn_state_infra(pMac, sessionId) ||
7943 csr_is_ndi_started(pMac, sessionId))) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007944 pSession = CSR_GET_SESSION(pMac, sessionId);
7945 }
7946
7947 if (pSession == NULL) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05307948 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_WARN,
Srinivas Girigowdaf2599dd2015-11-16 18:20:46 -08007949 "%s: Unable to find the session Id: %d", __func__,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007950 sessionId);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307951 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007952 }
7953
Anurag Chouhan600c3a02016-03-01 10:33:54 +05307954 request_buf = qdf_mem_malloc(sizeof(tSirRcvFltMcAddrList));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007955 if (NULL == request_buf) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05307956 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007957 "%s: Not able to "
7958 "allocate memory for 8023 Multicast List request",
7959 __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307960 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007961 }
7962
Ravi Joshi4f447cb2016-07-19 13:42:01 -07007963 if (!csr_is_conn_state_connected_infra(pMac, sessionId) &&
7964 !csr_is_ndi_started(pMac, sessionId)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05307965 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Ravi Joshi4f447cb2016-07-19 13:42:01 -07007966 "%s: Request ignored, session %d is not connected or started",
7967 __func__, sessionId);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05307968 qdf_mem_free(request_buf);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307969 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007970 }
7971
Anurag Chouhan600c3a02016-03-01 10:33:54 +05307972 qdf_mem_copy(request_buf, pMulticastAddrs,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007973 sizeof(tSirRcvFltMcAddrList));
7974
Anurag Chouhanc5548422016-02-24 18:33:27 +05307975 qdf_copy_macaddr(&request_buf->self_macaddr, &pSession->selfMacAddr);
7976 qdf_copy_macaddr(&request_buf->bssid,
Srinivas Girigowda98530492015-11-20 17:39:24 -08007977 &pSession->connectedProfile.bssid);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007978
7979 msg.type = WMA_8023_MULTICAST_LIST_REQ;
7980 msg.reserved = 0;
7981 msg.bodyptr = request_buf;
Sreelakshmi Konamki6a065362016-05-31 16:05:01 +05307982 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
7983 sessionId, msg.type));
Anurag Chouhan6d760662016-02-20 16:05:43 +05307984 if (QDF_STATUS_SUCCESS != cds_mq_post_message(QDF_MODULE_ID_WMA, &msg)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05307985 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007986 "%s: Not able to "
7987 "post WMA_8023_MULTICAST_LIST message to WMA",
7988 __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05307989 qdf_mem_free(request_buf);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307990 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007991 }
7992
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307993 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007994}
7995
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307996QDF_STATUS sme_receive_filter_set_filter(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007997 tpSirRcvPktFilterCfgType pRcvPktFilterCfg,
7998 uint8_t sessionId)
7999{
8000 tpSirRcvPktFilterCfgType request_buf;
8001 int32_t allocSize;
8002 cds_msg_t msg;
8003 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
8004 tCsrRoamSession *pSession = CSR_GET_SESSION(pMac, sessionId);
8005 uint8_t idx = 0;
8006
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308007 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO, "%s: filterType=%d, "
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008008 "filterId = %d", __func__,
8009 pRcvPktFilterCfg->filterType, pRcvPktFilterCfg->filterId);
8010
8011 allocSize = sizeof(tSirRcvPktFilterCfgType);
8012
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308013 request_buf = qdf_mem_malloc(allocSize);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008014
8015 if (NULL == request_buf) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308016 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008017 "%s: Not able to "
8018 "allocate memory for Receive Filter Set Filter request",
8019 __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308020 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008021 }
8022
8023 if (NULL == pSession) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308024 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008025 "%s: Session Not found ", __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308026 qdf_mem_free(request_buf);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308027 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008028 }
8029
Anurag Chouhanc5548422016-02-24 18:33:27 +05308030 qdf_copy_macaddr(&pRcvPktFilterCfg->self_macaddr,
Srinivas Girigowda98530492015-11-20 17:39:24 -08008031 &pSession->selfMacAddr);
Anurag Chouhanc5548422016-02-24 18:33:27 +05308032 qdf_copy_macaddr(&pRcvPktFilterCfg->bssid,
Srinivas Girigowda98530492015-11-20 17:39:24 -08008033 &pSession->connectedProfile.bssid);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308034 qdf_mem_copy(request_buf, pRcvPktFilterCfg, allocSize);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008035
8036 msg.type = WMA_RECEIVE_FILTER_SET_FILTER_REQ;
8037 msg.reserved = 0;
8038 msg.bodyptr = request_buf;
Sreelakshmi Konamki6a065362016-05-31 16:05:01 +05308039 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
8040 sessionId, msg.type));
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308041 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO, "Pkt Flt Req : "
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008042 "FT %d FID %d ",
8043 request_buf->filterType, request_buf->filterId);
8044
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308045 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO, "Pkt Flt Req : "
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008046 "params %d CT %d",
8047 request_buf->numFieldParams, request_buf->coalesceTime);
8048
8049 for (idx = 0; idx < request_buf->numFieldParams; idx++) {
8050
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308051 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008052 "Proto %d Comp Flag %d ",
8053 request_buf->paramsData[idx].protocolLayer,
8054 request_buf->paramsData[idx].cmpFlag);
8055
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308056 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008057 "Data Offset %d Data Len %d",
8058 request_buf->paramsData[idx].dataOffset,
8059 request_buf->paramsData[idx].dataLength);
8060
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308061 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008062 "CData: %d:%d:%d:%d:%d:%d",
8063 request_buf->paramsData[idx].compareData[0],
8064 request_buf->paramsData[idx].compareData[1],
8065 request_buf->paramsData[idx].compareData[2],
8066 request_buf->paramsData[idx].compareData[3],
8067 request_buf->paramsData[idx].compareData[4],
8068 request_buf->paramsData[idx].compareData[5]);
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 "MData: %d:%d:%d:%d:%d:%d",
8072 request_buf->paramsData[idx].dataMask[0],
8073 request_buf->paramsData[idx].dataMask[1],
8074 request_buf->paramsData[idx].dataMask[2],
8075 request_buf->paramsData[idx].dataMask[3],
8076 request_buf->paramsData[idx].dataMask[4],
8077 request_buf->paramsData[idx].dataMask[5]);
8078
8079 }
8080
Anurag Chouhan6d760662016-02-20 16:05:43 +05308081 if (QDF_STATUS_SUCCESS != cds_mq_post_message(QDF_MODULE_ID_WMA, &msg)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308082 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008083 "%s: Not able to post "
8084 "WMA_RECEIVE_FILTER_SET_FILTER message to WMA",
8085 __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308086 qdf_mem_free(request_buf);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308087 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008088 }
8089
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308090 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008091}
8092
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308093QDF_STATUS sme_receive_filter_clear_filter(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008094 tpSirRcvFltPktClearParam
8095 pRcvFltPktClearParam, uint8_t sessionId)
8096{
8097 tpSirRcvFltPktClearParam request_buf;
8098 cds_msg_t msg;
8099 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
8100 tCsrRoamSession *pSession = CSR_GET_SESSION(pMac, sessionId);
8101
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308102 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO, "%s: filterId = %d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008103 __func__, pRcvFltPktClearParam->filterId);
8104
Srinivas Girigowda98530492015-11-20 17:39:24 -08008105 if (NULL == pSession) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308106 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Srinivas Girigowda98530492015-11-20 17:39:24 -08008107 "%s: Session Not found", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308108 return QDF_STATUS_E_FAILURE;
Srinivas Girigowda98530492015-11-20 17:39:24 -08008109 }
8110
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308111 request_buf = qdf_mem_malloc(sizeof(tSirRcvFltPktClearParam));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008112 if (NULL == request_buf) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308113 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008114 "%s: Not able to allocate memory for Receive Filter "
8115 "Clear Filter request", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308116 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008117 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008118
Anurag Chouhanc5548422016-02-24 18:33:27 +05308119 qdf_copy_macaddr(&pRcvFltPktClearParam->self_macaddr,
Srinivas Girigowda98530492015-11-20 17:39:24 -08008120 &pSession->selfMacAddr);
Anurag Chouhanc5548422016-02-24 18:33:27 +05308121 qdf_copy_macaddr(&pRcvFltPktClearParam->bssid,
Srinivas Girigowda98530492015-11-20 17:39:24 -08008122 &pSession->connectedProfile.bssid);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008123
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308124 qdf_mem_copy(request_buf, pRcvFltPktClearParam,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008125 sizeof(tSirRcvFltPktClearParam));
8126
8127 msg.type = WMA_RECEIVE_FILTER_CLEAR_FILTER_REQ;
8128 msg.reserved = 0;
8129 msg.bodyptr = request_buf;
Sreelakshmi Konamki6a065362016-05-31 16:05:01 +05308130 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
8131 sessionId, msg.type));
Anurag Chouhan6d760662016-02-20 16:05:43 +05308132 if (QDF_STATUS_SUCCESS != cds_mq_post_message(QDF_MODULE_ID_WMA, &msg)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308133 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008134 "%s: Not able to post "
8135 "WMA_RECEIVE_FILTER_CLEAR_FILTER message to WMA",
8136 __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308137 qdf_mem_free(request_buf);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308138 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008139 }
8140
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308141 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008142}
8143#endif /* WLAN_FEATURE_PACKET_FILTERING */
8144
8145/* ---------------------------------------------------------------------------
8146
8147 \fn sme_is_channel_valid
8148
8149 \brief To check if the channel is valid for currently established domain
8150 This is a synchronous API.
8151
8152 \param hHal - The handle returned by mac_open.
8153 \param channel - channel to verify
8154
8155 \return true/false, true if channel is valid
8156
8157 -------------------------------------------------------------------------------*/
8158bool sme_is_channel_valid(tHalHandle hHal, uint8_t channel)
8159{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308160 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008161 bool valid = false;
8162 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
8163
8164 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308165 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008166
8167 valid = csr_roam_is_channel_valid(pMac, channel);
8168
8169 sme_release_global_lock(&pMac->sme);
8170 }
8171
8172 return valid;
8173}
8174
8175/* ---------------------------------------------------------------------------
8176 \fn sme_set_freq_band
8177 \brief Used to set frequency band.
8178 \param hHal
8179 \param sessionId - Session Identifier
8180 \eBand band value to be configured
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308181 \- return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008182 -------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308183QDF_STATUS sme_set_freq_band(tHalHandle hHal, uint8_t sessionId, eCsrBand eBand)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008184{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308185 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008186 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
8187
8188 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308189 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008190 status = csr_set_band(hHal, sessionId, eBand);
8191 sme_release_global_lock(&pMac->sme);
8192 }
8193 return status;
8194}
8195
8196/* ---------------------------------------------------------------------------
8197 \fn sme_get_freq_band
8198 \brief Used to get the current band settings.
8199 \param hHal
8200 \pBand pointer to hold band value
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308201 \- return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008202 -------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308203QDF_STATUS sme_get_freq_band(tHalHandle hHal, eCsrBand *pBand)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008204{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308205 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008206 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
8207
8208 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308209 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008210 *pBand = csr_get_current_band(hHal);
8211 sme_release_global_lock(&pMac->sme);
8212 }
8213 return status;
8214}
8215
8216/* ---------------------------------------------------------------------------
8217 \fn sme_set_max_tx_power_per_band
8218
8219 \brief Set the Maximum Transmit Power specific to band dynamically.
8220 Note: this setting will not persist over reboots.
8221
8222 \param band
8223 \param power to set in dB
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308224 \- return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008225
8226 ----------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308227QDF_STATUS sme_set_max_tx_power_per_band(eCsrBand band, int8_t dB)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008228{
8229 cds_msg_t msg;
8230 tpMaxTxPowerPerBandParams pMaxTxPowerPerBandParams = NULL;
8231
8232 pMaxTxPowerPerBandParams =
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308233 qdf_mem_malloc(sizeof(tMaxTxPowerPerBandParams));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008234 if (NULL == pMaxTxPowerPerBandParams) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308235 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008236 "%s:Not able to allocate memory for pMaxTxPowerPerBandParams",
8237 __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308238 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008239 }
8240
8241 pMaxTxPowerPerBandParams->power = dB;
8242 pMaxTxPowerPerBandParams->bandInfo = band;
8243
8244 msg.type = WMA_SET_MAX_TX_POWER_PER_BAND_REQ;
8245 msg.reserved = 0;
8246 msg.bodyptr = pMaxTxPowerPerBandParams;
Sreelakshmi Konamki6a065362016-05-31 16:05:01 +05308247 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
8248 NO_SESSION, msg.type));
Anurag Chouhan6d760662016-02-20 16:05:43 +05308249 if (QDF_STATUS_SUCCESS != cds_mq_post_message(QDF_MODULE_ID_WMA, &msg)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308250 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008251 "%s:Not able to post WMA_SET_MAX_TX_POWER_PER_BAND_REQ",
8252 __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308253 qdf_mem_free(pMaxTxPowerPerBandParams);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308254 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008255 }
8256
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308257 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008258}
8259
8260/* ---------------------------------------------------------------------------
8261
8262 \fn sme_set_max_tx_power
8263
8264 \brief Set the Maximum Transmit Power dynamically. Note: this setting will
8265 not persist over reboots.
8266
8267 \param hHal
8268 \param pBssid BSSID to set the power cap for
8269 \param pBssid pSelfMacAddress self MAC Address
8270 \param pBssid power to set in dB
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308271 \- return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008272
8273 -------------------------------------------------------------------------------*/
Anurag Chouhan6d760662016-02-20 16:05:43 +05308274QDF_STATUS sme_set_max_tx_power(tHalHandle hHal, struct qdf_mac_addr pBssid,
8275 struct qdf_mac_addr pSelfMacAddress, int8_t dB)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008276{
8277 cds_msg_t msg;
8278 tpMaxTxPowerParams pMaxTxParams = NULL;
8279
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308280 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008281 TRACE_CODE_SME_RX_HDD_SET_MAXTXPOW, NO_SESSION, 0));
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308282 pMaxTxParams = qdf_mem_malloc(sizeof(tMaxTxPowerParams));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008283 if (NULL == pMaxTxParams) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308284 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008285 "%s: Not able to allocate memory for pMaxTxParams",
8286 __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308287 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008288 }
8289
Anurag Chouhanc5548422016-02-24 18:33:27 +05308290 qdf_copy_macaddr(&pMaxTxParams->bssId, &pBssid);
8291 qdf_copy_macaddr(&pMaxTxParams->selfStaMacAddr, &pSelfMacAddress);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008292 pMaxTxParams->power = dB;
8293
8294 msg.type = WMA_SET_MAX_TX_POWER_REQ;
8295 msg.reserved = 0;
8296 msg.bodyptr = pMaxTxParams;
8297
Anurag Chouhan6d760662016-02-20 16:05:43 +05308298 if (QDF_STATUS_SUCCESS != cds_mq_post_message(QDF_MODULE_ID_WMA, &msg)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308299 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008300 "%s: Not able to post WMA_SET_MAX_TX_POWER_REQ message to WMA",
8301 __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308302 qdf_mem_free(pMaxTxParams);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308303 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008304 }
8305
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308306 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008307}
8308
8309/* ---------------------------------------------------------------------------
8310
8311 \fn sme_set_custom_mac_addr
8312
8313 \brief Set the customer Mac Address.
8314
8315 \param customMacAddr customer MAC Address
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308316 \- return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008317
8318 ---------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308319QDF_STATUS sme_set_custom_mac_addr(tSirMacAddr customMacAddr)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008320{
8321 cds_msg_t msg;
8322 tSirMacAddr *pBaseMacAddr;
8323
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308324 pBaseMacAddr = qdf_mem_malloc(sizeof(tSirMacAddr));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008325 if (NULL == pBaseMacAddr) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308326 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008327 FL("Not able to allocate memory for pBaseMacAddr"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308328 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008329 }
8330
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308331 qdf_mem_copy(*pBaseMacAddr, customMacAddr, sizeof(tSirMacAddr));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008332
8333 msg.type = SIR_HAL_SET_BASE_MACADDR_IND;
8334 msg.reserved = 0;
8335 msg.bodyptr = pBaseMacAddr;
8336
Anurag Chouhan6d760662016-02-20 16:05:43 +05308337 if (QDF_STATUS_SUCCESS != cds_mq_post_message(QDF_MODULE_ID_WMA, &msg)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308338 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008339 FL
8340 ("Not able to post SIR_HAL_SET_BASE_MACADDR_IND message to WMA"));
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308341 qdf_mem_free(pBaseMacAddr);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308342 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008343 }
8344
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308345 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008346}
8347
8348/* ----------------------------------------------------------------------------
8349 \fn sme_set_tx_power
8350 \brief Set Transmit Power dynamically.
8351 \param hHal
8352 \param sessionId Target Session ID
8353 \pBSSId BSSID
8354 \dev_mode dev_mode such as station, P2PGO, SAP
8355 \param dBm power to set
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308356 \- return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008357 ---------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308358QDF_STATUS sme_set_tx_power(tHalHandle hHal, uint8_t sessionId,
Anurag Chouhan6d760662016-02-20 16:05:43 +05308359 struct qdf_mac_addr pBSSId,
8360 enum tQDF_ADAPTER_MODE dev_mode, int dBm)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008361{
8362 cds_msg_t msg;
8363 tpMaxTxPowerParams pTxParams = NULL;
8364 int8_t power = (int8_t) dBm;
8365
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308366 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008367 TRACE_CODE_SME_RX_HDD_SET_TXPOW, sessionId, 0));
8368
8369 /* make sure there is no overflow */
8370 if ((int)power != dBm) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308371 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008372 "%s: error, invalid power = %d", __func__, dBm);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308373 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008374 }
8375
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308376 pTxParams = qdf_mem_malloc(sizeof(tMaxTxPowerParams));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008377 if (NULL == pTxParams) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308378 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008379 "%s: Not able to allocate memory for pTxParams",
8380 __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308381 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008382 }
8383
Anurag Chouhanc5548422016-02-24 18:33:27 +05308384 qdf_copy_macaddr(&pTxParams->bssId, &pBSSId);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008385 pTxParams->power = power; /* unit is dBm */
8386 pTxParams->dev_mode = dev_mode;
8387 msg.type = WMA_SET_TX_POWER_REQ;
8388 msg.reserved = 0;
8389 msg.bodyptr = pTxParams;
8390
Anurag Chouhan6d760662016-02-20 16:05:43 +05308391 if (QDF_STATUS_SUCCESS != cds_mq_post_message(QDF_MODULE_ID_WMA, &msg)) {
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: failed to post WMA_SET_TX_POWER_REQ to WMA",
8394 __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308395 qdf_mem_free(pTxParams);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308396 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008397 }
8398
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308399 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008400}
8401
Selvaraj, Sridhar7231c5f2016-09-28 12:42:33 +05308402QDF_STATUS sme_update_session_param(tHalHandle hal, uint8_t session_id,
8403 uint32_t param_type, uint32_t param_val)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008404{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308405 QDF_STATUS status = QDF_STATUS_SUCCESS;
Selvaraj, Sridhar7231c5f2016-09-28 12:42:33 +05308406 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008407 uint16_t len;
8408
Selvaraj, Sridhar7231c5f2016-09-28 12:42:33 +05308409 status = sme_acquire_global_lock(&mac_ctx->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308410 if (QDF_IS_STATUS_SUCCESS(status)) {
Selvaraj, Sridhar7231c5f2016-09-28 12:42:33 +05308411 struct sir_update_session_param *msg;
8412 tCsrRoamSession *session = CSR_GET_SESSION(mac_ctx, session_id);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008413
Selvaraj, Sridhar7231c5f2016-09-28 12:42:33 +05308414 if (!session) {
8415 sms_log(mac_ctx, LOGE, FL("session %d not found"),
8416 session_id);
8417 sme_release_global_lock(&mac_ctx->sme);
8418 return status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008419 }
8420
Selvaraj, Sridhar7231c5f2016-09-28 12:42:33 +05308421 if (!session->sessionActive)
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308422 QDF_ASSERT(0);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008423
Selvaraj, Sridhar7231c5f2016-09-28 12:42:33 +05308424 len = sizeof(*msg);
8425 msg = qdf_mem_malloc(len);
8426 if (!msg)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308427 status = QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008428 else {
Selvaraj, Sridhar7231c5f2016-09-28 12:42:33 +05308429 msg->message_type = eWNI_SME_SESSION_UPDATE_PARAM;
8430 msg->length = len;
8431 msg->session_id = session_id;
8432 msg->param_type = param_type;
8433 msg->param_val = param_val;
8434 status = cds_send_mb_message_to_mac(msg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008435 }
Selvaraj, Sridhar7231c5f2016-09-28 12:42:33 +05308436 sme_release_global_lock(&mac_ctx->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008437 }
8438 return status;
8439}
8440
8441/* ---------------------------------------------------------------------------
8442
8443 \fn sme_set_tm_level
8444 \brief Set Thermal Mitigation Level to RIVA
8445 \param hHal - The handle returned by mac_open.
8446 \param newTMLevel - new Thermal Mitigation Level
8447 \param tmMode - Thermal Mitigation handle mode, default 0
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308448 \return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008449 ---------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308450QDF_STATUS sme_set_tm_level(tHalHandle hHal, uint16_t newTMLevel, uint16_t tmMode)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008451{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308452 QDF_STATUS status = QDF_STATUS_SUCCESS;
8453 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008454 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
8455 cds_msg_t cds_message;
8456 tAniSetTmLevelReq *setTmLevelReq = NULL;
8457
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308458 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008459 TRACE_CODE_SME_RX_HDD_SET_TMLEVEL, NO_SESSION, 0));
8460 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308461 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008462 setTmLevelReq =
8463 (tAniSetTmLevelReq *)
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308464 qdf_mem_malloc(sizeof(tAniSetTmLevelReq));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008465 if (NULL == setTmLevelReq) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308466 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008467 "%s: Not able to allocate memory for sme_set_tm_level",
8468 __func__);
8469 sme_release_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308470 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008471 }
8472
8473 setTmLevelReq->tmMode = tmMode;
8474 setTmLevelReq->newTmLevel = newTMLevel;
8475
8476 /* serialize the req through MC thread */
8477 cds_message.bodyptr = setTmLevelReq;
8478 cds_message.type = WMA_SET_TM_LEVEL_REQ;
Sreelakshmi Konamki6a065362016-05-31 16:05:01 +05308479 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
8480 NO_SESSION, cds_message.type));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308481 qdf_status = cds_mq_post_message(CDS_MQ_ID_WMA, &cds_message);
8482 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308483 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008484 "%s: Post Set TM Level MSG fail", __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308485 qdf_mem_free(setTmLevelReq);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308486 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008487 }
8488 sme_release_global_lock(&pMac->sme);
8489 }
8490 return status;
8491}
8492
8493/*---------------------------------------------------------------------------
8494
8495 \brief sme_feature_caps_exchange() - SME interface to exchange capabilities between
8496 Host and FW.
8497
8498 \param hHal - HAL handle for device
8499
8500 \return NONE
8501
8502 ---------------------------------------------------------------------------*/
8503void sme_feature_caps_exchange(tHalHandle hHal)
8504{
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308505 MTRACE(qdf_trace
Anurag Chouhan6d760662016-02-20 16:05:43 +05308506 (QDF_MODULE_ID_SME, TRACE_CODE_SME_RX_HDD_CAPS_EXCH, NO_SESSION,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008507 0));
8508}
8509
8510/*---------------------------------------------------------------------------
8511
8512 \brief sme_disable_feature_capablity() - SME interface to disable Active mode offload capablity
8513 in Host.
8514
8515 \param hHal - HAL handle for device
8516
8517 \return NONE
8518
8519 ---------------------------------------------------------------------------*/
8520void sme_disable_feature_capablity(uint8_t feature_index)
8521{
8522}
8523
8524/* ---------------------------------------------------------------------------
8525 \fn sme_reset_power_values_for5_g
8526 \brief Reset the power values for 5G band with default power values.
8527 \param hHal - HAL handle for device
8528 \- return NONE
8529 -------------------------------------------------------------------------*/
8530void sme_reset_power_values_for5_g(tHalHandle hHal)
8531{
8532 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308533 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008534 TRACE_CODE_SME_RX_HDD_RESET_PW5G, NO_SESSION, 0));
8535 csr_save_channel_power_for_band(pMac, true);
8536 csr_apply_power2_current(pMac); /* Store the channel+power info in the global place: Cfg */
8537}
8538
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008539/* ---------------------------------------------------------------------------
8540 \fn sme_update_roam_prefer5_g_hz
8541 \brief enable/disable Roam prefer 5G runtime option
8542 This function is called through dynamic setConfig callback function
8543 to configure the Roam prefer 5G runtime option
8544 \param hHal - HAL handle for device
8545 \param nRoamPrefer5GHz Enable/Disable Roam prefer 5G runtime option
8546 \- return Success or failure
8547 -------------------------------------------------------------------------*/
8548
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308549QDF_STATUS sme_update_roam_prefer5_g_hz(tHalHandle hHal, bool nRoamPrefer5GHz)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008550{
8551 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308552 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008553
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308554 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008555 TRACE_CODE_SME_RX_HDD_UPDATE_RP5G, NO_SESSION, 0));
8556 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308557 if (QDF_IS_STATUS_SUCCESS(status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308558 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008559 "%s: gRoamPrefer5GHz is changed from %d to %d",
8560 __func__, pMac->roam.configParam.nRoamPrefer5GHz,
8561 nRoamPrefer5GHz);
8562 pMac->roam.configParam.nRoamPrefer5GHz = nRoamPrefer5GHz;
8563 sme_release_global_lock(&pMac->sme);
8564 }
8565
8566 return status;
8567}
8568
8569/* ---------------------------------------------------------------------------
8570 \fn sme_set_roam_intra_band
8571 \brief enable/disable Intra band roaming
8572 This function is called through dynamic setConfig callback function
8573 to configure the intra band roaming
8574 \param hHal - HAL handle for device
8575 \param nRoamIntraBand Enable/Disable Intra band roaming
8576 \- return Success or failure
8577 -------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308578QDF_STATUS sme_set_roam_intra_band(tHalHandle hHal, const bool nRoamIntraBand)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008579{
8580 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308581 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008582
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308583 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008584 TRACE_CODE_SME_RX_HDD_SET_ROAMIBAND, NO_SESSION, 0));
8585 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308586 if (QDF_IS_STATUS_SUCCESS(status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308587 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008588 "%s: gRoamIntraBand is changed from %d to %d",
8589 __func__, pMac->roam.configParam.nRoamIntraBand,
8590 nRoamIntraBand);
8591 pMac->roam.configParam.nRoamIntraBand = nRoamIntraBand;
8592 sme_release_global_lock(&pMac->sme);
8593 }
8594
8595 return status;
8596}
8597
8598/* ---------------------------------------------------------------------------
8599 \fn sme_update_roam_scan_n_probes
8600 \brief function to update roam scan N probes
8601 This function is called through dynamic setConfig callback function
8602 to update roam scan N probes
8603 \param hHal - HAL handle for device
8604 \param sessionId - Session Identifier
8605 \param nProbes number of probe requests to be sent out
8606 \- return Success or failure
8607 -------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308608QDF_STATUS sme_update_roam_scan_n_probes(tHalHandle hHal, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008609 const uint8_t nProbes)
8610{
8611 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308612 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008613
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308614 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008615 TRACE_CODE_SME_RX_HDD_UPDATE_ROAM_SCAN_N_PROBES,
8616 NO_SESSION, 0));
8617 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308618 if (QDF_IS_STATUS_SUCCESS(status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308619 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008620 "%s: gRoamScanNProbes is changed from %d to %d",
8621 __func__, pMac->roam.configParam.nProbes, nProbes);
8622 pMac->roam.configParam.nProbes = nProbes;
8623 sme_release_global_lock(&pMac->sme);
8624 }
8625 if (pMac->roam.configParam.isRoamOffloadScanEnabled) {
8626 csr_roam_offload_scan(pMac, sessionId,
8627 ROAM_SCAN_OFFLOAD_UPDATE_CFG,
8628 REASON_NPROBES_CHANGED);
8629 }
8630 return status;
8631}
8632
8633/* ---------------------------------------------------------------------------
8634 \fn sme_update_roam_scan_home_away_time
8635 \brief function to update roam scan Home away time
8636 This function is called through dynamic setConfig callback function
8637 to update roam scan home away time
8638 \param hHal - HAL handle for device
8639 \param sessionId - Session Identifier
8640 \param nRoamScanAwayTime Scan home away time
8641 \param bSendOffloadCmd If true then send offload command to firmware
8642 If false then command is not sent to firmware
8643 \- return Success or failure
8644 -------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308645QDF_STATUS sme_update_roam_scan_home_away_time(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008646 uint8_t sessionId,
8647 const uint16_t nRoamScanHomeAwayTime,
8648 const bool bSendOffloadCmd)
8649{
8650 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308651 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008652
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308653 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008654 TRACE_CODE_SME_RX_HDD_UPDATE_ROAM_SCAN_HOME_AWAY_TIME,
8655 NO_SESSION, 0));
8656 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308657 if (QDF_IS_STATUS_SUCCESS(status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308658 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008659 "%s: gRoamScanHomeAwayTime is changed from %d to %d",
8660 __func__,
8661 pMac->roam.configParam.nRoamScanHomeAwayTime,
8662 nRoamScanHomeAwayTime);
8663 pMac->roam.configParam.nRoamScanHomeAwayTime =
8664 nRoamScanHomeAwayTime;
8665 sme_release_global_lock(&pMac->sme);
8666 }
8667 if (pMac->roam.configParam.isRoamOffloadScanEnabled && bSendOffloadCmd) {
8668 csr_roam_offload_scan(pMac, sessionId,
8669 ROAM_SCAN_OFFLOAD_UPDATE_CFG,
8670 REASON_HOME_AWAY_TIME_CHANGED);
8671 }
8672 return status;
8673}
8674
Abhishek Singh518323d2015-10-19 17:42:01 +05308675/**
8676 * sme_ext_change_channel()- function to post send ECSA
8677 * action frame to csr.
8678 * @hHal: Hal context
8679 * @channel: new channel to switch
8680 * @session_id: senssion it should be sent on.
8681 *
8682 * This function is called to post ECSA frame to csr.
8683 *
8684 * Return: success if msg is sent else return failure
8685 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308686QDF_STATUS sme_ext_change_channel(tHalHandle h_hal, uint32_t channel,
Abhishek Singh518323d2015-10-19 17:42:01 +05308687 uint8_t session_id)
8688{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308689 QDF_STATUS status = QDF_STATUS_SUCCESS;
Abhishek Singh518323d2015-10-19 17:42:01 +05308690 tpAniSirGlobal mac_ctx = PMAC_STRUCT(h_hal);
8691 uint8_t channel_state;
8692
8693 sms_log(mac_ctx, LOGE, FL(" Set Channel %d "), channel);
8694 channel_state =
8695 cds_get_channel_state(channel);
8696
8697 if (CHANNEL_STATE_DISABLE == channel_state) {
8698 sms_log(mac_ctx, LOGE, FL(" Invalid channel %d "), channel);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308699 return QDF_STATUS_E_INVAL;
Abhishek Singh518323d2015-10-19 17:42:01 +05308700 }
8701
8702 status = sme_acquire_global_lock(&mac_ctx->sme);
8703
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308704 if (QDF_STATUS_SUCCESS == status) {
Abhishek Singh518323d2015-10-19 17:42:01 +05308705 /* update the channel list to the firmware */
8706 status = csr_send_ext_change_channel(mac_ctx,
8707 channel, session_id);
8708 sme_release_global_lock(&mac_ctx->sme);
8709 }
8710
8711 return status;
8712}
8713
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008714/* ---------------------------------------------------------------------------
8715 \fn sme_get_roam_intra_band
8716 \brief get Intra band roaming
8717 \param hHal - HAL handle for device
8718 \- return Success or failure
8719 -------------------------------------------------------------------------*/
8720bool sme_get_roam_intra_band(tHalHandle hHal)
8721{
8722 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308723 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008724 TRACE_CODE_SME_RX_HDD_GET_ROAMIBAND, NO_SESSION, 0));
8725 return pMac->roam.configParam.nRoamIntraBand;
8726}
8727
8728/* ---------------------------------------------------------------------------
8729 \fn sme_get_roam_scan_n_probes
8730 \brief get N Probes
8731 \param hHal - HAL handle for device
8732 \- return Success or failure
8733 -------------------------------------------------------------------------*/
8734uint8_t sme_get_roam_scan_n_probes(tHalHandle hHal)
8735{
8736 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
8737 return pMac->roam.configParam.nProbes;
8738}
8739
8740/* ---------------------------------------------------------------------------
8741 \fn sme_get_roam_scan_home_away_time
8742 \brief get Roam scan home away time
8743 \param hHal - HAL handle for device
8744 \- return Success or failure
8745 -------------------------------------------------------------------------*/
8746uint16_t sme_get_roam_scan_home_away_time(tHalHandle hHal)
8747{
8748 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
8749 return pMac->roam.configParam.nRoamScanHomeAwayTime;
8750}
8751
8752/* ---------------------------------------------------------------------------
8753 \fn sme_update_roam_rssi_diff
8754 \brief Update RoamRssiDiff
8755 This function is called through dynamic setConfig callback function
8756 to configure RoamRssiDiff
8757 Usage: adb shell iwpriv wlan0 setConfig RoamRssiDiff=[0 .. 125]
8758 \param hHal - HAL handle for device
8759 \param sessionId - Session Identifier
8760 \param RoamRssiDiff - minimum rssi difference between potential
8761 candidate and current AP.
8762 \- return Success or failure
8763 -------------------------------------------------------------------------*/
8764
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308765QDF_STATUS sme_update_roam_rssi_diff(tHalHandle hHal, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008766 uint8_t RoamRssiDiff)
8767{
8768 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308769 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008770
Naveen Rawatc36f7eb2016-11-10 20:01:03 -08008771 if (sessionId >= CSR_ROAM_SESSION_MAX) {
8772 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
8773 FL("Invalid sme session id: %d"), sessionId);
8774 return QDF_STATUS_E_INVAL;
8775 }
8776
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008777 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308778 if (QDF_IS_STATUS_SUCCESS(status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308779 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008780 "LFR runtime successfully set roam rssi diff to %d - old value is %d - roam state is %s",
8781 RoamRssiDiff,
8782 pMac->roam.configParam.RoamRssiDiff,
8783 mac_trace_get_neighbour_roam_state(pMac->roam.
8784 neighborRoamInfo
8785 [sessionId].
8786 neighborRoamState));
8787 pMac->roam.configParam.RoamRssiDiff = RoamRssiDiff;
8788 sme_release_global_lock(&pMac->sme);
8789 }
Naveen Rawatc36f7eb2016-11-10 20:01:03 -08008790
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008791 if (pMac->roam.configParam.isRoamOffloadScanEnabled) {
8792 csr_roam_offload_scan(pMac, sessionId,
8793 ROAM_SCAN_OFFLOAD_UPDATE_CFG,
8794 REASON_RSSI_DIFF_CHANGED);
8795 }
8796 return status;
8797}
8798
8799/*--------------------------------------------------------------------------
8800 \brief sme_update_fast_transition_enabled() - enable/disable Fast Transition
8801 support at runtime
8802 It is used at in the REG_DYNAMIC_VARIABLE macro definition of
8803 isFastTransitionEnabled.
8804 This is a synchronous call
8805 \param hHal - The handle returned by mac_open.
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308806 \return QDF_STATUS_SUCCESS - SME update isFastTransitionEnabled config
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008807 successfully.
8808 Other status means SME is failed to update isFastTransitionEnabled.
8809 \sa
8810 --------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308811QDF_STATUS sme_update_fast_transition_enabled(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008812 bool isFastTransitionEnabled)
8813{
8814 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308815 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008816
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308817 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008818 TRACE_CODE_SME_RX_HDD_UPDATE_FTENABLED, NO_SESSION,
8819 0));
8820 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308821 if (QDF_IS_STATUS_SUCCESS(status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308822 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008823 "%s: FastTransitionEnabled is changed from %d to %d",
8824 __func__,
8825 pMac->roam.configParam.isFastTransitionEnabled,
8826 isFastTransitionEnabled);
8827 pMac->roam.configParam.isFastTransitionEnabled =
8828 isFastTransitionEnabled;
8829 sme_release_global_lock(&pMac->sme);
8830 }
8831
8832 return status;
8833}
8834
8835/* ---------------------------------------------------------------------------
8836 \fn sme_update_wes_mode
8837 \brief Update WES Mode
8838 This function is called through dynamic setConfig callback function
8839 to configure isWESModeEnabled
8840 \param hHal - HAL handle for device
8841 \param isWESModeEnabled - WES mode
8842 \param sessionId - Session Identifier
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308843 \return QDF_STATUS_SUCCESS - SME update isWESModeEnabled config successfully.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008844 Other status means SME is failed to update isWESModeEnabled.
8845 -------------------------------------------------------------------------*/
8846
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308847QDF_STATUS sme_update_wes_mode(tHalHandle hHal, bool isWESModeEnabled,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008848 uint8_t sessionId)
8849{
8850 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308851 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008852
Naveen Rawatc36f7eb2016-11-10 20:01:03 -08008853 if (sessionId >= CSR_ROAM_SESSION_MAX) {
8854 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
8855 FL("Invalid sme session id: %d"), sessionId);
8856 return QDF_STATUS_E_INVAL;
8857 }
8858
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008859 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308860 if (QDF_IS_STATUS_SUCCESS(status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308861 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008862 "LFR runtime successfully set WES Mode to %d - old value is %d - roam state is %s",
8863 isWESModeEnabled,
8864 pMac->roam.configParam.isWESModeEnabled,
8865 mac_trace_get_neighbour_roam_state(pMac->roam.
8866 neighborRoamInfo
8867 [sessionId].
8868 neighborRoamState));
8869 pMac->roam.configParam.isWESModeEnabled = isWESModeEnabled;
8870 sme_release_global_lock(&pMac->sme);
8871 }
8872
8873 return status;
8874}
8875
8876/* ---------------------------------------------------------------------------
8877 \fn sme_set_roam_scan_control
8878 \brief Set roam scan control
8879 This function is called to set roam scan control
8880 if roam scan control is set to 0, roaming scan cache is cleared
8881 any value other than 0 is treated as invalid value
8882 \param hHal - HAL handle for device
8883 \param sessionId - Session Identifier
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308884 \return QDF_STATUS_SUCCESS - SME update config successfully.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008885 Other status means SME failure to update
8886 -------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308887QDF_STATUS sme_set_roam_scan_control(tHalHandle hHal, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008888 bool roamScanControl)
8889{
8890 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308891 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008892
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308893 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008894 TRACE_CODE_SME_RX_HDD_SET_SCANCTRL, NO_SESSION, 0));
Naveen Rawatc36f7eb2016-11-10 20:01:03 -08008895
8896 if (sessionId >= CSR_ROAM_SESSION_MAX) {
8897 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
8898 FL("Invalid sme session id: %d"), sessionId);
8899 return QDF_STATUS_E_INVAL;
8900 }
8901
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008902 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308903 if (QDF_IS_STATUS_SUCCESS(status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308904 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008905 "LFR runtime successfully set roam scan control to %d - old value is %d - roam state is %s",
8906 roamScanControl,
8907 pMac->roam.configParam.nRoamScanControl,
8908 mac_trace_get_neighbour_roam_state(pMac->roam.
8909 neighborRoamInfo
8910 [sessionId].
8911 neighborRoamState));
8912 pMac->roam.configParam.nRoamScanControl = roamScanControl;
8913 if (0 == roamScanControl) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308914 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008915 "LFR runtime successfully cleared roam scan cache");
8916 csr_flush_cfg_bg_scan_roam_channel_list(pMac, sessionId);
8917 if (pMac->roam.configParam.isRoamOffloadScanEnabled) {
8918 csr_roam_offload_scan(pMac, sessionId,
8919 ROAM_SCAN_OFFLOAD_UPDATE_CFG,
8920 REASON_FLUSH_CHANNEL_LIST);
8921 }
8922 }
8923 sme_release_global_lock(&pMac->sme);
8924 }
8925 return status;
8926}
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008927
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008928/*--------------------------------------------------------------------------
8929 \brief sme_update_is_fast_roam_ini_feature_enabled() - enable/disable LFR
8930 support at runtime
8931 It is used at in the REG_DYNAMIC_VARIABLE macro definition of
8932 isFastRoamIniFeatureEnabled.
8933 This is a synchronous call
8934 \param hHal - The handle returned by mac_open.
8935 \param sessionId - Session Identifier
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308936 \return QDF_STATUS_SUCCESS - SME update isFastRoamIniFeatureEnabled config
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008937 successfully.
8938 Other status means SME is failed to update isFastRoamIniFeatureEnabled.
8939 \sa
8940 --------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308941QDF_STATUS sme_update_is_fast_roam_ini_feature_enabled
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008942 (tHalHandle hHal,
8943 uint8_t sessionId, const bool isFastRoamIniFeatureEnabled) {
8944 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
8945
8946 if (pMac->roam.configParam.isFastRoamIniFeatureEnabled ==
8947 isFastRoamIniFeatureEnabled) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308948 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008949 "%s: FastRoam is already enabled or disabled, nothing to do (returning) old(%d) new(%d)",
8950 __func__,
8951 pMac->roam.configParam.isFastRoamIniFeatureEnabled,
8952 isFastRoamIniFeatureEnabled);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308953 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008954 }
8955
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308956 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008957 "%s: FastRoamEnabled is changed from %d to %d", __func__,
8958 pMac->roam.configParam.isFastRoamIniFeatureEnabled,
8959 isFastRoamIniFeatureEnabled);
8960 pMac->roam.configParam.isFastRoamIniFeatureEnabled =
8961 isFastRoamIniFeatureEnabled;
8962 csr_neighbor_roam_update_fast_roaming_enabled(pMac, sessionId,
8963 isFastRoamIniFeatureEnabled);
8964
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308965 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008966}
8967
Mukul Sharma69c44cd2016-09-12 18:33:57 +05308968/**
8969 * sme_config_fast_roaming() - enable/disable LFR support at runtime
8970 * @hal - The handle returned by macOpen.
8971 * @session_id - Session Identifier
8972 * @is_fast_roam_enabled - flag to enable/disable roaming
8973 *
8974 * When Supplicant issues enabled/disable fast roaming on the basis
8975 * of the Bssid modification in network block (e.g. AutoJoin mode N/W block)
8976 *
8977 * Return: QDF_STATUS
8978 */
8979
8980QDF_STATUS sme_config_fast_roaming(tHalHandle hal, uint8_t session_id,
8981 const bool is_fast_roam_enabled)
8982{
8983 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
Sreelakshmi Konamkibda5bbf2016-09-12 18:38:10 +05308984 tCsrRoamSession *session = CSR_GET_SESSION(mac_ctx, session_id);
Mukul Sharma69c44cd2016-09-12 18:33:57 +05308985 QDF_STATUS status;
8986
8987 if (!mac_ctx->roam.configParam.isFastRoamIniFeatureEnabled) {
8988 sms_log(mac_ctx, LOGE, FL("Fast roam is disabled through ini"));
8989 if (!is_fast_roam_enabled)
8990 return QDF_STATUS_SUCCESS;
8991 return QDF_STATUS_E_FAILURE;
8992 }
Sreelakshmi Konamkibda5bbf2016-09-12 18:38:10 +05308993
8994 if (is_fast_roam_enabled && session && session->pCurRoamProfile)
8995 session->pCurRoamProfile->do_not_roam = false;
8996
Mukul Sharma69c44cd2016-09-12 18:33:57 +05308997 status = csr_neighbor_roam_update_fast_roaming_enabled(mac_ctx,
8998 session_id, is_fast_roam_enabled);
8999 if (!QDF_IS_STATUS_SUCCESS(status)) {
9000 sms_log(mac_ctx, LOGE,
9001 FL("csr_neighbor_roam_update_fast_roaming_enabled failed"));
9002 return QDF_STATUS_E_FAILURE;
9003 }
9004
9005 return QDF_STATUS_SUCCESS;
9006}
9007
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009008/*--------------------------------------------------------------------------
9009 \brief sme_update_is_mawc_ini_feature_enabled() -
9010 Enable/disable LFR MAWC support at runtime
9011 It is used at in the REG_DYNAMIC_VARIABLE macro definition of
9012 isMAWCIniFeatureEnabled.
9013 This is a synchronous call
9014 \param hHal - The handle returned by mac_open.
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309015 \return QDF_STATUS_SUCCESS - SME update MAWCEnabled config successfully.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009016 Other status means SME is failed to update MAWCEnabled.
9017 \sa
9018 --------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309019QDF_STATUS sme_update_is_mawc_ini_feature_enabled(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009020 const bool MAWCEnabled)
9021{
9022 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309023 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009024
9025 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309026 if (QDF_IS_STATUS_SUCCESS(status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05309027 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009028 "%s: MAWCEnabled is changed from %d to %d", __func__,
9029 pMac->roam.configParam.MAWCEnabled, MAWCEnabled);
9030 pMac->roam.configParam.MAWCEnabled = MAWCEnabled;
9031 sme_release_global_lock(&pMac->sme);
9032 }
9033
9034 return status;
9035
9036}
9037
9038/*--------------------------------------------------------------------------
9039 \brief sme_stop_roaming() - Stop roaming for a given sessionId
9040 This is a synchronous call
9041 \param hHal - The handle returned by mac_open
9042 \param sessionId - Session Identifier
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309043 \return QDF_STATUS_SUCCESS on success
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009044 Other status on failure
9045 \sa
9046 --------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309047QDF_STATUS sme_stop_roaming(tHalHandle hHal, uint8_t sessionId, uint8_t reason)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009048{
9049 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309050 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009051
9052 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309053 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009054 csr_roam_offload_scan(pMac, sessionId, ROAM_SCAN_OFFLOAD_STOP,
9055 reason);
9056 sme_release_global_lock(&pMac->sme);
9057 }
9058
9059 return status;
9060}
9061
9062/*--------------------------------------------------------------------------
9063 \brief sme_start_roaming() - Start roaming for a given sessionId
9064 This is a synchronous call
9065 \param hHal - The handle returned by mac_open
9066 \param sessionId - Session Identifier
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309067 \return QDF_STATUS_SUCCESS on success
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009068 Other status on failure
9069 \sa
9070 --------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309071QDF_STATUS sme_start_roaming(tHalHandle hHal, uint8_t sessionId, uint8_t reason)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009072{
9073 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309074 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009075
9076 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309077 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009078 csr_roam_offload_scan(pMac, sessionId, ROAM_SCAN_OFFLOAD_START,
9079 reason);
9080 sme_release_global_lock(&pMac->sme);
9081 }
9082
9083 return status;
9084}
9085
9086/*--------------------------------------------------------------------------
9087 \brief sme_update_enable_fast_roam_in_concurrency() - enable/disable LFR if
9088 Concurrent session exists
9089 This is a synchronuous call
9090 \param hHal - The handle returned by mac_open.
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309091 \return QDF_STATUS_SUCCESS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009092 Other status means SME is failed
9093 \sa
9094 --------------------------------------------------------------------------*/
9095
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309096QDF_STATUS sme_update_enable_fast_roam_in_concurrency(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009097 bool
9098 bFastRoamInConIniFeatureEnabled)
9099{
9100
9101 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309102 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009103
9104 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309105 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009106 pMac->roam.configParam.bFastRoamInConIniFeatureEnabled =
9107 bFastRoamInConIniFeatureEnabled;
9108 if (0 == pMac->roam.configParam.isRoamOffloadScanEnabled) {
9109 pMac->roam.configParam.bFastRoamInConIniFeatureEnabled =
9110 0;
9111 }
9112 sme_release_global_lock(&pMac->sme);
9113 }
9114
9115 return status;
9116}
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009117
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009118/*--------------------------------------------------------------------------
9119 \brief sme_update_config_fw_rssi_monitoring() - enable/disable firmware RSSI
9120 Monitoring at runtime
9121 It is used at in the REG_DYNAMIC_VARIABLE macro definition of
9122 fEnableFwRssiMonitoring.
9123 This is a synchronous call
9124 \param hHal - The handle returned by mac_open.
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309125 \return QDF_STATUS_SUCCESS - SME update fEnableFwRssiMonitoring.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009126 config successfully.
9127 Other status means SME is failed to update fEnableFwRssiMonitoring.
9128 \sa
9129 --------------------------------------------------------------------------*/
9130
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309131QDF_STATUS sme_update_config_fw_rssi_monitoring(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009132 bool fEnableFwRssiMonitoring)
9133{
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05309134 QDF_STATUS qdf_ret_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009135
9136 if (sme_cfg_set_int (hHal, WNI_CFG_PS_ENABLE_RSSI_MONITOR,
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309137 fEnableFwRssiMonitoring) == QDF_STATUS_E_FAILURE) {
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05309138 qdf_ret_status = QDF_STATUS_E_FAILURE;
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05309139 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009140 "Could not pass on WNI_CFG_PS_RSSI_MONITOR to CFG");
9141 }
9142
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05309143 return qdf_ret_status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009144}
9145
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009146/* ---------------------------------------------------------------------------
9147 \fn sme_set_roam_opportunistic_scan_threshold_diff
9148 \brief Update Opportunistic Scan threshold diff
9149 This function is called through dynamic setConfig callback function
9150 to configure nOpportunisticThresholdDiff
9151 \param hHal - HAL handle for device
9152 \param sessionId - Session Identifier
9153 \param nOpportunisticThresholdDiff - Opportunistic Scan threshold diff
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309154 \return QDF_STATUS_SUCCESS - SME update nOpportunisticThresholdDiff config
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009155 successfully.
9156 else SME is failed to update nOpportunisticThresholdDiff.
9157 -------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309158QDF_STATUS sme_set_roam_opportunistic_scan_threshold_diff(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009159 uint8_t sessionId,
9160 const uint8_t
9161 nOpportunisticThresholdDiff)
9162{
9163 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309164 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009165
9166 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309167 if (QDF_IS_STATUS_SUCCESS(status)) {
Varun Reddy Yeturuff4feb02016-04-20 12:26:11 -07009168 status = csr_neighbor_roam_update_config(pMac, sessionId,
9169 nOpportunisticThresholdDiff,
9170 REASON_OPPORTUNISTIC_THRESH_DIFF_CHANGED);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309171 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009172 pMac->roam.configParam.neighborRoamConfig.
9173 nOpportunisticThresholdDiff =
9174 nOpportunisticThresholdDiff;
9175 }
9176 sme_release_global_lock(&pMac->sme);
9177 }
9178 return status;
9179}
9180
9181/*--------------------------------------------------------------------------
9182 \fn sme_get_roam_opportunistic_scan_threshold_diff()
9183 \brief gets Opportunistic Scan threshold diff
9184 This is a synchronous call
9185 \param hHal - The handle returned by mac_open
9186 \return uint8_t - nOpportunisticThresholdDiff
9187 \sa
9188 --------------------------------------------------------------------------*/
9189uint8_t sme_get_roam_opportunistic_scan_threshold_diff(tHalHandle hHal)
9190{
9191 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
9192 return pMac->roam.configParam.neighborRoamConfig.
9193 nOpportunisticThresholdDiff;
9194}
9195
9196/* ---------------------------------------------------------------------------
9197 \fn sme_set_roam_rescan_rssi_diff
9198 \brief Update roam rescan rssi diff
9199 This function is called through dynamic setConfig callback function
9200 to configure nRoamRescanRssiDiff
9201 \param hHal - HAL handle for device
9202 \param sessionId - Session Identifier
9203 \param nRoamRescanRssiDiff - roam rescan rssi diff
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309204 \return QDF_STATUS_SUCCESS - SME update nRoamRescanRssiDiff config
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009205 successfully.
9206 else SME is failed to update nRoamRescanRssiDiff.
9207 -------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309208QDF_STATUS sme_set_roam_rescan_rssi_diff(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009209 uint8_t sessionId,
9210 const uint8_t nRoamRescanRssiDiff)
9211{
9212 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309213 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009214
9215 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309216 if (QDF_IS_STATUS_SUCCESS(status)) {
Varun Reddy Yeturuff4feb02016-04-20 12:26:11 -07009217 status = csr_neighbor_roam_update_config(pMac, sessionId,
9218 nRoamRescanRssiDiff,
9219 REASON_ROAM_RESCAN_RSSI_DIFF_CHANGED);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309220 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009221 pMac->roam.configParam.neighborRoamConfig.
9222 nRoamRescanRssiDiff = nRoamRescanRssiDiff;
9223 }
9224 sme_release_global_lock(&pMac->sme);
9225 }
9226 return status;
9227}
9228
9229/*--------------------------------------------------------------------------
9230 \fn sme_get_roam_rescan_rssi_diff
9231 \brief gets roam rescan rssi diff
9232 This is a synchronous call
9233 \param hHal - The handle returned by mac_open
9234 \return int8_t - nRoamRescanRssiDiff
9235 \sa
9236 --------------------------------------------------------------------------*/
9237uint8_t sme_get_roam_rescan_rssi_diff(tHalHandle hHal)
9238{
9239 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
9240 return pMac->roam.configParam.neighborRoamConfig.nRoamRescanRssiDiff;
9241}
9242
9243/* ---------------------------------------------------------------------------
9244 \fn sme_set_roam_bmiss_first_bcnt
9245 \brief Update Roam count for first beacon miss
9246 This function is called through dynamic setConfig callback function
9247 to configure nRoamBmissFirstBcnt
9248 \param hHal - HAL handle for device
9249 \param sessionId - Session Identifier
9250 \param nRoamBmissFirstBcnt - Roam first bmiss count
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309251 \return QDF_STATUS_SUCCESS - SME update nRoamBmissFirstBcnt
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009252 successfully.
9253 else SME is failed to update nRoamBmissFirstBcnt
9254 -------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309255QDF_STATUS sme_set_roam_bmiss_first_bcnt(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009256 uint8_t sessionId,
9257 const uint8_t nRoamBmissFirstBcnt)
9258{
9259 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309260 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009261
9262 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309263 if (QDF_IS_STATUS_SUCCESS(status)) {
Varun Reddy Yeturuff4feb02016-04-20 12:26:11 -07009264 status = csr_neighbor_roam_update_config(pMac, sessionId,
9265 nRoamBmissFirstBcnt,
9266 REASON_ROAM_BMISS_FIRST_BCNT_CHANGED);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309267 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009268 pMac->roam.configParam.neighborRoamConfig.
9269 nRoamBmissFirstBcnt = nRoamBmissFirstBcnt;
9270 }
9271 sme_release_global_lock(&pMac->sme);
9272 }
9273 return status;
9274}
9275
9276/* ---------------------------------------------------------------------------
9277 \fn sme_get_roam_bmiss_first_bcnt
9278 \brief get neighbor roam beacon miss first count
9279 \param hHal - The handle returned by mac_open.
9280 \return uint8_t - neighbor roam beacon miss first count
9281 -------------------------------------------------------------------------*/
9282uint8_t sme_get_roam_bmiss_first_bcnt(tHalHandle hHal)
9283{
9284 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
9285 return pMac->roam.configParam.neighborRoamConfig.nRoamBmissFirstBcnt;
9286}
9287
9288/* ---------------------------------------------------------------------------
9289 \fn sme_set_roam_bmiss_final_bcnt
9290 \brief Update Roam count for final beacon miss
9291 This function is called through dynamic setConfig callback function
9292 to configure nRoamBmissFinalBcnt
9293 \param hHal - HAL handle for device
9294 \param sessionId - Session Identifier
9295 \param nRoamBmissFinalBcnt - Roam final bmiss count
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309296 \return QDF_STATUS_SUCCESS - SME update nRoamBmissFinalBcnt
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009297 successfully.
9298 else SME is failed to update nRoamBmissFinalBcnt
9299 -------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309300QDF_STATUS sme_set_roam_bmiss_final_bcnt(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009301 uint8_t sessionId,
9302 const uint8_t nRoamBmissFinalBcnt)
9303{
9304 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309305 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009306
9307 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309308 if (QDF_IS_STATUS_SUCCESS(status)) {
Varun Reddy Yeturuff4feb02016-04-20 12:26:11 -07009309 status = csr_neighbor_roam_update_config(pMac, sessionId,
9310 nRoamBmissFinalBcnt,
9311 REASON_ROAM_BMISS_FINAL_BCNT_CHANGED);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309312 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009313 pMac->roam.configParam.neighborRoamConfig.
9314 nRoamBmissFinalBcnt = nRoamBmissFinalBcnt;
9315 }
9316 sme_release_global_lock(&pMac->sme);
9317 }
9318 return status;
9319}
9320
9321/*--------------------------------------------------------------------------
9322 \fn sme_get_roam_bmiss_final_bcnt
9323 \brief gets Roam count for final beacon miss
9324 This is a synchronous call
9325 \param hHal - The handle returned by mac_open
9326 \return uint8_t - nRoamBmissFinalBcnt
9327 \sa
9328 --------------------------------------------------------------------------*/
9329uint8_t sme_get_roam_bmiss_final_bcnt(tHalHandle hHal)
9330{
9331 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
9332 return pMac->roam.configParam.neighborRoamConfig.nRoamBmissFinalBcnt;
9333}
9334
9335/* ---------------------------------------------------------------------------
9336 \fn sme_set_roam_beacon_rssi_weight
9337 \brief Update Roam beacon rssi weight
9338 This function is called through dynamic setConfig callback function
9339 to configure nRoamBeaconRssiWeight
9340 \param hHal - HAL handle for device
9341 \param sessionId - Session Identifier
9342 \param nRoamBeaconRssiWeight - Roam beacon rssi weight
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309343 \return QDF_STATUS_SUCCESS - SME update nRoamBeaconRssiWeight config
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009344 successfully.
9345 else SME is failed to update nRoamBeaconRssiWeight
9346 -------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309347QDF_STATUS sme_set_roam_beacon_rssi_weight(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009348 uint8_t sessionId,
9349 const uint8_t nRoamBeaconRssiWeight)
9350{
9351 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309352 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009353
9354 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309355 if (QDF_IS_STATUS_SUCCESS(status)) {
Varun Reddy Yeturuff4feb02016-04-20 12:26:11 -07009356 status = csr_neighbor_roam_update_config(pMac, sessionId,
9357 nRoamBeaconRssiWeight,
9358 REASON_ROAM_BEACON_RSSI_WEIGHT_CHANGED);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309359 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009360 pMac->roam.configParam.neighborRoamConfig.
9361 nRoamBeaconRssiWeight = nRoamBeaconRssiWeight;
9362 }
9363 sme_release_global_lock(&pMac->sme);
9364 }
9365 return status;
9366}
9367
9368/*--------------------------------------------------------------------------
9369 \fn sme_get_roam_beacon_rssi_weight
9370 \brief gets Roam beacon rssi weight
9371 This is a synchronous call
9372 \param hHal - The handle returned by mac_open
9373 \return uint8_t - nRoamBeaconRssiWeight
9374 \sa
9375 --------------------------------------------------------------------------*/
9376uint8_t sme_get_roam_beacon_rssi_weight(tHalHandle hHal)
9377{
9378 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
9379 return pMac->roam.configParam.neighborRoamConfig.nRoamBeaconRssiWeight;
9380}
9381
9382/*--------------------------------------------------------------------------
9383 \brief sme_set_neighbor_lookup_rssi_threshold() - update neighbor lookup
9384 rssi threshold
9385 This is a synchronous call
9386 \param hHal - The handle returned by mac_open.
9387 \param sessionId - Session Identifier
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309388 \return QDF_STATUS_SUCCESS - SME update config successful.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009389 Other status means SME is failed to update
9390 \sa
9391 --------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309392QDF_STATUS sme_set_neighbor_lookup_rssi_threshold
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009393 (tHalHandle hHal, uint8_t sessionId, uint8_t neighborLookupRssiThreshold) {
9394 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309395 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009396
9397 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309398 if (QDF_IS_STATUS_SUCCESS(status)) {
Varun Reddy Yeturuff4feb02016-04-20 12:26:11 -07009399 status = csr_neighbor_roam_update_config(pMac,
9400 sessionId, neighborLookupRssiThreshold,
9401 REASON_LOOKUP_THRESH_CHANGED);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309402 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009403 pMac->roam.configParam.neighborRoamConfig.
9404 nNeighborLookupRssiThreshold =
9405 neighborLookupRssiThreshold;
9406 }
9407 sme_release_global_lock(&pMac->sme);
9408 }
9409 return status;
9410}
9411
9412/*--------------------------------------------------------------------------
9413 \brief sme_set_delay_before_vdev_stop() - update delay before VDEV_STOP
9414 This is a synchronous call
9415 \param hal - The handle returned by macOpen.
9416 \param session_id - Session Identifier
9417 \param delay_before_vdev_stop - value to be set
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309418 \return QDF_STATUS_SUCCESS - SME update config successful.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009419 Other status means SME is failed to update
9420 \sa
9421 --------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309422QDF_STATUS sme_set_delay_before_vdev_stop(tHalHandle hal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009423 uint8_t session_id,
9424 uint8_t delay_before_vdev_stop)
9425{
9426 tpAniSirGlobal pMac = PMAC_STRUCT(hal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309427 QDF_STATUS status = QDF_STATUS_SUCCESS;
Naveen Rawatc36f7eb2016-11-10 20:01:03 -08009428
9429 if (session_id >= CSR_ROAM_SESSION_MAX) {
9430 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
9431 FL("Invalid sme session id: %d"), session_id);
9432 return QDF_STATUS_E_INVAL;
9433 }
9434
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009435 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309436 if (QDF_IS_STATUS_SUCCESS(status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05309437 QDF_TRACE(QDF_MODULE_ID_SME,
9438 QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009439 FL("LFR param delay_before_vdev_stop changed from %d to %d"),
9440 pMac->roam.configParam.neighborRoamConfig.
9441 delay_before_vdev_stop,
9442 delay_before_vdev_stop);
9443 pMac->roam.neighborRoamInfo[session_id].cfgParams.
9444 delay_before_vdev_stop = delay_before_vdev_stop;
9445 pMac->roam.configParam.neighborRoamConfig.
9446 delay_before_vdev_stop = delay_before_vdev_stop;
9447 sme_release_global_lock(&pMac->sme);
9448 }
9449 return status;
9450}
9451
9452/*--------------------------------------------------------------------------
9453 \brief sme_get_neighbor_lookup_rssi_threshold() - get neighbor lookup
9454 rssi threshold
9455 This is a synchronous call
9456 \param hHal - The handle returned by mac_open.
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309457 \return QDF_STATUS_SUCCESS - SME update config successful.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009458 Other status means SME is failed to update
9459 \sa
9460 --------------------------------------------------------------------------*/
9461uint8_t sme_get_neighbor_lookup_rssi_threshold(tHalHandle hHal)
9462{
9463 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
9464 return pMac->roam.configParam.neighborRoamConfig.
9465 nNeighborLookupRssiThreshold;
9466}
9467
9468/*--------------------------------------------------------------------------
9469 \brief sme_set_neighbor_scan_refresh_period() - set neighbor scan results
9470 refresh period
9471 This is a synchronous call
9472 \param hHal - The handle returned by mac_open.
9473 \param sessionId - Session Identifier
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309474 \return QDF_STATUS_SUCCESS - SME update config successful.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009475 Other status means SME is failed to update
9476 \sa
9477 --------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309478QDF_STATUS sme_set_neighbor_scan_refresh_period
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009479 (tHalHandle hHal,
9480 uint8_t sessionId, uint16_t neighborScanResultsRefreshPeriod) {
9481 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309482 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009483 tCsrNeighborRoamConfig *pNeighborRoamConfig = NULL;
9484 tpCsrNeighborRoamControlInfo pNeighborRoamInfo = NULL;
9485
Naveen Rawatc36f7eb2016-11-10 20:01:03 -08009486 if (sessionId >= CSR_ROAM_SESSION_MAX) {
9487 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
9488 FL("Invalid sme session id: %d"), sessionId);
9489 return QDF_STATUS_E_INVAL;
9490 }
9491
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009492 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309493 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009494 pNeighborRoamConfig =
9495 &pMac->roam.configParam.neighborRoamConfig;
9496 pNeighborRoamInfo = &pMac->roam.neighborRoamInfo[sessionId];
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05309497 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009498 "LFR runtime successfully set roam scan refresh period to %d- old value is %d - roam state is %s",
9499 neighborScanResultsRefreshPeriod,
9500 pMac->roam.configParam.neighborRoamConfig.
9501 nNeighborResultsRefreshPeriod,
9502 mac_trace_get_neighbour_roam_state(pMac->roam.
9503 neighborRoamInfo
9504 [sessionId].
9505 neighborRoamState));
9506 pNeighborRoamConfig->nNeighborResultsRefreshPeriod =
9507 neighborScanResultsRefreshPeriod;
9508 pNeighborRoamInfo->cfgParams.neighborResultsRefreshPeriod =
9509 neighborScanResultsRefreshPeriod;
9510
9511 sme_release_global_lock(&pMac->sme);
9512 }
9513 if (pMac->roam.configParam.isRoamOffloadScanEnabled) {
9514 csr_roam_offload_scan(pMac, sessionId,
9515 ROAM_SCAN_OFFLOAD_UPDATE_CFG,
9516 REASON_NEIGHBOR_SCAN_REFRESH_PERIOD_CHANGED);
9517 }
9518 return status;
9519}
9520
9521/*--------------------------------------------------------------------------
9522 \brief sme_update_roam_scan_offload_enabled() - enable/disable roam scan
9523 offload feaure
9524 It is used at in the REG_DYNAMIC_VARIABLE macro definition of
9525 gRoamScanOffloadEnabled.
9526 This is a synchronous call
9527 \param hHal - The handle returned by mac_open.
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309528 \return QDF_STATUS_SUCCESS - SME update config successfully.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009529 Other status means SME is failed to update.
9530 \sa
9531 --------------------------------------------------------------------------*/
9532
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309533QDF_STATUS sme_update_roam_scan_offload_enabled(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009534 bool nRoamScanOffloadEnabled)
9535{
9536 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309537 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009538
9539 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309540 if (QDF_IS_STATUS_SUCCESS(status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05309541 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009542 FL
9543 ("gRoamScanOffloadEnabled is changed from %d to %d"),
9544 pMac->roam.configParam.isRoamOffloadScanEnabled,
9545 nRoamScanOffloadEnabled);
9546 pMac->roam.configParam.isRoamOffloadScanEnabled =
9547 nRoamScanOffloadEnabled;
9548 sme_release_global_lock(&pMac->sme);
9549 }
9550
9551 return status;
9552}
9553
9554/*--------------------------------------------------------------------------
9555 \brief sme_get_neighbor_scan_refresh_period() - get neighbor scan results
9556 refresh period
9557 This is a synchronous call
9558 \param hHal - The handle returned by mac_open.
9559 \return uint16_t - Neighbor scan results refresh period value
9560 \sa
9561 --------------------------------------------------------------------------*/
9562uint16_t sme_get_neighbor_scan_refresh_period(tHalHandle hHal)
9563{
9564 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
9565 return pMac->roam.configParam.neighborRoamConfig.
9566 nNeighborResultsRefreshPeriod;
9567}
9568
9569/*--------------------------------------------------------------------------
9570 \brief sme_get_empty_scan_refresh_period() - get empty scan refresh period
9571 This is a synchronuous call
9572 \param hHal - The handle returned by mac_open.
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309573 \return QDF_STATUS_SUCCESS - SME update config successful.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009574 Other status means SME is failed to update
9575 \sa
9576 --------------------------------------------------------------------------*/
9577uint16_t sme_get_empty_scan_refresh_period(tHalHandle hHal)
9578{
9579 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
9580 return pMac->roam.configParam.neighborRoamConfig.
9581 nEmptyScanRefreshPeriod;
9582}
9583
9584/* ---------------------------------------------------------------------------
9585 \fn sme_update_empty_scan_refresh_period
9586 \brief Update nEmptyScanRefreshPeriod
9587 This function is called through dynamic setConfig callback function
9588 to configure nEmptyScanRefreshPeriod
9589 Usage: adb shell iwpriv wlan0 setConfig
9590 nEmptyScanRefreshPeriod=[0 .. 60]
9591 \param hHal - HAL handle for device
9592 \param sessionId - Session Identifier
9593 \param nEmptyScanRefreshPeriod - scan period following empty scan results.
9594 \- return Success or failure
9595 -------------------------------------------------------------------------*/
9596
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309597QDF_STATUS sme_update_empty_scan_refresh_period(tHalHandle hHal, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009598 uint16_t nEmptyScanRefreshPeriod)
9599{
9600 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309601 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009602 tCsrNeighborRoamConfig *pNeighborRoamConfig = NULL;
9603 tpCsrNeighborRoamControlInfo pNeighborRoamInfo = NULL;
9604
Naveen Rawatc36f7eb2016-11-10 20:01:03 -08009605 if (sessionId >= CSR_ROAM_SESSION_MAX) {
9606 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
9607 FL("Invalid sme session id: %d"), sessionId);
9608 return QDF_STATUS_E_INVAL;
9609 }
9610
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009611 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309612 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009613 pNeighborRoamConfig =
9614 &pMac->roam.configParam.neighborRoamConfig;
9615 pNeighborRoamInfo = &pMac->roam.neighborRoamInfo[sessionId];
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05309616 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009617 "LFR runtime successfully set roam scan period to %d -old value is %d - roam state is %s",
9618 nEmptyScanRefreshPeriod,
9619 pMac->roam.configParam.neighborRoamConfig.
9620 nEmptyScanRefreshPeriod,
9621 mac_trace_get_neighbour_roam_state(pMac->roam.
9622 neighborRoamInfo
9623 [sessionId].
9624 neighborRoamState));
9625 pNeighborRoamConfig->nEmptyScanRefreshPeriod =
9626 nEmptyScanRefreshPeriod;
9627 pNeighborRoamInfo->cfgParams.emptyScanRefreshPeriod =
9628 nEmptyScanRefreshPeriod;
9629 sme_release_global_lock(&pMac->sme);
9630 }
9631 if (pMac->roam.configParam.isRoamOffloadScanEnabled) {
9632 csr_roam_offload_scan(pMac, sessionId,
9633 ROAM_SCAN_OFFLOAD_UPDATE_CFG,
9634 REASON_EMPTY_SCAN_REF_PERIOD_CHANGED);
9635 }
9636 return status;
9637}
9638
9639/* ---------------------------------------------------------------------------
9640 \fn sme_set_neighbor_scan_min_chan_time
9641 \brief Update nNeighborScanMinChanTime
9642 This function is called through dynamic setConfig callback function
9643 to configure gNeighborScanChannelMinTime
9644 Usage: adb shell iwpriv wlan0 setConfig
9645 gNeighborScanChannelMinTime=[0 .. 60]
9646 \param hHal - HAL handle for device
9647 \param nNeighborScanMinChanTime - Channel minimum dwell time
9648 \param sessionId - Session Identifier
9649 \- return Success or failure
9650 -------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309651QDF_STATUS sme_set_neighbor_scan_min_chan_time(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009652 const uint16_t
9653 nNeighborScanMinChanTime,
9654 uint8_t sessionId)
9655{
9656 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309657 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009658
Naveen Rawatc36f7eb2016-11-10 20:01:03 -08009659 if (sessionId >= CSR_ROAM_SESSION_MAX) {
9660 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
9661 FL("Invalid sme session id: %d"), sessionId);
9662 return QDF_STATUS_E_INVAL;
9663 }
9664
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009665 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309666 if (QDF_IS_STATUS_SUCCESS(status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05309667 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009668 "LFR runtime successfully set channel min dwell time to %d - old value is %d - roam state is %s",
9669 nNeighborScanMinChanTime,
9670 pMac->roam.configParam.neighborRoamConfig.
9671 nNeighborScanMinChanTime,
9672 mac_trace_get_neighbour_roam_state(pMac->roam.
9673 neighborRoamInfo
9674 [sessionId].
9675 neighborRoamState));
9676
9677 pMac->roam.configParam.neighborRoamConfig.
9678 nNeighborScanMinChanTime = nNeighborScanMinChanTime;
9679 pMac->roam.neighborRoamInfo[sessionId].cfgParams.
9680 minChannelScanTime = nNeighborScanMinChanTime;
9681 sme_release_global_lock(&pMac->sme);
9682 }
9683
9684 return status;
9685}
9686
9687/* ---------------------------------------------------------------------------
9688 \fn sme_set_neighbor_scan_max_chan_time
9689 \brief Update nNeighborScanMaxChanTime
9690 This function is called through dynamic setConfig callback function
9691 to configure gNeighborScanChannelMaxTime
9692 Usage: adb shell iwpriv wlan0 setConfig
9693 gNeighborScanChannelMaxTime=[0 .. 60]
9694 \param hHal - HAL handle for device
9695 \param sessionId - Session Identifier
9696 \param nNeighborScanMinChanTime - Channel maximum dwell time
9697 \- return Success or failure
9698 -------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309699QDF_STATUS sme_set_neighbor_scan_max_chan_time(tHalHandle hHal, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009700 const uint16_t
9701 nNeighborScanMaxChanTime)
9702{
9703 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309704 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009705 tCsrNeighborRoamConfig *pNeighborRoamConfig = NULL;
9706 tpCsrNeighborRoamControlInfo pNeighborRoamInfo = NULL;
9707
Naveen Rawatc36f7eb2016-11-10 20:01:03 -08009708 if (sessionId >= CSR_ROAM_SESSION_MAX) {
9709 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
9710 FL("Invalid sme session id: %d"), sessionId);
9711 return QDF_STATUS_E_INVAL;
9712 }
9713
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009714 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309715 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009716 pNeighborRoamConfig =
9717 &pMac->roam.configParam.neighborRoamConfig;
9718 pNeighborRoamInfo = &pMac->roam.neighborRoamInfo[sessionId];
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05309719 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009720 "LFR runtime successfully set channel max dwell time to %d - old value is %d - roam state is %s",
9721 nNeighborScanMaxChanTime,
9722 pMac->roam.configParam.neighborRoamConfig.
9723 nNeighborScanMaxChanTime,
9724 mac_trace_get_neighbour_roam_state(pMac->roam.
9725 neighborRoamInfo
9726 [sessionId].
9727 neighborRoamState));
9728 pNeighborRoamConfig->nNeighborScanMaxChanTime =
9729 nNeighborScanMaxChanTime;
9730 pNeighborRoamInfo->cfgParams.maxChannelScanTime =
9731 nNeighborScanMaxChanTime;
9732 sme_release_global_lock(&pMac->sme);
9733 }
9734 if (pMac->roam.configParam.isRoamOffloadScanEnabled) {
9735 csr_roam_offload_scan(pMac, sessionId,
9736 ROAM_SCAN_OFFLOAD_UPDATE_CFG,
9737 REASON_SCAN_CH_TIME_CHANGED);
9738 }
9739
9740 return status;
9741}
9742
9743/* ---------------------------------------------------------------------------
9744 \fn sme_get_neighbor_scan_min_chan_time
9745 \brief get neighbor scan min channel time
9746 \param hHal - The handle returned by mac_open.
9747 \param sessionId - Session Identifier
9748 \return uint16_t - channel min time value
9749 -------------------------------------------------------------------------*/
9750uint16_t sme_get_neighbor_scan_min_chan_time(tHalHandle hHal, uint8_t sessionId)
9751{
9752 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Naveen Rawatc36f7eb2016-11-10 20:01:03 -08009753
9754 if (sessionId >= CSR_ROAM_SESSION_MAX) {
9755 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
9756 FL("Invalid sme session id: %d"), sessionId);
9757 return 0;
9758 }
9759
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009760 return pMac->roam.neighborRoamInfo[sessionId].cfgParams.
9761 minChannelScanTime;
9762}
9763
9764/* ---------------------------------------------------------------------------
9765 \fn sme_get_neighbor_roam_state
9766 \brief get neighbor roam state
9767 \param hHal - The handle returned by mac_open.
9768 \param sessionId - Session Identifier
9769 \return uint32_t - neighbor roam state
9770 -------------------------------------------------------------------------*/
9771uint32_t sme_get_neighbor_roam_state(tHalHandle hHal, uint8_t sessionId)
9772{
9773 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Naveen Rawatc36f7eb2016-11-10 20:01:03 -08009774
9775 if (sessionId >= CSR_ROAM_SESSION_MAX) {
9776 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
9777 FL("Invalid sme session id: %d"), sessionId);
9778 return 0;
9779 }
9780
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009781 return pMac->roam.neighborRoamInfo[sessionId].neighborRoamState;
9782}
9783
9784/* ---------------------------------------------------------------------------
9785 \fn sme_get_current_roam_state
9786 \brief get current roam state
9787 \param hHal - The handle returned by mac_open.
9788 \param sessionId - Session Identifier
9789 \return uint32_t - current roam state
9790 -------------------------------------------------------------------------*/
9791uint32_t sme_get_current_roam_state(tHalHandle hHal, uint8_t sessionId)
9792{
9793 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
9794 return pMac->roam.curState[sessionId];
9795}
9796
9797/* ---------------------------------------------------------------------------
9798 \fn sme_get_current_roam_sub_state
9799 \brief get neighbor roam sub state
9800 \param hHal - The handle returned by mac_open.
9801 \param sessionId - Session Identifier
9802 \return uint32_t - current roam sub state
9803 -------------------------------------------------------------------------*/
9804uint32_t sme_get_current_roam_sub_state(tHalHandle hHal, uint8_t sessionId)
9805{
9806 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
9807 return pMac->roam.curSubState[sessionId];
9808}
9809
9810/* ---------------------------------------------------------------------------
9811 \fn sme_get_lim_sme_state
9812 \brief get Lim Sme state
9813 \param hHal - The handle returned by mac_open.
9814 \return uint32_t - Lim Sme state
9815 -------------------------------------------------------------------------*/
9816uint32_t sme_get_lim_sme_state(tHalHandle hHal)
9817{
9818 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
9819 return pMac->lim.gLimSmeState;
9820}
9821
9822/* ---------------------------------------------------------------------------
9823 \fn sme_get_lim_mlm_state
9824 \brief get Lim Mlm state
9825 \param hHal - The handle returned by mac_open.
9826 \return uint32_t - Lim Mlm state
9827 -------------------------------------------------------------------------*/
9828uint32_t sme_get_lim_mlm_state(tHalHandle hHal)
9829{
9830 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
9831 return pMac->lim.gLimMlmState;
9832}
9833
9834/* ---------------------------------------------------------------------------
9835 \fn sme_is_lim_session_valid
9836 \brief is Lim session valid
9837 \param hHal - The handle returned by mac_open.
9838 \param sessionId - Session Identifier
9839 \return bool - true or false
9840 -------------------------------------------------------------------------*/
9841bool sme_is_lim_session_valid(tHalHandle hHal, uint8_t sessionId)
9842{
9843 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Hanumantha Reddy Pothula589fd702015-11-17 15:25:16 +05309844
9845 if (sessionId > pMac->lim.maxBssId)
9846 return false;
9847
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009848 return pMac->lim.gpSession[sessionId].valid;
9849}
9850
9851/* ---------------------------------------------------------------------------
9852 \fn sme_get_lim_sme_session_state
9853 \brief get Lim Sme session state
9854 \param hHal - The handle returned by mac_open.
9855 \param sessionId - Session Identifier
9856 \return uint32_t - Lim Sme session state
9857 -------------------------------------------------------------------------*/
9858uint32_t sme_get_lim_sme_session_state(tHalHandle hHal, uint8_t sessionId)
9859{
9860 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
9861 return pMac->lim.gpSession[sessionId].limSmeState;
9862}
9863
9864/* ---------------------------------------------------------------------------
9865 \fn sme_get_lim_mlm_session_state
9866 \brief get Lim Mlm session state
9867 \param hHal - The handle returned by mac_open.
9868 \param sessionId - Session Identifier
9869 \return uint32_t - Lim Mlm session state
9870 -------------------------------------------------------------------------*/
9871uint32_t sme_get_lim_mlm_session_state(tHalHandle hHal, uint8_t sessionId)
9872{
9873 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
9874 return pMac->lim.gpSession[sessionId].limMlmState;
9875}
9876
9877/* ---------------------------------------------------------------------------
9878 \fn sme_get_neighbor_scan_max_chan_time
9879 \brief get neighbor scan max channel time
9880 \param hHal - The handle returned by mac_open.
9881 \param sessionId - Session Identifier
9882 \return uint16_t - channel max time value
9883 -------------------------------------------------------------------------*/
9884uint16_t sme_get_neighbor_scan_max_chan_time(tHalHandle hHal, uint8_t sessionId)
9885{
9886 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Naveen Rawatc36f7eb2016-11-10 20:01:03 -08009887
9888 if (sessionId >= CSR_ROAM_SESSION_MAX) {
9889 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
9890 FL("Invalid sme session id: %d"), sessionId);
9891 return 0;
9892 }
9893
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009894 return pMac->roam.neighborRoamInfo[sessionId].cfgParams.
9895 maxChannelScanTime;
9896}
9897
9898/* ---------------------------------------------------------------------------
9899 \fn sme_set_neighbor_scan_period
9900 \brief Update nNeighborScanPeriod
9901 This function is called through dynamic setConfig callback function
9902 to configure nNeighborScanPeriod
9903 Usage: adb shell iwpriv wlan0 setConfig
9904 nNeighborScanPeriod=[0 .. 1000]
9905 \param hHal - HAL handle for device
9906 \param sessionId - Session Identifier
9907 \param nNeighborScanPeriod - neighbor scan period
9908 \- return Success or failure
9909 -------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309910QDF_STATUS sme_set_neighbor_scan_period(tHalHandle hHal, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009911 const uint16_t nNeighborScanPeriod)
9912{
9913 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309914 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009915 tCsrNeighborRoamConfig *pNeighborRoamConfig = NULL;
9916 tpCsrNeighborRoamControlInfo pNeighborRoamInfo = NULL;
9917
Naveen Rawatc36f7eb2016-11-10 20:01:03 -08009918 if (sessionId >= CSR_ROAM_SESSION_MAX) {
9919 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
9920 FL("Invalid sme session id: %d"), sessionId);
9921 return QDF_STATUS_E_INVAL;
9922 }
9923
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009924 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309925 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009926 pNeighborRoamConfig =
9927 &pMac->roam.configParam.neighborRoamConfig;
9928 pNeighborRoamInfo = &pMac->roam.neighborRoamInfo[sessionId];
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05309929 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009930 "LFR runtime successfully set neighbor scan period to %d"
9931 " - old value is %d - roam state is %s",
9932 nNeighborScanPeriod,
9933 pMac->roam.configParam.neighborRoamConfig.
9934 nNeighborScanTimerPeriod,
9935 mac_trace_get_neighbour_roam_state(pMac->roam.
9936 neighborRoamInfo
9937 [sessionId].
9938 neighborRoamState));
9939 pNeighborRoamConfig->nNeighborScanTimerPeriod =
9940 nNeighborScanPeriod;
9941 pNeighborRoamInfo->cfgParams.neighborScanPeriod =
9942 nNeighborScanPeriod;
9943 sme_release_global_lock(&pMac->sme);
9944 }
9945 if (pMac->roam.configParam.isRoamOffloadScanEnabled) {
9946 csr_roam_offload_scan(pMac, sessionId,
9947 ROAM_SCAN_OFFLOAD_UPDATE_CFG,
9948 REASON_SCAN_HOME_TIME_CHANGED);
9949 }
9950
9951 return status;
9952}
9953
9954/* ---------------------------------------------------------------------------
9955 \fn sme_get_neighbor_scan_period
9956 \brief get neighbor scan period
9957 \param hHal - The handle returned by mac_open.
9958 \param sessionId - Session Identifier
9959 \return uint16_t - neighbor scan period
9960 -------------------------------------------------------------------------*/
9961uint16_t sme_get_neighbor_scan_period(tHalHandle hHal, uint8_t sessionId)
9962{
9963 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Naveen Rawatc36f7eb2016-11-10 20:01:03 -08009964
9965 if (sessionId >= CSR_ROAM_SESSION_MAX) {
9966 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
9967 FL("Invalid sme session id: %d"), sessionId);
9968 return 0;
9969 }
9970
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009971 return pMac->roam.neighborRoamInfo[sessionId].cfgParams.
9972 neighborScanPeriod;
9973}
9974
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009975
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009976
9977/*--------------------------------------------------------------------------
9978 \brief sme_get_roam_rssi_diff() - get Roam rssi diff
9979 This is a synchronous call
9980 \param hHal - The handle returned by mac_open.
9981 \return uint16_t - Rssi diff value
9982 \sa
9983 --------------------------------------------------------------------------*/
9984uint8_t sme_get_roam_rssi_diff(tHalHandle hHal)
9985{
9986 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
9987 return pMac->roam.configParam.RoamRssiDiff;
9988}
9989
9990/**
9991 * sme_change_roam_scan_channel_list() - to change scan channel list
9992 * @hHal: pointer HAL handle returned by mac_open
9993 * @sessionId: sme session id
9994 * @pChannelList: Output channel list
9995 * @numChannels: Output number of channels
9996 *
9997 * This routine is called to Change roam scan channel list.
9998 * This is a synchronous call
9999 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010000 * Return: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010001 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010002QDF_STATUS sme_change_roam_scan_channel_list(tHalHandle hHal, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010003 uint8_t *pChannelList,
10004 uint8_t numChannels)
10005{
10006 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010007 QDF_STATUS status = QDF_STATUS_SUCCESS;
Naveen Rawatc36f7eb2016-11-10 20:01:03 -080010008 tpCsrNeighborRoamControlInfo pNeighborRoamInfo = NULL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010009 uint8_t oldChannelList[WNI_CFG_VALID_CHANNEL_LIST_LEN * 2] = { 0 };
10010 uint8_t newChannelList[WNI_CFG_VALID_CHANNEL_LIST_LEN * 2] = { 0 };
10011 uint8_t i = 0, j = 0;
10012 tCsrChannelInfo *chan_info;
10013
Naveen Rawatc36f7eb2016-11-10 20:01:03 -080010014 if (sessionId >= CSR_ROAM_SESSION_MAX) {
10015 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
10016 FL("Invalid sme session id: %d"), sessionId);
10017 return QDF_STATUS_E_INVAL;
10018 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010019
Naveen Rawatc36f7eb2016-11-10 20:01:03 -080010020 pNeighborRoamInfo = &pMac->roam.neighborRoamInfo[sessionId];
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010021 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010022 if (!QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010023 if (pMac->roam.configParam.isRoamOffloadScanEnabled)
10024 csr_roam_offload_scan(pMac, sessionId,
10025 ROAM_SCAN_OFFLOAD_UPDATE_CFG,
10026 REASON_CHANNEL_LIST_CHANGED);
10027 return status;
10028 }
10029 chan_info = &pNeighborRoamInfo->cfgParams.channelInfo;
10030
10031 if (NULL != chan_info->ChannelList) {
10032 for (i = 0; i < chan_info->numOfChannels; i++) {
10033 if (j < sizeof(oldChannelList))
10034 j += snprintf(oldChannelList + j,
10035 sizeof(oldChannelList) -
10036 j, "%d",
10037 chan_info->ChannelList[i]);
10038 else
10039 break;
10040 }
10041 }
10042 csr_flush_cfg_bg_scan_roam_channel_list(pMac, sessionId);
10043 csr_create_bg_scan_roam_channel_list(pMac, sessionId, pChannelList,
10044 numChannels);
10045 sme_set_roam_scan_control(hHal, sessionId, 1);
10046 if (NULL != chan_info->ChannelList) {
10047 j = 0;
10048 for (i = 0; i < chan_info->numOfChannels; i++) {
10049 if (j < sizeof(newChannelList))
10050 j += snprintf(newChannelList + j,
10051 sizeof(newChannelList) -
10052 j, " %d",
10053 chan_info->ChannelList[i]);
10054 else
10055 break;
10056 }
10057 }
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053010058 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010059 FL("LFR runtime successfully set roam scan channels to %s - old value is %s - roam state is %d"),
10060 newChannelList, oldChannelList,
10061 pMac->roam.neighborRoamInfo[sessionId].neighborRoamState);
10062 sme_release_global_lock(&pMac->sme);
10063
10064 if (pMac->roam.configParam.isRoamOffloadScanEnabled)
10065 csr_roam_offload_scan(pMac, sessionId,
10066 ROAM_SCAN_OFFLOAD_UPDATE_CFG,
10067 REASON_CHANNEL_LIST_CHANGED);
10068 return status;
10069}
10070
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010071/**
10072 * sme_get_roam_scan_channel_list() - To get roam scan channel list
10073 * @hHal: HAL pointer
10074 * @pChannelList: Output channel list
10075 * @pNumChannels: Output number of channels
10076 * @sessionId: Session Identifier
10077 *
10078 * To get roam scan channel list This is a synchronous call
10079 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010080 * Return: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010081 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010082QDF_STATUS sme_get_roam_scan_channel_list(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010083 uint8_t *pChannelList, uint8_t *pNumChannels,
10084 uint8_t sessionId)
10085{
10086 int i = 0;
10087 uint8_t *pOutPtr = pChannelList;
10088 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Naveen Rawatc36f7eb2016-11-10 20:01:03 -080010089 tpCsrNeighborRoamControlInfo pNeighborRoamInfo = NULL;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010090 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010091
Naveen Rawatc36f7eb2016-11-10 20:01:03 -080010092 if (sessionId >= CSR_ROAM_SESSION_MAX) {
10093 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
10094 FL("Invalid sme session id: %d"), sessionId);
10095 return QDF_STATUS_E_INVAL;
10096 }
10097
10098 pNeighborRoamInfo = &pMac->roam.neighborRoamInfo[sessionId];
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010099 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010100 if (!QDF_IS_STATUS_SUCCESS(status))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010101 return status;
10102 if (NULL == pNeighborRoamInfo->cfgParams.channelInfo.ChannelList) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053010103 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_WARN,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010104 FL("Roam Scan channel list is NOT yet initialized"));
10105 *pNumChannels = 0;
10106 sme_release_global_lock(&pMac->sme);
10107 return status;
10108 }
10109
10110 *pNumChannels = pNeighborRoamInfo->cfgParams.channelInfo.numOfChannels;
10111 for (i = 0; i < (*pNumChannels); i++) {
10112 pOutPtr[i] =
10113 pNeighborRoamInfo->cfgParams.channelInfo.ChannelList[i];
10114 }
10115 pOutPtr[i] = '\0';
10116 sme_release_global_lock(&pMac->sme);
10117 return status;
10118}
10119
10120/*--------------------------------------------------------------------------
10121 \brief sme_get_is_ese_feature_enabled() - get ESE feature enabled or not
10122 This is a synchronuous call
10123 \param hHal - The handle returned by mac_open.
10124 \return true (1) - if the ESE feature is enabled
10125 false (0) - if feature is disabled (compile or runtime)
10126 \sa
10127 --------------------------------------------------------------------------*/
10128bool sme_get_is_ese_feature_enabled(tHalHandle hHal)
10129{
10130#ifdef FEATURE_WLAN_ESE
10131 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
10132 return csr_roam_is_ese_ini_feature_enabled(pMac);
10133#else
10134 return false;
10135#endif
10136}
10137
10138/*--------------------------------------------------------------------------
10139 \brief sme_get_wes_mode() - get WES Mode
10140 This is a synchronous call
10141 \param hHal - The handle returned by mac_open
10142 \return uint8_t - WES Mode Enabled(1)/Disabled(0)
10143 \sa
10144 --------------------------------------------------------------------------*/
10145bool sme_get_wes_mode(tHalHandle hHal)
10146{
10147 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
10148 return pMac->roam.configParam.isWESModeEnabled;
10149}
10150
10151/*--------------------------------------------------------------------------
10152 \brief sme_get_roam_scan_control() - get scan control
10153 This is a synchronous call
10154 \param hHal - The handle returned by mac_open.
10155 \return bool - Enabled(1)/Disabled(0)
10156 \sa
10157 --------------------------------------------------------------------------*/
10158bool sme_get_roam_scan_control(tHalHandle hHal)
10159{
10160 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
10161 return pMac->roam.configParam.nRoamScanControl;
10162}
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010163
10164/*--------------------------------------------------------------------------
10165 \brief sme_get_is_lfr_feature_enabled() - get LFR feature enabled or not
10166 This is a synchronuous call
10167 \param hHal - The handle returned by mac_open.
10168 \return true (1) - if the feature is enabled
10169 false (0) - if feature is disabled (compile or runtime)
10170 \sa
10171 --------------------------------------------------------------------------*/
10172bool sme_get_is_lfr_feature_enabled(tHalHandle hHal)
10173{
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010174 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
10175 return pMac->roam.configParam.isFastRoamIniFeatureEnabled;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010176}
10177
10178/*--------------------------------------------------------------------------
10179 \brief sme_get_is_ft_feature_enabled() - get FT 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_ft_feature_enabled(tHalHandle hHal)
10187{
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010188 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
10189 return pMac->roam.configParam.isFastTransitionEnabled;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010190}
10191
10192/* ---------------------------------------------------------------------------
10193 \fn sme_is_feature_supported_by_fw
10194 \brief Check if an feature is enabled by FW
10195
10196 \param feattEnumValue - Enumeration value from placeHolderInCapBitmap
10197 \- return 1/0 (true/false)
10198 -------------------------------------------------------------------------*/
10199uint8_t sme_is_feature_supported_by_fw(uint8_t featEnumValue)
10200{
10201 return IS_FEATURE_SUPPORTED_BY_FW(featEnumValue);
10202}
10203
10204#ifdef FEATURE_WLAN_TDLS
10205
10206/* ---------------------------------------------------------------------------
10207 \fn sme_send_tdls_link_establish_params
10208 \brief API to send TDLS Peer Link Establishment Parameters.
10209
10210 \param peerMac - peer's Mac Adress.
10211 \param tdlsLinkEstablishParams - TDLS Peer Link Establishment Parameters
Anurag Chouhanf04e84f2016-03-03 10:12:12 +053010212 \- return QDF_STATUS_SUCCES
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010213 -------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010214QDF_STATUS sme_send_tdls_link_establish_params(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010215 uint8_t sessionId,
10216 const tSirMacAddr peerMac,
10217 tCsrTdlsLinkEstablishParams *
10218 tdlsLinkEstablishParams)
10219{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010220 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010221 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
10222
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053010223 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Sreelakshmi Konamki6744cff2015-09-07 12:10:39 +053010224 TRACE_CODE_SME_RX_HDD_TDLS_LINK_ESTABLISH_PARAM,
10225 sessionId,
10226 tdlsLinkEstablishParams->isOffChannelSupported));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010227 status = sme_acquire_global_lock(&pMac->sme);
10228
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010229 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010230 status = csr_tdls_send_link_establish_params(hHal, sessionId,
10231 peerMac, tdlsLinkEstablishParams);
10232 sme_release_global_lock(&pMac->sme);
10233 }
10234 return status;
10235}
10236
10237/* ---------------------------------------------------------------------------
10238 \fn sme_send_tdls_mgmt_frame
10239 \brief API to send TDLS management frames.
10240
10241 \param peerMac - peer's Mac Adress.
10242 \param frame_type - Type of TDLS mgmt frame to be sent.
10243 \param dialog - dialog token used in the frame.
10244 \param status - status to be incuded in the frame.
10245 \param peerCapability - peer cpabilities
10246 \param buf - additional IEs to be included
10247 \param len - lenght of additional Ies
10248 \param responder - Tdls request type
Anurag Chouhanf04e84f2016-03-03 10:12:12 +053010249 \- return QDF_STATUS_SUCCES
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010250 -------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010251QDF_STATUS sme_send_tdls_mgmt_frame(tHalHandle hHal, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010252 const tSirMacAddr peerMac,
10253 uint8_t frame_type,
10254 uint8_t dialog, uint16_t statusCode,
10255 uint32_t peerCapability, uint8_t *buf,
10256 uint8_t len, uint8_t responder)
10257{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010258 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010259 tCsrTdlsSendMgmt sendTdlsReq = { {0} };
10260 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
10261
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053010262 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Sreelakshmi Konamki6744cff2015-09-07 12:10:39 +053010263 TRACE_CODE_SME_RX_HDD_TDLS_SEND_MGMT_FRAME,
10264 sessionId, statusCode));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010265 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010266 if (QDF_IS_STATUS_SUCCESS(status)) {
Anurag Chouhan600c3a02016-03-01 10:33:54 +053010267 qdf_mem_copy(sendTdlsReq.peerMac, peerMac, sizeof(tSirMacAddr));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010268 sendTdlsReq.frameType = frame_type;
10269 sendTdlsReq.buf = buf;
10270 sendTdlsReq.len = len;
10271 sendTdlsReq.dialog = dialog;
10272 sendTdlsReq.statusCode = statusCode;
10273 sendTdlsReq.responder = responder;
10274 sendTdlsReq.peerCapability = peerCapability;
10275
10276 status = csr_tdls_send_mgmt_req(hHal, sessionId, &sendTdlsReq);
10277
10278 sme_release_global_lock(&pMac->sme);
10279 }
10280
10281 return status;
10282
10283}
10284
10285/* ---------------------------------------------------------------------------
10286 \fn sme_change_tdls_peer_sta
10287 \brief API to Update TDLS peer sta parameters.
10288
10289 \param peerMac - peer's Mac Adress.
10290 \param staParams - Peer Station Parameters
Anurag Chouhanf04e84f2016-03-03 10:12:12 +053010291 \- return QDF_STATUS_SUCCES
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010292 -------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010293QDF_STATUS sme_change_tdls_peer_sta(tHalHandle hHal, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010294 const tSirMacAddr peerMac,
10295 tCsrStaParams *pstaParams)
10296{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010297 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010298 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
10299
10300 if (NULL == pstaParams) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053010301 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010302 "%s :pstaParams is NULL", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010303 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010304 }
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053010305 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Sreelakshmi Konamki6744cff2015-09-07 12:10:39 +053010306 TRACE_CODE_SME_RX_HDD_TDLS_CHANGE_PEER_STA,
10307 sessionId, pstaParams->capability));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010308 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010309 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010310 status = csr_tdls_change_peer_sta(hHal, sessionId, peerMac,
10311 pstaParams);
10312
10313 sme_release_global_lock(&pMac->sme);
10314 }
10315
10316 return status;
10317
10318}
10319
10320/* ---------------------------------------------------------------------------
10321 \fn sme_add_tdls_peer_sta
10322 \brief API to Add TDLS peer sta entry.
10323
10324 \param peerMac - peer's Mac Adress.
Anurag Chouhanf04e84f2016-03-03 10:12:12 +053010325 \- return QDF_STATUS_SUCCES
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010326 -------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010327QDF_STATUS sme_add_tdls_peer_sta(tHalHandle hHal, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010328 const tSirMacAddr peerMac)
10329{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010330 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010331 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
10332
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053010333 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Sreelakshmi Konamki6744cff2015-09-07 12:10:39 +053010334 TRACE_CODE_SME_RX_HDD_TDLS_ADD_PEER_STA,
10335 sessionId, 0));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010336 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010337 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010338 status = csr_tdls_add_peer_sta(hHal, sessionId, peerMac);
10339
10340 sme_release_global_lock(&pMac->sme);
10341 }
10342
10343 return status;
10344
10345}
10346
10347/* ---------------------------------------------------------------------------
10348 \fn sme_delete_tdls_peer_sta
10349 \brief API to Delete TDLS peer sta entry.
10350
10351 \param peerMac - peer's Mac Adress.
Anurag Chouhanf04e84f2016-03-03 10:12:12 +053010352 \- return QDF_STATUS_SUCCES
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010353 -------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010354QDF_STATUS sme_delete_tdls_peer_sta(tHalHandle hHal, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010355 const tSirMacAddr peerMac)
10356{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010357 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010358 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
10359
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053010360 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Sreelakshmi Konamki6744cff2015-09-07 12:10:39 +053010361 TRACE_CODE_SME_RX_HDD_TDLS_DEL_PEER_STA,
10362 sessionId, 0));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010363 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010364 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010365 status = csr_tdls_del_peer_sta(hHal, sessionId, peerMac);
10366
10367 sme_release_global_lock(&pMac->sme);
10368 }
10369
10370 return status;
10371
10372}
10373
10374/* ---------------------------------------------------------------------------
10375 \fn sme_set_tdls_power_save_prohibited
10376 \API to set/reset the is_tdls_power_save_prohibited.
10377
10378 \- return void
10379 -------------------------------------------------------------------------*/
10380void sme_set_tdls_power_save_prohibited(tHalHandle hHal, uint32_t sessionId,
10381 bool val)
10382{
10383 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
10384 struct ps_global_info *ps_global_info = &pMac->sme.ps_global_info;
10385 struct ps_params *ps_param = &ps_global_info->ps_params[sessionId];
10386 ps_param->is_tdls_power_save_prohibited = val;
10387 return;
10388}
10389
10390/* ---------------------------------------------------------------------------
10391 \fn sme_update_fw_tdls_state
10392
10393 \brief
10394 SME will send message to WMA to set TDLS state in f/w
10395
10396 \param
10397
10398 hHal - The handle returned by mac_open
10399
10400 psmeTdlsParams - TDLS state info to update in f/w
10401
10402 useSmeLock - Need to acquire SME Global Lock before state update or not
10403
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010404 \return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010405 --------------------------------------------------------------------------- */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010406QDF_STATUS sme_update_fw_tdls_state(tHalHandle hHal, void *psmeTdlsParams,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010407 bool useSmeLock)
10408{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010409 QDF_STATUS status = QDF_STATUS_SUCCESS;
10410 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010411 tpAniSirGlobal pMac = NULL;
10412 cds_msg_t cds_message;
10413
Mukul Sharmaeae172c2016-09-03 13:40:46 +053010414 pMac = PMAC_STRUCT(hHal);
10415 if (NULL == pMac) {
10416 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
10417 FL("pMac is Null"));
10418 return QDF_STATUS_E_FAILURE;
10419 }
10420
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010421 /* only acquire sme global lock before state update if asked to */
10422 if (useSmeLock) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010423 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010424 if (QDF_STATUS_SUCCESS != status)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010425 return status;
10426 }
10427
10428 /* serialize the req through MC thread */
10429 cds_message.bodyptr = psmeTdlsParams;
10430 cds_message.type = WMA_UPDATE_FW_TDLS_STATE;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010431 qdf_status = cds_mq_post_message(CDS_MQ_ID_WMA, &cds_message);
10432 if (!QDF_IS_STATUS_SUCCESS(qdf_status))
10433 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010434
10435 /* release the lock if it was acquired */
10436 if (useSmeLock)
10437 sme_release_global_lock(&pMac->sme);
10438
10439 return status;
10440}
10441
10442/**
10443 * sme_update_tdls_peer_state() - to update the state of TDLS peer
10444 * @hHal: The handle returned by mac_open
10445 * @peerStateParams: TDLS Peer state info to update in f/w
10446 *
10447 * SME will send message to WMA to set TDLS Peer state in f/w
10448 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010449 * Return: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010450 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010451QDF_STATUS sme_update_tdls_peer_state(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010452 tSmeTdlsPeerStateParams *peerStateParams)
10453{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010454 QDF_STATUS status = QDF_STATUS_SUCCESS;
10455 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010456 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
10457 tTdlsPeerStateParams *pTdlsPeerStateParams = NULL;
10458 tTdlsPeerCapParams *peer_cap = NULL;
10459 cds_msg_t cds_message;
10460 uint8_t num;
Kabilan Kannan44f65862016-06-28 23:46:51 -070010461 uint8_t peer_chan_len;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010462 uint8_t chanId;
10463 uint8_t i;
10464
10465 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010466 if (!QDF_IS_STATUS_SUCCESS(status))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010467 return status;
Anurag Chouhan600c3a02016-03-01 10:33:54 +053010468 pTdlsPeerStateParams = qdf_mem_malloc(sizeof(*pTdlsPeerStateParams));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010469 if (NULL == pTdlsPeerStateParams) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053010470 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010471 FL("failed to allocate mem for tdls peer state param"));
10472 sme_release_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010473 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010474 }
10475
Anurag Chouhan600c3a02016-03-01 10:33:54 +053010476 qdf_mem_copy(&pTdlsPeerStateParams->peerMacAddr,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010477 &peerStateParams->peerMacAddr, sizeof(tSirMacAddr));
10478 pTdlsPeerStateParams->vdevId = peerStateParams->vdevId;
10479 pTdlsPeerStateParams->peerState = peerStateParams->peerState;
10480
10481 switch (peerStateParams->peerState) {
10482 case eSME_TDLS_PEER_STATE_PEERING:
10483 pTdlsPeerStateParams->peerState =
10484 WMA_TDLS_PEER_STATE_PEERING;
10485 break;
10486
10487 case eSME_TDLS_PEER_STATE_CONNECTED:
10488 pTdlsPeerStateParams->peerState =
10489 WMA_TDLS_PEER_STATE_CONNECTED;
10490 break;
10491
10492 case eSME_TDLS_PEER_STATE_TEARDOWN:
10493 pTdlsPeerStateParams->peerState =
10494 WMA_TDLS_PEER_STATE_TEARDOWN;
10495 break;
10496
Kabilan Kannan421714b2015-11-23 04:44:59 -080010497 case eSME_TDLS_PEER_ADD_MAC_ADDR:
10498 pTdlsPeerStateParams->peerState = WMA_TDLS_PEER_ADD_MAC_ADDR;
10499 break;
10500
10501 case eSME_TDLS_PEER_REMOVE_MAC_ADDR:
10502 pTdlsPeerStateParams->peerState = WMA_TDLS_PEER_REMOVE_MAC_ADDR;
10503 break;
10504
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010505 default:
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053010506 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010507 FL("invalid peer state param (%d)"),
10508 peerStateParams->peerState);
Kabilan Kannan44f65862016-06-28 23:46:51 -070010509 goto error_return;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010510 }
10511 peer_cap = &(pTdlsPeerStateParams->peerCap);
10512 peer_cap->isPeerResponder =
10513 peerStateParams->peerCap.isPeerResponder;
10514 peer_cap->peerUapsdQueue =
10515 peerStateParams->peerCap.peerUapsdQueue;
10516 peer_cap->peerMaxSp =
10517 peerStateParams->peerCap.peerMaxSp;
10518 peer_cap->peerBuffStaSupport =
10519 peerStateParams->peerCap.peerBuffStaSupport;
10520 peer_cap->peerOffChanSupport =
10521 peerStateParams->peerCap.peerOffChanSupport;
10522 peer_cap->peerCurrOperClass =
10523 peerStateParams->peerCap.peerCurrOperClass;
10524 peer_cap->selfCurrOperClass =
10525 peerStateParams->peerCap.selfCurrOperClass;
10526
10527 num = 0;
Kabilan Kannan44f65862016-06-28 23:46:51 -070010528 peer_chan_len = peerStateParams->peerCap.peerChanLen;
10529
10530 if (peer_chan_len >= 0 &&
10531 peer_chan_len <= SME_TDLS_MAX_SUPP_CHANNELS) {
10532 for (i = 0; i < peerStateParams->peerCap.peerChanLen; i++) {
10533 chanId = peerStateParams->peerCap.peerChan[i];
10534 if (csr_roam_is_channel_valid(pMac, chanId) &&
10535 !(cds_get_channel_state(chanId) ==
10536 CHANNEL_STATE_DFS) &&
10537 !cds_is_dsrc_channel(cds_chan_to_freq(chanId))) {
10538 peer_cap->peerChan[num].chanId = chanId;
10539 peer_cap->peerChan[num].pwr =
10540 csr_get_cfg_max_tx_power(pMac, chanId);
10541 peer_cap->peerChan[num].dfsSet = false;
Archana Ramachandran63f64dd2016-04-28 15:13:35 -070010542 num++;
Kabilan Kannan44f65862016-06-28 23:46:51 -070010543 }
Archana Ramachandran63f64dd2016-04-28 15:13:35 -070010544 }
Kabilan Kannan44f65862016-06-28 23:46:51 -070010545 } else {
10546 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
10547 FL("invalid peer channel len (%d)"),
10548 peer_chan_len);
10549 goto error_return;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010550 }
Kabilan Kannan44f65862016-06-28 23:46:51 -070010551
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010552 peer_cap->peerChanLen = num;
10553 peer_cap->peerOperClassLen =
10554 peerStateParams->peerCap.peerOperClassLen;
10555 for (i = 0; i < HAL_TDLS_MAX_SUPP_OPER_CLASSES; i++) {
10556 peer_cap->peerOperClass[i] =
10557 peerStateParams->peerCap.peerOperClass[i];
10558 }
10559
10560 peer_cap->prefOffChanNum =
10561 peerStateParams->peerCap.prefOffChanNum;
10562 peer_cap->prefOffChanBandwidth =
10563 peerStateParams->peerCap.prefOffChanBandwidth;
Masti, Narayanraddic4a7ab82015-11-25 15:41:10 +053010564 peer_cap->opClassForPrefOffChan =
10565 peerStateParams->peerCap.opClassForPrefOffChan;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010566
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010567 cds_message.type = WMA_UPDATE_TDLS_PEER_STATE;
10568 cds_message.reserved = 0;
10569 cds_message.bodyptr = pTdlsPeerStateParams;
10570
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010571 qdf_status = cds_mq_post_message(CDS_MQ_ID_WMA, &cds_message);
10572 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
Kabilan Kannan44f65862016-06-28 23:46:51 -070010573 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
10574 FL("cds_mq_post_message failed "));
10575 goto error_return;
10576 } else {
10577 goto success_return;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010578 }
Kabilan Kannan44f65862016-06-28 23:46:51 -070010579
10580error_return:
10581 status = QDF_STATUS_E_FAILURE;
10582 qdf_mem_free(pTdlsPeerStateParams);
10583success_return:
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010584 sme_release_global_lock(&pMac->sme);
10585 return status;
10586}
10587
10588/**
10589 * sme_send_tdls_chan_switch_req() - send tdls channel switch request
10590 * @hal: UMAC handler
10591 * @ch_switch_params: Pointer to the chan switch parameter structure
10592 *
10593 * API to set tdls channel switch parameters.
10594 *
Anurag Chouhanf04e84f2016-03-03 10:12:12 +053010595 * Return: QDF_STATUS_SUCCESS on success; another QDF_STATUS_** code otherwise
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010596 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010597QDF_STATUS sme_send_tdls_chan_switch_req(tHalHandle hal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010598 sme_tdls_chan_switch_params *ch_switch_params)
10599{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010600 QDF_STATUS status = QDF_STATUS_SUCCESS;
10601 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010602 tpAniSirGlobal mac = PMAC_STRUCT(hal);
10603 tdls_chan_switch_params *chan_switch_params = NULL;
10604 cds_msg_t cds_message;
10605
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053010606 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Sreelakshmi Konamki6744cff2015-09-07 12:10:39 +053010607 TRACE_CODE_SME_RX_HDD_TDLS_CHAN_SWITCH_REQ,
10608 NO_SESSION, ch_switch_params->tdls_off_channel));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010609 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010610 if (QDF_STATUS_SUCCESS != status)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010611 return status;
Anurag Chouhan600c3a02016-03-01 10:33:54 +053010612 chan_switch_params = qdf_mem_malloc(sizeof(*chan_switch_params));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010613 if (NULL == chan_switch_params) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053010614 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010615 FL("fail to alloc mem for tdls chan switch param"));
10616 sme_release_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010617 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010618 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010619
10620 switch (ch_switch_params->tdls_off_ch_mode) {
10621 case ENABLE_CHANSWITCH:
10622 chan_switch_params->tdls_sw_mode = WMA_TDLS_ENABLE_OFFCHANNEL;
10623 break;
10624
10625 case DISABLE_CHANSWITCH:
10626 chan_switch_params->tdls_sw_mode = WMA_TDLS_DISABLE_OFFCHANNEL;
10627 break;
10628
10629 default:
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053010630 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010631 FL("invalid off channel command (%d)"),
10632 ch_switch_params->tdls_off_ch_mode);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053010633 qdf_mem_free(chan_switch_params);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010634 sme_release_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010635 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010636 }
10637
Anurag Chouhan600c3a02016-03-01 10:33:54 +053010638 qdf_mem_copy(&chan_switch_params->peer_mac_addr,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010639 &ch_switch_params->peer_mac_addr, sizeof(tSirMacAddr));
10640 chan_switch_params->vdev_id = ch_switch_params->vdev_id;
10641 chan_switch_params->tdls_off_ch = ch_switch_params->tdls_off_channel;
10642 chan_switch_params->tdls_off_ch_bw_offset =
10643 ch_switch_params->tdls_off_ch_bw_offset;
10644 chan_switch_params->is_responder = ch_switch_params->is_responder;
Masti, Narayanraddic4a7ab82015-11-25 15:41:10 +053010645 chan_switch_params->oper_class = ch_switch_params->opclass;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010646
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053010647 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010648 FL("Country Code=%s, Req offset=%d, Selected Operate Class=%d"),
10649 mac->scan.countryCodeCurrent,
10650 chan_switch_params->tdls_off_ch_bw_offset,
10651 chan_switch_params->oper_class);
10652
10653 cds_message.type = WMA_TDLS_SET_OFFCHAN_MODE;
10654 cds_message.reserved = 0;
10655 cds_message.bodyptr = chan_switch_params;
10656
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010657 qdf_status = cds_mq_post_message(CDS_MQ_ID_WMA, &cds_message);
10658 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053010659 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010660 FL("Message Post failed status=%d"),
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010661 qdf_status);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053010662 qdf_mem_free(chan_switch_params);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010663 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010664 }
10665 sme_release_global_lock(&mac->sme);
10666 return status;
10667}
10668#endif /* FEATURE_WLAN_TDLS */
10669
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010670QDF_STATUS sme_get_link_speed(tHalHandle hHal, tSirLinkSpeedInfo *lsReq,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010671 void *plsContext,
10672 void (*pCallbackfn)(tSirLinkSpeedInfo *indParam,
10673 void *pContext))
10674{
10675
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010676 QDF_STATUS status = QDF_STATUS_SUCCESS;
10677 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010678 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
10679 cds_msg_t cds_message;
10680
10681 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010682 if (QDF_STATUS_SUCCESS == status) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010683 if ((NULL == pCallbackfn) &&
10684 (NULL == pMac->sme.pLinkSpeedIndCb)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053010685 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010686 "%s: Indication Call back did not registered",
10687 __func__);
10688 sme_release_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010689 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010690 } else if (NULL != pCallbackfn) {
10691 pMac->sme.pLinkSpeedCbContext = plsContext;
10692 pMac->sme.pLinkSpeedIndCb = pCallbackfn;
10693 }
10694 /* serialize the req through MC thread */
10695 cds_message.bodyptr = lsReq;
10696 cds_message.type = WMA_GET_LINK_SPEED;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010697 qdf_status = cds_mq_post_message(CDS_MQ_ID_WMA, &cds_message);
10698 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
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: Post Link Speed msg fail", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010701 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010702 }
10703 sme_release_global_lock(&pMac->sme);
10704 }
10705 return status;
10706}
10707
10708
10709/*
10710 * SME API to enable/disable WLAN driver initiated SSR
10711 */
10712void sme_update_enable_ssr(tHalHandle hHal, bool enableSSR)
10713{
10714 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010715 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010716
10717 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010718 if (QDF_IS_STATUS_SUCCESS(status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053010719 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010720 "SSR level is changed %d", enableSSR);
10721 /* not serializing this messsage, as this is only going
10722 * to set a variable in WMA/WDI
10723 */
10724 WMA_SetEnableSSR(enableSSR);
10725 sme_release_global_lock(&pMac->sme);
10726 }
10727 return;
10728}
10729
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010730QDF_STATUS sme_check_ch_in_band(tpAniSirGlobal mac_ctx, uint8_t start_ch,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010731 uint8_t ch_cnt)
10732{
10733 uint8_t i;
10734 for (i = 0; i < ch_cnt; i++) {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010735 if (QDF_STATUS_SUCCESS != csr_is_valid_channel(mac_ctx,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010736 (start_ch + i*4)))
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010737 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010738 }
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010739 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010740}
10741
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010742/*convert the ini value to the ENUM used in csr and MAC for CB state*/
10743ePhyChanBondState sme_get_cb_phy_state_from_cb_ini_value(uint32_t cb_ini_value)
10744{
10745 return csr_convert_cb_ini_value_to_phy_cb_state(cb_ini_value);
10746}
10747
10748/*--------------------------------------------------------------------------
10749
10750 \brief sme_set_curr_device_mode() - Sets the current operating device mode.
10751 \param hHal - The handle returned by mac_open.
10752 \param currDeviceMode - Current operating device mode.
10753 --------------------------------------------------------------------------*/
10754
Peng Xuf5d60c82015-10-02 17:17:03 -070010755void sme_set_curr_device_mode(tHalHandle hHal,
Anurag Chouhan6d760662016-02-20 16:05:43 +053010756 enum tQDF_ADAPTER_MODE currDeviceMode)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010757{
10758 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
10759 pMac->sme.currDeviceMode = currDeviceMode;
10760 return;
10761}
10762
10763/*--------------------------------------------------------------------------
10764 \brief sme_handoff_request() - a wrapper function to Request a handoff
10765 from CSR.
10766 This is a synchronous call
10767 \param hHal - The handle returned by mac_open
10768 \param sessionId - Session Identifier
10769 \param pHandoffInfo - info provided by HDD with the handoff request (namely:
10770 BSSID, channel etc.)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010771 \return QDF_STATUS_SUCCESS - SME passed the request to CSR successfully.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010772 Other status means SME is failed to send the request.
10773 \sa
10774 --------------------------------------------------------------------------*/
10775
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010776QDF_STATUS sme_handoff_request(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010777 uint8_t sessionId,
10778 tCsrHandoffRequest *pHandoffInfo)
10779{
10780 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010781 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010782
10783 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010784 if (QDF_IS_STATUS_SUCCESS(status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053010785 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010786 "%s: invoked", __func__);
10787 status = csr_handoff_request(pMac, sessionId, pHandoffInfo);
10788 sme_release_global_lock(&pMac->sme);
10789 }
10790
10791 return status;
10792}
10793
10794#ifdef IPA_OFFLOAD
10795/* ---------------------------------------------------------------------------
10796 \fn sme_ipa_offload_enable_disable
10797 \brief API to enable/disable IPA offload
10798 \param hal - The handle returned by macOpen.
10799 \param session_id - Session Identifier
10800 \param request - Pointer to the offload request.
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010801 \return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010802 ---------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010803QDF_STATUS sme_ipa_offload_enable_disable(tHalHandle hal, uint8_t session_id,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010804 struct sir_ipa_offload_enable_disable *request)
10805{
10806 tpAniSirGlobal pMac = PMAC_STRUCT(hal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010807 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010808 struct sir_ipa_offload_enable_disable *request_buf;
10809 cds_msg_t msg;
10810
10811 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010812 if (QDF_STATUS_SUCCESS == status) {
Anurag Chouhan600c3a02016-03-01 10:33:54 +053010813 request_buf = qdf_mem_malloc(sizeof(*request_buf));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010814 if (NULL == request_buf) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053010815 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Jeff Johnson4fa74ce2016-11-08 11:06:02 -080010816 FL("Not able to allocate memory for IPA_OFFLOAD_ENABLE_DISABLE"));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010817 sme_release_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010818 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010819 }
10820
10821 request_buf->offload_type = request->offload_type;
10822 request_buf->vdev_id = request->vdev_id;
10823 request_buf->enable = request->enable;
10824
10825 msg.type = WMA_IPA_OFFLOAD_ENABLE_DISABLE;
10826 msg.reserved = 0;
10827 msg.bodyptr = request_buf;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010828 if (!QDF_IS_STATUS_SUCCESS(
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010829 cds_mq_post_message(CDS_MQ_ID_WMA, &msg))) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053010830 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Jeff Johnson4fa74ce2016-11-08 11:06:02 -080010831 FL("Not able to post WMA_IPA_OFFLOAD_ENABLE_DISABLE message to WMA"));
Anurag Chouhan600c3a02016-03-01 10:33:54 +053010832 qdf_mem_free(request_buf);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010833 sme_release_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010834 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010835 }
10836
10837 sme_release_global_lock(&pMac->sme);
10838 }
10839
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010840 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010841}
10842#endif /* IPA_OFFLOAD */
10843
10844/*
10845 * SME API to check if there is any infra station or
10846 * P2P client is connected
10847 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010848QDF_STATUS sme_is_sta_p2p_client_connected(tHalHandle hHal)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010849{
10850 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
10851 if (csr_is_infra_connected(pMac)) {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010852 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010853 }
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010854 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010855}
10856
10857#ifdef FEATURE_WLAN_LPHB
10858/* ---------------------------------------------------------------------------
10859 \fn sme_lphb_config_req
10860 \API to make configuration LPHB within FW.
10861 \param hHal - The handle returned by mac_open
10862 \param lphdReq - LPHB request argument by client
10863 \param pCallbackfn - LPHB timeout notification callback function pointer
10864 \- return Configuration message posting status, SUCCESS or Fail
10865 -------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010866QDF_STATUS sme_lphb_config_req
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010867 (tHalHandle hHal,
10868 tSirLPHBReq *lphdReq,
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010869 void (*pCallbackfn)(void *pHddCtx, tSirLPHBInd * indParam)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010870 ) {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010871 QDF_STATUS status = QDF_STATUS_SUCCESS;
10872 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010873 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
10874 cds_msg_t cds_message;
10875
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053010876 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Sreelakshmi Konamki6744cff2015-09-07 12:10:39 +053010877 TRACE_CODE_SME_RX_HDD_LPHB_CONFIG_REQ,
10878 NO_SESSION, lphdReq->cmd));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010879 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010880 if (QDF_STATUS_SUCCESS == status) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010881 if ((LPHB_SET_EN_PARAMS_INDID == lphdReq->cmd) &&
10882 (NULL == pCallbackfn) && (NULL == pMac->sme.pLphbIndCb)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053010883 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010884 "%s: Indication Call back did not registered",
10885 __func__);
10886 sme_release_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010887 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010888 } else if (NULL != pCallbackfn) {
10889 pMac->sme.pLphbIndCb = pCallbackfn;
10890 }
10891
10892 /* serialize the req through MC thread */
10893 cds_message.bodyptr = lphdReq;
10894 cds_message.type = WMA_LPHB_CONF_REQ;
Sreelakshmi Konamki6a065362016-05-31 16:05:01 +053010895 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
10896 NO_SESSION, cds_message.type));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010897 qdf_status = cds_mq_post_message(CDS_MQ_ID_WMA, &cds_message);
10898 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053010899 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010900 "%s: Post Config LPHB MSG fail", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010901 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010902 }
10903 sme_release_global_lock(&pMac->sme);
10904 }
10905
10906 return status;
10907}
10908#endif /* FEATURE_WLAN_LPHB */
10909/*--------------------------------------------------------------------------
10910 \brief sme_enable_disable_split_scan() - a wrapper function to set the split
10911 scan parameter.
10912 This is a synchronous call
10913 \param hHal - The handle returned by mac_open
10914 \return NONE.
10915 \sa
10916 --------------------------------------------------------------------------*/
10917void sme_enable_disable_split_scan(tHalHandle hHal, uint8_t nNumStaChan,
10918 uint8_t nNumP2PChan)
10919{
10920 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
10921
10922 pMac->roam.configParam.nNumStaChanCombinedConc = nNumStaChan;
10923 pMac->roam.configParam.nNumP2PChanCombinedConc = nNumP2PChan;
10924
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053010925 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010926 "%s: SCAN nNumStaChanCombinedConc : %d,"
10927 "nNumP2PChanCombinedConc : %d ",
10928 __func__, nNumStaChan, nNumP2PChan);
10929
10930 return;
10931
10932}
10933
10934/**
10935 * sme_add_periodic_tx_ptrn() - Add Periodic TX Pattern
10936 * @hal: global hal handle
10937 * @addPeriodicTxPtrnParams: request message
10938 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010939 * Return: QDF_STATUS enumeration
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010940 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010941QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010942sme_add_periodic_tx_ptrn(tHalHandle hal,
10943 struct sSirAddPeriodicTxPtrn *addPeriodicTxPtrnParams)
10944{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010945 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010946 tpAniSirGlobal mac = PMAC_STRUCT(hal);
10947 struct sSirAddPeriodicTxPtrn *req_msg;
10948 cds_msg_t msg;
10949
10950 sms_log(mac, LOG1, FL("enter"));
10951
Anurag Chouhan600c3a02016-03-01 10:33:54 +053010952 req_msg = qdf_mem_malloc(sizeof(*req_msg));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010953 if (!req_msg) {
10954 sms_log(mac, LOGE, FL("memory allocation failed"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010955 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010956 }
10957
10958 *req_msg = *addPeriodicTxPtrnParams;
10959
10960 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010961 if (!QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010962 sms_log(mac, LOGE,
10963 FL("sme_acquire_global_lock failed!(status=%d)"),
10964 status);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053010965 qdf_mem_free(req_msg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010966 return status;
10967 }
10968
10969 /* Serialize the req through MC thread */
10970 msg.bodyptr = req_msg;
10971 msg.type = WMA_ADD_PERIODIC_TX_PTRN_IND;
Sreelakshmi Konamki6a065362016-05-31 16:05:01 +053010972 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
10973 NO_SESSION, msg.type));
Anurag Chouhan6d760662016-02-20 16:05:43 +053010974 status = cds_mq_post_message(QDF_MODULE_ID_WMA, &msg);
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("cds_mq_post_message failed!(err=%d)"),
10978 status);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053010979 qdf_mem_free(req_msg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010980 }
10981 sme_release_global_lock(&mac->sme);
10982 return status;
10983}
10984
10985/**
10986 * sme_del_periodic_tx_ptrn() - Delete Periodic TX Pattern
10987 * @hal: global hal handle
10988 * @delPeriodicTxPtrnParams: request message
10989 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010990 * Return: QDF_STATUS enumeration
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010991 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010992QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010993sme_del_periodic_tx_ptrn(tHalHandle hal,
10994 struct sSirDelPeriodicTxPtrn *delPeriodicTxPtrnParams)
10995{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010996 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010997 tpAniSirGlobal mac = PMAC_STRUCT(hal);
10998 struct sSirDelPeriodicTxPtrn *req_msg;
10999 cds_msg_t msg;
11000
11001 sms_log(mac, LOG1, FL("enter"));
11002
Anurag Chouhan600c3a02016-03-01 10:33:54 +053011003 req_msg = qdf_mem_malloc(sizeof(*req_msg));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011004 if (!req_msg) {
11005 sms_log(mac, LOGE, FL("memory allocation failed"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011006 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011007 }
11008
11009 *req_msg = *delPeriodicTxPtrnParams;
11010
11011 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011012 if (!QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011013 sms_log(mac, LOGE,
11014 FL("sme_acquire_global_lock failed!(status=%d)"),
11015 status);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053011016 qdf_mem_free(req_msg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011017 return status;
11018 }
11019
11020 /* Serialize the req through MC thread */
11021 msg.bodyptr = req_msg;
11022 msg.type = WMA_DEL_PERIODIC_TX_PTRN_IND;
Sreelakshmi Konamki6a065362016-05-31 16:05:01 +053011023 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
11024 NO_SESSION, msg.type));
Anurag Chouhan6d760662016-02-20 16:05:43 +053011025 status = cds_mq_post_message(QDF_MODULE_ID_WMA, &msg);
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("cds_mq_post_message failed!(err=%d)"),
11029 status);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053011030 qdf_mem_free(req_msg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011031 }
11032 sme_release_global_lock(&mac->sme);
11033 return status;
11034}
11035
Rajeev Kumar8e3e2832015-11-06 16:02:54 -080011036/**
11037 * sme_enable_rmc() - enables RMC
11038 * @hHal : Pointer to global HAL handle
11039 * @sessionId : Session ID
11040 *
11041 * Return: QDF_STATUS
11042 */
11043QDF_STATUS sme_enable_rmc(tHalHandle hHal, uint32_t sessionId)
11044{
11045 QDF_STATUS status = QDF_STATUS_E_FAILURE;
11046 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
11047 cds_msg_t cds_message;
11048 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
11049
11050 sms_log(pMac, LOG1, FL("enable RMC"));
11051 status = sme_acquire_global_lock(&pMac->sme);
11052 if (QDF_IS_STATUS_SUCCESS(status)) {
11053 cds_message.bodyptr = NULL;
11054 cds_message.type = WMA_RMC_ENABLE_IND;
11055 qdf_status = cds_mq_post_message(CDS_MQ_ID_WMA, &cds_message);
11056 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
11057 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
11058 "%s: failed to post message to WMA",
11059 __func__);
11060 status = QDF_STATUS_E_FAILURE;
11061 }
11062 sme_release_global_lock(&pMac->sme);
11063 }
11064 return status;
11065}
11066
11067/**
11068 * sme_disable_rmc() - disables RMC
11069 * @hHal : Pointer to global HAL handle
11070 * @sessionId : Session ID
11071 *
11072 * Return: QDF_STATUS
11073 */
11074QDF_STATUS sme_disable_rmc(tHalHandle hHal, uint32_t sessionId)
11075{
11076 QDF_STATUS status = QDF_STATUS_E_FAILURE;
11077 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
11078 cds_msg_t cds_message;
11079 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
11080
11081 sms_log(pMac, LOG1, FL("disable RMC"));
11082 status = sme_acquire_global_lock(&pMac->sme);
11083 if (QDF_IS_STATUS_SUCCESS(status)) {
11084 cds_message.bodyptr = NULL;
11085 cds_message.type = WMA_RMC_DISABLE_IND;
11086 qdf_status = cds_mq_post_message(CDS_MQ_ID_WMA, &cds_message);
11087 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
11088 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
11089 "%s: failed to post message to WMA",
11090 __func__);
11091 status = QDF_STATUS_E_FAILURE;
11092 }
11093 sme_release_global_lock(&pMac->sme);
11094 }
11095 return status;
11096}
11097
11098/**
11099 * sme_send_rmc_action_period() - sends RMC action period param to target
11100 * @hHal : Pointer to global HAL handle
11101 * @sessionId : Session ID
11102 *
11103 * Return: QDF_STATUS
11104 */
11105QDF_STATUS sme_send_rmc_action_period(tHalHandle hHal, uint32_t sessionId)
11106{
11107 QDF_STATUS status = QDF_STATUS_SUCCESS;
11108 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
11109 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
11110 cds_msg_t cds_message;
11111
11112 status = sme_acquire_global_lock(&pMac->sme);
11113 if (QDF_STATUS_SUCCESS == status) {
11114 cds_message.bodyptr = NULL;
11115 cds_message.type = WMA_RMC_ACTION_PERIOD_IND;
11116 qdf_status = cds_mq_post_message(CDS_MQ_ID_WMA, &cds_message);
11117 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
11118 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
11119 "%s: failed to post message to WMA",
11120 __func__);
11121 status = QDF_STATUS_E_FAILURE;
11122 }
11123 sme_release_global_lock(&pMac->sme);
11124 }
11125
11126 return status;
11127}
11128
11129/**
11130 * sme_request_ibss_peer_info() - request ibss peer info
11131 * @hHal : Pointer to global HAL handle
11132 * @pUserData : Pointer to user data
11133 * @peerInfoCbk : Peer info callback
11134 * @allPeerInfoReqd : All peer info required or not
11135 * @staIdx : sta index
11136 *
11137 * Return: QDF_STATUS
11138 */
11139QDF_STATUS sme_request_ibss_peer_info(tHalHandle hHal, void *pUserData,
11140 pIbssPeerInfoCb peerInfoCbk,
11141 bool allPeerInfoReqd, uint8_t staIdx)
11142{
11143 QDF_STATUS status = QDF_STATUS_E_FAILURE;
11144 QDF_STATUS qdf_status = QDF_STATUS_E_FAILURE;
11145 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
11146 cds_msg_t cds_message;
11147 tSirIbssGetPeerInfoReqParams *pIbssInfoReqParams;
11148
11149 status = sme_acquire_global_lock(&pMac->sme);
11150 if (QDF_STATUS_SUCCESS == status) {
11151 pMac->sme.peerInfoParams.peerInfoCbk = peerInfoCbk;
11152 pMac->sme.peerInfoParams.pUserData = pUserData;
11153
11154 pIbssInfoReqParams = (tSirIbssGetPeerInfoReqParams *)
11155 qdf_mem_malloc(sizeof(tSirIbssGetPeerInfoReqParams));
11156 if (NULL == pIbssInfoReqParams) {
11157 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
11158 "%s: Not able to allocate memory for dhcp start",
11159 __func__);
11160 sme_release_global_lock(&pMac->sme);
11161 return QDF_STATUS_E_NOMEM;
11162 }
11163 pIbssInfoReqParams->allPeerInfoReqd = allPeerInfoReqd;
11164 pIbssInfoReqParams->staIdx = staIdx;
11165
11166 cds_message.type = WMA_GET_IBSS_PEER_INFO_REQ;
11167 cds_message.bodyptr = pIbssInfoReqParams;
11168 cds_message.reserved = 0;
11169
11170 qdf_status = cds_mq_post_message(CDS_MQ_ID_WMA, &cds_message);
11171 if (QDF_STATUS_SUCCESS != qdf_status) {
11172 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
11173 "%s: Post WMA_GET_IBSS_PEER_INFO_REQ MSG failed",
11174 __func__);
11175 qdf_mem_free(pIbssInfoReqParams);
11176 qdf_status = QDF_STATUS_E_FAILURE;
11177 }
11178 sme_release_global_lock(&pMac->sme);
11179 }
11180
11181 return qdf_status;
11182}
11183
11184/* ---------------------------------------------------------------------------
11185 \fn sme_send_cesium_enable_ind
11186 \brief Used to send proprietary cesium enable indication to fw
11187 \param hHal
11188 \param sessionId
11189 \- return QDF_STATUS
11190 -------------------------------------------------------------------------*/
11191QDF_STATUS sme_send_cesium_enable_ind(tHalHandle hHal, uint32_t sessionId)
11192{
11193 QDF_STATUS status = QDF_STATUS_SUCCESS;
11194 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
11195 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
11196 cds_msg_t cds_message;
11197
11198 status = sme_acquire_global_lock(&pMac->sme);
11199 if (QDF_STATUS_SUCCESS == status) {
11200 cds_message.bodyptr = NULL;
11201 cds_message.type = WMA_IBSS_CESIUM_ENABLE_IND;
11202 qdf_status = cds_mq_post_message(CDS_MQ_ID_WMA, &cds_message);
11203 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
11204 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
11205 "%s: failed to post message to WMA",
11206 __func__);
11207 status = QDF_STATUS_E_FAILURE;
11208 }
11209 sme_release_global_lock(&pMac->sme);
11210 }
11211
11212 return status;
11213}
11214
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011215void sme_get_command_q_status(tHalHandle hHal)
11216{
11217 tSmeCmd *pTempCmd = NULL;
11218 tListElem *pEntry;
11219 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
11220
11221 if (NULL == pMac) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053011222 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011223 "%s: pMac is NULL", __func__);
11224 return;
11225 }
11226
11227 pEntry = csr_ll_peek_head(&pMac->sme.smeCmdActiveList, LL_ACCESS_LOCK);
11228 if (pEntry) {
11229 pTempCmd = GET_BASE_ADDR(pEntry, tSmeCmd, Link);
11230 }
11231 sms_log(pMac, LOGE, "Currently smeCmdActiveList has command (0x%X)",
11232 (pTempCmd) ? pTempCmd->command : eSmeNoCommand);
11233 if (pTempCmd) {
11234 if (eSmeCsrCommandMask & pTempCmd->command) {
11235 /* CSR command is stuck. See what the reason code is for that command */
11236 dump_csr_command_info(pMac, pTempCmd);
11237 }
11238 } /* if(pTempCmd) */
11239
11240 sms_log(pMac, LOGE, "Currently smeCmdPendingList has %d commands",
11241 csr_ll_count(&pMac->sme.smeCmdPendingList));
11242
11243 sms_log(pMac, LOGE, "Currently roamCmdPendingList has %d commands",
11244 csr_ll_count(&pMac->roam.roamCmdPendingList));
11245
11246 return;
11247}
Kiran Kumar Lokere1aa9c9a2016-10-05 18:50:59 -070011248/**
11249 * sme_set_prefer_80MHz_over_160MHz() - API to set sta_prefer_80MHz_over_160MHz
11250 * @hal: The handle returned by macOpen
11251 * @sta_prefer_80MHz_over_160MHz: sta_prefer_80MHz_over_160MHz config param
11252 */
11253void sme_set_prefer_80MHz_over_160MHz(tHalHandle hal,
11254 bool sta_prefer_80MHz_over_160MHz)
11255{
11256 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
11257 mac_ctx->sta_prefer_80MHz_over_160MHz = sta_prefer_80MHz_over_160MHz;
11258}
11259
Agrawal Ashishb141b092016-09-02 19:59:26 +053011260#ifdef WLAN_FEATURE_DSRC
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011261/**
11262 * sme_set_dot11p_config() - API to set the 802.11p config
11263 * @hHal: The handle returned by macOpen
11264 * @enable_dot11p: 802.11p config param
11265 */
11266void sme_set_dot11p_config(tHalHandle hHal, bool enable_dot11p)
11267{
11268 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
11269 pMac->enable_dot11p = enable_dot11p;
11270}
11271
11272/**
11273 * copy_sir_ocb_config() - Performs deep copy of an OCB configuration
11274 * @src: the source configuration
11275 *
11276 * Return: pointer to the copied OCB configuration
11277 */
11278static struct sir_ocb_config *sme_copy_sir_ocb_config(
11279 struct sir_ocb_config *src)
11280{
11281 struct sir_ocb_config *dst;
11282 uint32_t length;
11283 void *cursor;
11284
11285 length = sizeof(*src) +
11286 src->channel_count * sizeof(*src->channels) +
11287 src->schedule_size * sizeof(*src->schedule) +
11288 src->dcc_ndl_chan_list_len +
11289 src->dcc_ndl_active_state_list_len;
11290
Anurag Chouhan600c3a02016-03-01 10:33:54 +053011291 dst = qdf_mem_malloc(length);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011292 if (!dst)
11293 return NULL;
11294
11295 *dst = *src;
11296
11297 cursor = dst;
11298 cursor += sizeof(*dst);
11299 dst->channels = cursor;
11300 cursor += src->channel_count * sizeof(*src->channels);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053011301 qdf_mem_copy(dst->channels, src->channels,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011302 src->channel_count * sizeof(*src->channels));
11303 dst->schedule = cursor;
11304 cursor += src->schedule_size * sizeof(*src->schedule);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053011305 qdf_mem_copy(dst->schedule, src->schedule,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011306 src->schedule_size * sizeof(*src->schedule));
11307 dst->dcc_ndl_chan_list = cursor;
11308 cursor += src->dcc_ndl_chan_list_len;
Anurag Chouhan600c3a02016-03-01 10:33:54 +053011309 qdf_mem_copy(dst->dcc_ndl_chan_list, src->dcc_ndl_chan_list,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011310 src->dcc_ndl_chan_list_len);
11311 dst->dcc_ndl_active_state_list = cursor;
11312 cursor += src->dcc_ndl_active_state_list_len;
Anurag Chouhan600c3a02016-03-01 10:33:54 +053011313 qdf_mem_copy(dst->dcc_ndl_active_state_list,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011314 src->dcc_ndl_active_state_list,
11315 src->dcc_ndl_active_state_list_len);
11316 return dst;
11317}
11318
11319/**
11320 * sme_ocb_set_config() - Set the OCB configuration
11321 * @hHal: reference to the HAL
11322 * @context: the context of the call
11323 * @callback: the callback to hdd
11324 * @config: the OCB configuration
11325 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011326 * Return: QDF_STATUS_SUCCESS on success, QDF_STATUS_E_FAILURE on failure
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011327 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011328QDF_STATUS sme_ocb_set_config(tHalHandle hHal, void *context,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011329 ocb_callback callback,
11330 struct sir_ocb_config *config)
11331{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011332 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011333 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
11334 cds_msg_t msg = {0};
11335 struct sir_ocb_config *msg_body;
11336
11337 /* Lock the SME structure */
11338 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011339 if (!QDF_IS_STATUS_SUCCESS(status))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011340 return status;
11341
11342 /*
11343 * Check if there is a pending request and return an error if one
11344 * exists
11345 */
11346 if (pMac->sme.ocb_set_config_callback) {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011347 status = QDF_STATUS_E_BUSY;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011348 goto end;
11349 }
11350
11351 msg_body = sme_copy_sir_ocb_config(config);
11352
11353 if (!msg_body) {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011354 status = QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011355 goto end;
11356 }
11357
11358 msg.type = WMA_OCB_SET_CONFIG_CMD;
11359 msg.bodyptr = msg_body;
11360
11361 /* Set the request callback and context */
11362 pMac->sme.ocb_set_config_callback = callback;
11363 pMac->sme.ocb_set_config_context = context;
11364
Anurag Chouhan6d760662016-02-20 16:05:43 +053011365 status = cds_mq_post_message(QDF_MODULE_ID_WMA, &msg);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011366 if (!QDF_IS_STATUS_SUCCESS(status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053011367 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011368 FL("Error posting message to WDA: %d"), status);
11369 pMac->sme.ocb_set_config_callback = callback;
11370 pMac->sme.ocb_set_config_context = context;
Anurag Chouhan600c3a02016-03-01 10:33:54 +053011371 qdf_mem_free(msg_body);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011372 goto end;
11373 }
11374
11375end:
11376 sme_release_global_lock(&pMac->sme);
11377
11378 return status;
11379}
11380
11381/**
11382 * sme_ocb_set_utc_time() - Set the OCB UTC time
11383 * @hHal: reference to the HAL
11384 * @utc: the UTC time struct
11385 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011386 * Return: QDF_STATUS_SUCCESS on success, QDF_STATUS_E_FAILURE on failure
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011387 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011388QDF_STATUS sme_ocb_set_utc_time(tHalHandle hHal, struct sir_ocb_utc *utc)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011389{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011390 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011391 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
11392 cds_msg_t msg = {0};
11393 struct sir_ocb_utc *sme_utc;
11394
11395 /* Lock the SME structure */
11396 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011397 if (!QDF_IS_STATUS_SUCCESS(status))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011398 return status;
11399
Anurag Chouhan600c3a02016-03-01 10:33:54 +053011400 sme_utc = qdf_mem_malloc(sizeof(*sme_utc));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011401 if (!sme_utc) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053011402 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011403 FL("Malloc failed"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011404 status = QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011405 goto end;
11406 }
11407 *sme_utc = *utc;
11408
11409 msg.type = WMA_OCB_SET_UTC_TIME_CMD;
11410 msg.reserved = 0;
11411 msg.bodyptr = sme_utc;
Anurag Chouhan6d760662016-02-20 16:05:43 +053011412 status = cds_mq_post_message(QDF_MODULE_ID_WMA, &msg);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011413 if (!QDF_IS_STATUS_SUCCESS(status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053011414 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011415 FL("Not able to post message to WDA"));
Anurag Chouhan600c3a02016-03-01 10:33:54 +053011416 qdf_mem_free(utc);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011417 goto end;
11418 }
11419
11420end:
11421 sme_release_global_lock(&pMac->sme);
11422
11423 return status;
11424}
11425
11426/**
11427 * sme_ocb_start_timing_advert() - Start sending timing advert frames
11428 * @hHal: reference to the HAL
11429 * @timing_advert: the timing advertisement struct
11430 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011431 * Return: QDF_STATUS_SUCCESS on success, QDF_STATUS_E_FAILURE on failure
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011432 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011433QDF_STATUS sme_ocb_start_timing_advert(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011434 struct sir_ocb_timing_advert *timing_advert)
11435{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011436 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011437 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
11438 cds_msg_t msg = {0};
11439 void *buf;
11440 struct sir_ocb_timing_advert *sme_timing_advert;
11441
11442 /* Lock the SME structure */
11443 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011444 if (!QDF_IS_STATUS_SUCCESS(status))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011445 return status;
11446
Anurag Chouhan600c3a02016-03-01 10:33:54 +053011447 buf = qdf_mem_malloc(sizeof(*sme_timing_advert) +
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011448 timing_advert->template_length);
11449 if (!buf) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053011450 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011451 FL("Not able to allocate memory for start TA"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011452 status = QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011453 goto end;
11454 }
11455
11456 sme_timing_advert = (struct sir_ocb_timing_advert *)buf;
11457 *sme_timing_advert = *timing_advert;
11458 sme_timing_advert->template_value = buf + sizeof(*sme_timing_advert);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053011459 qdf_mem_copy(sme_timing_advert->template_value,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011460 timing_advert->template_value, timing_advert->template_length);
11461
11462 msg.type = WMA_OCB_START_TIMING_ADVERT_CMD;
11463 msg.reserved = 0;
11464 msg.bodyptr = buf;
Anurag Chouhan6d760662016-02-20 16:05:43 +053011465 status = cds_mq_post_message(QDF_MODULE_ID_WMA, &msg);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011466 if (!QDF_IS_STATUS_SUCCESS(status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053011467 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011468 FL("Not able to post msg to WDA"));
11469 goto end;
11470 }
11471
11472end:
11473 sme_release_global_lock(&pMac->sme);
11474
11475 return status;
11476}
11477
11478/**
11479 * sme_ocb_stop_timing_advert() - Stop sending timing advert frames on a channel
11480 * @hHal: reference to the HAL
11481 * @timing_advert: the timing advertisement struct
11482 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011483 * Return: QDF_STATUS_SUCCESS on success, QDF_STATUS_E_FAILURE on failure
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011484 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011485QDF_STATUS sme_ocb_stop_timing_advert(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011486 struct sir_ocb_timing_advert *timing_advert)
11487{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011488 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011489 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
11490 cds_msg_t msg = {0};
11491 struct sir_ocb_timing_advert *sme_timing_advert;
11492
11493 /* Lock the SME structure */
11494 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011495 if (!QDF_IS_STATUS_SUCCESS(status))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011496 return status;
11497
Anurag Chouhan600c3a02016-03-01 10:33:54 +053011498 sme_timing_advert = qdf_mem_malloc(sizeof(*timing_advert));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011499 if (!sme_timing_advert) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053011500 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011501 FL("Not able to allocate memory for stop TA"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011502 status = QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011503 goto end;
11504 }
11505 *sme_timing_advert = *timing_advert;
11506
11507 msg.type = WMA_OCB_STOP_TIMING_ADVERT_CMD;
11508 msg.reserved = 0;
11509 msg.bodyptr = sme_timing_advert;
Anurag Chouhan6d760662016-02-20 16:05:43 +053011510 status = cds_mq_post_message(QDF_MODULE_ID_WMA, &msg);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011511 if (!QDF_IS_STATUS_SUCCESS(status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053011512 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011513 FL("Not able to post msg to WDA"));
11514 goto end;
11515 }
11516
11517end:
11518 sme_release_global_lock(&pMac->sme);
11519
11520 return status;
11521}
11522
11523/**
Naveen Rawatb4d37622015-11-13 16:15:25 -080011524 * sme_ocb_gen_timing_advert_frame() - generate TA frame and populate the buffer
11525 * @hal_handle: reference to the HAL
11526 * @self_addr: the self MAC address
11527 * @buf: the buffer that will contain the frame
11528 * @timestamp_offset: return for the offset of the timestamp field
11529 * @time_value_offset: return for the time_value field in the TA IE
11530 *
11531 * Return: the length of the buffer.
11532 */
11533int sme_ocb_gen_timing_advert_frame(tHalHandle hal_handle,
11534 tSirMacAddr self_addr, uint8_t **buf,
11535 uint32_t *timestamp_offset,
11536 uint32_t *time_value_offset)
11537{
11538 int template_length;
11539 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal_handle);
11540
11541 template_length = sch_gen_timing_advert_frame(mac_ctx, self_addr, buf,
11542 timestamp_offset,
11543 time_value_offset);
11544 return template_length;
11545}
11546/**
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011547 * sme_ocb_get_tsf_timer() - Get the TSF timer value
11548 * @hHal: reference to the HAL
11549 * @context: the context of the call
11550 * @callback: the callback to hdd
11551 * @request: the TSF timer request
11552 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011553 * Return: QDF_STATUS_SUCCESS on success, QDF_STATUS_E_FAILURE on failure
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011554 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011555QDF_STATUS sme_ocb_get_tsf_timer(tHalHandle hHal, void *context,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011556 ocb_callback callback,
11557 struct sir_ocb_get_tsf_timer *request)
11558{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011559 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011560 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
11561 cds_msg_t msg = {0};
11562 struct sir_ocb_get_tsf_timer *msg_body;
11563
11564 /* Lock the SME structure */
11565 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011566 if (!QDF_IS_STATUS_SUCCESS(status))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011567 return status;
11568
11569 /* Allocate memory for the WMI request, and copy the parameter */
Anurag Chouhan600c3a02016-03-01 10:33:54 +053011570 msg_body = qdf_mem_malloc(sizeof(*msg_body));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011571 if (!msg_body) {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011572 status = QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011573 goto end;
11574 }
11575 *msg_body = *request;
11576
11577 msg.type = WMA_OCB_GET_TSF_TIMER_CMD;
11578 msg.bodyptr = msg_body;
11579
11580 /* Set the request callback and the context */
11581 pMac->sme.ocb_get_tsf_timer_callback = callback;
11582 pMac->sme.ocb_get_tsf_timer_context = context;
11583
11584 /* Post the message to WDA */
Anurag Chouhan6d760662016-02-20 16:05:43 +053011585 status = cds_mq_post_message(QDF_MODULE_ID_WMA, &msg);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011586 if (!QDF_IS_STATUS_SUCCESS(status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053011587 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011588 FL("Error posting message to WDA: %d"), status);
11589 pMac->sme.ocb_get_tsf_timer_callback = NULL;
11590 pMac->sme.ocb_get_tsf_timer_context = NULL;
Anurag Chouhan600c3a02016-03-01 10:33:54 +053011591 qdf_mem_free(msg_body);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011592 goto end;
11593 }
11594
11595end:
11596 sme_release_global_lock(&pMac->sme);
11597
11598 return status;
11599}
11600
11601/**
11602 * sme_dcc_get_stats() - Get the DCC stats
11603 * @hHal: reference to the HAL
11604 * @context: the context of the call
11605 * @callback: the callback to hdd
11606 * @request: the get DCC stats request
11607 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011608 * Return: QDF_STATUS_SUCCESS on success, QDF_STATUS_E_FAILURE on failure
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011609 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011610QDF_STATUS sme_dcc_get_stats(tHalHandle hHal, void *context,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011611 ocb_callback callback,
11612 struct sir_dcc_get_stats *request)
11613{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011614 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011615 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
11616 cds_msg_t msg = {0};
11617 struct sir_dcc_get_stats *msg_body;
11618
11619 /* Lock the SME structure */
11620 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011621 if (!QDF_IS_STATUS_SUCCESS(status))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011622 return status;
11623
11624 /* Allocate memory for the WMI request, and copy the parameter */
Anurag Chouhan600c3a02016-03-01 10:33:54 +053011625 msg_body = qdf_mem_malloc(sizeof(*msg_body) +
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011626 request->request_array_len);
11627 if (!msg_body) {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011628 status = QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011629 goto end;
11630 }
11631 *msg_body = *request;
11632 msg_body->request_array = (void *)msg_body + sizeof(*msg_body);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053011633 qdf_mem_copy(msg_body->request_array, request->request_array,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011634 request->request_array_len);
11635
11636 msg.type = WMA_DCC_GET_STATS_CMD;
11637 msg.bodyptr = msg_body;
11638
11639 /* Set the request callback and context */
11640 pMac->sme.dcc_get_stats_callback = callback;
11641 pMac->sme.dcc_get_stats_context = context;
11642
Anurag Chouhan6d760662016-02-20 16:05:43 +053011643 status = cds_mq_post_message(QDF_MODULE_ID_WMA, &msg);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011644 if (!QDF_IS_STATUS_SUCCESS(status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053011645 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011646 FL("Error posting message to WDA: %d"), status);
11647 pMac->sme.dcc_get_stats_callback = callback;
11648 pMac->sme.dcc_get_stats_context = context;
Anurag Chouhan600c3a02016-03-01 10:33:54 +053011649 qdf_mem_free(msg_body);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011650 goto end;
11651 }
11652
11653end:
11654 sme_release_global_lock(&pMac->sme);
11655
11656 return status;
11657}
11658
11659/**
11660 * sme_dcc_clear_stats() - Clear the DCC stats
11661 * @hHal: reference to the HAL
11662 * @vdev_id: vdev id for OCB interface
11663 * @dcc_stats_bitmap: the entries in the stats to clear
11664 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011665 * Return: QDF_STATUS_SUCCESS on success, QDF_STATUS_E_FAILURE on failure
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011666 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011667QDF_STATUS sme_dcc_clear_stats(tHalHandle hHal, uint32_t vdev_id,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011668 uint32_t dcc_stats_bitmap)
11669{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011670 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011671 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
11672 cds_msg_t msg = {0};
11673 struct sir_dcc_clear_stats *request;
11674
11675 /* Lock the SME structure */
11676 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011677 if (!QDF_IS_STATUS_SUCCESS(status))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011678 return status;
11679
Anurag Chouhan600c3a02016-03-01 10:33:54 +053011680 request = qdf_mem_malloc(sizeof(struct sir_dcc_clear_stats));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011681 if (!request) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053011682 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011683 FL("Not able to allocate memory"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011684 status = QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011685 goto end;
11686 }
11687
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011688 request->vdev_id = vdev_id;
11689 request->dcc_stats_bitmap = dcc_stats_bitmap;
11690
11691 msg.type = WMA_DCC_CLEAR_STATS_CMD;
11692 msg.bodyptr = request;
11693
Anurag Chouhan6d760662016-02-20 16:05:43 +053011694 status = cds_mq_post_message(QDF_MODULE_ID_WMA, &msg);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011695 if (!QDF_IS_STATUS_SUCCESS(status)) {
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 post msg to WDA"));
Anurag Chouhan600c3a02016-03-01 10:33:54 +053011698 qdf_mem_free(request);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011699 goto end;
11700 }
11701
11702end:
11703 sme_release_global_lock(&pMac->sme);
11704
11705 return status;
11706}
11707
11708/**
11709 * sme_dcc_update_ndl() - Update the DCC settings
11710 * @hHal: reference to the HAL
11711 * @context: the context of the call
11712 * @callback: the callback to hdd
11713 * @request: the update DCC request
11714 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011715 * Return: QDF_STATUS_SUCCESS on success, QDF_STATUS_E_FAILURE on failure
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011716 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011717QDF_STATUS sme_dcc_update_ndl(tHalHandle hHal, void *context,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011718 ocb_callback callback,
11719 struct sir_dcc_update_ndl *request)
11720{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011721 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011722 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
11723 cds_msg_t msg = {0};
11724 struct sir_dcc_update_ndl *msg_body;
11725
11726 /* Lock the SME structure */
11727 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011728 if (!QDF_IS_STATUS_SUCCESS(status))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011729 return status;
11730
11731 /* Allocate memory for the WMI request, and copy the parameter */
Anurag Chouhan600c3a02016-03-01 10:33:54 +053011732 msg_body = qdf_mem_malloc(sizeof(*msg_body) +
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011733 request->dcc_ndl_chan_list_len +
11734 request->dcc_ndl_active_state_list_len);
11735 if (!msg_body) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053011736 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011737 FL("Failed to allocate memory"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011738 status = QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011739 goto end;
11740 }
11741
11742 *msg_body = *request;
11743
11744 msg_body->dcc_ndl_chan_list = (void *)msg_body + sizeof(*msg_body);
11745 msg_body->dcc_ndl_active_state_list = msg_body->dcc_ndl_chan_list +
11746 request->dcc_ndl_chan_list_len;
Anurag Chouhan600c3a02016-03-01 10:33:54 +053011747 qdf_mem_copy(msg_body->dcc_ndl_chan_list, request->dcc_ndl_chan_list,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011748 request->dcc_ndl_active_state_list_len);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053011749 qdf_mem_copy(msg_body->dcc_ndl_active_state_list,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011750 request->dcc_ndl_active_state_list,
11751 request->dcc_ndl_active_state_list_len);
11752
11753 msg.type = WMA_DCC_UPDATE_NDL_CMD;
11754 msg.bodyptr = msg_body;
11755
11756 /* Set the request callback and the context */
11757 pMac->sme.dcc_update_ndl_callback = callback;
11758 pMac->sme.dcc_update_ndl_context = context;
11759
Anurag Chouhan6d760662016-02-20 16:05:43 +053011760 status = cds_mq_post_message(QDF_MODULE_ID_WMA, &msg);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011761 if (!QDF_IS_STATUS_SUCCESS(status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053011762 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011763 FL("Error posting message to WDA: %d"), status);
11764 pMac->sme.dcc_update_ndl_callback = NULL;
11765 pMac->sme.dcc_update_ndl_context = NULL;
Anurag Chouhan600c3a02016-03-01 10:33:54 +053011766 qdf_mem_free(msg_body);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011767 goto end;
11768 }
11769
11770end:
11771 sme_release_global_lock(&pMac->sme);
11772
11773 return status;
11774}
11775
11776/**
11777 * sme_register_for_dcc_stats_event() - Register for the periodic DCC stats
11778 * event
11779 * @hHal: reference to the HAL
11780 * @context: the context of the call
11781 * @callback: the callback to hdd
11782 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011783 * Return: QDF_STATUS_SUCCESS on success, QDF_STATUS_E_FAILURE on failure
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011784 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011785QDF_STATUS sme_register_for_dcc_stats_event(tHalHandle hHal, void *context,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011786 ocb_callback callback)
11787{
11788 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011789 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011790
11791 status = sme_acquire_global_lock(&pMac->sme);
11792 pMac->sme.dcc_stats_event_callback = callback;
11793 pMac->sme.dcc_stats_event_context = context;
11794 sme_release_global_lock(&pMac->sme);
11795
11796 return 0;
11797}
11798
Arun Khandavalli4b55da72016-07-19 19:55:01 +053011799/**
11800 * sme_deregister_for_dcc_stats_event() - De-Register for the periodic DCC stats
11801 * event
11802 * @h_hal: Hal Handle
11803 *
11804 * This function de-registers the DCC perioc stats callback
11805 *
11806 * Return: QDF_STATUS Enumeration
11807 */
11808QDF_STATUS sme_deregister_for_dcc_stats_event(tHalHandle h_hal)
11809{
11810 tpAniSirGlobal mac;
11811 QDF_STATUS status;
11812
11813 if (!h_hal) {
11814 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
11815 FL("h_hal is not valid"));
11816 return QDF_STATUS_E_INVAL;
11817 }
11818 mac = PMAC_STRUCT(h_hal);
11819
11820 status = sme_acquire_global_lock(&mac->sme);
11821 if (!QDF_IS_STATUS_SUCCESS(status)) {
11822 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
11823 FL("Failed to acquire global lock"));
11824 return status;
11825 }
11826 mac->sme.dcc_stats_event_callback = NULL;
11827 mac->sme.dcc_stats_event_context = NULL;
11828 sme_release_global_lock(&mac->sme);
11829
11830 return status;
11831}
Agrawal Ashishb141b092016-09-02 19:59:26 +053011832#endif
Arun Khandavalli4b55da72016-07-19 19:55:01 +053011833
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011834void sme_get_recovery_stats(tHalHandle hHal)
11835{
11836 uint8_t i;
11837
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053011838 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011839 "Self Recovery Stats");
11840 for (i = 0; i < MAX_ACTIVE_CMD_STATS; i++) {
11841 if (eSmeNoCommand !=
11842 g_self_recovery_stats.activeCmdStats[i].command) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053011843 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011844 "timestamp %llu: command 0x%0X: reason %d: session %d",
11845 g_self_recovery_stats.activeCmdStats[i].
11846 timestamp,
11847 g_self_recovery_stats.activeCmdStats[i].command,
11848 g_self_recovery_stats.activeCmdStats[i].reason,
11849 g_self_recovery_stats.activeCmdStats[i].
11850 sessionId);
11851 }
11852 }
11853}
11854
11855/**
11856 * sme_save_active_cmd_stats() - To save active command stats
11857 * @hHal: HAL context
11858 *
11859 * This routine is to save active command stats
11860 *
11861 * Return: None
11862 */
Jeff Johnson49c02f92016-10-07 10:29:09 -070011863static void sme_save_active_cmd_stats(tHalHandle hHal)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011864{
11865 tSmeCmd *pTempCmd = NULL;
11866 tListElem *pEntry;
11867 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
11868 uint8_t statidx = 0;
11869 tActiveCmdStats *actv_cmd_stat = NULL;
11870
11871 if (NULL == pMac) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053011872 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011873 FL("pMac is NULL"));
11874 return;
11875 }
11876
11877 pEntry = csr_ll_peek_head(&pMac->sme.smeCmdActiveList, LL_ACCESS_LOCK);
11878 if (pEntry)
11879 pTempCmd = GET_BASE_ADDR(pEntry, tSmeCmd, Link);
11880
11881 if (!pTempCmd)
11882 return;
11883
11884 if (eSmeCsrCommandMask & pTempCmd->command) {
11885 statidx = g_self_recovery_stats.cmdStatsIndx;
11886 actv_cmd_stat = &g_self_recovery_stats.activeCmdStats[statidx];
11887 actv_cmd_stat->command = pTempCmd->command;
11888 actv_cmd_stat->sessionId = pTempCmd->sessionId;
11889 actv_cmd_stat->timestamp = cds_get_monotonic_boottime();
11890 if (eSmeCommandRoam == pTempCmd->command)
11891 actv_cmd_stat->reason = pTempCmd->u.roamCmd.roamReason;
11892 else if (eSmeCommandScan == pTempCmd->command)
11893 actv_cmd_stat->reason = pTempCmd->u.scanCmd.reason;
11894 else
11895 actv_cmd_stat->reason = 0xFF;
11896
11897 g_self_recovery_stats.cmdStatsIndx =
11898 ((g_self_recovery_stats.cmdStatsIndx + 1) &
11899 (MAX_ACTIVE_CMD_STATS - 1));
11900 }
11901 return;
11902}
11903
11904void active_list_cmd_timeout_handle(void *userData)
11905{
Abhishek Singh5ea86532016-04-27 14:10:53 +053011906 tHalHandle hal = (tHalHandle)userData;
11907 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
Kapil Gupta63ddab22016-08-09 16:41:24 +053011908 tListElem *entry;
11909 tSmeCmd *temp_cmd = NULL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011910
Abhishek Singh5ea86532016-04-27 14:10:53 +053011911 if (NULL == mac_ctx) {
11912 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
11913 "%s: mac_ctx is null", __func__);
11914 return;
11915 }
11916 /* Return if no cmd pending in active list as
11917 * in this case we should not be here.
11918 */
11919 if (0 == csr_ll_count(&mac_ctx->sme.smeCmdActiveList))
11920 return;
11921 sms_log(mac_ctx, LOGE,
11922 FL("Active List command timeout Cmd List Count %d"),
11923 csr_ll_count(&mac_ctx->sme.smeCmdActiveList));
11924 sme_get_command_q_status(hal);
11925
11926 if (mac_ctx->roam.configParam.enable_fatal_event)
11927 cds_flush_logs(WLAN_LOG_TYPE_FATAL,
11928 WLAN_LOG_INDICATOR_HOST_DRIVER,
11929 WLAN_LOG_REASON_SME_COMMAND_STUCK,
11930 false,
11931 mac_ctx->sme.enableSelfRecovery ? true : false);
11932 else
11933 qdf_trace_dump_all(mac_ctx, 0, 0, 500, 0);
11934
Kapil Gupta63ddab22016-08-09 16:41:24 +053011935 entry = csr_ll_peek_head(&mac_ctx->sme.smeCmdActiveList,
11936 LL_ACCESS_LOCK);
11937 if (entry)
11938 temp_cmd = GET_BASE_ADDR(entry, tSmeCmd, Link);
11939 /* Ignore if ROC took more than 120 sec */
11940 if (temp_cmd && (eSmeCommandRemainOnChannel == temp_cmd->command))
11941 return;
11942
Abhishek Singh5ea86532016-04-27 14:10:53 +053011943 if (mac_ctx->sme.enableSelfRecovery) {
11944 sme_save_active_cmd_stats(hal);
Mukul Sharmab7b575b2016-10-02 23:37:07 +053011945 cds_trigger_recovery(false);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011946 } else {
Abhishek Singh5ea86532016-04-27 14:10:53 +053011947 if (!mac_ctx->roam.configParam.enable_fatal_event &&
11948 !(cds_is_load_or_unload_in_progress() ||
11949 cds_is_driver_recovering()))
11950 QDF_BUG(0);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011951 }
11952}
11953
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011954QDF_STATUS sme_notify_modem_power_state(tHalHandle hHal, uint32_t value)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011955{
11956 cds_msg_t msg;
11957 tpSirModemPowerStateInd request_buf;
11958 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
11959
11960 if (NULL == pMac) {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011961 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011962 }
11963
Anurag Chouhan600c3a02016-03-01 10:33:54 +053011964 request_buf = qdf_mem_malloc(sizeof(tSirModemPowerStateInd));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011965 if (NULL == request_buf) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053011966 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011967 "%s: Not able to allocate memory for MODEM POWER STATE IND",
11968 __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011969 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011970 }
11971
11972 request_buf->param = value;
11973
11974 msg.type = WMA_MODEM_POWER_STATE_IND;
11975 msg.reserved = 0;
11976 msg.bodyptr = request_buf;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011977 if (!QDF_IS_STATUS_SUCCESS
Anurag Chouhan6d760662016-02-20 16:05:43 +053011978 (cds_mq_post_message(QDF_MODULE_ID_WMA, &msg))) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053011979 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011980 "%s: Not able to post WMA_MODEM_POWER_STATE_IND message"
11981 " to WMA", __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053011982 qdf_mem_free(request_buf);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011983 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011984 }
11985
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011986 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011987}
11988
11989#ifdef QCA_HT_2040_COEX
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011990QDF_STATUS sme_notify_ht2040_mode(tHalHandle hHal, uint16_t staId,
Anurag Chouhan6d760662016-02-20 16:05:43 +053011991 struct qdf_mac_addr macAddrSTA,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011992 uint8_t sessionId,
11993 uint8_t channel_type)
11994{
11995 cds_msg_t msg;
11996 tUpdateVHTOpMode *pHtOpMode = NULL;
11997 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
11998
11999 if (NULL == pMac) {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012000 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012001 }
12002
Anurag Chouhan600c3a02016-03-01 10:33:54 +053012003 pHtOpMode = qdf_mem_malloc(sizeof(tUpdateVHTOpMode));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012004 if (NULL == pHtOpMode) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053012005 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012006 "%s: Not able to allocate memory for setting OP mode",
12007 __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012008 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012009 }
12010
12011 switch (channel_type) {
12012 case eHT_CHAN_HT20:
12013 pHtOpMode->opMode = eHT_CHANNEL_WIDTH_20MHZ;
12014 break;
12015
12016 case eHT_CHAN_HT40MINUS:
12017 case eHT_CHAN_HT40PLUS:
12018 pHtOpMode->opMode = eHT_CHANNEL_WIDTH_40MHZ;
12019 break;
12020
12021 default:
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053012022 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012023 "%s: Invalid OP mode", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012024 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012025 }
12026
12027 pHtOpMode->staId = staId,
Anurag Chouhan600c3a02016-03-01 10:33:54 +053012028 qdf_mem_copy(pHtOpMode->peer_mac, macAddrSTA.bytes,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012029 sizeof(tSirMacAddr));
12030 pHtOpMode->smesessionId = sessionId;
12031
12032 msg.type = WMA_UPDATE_OP_MODE;
12033 msg.reserved = 0;
12034 msg.bodyptr = pHtOpMode;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012035 if (!QDF_IS_STATUS_SUCCESS
Anurag Chouhan6d760662016-02-20 16:05:43 +053012036 (cds_mq_post_message(QDF_MODULE_ID_WMA, &msg))) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053012037 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012038 "%s: Not able to post WMA_UPDATE_OP_MODE message"
12039 " to WMA", __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053012040 qdf_mem_free(pHtOpMode);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012041 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012042 }
12043
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053012044 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012045 "%s: Notifed FW about OP mode: %d for staId=%d",
12046 __func__, pHtOpMode->opMode, staId);
12047
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012048 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012049}
12050
12051/* ---------------------------------------------------------------------------
12052
12053 \fn sme_set_ht2040_mode
12054
12055 \brief To update HT Operation beacon IE.
12056
12057 \param
12058
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012059 \return QDF_STATUS SUCCESS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012060 FAILURE or RESOURCES
12061 The API finished and failed.
12062
12063 -------------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012064QDF_STATUS sme_set_ht2040_mode(tHalHandle hHal, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012065 uint8_t channel_type, bool obssEnabled)
12066{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012067 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012068 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
12069 ePhyChanBondState cbMode;
12070
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053012071 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012072 "%s: Update HT operation beacon IE, channel_type=%d",
12073 __func__, channel_type);
12074
12075 switch (channel_type) {
12076 case eHT_CHAN_HT20:
12077 cbMode = PHY_SINGLE_CHANNEL_CENTERED;
12078 break;
12079 case eHT_CHAN_HT40MINUS:
12080 cbMode = PHY_DOUBLE_CHANNEL_HIGH_PRIMARY;
12081 break;
12082 case eHT_CHAN_HT40PLUS:
12083 cbMode = PHY_DOUBLE_CHANNEL_LOW_PRIMARY;
12084 break;
12085 default:
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053012086 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012087 "%s:Error!!! Invalid HT20/40 mode !", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012088 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012089 }
12090 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012091 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012092 status = csr_set_ht2040_mode(pMac, sessionId,
12093 cbMode, obssEnabled);
12094 sme_release_global_lock(&pMac->sme);
12095 }
12096 return status;
12097}
12098
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012099#endif
12100
12101/*
12102 * SME API to enable/disable idle mode powersave
12103 * This should be called only if powersave offload
12104 * is enabled
12105 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012106QDF_STATUS sme_set_idle_powersave_config(void *cds_context,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012107 tHalHandle hHal, uint32_t value)
12108{
Anurag Chouhan6d760662016-02-20 16:05:43 +053012109 void *wmaContext = cds_get_context(QDF_MODULE_ID_WMA);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012110 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
12111
12112 if (NULL == wmaContext) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053012113 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012114 "%s: wmaContext is NULL", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012115 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012116 }
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053012117 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012118 " Idle Ps Set Value %d", value);
12119
12120 pMac->imps_enabled = false;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012121 if (QDF_STATUS_SUCCESS != wma_set_idle_ps_config(wmaContext, value)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053012122 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012123 " Failed to Set Idle Ps Value %d", value);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012124 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012125 }
12126 if (value)
12127 pMac->imps_enabled = true;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012128 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012129}
12130
12131int16_t sme_get_ht_config(tHalHandle hHal, uint8_t session_id, uint16_t ht_capab)
12132{
12133 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
12134 tCsrRoamSession *pSession = CSR_GET_SESSION(pMac, session_id);
12135
12136 if (NULL == pSession) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053012137 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012138 "%s: pSession is NULL", __func__);
12139 return -EIO;
12140 }
12141 switch (ht_capab) {
12142 case WNI_CFG_HT_CAP_INFO_ADVANCE_CODING:
12143 return pSession->htConfig.ht_rx_ldpc;
12144 case WNI_CFG_HT_CAP_INFO_TX_STBC:
12145 return pSession->htConfig.ht_tx_stbc;
12146 case WNI_CFG_HT_CAP_INFO_RX_STBC:
12147 return pSession->htConfig.ht_rx_stbc;
12148 case WNI_CFG_HT_CAP_INFO_SHORT_GI_20MHZ:
Sandeep Puligilla607f34a2016-05-25 14:37:47 -070012149 return pSession->htConfig.ht_sgi20;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012150 case WNI_CFG_HT_CAP_INFO_SHORT_GI_40MHZ:
Sandeep Puligilla607f34a2016-05-25 14:37:47 -070012151 return pSession->htConfig.ht_sgi40;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012152 default:
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053012153 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012154 "invalid ht capability");
12155 return -EIO;
12156 }
12157}
12158
12159int sme_update_ht_config(tHalHandle hHal, uint8_t sessionId, uint16_t htCapab,
12160 int value)
12161{
12162 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
12163 tCsrRoamSession *pSession = CSR_GET_SESSION(pMac, sessionId);
12164
12165 if (NULL == pSession) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053012166 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012167 "%s: pSession is NULL", __func__);
12168 return -EIO;
12169 }
12170
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012171 if (QDF_STATUS_SUCCESS != wma_set_htconfig(sessionId, htCapab, value)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053012172 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012173 "Failed to set ht capability in target");
12174 return -EIO;
12175 }
12176
12177 switch (htCapab) {
12178 case WNI_CFG_HT_CAP_INFO_ADVANCE_CODING:
12179 pSession->htConfig.ht_rx_ldpc = value;
12180 break;
12181 case WNI_CFG_HT_CAP_INFO_TX_STBC:
12182 pSession->htConfig.ht_tx_stbc = value;
12183 break;
12184 case WNI_CFG_HT_CAP_INFO_RX_STBC:
12185 pSession->htConfig.ht_rx_stbc = value;
12186 break;
12187 case WNI_CFG_HT_CAP_INFO_SHORT_GI_20MHZ:
Sandeep Puligilla607f34a2016-05-25 14:37:47 -070012188 pSession->htConfig.ht_sgi20 = value;
12189 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012190 case WNI_CFG_HT_CAP_INFO_SHORT_GI_40MHZ:
Sandeep Puligilla607f34a2016-05-25 14:37:47 -070012191 pSession->htConfig.ht_sgi40 = value;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012192 break;
12193 }
12194
12195 return 0;
12196}
12197
12198#define HT20_SHORT_GI_MCS7_RATE 722
12199/* ---------------------------------------------------------------------------
12200 \fn sme_send_rate_update_ind
12201 \brief API to Update rate
12202 \param hHal - The handle returned by mac_open
12203 \param rateUpdateParams - Pointer to rate update params
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012204 \return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012205 ---------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012206QDF_STATUS sme_send_rate_update_ind(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012207 tSirRateUpdateInd *rateUpdateParams)
12208{
12209 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012210 QDF_STATUS status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012211 cds_msg_t msg;
Anurag Chouhan600c3a02016-03-01 10:33:54 +053012212 tSirRateUpdateInd *rate_upd = qdf_mem_malloc(sizeof(tSirRateUpdateInd));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012213
12214 if (rate_upd == NULL) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053012215 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012216 "Rate update struct alloc failed");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012217 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012218 }
12219 *rate_upd = *rateUpdateParams;
12220
12221 if (rate_upd->mcastDataRate24GHz == HT20_SHORT_GI_MCS7_RATE)
12222 rate_upd->mcastDataRate24GHzTxFlag =
12223 eHAL_TX_RATE_HT20 | eHAL_TX_RATE_SGI;
12224 else if (rate_upd->reliableMcastDataRate ==
12225 HT20_SHORT_GI_MCS7_RATE)
12226 rate_upd->reliableMcastDataRateTxFlag =
12227 eHAL_TX_RATE_HT20 | eHAL_TX_RATE_SGI;
12228
12229 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012230 if (QDF_STATUS_SUCCESS == status) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012231 msg.type = WMA_RATE_UPDATE_IND;
12232 msg.bodyptr = rate_upd;
Sreelakshmi Konamki6a065362016-05-31 16:05:01 +053012233 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
12234 NO_SESSION, msg.type));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012235 if (!QDF_IS_STATUS_SUCCESS
Anurag Chouhan6d760662016-02-20 16:05:43 +053012236 (cds_mq_post_message(QDF_MODULE_ID_WMA, &msg))) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053012237 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012238 "%s: Not able "
12239 "to post WMA_SET_RMC_RATE_IND to WMA!",
12240 __func__);
12241
12242 sme_release_global_lock(&pMac->sme);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053012243 qdf_mem_free(rate_upd);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012244 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012245 }
12246
12247 sme_release_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012248 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012249 }
12250
12251 return status;
12252}
12253
12254/**
Kondabattini, Ganeshe4f18e02016-09-13 13:01:22 +053012255 * sme_update_access_policy_vendor_ie() - update vendor ie and access policy.
12256 * @hal: Pointer to the mac context
12257 * @session_id: sme session id
12258 * @vendor_ie: vendor ie
12259 * @access_policy: vendor ie access policy
12260 *
12261 * This function updates the vendor ie and access policy to lim.
12262 *
12263 * Return: success or failure.
12264 */
12265QDF_STATUS sme_update_access_policy_vendor_ie(tHalHandle hal,
12266 uint8_t session_id, uint8_t *vendor_ie, int access_policy)
12267{
12268 struct sme_update_access_policy_vendor_ie *msg;
12269 uint16_t msg_len;
12270 QDF_STATUS status = QDF_STATUS_E_FAILURE;
12271 tpAniSirGlobal mac = PMAC_STRUCT(hal);
12272
12273 msg_len = sizeof(*msg);
12274
12275 msg = qdf_mem_malloc(msg_len);
12276 if (!msg) {
12277 sms_log(mac, LOGE,
12278 "failed to allocate memory for sme_update_access_policy_vendor_ie");
12279 return QDF_STATUS_E_FAILURE;
12280 }
12281
Kondabattini, Ganeshe4f18e02016-09-13 13:01:22 +053012282 msg->msg_type = (uint16_t)eWNI_SME_UPDATE_ACCESS_POLICY_VENDOR_IE;
12283 msg->length = (uint16_t)msg_len;
12284
12285 qdf_mem_copy(&msg->ie[0], vendor_ie, sizeof(msg->ie));
12286
12287 msg->sme_session_id = session_id;
12288 msg->access_policy = access_policy;
12289
12290 sms_log(mac, LOG1, "sme_session_id %hu, access_policy %d", session_id,
12291 access_policy);
12292
12293 status = cds_send_mb_message_to_mac(msg);
12294
12295 return status;
12296}
12297
12298/**
Agrawal Ashishda3e9502016-09-21 17:43:51 +053012299 * sme_update_short_retry_limit_threshold() - update short frame retry limit TH
12300 * @hal: Handle returned by mac_open
12301 * @session_id: Session ID on which short frame retry limit needs to be
12302 * updated to FW
12303 * @short_limit_count_th: Retry count TH to retry short frame.
12304 *
12305 * This function is used to configure count to retry short frame.
12306 *
12307 * Return: QDF_STATUS
12308 */
12309QDF_STATUS sme_update_short_retry_limit_threshold(tHalHandle hal_handle,
12310 struct sme_short_retry_limit *short_retry_limit_th)
12311{
12312 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal_handle);
12313 QDF_STATUS status = QDF_STATUS_SUCCESS;
12314 struct sme_short_retry_limit *srl;
12315 cds_msg_t msg;
12316
12317 srl = qdf_mem_malloc(sizeof(*srl));
12318 if (NULL == srl) {
12319 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
12320 "%s: fail to alloc short retry limit", __func__);
12321 return QDF_STATUS_E_FAILURE;
12322 }
12323 sms_log(mac_ctx, LOG1, FL("session_id %d short retry limit count: %d"),
12324 short_retry_limit_th->session_id,
12325 short_retry_limit_th->short_retry_limit);
12326
12327 srl->session_id = short_retry_limit_th->session_id;
12328 srl->short_retry_limit = short_retry_limit_th->short_retry_limit;
12329
12330 qdf_mem_zero(&msg, sizeof(msg));
12331 msg.type = SIR_HAL_SHORT_RETRY_LIMIT_CNT;
12332 msg.reserved = 0;
12333 msg.bodyptr = srl;
12334 status = cds_mq_post_message(QDF_MODULE_ID_WMA, &msg);
12335 if (status != QDF_STATUS_SUCCESS) {
12336 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
12337 FL("Not able to post short retry limit count to WDA"));
12338 qdf_mem_free(srl);
12339 return QDF_STATUS_E_FAILURE;
12340 }
12341
12342 return status;
12343}
12344
12345/**
12346 * sme_update_long_retry_limit_threshold() - update long retry limit TH
12347 * @hal: Handle returned by mac_open
12348 * @session_id: Session ID on which long frames retry TH needs to be updated
12349 * to FW
12350 * @long_limit_count_th: Retry count to retry long frame.
12351 *
12352 * This function is used to configure TH to retry long frame.
12353 *
12354 * Return: QDF_STATUS
12355*/
12356QDF_STATUS sme_update_long_retry_limit_threshold(tHalHandle hal_handle,
12357 struct sme_long_retry_limit *long_retry_limit_th)
12358{
12359 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal_handle);
12360 QDF_STATUS status = QDF_STATUS_SUCCESS;
12361 struct sme_long_retry_limit *lrl;
12362 cds_msg_t msg;
12363
12364 lrl = qdf_mem_malloc(sizeof(*lrl));
12365 if (NULL == lrl) {
12366 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
12367 "%s: fail to alloc long retry limit", __func__);
12368 return QDF_STATUS_E_FAILURE;
12369 }
12370 sms_log(mac_ctx, LOG1, FL("session_id %d long retry limit count: %d"),
12371 long_retry_limit_th->session_id,
12372 long_retry_limit_th->long_retry_limit);
12373
12374 lrl->session_id = long_retry_limit_th->session_id;
12375 lrl->long_retry_limit = long_retry_limit_th->long_retry_limit;
12376
12377 qdf_mem_zero(&msg, sizeof(msg));
12378 msg.type = SIR_HAL_LONG_RETRY_LIMIT_CNT;
12379 msg.reserved = 0;
12380 msg.bodyptr = lrl;
12381 status = cds_mq_post_message(QDF_MODULE_ID_WMA, &msg);
12382
12383 if (status != QDF_STATUS_SUCCESS) {
12384 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
12385 FL("Not able to post long retry limit count to WDA"));
12386 qdf_mem_free(lrl);
12387 return QDF_STATUS_E_FAILURE;
12388 }
12389
12390 return status;
12391}
12392
12393/**
Agrawal, Ashish4e5fa1c2016-09-21 19:03:43 +053012394 * sme_update_sta_inactivity_timeout(): Update sta_inactivity_timeout to FW
12395 * @hal: Handle returned by mac_open
12396 * @session_id: Session ID on which sta_inactivity_timeout needs
12397 * to be updated to FW
12398 * @sta_inactivity_timeout: sta inactivity timeout.
12399 *
12400 * If a station does not send anything in sta_inactivity_timeout seconds, an
12401 * empty data frame is sent to it in order to verify whether it is
12402 * still in range. If this frame is not ACKed, the station will be
12403 * disassociated and then deauthenticated.
12404 *
12405 * Return: QDF_STATUS_SUCCESS or non-zero on failure.
12406*/
12407QDF_STATUS sme_update_sta_inactivity_timeout(tHalHandle hal_handle,
12408 struct sme_sta_inactivity_timeout *sta_inactivity_timer)
12409{
12410 struct sme_sta_inactivity_timeout *inactivity_time;
12411 void *wma_handle;
12412
12413 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
12414 inactivity_time = qdf_mem_malloc(sizeof(*inactivity_time));
12415 if (NULL == inactivity_time) {
12416 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
12417 "%s: fail to alloc inactivity_time", __func__);
12418 return QDF_STATUS_E_FAILURE;
12419 }
12420 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO,
12421 FL("sta_inactivity_timeout: %d"),
12422 sta_inactivity_timer->sta_inactivity_timeout);
12423 inactivity_time->session_id = sta_inactivity_timer->session_id;
12424 inactivity_time->sta_inactivity_timeout =
12425 sta_inactivity_timer->sta_inactivity_timeout;
12426
12427 wma_update_sta_inactivity_timeout(wma_handle,
12428 inactivity_time);
12429 return QDF_STATUS_SUCCESS;
12430}
12431
12432/**
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012433 * sme_get_reg_info() - To get registration info
12434 * @hHal: HAL context
12435 * @chanId: channel id
12436 * @regInfo1: first reg info to fill
12437 * @regInfo2: second reg info to fill
12438 *
12439 * This routine will give you reg info
12440 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012441 * Return: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012442 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012443QDF_STATUS sme_get_reg_info(tHalHandle hHal, uint8_t chanId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012444 uint32_t *regInfo1, uint32_t *regInfo2)
12445{
12446 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012447 QDF_STATUS status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012448 uint8_t i;
12449 bool found = false;
12450
12451 status = sme_acquire_global_lock(&pMac->sme);
12452 *regInfo1 = 0;
12453 *regInfo2 = 0;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012454 if (!QDF_IS_STATUS_SUCCESS(status))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012455 return status;
12456
12457 for (i = 0; i < WNI_CFG_VALID_CHANNEL_LIST_LEN; i++) {
Amar Singhala297bfa2015-10-15 15:07:29 -070012458 if (pMac->scan.defaultPowerTable[i].chan_num == chanId) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012459 SME_SET_CHANNEL_REG_POWER(*regInfo1,
Amar Singhala297bfa2015-10-15 15:07:29 -070012460 pMac->scan.defaultPowerTable[i].power);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012461
12462 SME_SET_CHANNEL_MAX_TX_POWER(*regInfo2,
Amar Singhala297bfa2015-10-15 15:07:29 -070012463 pMac->scan.defaultPowerTable[i].power);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012464 found = true;
12465 break;
12466 }
12467 }
12468 if (!found)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012469 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012470
12471 sme_release_global_lock(&pMac->sme);
12472 return status;
12473}
12474
12475#ifdef FEATURE_WLAN_AUTO_SHUTDOWN
12476/* ---------------------------------------------------------------------------
12477 \fn sme_auto_shutdown_cb
12478 \brief Used to plug in callback function for receiving auto shutdown evt
12479 \param hHal
12480 \param pCallbackfn : callback function pointer should be plugged in
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012481 \- return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012482 -------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012483QDF_STATUS sme_set_auto_shutdown_cb(tHalHandle hHal, void (*pCallbackfn)(void)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012484 ) {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012485 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012486 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
12487
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053012488 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012489 "%s: Plug in Auto shutdown event callback", __func__);
12490
12491 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012492 if (QDF_STATUS_SUCCESS == status) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012493 if (NULL != pCallbackfn) {
12494 pMac->sme.pAutoShutdownNotificationCb = pCallbackfn;
12495 }
12496 sme_release_global_lock(&pMac->sme);
12497 }
12498
12499 return status;
12500}
12501
12502/* ---------------------------------------------------------------------------
12503 \fn sme_set_auto_shutdown_timer
12504 \API to set auto shutdown timer value in FW.
12505 \param hHal - The handle returned by mac_open
12506 \param timer_val - The auto shutdown timer value to be set
12507 \- return Configuration message posting status, SUCCESS or Fail
12508 -------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012509QDF_STATUS sme_set_auto_shutdown_timer(tHalHandle hHal, uint32_t timer_val)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012510{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012511 QDF_STATUS status = QDF_STATUS_SUCCESS;
12512 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012513 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
12514 tSirAutoShutdownCmdParams *auto_sh_cmd;
12515 cds_msg_t cds_message;
12516
12517 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012518 if (QDF_STATUS_SUCCESS == status) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012519 auto_sh_cmd = (tSirAutoShutdownCmdParams *)
Anurag Chouhan600c3a02016-03-01 10:33:54 +053012520 qdf_mem_malloc(sizeof(tSirAutoShutdownCmdParams));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012521 if (auto_sh_cmd == NULL) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053012522 QDF_TRACE(QDF_MODULE_ID_HDD, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012523 "%s Request Buffer Alloc Fail", __func__);
12524 sme_release_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012525 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012526 }
12527
12528 auto_sh_cmd->timer_val = timer_val;
12529
12530 /* serialize the req through MC thread */
12531 cds_message.bodyptr = auto_sh_cmd;
12532 cds_message.type = WMA_SET_AUTO_SHUTDOWN_TIMER_REQ;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012533 qdf_status = cds_mq_post_message(CDS_MQ_ID_WMA, &cds_message);
12534 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053012535 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012536 "%s: Post Auto shutdown MSG fail", __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053012537 qdf_mem_free(auto_sh_cmd);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012538 sme_release_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012539 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012540 }
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053012541 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012542 "%s: Posted Auto shutdown MSG", __func__);
12543 sme_release_global_lock(&pMac->sme);
12544 }
12545
12546 return status;
12547}
12548#endif
12549
12550#ifdef FEATURE_WLAN_CH_AVOID
12551/* ---------------------------------------------------------------------------
12552 \fn sme_add_ch_avoid_callback
12553 \brief Used to plug in callback function
12554 Which notify channel may not be used with SAP or P2PGO mode.
12555 Notification come from FW.
12556 \param hHal
12557 \param pCallbackfn : callback function pointer should be plugged in
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012558 \- return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012559 -------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012560QDF_STATUS sme_add_ch_avoid_callback
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012561 (tHalHandle hHal, void (*pCallbackfn)(void *pAdapter, void *indParam)
12562 ) {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012563 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012564 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
12565
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053012566 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012567 "%s: Plug in CH AVOID CB", __func__);
12568
12569 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012570 if (QDF_STATUS_SUCCESS == status) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012571 if (NULL != pCallbackfn) {
12572 pMac->sme.pChAvoidNotificationCb = pCallbackfn;
12573 }
12574 sme_release_global_lock(&pMac->sme);
12575 }
12576
12577 return status;
12578}
12579
12580/* ---------------------------------------------------------------------------
12581 \fn sme_ch_avoid_update_req
12582 \API to request channel avoidance update from FW.
12583 \param hHal - The handle returned by mac_open
12584 \param update_type - The udpate_type parameter of this request call
12585 \- return Configuration message posting status, SUCCESS or Fail
12586 -------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012587QDF_STATUS sme_ch_avoid_update_req(tHalHandle hHal)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012588{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012589 QDF_STATUS status = QDF_STATUS_SUCCESS;
12590 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012591 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
12592 tSirChAvoidUpdateReq *cauReq;
12593 cds_msg_t cds_message;
12594
12595 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012596 if (QDF_STATUS_SUCCESS == status) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012597 cauReq = (tSirChAvoidUpdateReq *)
Anurag Chouhan600c3a02016-03-01 10:33:54 +053012598 qdf_mem_malloc(sizeof(tSirChAvoidUpdateReq));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012599 if (NULL == cauReq) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053012600 QDF_TRACE(QDF_MODULE_ID_HDD, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012601 "%s Request Buffer Alloc Fail", __func__);
12602 sme_release_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012603 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012604 }
12605
12606 cauReq->reserved_param = 0;
12607
12608 /* serialize the req through MC thread */
12609 cds_message.bodyptr = cauReq;
12610 cds_message.type = WMA_CH_AVOID_UPDATE_REQ;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012611 qdf_status = cds_mq_post_message(CDS_MQ_ID_WMA, &cds_message);
12612 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053012613 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012614 "%s: Post Ch Avoid Update MSG fail",
12615 __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053012616 qdf_mem_free(cauReq);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012617 sme_release_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012618 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012619 }
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053012620 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012621 "%s: Posted Ch Avoid Update MSG", __func__);
12622 sme_release_global_lock(&pMac->sme);
12623 }
12624
12625 return status;
12626}
12627#endif /* FEATURE_WLAN_CH_AVOID */
12628
12629/**
12630 * sme_set_miracast() - Function to set miracast value to UMAC
12631 * @hal: Handle returned by macOpen
12632 * @filter_type: 0-Disabled, 1-Source, 2-sink
12633 *
12634 * This function passes down the value of miracast set by
12635 * framework to UMAC
12636 *
12637 * Return: Configuration message posting status, SUCCESS or Fail
12638 *
12639 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012640QDF_STATUS sme_set_miracast(tHalHandle hal, uint8_t filter_type)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012641{
12642 cds_msg_t msg;
12643 uint32_t *val;
12644 tpAniSirGlobal mac_ptr = PMAC_STRUCT(hal);
12645
Anurag Chouhan600c3a02016-03-01 10:33:54 +053012646 val = qdf_mem_malloc(sizeof(*val));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012647 if (NULL == val || NULL == mac_ptr) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053012648 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012649 "%s: Invalid pointer", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012650 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012651 }
12652
12653 *val = filter_type;
12654
12655 msg.type = SIR_HAL_SET_MIRACAST;
12656 msg.reserved = 0;
12657 msg.bodyptr = val;
12658
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012659 if (!QDF_IS_STATUS_SUCCESS(
Anurag Chouhan6d760662016-02-20 16:05:43 +053012660 cds_mq_post_message(QDF_MODULE_ID_WMA, &msg))) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053012661 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012662 "%s: Not able to post WDA_SET_MAS_ENABLE_DISABLE to WMA!",
12663 __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053012664 qdf_mem_free(val);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012665 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012666 }
12667
12668 mac_ptr->sme.miracast_value = filter_type;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012669 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012670}
12671
12672/**
12673 * sme_set_mas() - Function to set MAS value to UMAC
12674 * @val: 1-Enable, 0-Disable
12675 *
12676 * This function passes down the value of MAS to the UMAC. A
12677 * value of 1 will enable MAS and a value of 0 will disable MAS
12678 *
12679 * Return: Configuration message posting status, SUCCESS or Fail
12680 *
12681 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012682QDF_STATUS sme_set_mas(uint32_t val)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012683{
12684 cds_msg_t msg;
12685 uint32_t *ptr_val;
12686
Anurag Chouhan600c3a02016-03-01 10:33:54 +053012687 ptr_val = qdf_mem_malloc(sizeof(*ptr_val));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012688 if (NULL == ptr_val) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053012689 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012690 "%s: could not allocate ptr_val", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012691 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012692 }
12693
12694 *ptr_val = val;
12695
12696 msg.type = SIR_HAL_SET_MAS;
12697 msg.reserved = 0;
12698 msg.bodyptr = ptr_val;
12699
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012700 if (!QDF_IS_STATUS_SUCCESS(
Anurag Chouhan6d760662016-02-20 16:05:43 +053012701 cds_mq_post_message(QDF_MODULE_ID_WMA, &msg))) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053012702 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012703 "%s: Not able to post WDA_SET_MAS_ENABLE_DISABLE to WMA!",
12704 __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053012705 qdf_mem_free(ptr_val);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012706 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012707 }
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012708 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012709}
12710
Kiran Kumar Lokere999e58c2016-01-07 02:18:39 -080012711/**
12712 * sme_roam_channel_change_req() - Channel change to new target channel
12713 * @hHal: handle returned by mac_open
12714 * @bssid: mac address of BSS
12715 * @ch_params: target channel information
12716 * @profile: CSR profile
12717 *
12718 * API to Indicate Channel change to new target channel
12719 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012720 * Return: QDF_STATUS
Kiran Kumar Lokere999e58c2016-01-07 02:18:39 -080012721 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012722QDF_STATUS sme_roam_channel_change_req(tHalHandle hHal,
Amar Singhale4f28ee2015-10-21 14:36:56 -070012723 struct qdf_mac_addr bssid,
12724 struct ch_params_s *ch_params,
12725 tCsrRoamProfile *profile)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012726{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012727 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012728 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012729
12730 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012731 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012732
Kiran Kumar Lokere999e58c2016-01-07 02:18:39 -080012733 status = csr_roam_channel_change_req(pMac, bssid, ch_params,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012734 profile);
12735 sme_release_global_lock(&pMac->sme);
12736 }
12737 return status;
12738}
12739
12740/* -------------------------------------------------------------------------
12741 \fn sme_process_channel_change_resp
12742 \brief API to Indicate Channel change response message to SAP.
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012743 \return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012744 ---------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012745QDF_STATUS sme_process_channel_change_resp(tpAniSirGlobal pMac,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012746 uint16_t msg_type, void *pMsgBuf)
12747{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012748 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012749 tCsrRoamInfo proam_info = { 0 };
12750 eCsrRoamResult roamResult;
12751 tpSwitchChannelParams pChnlParams = (tpSwitchChannelParams) pMsgBuf;
12752 uint32_t SessionId = pChnlParams->peSessionId;
12753
12754 proam_info.channelChangeRespEvent =
12755 (tSirChanChangeResponse *)
Anurag Chouhan600c3a02016-03-01 10:33:54 +053012756 qdf_mem_malloc(sizeof(tSirChanChangeResponse));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012757 if (NULL == proam_info.channelChangeRespEvent) {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012758 status = QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012759 sms_log(pMac, LOGE,
12760 "Channel Change Event Allocation Failed: %d\n", status);
12761 return status;
12762 }
12763 if (msg_type == eWNI_SME_CHANNEL_CHANGE_RSP) {
12764 proam_info.channelChangeRespEvent->sessionId = SessionId;
12765 proam_info.channelChangeRespEvent->newChannelNumber =
12766 pChnlParams->channelNumber;
12767 proam_info.channelChangeRespEvent->secondaryChannelOffset =
12768 pChnlParams->ch_width;
12769
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012770 if (pChnlParams->status == QDF_STATUS_SUCCESS) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053012771 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO_MED,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012772 "sapdfs: Received success eWNI_SME_CHANNEL_CHANGE_RSP for sessionId[%d]",
12773 SessionId);
12774 proam_info.channelChangeRespEvent->channelChangeStatus =
12775 1;
12776 roamResult = eCSR_ROAM_RESULT_CHANNEL_CHANGE_SUCCESS;
12777 } else {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053012778 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO_MED,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012779 "sapdfs: Received failure eWNI_SME_CHANNEL_CHANGE_RSP for sessionId[%d]",
12780 SessionId);
12781 proam_info.channelChangeRespEvent->channelChangeStatus =
12782 0;
12783 roamResult = eCSR_ROAM_RESULT_CHANNEL_CHANGE_FAILURE;
12784 }
12785
12786 csr_roam_call_callback(pMac, SessionId, &proam_info, 0,
12787 eCSR_ROAM_SET_CHANNEL_RSP, roamResult);
12788
12789 } else {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012790 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012791 sms_log(pMac, LOGE, "Invalid Channel Change Resp Message: %d\n",
12792 status);
12793 }
Anurag Chouhan600c3a02016-03-01 10:33:54 +053012794 qdf_mem_free(proam_info.channelChangeRespEvent);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012795
12796 return status;
12797}
12798
12799/* -------------------------------------------------------------------------
12800 \fn sme_roam_start_beacon_req
12801 \brief API to Indicate LIM to start Beacon Tx
12802 \after SAP CAC Wait is completed.
12803 \param hHal - The handle returned by mac_open
12804 \param sessionId - session ID
12805 \param dfsCacWaitStatus - CAC WAIT status flag
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012806 \return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012807 ---------------------------------------------------------------------------*/
Anurag Chouhan6d760662016-02-20 16:05:43 +053012808QDF_STATUS sme_roam_start_beacon_req(tHalHandle hHal, struct qdf_mac_addr bssid,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012809 uint8_t dfsCacWaitStatus)
12810{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012811 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012812 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
12813 status = sme_acquire_global_lock(&pMac->sme);
12814
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012815 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012816 status = csr_roam_start_beacon_req(pMac, bssid, dfsCacWaitStatus);
12817 sme_release_global_lock(&pMac->sme);
12818 }
12819 return status;
12820}
12821
Kiran Kumar Lokere999e58c2016-01-07 02:18:39 -080012822/**
12823 * sme_roam_csa_ie_request() - request CSA IE transmission from PE
12824 * @hHal: handle returned by mac_open
12825 * @bssid: SAP bssid
12826 * @targetChannel: target channel information
12827 * @csaIeReqd: CSA IE Request
12828 * @ch_params: channel information
12829 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012830 * Return: QDF_STATUS
Kiran Kumar Lokere999e58c2016-01-07 02:18:39 -080012831 */
Anurag Chouhan6d760662016-02-20 16:05:43 +053012832QDF_STATUS sme_roam_csa_ie_request(tHalHandle hHal, struct qdf_mac_addr bssid,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012833 uint8_t targetChannel, uint8_t csaIeReqd,
Amar Singhale4f28ee2015-10-21 14:36:56 -070012834 struct ch_params_s *ch_params)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012835{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012836 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012837 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
12838 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012839 if (QDF_IS_STATUS_SUCCESS(status)) {
Kiran Kumar Lokere999e58c2016-01-07 02:18:39 -080012840 status = csr_roam_send_chan_sw_ie_request(pMac, bssid,
12841 targetChannel, csaIeReqd, ch_params);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012842 sme_release_global_lock(&pMac->sme);
12843 }
12844 return status;
12845}
12846
12847/* ---------------------------------------------------------------------------
12848 \fn sme_init_thermal_info
12849 \brief SME API to initialize the thermal mitigation parameters
12850 \param hHal
12851 \param thermalParam : thermal mitigation parameters
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012852 \- return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012853 -------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012854QDF_STATUS sme_init_thermal_info(tHalHandle hHal, tSmeThermalParams thermalParam)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012855{
12856 t_thermal_mgmt *pWmaParam;
12857 cds_msg_t msg;
12858 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
12859
Anurag Chouhan600c3a02016-03-01 10:33:54 +053012860 pWmaParam = (t_thermal_mgmt *) qdf_mem_malloc(sizeof(t_thermal_mgmt));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012861 if (NULL == pWmaParam) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053012862 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012863 "%s: could not allocate tThermalMgmt", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012864 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012865 }
12866
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012867 pWmaParam->thermalMgmtEnabled = thermalParam.smeThermalMgmtEnabled;
12868 pWmaParam->throttlePeriod = thermalParam.smeThrottlePeriod;
Poddar, Siddarth83905022016-04-16 17:56:08 -070012869
12870 pWmaParam->throttle_duty_cycle_tbl[0] =
12871 thermalParam.sme_throttle_duty_cycle_tbl[0];
12872 pWmaParam->throttle_duty_cycle_tbl[1] =
12873 thermalParam.sme_throttle_duty_cycle_tbl[1];
12874 pWmaParam->throttle_duty_cycle_tbl[2] =
12875 thermalParam.sme_throttle_duty_cycle_tbl[2];
12876 pWmaParam->throttle_duty_cycle_tbl[3] =
12877 thermalParam.sme_throttle_duty_cycle_tbl[3];
12878
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012879 pWmaParam->thermalLevels[0].minTempThreshold =
12880 thermalParam.smeThermalLevels[0].smeMinTempThreshold;
12881 pWmaParam->thermalLevels[0].maxTempThreshold =
12882 thermalParam.smeThermalLevels[0].smeMaxTempThreshold;
12883 pWmaParam->thermalLevels[1].minTempThreshold =
12884 thermalParam.smeThermalLevels[1].smeMinTempThreshold;
12885 pWmaParam->thermalLevels[1].maxTempThreshold =
12886 thermalParam.smeThermalLevels[1].smeMaxTempThreshold;
12887 pWmaParam->thermalLevels[2].minTempThreshold =
12888 thermalParam.smeThermalLevels[2].smeMinTempThreshold;
12889 pWmaParam->thermalLevels[2].maxTempThreshold =
12890 thermalParam.smeThermalLevels[2].smeMaxTempThreshold;
12891 pWmaParam->thermalLevels[3].minTempThreshold =
12892 thermalParam.smeThermalLevels[3].smeMinTempThreshold;
12893 pWmaParam->thermalLevels[3].maxTempThreshold =
12894 thermalParam.smeThermalLevels[3].smeMaxTempThreshold;
12895
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012896 if (QDF_STATUS_SUCCESS == sme_acquire_global_lock(&pMac->sme)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012897 msg.type = WMA_INIT_THERMAL_INFO_CMD;
12898 msg.bodyptr = pWmaParam;
12899
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012900 if (!QDF_IS_STATUS_SUCCESS
Anurag Chouhan6d760662016-02-20 16:05:43 +053012901 (cds_mq_post_message(QDF_MODULE_ID_WMA, &msg))) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053012902 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012903 "%s: Not able to post WMA_SET_THERMAL_INFO_CMD to WMA!",
12904 __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053012905 qdf_mem_free(pWmaParam);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012906 sme_release_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012907 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012908 }
12909 sme_release_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012910 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012911 }
Anurag Chouhan600c3a02016-03-01 10:33:54 +053012912 qdf_mem_free(pWmaParam);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012913 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012914}
12915
12916/**
12917 * sme_add_set_thermal_level_callback() - Plug in set thermal level callback
12918 * @hal: Handle returned by macOpen
12919 * @callback: sme_set_thermal_level_callback
12920 *
12921 * Plug in set thermal level callback
12922 *
12923 * Return: none
12924 */
12925void sme_add_set_thermal_level_callback(tHalHandle hal,
12926 sme_set_thermal_level_callback callback)
12927{
12928 tpAniSirGlobal pMac = PMAC_STRUCT(hal);
12929
12930 pMac->sme.set_thermal_level_cb = callback;
12931}
12932
12933/**
12934 * sme_set_thermal_level() - SME API to set the thermal mitigation level
12935 * @hal: Handler to HAL
12936 * @level: Thermal mitigation level
12937 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012938 * Return: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012939 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012940QDF_STATUS sme_set_thermal_level(tHalHandle hal, uint8_t level)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012941{
12942 cds_msg_t msg;
12943 tpAniSirGlobal pMac = PMAC_STRUCT(hal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012944 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012945
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012946 if (QDF_STATUS_SUCCESS == sme_acquire_global_lock(&pMac->sme)) {
Anurag Chouhan600c3a02016-03-01 10:33:54 +053012947 qdf_mem_set(&msg, sizeof(msg), 0);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012948 msg.type = WMA_SET_THERMAL_LEVEL;
12949 msg.bodyval = level;
12950
Anurag Chouhan6d760662016-02-20 16:05:43 +053012951 qdf_status = cds_mq_post_message(QDF_MODULE_ID_WMA, &msg);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012952 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053012953 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012954 "%s: Not able to post WMA_SET_THERMAL_LEVEL to WMA!",
12955 __func__);
12956 sme_release_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012957 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012958 }
12959 sme_release_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012960 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012961 }
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012962 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012963}
12964
12965/* ---------------------------------------------------------------------------
12966 \fn sme_txpower_limit
12967 \brief SME API to set txpower limits
12968 \param hHal
12969 \param psmetx : power limits for 2g/5g
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012970 \- return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012971 -------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012972QDF_STATUS sme_txpower_limit(tHalHandle hHal, tSirTxPowerLimit *psmetx)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012973{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012974 QDF_STATUS status = QDF_STATUS_SUCCESS;
12975 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012976 cds_msg_t cds_message;
12977 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Prashanth Bhatta75fa9a12016-01-11 18:30:08 -080012978 tSirTxPowerLimit *tx_power_limit;
12979
Anurag Chouhan600c3a02016-03-01 10:33:54 +053012980 tx_power_limit = qdf_mem_malloc(sizeof(*tx_power_limit));
Prashanth Bhatta75fa9a12016-01-11 18:30:08 -080012981 if (!tx_power_limit) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053012982 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prashanth Bhatta75fa9a12016-01-11 18:30:08 -080012983 "%s: Memory allocation for TxPowerLimit failed!",
12984 __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012985 return QDF_STATUS_E_FAILURE;
Prashanth Bhatta75fa9a12016-01-11 18:30:08 -080012986 }
12987
12988 *tx_power_limit = *psmetx;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012989
12990 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012991 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012992 cds_message.type = WMA_TX_POWER_LIMIT;
12993 cds_message.reserved = 0;
Prashanth Bhatta75fa9a12016-01-11 18:30:08 -080012994 cds_message.bodyptr = tx_power_limit;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012995
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012996 qdf_status = cds_mq_post_message(CDS_MQ_ID_WMA, &cds_message);
12997 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053012998 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012999 "%s: not able to post WMA_TX_POWER_LIMIT",
13000 __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013001 status = QDF_STATUS_E_FAILURE;
Anurag Chouhan600c3a02016-03-01 10:33:54 +053013002 qdf_mem_free(tx_power_limit);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013003 }
13004 sme_release_global_lock(&pMac->sme);
13005 }
13006 return status;
13007}
13008
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013009QDF_STATUS sme_update_connect_debug(tHalHandle hHal, uint32_t set_value)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013010{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013011 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013012 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
13013 pMac->fEnableDebugLog = set_value;
13014 return status;
13015}
13016
13017/* ---------------------------------------------------------------------------
13018 \fn sme_ap_disable_intra_bss_fwd
13019
13020 \brief
13021 SME will send message to WMA to set Intra BSS in txrx
13022
13023 \param
13024
13025 hHal - The handle returned by mac_open
13026
13027 sessionId - session id ( vdev id)
13028
13029 disablefwd - bool value that indicate disable intrabss fwd disable
13030
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013031 \return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013032 --------------------------------------------------------------------------- */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013033QDF_STATUS sme_ap_disable_intra_bss_fwd(tHalHandle hHal, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013034 bool disablefwd)
13035{
13036 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013037 int status = QDF_STATUS_SUCCESS;
13038 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013039 cds_msg_t cds_message;
13040 tpDisableIntraBssFwd pSapDisableIntraFwd = NULL;
13041
13042 /* Prepare the request to send to SME. */
Anurag Chouhan600c3a02016-03-01 10:33:54 +053013043 pSapDisableIntraFwd = qdf_mem_malloc(sizeof(tDisableIntraBssFwd));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013044 if (NULL == pSapDisableIntraFwd) {
13045 sms_log(pMac, LOGP, "Memory Allocation Failure!!! %s", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013046 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013047 }
13048
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013049 pSapDisableIntraFwd->sessionId = sessionId;
13050 pSapDisableIntraFwd->disableintrabssfwd = disablefwd;
13051
13052 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013053 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013054 /* serialize the req through MC thread */
13055 cds_message.bodyptr = pSapDisableIntraFwd;
13056 cds_message.type = WMA_SET_SAP_INTRABSS_DIS;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013057 qdf_status = cds_mq_post_message(CDS_MQ_ID_WMA, &cds_message);
13058 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
13059 status = QDF_STATUS_E_FAILURE;
Anurag Chouhan600c3a02016-03-01 10:33:54 +053013060 qdf_mem_free(pSapDisableIntraFwd);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013061 }
13062 sme_release_global_lock(&pMac->sme);
13063 }
13064 return status;
13065}
13066
13067#ifdef WLAN_FEATURE_STATS_EXT
13068
13069/******************************************************************************
13070 \fn sme_stats_ext_register_callback
13071
13072 \brief
13073 a function called to register the callback that send vendor event for stats
13074 ext
13075
13076 \param callback - callback to be registered
13077******************************************************************************/
13078void sme_stats_ext_register_callback(tHalHandle hHal, StatsExtCallback callback)
13079{
13080 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
13081
13082 pMac->sme.StatsExtCallback = callback;
13083}
13084
Arun Khandavalli4b55da72016-07-19 19:55:01 +053013085/**
13086 * sme_stats_ext_deregister_callback() - De-register ext stats callback
13087 * @h_hal: Hal Handle
13088 *
13089 * This function is called to de initialize the HDD NAN feature. Currently
13090 * the only operation required is to de-register a callback with SME.
13091 *
13092 * Return: None
13093 */
13094void sme_stats_ext_deregister_callback(tHalHandle h_hal)
13095{
13096 tpAniSirGlobal pmac;
13097
13098 if (!h_hal) {
13099 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
13100 FL("hHal is not valid"));
13101 return;
13102 }
13103
13104 pmac = PMAC_STRUCT(h_hal);
13105 pmac->sme.StatsExtCallback = NULL;
13106}
13107
13108
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013109/******************************************************************************
13110 \fn sme_stats_ext_request
13111
13112 \brief
13113 a function called when HDD receives STATS EXT vendor command from userspace
13114
13115 \param sessionID - vdevID for the stats ext request
13116
13117 \param input - Stats Ext Request structure ptr
13118
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013119 \return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013120******************************************************************************/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013121QDF_STATUS sme_stats_ext_request(uint8_t session_id, tpStatsExtRequestReq input)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013122{
13123 cds_msg_t msg;
13124 tpStatsExtRequest data;
13125 size_t data_len;
13126
13127 data_len = sizeof(tStatsExtRequest) + input->request_data_len;
Anurag Chouhan600c3a02016-03-01 10:33:54 +053013128 data = qdf_mem_malloc(data_len);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013129
13130 if (data == NULL) {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013131 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013132 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013133 data->vdev_id = session_id;
13134 data->request_data_len = input->request_data_len;
13135 if (input->request_data_len) {
Anurag Chouhan600c3a02016-03-01 10:33:54 +053013136 qdf_mem_copy(data->request_data,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013137 input->request_data, input->request_data_len);
13138 }
13139
13140 msg.type = WMA_STATS_EXT_REQUEST;
13141 msg.reserved = 0;
13142 msg.bodyptr = data;
13143
Anurag Chouhan6d760662016-02-20 16:05:43 +053013144 if (QDF_STATUS_SUCCESS != cds_mq_post_message(QDF_MODULE_ID_WMA, &msg)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053013145 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013146 "%s: Not able to post WMA_STATS_EXT_REQUEST message to WMA",
13147 __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053013148 qdf_mem_free(data);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013149 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013150 }
13151
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013152 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013153}
13154
13155/******************************************************************************
13156 \fn sme_stats_ext_event
13157
13158 \brief
13159 a callback function called when SME received eWNI_SME_STATS_EXT_EVENT
13160 response from WMA
13161
13162 \param hHal - HAL handle for device
13163 \param pMsg - Message body passed from WMA; includes NAN header
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013164 \return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013165******************************************************************************/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013166QDF_STATUS sme_stats_ext_event(tHalHandle hHal, void *pMsg)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013167{
13168 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013169 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013170
13171 if (NULL == pMsg) {
13172 sms_log(pMac, LOGE, "in %s msg ptr is NULL", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013173 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013174 } else {
13175 sms_log(pMac, LOG2, "SME: entering %s", __func__);
13176
13177 if (pMac->sme.StatsExtCallback) {
13178 pMac->sme.StatsExtCallback(pMac->hHdd,
13179 (tpStatsExtEvent) pMsg);
13180 }
13181 }
13182
13183 return status;
13184}
13185
13186#endif
13187
13188/* ---------------------------------------------------------------------------
13189 \fn sme_update_dfs_scan_mode
13190 \brief Update DFS roam scan mode
13191 This function is called through dynamic setConfig callback function
13192 to configure allowDFSChannelRoam.
13193 \param hHal - HAL handle for device
13194 \param sessionId - Session Identifier
13195 \param allowDFSChannelRoam - DFS roaming scan mode 0 (disable),
13196 1 (passive), 2 (active)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013197 \return QDF_STATUS_SUCCESS - SME update DFS roaming scan config
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013198 successfully.
13199 Other status means SME failed to update DFS roaming scan config.
13200 \sa
13201 -------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013202QDF_STATUS sme_update_dfs_scan_mode(tHalHandle hHal, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013203 uint8_t allowDFSChannelRoam)
13204{
13205 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013206 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013207
Naveen Rawatc36f7eb2016-11-10 20:01:03 -080013208 if (sessionId >= CSR_ROAM_SESSION_MAX) {
13209 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
13210 FL("Invalid sme session id: %d"), sessionId);
13211 return QDF_STATUS_E_INVAL;
13212 }
13213
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013214 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013215 if (QDF_IS_STATUS_SUCCESS(status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053013216 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013217 "LFR runtime successfully set AllowDFSChannelRoam Mode to "
13218 "%d - old value is %d - roam state is %s",
13219 allowDFSChannelRoam,
13220 pMac->roam.configParam.allowDFSChannelRoam,
13221 mac_trace_get_neighbour_roam_state(pMac->roam.
13222 neighborRoamInfo
13223 [sessionId].
13224 neighborRoamState));
13225 pMac->roam.configParam.allowDFSChannelRoam =
13226 allowDFSChannelRoam;
13227 sme_release_global_lock(&pMac->sme);
13228 }
13229 if (pMac->roam.configParam.isRoamOffloadScanEnabled) {
13230 csr_roam_offload_scan(pMac, sessionId,
13231 ROAM_SCAN_OFFLOAD_UPDATE_CFG,
13232 REASON_ROAM_DFS_SCAN_MODE_CHANGED);
13233 }
13234
13235 return status;
13236}
13237
13238/*--------------------------------------------------------------------------
13239 \brief sme_get_dfs_scan_mode() - get DFS roam scan mode
13240 This is a synchronous call
13241 \param hHal - The handle returned by mac_open.
13242 \return DFS roaming scan mode 0 (disable), 1 (passive), 2 (active)
13243 \sa
13244 --------------------------------------------------------------------------*/
13245uint8_t sme_get_dfs_scan_mode(tHalHandle hHal)
13246{
13247 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
13248 return pMac->roam.configParam.allowDFSChannelRoam;
13249}
13250
13251/*----------------------------------------------------------------------------
13252 \fn sme_modify_add_ie
13253 \brief This function sends msg to updates the additional IE buffers in PE
13254 \param hHal - global structure
13255 \param pModifyIE - pointer to tModifyIE structure
13256 \param updateType - type of buffer
13257 \- return Success or failure
13258 -----------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013259QDF_STATUS sme_modify_add_ie(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013260 tSirModifyIE *pModifyIE, eUpdateIEsType updateType)
13261{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013262 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013263 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
13264 status = sme_acquire_global_lock(&pMac->sme);
13265
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013266 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013267 status = csr_roam_modify_add_ies(pMac, pModifyIE, updateType);
13268 sme_release_global_lock(&pMac->sme);
13269 }
13270 return status;
13271}
13272
13273/*----------------------------------------------------------------------------
13274 \fn sme_update_add_ie
13275 \brief This function sends msg to updates the additional IE buffers in PE
13276 \param hHal - global structure
13277 \param pUpdateIE - pointer to structure tUpdateIE
13278 \param updateType - type of buffer
13279 \- return Success or failure
13280 -----------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013281QDF_STATUS sme_update_add_ie(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013282 tSirUpdateIE *pUpdateIE, eUpdateIEsType updateType)
13283{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013284 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013285 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
13286 status = sme_acquire_global_lock(&pMac->sme);
13287
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013288 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013289 status = csr_roam_update_add_ies(pMac, pUpdateIE, updateType);
13290 sme_release_global_lock(&pMac->sme);
13291 }
13292 return status;
13293}
13294
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013295/**
13296 * sme_update_dsc_pto_up_mapping()
13297 * @hHal: HAL context
13298 * @dscpmapping: pointer to DSCP mapping structure
13299 * @sessionId: SME session id
13300 *
13301 * This routine is called to update dscp mapping
13302 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013303 * Return: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013304 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013305QDF_STATUS sme_update_dsc_pto_up_mapping(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013306 sme_QosWmmUpType *dscpmapping,
13307 uint8_t sessionId)
13308{
13309 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013310 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013311 uint8_t i, j, peSessionId;
13312 tCsrRoamSession *pCsrSession = NULL;
13313 tpPESession pSession = NULL;
13314
13315 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013316 if (!QDF_IS_STATUS_SUCCESS(status))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013317 return status;
13318 pCsrSession = CSR_GET_SESSION(pMac, sessionId);
13319 if (pCsrSession == NULL) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053013320 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013321 FL("Session lookup fails for CSR session"));
13322 sme_release_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013323 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013324 }
13325 if (!CSR_IS_SESSION_VALID(pMac, sessionId)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053013326 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013327 FL("Invalid session Id %u"), sessionId);
13328 sme_release_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013329 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013330 }
13331
13332 pSession = pe_find_session_by_bssid(pMac,
13333 pCsrSession->connectedProfile.bssid.bytes,
13334 &peSessionId);
13335
13336 if (pSession == NULL) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053013337 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013338 FL(" Session lookup fails for BSSID"));
13339 sme_release_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013340 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013341 }
13342
13343 if (!pSession->QosMapSet.present) {
Anurag Chouhan05d124f2016-09-03 16:21:50 +053013344 hdd_notice("QOS Mapping IE not present");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013345 sme_release_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013346 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013347 }
13348 for (i = 0; i < SME_QOS_WMM_UP_MAX; i++) {
13349 for (j = pSession->QosMapSet.dscp_range[i][0];
13350 j <= pSession->QosMapSet.dscp_range[i][1];
13351 j++) {
13352 if ((pSession->QosMapSet.dscp_range[i][0] == 255)
13353 && (pSession->QosMapSet.dscp_range[i][1] ==
13354 255)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053013355 QDF_TRACE(QDF_MODULE_ID_SME,
13356 QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013357 FL("User Priority %d isn't used"), i);
13358 break;
13359 } else {
13360 dscpmapping[j] = i;
13361 }
13362 }
13363 }
13364 for (i = 0; i < pSession->QosMapSet.num_dscp_exceptions; i++)
13365 if (pSession->QosMapSet.dscp_exceptions[i][0] != 255)
13366 dscpmapping[pSession->QosMapSet.dscp_exceptions[i][0]] =
13367 pSession->QosMapSet.dscp_exceptions[i][1];
13368
13369 sme_release_global_lock(&pMac->sme);
13370 return status;
13371}
13372
13373/* ---------------------------------------------------------------------------
13374 \fn sme_abort_roam_scan
13375 \brief API to abort current roam scan cycle by roam scan offload module.
13376 \param hHal - The handle returned by mac_open.
13377 \param sessionId - Session Identifier
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013378 \return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013379 ---------------------------------------------------------------------------*/
13380
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013381QDF_STATUS sme_abort_roam_scan(tHalHandle hHal, uint8_t sessionId)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013382{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013383 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013384 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
13385
13386 sms_log(pMac, LOGW, "entering function %s", __func__);
13387 if (pMac->roam.configParam.isRoamOffloadScanEnabled) {
13388 /* acquire the lock for the sme object */
13389 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013390 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013391 csr_roam_offload_scan(pMac, sessionId,
13392 ROAM_SCAN_OFFLOAD_ABORT_SCAN,
13393 REASON_ROAM_ABORT_ROAM_SCAN);
13394 /* release the lock for the sme object */
13395 sme_release_global_lock(&pMac->sme);
13396 }
13397 }
13398
13399 return status;
13400}
13401
13402#ifdef FEATURE_WLAN_EXTSCAN
13403/**
13404 * sme_get_valid_channels_by_band() - to fetch valid channels filtered by band
13405 * @hHal: HAL context
13406 * @wifiBand: RF band information
13407 * @aValidChannels: output array to store channel info
13408 * @pNumChannels: output number of channels
13409 *
13410 * SME API to fetch all valid channels filtered by band
13411 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013412 * Return: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013413 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013414QDF_STATUS sme_get_valid_channels_by_band(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013415 uint8_t wifiBand,
13416 uint32_t *aValidChannels,
13417 uint8_t *pNumChannels)
13418{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013419 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013420 uint8_t chanList[WNI_CFG_VALID_CHANNEL_LIST_LEN] = { 0 };
13421 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
13422 uint8_t numChannels = 0;
13423 uint8_t i = 0;
13424 uint32_t totValidChannels = WNI_CFG_VALID_CHANNEL_LIST_LEN;
13425
13426 if (!aValidChannels || !pNumChannels) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053013427 sms_log(pMac, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013428 FL("Output channel list/NumChannels is NULL"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013429 return QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013430 }
13431
13432 if ((wifiBand < WIFI_BAND_UNSPECIFIED) || (wifiBand >= WIFI_BAND_MAX)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053013433 sms_log(pMac, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013434 FL("Invalid wifiBand (%d)"), wifiBand);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013435 return QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013436 }
13437
13438 status = sme_get_cfg_valid_channels(hHal, &chanList[0],
13439 &totValidChannels);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013440 if (!QDF_IS_STATUS_SUCCESS(status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053013441 sms_log(pMac, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013442 FL("Fail to get valid channel list (err=%d)"), status);
13443 return status;
13444 }
13445
13446 switch (wifiBand) {
13447 case WIFI_BAND_UNSPECIFIED:
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053013448 sms_log(pMac, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013449 FL("Unspec Band, return all (%d) valid channels"),
13450 totValidChannels);
13451 numChannels = totValidChannels;
13452 for (i = 0; i < totValidChannels; i++) {
13453 aValidChannels[i] = cds_chan_to_freq(chanList[i]);
13454 }
13455 break;
13456
13457 case WIFI_BAND_BG:
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053013458 sms_log(pMac, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013459 FL("WIFI_BAND_BG (2.4 GHz)"));
13460 for (i = 0; i < totValidChannels; i++) {
13461 if (CDS_IS_CHANNEL_24GHZ(chanList[i])) {
13462 aValidChannels[numChannels++] =
13463 cds_chan_to_freq(chanList[i]);
13464 }
13465 }
13466 break;
13467
13468 case WIFI_BAND_A:
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053013469 sms_log(pMac, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013470 FL("WIFI_BAND_A (5 GHz without DFS)"));
13471 for (i = 0; i < totValidChannels; i++) {
13472 if (CDS_IS_CHANNEL_5GHZ(chanList[i]) &&
13473 !CDS_IS_DFS_CH(chanList[i])) {
13474 aValidChannels[numChannels++] =
13475 cds_chan_to_freq(chanList[i]);
13476 }
13477 }
13478 break;
13479
13480 case WIFI_BAND_ABG:
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053013481 sms_log(pMac, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013482 FL("WIFI_BAND_ABG (2.4 GHz + 5 GHz; no DFS)"));
13483 for (i = 0; i < totValidChannels; i++) {
13484 if ((CDS_IS_CHANNEL_24GHZ(chanList[i]) ||
13485 CDS_IS_CHANNEL_5GHZ(chanList[i])) &&
13486 !CDS_IS_DFS_CH(chanList[i])) {
13487 aValidChannels[numChannels++] =
13488 cds_chan_to_freq(chanList[i]);
13489 }
13490 }
13491 break;
13492
13493 case WIFI_BAND_A_DFS_ONLY:
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053013494 sms_log(pMac, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013495 FL("WIFI_BAND_A_DFS (5 GHz DFS only)"));
13496 for (i = 0; i < totValidChannels; i++) {
13497 if (CDS_IS_CHANNEL_5GHZ(chanList[i]) &&
13498 CDS_IS_DFS_CH(chanList[i])) {
13499 aValidChannels[numChannels++] =
13500 cds_chan_to_freq(chanList[i]);
13501 }
13502 }
13503 break;
13504
13505 case WIFI_BAND_A_WITH_DFS:
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053013506 sms_log(pMac, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013507 FL("WIFI_BAND_A_WITH_DFS (5 GHz with DFS)"));
13508 for (i = 0; i < totValidChannels; i++) {
13509 if (CDS_IS_CHANNEL_5GHZ(chanList[i])) {
13510 aValidChannels[numChannels++] =
13511 cds_chan_to_freq(chanList[i]);
13512 }
13513 }
13514 break;
13515
13516 case WIFI_BAND_ABG_WITH_DFS:
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053013517 sms_log(pMac, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013518 FL("WIFI_BAND_ABG_WITH_DFS (2.4 GHz+5 GHz with DFS)"));
13519 for (i = 0; i < totValidChannels; i++) {
13520 if (CDS_IS_CHANNEL_24GHZ(chanList[i]) ||
13521 CDS_IS_CHANNEL_5GHZ(chanList[i])) {
13522 aValidChannels[numChannels++] =
13523 cds_chan_to_freq(chanList[i]);
13524 }
13525 }
13526 break;
13527
13528 default:
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053013529 sms_log(pMac, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013530 FL("Unknown wifiBand (%d))"), wifiBand);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013531 return QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013532 break;
13533 }
13534 *pNumChannels = numChannels;
13535
13536 return status;
13537}
13538
13539/* ---------------------------------------------------------------------------
13540 \fn sme_ext_scan_get_capabilities
13541 \brief SME API to fetch extscan capabilities
13542 \param hHal
13543 \param pReq: extscan capabilities structure
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013544 \- return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013545 -------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013546QDF_STATUS sme_ext_scan_get_capabilities(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013547 tSirGetExtScanCapabilitiesReqParams *
13548 pReq)
13549{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013550 QDF_STATUS status = QDF_STATUS_SUCCESS;
13551 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013552 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
13553 cds_msg_t cds_message;
13554
13555 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013556 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013557 /* Serialize the req through MC thread */
13558 cds_message.bodyptr = pReq;
13559 cds_message.type = WMA_EXTSCAN_GET_CAPABILITIES_REQ;
Sreelakshmi Konamki6a065362016-05-31 16:05:01 +053013560 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
13561 NO_SESSION, cds_message.type));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013562 qdf_status = cds_mq_post_message(CDS_MQ_ID_WMA, &cds_message);
13563 if (!QDF_IS_STATUS_SUCCESS(qdf_status))
13564 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013565
13566 sme_release_global_lock(&pMac->sme);
13567 }
13568 return status;
13569}
13570
13571/* ---------------------------------------------------------------------------
13572 \fn sme_ext_scan_start
13573 \brief SME API to issue extscan start
13574 \param hHal
13575 \param pStartCmd: extscan start structure
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013576 \- return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013577 -------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013578QDF_STATUS sme_ext_scan_start(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013579 tSirWifiScanCmdReqParams *pStartCmd)
13580{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013581 QDF_STATUS status = QDF_STATUS_SUCCESS;
13582 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013583 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
13584 cds_msg_t cds_message;
13585
13586 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013587 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013588 /* Serialize the req through MC thread */
13589 cds_message.bodyptr = pStartCmd;
13590 cds_message.type = WMA_EXTSCAN_START_REQ;
Sreelakshmi Konamki6a065362016-05-31 16:05:01 +053013591 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
13592 NO_SESSION, cds_message.type));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013593 qdf_status = cds_mq_post_message(CDS_MQ_ID_WMA, &cds_message);
13594 if (!QDF_IS_STATUS_SUCCESS(qdf_status))
13595 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013596
13597 sme_release_global_lock(&pMac->sme);
13598 }
13599 return status;
13600}
13601
13602/* ---------------------------------------------------------------------------
13603 \fn sme_ext_scan_stop
13604 \brief SME API to issue extscan stop
13605 \param hHal
13606 \param pStopReq: extscan stop structure
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013607 \- return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013608 -------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013609QDF_STATUS sme_ext_scan_stop(tHalHandle hHal, tSirExtScanStopReqParams *pStopReq)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013610{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013611 QDF_STATUS status = QDF_STATUS_SUCCESS;
13612 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013613 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
13614 cds_msg_t cds_message;
13615
13616 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013617 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013618 /* Serialize the req through MC thread */
13619 cds_message.bodyptr = pStopReq;
13620 cds_message.type = WMA_EXTSCAN_STOP_REQ;
Sreelakshmi Konamki6a065362016-05-31 16:05:01 +053013621 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
13622 NO_SESSION, cds_message.type));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013623 qdf_status = cds_mq_post_message(CDS_MQ_ID_WMA, &cds_message);
13624 if (!QDF_IS_STATUS_SUCCESS(qdf_status))
13625 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013626 sme_release_global_lock(&pMac->sme);
13627 }
13628 return status;
13629}
13630
13631/* ---------------------------------------------------------------------------
13632 \fn sme_set_bss_hotlist
13633 \brief SME API to set BSSID hotlist
13634 \param hHal
13635 \param pSetHotListReq: extscan set hotlist structure
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013636 \- return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013637 -------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013638QDF_STATUS sme_set_bss_hotlist(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013639 tSirExtScanSetBssidHotListReqParams *
13640 pSetHotListReq)
13641{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013642 QDF_STATUS status = QDF_STATUS_SUCCESS;
13643 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013644 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
13645 cds_msg_t cds_message;
13646
13647 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013648 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013649 /* Serialize the req through MC thread */
13650 cds_message.bodyptr = pSetHotListReq;
13651 cds_message.type = WMA_EXTSCAN_SET_BSSID_HOTLIST_REQ;
Sreelakshmi Konamki6a065362016-05-31 16:05:01 +053013652 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
13653 NO_SESSION, cds_message.type));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013654 qdf_status = cds_mq_post_message(CDS_MQ_ID_WMA, &cds_message);
13655 if (!QDF_IS_STATUS_SUCCESS(qdf_status))
13656 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013657
13658 sme_release_global_lock(&pMac->sme);
13659 }
13660 return status;
13661}
13662
13663/* ---------------------------------------------------------------------------
13664 \fn sme_reset_bss_hotlist
13665 \brief SME API to reset BSSID hotlist
13666 \param hHal
13667 \param pSetHotListReq: extscan set hotlist structure
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013668 \- return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013669 -------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013670QDF_STATUS sme_reset_bss_hotlist(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013671 tSirExtScanResetBssidHotlistReqParams *
13672 pResetReq)
13673{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013674 QDF_STATUS status = QDF_STATUS_SUCCESS;
13675 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013676 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
13677 cds_msg_t cds_message;
13678
13679 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013680 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013681 /* Serialize the req through MC thread */
13682 cds_message.bodyptr = pResetReq;
13683 cds_message.type = WMA_EXTSCAN_RESET_BSSID_HOTLIST_REQ;
Sreelakshmi Konamki6a065362016-05-31 16:05:01 +053013684 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
13685 NO_SESSION, cds_message.type));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013686 qdf_status = cds_mq_post_message(CDS_MQ_ID_WMA, &cds_message);
13687 if (!QDF_IS_STATUS_SUCCESS(qdf_status))
13688 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013689
13690 sme_release_global_lock(&pMac->sme);
13691 }
13692 return status;
13693}
13694
Manikandan Mohan80dea792016-04-28 16:36:48 -070013695/**
13696 * sme_send_wisa_params(): Pass WISA mode to WMA
13697 * @hal: HAL context
13698 * @wisa_params: pointer to WISA params struct
13699 * @sessionId: SME session id
13700 *
13701 * Pass WISA params to WMA
13702 *
13703 * Return: QDF_STATUS
13704 */
13705QDF_STATUS sme_set_wisa_params(tHalHandle hal,
13706 struct sir_wisa_params *wisa_params)
13707{
13708 QDF_STATUS status = QDF_STATUS_SUCCESS;
13709 tpAniSirGlobal mac = PMAC_STRUCT(hal);
13710 cds_msg_t cds_message;
13711 struct sir_wisa_params *cds_msg_wisa_params;
13712
13713 cds_msg_wisa_params = qdf_mem_malloc(sizeof(struct sir_wisa_params));
13714 if (!cds_msg_wisa_params)
13715 return QDF_STATUS_E_NOMEM;
13716
13717 *cds_msg_wisa_params = *wisa_params;
13718 status = sme_acquire_global_lock(&mac->sme);
13719 if (QDF_IS_STATUS_SUCCESS(status)) {
13720 cds_message.bodyptr = cds_msg_wisa_params;
13721 cds_message.type = WMA_SET_WISA_PARAMS;
13722 status = cds_mq_post_message(CDS_MQ_ID_WMA, &cds_message);
13723 sme_release_global_lock(&mac->sme);
13724 }
13725 return status;
13726}
13727
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013728/* ---------------------------------------------------------------------------
13729 \fn sme_set_significant_change
13730 \brief SME API to set significant change
13731 \param hHal
13732 \param pSetSignificantChangeReq: extscan set significant change structure
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013733 \- return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013734 -------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013735QDF_STATUS sme_set_significant_change(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013736 tSirExtScanSetSigChangeReqParams *
13737 pSetSignificantChangeReq)
13738{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013739 QDF_STATUS status = QDF_STATUS_SUCCESS;
13740 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013741 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
13742 cds_msg_t cds_message;
13743
13744 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013745 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013746 /* Serialize the req through MC thread */
13747 cds_message.bodyptr = pSetSignificantChangeReq;
13748 cds_message.type = WMA_EXTSCAN_SET_SIGNF_CHANGE_REQ;
Sreelakshmi Konamki6a065362016-05-31 16:05:01 +053013749 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
13750 NO_SESSION, cds_message.type));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013751 qdf_status = cds_mq_post_message(CDS_MQ_ID_WMA, &cds_message);
13752 if (!QDF_IS_STATUS_SUCCESS(qdf_status))
13753 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013754
13755 sme_release_global_lock(&pMac->sme);
13756 }
13757 return status;
13758}
13759
13760/* ---------------------------------------------------------------------------
13761 \fn sme_reset_significant_change
13762 \brief SME API to reset significant change
13763 \param hHal
13764 \param pResetReq: extscan reset significant change structure
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013765 \- return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013766 -------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013767QDF_STATUS sme_reset_significant_change(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013768 tSirExtScanResetSignificantChangeReqParams
13769 *pResetReq)
13770{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013771 QDF_STATUS status = QDF_STATUS_SUCCESS;
13772 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013773 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
13774 cds_msg_t cds_message;
13775
13776 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013777 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013778 /* Serialize the req through MC thread */
13779 cds_message.bodyptr = pResetReq;
13780 cds_message.type = WMA_EXTSCAN_RESET_SIGNF_CHANGE_REQ;
Sreelakshmi Konamki6a065362016-05-31 16:05:01 +053013781 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
13782 NO_SESSION, cds_message.type));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013783 qdf_status = cds_mq_post_message(CDS_MQ_ID_WMA, &cds_message);
13784 if (!QDF_IS_STATUS_SUCCESS(qdf_status))
13785 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013786
13787 sme_release_global_lock(&pMac->sme);
13788 }
13789 return status;
13790}
13791
13792/* ---------------------------------------------------------------------------
13793 \fn sme_get_cached_results
13794 \brief SME API to get cached results
13795 \param hHal
13796 \param pCachedResultsReq: extscan get cached results structure
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013797 \- return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013798 -------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013799QDF_STATUS sme_get_cached_results(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013800 tSirExtScanGetCachedResultsReqParams *
13801 pCachedResultsReq)
13802{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013803 QDF_STATUS status = QDF_STATUS_SUCCESS;
13804 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013805 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
13806 cds_msg_t cds_message;
13807
13808 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013809 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013810 /* Serialize the req through MC thread */
13811 cds_message.bodyptr = pCachedResultsReq;
13812 cds_message.type = WMA_EXTSCAN_GET_CACHED_RESULTS_REQ;
Sreelakshmi Konamki6a065362016-05-31 16:05:01 +053013813 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
13814 NO_SESSION, cds_message.type));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013815 qdf_status = cds_mq_post_message(CDS_MQ_ID_WMA, &cds_message);
13816 if (!QDF_IS_STATUS_SUCCESS(qdf_status))
13817 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013818
13819 sme_release_global_lock(&pMac->sme);
13820 }
13821 return status;
13822}
13823
13824/**
13825 * sme_set_epno_list() - set epno network list
Deepak Dhamdhere0f076bd2016-06-02 11:29:21 -070013826 * @hal: global hal handle
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013827 * @input: request message
13828 *
13829 * This function constructs the cds message and fill in message type,
13830 * bodyptr with %input and posts it to WDA queue.
13831 *
Deepak Dhamdhere0f076bd2016-06-02 11:29:21 -070013832 * Return: QDF_STATUS enumeration
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013833 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013834QDF_STATUS sme_set_epno_list(tHalHandle hal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013835 struct wifi_epno_params *input)
13836{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013837 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013838 tpAniSirGlobal mac = PMAC_STRUCT(hal);
13839 cds_msg_t cds_message;
13840 struct wifi_epno_params *req_msg;
13841 int len, i;
13842
13843 sms_log(mac, LOG1, FL("enter"));
13844 len = sizeof(*req_msg) +
13845 (input->num_networks * sizeof(struct wifi_epno_network));
Mukul Sharmae8c919f2016-10-02 20:35:15 +053013846
Anurag Chouhan600c3a02016-03-01 10:33:54 +053013847 req_msg = qdf_mem_malloc(len);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013848 if (!req_msg) {
Anurag Chouhan600c3a02016-03-01 10:33:54 +053013849 sms_log(mac, LOGE, FL("qdf_mem_malloc failed"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013850 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013851 }
13852
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013853 req_msg->num_networks = input->num_networks;
13854 req_msg->request_id = input->request_id;
13855 req_msg->session_id = input->session_id;
Mukul Sharmae8c919f2016-10-02 20:35:15 +053013856
13857 /* Fill only when num_networks are non zero */
13858 if (req_msg->num_networks) {
13859 req_msg->min_5ghz_rssi = input->min_5ghz_rssi;
13860 req_msg->min_24ghz_rssi = input->min_24ghz_rssi;
13861 req_msg->initial_score_max = input->initial_score_max;
13862 req_msg->same_network_bonus = input->same_network_bonus;
13863 req_msg->secure_bonus = input->secure_bonus;
13864 req_msg->band_5ghz_bonus = input->band_5ghz_bonus;
13865 req_msg->current_connection_bonus =
13866 input->current_connection_bonus;
13867
13868 for (i = 0; i < req_msg->num_networks; i++) {
13869 req_msg->networks[i].flags = input->networks[i].flags;
13870 req_msg->networks[i].auth_bit_field =
13871 input->networks[i].auth_bit_field;
13872 req_msg->networks[i].ssid.length =
13873 input->networks[i].ssid.length;
13874 qdf_mem_copy(req_msg->networks[i].ssid.ssId,
13875 input->networks[i].ssid.ssId,
13876 req_msg->networks[i].ssid.length);
13877 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013878 }
13879
13880 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013881 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013882 sms_log(mac, LOGE,
13883 FL("sme_acquire_global_lock failed!(status=%d)"),
13884 status);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053013885 qdf_mem_free(req_msg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013886 return status;
13887 }
13888
13889 /* Serialize the req through MC thread */
13890 cds_message.bodyptr = req_msg;
13891 cds_message.type = WMA_SET_EPNO_LIST_REQ;
13892 status = cds_mq_post_message(CDS_MQ_ID_WMA, &cds_message);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013893 if (!QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013894 sms_log(mac, LOGE,
13895 FL("cds_mq_post_message failed!(err=%d)"),
13896 status);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053013897 qdf_mem_free(req_msg);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013898 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013899 }
13900 sme_release_global_lock(&mac->sme);
13901 return status;
13902}
13903
13904/**
13905 * sme_set_passpoint_list() - set passpoint network list
13906 * @hal: global hal handle
13907 * @input: request message
13908 *
13909 * This function constructs the cds message and fill in message type,
13910 * bodyptr with @input and posts it to WDA queue.
13911 *
Deepak Dhamdhere0f076bd2016-06-02 11:29:21 -070013912 * Return: QDF_STATUS enumeration
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013913 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013914QDF_STATUS sme_set_passpoint_list(tHalHandle hal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013915 struct wifi_passpoint_req *input)
13916{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013917 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013918 tpAniSirGlobal mac = PMAC_STRUCT(hal);
13919 cds_msg_t cds_message;
13920 struct wifi_passpoint_req *req_msg;
13921 int len, i;
13922
13923 sms_log(mac, LOG1, FL("enter"));
13924 len = sizeof(*req_msg) +
13925 (input->num_networks * sizeof(struct wifi_passpoint_network));
Anurag Chouhan600c3a02016-03-01 10:33:54 +053013926 req_msg = qdf_mem_malloc(len);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013927 if (!req_msg) {
Anurag Chouhan600c3a02016-03-01 10:33:54 +053013928 sms_log(mac, LOGE, FL("qdf_mem_malloc failed"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013929 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013930 }
13931
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013932 req_msg->num_networks = input->num_networks;
13933 req_msg->request_id = input->request_id;
13934 req_msg->session_id = input->session_id;
13935 for (i = 0; i < req_msg->num_networks; i++) {
13936 req_msg->networks[i].id =
13937 input->networks[i].id;
Anurag Chouhan600c3a02016-03-01 10:33:54 +053013938 qdf_mem_copy(req_msg->networks[i].realm,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013939 input->networks[i].realm,
13940 strlen(input->networks[i].realm) + 1);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053013941 qdf_mem_copy(req_msg->networks[i].plmn,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013942 input->networks[i].plmn,
13943 SIR_PASSPOINT_PLMN_LEN);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053013944 qdf_mem_copy(req_msg->networks[i].roaming_consortium_ids,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013945 input->networks[i].roaming_consortium_ids,
13946 sizeof(req_msg->networks[i].roaming_consortium_ids));
13947 }
13948
13949 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013950 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013951 sms_log(mac, LOGE,
13952 FL("sme_acquire_global_lock failed!(status=%d)"),
13953 status);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053013954 qdf_mem_free(req_msg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013955 return status;
13956 }
13957
13958 /* Serialize the req through MC thread */
13959 cds_message.bodyptr = req_msg;
13960 cds_message.type = WMA_SET_PASSPOINT_LIST_REQ;
13961 status = cds_mq_post_message(CDS_MQ_ID_WMA, &cds_message);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013962 if (!QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013963 sms_log(mac, LOGE,
13964 FL("cds_mq_post_message failed!(err=%d)"),
13965 status);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053013966 qdf_mem_free(req_msg);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013967 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013968 }
13969 sme_release_global_lock(&mac->sme);
13970 return status;
13971}
13972
13973/**
13974 * sme_reset_passpoint_list() - reset passpoint network list
13975 * @hHal: global hal handle
13976 * @input: request message
13977 *
Deepak Dhamdhere0f076bd2016-06-02 11:29:21 -070013978 * Return: QDF_STATUS enumeration
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013979 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013980QDF_STATUS sme_reset_passpoint_list(tHalHandle hal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013981 struct wifi_passpoint_req *input)
13982{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013983 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013984 tpAniSirGlobal mac = PMAC_STRUCT(hal);
13985 cds_msg_t cds_message;
13986 struct wifi_passpoint_req *req_msg;
13987
13988 sms_log(mac, LOG1, FL("enter"));
Anurag Chouhan600c3a02016-03-01 10:33:54 +053013989 req_msg = qdf_mem_malloc(sizeof(*req_msg));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013990 if (!req_msg) {
Anurag Chouhan600c3a02016-03-01 10:33:54 +053013991 sms_log(mac, LOGE, FL("qdf_mem_malloc failed"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013992 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013993 }
13994
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013995 req_msg->request_id = input->request_id;
13996 req_msg->session_id = input->session_id;
13997
13998 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013999 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014000 sms_log(mac, LOGE,
14001 FL("sme_acquire_global_lock failed!(status=%d)"),
14002 status);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053014003 qdf_mem_free(req_msg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014004 return status;
14005 }
14006
14007 /* Serialize the req through MC thread */
14008 cds_message.bodyptr = req_msg;
14009 cds_message.type = WMA_RESET_PASSPOINT_LIST_REQ;
14010 status = cds_mq_post_message(CDS_MQ_ID_WMA, &cds_message);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014011 if (!QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014012 sms_log(mac, LOGE,
14013 FL("cds_mq_post_message failed!(err=%d)"),
14014 status);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053014015 qdf_mem_free(req_msg);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014016 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014017 }
14018 sme_release_global_lock(&mac->sme);
14019 return status;
14020}
14021
14022/**
14023 * sme_set_ssid_hotlist() - Set the SSID hotlist
14024 * @hal: SME handle
14025 * @request: set ssid hotlist request
14026 *
Deepak Dhamdhere0f076bd2016-06-02 11:29:21 -070014027 * Return: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014028 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014029QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014030sme_set_ssid_hotlist(tHalHandle hal,
14031 struct sir_set_ssid_hotlist_request *request)
14032{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014033 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014034 tpAniSirGlobal mac = PMAC_STRUCT(hal);
14035 cds_msg_t cds_message;
14036 struct sir_set_ssid_hotlist_request *set_req;
14037
Anurag Chouhan600c3a02016-03-01 10:33:54 +053014038 set_req = qdf_mem_malloc(sizeof(*set_req));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014039 if (!set_req) {
Anurag Chouhan600c3a02016-03-01 10:33:54 +053014040 sms_log(mac, LOGE, FL("qdf_mem_malloc failed"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014041 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014042 }
14043
14044 *set_req = *request;
14045 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014046 if (QDF_STATUS_SUCCESS == status) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014047 /* Serialize the req through MC thread */
14048 cds_message.bodyptr = set_req;
14049 cds_message.type = WMA_EXTSCAN_SET_SSID_HOTLIST_REQ;
14050 status = cds_mq_post_message(CDS_MQ_ID_WMA, &cds_message);
14051 sme_release_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014052 if (!QDF_IS_STATUS_SUCCESS(status)) {
Anurag Chouhan600c3a02016-03-01 10:33:54 +053014053 qdf_mem_free(set_req);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014054 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014055 }
14056 } else {
14057 sms_log(mac, LOGE,
14058 FL("sme_acquire_global_lock failed!(status=%d)"),
14059 status);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053014060 qdf_mem_free(set_req);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014061 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014062 }
14063 return status;
14064}
14065
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014066QDF_STATUS sme_ext_scan_register_callback(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014067 void (*pExtScanIndCb)(void *,
14068 const uint16_t,
14069 void *))
14070{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014071 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014072 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
14073
14074 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014075 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014076 pMac->sme.pExtScanIndCb = pExtScanIndCb;
14077 sme_release_global_lock(&pMac->sme);
14078 }
14079 return status;
14080}
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014081#endif /* FEATURE_WLAN_EXTSCAN */
14082
14083#ifdef WLAN_FEATURE_LINK_LAYER_STATS
14084
14085/* ---------------------------------------------------------------------------
14086 \fn sme_ll_stats_clear_req
14087 \brief SME API to clear Link Layer Statistics
14088 \param hHal
14089 \param pclearStatsReq: Link Layer clear stats request params structure
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014090 \- return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014091 -------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014092QDF_STATUS sme_ll_stats_clear_req(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014093 tSirLLStatsClearReq *pclearStatsReq)
14094{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014095 QDF_STATUS status = QDF_STATUS_SUCCESS;
14096 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014097 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
14098 cds_msg_t cds_message;
14099 tSirLLStatsClearReq *clear_stats_req;
14100
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053014101 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014102 "staId = %u", pclearStatsReq->staId);
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053014103 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014104 "statsClearReqMask = 0x%X",
14105 pclearStatsReq->statsClearReqMask);
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053014106 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014107 "stopReq = %u", pclearStatsReq->stopReq);
14108
Anurag Chouhan600c3a02016-03-01 10:33:54 +053014109 clear_stats_req = qdf_mem_malloc(sizeof(*clear_stats_req));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014110
14111 if (!clear_stats_req) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053014112 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014113 "%s: Not able to allocate memory for WMA_LL_STATS_CLEAR_REQ",
14114 __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014115 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014116 }
14117
14118 *clear_stats_req = *pclearStatsReq;
14119
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014120 if (QDF_STATUS_SUCCESS == sme_acquire_global_lock(&pMac->sme)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014121 /* Serialize the req through MC thread */
14122 cds_message.bodyptr = clear_stats_req;
14123 cds_message.type = WMA_LINK_LAYER_STATS_CLEAR_REQ;
Sreelakshmi Konamki6a065362016-05-31 16:05:01 +053014124 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
14125 NO_SESSION, cds_message.type));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014126 qdf_status = cds_mq_post_message(CDS_MQ_ID_WMA, &cds_message);
14127 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053014128 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014129 "%s: not able to post WMA_LL_STATS_CLEAR_REQ",
14130 __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053014131 qdf_mem_free(clear_stats_req);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014132 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014133 }
14134 sme_release_global_lock(&pMac->sme);
14135 } else {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053014136 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR, "%s: "
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014137 "sme_acquire_global_lock error", __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053014138 qdf_mem_free(clear_stats_req);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014139 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014140 }
14141
14142 return status;
14143}
14144
14145/* ---------------------------------------------------------------------------
14146 \fn sme_ll_stats_set_req
14147 \brief SME API to set the Link Layer Statistics
14148 \param hHal
14149 \param psetStatsReq: Link Layer set stats request params structure
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014150 \- return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014151 -------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014152QDF_STATUS sme_ll_stats_set_req(tHalHandle hHal, tSirLLStatsSetReq *psetStatsReq)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014153{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014154 QDF_STATUS status = QDF_STATUS_SUCCESS;
14155 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014156 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
14157 cds_msg_t cds_message;
14158 tSirLLStatsSetReq *set_stats_req;
14159
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053014160 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014161 "%s: MPDU Size = %u", __func__,
14162 psetStatsReq->mpduSizeThreshold);
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053014163 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014164 " Aggressive Stats Collections = %u",
14165 psetStatsReq->aggressiveStatisticsGathering);
14166
Anurag Chouhan600c3a02016-03-01 10:33:54 +053014167 set_stats_req = qdf_mem_malloc(sizeof(*set_stats_req));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014168
14169 if (!set_stats_req) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053014170 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014171 "%s: Not able to allocate memory for WMA_LL_STATS_SET_REQ",
14172 __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014173 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014174 }
14175
14176 *set_stats_req = *psetStatsReq;
14177
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014178 if (QDF_STATUS_SUCCESS == sme_acquire_global_lock(&pMac->sme)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014179 /* Serialize the req through MC thread */
14180 cds_message.bodyptr = set_stats_req;
14181 cds_message.type = WMA_LINK_LAYER_STATS_SET_REQ;
Sreelakshmi Konamki6a065362016-05-31 16:05:01 +053014182 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
14183 NO_SESSION, cds_message.type));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014184 qdf_status = cds_mq_post_message(CDS_MQ_ID_WMA, &cds_message);
14185 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053014186 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014187 "%s: not able to post WMA_LL_STATS_SET_REQ",
14188 __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053014189 qdf_mem_free(set_stats_req);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014190 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014191 }
14192 sme_release_global_lock(&pMac->sme);
14193 } else {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053014194 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR, "%s: "
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014195 "sme_acquire_global_lock error", __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053014196 qdf_mem_free(set_stats_req);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014197 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014198 }
14199
14200 return status;
14201}
14202
14203/* ---------------------------------------------------------------------------
14204 \fn sme_ll_stats_get_req
14205 \brief SME API to get the Link Layer Statistics
14206 \param hHal
14207 \param pgetStatsReq: Link Layer get stats request params structure
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014208 \- return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014209 -------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014210QDF_STATUS sme_ll_stats_get_req(tHalHandle hHal, tSirLLStatsGetReq *pgetStatsReq)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014211{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014212 QDF_STATUS status = QDF_STATUS_SUCCESS;
14213 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014214 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
14215 cds_msg_t cds_message;
14216 tSirLLStatsGetReq *get_stats_req;
14217
Anurag Chouhan600c3a02016-03-01 10:33:54 +053014218 get_stats_req = qdf_mem_malloc(sizeof(*get_stats_req));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014219
14220 if (!get_stats_req) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053014221 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014222 "%s: Not able to allocate memory for WMA_LL_STATS_GET_REQ",
14223 __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014224 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014225 }
14226
14227 *get_stats_req = *pgetStatsReq;
14228
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014229 if (QDF_STATUS_SUCCESS == sme_acquire_global_lock(&pMac->sme)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014230 /* Serialize the req through MC thread */
14231 cds_message.bodyptr = get_stats_req;
14232 cds_message.type = WMA_LINK_LAYER_STATS_GET_REQ;
Sreelakshmi Konamki6a065362016-05-31 16:05:01 +053014233 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
14234 NO_SESSION, cds_message.type));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014235 qdf_status = cds_mq_post_message(CDS_MQ_ID_WMA, &cds_message);
14236 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053014237 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014238 "%s: not able to post WMA_LL_STATS_GET_REQ",
14239 __func__);
14240
Anurag Chouhan600c3a02016-03-01 10:33:54 +053014241 qdf_mem_free(get_stats_req);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014242 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014243
14244 }
14245 sme_release_global_lock(&pMac->sme);
14246 } else {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053014247 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR, "%s: "
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014248 "sme_acquire_global_lock error", __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053014249 qdf_mem_free(get_stats_req);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014250 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014251 }
14252
14253 return status;
14254}
14255
14256/* ---------------------------------------------------------------------------
14257 \fn sme_set_link_layer_stats_ind_cb
14258 \brief SME API to trigger the stats are available after get request
14259 \param hHal
14260 \param callback_routine - HDD callback which needs to be invoked after
14261 getting status notification from FW
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014262 \- return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014263 -------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014264QDF_STATUS sme_set_link_layer_stats_ind_cb
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014265 (tHalHandle hHal,
14266 void (*callback_routine)(void *callbackCtx, int indType, void *pRsp)
14267 ) {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014268 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014269 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
14270
14271 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014272 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014273 pMac->sme.pLinkLayerStatsIndCallback = callback_routine;
14274 sme_release_global_lock(&pMac->sme);
14275 } else {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053014276 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR, "%s: "
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014277 "sme_acquire_global_lock error", __func__);
14278 }
14279
14280 return status;
14281}
14282
Arun Khandavalli4b55da72016-07-19 19:55:01 +053014283/**
14284 * sme_reset_link_layer_stats_ind_cb() - SME API to reset link layer stats
14285 * indication
14286 * @h_hal: Hal Handle
14287 *
14288 * This function reset's the link layer stats indication
14289 *
14290 * Return: QDF_STATUS Enumeration
14291 */
14292
14293QDF_STATUS sme_reset_link_layer_stats_ind_cb(tHalHandle h_hal)
14294{
14295 QDF_STATUS status;
14296 tpAniSirGlobal pmac;
14297
14298 if (!h_hal) {
14299 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
14300 FL("hHal is not valid"));
14301 return QDF_STATUS_E_INVAL;
14302 }
14303 pmac = PMAC_STRUCT(h_hal);
14304
14305 status = sme_acquire_global_lock(&pmac->sme);
14306 if (QDF_IS_STATUS_SUCCESS(status)) {
14307 pmac->sme.pLinkLayerStatsIndCallback = NULL;
14308 sme_release_global_lock(&pmac->sme);
14309 } else {
14310 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR, "%s: sme_acquire_global_lock error",
14311 __func__);
14312 }
14313
14314 return status;
14315}
14316
14317
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014318#endif /* WLAN_FEATURE_LINK_LAYER_STATS */
14319
14320/**
14321 * sme_fw_mem_dump_register_cb() - Register fw memory dump callback
14322 *
14323 * @hal - MAC global handle
14324 * @callback_routine - callback routine from HDD
14325 *
14326 * This API is invoked by HDD to register its callback in SME
14327 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014328 * Return: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014329 */
14330#ifdef WLAN_FEATURE_MEMDUMP
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014331QDF_STATUS sme_fw_mem_dump_register_cb(tHalHandle hal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014332 void (*callback_routine)(void *cb_context,
14333 struct fw_dump_rsp *rsp))
14334{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014335 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014336 tpAniSirGlobal pmac = PMAC_STRUCT(hal);
14337
14338 status = sme_acquire_global_lock(&pmac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014339 if (QDF_STATUS_SUCCESS == status) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014340 pmac->sme.fw_dump_callback = callback_routine;
14341 sme_release_global_lock(&pmac->sme);
14342 } else {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053014343 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014344 FL("sme_acquire_global_lock error"));
14345 }
14346
14347 return status;
14348}
14349#else
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014350QDF_STATUS sme_fw_mem_dump_register_cb(tHalHandle hal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014351 void (*callback_routine)(void *cb_context,
14352 struct fw_dump_rsp *rsp))
14353{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014354 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014355}
14356#endif /* WLAN_FEATURE_MEMDUMP */
14357
14358/**
14359 * sme_fw_mem_dump_unregister_cb() - Unregister fw memory dump callback
14360 *
14361 * @hHal - MAC global handle
14362 *
14363 * This API is invoked by HDD to unregister its callback in SME
14364 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014365 * Return: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014366 */
14367#ifdef WLAN_FEATURE_MEMDUMP
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014368QDF_STATUS sme_fw_mem_dump_unregister_cb(tHalHandle hal)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014369{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014370 QDF_STATUS status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014371 tpAniSirGlobal pmac = PMAC_STRUCT(hal);
14372
14373 status = sme_acquire_global_lock(&pmac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014374 if (QDF_STATUS_SUCCESS == status) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014375 pmac->sme.fw_dump_callback = NULL;
14376 sme_release_global_lock(&pmac->sme);
14377 } else {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053014378 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014379 FL("sme_acquire_global_lock error"));
14380 }
14381
14382 return status;
14383}
14384#else
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014385QDF_STATUS sme_fw_mem_dump_unregister_cb(tHalHandle hal)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014386{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014387 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014388}
14389#endif /* WLAN_FEATURE_MEMDUMP */
14390
14391#ifdef WLAN_FEATURE_ROAM_OFFLOAD
14392/*--------------------------------------------------------------------------
14393 \brief sme_update_roam_offload_enabled() - enable/disable roam offload feaure
14394 It is used at in the REG_DYNAMIC_VARIABLE macro definition of
14395 \param hHal - The handle returned by mac_open.
14396 \param nRoamOffloadEnabled - The bool to update with
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014397 \return QDF_STATUS_SUCCESS - SME update config successfully.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014398 Other status means SME is failed to update.
14399 \sa
14400 --------------------------------------------------------------------------*/
14401
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014402QDF_STATUS sme_update_roam_offload_enabled(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014403 bool nRoamOffloadEnabled)
14404{
14405 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014406 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014407
14408 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014409 if (QDF_IS_STATUS_SUCCESS(status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053014410 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014411 "%s: LFR3:gRoamOffloadEnabled is changed from %d to %d",
14412 __func__, pMac->roam.configParam.isRoamOffloadEnabled,
14413 nRoamOffloadEnabled);
14414 pMac->roam.configParam.isRoamOffloadEnabled =
14415 nRoamOffloadEnabled;
14416 sme_release_global_lock(&pMac->sme);
14417 }
14418
14419 return status;
14420}
14421
Deepak Dhamdheref2a7d8b2016-08-19 16:17:38 -070014422/**
14423 * sme_update_roam_key_mgmt_offload_enabled() - enable/disable key mgmt offload
14424 * This is a synchronous call
14425 * @hal_ctx: The handle returned by mac_open.
14426 * @session_id: Session Identifier
14427 * @key_mgmt_offload_enabled: key mgmt enable/disable flag
14428 * @okc_enabled: Opportunistic key caching enable/disable flag
14429 * Return: QDF_STATUS_SUCCESS - SME updated config successfully.
14430 * Other status means SME is failed to update.
14431 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014432
Deepak Dhamdheref2a7d8b2016-08-19 16:17:38 -070014433QDF_STATUS sme_update_roam_key_mgmt_offload_enabled(tHalHandle hal_ctx,
14434 uint8_t session_id,
14435 bool key_mgmt_offload_enabled,
14436 bool okc_enabled)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014437{
Deepak Dhamdheref2a7d8b2016-08-19 16:17:38 -070014438 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal_ctx);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014439 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014440
Deepak Dhamdheref2a7d8b2016-08-19 16:17:38 -070014441 status = sme_acquire_global_lock(&mac_ctx->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014442 if (QDF_IS_STATUS_SUCCESS(status)) {
Deepak Dhamdheref2a7d8b2016-08-19 16:17:38 -070014443 if (CSR_IS_SESSION_VALID(mac_ctx, session_id)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053014444 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO,
Deepak Dhamdheref2a7d8b2016-08-19 16:17:38 -070014445 "%s: LFR3: key_mgmt_offload_enabled changed to %d",
14446 __func__, key_mgmt_offload_enabled);
14447 status = csr_roam_set_key_mgmt_offload(mac_ctx,
14448 session_id,
14449 key_mgmt_offload_enabled,
14450 okc_enabled);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014451 } else {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014452 status = QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014453 }
Deepak Dhamdheref2a7d8b2016-08-19 16:17:38 -070014454 sme_release_global_lock(&mac_ctx->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014455 }
14456
14457 return status;
14458}
Prashanth Bhattabfc25292015-11-05 11:16:21 -080014459#endif
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014460
14461/* ---------------------------------------------------------------------------
14462 \fn sme_get_temperature
14463 \brief SME API to get the pdev temperature
14464 \param hHal
14465 \param temperature context
14466 \param pCallbackfn: callback fn with response (temperature)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014467 \- return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014468 -------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014469QDF_STATUS sme_get_temperature(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014470 void *tempContext,
14471 void (*pCallbackfn)(int temperature,
14472 void *pContext))
14473{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014474 QDF_STATUS status = QDF_STATUS_SUCCESS;
14475 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014476 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
14477 cds_msg_t cds_message;
14478
14479 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014480 if (QDF_STATUS_SUCCESS == status) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014481 if ((NULL == pCallbackfn) &&
14482 (NULL == pMac->sme.pGetTemperatureCb)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053014483 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014484 FL
14485 ("Indication Call back did not registered"));
14486 sme_release_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014487 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014488 } else if (NULL != pCallbackfn) {
14489 pMac->sme.pTemperatureCbContext = tempContext;
14490 pMac->sme.pGetTemperatureCb = pCallbackfn;
14491 }
14492 /* serialize the req through MC thread */
14493 cds_message.bodyptr = NULL;
14494 cds_message.type = WMA_GET_TEMPERATURE_REQ;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014495 qdf_status = cds_mq_post_message(CDS_MQ_ID_WMA, &cds_message);
14496 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
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("Post Get Temperature msg fail"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014499 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014500 }
14501 sme_release_global_lock(&pMac->sme);
14502 }
14503 return status;
14504}
14505
14506/* ---------------------------------------------------------------------------
14507 \fn sme_set_scanning_mac_oui
14508 \brief SME API to set scanning mac oui
14509 \param hHal
14510 \param pScanMacOui: Scanning Mac Oui (input 3 bytes)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014511 \- return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014512 -------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014513QDF_STATUS sme_set_scanning_mac_oui(tHalHandle hHal, tSirScanMacOui *pScanMacOui)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014514{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014515 QDF_STATUS status = QDF_STATUS_SUCCESS;
14516 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014517 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
14518 cds_msg_t cds_message;
14519
14520 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014521 if (QDF_STATUS_SUCCESS == status) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014522 /* Serialize the req through MC thread */
14523 cds_message.bodyptr = pScanMacOui;
14524 cds_message.type = WMA_SET_SCAN_MAC_OUI_REQ;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014525 qdf_status = cds_mq_post_message(CDS_MQ_ID_WMA, &cds_message);
14526 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053014527 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014528 FL("Msg post Set Scan Mac OUI failed"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014529 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014530 }
14531 sme_release_global_lock(&pMac->sme);
14532 }
14533 return status;
14534}
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014535
14536#ifdef DHCP_SERVER_OFFLOAD
14537/* ---------------------------------------------------------------------------
14538 \fn sme_set_dhcp_srv_offload
14539 \brief SME API to set DHCP server offload info
14540 \param hHal
14541 \param pDhcpSrvInfo : DHCP server offload info struct
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014542 \- return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014543 -------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014544QDF_STATUS sme_set_dhcp_srv_offload(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014545 tSirDhcpSrvOffloadInfo *pDhcpSrvInfo)
14546{
14547 cds_msg_t cds_message;
14548 tSirDhcpSrvOffloadInfo *pSmeDhcpSrvInfo;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014549 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014550 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
14551
Anurag Chouhan600c3a02016-03-01 10:33:54 +053014552 pSmeDhcpSrvInfo = qdf_mem_malloc(sizeof(*pSmeDhcpSrvInfo));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014553
14554 if (!pSmeDhcpSrvInfo) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053014555 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014556 "%s: Not able to allocate memory for WMA_SET_DHCP_SERVER_OFFLOAD_CMD",
14557 __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014558 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014559 }
14560
14561 *pSmeDhcpSrvInfo = *pDhcpSrvInfo;
14562
14563 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014564 if (QDF_STATUS_SUCCESS == status) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014565 /* serialize the req through MC thread */
14566 cds_message.type = WMA_SET_DHCP_SERVER_OFFLOAD_CMD;
14567 cds_message.bodyptr = pSmeDhcpSrvInfo;
14568
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014569 if (!QDF_IS_STATUS_SUCCESS
Anurag Chouhan6d760662016-02-20 16:05:43 +053014570 (cds_mq_post_message(QDF_MODULE_ID_WMA, &cds_message))) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053014571 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014572 "%s: Not able to post WMA_SET_DHCP_SERVER_OFFLOAD_CMD to WMA!",
14573 __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053014574 qdf_mem_free(pSmeDhcpSrvInfo);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014575 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014576 }
14577 sme_release_global_lock(&pMac->sme);
14578 } else {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053014579 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014580 "%s: sme_acquire_global_lock error!", __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053014581 qdf_mem_free(pSmeDhcpSrvInfo);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014582 }
14583
14584 return status;
14585}
14586#endif /* DHCP_SERVER_OFFLOAD */
14587
14588#ifdef WLAN_FEATURE_GPIO_LED_FLASHING
14589/* ---------------------------------------------------------------------------
14590 \fn sme_set_led_flashing
14591 \brief API to set the Led flashing parameters.
14592 \param hHal - The handle returned by mac_open.
14593 \param x0, x1 - led flashing parameters
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014594 \return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014595 ---------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014596QDF_STATUS sme_set_led_flashing(tHalHandle hHal, uint8_t type,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014597 uint32_t x0, uint32_t x1)
14598{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014599 QDF_STATUS status = QDF_STATUS_SUCCESS;
14600 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014601 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
14602 cds_msg_t cds_message;
14603 tSirLedFlashingReq *ledflashing;
14604
Anurag Chouhan600c3a02016-03-01 10:33:54 +053014605 ledflashing = qdf_mem_malloc(sizeof(*ledflashing));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014606 if (!ledflashing) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053014607 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014608 FL
14609 ("Not able to allocate memory for WMA_LED_TIMING_REQ"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014610 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014611 }
14612
14613 ledflashing->pattern_id = type;
14614 ledflashing->led_x0 = x0;
14615 ledflashing->led_x1 = x1;
14616
14617 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014618 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014619 /* Serialize the req through MC thread */
14620 cds_message.bodyptr = ledflashing;
14621 cds_message.type = WMA_LED_FLASHING_REQ;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014622 qdf_status = cds_mq_post_message(CDS_MQ_ID_WMA, &cds_message);
14623 if (!QDF_IS_STATUS_SUCCESS(qdf_status))
14624 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014625 sme_release_global_lock(&pMac->sme);
14626 }
14627 return status;
14628}
14629#endif
14630
14631/**
14632 * sme_handle_dfS_chan_scan() - handle DFS channel configuration
14633 * @h_hal: corestack handler
14634 * @dfs_flag: flag indicating dfs channel enable/disable
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014635 * Return: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014636 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014637QDF_STATUS sme_handle_dfs_chan_scan(tHalHandle h_hal, uint8_t dfs_flag)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014638{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014639 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014640 tpAniSirGlobal mac = PMAC_STRUCT(h_hal);
14641
14642 status = sme_acquire_global_lock(&mac->sme);
14643
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014644 if (QDF_STATUS_SUCCESS == status) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014645
14646 mac->scan.fEnableDFSChnlScan = dfs_flag;
14647
14648 /* update the channel list to the firmware */
14649 status = csr_update_channel_list(mac);
14650
14651 sme_release_global_lock(&mac->sme);
14652 }
14653
14654 return status;
14655}
14656
Edhar, Mahesh Kumardf2ec122015-11-16 11:33:16 +053014657#ifdef FEATURE_WLAN_MCC_TO_SCC_SWITCH
14658/**
14659 * sme_validate_sap_channel_switch() - validate target channel switch w.r.t
14660 * concurreny rules set to avoid channel interference.
14661 * @hal - Hal context
14662 * @sap_ch - channel to switch
14663 * @sap_phy_mode - phy mode of SAP
14664 * @cc_switch_mode - concurreny switch mode
14665 * @session_id - sme session id.
14666 *
14667 * Return: true if there is no channel interference else return false
14668 */
14669bool sme_validate_sap_channel_switch(tHalHandle hal,
14670 uint16_t sap_ch, eCsrPhyMode sap_phy_mode, uint8_t cc_switch_mode,
14671 uint8_t session_id)
14672{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014673 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Edhar, Mahesh Kumardf2ec122015-11-16 11:33:16 +053014674 tpAniSirGlobal mac = PMAC_STRUCT(hal);
14675 tCsrRoamSession *session = CSR_GET_SESSION(mac, session_id);
14676 uint16_t intf_channel = 0;
14677
14678 if (!session)
14679 return false;
14680
14681 session->ch_switch_in_progress = true;
14682 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014683 if (QDF_IS_STATUS_SUCCESS(status)) {
Edhar, Mahesh Kumardf2ec122015-11-16 11:33:16 +053014684 intf_channel = csr_check_concurrent_channel_overlap(mac, sap_ch,
14685 sap_phy_mode,
14686 cc_switch_mode);
14687 sme_release_global_lock(&mac->sme);
14688 } else {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053014689 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Edhar, Mahesh Kumardf2ec122015-11-16 11:33:16 +053014690 FL("sme_acquire_global_lock error!"));
14691 session->ch_switch_in_progress = false;
14692 return false;
14693 }
14694
14695 session->ch_switch_in_progress = false;
14696 return (intf_channel == 0) ? true : false;
14697}
14698#endif
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014699
14700/**
14701 * sme_configure_stats_avg_factor() - function to config avg. stats factor
14702 * @hal: hal
14703 * @session_id: session ID
14704 * @stats_avg_factor: average stats factor
14705 *
14706 * This function configures the stats avg factor in firmware
14707 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014708 * Return: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014709 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014710QDF_STATUS sme_configure_stats_avg_factor(tHalHandle hal, uint8_t session_id,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014711 uint16_t stats_avg_factor)
14712{
14713 cds_msg_t msg;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014714 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014715 tpAniSirGlobal mac = PMAC_STRUCT(hal);
14716 struct sir_stats_avg_factor *stats_factor;
14717
Anurag Chouhan600c3a02016-03-01 10:33:54 +053014718 stats_factor = qdf_mem_malloc(sizeof(*stats_factor));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014719
14720 if (!stats_factor) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053014721 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014722 "%s: Not able to allocate memory for SIR_HAL_CONFIG_STATS_FACTOR",
14723 __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014724 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014725 }
14726
14727 status = sme_acquire_global_lock(&mac->sme);
14728
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014729 if (QDF_STATUS_SUCCESS == status) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014730
14731 stats_factor->vdev_id = session_id;
14732 stats_factor->stats_avg_factor = stats_avg_factor;
14733
14734 /* serialize the req through MC thread */
14735 msg.type = SIR_HAL_CONFIG_STATS_FACTOR;
14736 msg.bodyptr = stats_factor;
14737
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014738 if (!QDF_IS_STATUS_SUCCESS(
Anurag Chouhan6d760662016-02-20 16:05:43 +053014739 cds_mq_post_message(QDF_MODULE_ID_WMA, &msg))) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053014740 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014741 "%s: Not able to post SIR_HAL_CONFIG_STATS_FACTOR to WMA!",
14742 __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053014743 qdf_mem_free(stats_factor);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014744 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014745 }
14746 sme_release_global_lock(&mac->sme);
14747 } else {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053014748 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014749 "%s: sme_acquire_global_lock error!",
14750 __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053014751 qdf_mem_free(stats_factor);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014752 }
14753
14754 return status;
14755}
14756
14757/**
14758 * sme_configure_guard_time() - function to configure guard time
14759 * @hal: hal
14760 * @session_id: session id
14761 * @guard_time: guard time
14762 *
14763 * This function configures the guard time in firmware
14764 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014765 * Return: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014766 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014767QDF_STATUS sme_configure_guard_time(tHalHandle hal, uint8_t session_id,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014768 uint32_t guard_time)
14769{
14770 cds_msg_t msg;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014771 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014772 tpAniSirGlobal mac = PMAC_STRUCT(hal);
14773 struct sir_guard_time_request *g_time;
14774
Anurag Chouhan600c3a02016-03-01 10:33:54 +053014775 g_time = qdf_mem_malloc(sizeof(*g_time));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014776
14777 if (!g_time) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053014778 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014779 "%s: Not able to allocate memory for SIR_HAL_CONFIG_GUARD_TIME",
14780 __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014781 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014782 }
14783
14784 status = sme_acquire_global_lock(&mac->sme);
14785
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014786 if (QDF_STATUS_SUCCESS == status) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014787
14788 g_time->vdev_id = session_id;
14789 g_time->guard_time = guard_time;
14790
14791 /* serialize the req through MC thread */
14792 msg.type = SIR_HAL_CONFIG_GUARD_TIME;
14793 msg.bodyptr = g_time;
14794
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014795 if (!QDF_IS_STATUS_SUCCESS(
Anurag Chouhan6d760662016-02-20 16:05:43 +053014796 cds_mq_post_message(QDF_MODULE_ID_WMA, &msg))) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053014797 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014798 "%s: Not able to post SIR_HAL_CONFIG_GUARD_TIME to WMA!",
14799 __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053014800 qdf_mem_free(g_time);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014801 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014802 }
14803 sme_release_global_lock(&mac->sme);
14804 } else {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053014805 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014806 "%s: sme_acquire_global_lock error!",
14807 __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053014808 qdf_mem_free(g_time);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014809 }
14810
14811 return status;
14812}
14813
14814/**
14815 * sme_configure_modulated_dtim() - function to configure modulated dtim
14816 * @h_hal: SME API to enable/disable modulated DTIM instantaneously
14817 * @session_id: session ID
14818 * @modulated_dtim: modulated dtim value
14819 *
14820 * This function configures the modulated dtim in firmware
14821 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014822 * Return: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014823 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014824QDF_STATUS sme_configure_modulated_dtim(tHalHandle h_hal, uint8_t session_id,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014825 uint32_t modulated_dtim)
14826{
14827 cds_msg_t msg;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014828 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014829 tpAniSirGlobal mac = PMAC_STRUCT(h_hal);
14830 wma_cli_set_cmd_t *iwcmd;
14831
Anurag Chouhan600c3a02016-03-01 10:33:54 +053014832 iwcmd = qdf_mem_malloc(sizeof(*iwcmd));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014833 if (NULL == iwcmd) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053014834 QDF_TRACE(QDF_MODULE_ID_SME,
14835 QDF_TRACE_LEVEL_FATAL,
Anurag Chouhanf04e84f2016-03-03 10:12:12 +053014836 "%s: qdf_mem_malloc failed", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014837 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014838 }
14839
14840 status = sme_acquire_global_lock(&mac->sme);
14841
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014842 if (QDF_STATUS_SUCCESS == status) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014843
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014844 iwcmd->param_value = modulated_dtim;
14845 iwcmd->param_vdev_id = session_id;
14846 iwcmd->param_id = GEN_PARAM_MODULATED_DTIM;
14847 iwcmd->param_vp_dev = GEN_CMD;
14848 msg.type = WMA_CLI_SET_CMD;
14849 msg.reserved = 0;
14850 msg.bodyptr = (void *)iwcmd;
14851
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014852 if (!QDF_IS_STATUS_SUCCESS(
Anurag Chouhan6d760662016-02-20 16:05:43 +053014853 cds_mq_post_message(QDF_MODULE_ID_WMA, &msg))) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053014854 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014855 "%s: Not able to post GEN_PARAM_DYNAMIC_DTIM to WMA!",
14856 __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053014857 qdf_mem_free(iwcmd);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014858 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014859 }
14860 sme_release_global_lock(&mac->sme);
14861 } else {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053014862 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014863 "%s: sme_acquire_global_lock error!",
14864 __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053014865 qdf_mem_free(iwcmd);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014866 }
14867
14868 return status;
14869}
14870
14871/*
14872 * sme_wifi_start_logger() - Send the start/stop logging command to WMA
14873 * to either start/stop logging
14874 * @hal: HAL context
14875 * @start_log: Structure containing the wifi start logger params
14876 *
14877 * This function sends the start/stop logging command to WMA
14878 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014879 * Return: QDF_STATUS_SUCCESS on successful posting
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014880 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014881QDF_STATUS sme_wifi_start_logger(tHalHandle hal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014882 struct sir_wifi_start_log start_log)
14883{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014884 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014885 tpAniSirGlobal mac = PMAC_STRUCT(hal);
14886 cds_msg_t cds_message;
14887 struct sir_wifi_start_log *req_msg;
14888 uint32_t len;
14889
14890 len = sizeof(*req_msg);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053014891 req_msg = qdf_mem_malloc(len);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014892 if (!req_msg) {
Anurag Chouhan600c3a02016-03-01 10:33:54 +053014893 sms_log(mac, LOGE, FL("qdf_mem_malloc failed"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014894 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014895 }
14896
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014897 req_msg->verbose_level = start_log.verbose_level;
Poddar, Siddartheefe3482016-09-21 18:12:59 +053014898 req_msg->is_iwpriv_command = start_log.is_iwpriv_command;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014899 req_msg->ring_id = start_log.ring_id;
Srinivas Girigowdac34f11d2016-02-25 16:02:42 -080014900 req_msg->ini_triggered = start_log.ini_triggered;
14901 req_msg->user_triggered = start_log.user_triggered;
Poddar, Siddarth176c4362016-10-03 12:25:00 +053014902 req_msg->size = start_log.size;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014903
14904 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014905 if (status != QDF_STATUS_SUCCESS) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014906 sms_log(mac, LOGE,
14907 FL("sme_acquire_global_lock failed(status=%d)"),
14908 status);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053014909 qdf_mem_free(req_msg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014910 return status;
14911 }
14912
14913 /* Serialize the req through MC thread */
14914 cds_message.bodyptr = req_msg;
14915 cds_message.type = SIR_HAL_START_STOP_LOGGING;
14916 status = cds_mq_post_message(CDS_MQ_ID_WMA, &cds_message);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014917 if (!QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014918 sms_log(mac, LOGE,
Arun Khandavalli2476ef52016-04-26 20:19:43 +053014919 FL("cds_mq_post_message failed!(err=%d)"),
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014920 status);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053014921 qdf_mem_free(req_msg);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014922 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014923 }
14924 sme_release_global_lock(&mac->sme);
14925
14926 return status;
14927}
14928
14929/**
14930 * sme_neighbor_middle_of_roaming() - Function to know if
14931 * STA is in the middle of roaming states
14932 * @hal: Handle returned by macOpen
14933 * @sessionId: sessionId of the STA session
14934 *
14935 * This function is a wrapper to call
14936 * csr_neighbor_middle_of_roaming to know STA is in the
14937 * middle of roaming states
14938 *
14939 * Return: True or False
14940 *
14941 */
14942bool sme_neighbor_middle_of_roaming(tHalHandle hHal, uint8_t sessionId)
14943{
Sandeep Puligillaca631612016-11-08 11:53:52 -080014944 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hHal);
14945 bool val = false;
14946
14947 if (CSR_IS_SESSION_VALID(mac_ctx, sessionId))
14948 val = csr_neighbor_middle_of_roaming(mac_ctx, sessionId);
14949 else
14950 sms_log(mac_ctx, LOGE, FL("Invalid Sesion = %d"), sessionId);
14951 return val;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014952}
14953
14954/*
14955 * sme_send_flush_logs_cmd_to_fw() - Flush FW logs
14956 * @mac: MAC handle
14957 *
14958 * This function is used to send the command that will
14959 * be used to flush the logs in the firmware
14960 *
Deepak Dhamdhere0f076bd2016-06-02 11:29:21 -070014961 * Return: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014962 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014963QDF_STATUS sme_send_flush_logs_cmd_to_fw(tpAniSirGlobal mac)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014964{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014965 QDF_STATUS status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014966 cds_msg_t message;
14967
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014968 /* Serialize the req through MC thread */
14969 message.bodyptr = NULL;
14970 message.type = SIR_HAL_FLUSH_LOG_TO_FW;
14971 status = cds_mq_post_message(CDS_MQ_ID_WMA, &message);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014972 if (!QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014973 sms_log(mac, LOGE,
14974 FL("cds_mq_post_message failed!(err=%d)"),
14975 status);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014976 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014977 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014978 return status;
14979}
14980
14981/**
14982 * sme_enable_uapsd_for_ac() - enable uapsd for access catagory requerst to WMA
14983 * @cds_ctx: cds context
14984 * @sta_id: station id
14985 * @ac: access catagory
14986 * @tid: tid value
14987 * @pri: user priority
14988 * @srvc_int: service interval
14989 * @sus_int: suspend interval
14990 * @dir: tspec direction
14991 * @psb: PSB value
14992 * @sessionId: session id
14993 * @delay_interval: delay interval
14994 *
Anurag Chouhanf04e84f2016-03-03 10:12:12 +053014995 * Return: QDF status
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014996 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014997QDF_STATUS sme_enable_uapsd_for_ac(void *cds_ctx, uint8_t sta_id,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014998 sme_ac_enum_type ac, uint8_t tid,
14999 uint8_t pri, uint32_t srvc_int,
15000 uint32_t sus_int,
15001 sme_tspec_dir_type dir,
15002 uint8_t psb, uint32_t sessionId,
15003 uint32_t delay_interval)
15004{
15005 void *wma_handle;
15006 t_wma_trigger_uapsd_params uapsd_params;
15007 enum uapsd_ac access_category;
15008
15009 if (!psb) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053015010 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015011 "No need to configure auto trigger:psb is 0");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015012 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015013 }
15014
Anurag Chouhan6d760662016-02-20 16:05:43 +053015015 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015016 if (!wma_handle) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053015017 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015018 "wma_handle is NULL");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015019 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015020 }
15021
15022 switch (ac) {
15023 case SME_AC_BK:
15024 access_category = UAPSD_BK;
15025 break;
15026 case SME_AC_BE:
15027 access_category = UAPSD_BE;
15028 break;
15029 case SME_AC_VI:
15030 access_category = UAPSD_VI;
15031 break;
15032 case SME_AC_VO:
15033 access_category = UAPSD_VO;
15034 break;
15035 default:
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015036 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015037 }
15038
15039 uapsd_params.wmm_ac = access_category;
15040 uapsd_params.user_priority = pri;
15041 uapsd_params.service_interval = srvc_int;
15042 uapsd_params.delay_interval = delay_interval;
15043 uapsd_params.suspend_interval = sus_int;
15044
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015045 if (QDF_STATUS_SUCCESS !=
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015046 wma_trigger_uapsd_params(wma_handle, sessionId, &uapsd_params)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053015047 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015048 "Failed to Trigger Uapsd params for sessionId %d",
15049 sessionId);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015050 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015051 }
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015052 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015053}
15054
15055/**
15056 * sme_disable_uapsd_for_ac() - disable uapsed access catagory request to WMA
15057 * @cds_ctx: cds context
15058 * @sta_id: station id
15059 * @ac: access catagory
15060 * @sessionId: session id
15061 *
Anurag Chouhanf04e84f2016-03-03 10:12:12 +053015062 * Return: QDF status
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015063 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015064QDF_STATUS sme_disable_uapsd_for_ac(void *cds_ctx, uint8_t sta_id,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015065 sme_ac_enum_type ac,
15066 uint32_t sessionId)
15067{
15068 void *wma_handle;
15069 enum uapsd_ac access_category;
15070
15071 switch (ac) {
15072 case SME_AC_BK:
15073 access_category = UAPSD_BK;
15074 break;
15075 case SME_AC_BE:
15076 access_category = UAPSD_BE;
15077 break;
15078 case SME_AC_VI:
15079 access_category = UAPSD_VI;
15080 break;
15081 case SME_AC_VO:
15082 access_category = UAPSD_VO;
15083 break;
15084 default:
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015085 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015086 }
15087
Anurag Chouhan6d760662016-02-20 16:05:43 +053015088 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015089 if (!wma_handle) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053015090 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015091 "wma handle is NULL");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015092 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015093 }
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015094 if (QDF_STATUS_SUCCESS !=
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015095 wma_disable_uapsd_per_ac(wma_handle, sessionId, access_category)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053015096 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015097 "Failed to disable uapsd for ac %d for sessionId %d",
15098 ac, sessionId);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015099 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015100 }
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015101 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015102}
15103
15104/**
15105 * sme_update_nss() - SME API to change the number for spatial streams
15106 * (1 or 2)
15107 * @hal: Handle returned by mac open
15108 * @nss: Number of spatial streams
15109 *
15110 * This function is used to update the number of spatial streams supported.
15111 *
15112 * Return: Success upon successfully changing nss else failure
15113 *
15114 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015115QDF_STATUS sme_update_nss(tHalHandle h_hal, uint8_t nss)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015116{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015117 QDF_STATUS status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015118 tpAniSirGlobal mac_ctx = PMAC_STRUCT(h_hal);
15119 uint32_t i, value = 0;
15120 union {
15121 uint16_t cfg_value16;
15122 tSirMacHTCapabilityInfo ht_cap_info;
15123 } uHTCapabilityInfo;
15124 tCsrRoamSession *csr_session;
15125
15126 status = sme_acquire_global_lock(&mac_ctx->sme);
15127
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015128 if (QDF_STATUS_SUCCESS == status) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015129 mac_ctx->roam.configParam.enable2x2 = (nss == 1) ? 0 : 1;
15130
15131 /* get the HT capability info*/
15132 sme_cfg_get_int(mac_ctx, WNI_CFG_HT_CAP_INFO, &value);
15133 uHTCapabilityInfo.cfg_value16 = (0xFFFF & value);
15134
15135 for (i = 0; i < CSR_ROAM_SESSION_MAX; i++) {
15136 if (CSR_IS_SESSION_VALID(mac_ctx, i)) {
15137 csr_session = &mac_ctx->roam.roamSession[i];
15138 csr_session->htConfig.ht_tx_stbc =
15139 uHTCapabilityInfo.ht_cap_info.txSTBC;
15140 }
15141 }
15142
15143 sme_release_global_lock(&mac_ctx->sme);
15144 }
15145 return status;
15146}
15147
15148/**
Archana Ramachandran5041b252016-04-25 14:29:25 -070015149 * sme_update_user_configured_nss() - sets the nss based on user request
15150 * @hal: Pointer to HAL
15151 * @nss: number of streams
15152 *
15153 * Return: None
15154 */
15155void sme_update_user_configured_nss(tHalHandle hal, uint8_t nss)
15156{
15157 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
15158
15159 mac_ctx->user_configured_nss = nss;
15160}
15161
15162/**
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015163 * sme_set_rssi_threshold_breached_cb() - set rssi threshold breached callback
Arun Khandavalli4b55da72016-07-19 19:55:01 +053015164 * @h_hal: global hal handle
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015165 * @cb: callback function pointer
15166 *
15167 * This function stores the rssi threshold breached callback function.
15168 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015169 * Return: QDF_STATUS enumeration.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015170 */
Arun Khandavalli4b55da72016-07-19 19:55:01 +053015171QDF_STATUS sme_set_rssi_threshold_breached_cb(tHalHandle h_hal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015172 void (*cb)(void *, struct rssi_breach_event *))
15173{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015174 QDF_STATUS status = QDF_STATUS_SUCCESS;
Arun Khandavalli4b55da72016-07-19 19:55:01 +053015175 tpAniSirGlobal mac;
15176
15177 if (!h_hal) {
15178 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
15179 FL("hHal is not valid"));
15180 return QDF_STATUS_E_INVAL;
15181 }
15182 mac = PMAC_STRUCT(h_hal);
15183
15184 status = sme_acquire_global_lock(&mac->sme);
15185 if (!QDF_IS_STATUS_SUCCESS(status)) {
15186 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
15187 FL("sme_acquire_global_lock failed!(status=%d)"),
15188 status);
15189 return status;
15190 }
15191
15192 mac->sme.rssi_threshold_breached_cb = cb;
15193 sme_release_global_lock(&mac->sme);
15194 return status;
15195}
15196
15197/**
15198 * sme_set_rssi_threshold_breached_cb() - Reset rssi threshold breached callback
15199 * @hal: global hal handle
15200 *
15201 * This function de-registers the rssi threshold breached callback function.
15202 *
15203 * Return: QDF_STATUS enumeration.
15204 */
15205QDF_STATUS sme_reset_rssi_threshold_breached_cb(tHalHandle hal)
15206{
15207 QDF_STATUS status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015208 tpAniSirGlobal mac = PMAC_STRUCT(hal);
15209
15210 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015211 if (!QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015212 sms_log(mac, LOGE,
15213 FL("sme_acquire_global_lock failed!(status=%d)"),
15214 status);
15215 return status;
15216 }
15217
Arun Khandavalli4b55da72016-07-19 19:55:01 +053015218 mac->sme.rssi_threshold_breached_cb = NULL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015219 sme_release_global_lock(&mac->sme);
15220 return status;
15221}
15222
15223/**
15224 * sme_is_any_session_in_connected_state() - SME wrapper API to
15225 * check if any session is in connected state or not.
15226 *
15227 * @hal: Handle returned by mac open
15228 *
15229 * This function is used to check if any valid sme session is in
15230 * connected state or not.
15231 *
15232 * Return: true if any session is connected, else false.
15233 *
15234 */
15235bool sme_is_any_session_in_connected_state(tHalHandle h_hal)
15236{
15237 tpAniSirGlobal mac_ctx = PMAC_STRUCT(h_hal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015238 QDF_STATUS status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015239 bool ret = false;
15240
15241 status = sme_acquire_global_lock(&mac_ctx->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015242 if (QDF_STATUS_SUCCESS == status) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015243 ret = csr_is_any_session_in_connect_state(mac_ctx);
15244 sme_release_global_lock(&mac_ctx->sme);
15245 }
15246 return ret;
15247}
15248
15249/**
15250 * sme_set_rssi_monitoring() - set rssi monitoring
15251 * @hal: global hal handle
15252 * @input: request message
15253 *
15254 * This function constructs the vos message and fill in message type,
15255 * bodyptr with @input and posts it to WDA queue.
15256 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015257 * Return: QDF_STATUS enumeration
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015258 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015259QDF_STATUS sme_set_rssi_monitoring(tHalHandle hal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015260 struct rssi_monitor_req *input)
15261{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015262 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015263 tpAniSirGlobal mac = PMAC_STRUCT(hal);
15264 cds_msg_t cds_message;
15265 struct rssi_monitor_req *req_msg;
15266
15267 sms_log(mac, LOG1, FL("enter"));
Anurag Chouhan600c3a02016-03-01 10:33:54 +053015268 req_msg = qdf_mem_malloc(sizeof(*req_msg));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015269 if (!req_msg) {
15270 sms_log(mac, LOGE, FL("memory allocation failed"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015271 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015272 }
15273
15274 *req_msg = *input;
15275
15276 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015277 if (!QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015278 sms_log(mac, LOGE,
15279 FL("sme_acquire_global_lock failed!(status=%d)"),
15280 status);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053015281 qdf_mem_free(req_msg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015282 return status;
15283 }
15284
15285 /* Serialize the req through MC thread */
15286 cds_message.bodyptr = req_msg;
15287 cds_message.type = WMA_SET_RSSI_MONITOR_REQ;
15288 status = cds_mq_post_message(CDS_MQ_ID_WMA, &cds_message);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015289 if (!QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015290 sms_log(mac, LOGE,
15291 FL("cds_mq_post_message failed!(err=%d)"),
15292 status);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053015293 qdf_mem_free(req_msg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015294 }
15295 sme_release_global_lock(&mac->sme);
15296
15297 return status;
15298}
15299
15300/**
15301 * sme_fw_mem_dump() - Get FW memory dump
15302 * @hHal: hal handle
15303 * @recvd_req: received memory dump request.
15304 *
15305 * This API is invoked by HDD to indicate FW to start
15306 * dumping firmware memory.
15307 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015308 * Return: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015309 */
15310#ifdef WLAN_FEATURE_MEMDUMP
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015311QDF_STATUS sme_fw_mem_dump(tHalHandle hHal, void *recvd_req)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015312{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015313 QDF_STATUS status = QDF_STATUS_SUCCESS;
15314 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015315 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
15316 cds_msg_t msg;
15317 struct fw_dump_req *send_req;
15318 struct fw_dump_seg_req seg_req;
15319 int loop;
15320
Anurag Chouhan600c3a02016-03-01 10:33:54 +053015321 send_req = qdf_mem_malloc(sizeof(*send_req));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015322 if (!send_req) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053015323 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015324 FL("Memory allocation failed for WDA_FW_MEM_DUMP"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015325 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015326 }
Anurag Chouhan600c3a02016-03-01 10:33:54 +053015327 qdf_mem_copy(send_req, recvd_req, sizeof(*send_req));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015328
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053015329 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015330 FL("request_id:%d num_seg:%d"),
15331 send_req->request_id, send_req->num_seg);
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053015332 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015333 FL("Segment Information"));
15334 for (loop = 0; loop < send_req->num_seg; loop++) {
15335 seg_req = send_req->segment[loop];
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053015336 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015337 FL("seg_number:%d"), loop);
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053015338 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015339 FL("seg_id:%d start_addr_lo:0x%x start_addr_hi:0x%x"),
15340 seg_req.seg_id, seg_req.seg_start_addr_lo,
15341 seg_req.seg_start_addr_hi);
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053015342 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015343 FL("seg_length:%d dst_addr_lo:0x%x dst_addr_hi:0x%x"),
15344 seg_req.seg_length, seg_req.dst_addr_lo,
15345 seg_req.dst_addr_hi);
15346 }
15347
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015348 if (QDF_STATUS_SUCCESS == sme_acquire_global_lock(&pMac->sme)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015349 msg.bodyptr = send_req;
15350 msg.type = WMA_FW_MEM_DUMP_REQ;
15351 msg.reserved = 0;
15352
Anurag Chouhan6d760662016-02-20 16:05:43 +053015353 qdf_status = cds_mq_post_message(QDF_MODULE_ID_WMA, &msg);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015354 if (QDF_STATUS_SUCCESS != qdf_status) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053015355 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015356 FL("Not able to post WMA_FW_MEM_DUMP"));
Anurag Chouhan600c3a02016-03-01 10:33:54 +053015357 qdf_mem_free(send_req);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015358 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015359 }
15360 sme_release_global_lock(&pMac->sme);
15361 } else {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053015362 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015363 FL("Failed to acquire SME Global Lock"));
Anurag Chouhan600c3a02016-03-01 10:33:54 +053015364 qdf_mem_free(send_req);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015365 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015366 }
15367
15368 return status;
15369}
15370#else
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015371QDF_STATUS sme_fw_mem_dump(tHalHandle hHal, void *recvd_req)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015372{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015373 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015374}
15375#endif /* WLAN_FEATURE_MEMDUMP */
15376
15377/*
Manishekar Chandrasekaran7009f252016-04-21 19:14:15 +053015378 * sme_pdev_set_pcl() - Send WMI_PDEV_SET_PCL_CMDID to the WMA
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015379 * @hal: Handle returned by macOpen
15380 * @msg: PCL channel list and length structure
15381 *
Manishekar Chandrasekaran7009f252016-04-21 19:14:15 +053015382 * Sends the command to WMA to send WMI_PDEV_SET_PCL_CMDID to FW
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015383 * Return: QDF_STATUS_SUCCESS on successful posting
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015384 */
Manishekar Chandrasekaran7009f252016-04-21 19:14:15 +053015385QDF_STATUS sme_pdev_set_pcl(tHalHandle hal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015386 struct sir_pcl_list msg)
15387{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015388 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015389 tpAniSirGlobal mac = PMAC_STRUCT(hal);
15390 cds_msg_t cds_message;
Manishekar Chandrasekaran7009f252016-04-21 19:14:15 +053015391 struct wmi_pcl_chan_weights *req_msg;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015392 uint32_t len, i;
15393
15394 len = sizeof(*req_msg);
15395
Anurag Chouhan600c3a02016-03-01 10:33:54 +053015396 req_msg = qdf_mem_malloc(len);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015397 if (!req_msg) {
Anurag Chouhan600c3a02016-03-01 10:33:54 +053015398 sms_log(mac, LOGE, FL("qdf_mem_malloc failed"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015399 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015400 }
15401
Manishekar Chandrasekaran7009f252016-04-21 19:14:15 +053015402 for (i = 0; i < msg.pcl_len; i++) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015403 req_msg->pcl_list[i] = msg.pcl_list[i];
Manishekar Chandrasekaran7009f252016-04-21 19:14:15 +053015404 req_msg->weight_list[i] = msg.weight_list[i];
15405 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015406
15407 req_msg->pcl_len = msg.pcl_len;
15408
15409 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015410 if (status != QDF_STATUS_SUCCESS) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015411 sms_log(mac, LOGE,
Deepak Dhamdhere0f076bd2016-06-02 11:29:21 -070015412 FL("sme_acquire_global_lock failed!(status=%d)"),
15413 status);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053015414 qdf_mem_free(req_msg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015415 return status;
15416 }
15417
15418 /* Serialize the req through MC thread */
15419 cds_message.bodyptr = req_msg;
Manishekar Chandrasekaran7009f252016-04-21 19:14:15 +053015420 cds_message.type = SIR_HAL_PDEV_SET_PCL_TO_FW;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015421 status = cds_mq_post_message(CDS_MQ_ID_WMA, &cds_message);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015422 if (!QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015423 sms_log(mac, LOGE,
Deepak Dhamdhere0f076bd2016-06-02 11:29:21 -070015424 FL("cds_mq_post_message failed!(err=%d)"),
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015425 status);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053015426 qdf_mem_free(req_msg);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015427 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015428 }
15429 sme_release_global_lock(&mac->sme);
15430
15431 return status;
15432}
15433
15434/*
Manishekar Chandrasekarand9640342016-04-27 12:28:26 +053015435 * sme_pdev_set_hw_mode() - Send WMI_PDEV_SET_HW_MODE_CMDID to the WMA
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015436 * @hal: Handle returned by macOpen
15437 * @msg: HW mode structure containing hw mode and callback details
15438 *
Manishekar Chandrasekarand9640342016-04-27 12:28:26 +053015439 * Sends the command to CSR to send WMI_PDEV_SET_HW_MODE_CMDID to FW
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015440 * Return: QDF_STATUS_SUCCESS on successful posting
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015441 */
Manishekar Chandrasekarand9640342016-04-27 12:28:26 +053015442QDF_STATUS sme_pdev_set_hw_mode(tHalHandle hal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015443 struct sir_hw_mode msg)
15444{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015445 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015446 tpAniSirGlobal mac = PMAC_STRUCT(hal);
15447 tSmeCmd *cmd = NULL;
15448
15449 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015450 if (!QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015451 sms_log(mac, LOGE, FL("Failed to acquire lock"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015452 return QDF_STATUS_E_RESOURCES;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015453 }
15454
15455 cmd = sme_get_command_buffer(mac);
15456 if (!cmd) {
15457 sms_log(mac, LOGE, FL("Get command buffer failed"));
15458 sme_release_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015459 return QDF_STATUS_E_NULL_VALUE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015460 }
15461
15462 cmd->command = e_sme_command_set_hw_mode;
15463 cmd->u.set_hw_mode_cmd.hw_mode_index = msg.hw_mode_index;
15464 cmd->u.set_hw_mode_cmd.set_hw_mode_cb = msg.set_hw_mode_cb;
Chandrasekaran, Manishekaref70c0d2015-10-20 19:54:55 +053015465 cmd->u.set_hw_mode_cmd.reason = msg.reason;
15466 cmd->u.set_hw_mode_cmd.session_id = msg.session_id;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015467
Chandrasekaran, Manishekarce2172e2016-02-18 16:12:43 +053015468 sms_log(mac, LOG1,
15469 FL("Queuing set hw mode to CSR, session:%d reason:%d"),
15470 cmd->u.set_hw_mode_cmd.session_id,
15471 cmd->u.set_hw_mode_cmd.reason);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015472 csr_queue_sme_command(mac, cmd, false);
15473
15474 sme_release_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015475 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015476}
15477
15478/**
15479 * sme_register_hw_mode_trans_cb() - HW mode transition callback registration
15480 * @hal: Handle returned by macOpen
15481 * @callback: HDD callback to be registered
15482 *
15483 * Registers the HDD callback with SME. This callback will be invoked when
15484 * HW mode transition event is received from the FW
15485 *
15486 * Return: None
15487 */
15488void sme_register_hw_mode_trans_cb(tHalHandle hal,
15489 hw_mode_transition_cb callback)
15490{
15491 tpAniSirGlobal mac = PMAC_STRUCT(hal);
15492
15493 mac->sme.sme_hw_mode_trans_cb = callback;
15494 sms_log(mac, LOG1, FL("HW mode transition callback registered"));
15495}
15496
15497/**
15498 * sme_nss_update_request() - Send beacon templete update to FW with new
15499 * nss value
15500 * @hal: Handle returned by macOpen
15501 * @vdev_id: the session id
15502 * @new_nss: the new nss value
15503 * @cback: hdd callback
15504 * @next_action: next action to happen at policy mgr after beacon update
15505 *
15506 * Sends the command to CSR to send to PE
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015507 * Return: QDF_STATUS_SUCCESS on successful posting
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015508 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015509QDF_STATUS sme_nss_update_request(tHalHandle hHal, uint32_t vdev_id,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015510 uint8_t new_nss, void *cback, uint8_t next_action,
Chandrasekaran, Manishekarce2172e2016-02-18 16:12:43 +053015511 void *hdd_context,
15512 enum sir_conn_update_reason reason)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015513{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015514 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015515 tpAniSirGlobal mac = PMAC_STRUCT(hHal);
15516 tSmeCmd *cmd = NULL;
15517
15518 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015519 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015520 cmd = sme_get_command_buffer(mac);
15521 if (!cmd) {
15522 sms_log(mac, LOGE, FL("Get command buffer failed"));
15523 sme_release_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015524 return QDF_STATUS_E_NULL_VALUE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015525 }
15526 cmd->command = e_sme_command_nss_update;
15527 /* Sessionized modules may require this info */
15528 cmd->sessionId = vdev_id;
15529 cmd->u.nss_update_cmd.new_nss = new_nss;
15530 cmd->u.nss_update_cmd.session_id = vdev_id;
15531 cmd->u.nss_update_cmd.nss_update_cb = cback;
15532 cmd->u.nss_update_cmd.context = hdd_context;
15533 cmd->u.nss_update_cmd.next_action = next_action;
Chandrasekaran, Manishekarce2172e2016-02-18 16:12:43 +053015534 cmd->u.nss_update_cmd.reason = reason;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015535
15536 sms_log(mac, LOG1, FL("Queuing e_sme_command_nss_update to CSR"));
15537 csr_queue_sme_command(mac, cmd, false);
15538 sme_release_global_lock(&mac->sme);
15539 }
15540 return status;
15541}
15542
15543/**
15544 * sme_soc_set_dual_mac_config() - Set dual mac configurations
15545 * @hal: Handle returned by macOpen
15546 * @msg: Structure containing the dual mac config parameters
15547 *
15548 * Queues configuration information to CSR to configure
15549 * WLAN firmware for the dual MAC features
15550 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015551 * Return: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015552 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015553QDF_STATUS sme_soc_set_dual_mac_config(tHalHandle hal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015554 struct sir_dual_mac_config msg)
15555{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015556 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015557 tpAniSirGlobal mac = PMAC_STRUCT(hal);
15558 tSmeCmd *cmd;
15559
15560 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015561 if (!QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015562 sms_log(mac, LOGE, FL("Failed to acquire lock"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015563 return QDF_STATUS_E_RESOURCES;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015564 }
15565
15566 cmd = sme_get_command_buffer(mac);
15567 if (!cmd) {
15568 sms_log(mac, LOGE, FL("Get command buffer failed"));
15569 sme_release_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015570 return QDF_STATUS_E_NULL_VALUE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015571 }
15572
15573 cmd->command = e_sme_command_set_dual_mac_config;
15574 cmd->u.set_dual_mac_cmd.scan_config = msg.scan_config;
15575 cmd->u.set_dual_mac_cmd.fw_mode_config = msg.fw_mode_config;
15576 cmd->u.set_dual_mac_cmd.set_dual_mac_cb = msg.set_dual_mac_cb;
15577
15578 sms_log(mac, LOG1,
15579 FL("Queuing e_sme_command_set_dual_mac_config to CSR: %x %x"),
15580 cmd->u.set_dual_mac_cmd.scan_config,
15581 cmd->u.set_dual_mac_cmd.fw_mode_config);
15582 csr_queue_sme_command(mac, cmd, false);
15583
15584 sme_release_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015585 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015586}
15587
Ravi Joshi9e891ba2015-11-09 19:03:46 -080015588#ifdef FEATURE_LFR_SUBNET_DETECTION
15589/**
15590 * sme_gateway_param_update() - to update gateway parameters with WMA
15591 * @Hal: hal handle
15592 * @gw_params: request parameters from HDD
15593 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015594 * Return: QDF_STATUS
Ravi Joshi9e891ba2015-11-09 19:03:46 -080015595 *
15596 * This routine will update gateway parameters to WMA
15597 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015598QDF_STATUS sme_gateway_param_update(tHalHandle Hal,
Ravi Joshi9e891ba2015-11-09 19:03:46 -080015599 struct gateway_param_update_req *gw_params)
15600{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015601 QDF_STATUS qdf_status;
Ravi Joshi9e891ba2015-11-09 19:03:46 -080015602 cds_msg_t cds_message;
15603 struct gateway_param_update_req *request_buf;
15604
Anurag Chouhan600c3a02016-03-01 10:33:54 +053015605 request_buf = qdf_mem_malloc(sizeof(*request_buf));
Ravi Joshi9e891ba2015-11-09 19:03:46 -080015606 if (NULL == request_buf) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053015607 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Ravi Joshi9e891ba2015-11-09 19:03:46 -080015608 FL("Not able to allocate memory for gw param update request"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015609 return QDF_STATUS_E_NOMEM;
Ravi Joshi9e891ba2015-11-09 19:03:46 -080015610 }
15611
15612 *request_buf = *gw_params;
15613
15614 cds_message.type = WMA_GW_PARAM_UPDATE_REQ;
15615 cds_message.reserved = 0;
15616 cds_message.bodyptr = request_buf;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015617 qdf_status = cds_mq_post_message(CDS_MQ_ID_WMA, &cds_message);
15618 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053015619 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Ravi Joshi9e891ba2015-11-09 19:03:46 -080015620 FL("Not able to post WMA_GW_PARAM_UPDATE_REQ message to HAL"));
Anurag Chouhan600c3a02016-03-01 10:33:54 +053015621 qdf_mem_free(request_buf);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015622 return QDF_STATUS_E_FAILURE;
Ravi Joshi9e891ba2015-11-09 19:03:46 -080015623 }
15624
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015625 return QDF_STATUS_SUCCESS;
Ravi Joshi9e891ba2015-11-09 19:03:46 -080015626}
15627#endif /* FEATURE_LFR_SUBNET_DETECTION */
15628
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015629/**
Archana Ramachandrana20ef812015-11-13 16:12:13 -080015630 * sme_soc_set_antenna_mode() - set antenna mode
15631 * @hal: Handle returned by macOpen
15632 * @msg: Structure containing the antenna mode parameters
15633 *
15634 * Send the command to CSR to send
15635 * WMI_SOC_SET_ANTENNA_MODE_CMDID to FW
15636 *
15637 * Return: QDF_STATUS
15638 */
15639QDF_STATUS sme_soc_set_antenna_mode(tHalHandle hal,
15640 struct sir_antenna_mode_param *msg)
15641{
15642 QDF_STATUS status = QDF_STATUS_SUCCESS;
15643 tpAniSirGlobal mac = PMAC_STRUCT(hal);
15644 tSmeCmd *cmd;
15645
15646 if (NULL == msg) {
15647 sms_log(mac, LOGE, FL("antenna mode mesg is NULL"));
15648 return QDF_STATUS_E_FAILURE;
15649 }
15650
15651 status = sme_acquire_global_lock(&mac->sme);
15652 if (!QDF_IS_STATUS_SUCCESS(status)) {
15653 sms_log(mac, LOGE, FL("Failed to acquire lock"));
15654 return QDF_STATUS_E_RESOURCES;
15655 }
15656
15657 cmd = sme_get_command_buffer(mac);
15658 if (!cmd) {
15659 sme_release_global_lock(&mac->sme);
15660 sms_log(mac, LOGE, FL("Get command buffer failed"));
15661 return QDF_STATUS_E_NULL_VALUE;
15662 }
15663
15664 cmd->command = e_sme_command_set_antenna_mode;
15665 cmd->u.set_antenna_mode_cmd = *msg;
15666
15667 sms_log(mac, LOG1,
15668 FL("Queuing e_sme_command_set_antenna_mode to CSR: %d %d"),
15669 cmd->u.set_antenna_mode_cmd.num_rx_chains,
15670 cmd->u.set_antenna_mode_cmd.num_tx_chains);
15671
15672 csr_queue_sme_command(mac, cmd, false);
15673 sme_release_global_lock(&mac->sme);
15674
15675 return QDF_STATUS_SUCCESS;
15676}
15677
15678/**
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015679 * sme_set_peer_authorized() - call peer authorized callback
15680 * @peer_addr: peer mac address
15681 * @auth_cb: auth callback
15682 * @vdev_id: vdev id
15683 *
Anurag Chouhanf04e84f2016-03-03 10:12:12 +053015684 * Return: QDF Status
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015685 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015686QDF_STATUS sme_set_peer_authorized(uint8_t *peer_addr,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015687 sme_peer_authorized_fp auth_cb,
15688 uint32_t vdev_id)
15689{
15690 void *wma_handle;
15691
Anurag Chouhan6d760662016-02-20 16:05:43 +053015692 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015693 if (!wma_handle) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053015694 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015695 "wma handle is NULL");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015696 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015697 }
15698
15699 wma_set_peer_authorized_cb(wma_handle, auth_cb);
15700 return wma_set_peer_param(wma_handle, peer_addr, WMI_PEER_AUTHORIZE,
15701 1, vdev_id);
15702}
15703
15704/*
Amar Singhal7c1e8982016-05-19 15:08:09 -070015705 * sme_handle_set_fcc_channel() - set spec. tx power for non-fcc channel
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015706 * @hal: HAL pointer
Amar Singhal83a047a2016-05-19 15:56:11 -070015707 * @fcc_constraint: flag to enable/disable the constraint
15708 * @scan_pending: whether there is pending scan
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015709 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015710 * Return: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015711 */
Amar Singhal83a047a2016-05-19 15:56:11 -070015712QDF_STATUS sme_handle_set_fcc_channel(tHalHandle hal, bool fcc_constraint,
15713 bool scan_pending)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015714{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015715 QDF_STATUS status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015716 tpAniSirGlobal mac_ptr = PMAC_STRUCT(hal);
15717
15718 status = sme_acquire_global_lock(&mac_ptr->sme);
15719
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015720 if (QDF_STATUS_SUCCESS == status) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015721
15722 if (fcc_constraint != mac_ptr->scan.fcc_constraint) {
15723 mac_ptr->scan.fcc_constraint = fcc_constraint;
Amar Singhal83a047a2016-05-19 15:56:11 -070015724 if (scan_pending)
15725 mac_ptr->scan.defer_update_channel_list = true;
15726 else
15727 status = csr_update_channel_list(mac_ptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015728 }
15729
15730 sme_release_global_lock(&mac_ptr->sme);
15731 }
15732
15733 return status;
15734}
15735/**
15736 * sme_setdef_dot11mode() - Updates pMac with default dot11mode
15737 * @hal: Global MAC pointer
15738 *
15739 * Return: NULL.
15740 */
15741void sme_setdef_dot11mode(tHalHandle hal)
15742{
15743 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
15744 csr_set_default_dot11_mode(mac_ctx);
15745}
15746
15747/**
15748 * sme_update_roam_scan_hi_rssi_scan_params() - update high rssi scan
15749 * params
15750 * @hal_handle - The handle returned by macOpen.
15751 * @session_id - Session Identifier
15752 * @notify_id - Identifies 1 of the 4 parameters to be modified
15753 * @val New value of the parameter
15754 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015755 * Return: QDF_STATUS - SME update config successful.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015756 * Other status means SME failed to update
15757 */
15758
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015759QDF_STATUS sme_update_roam_scan_hi_rssi_scan_params(tHalHandle hal_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015760 uint8_t session_id,
15761 uint32_t notify_id,
15762 int32_t val)
15763{
15764 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal_handle);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015765 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015766 tCsrNeighborRoamConfig *nr_config = NULL;
15767 tpCsrNeighborRoamControlInfo nr_info = NULL;
15768 uint32_t reason = 0;
15769
Naveen Rawatc36f7eb2016-11-10 20:01:03 -080015770 if (session_id >= CSR_ROAM_SESSION_MAX) {
15771 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
15772 FL("Invalid sme session id: %d"), session_id);
15773 return QDF_STATUS_E_INVAL;
15774 }
15775
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015776 status = sme_acquire_global_lock(&mac_ctx->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015777 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015778 nr_config = &mac_ctx->roam.configParam.neighborRoamConfig;
15779 nr_info = &mac_ctx->roam.neighborRoamInfo[session_id];
15780 switch (notify_id) {
15781 case eCSR_HI_RSSI_SCAN_MAXCOUNT_ID:
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053015782 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015783 "%s: gRoamScanHirssiMaxCount %d => %d",
15784 __func__, nr_config->nhi_rssi_scan_max_count,
15785 val);
15786 nr_config->nhi_rssi_scan_max_count = val;
15787 nr_info->cfgParams.hi_rssi_scan_max_count = val;
15788 reason = REASON_ROAM_SCAN_HI_RSSI_MAXCOUNT_CHANGED;
15789 break;
15790
15791 case eCSR_HI_RSSI_SCAN_RSSI_DELTA_ID:
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053015792 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015793 FL("gRoamScanHiRssiDelta %d => %d"),
15794 nr_config->nhi_rssi_scan_rssi_delta,
15795 val);
15796 nr_config->nhi_rssi_scan_rssi_delta = val;
15797 nr_info->cfgParams.hi_rssi_scan_rssi_delta = val;
15798 reason = REASON_ROAM_SCAN_HI_RSSI_DELTA_CHANGED;
15799 break;
15800
15801 case eCSR_HI_RSSI_SCAN_DELAY_ID:
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053015802 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015803 FL("gRoamScanHiRssiDelay %d => %d"),
15804 nr_config->nhi_rssi_scan_delay,
15805 val);
15806 nr_config->nhi_rssi_scan_delay = val;
15807 nr_info->cfgParams.hi_rssi_scan_delay = val;
15808 reason = REASON_ROAM_SCAN_HI_RSSI_DELAY_CHANGED;
15809 break;
15810
15811 case eCSR_HI_RSSI_SCAN_RSSI_UB_ID:
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053015812 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015813 FL("gRoamScanHiRssiUpperBound %d => %d"),
15814 nr_config->nhi_rssi_scan_rssi_ub,
15815 val);
15816 nr_config->nhi_rssi_scan_rssi_ub = val;
15817 nr_info->cfgParams.hi_rssi_scan_rssi_ub = val;
15818 reason = REASON_ROAM_SCAN_HI_RSSI_UB_CHANGED;
15819 break;
15820
15821 default:
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053015822 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015823 FL("invalid parameter notify_id %d"),
15824 notify_id);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015825 status = QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015826 break;
15827 }
15828 sme_release_global_lock(&mac_ctx->sme);
15829 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015830 if (mac_ctx->roam.configParam.isRoamOffloadScanEnabled &&
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015831 status == QDF_STATUS_SUCCESS) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015832 csr_roam_offload_scan(mac_ctx, session_id,
15833 ROAM_SCAN_OFFLOAD_UPDATE_CFG, reason);
15834 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015835
15836 return status;
15837}
15838
Krishna Kumaar Natarajan052c6e62015-09-28 15:32:55 -070015839/**
15840 * sme_update_tgt_services() - update the target services config.
15841 * @hal: HAL pointer.
15842 * @cfg: wma_tgt_services parameters.
15843 *
15844 * update the target services config.
15845 *
15846 * Return: None.
15847 */
15848void sme_update_tgt_services(tHalHandle hal, struct wma_tgt_services *cfg)
15849{
15850 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
15851
15852 mac_ctx->lteCoexAntShare = cfg->lte_coex_ant_share;
15853 mac_ctx->beacon_offload = cfg->beacon_offload;
mukul sharma72c8b222015-09-04 17:02:01 +053015854 mac_ctx->pmf_offload = cfg->pmf_offload;
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053015855 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO,
mukul sharma72c8b222015-09-04 17:02:01 +053015856 FL("mac_ctx->pmf_offload: %d"), mac_ctx->pmf_offload);
Krishna Kumaar Natarajan052c6e62015-09-28 15:32:55 -070015857
15858 return;
15859}
Masti, Narayanraddic4a7ab82015-11-25 15:41:10 +053015860
Chandrasekaran, Manishekar2859de42016-02-11 16:17:38 +053015861/**
15862 * sme_is_session_id_valid() - Check if the session id is valid
15863 * @hal: Pointer to HAL
15864 * @session_id: Session id
15865 *
15866 * Checks if the session id is valid or not
15867 *
15868 * Return: True is the session id is valid, false otherwise
15869 */
15870bool sme_is_session_id_valid(tHalHandle hal, uint32_t session_id)
15871{
15872 tpAniSirGlobal mac = PMAC_STRUCT(hal);
15873 if (!mac) {
Chandrasekaran, Manishekard3cb4772016-02-22 22:21:10 +053015874 /* Using QDF_TRACE since mac is not available for sms_log */
15875 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
15876 "%s: null mac pointer", __func__);
Chandrasekaran, Manishekar2859de42016-02-11 16:17:38 +053015877 return false;
15878 }
15879
15880 if (CSR_IS_SESSION_VALID(mac, session_id)) {
15881 return true;
15882 } else {
15883 sms_log(mac, LOGE,
15884 FL("invalid session id:%d"), session_id);
15885 return false;
15886 }
15887}
15888
Masti, Narayanraddic4a7ab82015-11-25 15:41:10 +053015889#ifdef FEATURE_WLAN_TDLS
15890
15891/**
15892 * sme_get_opclass() - determine operating class
15893 * @hal: Pointer to HAL
15894 * @channel: channel id
15895 * @bw_offset: bandwidth offset
15896 * @opclass: pointer to operating class
15897 *
15898 * Function will determine operating class from regdm_get_opclass_from_channel
15899 *
15900 * Return: none
15901 */
15902void sme_get_opclass(tHalHandle hal, uint8_t channel, uint8_t bw_offset,
15903 uint8_t *opclass)
15904{
15905 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
15906
15907 /* redgm opclass table contains opclass for 40MHz low primary,
15908 * 40MHz high primary and 20MHz. No support for 80MHz yet. So
15909 * first we will check if bit for 40MHz is set and if so find
15910 * matching opclass either with low primary or high primary
15911 * (a channel would never be in both) and then search for opclass
15912 * matching 20MHz, else for any BW.
15913 */
15914 if (bw_offset & (1 << BW_40_OFFSET_BIT)) {
Amar Singhal22995112016-01-22 10:42:33 -080015915 *opclass = cds_reg_dmn_get_opclass_from_channel(
Masti, Narayanraddic4a7ab82015-11-25 15:41:10 +053015916 mac_ctx->scan.countryCodeCurrent,
15917 channel, BW40_LOW_PRIMARY);
15918 if (!(*opclass)) {
Amar Singhal22995112016-01-22 10:42:33 -080015919 *opclass = cds_reg_dmn_get_opclass_from_channel(
Masti, Narayanraddic4a7ab82015-11-25 15:41:10 +053015920 mac_ctx->scan.countryCodeCurrent,
15921 channel, BW40_HIGH_PRIMARY);
15922 }
15923 } else if (bw_offset & (1 << BW_20_OFFSET_BIT)) {
Amar Singhal22995112016-01-22 10:42:33 -080015924 *opclass = cds_reg_dmn_get_opclass_from_channel(
Masti, Narayanraddic4a7ab82015-11-25 15:41:10 +053015925 mac_ctx->scan.countryCodeCurrent,
15926 channel, BW20);
15927 } else {
Amar Singhal22995112016-01-22 10:42:33 -080015928 *opclass = cds_reg_dmn_get_opclass_from_channel(
Masti, Narayanraddic4a7ab82015-11-25 15:41:10 +053015929 mac_ctx->scan.countryCodeCurrent,
15930 channel, BWALL);
15931 }
15932}
15933#endif
Ryan Hsu3c8f79f2015-12-02 16:45:09 -080015934
15935#ifdef FEATURE_GREEN_AP
15936/**
15937 * sme_send_egap_conf_params() - set the enhanced green ap configuration params
15938 * @enable: enable/disable the enhanced green ap feature
15939 * @inactivity_time: inactivity timeout value
15940 * @wait_time: wait timeout value
15941 * @flag: feature flag in bitmasp
15942 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015943 * Return: Return QDF_STATUS, otherwise appropriate failure code
Ryan Hsu3c8f79f2015-12-02 16:45:09 -080015944 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015945QDF_STATUS sme_send_egap_conf_params(uint32_t enable, uint32_t inactivity_time,
Ryan Hsu3c8f79f2015-12-02 16:45:09 -080015946 uint32_t wait_time, uint32_t flags)
15947{
15948 cds_msg_t message;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015949 QDF_STATUS status;
Ryan Hsu3c8f79f2015-12-02 16:45:09 -080015950 struct egap_conf_params *egap_params;
15951
Anurag Chouhan600c3a02016-03-01 10:33:54 +053015952 egap_params = qdf_mem_malloc(sizeof(*egap_params));
Ryan Hsu3c8f79f2015-12-02 16:45:09 -080015953 if (NULL == egap_params) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053015954 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Ryan Hsu3c8f79f2015-12-02 16:45:09 -080015955 "%s: fail to alloc egap_params", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015956 return QDF_STATUS_E_NOMEM;
Ryan Hsu3c8f79f2015-12-02 16:45:09 -080015957 }
15958
15959 egap_params->enable = enable;
15960 egap_params->inactivity_time = inactivity_time;
15961 egap_params->wait_time = wait_time;
15962 egap_params->flags = flags;
15963
15964 message.type = WMA_SET_EGAP_CONF_PARAMS;
15965 message.bodyptr = egap_params;
Anurag Chouhan6d760662016-02-20 16:05:43 +053015966 status = cds_mq_post_message(QDF_MODULE_ID_WMA, &message);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015967 if (!QDF_IS_STATUS_SUCCESS(status)) {
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: Not able to post msg to WMA!", __func__);
15970
Anurag Chouhan600c3a02016-03-01 10:33:54 +053015971 qdf_mem_free(egap_params);
Ryan Hsu3c8f79f2015-12-02 16:45:09 -080015972 }
15973 return status;
15974}
15975#endif
Sandeep Puligillae0875662016-02-12 16:09:21 -080015976
15977/**
Anurag Chouhanbf5e0e22016-09-12 12:54:09 +053015978 * sme_set_fw_test() - set fw test
15979 * @fw_test: fw test param
15980 *
15981 * Return: Return QDF_STATUS, otherwise appropriate failure code
15982 */
15983QDF_STATUS sme_set_fw_test(struct set_fwtest_params *fw_test)
15984{
15985 void *wma_handle;
15986
15987 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
15988 if (!wma_handle) {
15989 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
15990 "wma handle is NULL");
15991 return QDF_STATUS_E_FAILURE;
15992 }
15993 wma_process_fw_test_cmd(wma_handle, fw_test);
15994 return QDF_STATUS_SUCCESS;
15995}
15996
15997/**
Sandeep Puligillae0875662016-02-12 16:09:21 -080015998 * sme_ht40_stop_obss_scan() - ht40 obss stop scan
15999 * @hal: mac handel
16000 * @vdev_id: vdev identifier
16001 *
16002 * Return: Return QDF_STATUS, otherwise appropriate failure code
16003 */
16004QDF_STATUS sme_ht40_stop_obss_scan(tHalHandle hal, uint32_t vdev_id)
16005{
16006 void *wma_handle;
16007
16008 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
16009 if (!wma_handle) {
16010 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
16011 "wma handle is NULL");
16012 return QDF_STATUS_E_FAILURE;
16013 }
16014 wma_ht40_stop_obss_scan(wma_handle, vdev_id);
16015 return QDF_STATUS_SUCCESS;
16016}
Archana Ramachandran20d2e232016-02-11 16:58:40 -080016017
16018/**
16019 * sme_update_mimo_power_save() - Update MIMO power save
16020 * configuration
16021 * @hal: The handle returned by macOpen
16022 * @is_ht_smps_enabled: enable/disable ht smps
16023 * @ht_smps_mode: smps mode disabled/static/dynamic
Archana Ramachandranfec24812016-02-16 16:31:56 -080016024 * @send_smps_action: flag to send smps force mode command
16025 * to FW
Archana Ramachandran20d2e232016-02-11 16:58:40 -080016026 *
16027 * Return: QDF_STATUS if SME update mimo power save
16028 * configuration sucsess else failue status
16029 */
16030QDF_STATUS sme_update_mimo_power_save(tHalHandle hal,
16031 uint8_t is_ht_smps_enabled,
Archana Ramachandranfec24812016-02-16 16:31:56 -080016032 uint8_t ht_smps_mode,
16033 bool send_smps_action)
Archana Ramachandran20d2e232016-02-11 16:58:40 -080016034{
16035 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
Archana Ramachandranfec24812016-02-16 16:31:56 -080016036
Archana Ramachandran20d2e232016-02-11 16:58:40 -080016037 sms_log(mac_ctx, LOG1,
Archana Ramachandranfec24812016-02-16 16:31:56 -080016038 "SMPS enable: %d mode: %d send action: %d",
16039 is_ht_smps_enabled, ht_smps_mode,
16040 send_smps_action);
Archana Ramachandran20d2e232016-02-11 16:58:40 -080016041 mac_ctx->roam.configParam.enableHtSmps =
16042 is_ht_smps_enabled;
16043 mac_ctx->roam.configParam.htSmps = ht_smps_mode;
Archana Ramachandranfec24812016-02-16 16:31:56 -080016044 mac_ctx->roam.configParam.send_smps_action =
16045 send_smps_action;
Archana Ramachandran20d2e232016-02-11 16:58:40 -080016046
16047 return QDF_STATUS_SUCCESS;
16048}
16049
16050/**
16051 * sme_is_sta_smps_allowed() - check if the supported nss for
16052 * the session is greater than 1x1 to enable sta SMPS
16053 * @hal: The handle returned by macOpen
16054 * @session_id: session id
16055 *
16056 * Return: bool returns true if supported nss is greater than
16057 * 1x1 else false
16058 */
16059bool sme_is_sta_smps_allowed(tHalHandle hal, uint8_t session_id)
16060{
16061 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
16062 tCsrRoamSession *csr_session;
16063
Archana Ramachandran20d2e232016-02-11 16:58:40 -080016064 csr_session = CSR_GET_SESSION(mac_ctx, session_id);
16065 if (NULL == csr_session) {
16066 sms_log(mac_ctx, LOGE,
Sreelakshmi Konamki58697e12016-05-25 17:30:18 +053016067 FL("SME session not valid: %d"), session_id);
16068 return false;
16069 }
16070
16071 if (!CSR_IS_SESSION_VALID(mac_ctx, session_id)) {
16072 sms_log(mac_ctx, LOGE,
16073 FL("CSR session not valid: %d"), session_id);
Archana Ramachandran20d2e232016-02-11 16:58:40 -080016074 return false;
16075 }
16076
16077 return (csr_session->supported_nss_1x1 == true) ? false : true;
16078}
Gupta, Kapil4cb1d7d2016-04-16 18:16:25 -070016079
16080/**
16081 * sme_add_beacon_filter() - set the beacon filter configuration
16082 * @hal: The handle returned by macOpen
16083 * @session_id: session id
16084 * @ie_map: bitwise array of IEs
16085 *
16086 * Return: Return QDF_STATUS, otherwise appropriate failure code
16087 */
16088QDF_STATUS sme_add_beacon_filter(tHalHandle hal,
16089 uint32_t session_id,
16090 uint32_t *ie_map)
16091{
16092 cds_msg_t message;
16093 QDF_STATUS qdf_status;
16094 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
16095 struct beacon_filter_param *filter_param;
16096
16097 if (!CSR_IS_SESSION_VALID(mac_ctx, session_id)) {
16098 sms_log(mac_ctx, LOGE,
16099 "CSR session not valid: %d",
16100 session_id);
16101 return QDF_STATUS_E_FAILURE;
16102 }
16103
16104 filter_param = qdf_mem_malloc(sizeof(*filter_param));
16105 if (NULL == filter_param) {
16106 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
16107 "%s: fail to alloc filter_param", __func__);
16108 return QDF_STATUS_E_FAILURE;
16109 }
16110
16111 filter_param->vdev_id = session_id;
16112
16113 qdf_mem_copy(filter_param->ie_map, ie_map,
16114 BCN_FLT_MAX_ELEMS_IE_LIST * sizeof(uint32_t));
16115
16116 message.type = WMA_ADD_BCN_FILTER_CMDID;
16117 message.bodyptr = filter_param;
16118 qdf_status = cds_mq_post_message(QDF_MODULE_ID_WMA,
16119 &message);
16120 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
16121 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
16122 "%s: Not able to post msg to WDA!",
16123 __func__);
16124
16125 qdf_mem_free(filter_param);
16126 }
16127 return qdf_status;
16128}
16129
16130/**
16131 * sme_remove_beacon_filter() - set the beacon filter configuration
16132 * @hal: The handle returned by macOpen
16133 * @session_id: session id
16134 *
16135 * Return: Return QDF_STATUS, otherwise appropriate failure code
16136 */
16137QDF_STATUS sme_remove_beacon_filter(tHalHandle hal, uint32_t session_id)
16138{
16139 cds_msg_t message;
16140 QDF_STATUS qdf_status;
16141 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
16142 struct beacon_filter_param *filter_param;
16143
16144 if (!CSR_IS_SESSION_VALID(mac_ctx, session_id)) {
16145 sms_log(mac_ctx, LOGE,
16146 "CSR session not valid: %d",
16147 session_id);
16148 return QDF_STATUS_E_FAILURE;
16149 }
16150
16151 filter_param = qdf_mem_malloc(sizeof(*filter_param));
16152 if (NULL == filter_param) {
16153 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
16154 "%s: fail to alloc filter_param", __func__);
16155 return QDF_STATUS_E_FAILURE;
16156 }
16157
16158 filter_param->vdev_id = session_id;
16159
16160 message.type = WMA_REMOVE_BCN_FILTER_CMDID;
16161 message.bodyptr = filter_param;
16162 qdf_status = cds_mq_post_message(QDF_MODULE_ID_WMA,
16163 &message);
16164 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
16165 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
16166 "%s: Not able to post msg to WDA!",
16167 __func__);
16168
16169 qdf_mem_free(filter_param);
16170 }
16171 return qdf_status;
16172}
Arun Khandavalli2476ef52016-04-26 20:19:43 +053016173
Arun Khandavalli2476ef52016-04-26 20:19:43 +053016174/**
Kondabattini, Ganesh3f2d02c2016-09-13 12:23:47 +053016175 * sme_send_disassoc_req_frame - send disassoc req
16176 * @hal: handler to hal
16177 * @session_id: session id
16178 * @peer_mac: peer mac address
16179 * @reason: reason for disassociation
16180 * wait_for_ack: wait for acknowledgment
16181 *
16182 * function to send disassoc request to lim
16183 *
16184 * return: none
16185 */
16186void sme_send_disassoc_req_frame(tHalHandle hal, uint8_t session_id,
16187 uint8_t *peer_mac, uint16_t reason, uint8_t wait_for_ack)
16188{
16189 struct sme_send_disassoc_frm_req *msg;
16190 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
16191 A_UINT8 *buf;
16192 A_UINT16 tmp;
16193
16194 msg = qdf_mem_malloc(sizeof(struct sme_send_disassoc_frm_req));
16195
16196 if (NULL == msg)
16197 qdf_status = QDF_STATUS_E_FAILURE;
16198 else
16199 qdf_status = QDF_STATUS_SUCCESS;
16200
16201 if (!QDF_IS_STATUS_SUCCESS(qdf_status))
16202 return;
16203
Kondabattini, Ganesh3f2d02c2016-09-13 12:23:47 +053016204 msg->msg_type = (uint16_t) eWNI_SME_SEND_DISASSOC_FRAME;
16205
16206 msg->length = (uint16_t) sizeof(struct sme_send_disassoc_frm_req);
16207
16208 buf = &msg->session_id;
16209
16210 /* session id */
16211 *buf = (A_UINT8) session_id;
16212 buf += sizeof(A_UINT8);
16213
16214 /* transaction id */
16215 *buf = 0;
16216 *(buf + 1) = 0;
16217 buf += sizeof(A_UINT16);
16218
16219 /* Set the peer MAC address before sending the message to LIM */
16220 qdf_mem_copy(buf, peer_mac, QDF_MAC_ADDR_SIZE);
16221
16222 buf += QDF_MAC_ADDR_SIZE;
16223
16224 /* reasoncode */
16225 tmp = (uint16_t) reason;
16226 qdf_mem_copy(buf, &tmp, sizeof(uint16_t));
16227 buf += sizeof(uint16_t);
16228
16229 *buf = wait_for_ack;
16230 buf += sizeof(uint8_t);
16231
16232 qdf_status = cds_send_mb_message_to_mac(msg);
16233
16234 if (qdf_status != QDF_STATUS_SUCCESS)
16235 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
16236 FL("cds_send_mb_message Failed"));
16237}
16238
16239/**
Arun Khandavalli2476ef52016-04-26 20:19:43 +053016240 * sme_get_bpf_offload_capabilities() - Get length for BPF offload
16241 * @hal: Global HAL handle
16242 * This function constructs the cds message and fill in message type,
16243 * post the same to WDA.
16244 * Return: QDF_STATUS enumeration
16245 */
16246QDF_STATUS sme_get_bpf_offload_capabilities(tHalHandle hal)
16247{
16248 QDF_STATUS status = QDF_STATUS_SUCCESS;
16249 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
16250 cds_msg_t cds_msg;
16251
16252 sms_log(mac_ctx, LOG1, FL("enter"));
16253
16254 status = sme_acquire_global_lock(&mac_ctx->sme);
16255 if (QDF_STATUS_SUCCESS == status) {
16256 /* Serialize the req through MC thread */
16257 cds_msg.bodyptr = NULL;
16258 cds_msg.type = WDA_BPF_GET_CAPABILITIES_REQ;
16259 status = cds_mq_post_message(QDF_MODULE_ID_WMA, &cds_msg);
16260 if (!QDF_IS_STATUS_SUCCESS(status)) {
16261 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
16262 FL("Post bpf get offload msg fail"));
16263 status = QDF_STATUS_E_FAILURE;
16264 }
16265 sme_release_global_lock(&mac_ctx->sme);
16266 } else {
16267 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
16268 FL("sme_acquire_global_lock error"));
16269 }
16270 sms_log(mac_ctx, LOG1, FL("exit"));
16271 return status;
16272}
16273
16274
16275/**
16276 * sme_set_bpf_instructions() - Set BPF bpf filter instructions.
16277 * @hal: HAL handle
16278 * @bpf_set_offload: struct to set bpf filter instructions.
16279 *
16280 * Return: QDF_STATUS enumeration.
16281 */
16282QDF_STATUS sme_set_bpf_instructions(tHalHandle hal,
16283 struct sir_bpf_set_offload *req)
16284{
16285 QDF_STATUS status = QDF_STATUS_SUCCESS;
16286 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
16287 cds_msg_t cds_msg;
16288 struct sir_bpf_set_offload *set_offload;
16289
Arun Khandavallica198b52016-04-26 20:53:35 +053016290 set_offload = qdf_mem_malloc(sizeof(*set_offload) +
16291 req->current_length);
Arun Khandavalli2476ef52016-04-26 20:19:43 +053016292
16293 if (NULL == set_offload) {
16294 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
16295 FL("Failed to alloc set_offload"));
16296 return QDF_STATUS_E_NOMEM;
16297 }
16298
16299 set_offload->session_id = req->session_id;
16300 set_offload->filter_id = req->filter_id;
16301 set_offload->current_offset = req->current_offset;
16302 set_offload->total_length = req->total_length;
Rajeev Kumare5a16822016-07-27 13:11:42 -070016303 set_offload->current_length = req->current_length;
Arun Khandavalli2476ef52016-04-26 20:19:43 +053016304 if (set_offload->total_length) {
Arun Khandavallica198b52016-04-26 20:53:35 +053016305 set_offload->program = ((uint8_t *)set_offload) +
16306 sizeof(*set_offload);
Arun Khandavalli2476ef52016-04-26 20:19:43 +053016307 qdf_mem_copy(set_offload->program, req->program,
16308 set_offload->current_length);
16309 }
16310 status = sme_acquire_global_lock(&mac_ctx->sme);
16311 if (QDF_STATUS_SUCCESS == status) {
16312 /* Serialize the req through MC thread */
16313 cds_msg.bodyptr = set_offload;
16314 cds_msg.type = WDA_BPF_SET_INSTRUCTIONS_REQ;
16315 status = cds_mq_post_message(QDF_MODULE_ID_WMA, &cds_msg);
16316
16317 if (!QDF_IS_STATUS_SUCCESS(status)) {
16318 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
16319 FL("Post BPF set offload msg fail"));
16320 status = QDF_STATUS_E_FAILURE;
Arun Khandavalli2476ef52016-04-26 20:19:43 +053016321 qdf_mem_free(set_offload);
16322 }
16323 sme_release_global_lock(&mac_ctx->sme);
16324 } else {
16325 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
16326 FL("sme_acquire_global_lock failed"));
Arun Khandavalli2476ef52016-04-26 20:19:43 +053016327 qdf_mem_free(set_offload);
16328 }
16329 return status;
16330}
16331
16332/**
16333 * sme_bpf_offload_register_callback() - Register get bpf offload callbacK
16334 *
16335 * @hal - MAC global handle
16336 * @callback_routine - callback routine from HDD
16337 *
16338 * This API is invoked by HDD to register its callback in SME
16339 *
16340 * Return: QDF_STATUS
16341 */
16342QDF_STATUS sme_bpf_offload_register_callback(tHalHandle hal,
16343 void (*pbpf_get_offload_cb)(void *context,
16344 struct sir_bpf_get_offload *))
16345{
16346 QDF_STATUS status = QDF_STATUS_SUCCESS;
16347 tpAniSirGlobal mac = PMAC_STRUCT(hal);
16348
16349 status = sme_acquire_global_lock(&mac->sme);
16350 if (QDF_IS_STATUS_SUCCESS(status)) {
16351 mac->sme.pbpf_get_offload_cb = pbpf_get_offload_cb;
16352 sme_release_global_lock(&mac->sme);
16353 } else {
16354 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
16355 FL("sme_acquire_global_lock failed"));
16356 }
16357 return status;
16358}
Manjunathappa Prakash59f861d2016-04-21 10:33:31 -070016359
16360/**
Abhishek Singh1c676222016-05-09 14:20:28 +053016361 * sme_get_wni_dot11_mode() - return configured wni dot11mode
16362 * @hal: hal pointer
16363 *
16364 * Return: wni dot11 mode.
16365 */
16366uint32_t sme_get_wni_dot11_mode(tHalHandle hal)
16367{
16368 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
16369
16370 return csr_translate_to_wni_cfg_dot11_mode(mac_ctx,
16371 mac_ctx->roam.configParam.uCfgDot11Mode);
16372}
16373
16374/**
Arun Khandavalli4b55da72016-07-19 19:55:01 +053016375 * sme_bpf_offload_deregister_callback() - Register get bpf offload callbacK
16376 *
16377 * @h_hal - MAC global handle
16378 * @callback_routine - callback routine from HDD
16379 *
16380 * This API is invoked by HDD to de-register its callback in SME
16381 *
16382 * Return: QDF_STATUS Enumeration
16383 */
16384QDF_STATUS sme_bpf_offload_deregister_callback(tHalHandle h_hal)
16385{
16386 QDF_STATUS status = QDF_STATUS_SUCCESS;
16387 tpAniSirGlobal mac;
16388
16389 if (!h_hal) {
16390 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
16391 FL("hHal is not valid"));
16392 return QDF_STATUS_E_INVAL;
16393 }
16394
16395 mac = PMAC_STRUCT(h_hal);
16396
16397 status = sme_acquire_global_lock(&mac->sme);
16398 if (QDF_IS_STATUS_SUCCESS(status)) {
16399 mac->sme.pbpf_get_offload_cb = NULL;
16400 sme_release_global_lock(&mac->sme);
16401 } else {
16402 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
16403 FL("sme_acquire_global_lock failed"));
16404 }
16405 return status;
16406}
16407
16408
16409/**
Manjunathappa Prakash59f861d2016-04-21 10:33:31 -070016410 * sme_create_mon_session() - post message to create PE session for monitormode
16411 * operation
16412 * @hal_handle: Handle to the HAL
16413 * @bssid: pointer to bssid
16414 *
16415 * Return: QDF_STATUS_SUCCESS on success, non-zero error code on failure.
16416 */
16417QDF_STATUS sme_create_mon_session(tHalHandle hal_handle, tSirMacAddr bss_id)
16418{
16419 QDF_STATUS status = QDF_STATUS_E_FAILURE;
16420 struct sir_create_session *msg;
16421
16422 msg = qdf_mem_malloc(sizeof(*msg));
16423 if (NULL != msg) {
16424 msg->type = eWNI_SME_MON_INIT_SESSION;
16425 msg->msg_len = sizeof(*msg);
16426 qdf_mem_copy(msg->bss_id.bytes, bss_id, QDF_MAC_ADDR_SIZE);
16427 status = cds_send_mb_message_to_mac(msg);
16428 }
16429 return status;
16430}
Gupta, Kapil96c7f2f2016-04-25 19:13:41 +053016431
Gupta, Kapil96c7f2f2016-04-25 19:13:41 +053016432/**
16433 * sme_set_adaptive_dwelltime_config() - Update Adaptive dwelltime configuration
16434 * @hal: The handle returned by macOpen
16435 * @params: adaptive_dwelltime_params config
16436 *
16437 * Return: QDF_STATUS if adaptive dwell time update
16438 * configuration sucsess else failure status
16439 */
16440QDF_STATUS sme_set_adaptive_dwelltime_config(tHalHandle hal,
16441 struct adaptive_dwelltime_params *params)
16442{
16443 cds_msg_t message;
16444 QDF_STATUS status;
16445 struct adaptive_dwelltime_params *dwelltime_params;
16446
16447 dwelltime_params = qdf_mem_malloc(sizeof(*dwelltime_params));
16448 if (NULL == dwelltime_params) {
16449 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
16450 "%s: fail to alloc dwelltime_params", __func__);
16451 return QDF_STATUS_E_NOMEM;
16452 }
16453
16454 dwelltime_params->is_enabled = params->is_enabled;
16455 dwelltime_params->dwelltime_mode = params->dwelltime_mode;
16456 dwelltime_params->lpf_weight = params->lpf_weight;
16457 dwelltime_params->passive_mon_intval = params->passive_mon_intval;
16458 dwelltime_params->wifi_act_threshold = params->wifi_act_threshold;
16459
16460 message.type = WMA_SET_ADAPT_DWELLTIME_CONF_PARAMS;
16461 message.bodyptr = dwelltime_params;
16462 status = cds_mq_post_message(QDF_MODULE_ID_WMA, &message);
16463 if (!QDF_IS_STATUS_SUCCESS(status)) {
16464 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
16465 "%s: Not able to post msg to WMA!", __func__);
16466
16467 qdf_mem_free(dwelltime_params);
16468 }
16469 return status;
16470}
Naveen Rawata410c5a2016-09-19 14:22:33 -070016471
16472/**
16473 * sme_set_vdev_ies_per_band() - sends the per band IEs to vdev
16474 * @hal: Pointer to HAL
16475 * @vdev_id: vdev_id for which IE is targeted
16476 *
16477 * Return: None
16478 */
16479void sme_set_vdev_ies_per_band(tHalHandle hal, uint8_t vdev_id)
16480{
16481 tpAniSirGlobal p_mac = PMAC_STRUCT(hal);
16482 struct sir_set_vdev_ies_per_band *p_msg;
16483 QDF_STATUS status = QDF_STATUS_E_FAILURE;
16484
16485 p_msg = qdf_mem_malloc(sizeof(*p_msg));
16486 if (NULL == p_msg) {
16487 sms_log(p_mac, LOGE, FL("mem alloc failed for sme msg"));
16488 return;
16489 }
16490
16491 p_msg->vdev_id = vdev_id;
16492 p_msg->msg_type = eWNI_SME_SET_VDEV_IES_PER_BAND;
16493 p_msg->len = sizeof(*p_msg);
16494 sms_log(p_mac, LOG1,
16495 FL("sending eWNI_SME_SET_VDEV_IES_PER_BAND: vdev_id: %d "),
16496 vdev_id);
16497 status = cds_send_mb_message_to_mac(p_msg);
16498 if (QDF_STATUS_SUCCESS != status)
16499 sms_log(p_mac, LOGE,
16500 FL("Send eWNI_SME_SET_VDEV_IES_PER_BAND fail"));
16501}
16502
Kiran Kumar Lokere666bf852016-05-02 12:23:02 -070016503/**
16504 * sme_set_pdev_ht_vht_ies() - sends the set pdev IE req
16505 * @hal: Pointer to HAL
16506 * @enable2x2: 1x1 or 2x2 mode.
16507 *
16508 * Sends the set pdev IE req with Nss value.
16509 *
16510 * Return: None
16511 */
16512void sme_set_pdev_ht_vht_ies(tHalHandle hal, bool enable2x2)
16513{
16514 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
16515 struct sir_set_ht_vht_cfg *ht_vht_cfg;
16516 QDF_STATUS status = QDF_STATUS_E_FAILURE;
16517
Kiran Kumar Lokere666bf852016-05-02 12:23:02 -070016518 if (!((mac_ctx->roam.configParam.uCfgDot11Mode ==
16519 eCSR_CFG_DOT11_MODE_AUTO) ||
16520 (mac_ctx->roam.configParam.uCfgDot11Mode ==
16521 eCSR_CFG_DOT11_MODE_11N) ||
16522 (mac_ctx->roam.configParam.uCfgDot11Mode ==
16523 eCSR_CFG_DOT11_MODE_11N_ONLY) ||
16524 (mac_ctx->roam.configParam.uCfgDot11Mode ==
16525 eCSR_CFG_DOT11_MODE_11AC) ||
16526 (mac_ctx->roam.configParam.uCfgDot11Mode ==
16527 eCSR_CFG_DOT11_MODE_11AC_ONLY)))
16528 return;
16529
16530 status = sme_acquire_global_lock(&mac_ctx->sme);
16531 if (QDF_STATUS_SUCCESS == status) {
16532 ht_vht_cfg = qdf_mem_malloc(sizeof(*ht_vht_cfg));
16533 if (NULL == ht_vht_cfg) {
16534 sms_log(mac_ctx, LOGE,
16535 "%s: mem alloc failed for ht_vht_cfg",
16536 __func__);
16537 sme_release_global_lock(&mac_ctx->sme);
16538 return;
16539 }
16540
16541 ht_vht_cfg->pdev_id = 0;
16542 if (enable2x2)
16543 ht_vht_cfg->nss = 2;
16544 else
16545 ht_vht_cfg->nss = 1;
16546 ht_vht_cfg->dot11mode =
16547 (uint8_t)csr_translate_to_wni_cfg_dot11_mode(mac_ctx,
16548 mac_ctx->roam.configParam.uCfgDot11Mode);
16549
16550 ht_vht_cfg->msg_type = eWNI_SME_PDEV_SET_HT_VHT_IE;
16551 ht_vht_cfg->len = sizeof(*ht_vht_cfg);
16552 sms_log(mac_ctx, LOG1,
16553 FL("SET_HT_VHT_IE with nss %d, dot11mode %d"),
16554 ht_vht_cfg->nss,
16555 ht_vht_cfg->dot11mode);
16556 status = cds_send_mb_message_to_mac(ht_vht_cfg);
16557 if (QDF_STATUS_SUCCESS != status) {
16558 sms_log(mac_ctx, LOGE, FL(
16559 "Send SME_PDEV_SET_HT_VHT_IE fail"));
Kiran Kumar Lokere666bf852016-05-02 12:23:02 -070016560 }
16561 sme_release_global_lock(&mac_ctx->sme);
16562 }
16563 return;
16564}
16565
16566/**
16567 * sme_update_vdev_type_nss() - sets the nss per vdev type
16568 * @hal: Pointer to HAL
16569 * @max_supp_nss: max_supported Nss
16570 * @band: 5G or 2.4G band
16571 *
16572 * Sets the per band Nss for each vdev type based on INI and configured
16573 * chain mask value.
16574 *
16575 * Return: None
16576 */
16577void sme_update_vdev_type_nss(tHalHandle hal, uint8_t max_supp_nss,
16578 uint32_t vdev_type_nss, eCsrBand band)
16579{
16580 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
16581 struct vdev_type_nss *vdev_nss;
16582
16583 if (eCSR_BAND_5G == band)
16584 vdev_nss = &mac_ctx->vdev_type_nss_5g;
16585 else
16586 vdev_nss = &mac_ctx->vdev_type_nss_2g;
16587
16588 vdev_nss->sta = QDF_MIN(max_supp_nss, CFG_STA_NSS(vdev_type_nss));
16589 vdev_nss->sap = QDF_MIN(max_supp_nss, CFG_SAP_NSS(vdev_type_nss));
16590 vdev_nss->p2p_go = QDF_MIN(max_supp_nss,
16591 CFG_P2P_GO_NSS(vdev_type_nss));
16592 vdev_nss->p2p_cli = QDF_MIN(max_supp_nss,
16593 CFG_P2P_CLI_NSS(vdev_type_nss));
16594 vdev_nss->p2p_dev = QDF_MIN(max_supp_nss,
16595 CFG_P2P_DEV_NSS(vdev_type_nss));
16596 vdev_nss->ibss = QDF_MIN(max_supp_nss, CFG_IBSS_NSS(vdev_type_nss));
16597 vdev_nss->tdls = QDF_MIN(max_supp_nss, CFG_TDLS_NSS(vdev_type_nss));
16598 vdev_nss->ocb = QDF_MIN(max_supp_nss, CFG_OCB_NSS(vdev_type_nss));
16599
16600 sms_log(mac_ctx, LOG1,
16601 "band %d NSS:sta %d sap %d cli %d go %d dev %d ibss %d tdls %d ocb %d",
16602 band, vdev_nss->sta, vdev_nss->sap, vdev_nss->p2p_cli,
16603 vdev_nss->p2p_go, vdev_nss->p2p_dev, vdev_nss->ibss,
16604 vdev_nss->tdls, vdev_nss->ocb);
16605}
Peng Xu8fdaa492016-06-22 10:20:47 -070016606
16607/**
16608 * sme_register_p2p_lo_event() - Register for the p2p lo event
16609 * @hHal: reference to the HAL
16610 * @context: the context of the call
16611 * @callback: the callback to hdd
16612 *
16613 * This function registers the callback function for P2P listen
16614 * offload stop event.
16615 *
16616 * Return: none
16617 */
16618void sme_register_p2p_lo_event(tHalHandle hHal, void *context,
16619 p2p_lo_callback callback)
16620{
16621 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
16622 QDF_STATUS status = QDF_STATUS_E_FAILURE;
16623
16624 status = sme_acquire_global_lock(&pMac->sme);
16625 pMac->sme.p2p_lo_event_callback = callback;
16626 pMac->sme.p2p_lo_event_context = context;
16627 sme_release_global_lock(&pMac->sme);
16628}
Manjeet Singhf82ed072016-07-08 11:40:00 +053016629
16630/**
16631 * sme_process_mac_pwr_dbg_cmd() - enable mac pwr debugging
16632 * @hal: The handle returned by macOpen
16633 * @session_id: session id
16634 * @dbg_args: args for mac pwr debug command
16635 * Return: Return QDF_STATUS, otherwise appropriate failure code
16636 */
16637QDF_STATUS sme_process_mac_pwr_dbg_cmd(tHalHandle hal, uint32_t session_id,
16638 struct sir_mac_pwr_dbg_cmd*
16639 dbg_args)
16640{
16641 cds_msg_t message;
16642 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
16643 struct sir_mac_pwr_dbg_cmd *req;
16644 int i;
16645
16646 if (!CSR_IS_SESSION_VALID(mac_ctx, session_id)) {
16647 sms_log(mac_ctx, LOGE,
16648 "CSR session not valid: %d",
16649 session_id);
16650 return QDF_STATUS_E_FAILURE;
16651 }
16652
16653 req = qdf_mem_malloc(sizeof(*req));
16654 if (NULL == req) {
16655 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
16656 "%s: fail to alloc mac_pwr_dbg_args", __func__);
16657 return QDF_STATUS_E_FAILURE;
16658 }
16659 req->module_id = dbg_args->module_id;
16660 req->pdev_id = dbg_args->pdev_id;
16661 req->num_args = dbg_args->num_args;
16662 for (i = 0; i < req->num_args; i++)
16663 req->args[i] = dbg_args->args[i];
16664
16665 message.type = SIR_HAL_POWER_DBG_CMD;
16666 message.bodyptr = req;
16667
16668 if (!QDF_IS_STATUS_SUCCESS(cds_mq_post_message
16669 (QDF_MODULE_ID_WMA, &message))) {
16670 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
16671 "%s: Not able to post msg to WDA!",
16672 __func__);
16673 qdf_mem_free(req);
16674 }
16675 return QDF_STATUS_SUCCESS;
16676}
Tushnim Bhattacharyyaf44a9d82016-07-05 10:52:06 -070016677/**
16678 * sme_get_vdev_type_nss() - gets the nss per vdev type
16679 * @hal: Pointer to HAL
16680 * @dev_mode: connection type.
16681 * @nss2g: Pointer to the 2G Nss parameter.
16682 * @nss5g: Pointer to the 5G Nss parameter.
16683 *
16684 * Fills the 2G and 5G Nss values based on connection type.
16685 *
16686 * Return: None
16687 */
16688void sme_get_vdev_type_nss(tHalHandle hal, enum tQDF_ADAPTER_MODE dev_mode,
16689 uint8_t *nss_2g, uint8_t *nss_5g)
16690{
16691 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
16692 csr_get_vdev_type_nss(mac_ctx, dev_mode, nss_2g, nss_5g);
16693}
Agrawal Ashish21ba2572016-09-03 16:40:10 +053016694
16695/**
16696 * sme_update_sta_roam_policy() - update sta roam policy for
16697 * unsafe and DFS channels.
16698 * @hal_handle: hal handle for getting global mac struct
16699 * @dfs_mode: dfs mode which tell if dfs channel needs to be
16700 * skipped or not
16701 * @skip_unsafe_channels: Param to tell if driver needs to
16702 * skip unsafe channels or not.
16703 * @param session_id: sme_session_id
16704 *
16705 * sme_update_sta_roam_policy update sta rome policies to csr
16706 * this function will call csrUpdateChannelList as well
16707 * to include/exclude DFS channels and unsafe channels.
16708 *
16709 * Return: eHAL_STATUS_SUCCESS or non-zero on failure.
16710 */
16711QDF_STATUS sme_update_sta_roam_policy(tHalHandle hal_handle,
16712 enum sta_roam_policy_dfs_mode dfs_mode,
16713 bool skip_unsafe_channels,
16714 uint8_t session_id)
16715{
16716 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal_handle);
16717 QDF_STATUS status = QDF_STATUS_SUCCESS;
16718 tSmeConfigParams sme_config;
16719
16720 if (!mac_ctx) {
16721 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_FATAL,
16722 "%s: mac_ctx is null", __func__);
16723 return QDF_STATUS_E_FAILURE;
16724 }
16725 qdf_mem_zero(&sme_config, sizeof(sme_config));
16726 sme_get_config_param(hal_handle, &sme_config);
16727
16728 sme_config.csrConfig.sta_roam_policy_params.dfs_mode =
16729 dfs_mode;
16730 sme_config.csrConfig.sta_roam_policy_params.skip_unsafe_channels =
16731 skip_unsafe_channels;
16732
16733 sme_update_config(hal_handle, &sme_config);
16734
16735 status = csr_update_channel_list(mac_ctx);
16736 if (QDF_STATUS_SUCCESS != status) {
16737 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
16738 FL("failed to update the supported channel list"));
16739 }
16740 if (mac_ctx->roam.configParam.isRoamOffloadScanEnabled)
16741 csr_roam_offload_scan(mac_ctx, session_id,
16742 ROAM_SCAN_OFFLOAD_UPDATE_CFG,
16743 REASON_ROAM_SCAN_STA_ROAM_POLICY_CHANGED);
Selvaraj, Sridharebda0f22016-08-29 16:05:23 +053016744 return status;
16745}
16746
16747/**
16748 * sme_enable_disable_chanavoidind_event - configure ca event ind
16749 * @hal: handler to hal
16750 * @set_value: enable/disable
16751 *
16752 * function to enable/disable chan avoidance indication
16753 *
16754 * Return: QDF_STATUS
16755 */
16756QDF_STATUS sme_enable_disable_chanavoidind_event(tHalHandle hal,
16757 uint8_t set_value)
16758{
16759 QDF_STATUS status;
16760 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
16761 cds_msg_t msg;
16762
16763 sms_log(mac_ctx, LOG1, FL("set_value: %d"), set_value);
16764 status = sme_acquire_global_lock(&mac_ctx->sme);
16765 if (QDF_STATUS_SUCCESS == status) {
16766 qdf_mem_zero(&msg, sizeof(cds_msg_t));
16767 msg.type = WMA_SEND_FREQ_RANGE_CONTROL_IND;
16768 msg.bodyval = set_value;
16769 status = cds_mq_post_message(QDF_MODULE_ID_WMA, &msg);
16770 sme_release_global_lock(&mac_ctx->sme);
16771 return status;
16772 }
Deepak Dhamdhereb106ae52016-08-10 20:55:30 +053016773 return status;
16774}
Agrawal Ashish21ba2572016-09-03 16:40:10 +053016775
Deepak Dhamdhereb106ae52016-08-10 20:55:30 +053016776/*
16777 * sme_set_default_scan_ie() - API to send default scan IE to LIM
16778 * @hal: reference to the HAL
16779 * @session_id: current session ID
16780 * @ie_data: Pointer to Scan IE data
16781 * @ie_len: Length of @ie_data
16782 *
16783 * Return: QDF_STATUS
16784 */
16785QDF_STATUS sme_set_default_scan_ie(tHalHandle hal, uint16_t session_id,
16786 uint8_t *ie_data, uint16_t ie_len)
16787{
16788 QDF_STATUS status;
16789 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
16790 struct hdd_default_scan_ie *set_ie_params;
16791
16792 status = sme_acquire_global_lock(&mac_ctx->sme);
16793 if (QDF_IS_STATUS_SUCCESS(status)) {
16794 set_ie_params = qdf_mem_malloc(sizeof(*set_ie_params));
16795 if (!set_ie_params)
16796 status = QDF_STATUS_E_NOMEM;
16797 else {
16798 set_ie_params->message_type = eWNI_SME_DEFAULT_SCAN_IE;
16799 set_ie_params->length = sizeof(*set_ie_params);
16800 set_ie_params->session_id = session_id;
16801 set_ie_params->ie_len = ie_len;
16802 qdf_mem_copy(set_ie_params->ie_data, ie_data, ie_len);
16803 status = cds_send_mb_message_to_mac(set_ie_params);
16804 }
16805 sme_release_global_lock(&mac_ctx->sme);
16806 }
16807 sms_log(mac_ctx, LOG1, FL("Set default scan IE status %d"), status);
Agrawal Ashish21ba2572016-09-03 16:40:10 +053016808 return status;
16809}
Padma, Santhosh Kumard7cc0792016-06-28 18:54:12 +053016810
Padma, Santhosh Kumar72e7aec2016-10-12 17:23:44 +053016811#ifdef WLAN_FEATURE_DISA
Padma, Santhosh Kumard7cc0792016-06-28 18:54:12 +053016812/**
16813 * sme_encrypt_decrypt_msg() - handles encrypt/decrypt mesaage
16814 * @hal: HAL handle
16815 * @encrypt_decrypt_params: struct to set encryption/decryption params.
16816 *
16817 * Return: QDF_STATUS enumeration.
16818 */
16819QDF_STATUS sme_encrypt_decrypt_msg(tHalHandle hal,
16820 struct encrypt_decrypt_req_params *encrypt_decrypt_params)
16821{
16822 QDF_STATUS status = QDF_STATUS_SUCCESS;
16823 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
16824 cds_msg_t cds_msg;
16825 struct encrypt_decrypt_req_params *params;
16826 uint8_t *ptr;
16827
16828 ptr = qdf_mem_malloc(sizeof(*params) +
16829 encrypt_decrypt_params->data_len);
16830 if (ptr == NULL) {
16831 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
16832 FL("Failed to alloc memory for encrypt/decrypt params"));
16833 return QDF_STATUS_E_NOMEM;
16834 }
16835
16836 params = (struct encrypt_decrypt_req_params *)ptr;
16837
16838 *params = *encrypt_decrypt_params;
16839
16840 if (params->data_len) {
16841 params->data = ptr + sizeof(*params);
16842
16843 qdf_mem_copy(params->data, encrypt_decrypt_params->data,
16844 params->data_len);
16845 }
16846
16847 status = sme_acquire_global_lock(&mac_ctx->sme);
16848 if (status == QDF_STATUS_SUCCESS) {
16849 /* Serialize the req through MC thread */
16850 cds_msg.bodyptr = params;
16851 cds_msg.type = WMA_ENCRYPT_DECRYPT_MSG;
16852 status = cds_mq_post_message(QDF_MODULE_ID_WMA, &cds_msg);
16853
16854 if (!QDF_IS_STATUS_SUCCESS(status)) {
16855 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
16856 FL("Post encrypt/decrypt msg fail"));
16857 status = QDF_STATUS_E_FAILURE;
16858 qdf_mem_free(params);
16859 }
16860 sme_release_global_lock(&mac_ctx->sme);
16861 } else {
16862 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
16863 FL("sme_acquire_global_lock failed"));
16864 qdf_mem_free(params);
16865 }
16866 return status;
16867
16868}
16869
16870/**
16871 * sme_encrypt_decrypt_msg_register_callback() - Registers
16872 * encrypt/decrypt message callback
16873 *
16874 * @hal - MAC global handle
16875 * @callback_routine - callback routine from HDD
16876 *
16877 * This API is invoked by HDD to register its callback in SME
16878 *
16879 * Return: QDF_STATUS
16880 */
16881QDF_STATUS sme_encrypt_decrypt_msg_register_callback(tHalHandle hal,
16882 void (*encrypt_decrypt_cb)(void *hdd_context,
16883 struct sir_encrypt_decrypt_rsp_params
16884 *encrypt_decrypt_rsp_params))
16885{
16886 QDF_STATUS status = QDF_STATUS_SUCCESS;
16887 tpAniSirGlobal mac;
16888
16889 if (!hal) {
16890 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
16891 FL("hHal is not valid"));
16892 return QDF_STATUS_E_INVAL;
16893 }
16894
16895 mac = PMAC_STRUCT(hal);
16896
16897 status = sme_acquire_global_lock(&mac->sme);
16898 if (QDF_IS_STATUS_SUCCESS(status)) {
16899 mac->sme.encrypt_decrypt_cb = encrypt_decrypt_cb;
16900 sme_release_global_lock(&mac->sme);
16901 } else {
16902 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
16903 FL("sme_acquire_global_lock failed"));
16904 }
16905 return status;
16906}
16907
16908/**
16909 * sme_encrypt_decrypt_msg_deregister_callback() - Registers
16910 * encrypt/decrypt message callback
16911 *
16912 * @h_hal - MAC global handle
16913 * @callback_routine - callback routine from HDD
16914 *
16915 * This API is invoked by HDD to de-register its callback in SME
16916 *
16917 * Return: QDF_STATUS Enumeration
16918 */
16919QDF_STATUS sme_encrypt_decrypt_msg_deregister_callback(tHalHandle h_hal)
16920{
16921 QDF_STATUS status = QDF_STATUS_SUCCESS;
16922 tpAniSirGlobal mac;
16923
16924 if (!h_hal) {
16925 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
16926 FL("hHal is not valid"));
16927 return QDF_STATUS_E_INVAL;
16928 }
16929
16930 mac = PMAC_STRUCT(h_hal);
16931
16932 status = sme_acquire_global_lock(&mac->sme);
16933 if (QDF_IS_STATUS_SUCCESS(status)) {
16934 mac->sme.encrypt_decrypt_cb = NULL;
16935 sme_release_global_lock(&mac->sme);
16936 } else {
16937 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
16938 FL("sme_acquire_global_lock failed"));
16939 }
16940 return status;
16941}
Padma, Santhosh Kumar72e7aec2016-10-12 17:23:44 +053016942#endif
Agrawal Ashishb2d1a452016-05-05 12:23:58 +053016943
16944QDF_STATUS sme_set_cts2self_for_p2p_go(tHalHandle hal_handle)
16945{
Agrawal Ashishb2d1a452016-05-05 12:23:58 +053016946 void *wma_handle;
16947
16948 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
16949 if (!wma_handle) {
16950 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
16951 "wma_handle is NULL");
16952 return QDF_STATUS_E_FAILURE;
16953 }
Agrawal Ashishb2d1a452016-05-05 12:23:58 +053016954 if (QDF_STATUS_SUCCESS !=
16955 wma_set_cts2self_for_p2p_go(wma_handle, true)) {
16956 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
16957 "%s: Failed to set cts2self for p2p GO to firmware",
16958 __func__);
16959 return QDF_STATUS_E_FAILURE;
16960 }
16961 return QDF_STATUS_SUCCESS;
16962}
Agrawal, Ashish35b251d2016-09-08 19:21:03 +053016963/**
16964 * sme_update_tx_fail_cnt_threshold() - update tx fail count Threshold
16965 * @hal: Handle returned by mac_open
16966 * @session_id: Session ID on which tx fail count needs to be updated to FW
16967 * @tx_fail_count: Count for tx fail threshold after which FW will disconnect
16968 *
16969 * This function is used to set tx fail count threshold to firmware.
16970 * firmware will issue disocnnect with peer device once this threshold is
16971 * reached.
16972 *
16973 * Return: Return QDF_STATUS, otherwise appropriate failure code
16974 */
16975QDF_STATUS sme_update_tx_fail_cnt_threshold(tHalHandle hal_handle,
16976 uint8_t session_id, uint32_t tx_fail_count)
16977{
16978 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal_handle);
16979 QDF_STATUS status = QDF_STATUS_E_FAILURE;
16980 struct sme_tx_fail_cnt_threshold *tx_fail_cnt;
16981 cds_msg_t msg;
16982
16983 tx_fail_cnt = qdf_mem_malloc(sizeof(*tx_fail_cnt));
16984 if (NULL == tx_fail_cnt) {
16985 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
16986 "%s: fail to alloc filter_param", __func__);
16987 return QDF_STATUS_E_FAILURE;
16988 }
16989 sms_log(mac_ctx, LOG1,
16990 FL("session_id %d tx_fail_count: %d"),
16991 session_id, tx_fail_count);
16992 tx_fail_cnt->session_id = session_id;
16993 tx_fail_cnt->tx_fail_cnt_threshold = tx_fail_count;
16994
16995 qdf_mem_zero(&msg, sizeof(cds_msg_t));
16996 msg.type = SIR_HAL_UPDATE_TX_FAIL_CNT_TH;
16997 msg.reserved = 0;
16998 msg.bodyptr = tx_fail_cnt;
16999 status = cds_mq_post_message(QDF_MODULE_ID_WMA, &msg);
17000
17001 if (!QDF_IS_STATUS_SUCCESS(status)) {
17002 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
17003 FL("Not able to post Tx fail count message to WDA"));
17004 qdf_mem_free(tx_fail_cnt);
17005 }
Sreelakshmi Konamki58c72432016-11-09 17:06:44 +053017006 return status;
17007}
Agrawal, Ashish35b251d2016-09-08 19:21:03 +053017008
Sreelakshmi Konamki58c72432016-11-09 17:06:44 +053017009QDF_STATUS sme_set_lost_link_info_cb(tHalHandle hal,
17010 void (*cb)(void *, struct sir_lost_link_info *))
17011{
17012 QDF_STATUS status = QDF_STATUS_SUCCESS;
17013 tpAniSirGlobal mac = PMAC_STRUCT(hal);
17014
17015 status = sme_acquire_global_lock(&mac->sme);
17016 if (QDF_IS_STATUS_SUCCESS(status)) {
17017 mac->sme.lost_link_info_cb = cb;
17018 sme_release_global_lock(&mac->sme);
17019 sms_log(mac, LOG1, FL("set lost link info callback"));
17020 } else {
17021 sms_log(mac, LOGE,
17022 FL("sme_acquire_global_lock error status %d"),
17023 status);
17024 }
Agrawal, Ashish35b251d2016-09-08 19:21:03 +053017025 return status;
17026}