blob: fa40dd58406fadd7c3f48faa3af0f9ae9bb4e966 [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"
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080063
64extern tSirRetStatus u_mac_post_ctrl_msg(void *pSirGlobal, tSirMbMsg *pMb);
65
66#define LOG_SIZE 256
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080067
68static tSelfRecoveryStats g_self_recovery_stats;
69/* TxMB Functions */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053070extern QDF_STATUS pmc_prepare_command(tpAniSirGlobal pMac, uint32_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080071 eSmeCommandType cmdType, void *pvParam,
72 uint32_t size, tSmeCmd **ppCmd);
73extern void pmc_release_command(tpAniSirGlobal pMac, tSmeCmd *pCommand);
74extern void qos_release_command(tpAniSirGlobal pMac, tSmeCmd *pCommand);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053075extern QDF_STATUS p2p_process_remain_on_channel_cmd(tpAniSirGlobal pMac,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080076 tSmeCmd *p2pRemainonChn);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053077extern QDF_STATUS sme_remain_on_chn_rsp(tpAniSirGlobal pMac, uint8_t *pMsg);
78extern QDF_STATUS sme_remain_on_chn_ready(tHalHandle hHal, uint8_t *pMsg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080079
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053080static QDF_STATUS init_sme_cmd_list(tpAniSirGlobal pMac);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080081static void sme_abort_command(tpAniSirGlobal pMac, tSmeCmd *pCommand,
82 bool fStopping);
83
84eCsrPhyMode sme_get_phy_mode(tHalHandle hHal);
85
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053086QDF_STATUS sme_handle_change_country_code(tpAniSirGlobal pMac, void *pMsgBuf);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080087
88void sme_disconnect_connected_sessions(tpAniSirGlobal pMac);
89
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053090QDF_STATUS sme_handle_generic_change_country_code(tpAniSirGlobal pMac,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080091 void *pMsgBuf);
92
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053093QDF_STATUS sme_process_nss_update_resp(tpAniSirGlobal mac, uint8_t *msg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080094
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -080095#ifdef FEATURE_WLAN_ESE
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080096bool csr_is_supported_channel(tpAniSirGlobal pMac, uint8_t channelId);
97#endif
98
99#ifdef WLAN_FEATURE_11W
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530100QDF_STATUS sme_unprotected_mgmt_frm_ind(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800101 tpSirSmeUnprotMgmtFrameInd pSmeMgmtFrm);
102#endif
103
104/* Message processor for events from DFS */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530105QDF_STATUS dfs_msg_processor(tpAniSirGlobal pMac,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800106 uint16_t msg_type, void *pMsgBuf);
107
108/* Channel Change Response Indication Handler */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530109QDF_STATUS sme_process_channel_change_resp(tpAniSirGlobal pMac,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800110 uint16_t msg_type, void *pMsgBuf);
111
112/* Internal SME APIs */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530113QDF_STATUS sme_acquire_global_lock(tSmeStruct *psSme)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800114{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530115 QDF_STATUS status = QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800116
117 if (psSme) {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530118 if (QDF_IS_STATUS_SUCCESS
Anurag Chouhana37b5b72016-02-21 14:53:42 +0530119 (qdf_mutex_acquire(&psSme->lkSmeGlobalLock))) {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530120 status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800121 }
122 }
123
124 return status;
125}
126
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530127QDF_STATUS sme_release_global_lock(tSmeStruct *psSme)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800128{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530129 QDF_STATUS status = QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800130
131 if (psSme) {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530132 if (QDF_IS_STATUS_SUCCESS
Anurag Chouhana37b5b72016-02-21 14:53:42 +0530133 (qdf_mutex_release(&psSme->lkSmeGlobalLock))) {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530134 status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800135 }
136 }
137
138 return status;
139}
140
141/**
142 * sme_process_set_hw_mode_resp() - Process set HW mode response
143 * @mac: Global MAC pointer
144 * @msg: HW mode response
145 *
146 * Processes the HW mode response and invokes the HDD callback
147 * to process further
148 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530149static QDF_STATUS sme_process_set_hw_mode_resp(tpAniSirGlobal mac, uint8_t *msg)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800150{
151 tListElem *entry = NULL;
152 tSmeCmd *command = NULL;
153 bool found;
154 hw_mode_cb callback = NULL;
155 struct sir_set_hw_mode_resp *param;
Chandrasekaran, Manishekarce2172e2016-02-18 16:12:43 +0530156 enum sir_conn_update_reason reason;
Chandrasekaran, Manishekaref70c0d2015-10-20 19:54:55 +0530157 tSmeCmd *saved_cmd;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800158
Chandrasekaran, Manishekaref70c0d2015-10-20 19:54:55 +0530159 sms_log(mac, LOG1, FL("%s"), __func__);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800160 param = (struct sir_set_hw_mode_resp *)msg;
161 if (!param) {
162 sms_log(mac, LOGE, FL("HW mode resp param is NULL"));
163 /* Not returning. Need to check if active command list
164 * needs to be freed
165 */
166 }
167
168 entry = csr_ll_peek_head(&mac->sme.smeCmdActiveList,
169 LL_ACCESS_LOCK);
170 if (!entry) {
171 sms_log(mac, LOGE, FL("No cmd found in active list"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530172 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800173 }
174
175 command = GET_BASE_ADDR(entry, tSmeCmd, Link);
176 if (!command) {
177 sms_log(mac, LOGE, FL("Base address is NULL"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530178 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800179 }
180
181 if (e_sme_command_set_hw_mode != command->command) {
182 sms_log(mac, LOGE, FL("Command mismatch!"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530183 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800184 }
185
186 callback = command->u.set_hw_mode_cmd.set_hw_mode_cb;
Chandrasekaran, Manishekaref70c0d2015-10-20 19:54:55 +0530187 reason = command->u.set_hw_mode_cmd.reason;
Chandrasekaran, Manishekarce2172e2016-02-18 16:12:43 +0530188
189 sms_log(mac, LOG1, FL("reason:%d session:%d"),
190 command->u.set_hw_mode_cmd.reason,
191 command->u.set_hw_mode_cmd.session_id);
192
Chandrasekaran, Manishekar4dd215e2016-04-16 18:48:34 -0700193 if (!callback) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800194 sms_log(mac, LOGE, FL("Callback does not exist"));
Chandrasekaran, Manishekar4dd215e2016-04-16 18:48:34 -0700195 goto end;
196 }
197
198 if (!param) {
199 sms_log(mac, LOGE,
200 FL("Callback failed since HW mode params is NULL"));
201 goto end;
202 }
203
204 /* Irrespective of the reason for which the hw mode change request
205 * was issued, the policy manager connection table needs to be updated
206 * with the new vdev-mac id mapping, tx/rx spatial streams etc., if the
207 * set hw mode was successful.
208 */
209 callback(param->status,
210 param->cfgd_hw_mode_index,
211 param->num_vdev_mac_entries,
212 param->vdev_mac_map);
213
214 if (reason == SIR_UPDATE_REASON_HIDDEN_STA) {
215 /* In the case of hidden SSID, connection update
216 * (set hw mode) is done after the scan with reason
217 * code eCsrScanForSsid completes. The connect/failure
218 * needs to be handled after the response of set hw
219 * mode
220 */
221 saved_cmd = (tSmeCmd *)mac->sme.saved_scan_cmd;
222 if (!saved_cmd) {
223 sms_log(mac, LOGP,
224 FL("saved cmd is NULL, Check this"));
225 goto end;
226 }
227 if (param->status == SET_HW_MODE_STATUS_OK) {
228 sms_log(mac, LOG1,
229 FL("search for ssid success"));
230 csr_scan_handle_search_for_ssid(mac,
231 saved_cmd);
232 } else {
233 sms_log(mac, LOG1,
234 FL("search for ssid failure"));
235 csr_scan_handle_search_for_ssid_failure(mac,
236 saved_cmd);
237 }
238 if (saved_cmd->u.roamCmd.pRoamBssEntry)
239 qdf_mem_free(
240 saved_cmd->u.roamCmd.pRoamBssEntry);
241 if (saved_cmd->u.scanCmd.u.scanRequest.SSIDs.SSIDList)
242 qdf_mem_free(saved_cmd->u.scanCmd.u.
243 scanRequest.SSIDs.SSIDList);
244 if (saved_cmd->u.scanCmd.pToRoamProfile)
245 qdf_mem_free(saved_cmd->u.scanCmd.
246 pToRoamProfile);
247 if (saved_cmd) {
248 qdf_mem_free(saved_cmd);
249 saved_cmd = NULL;
250 mac->sme.saved_scan_cmd = NULL;
251 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800252 }
253
Chandrasekaran, Manishekaref70c0d2015-10-20 19:54:55 +0530254end:
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800255 found = csr_ll_remove_entry(&mac->sme.smeCmdActiveList, entry,
256 LL_ACCESS_LOCK);
257 if (found) {
258 /* Now put this command back on the avilable command list */
259 sme_release_command(mac, command);
260 }
261 sme_process_pending_queue(mac);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530262 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800263}
264
265/**
266 * sme_process_hw_mode_trans_ind() - Process HW mode transition indication
267 * @mac: Global MAC pointer
268 * @msg: HW mode transition response
269 *
270 * Processes the HW mode transition indication and invoke the HDD callback
271 * to process further
272 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530273static QDF_STATUS sme_process_hw_mode_trans_ind(tpAniSirGlobal mac,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800274 uint8_t *msg)
275{
276 hw_mode_transition_cb callback = NULL;
277 struct sir_hw_mode_trans_ind *param;
278
279 param = (struct sir_hw_mode_trans_ind *)msg;
280 if (!param) {
281 sms_log(mac, LOGE, FL("HW mode trans ind param is NULL"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530282 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800283 }
284
285 callback = mac->sme.sme_hw_mode_trans_cb;
286 if (callback) {
287 sms_log(mac, LOGE, FL("Calling registered callback..."));
288 callback(param->old_hw_mode_index,
289 param->new_hw_mode_index,
290 param->num_vdev_mac_entries,
291 param->vdev_mac_map);
292 }
293
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530294 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800295}
296
Naveen Rawate7d86052015-11-13 12:01:43 -0800297/**
298 * free_sme_cmds() - This function frees memory allocated for SME commands
299 * @mac_ctx: Pointer to Global MAC structure
300 *
301 * This function frees memory allocated for SME commands
302 *
303 * @Return: void
304 */
305static void free_sme_cmds(tpAniSirGlobal mac_ctx)
306{
307 uint32_t idx;
308 if (NULL == mac_ctx->sme.pSmeCmdBufAddr)
309 return;
310
311 for (idx = 0; idx < mac_ctx->sme.totalSmeCmd; idx++)
Anurag Chouhan600c3a02016-03-01 10:33:54 +0530312 qdf_mem_free(mac_ctx->sme.pSmeCmdBufAddr[idx]);
Naveen Rawate7d86052015-11-13 12:01:43 -0800313
Anurag Chouhan600c3a02016-03-01 10:33:54 +0530314 qdf_mem_free(mac_ctx->sme.pSmeCmdBufAddr);
Naveen Rawate7d86052015-11-13 12:01:43 -0800315 mac_ctx->sme.pSmeCmdBufAddr = NULL;
316}
317
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530318static QDF_STATUS init_sme_cmd_list(tpAniSirGlobal pMac)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800319{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530320 QDF_STATUS status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800321 tSmeCmd *pCmd;
322 uint32_t cmd_idx;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530323 QDF_STATUS qdf_status;
Anurag Chouhan210db072016-02-22 18:42:15 +0530324 qdf_mc_timer_t *cmdTimeoutTimer = NULL;
Naveen Rawate7d86052015-11-13 12:01:43 -0800325 uint32_t sme_cmd_ptr_ary_sz;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800326
327 pMac->sme.totalSmeCmd = SME_TOTAL_COMMAND;
328
329 status = csr_ll_open(pMac->hHdd, &pMac->sme.smeCmdActiveList);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530330 if (!QDF_IS_STATUS_SUCCESS(status))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800331 goto end;
332
333 status = csr_ll_open(pMac->hHdd, &pMac->sme.smeCmdPendingList);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530334 if (!QDF_IS_STATUS_SUCCESS(status))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800335 goto end;
336
337 status = csr_ll_open(pMac->hHdd, &pMac->sme.smeScanCmdActiveList);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530338 if (!QDF_IS_STATUS_SUCCESS(status))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800339 goto end;
340
341 status = csr_ll_open(pMac->hHdd, &pMac->sme.smeScanCmdPendingList);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530342 if (!QDF_IS_STATUS_SUCCESS(status))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800343 goto end;
344
345 status = csr_ll_open(pMac->hHdd, &pMac->sme.smeCmdFreeList);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530346 if (!QDF_IS_STATUS_SUCCESS(status))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800347 goto end;
348
Naveen Rawate7d86052015-11-13 12:01:43 -0800349 /* following pointer contains array of pointers for tSmeCmd* */
350 sme_cmd_ptr_ary_sz = sizeof(void *) * pMac->sme.totalSmeCmd;
Anurag Chouhan600c3a02016-03-01 10:33:54 +0530351 pMac->sme.pSmeCmdBufAddr = qdf_mem_malloc(sme_cmd_ptr_ary_sz);
Naveen Rawate7d86052015-11-13 12:01:43 -0800352 if (NULL == pMac->sme.pSmeCmdBufAddr) {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530353 status = QDF_STATUS_E_NOMEM;
Naveen Rawate7d86052015-11-13 12:01:43 -0800354 goto end;
355 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800356
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530357 status = QDF_STATUS_SUCCESS;
Anurag Chouhan600c3a02016-03-01 10:33:54 +0530358 qdf_mem_set(pMac->sme.pSmeCmdBufAddr, sme_cmd_ptr_ary_sz, 0);
Naveen Rawate7d86052015-11-13 12:01:43 -0800359 for (cmd_idx = 0; cmd_idx < pMac->sme.totalSmeCmd; cmd_idx++) {
360 /*
361 * Since total size of all commands together can be huge chunk
362 * of memory, allocate SME cmd individually. These SME CMDs are
363 * moved between pending and active queues. And these freeing of
364 * these queues just manipulates the list but does not actually
365 * frees SME CMD pointers. Hence store each SME CMD address in
366 * the array, sme.pSmeCmdBufAddr. This will later facilitate
367 * freeing up of all SME CMDs with just a for loop.
368 */
369 pMac->sme.pSmeCmdBufAddr[cmd_idx] =
Anurag Chouhan600c3a02016-03-01 10:33:54 +0530370 qdf_mem_malloc(sizeof(tSmeCmd));
Naveen Rawate7d86052015-11-13 12:01:43 -0800371 if (NULL == pMac->sme.pSmeCmdBufAddr[cmd_idx]) {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530372 status = QDF_STATUS_E_NOMEM;
Naveen Rawate7d86052015-11-13 12:01:43 -0800373 free_sme_cmds(pMac);
374 goto end;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800375 }
Naveen Rawate7d86052015-11-13 12:01:43 -0800376 pCmd = (tSmeCmd *)pMac->sme.pSmeCmdBufAddr[cmd_idx];
377 csr_ll_insert_tail(&pMac->sme.smeCmdFreeList,
378 &pCmd->Link, LL_ACCESS_LOCK);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800379 }
380
381 /* This timer is only to debug the active list command timeout */
382
383 cmdTimeoutTimer =
Anurag Chouhan600c3a02016-03-01 10:33:54 +0530384 (qdf_mc_timer_t *) qdf_mem_malloc(sizeof(qdf_mc_timer_t));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800385 if (cmdTimeoutTimer) {
386 pMac->sme.smeCmdActiveList.cmdTimeoutTimer = cmdTimeoutTimer;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530387 qdf_status =
Anurag Chouhan210db072016-02-22 18:42:15 +0530388 qdf_mc_timer_init(pMac->sme.smeCmdActiveList.
Anurag Chouhan6d760662016-02-20 16:05:43 +0530389 cmdTimeoutTimer, QDF_TIMER_TYPE_SW,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800390 active_list_cmd_timeout_handle, (void *)pMac);
391
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530392 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +0530393 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800394 "Init Timer fail for active list command process time out");
Anurag Chouhan600c3a02016-03-01 10:33:54 +0530395 qdf_mem_free(pMac->sme.smeCmdActiveList.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800396 cmdTimeoutTimer);
397 pMac->sme.smeCmdActiveList.cmdTimeoutTimer = NULL;
398 } else {
399 pMac->sme.smeCmdActiveList.cmdTimeoutDuration =
400 CSR_ACTIVE_LIST_CMD_TIMEOUT_VALUE;
401 }
402 }
403
404end:
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530405 if (!QDF_IS_STATUS_SUCCESS(status))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800406 sms_log(pMac, LOGE, "failed to initialize sme command list:%d\n",
407 status);
408
409 return status;
410}
411
412void sme_release_command(tpAniSirGlobal pMac, tSmeCmd *pCmd)
413{
414 pCmd->command = eSmeNoCommand;
415 csr_ll_insert_tail(&pMac->sme.smeCmdFreeList, &pCmd->Link, LL_ACCESS_LOCK);
416}
417
418static void sme_release_cmd_list(tpAniSirGlobal pMac, tDblLinkList *pList)
419{
420 tListElem *pEntry;
421 tSmeCmd *pCommand;
422
423 while ((pEntry = csr_ll_remove_head(pList, LL_ACCESS_LOCK)) != NULL) {
424 /* TODO: base on command type to call release functions */
425 /* reinitialize different command types so they can be reused */
426 pCommand = GET_BASE_ADDR(pEntry, tSmeCmd, Link);
427 sme_abort_command(pMac, pCommand, true);
428 }
429}
430
431static void purge_sme_cmd_list(tpAniSirGlobal pMac)
432{
433 /* release any out standing commands back to free command list */
434 sme_release_cmd_list(pMac, &pMac->sme.smeCmdPendingList);
435 sme_release_cmd_list(pMac, &pMac->sme.smeCmdActiveList);
436 sme_release_cmd_list(pMac, &pMac->sme.smeScanCmdPendingList);
437 sme_release_cmd_list(pMac, &pMac->sme.smeScanCmdActiveList);
438}
439
440void purge_sme_session_cmd_list(tpAniSirGlobal pMac, uint32_t sessionId,
441 tDblLinkList *pList)
442{
443 /* release any out standing commands back to free command list */
444 tListElem *pEntry, *pNext;
445 tSmeCmd *pCommand;
446 tDblLinkList localList;
447
Anurag Chouhan600c3a02016-03-01 10:33:54 +0530448 qdf_mem_zero(&localList, sizeof(tDblLinkList));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530449 if (!QDF_IS_STATUS_SUCCESS(csr_ll_open(pMac->hHdd, &localList))) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800450 sms_log(pMac, LOGE, FL(" failed to open list"));
451 return;
452 }
453
454 csr_ll_lock(pList);
455 pEntry = csr_ll_peek_head(pList, LL_ACCESS_NOLOCK);
456 while (pEntry != NULL) {
457 pNext = csr_ll_next(pList, pEntry, LL_ACCESS_NOLOCK);
458 pCommand = GET_BASE_ADDR(pEntry, tSmeCmd, Link);
459 if (pCommand->sessionId == sessionId) {
460 if (csr_ll_remove_entry(pList, pEntry, LL_ACCESS_NOLOCK)) {
461 csr_ll_insert_tail(&localList, pEntry,
462 LL_ACCESS_NOLOCK);
463 }
464 }
465 pEntry = pNext;
466 }
467 csr_ll_unlock(pList);
468
469 while ((pEntry = csr_ll_remove_head(&localList, LL_ACCESS_NOLOCK))) {
470 pCommand = GET_BASE_ADDR(pEntry, tSmeCmd, Link);
471 sme_abort_command(pMac, pCommand, true);
472 }
473 csr_ll_close(&localList);
474}
475
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530476static QDF_STATUS free_sme_cmd_list(tpAniSirGlobal pMac)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800477{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530478 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800479
480 purge_sme_cmd_list(pMac);
481 csr_ll_close(&pMac->sme.smeCmdPendingList);
482 csr_ll_close(&pMac->sme.smeCmdActiveList);
483 csr_ll_close(&pMac->sme.smeScanCmdPendingList);
484 csr_ll_close(&pMac->sme.smeScanCmdActiveList);
485 csr_ll_close(&pMac->sme.smeCmdFreeList);
486
487 /*destroy active list command time out timer */
Anurag Chouhan210db072016-02-22 18:42:15 +0530488 qdf_mc_timer_destroy(pMac->sme.smeCmdActiveList.cmdTimeoutTimer);
Anurag Chouhan600c3a02016-03-01 10:33:54 +0530489 qdf_mem_free(pMac->sme.smeCmdActiveList.cmdTimeoutTimer);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800490 pMac->sme.smeCmdActiveList.cmdTimeoutTimer = NULL;
491
Anurag Chouhana37b5b72016-02-21 14:53:42 +0530492 status = qdf_mutex_acquire(&pMac->sme.lkSmeGlobalLock);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530493 if (status != QDF_STATUS_SUCCESS) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800494 sms_log(pMac, LOGE,
495 FL("Failed to acquire the lock status = %d"), status);
496 goto done;
497 }
498
Naveen Rawate7d86052015-11-13 12:01:43 -0800499 free_sme_cmds(pMac);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800500
Anurag Chouhana37b5b72016-02-21 14:53:42 +0530501 status = qdf_mutex_release(&pMac->sme.lkSmeGlobalLock);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530502 if (status != QDF_STATUS_SUCCESS) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800503 sms_log(pMac, LOGE,
504 FL("Failed to release the lock status = %d"), status);
505 }
506done:
507 return status;
508}
509
510void dump_csr_command_info(tpAniSirGlobal pMac, tSmeCmd *pCmd)
511{
512 switch (pCmd->command) {
513 case eSmeCommandScan:
514 sms_log(pMac, LOGE, " scan command reason is %d",
515 pCmd->u.scanCmd.reason);
516 break;
517
518 case eSmeCommandRoam:
519 sms_log(pMac, LOGE, " roam command reason is %d",
520 pCmd->u.roamCmd.roamReason);
521 break;
522
523 case eSmeCommandWmStatusChange:
524 sms_log(pMac, LOGE, " WMStatusChange command type is %d",
525 pCmd->u.wmStatusChangeCmd.Type);
526 break;
527
528 case eSmeCommandSetKey:
529 sms_log(pMac, LOGE, " setKey command auth(%d) enc(%d)",
530 pCmd->u.setKeyCmd.authType, pCmd->u.setKeyCmd.encType);
531 break;
532
533 default:
534 sms_log(pMac, LOGE, " default: Unhandled command %d",
535 pCmd->command);
536 break;
537 }
538}
539
540tSmeCmd *sme_get_command_buffer(tpAniSirGlobal pMac)
541{
542 tSmeCmd *pRetCmd = NULL, *pTempCmd = NULL;
543 tListElem *pEntry;
544 static int sme_command_queue_full;
545
546 pEntry = csr_ll_remove_head(&pMac->sme.smeCmdFreeList, LL_ACCESS_LOCK);
547
548 /* If we can get another MS Msg buffer, then we are ok. Just link */
549 /* the entry onto the linked list. (We are using the linked list */
550 /* to keep track of tfhe message buffers). */
551 if (pEntry) {
552 pRetCmd = GET_BASE_ADDR(pEntry, tSmeCmd, Link);
553 /* reset when free list is available */
554 sme_command_queue_full = 0;
555 } else {
556 int idx = 1;
557
558 /* Cannot change pRetCmd here since it needs to return later. */
559 pEntry =
560 csr_ll_peek_head(&pMac->sme.smeCmdActiveList, LL_ACCESS_LOCK);
561 if (pEntry) {
562 pTempCmd = GET_BASE_ADDR(pEntry, tSmeCmd, Link);
563 }
564 sms_log(pMac, LOGE,
565 "Out of command buffer.... command (0x%X) stuck",
566 (pTempCmd) ? pTempCmd->command : eSmeNoCommand);
567 if (pTempCmd) {
568 if (eSmeCsrCommandMask & pTempCmd->command) {
569 /* CSR command is stuck. See what the reason code is for that command */
570 dump_csr_command_info(pMac, pTempCmd);
571 }
572 } /* if(pTempCmd) */
573
574 /* dump what is in the pending queue */
575 csr_ll_lock(&pMac->sme.smeCmdPendingList);
576 pEntry =
577 csr_ll_peek_head(&pMac->sme.smeCmdPendingList,
578 LL_ACCESS_NOLOCK);
579 while (pEntry && !sme_command_queue_full) {
580 pTempCmd = GET_BASE_ADDR(pEntry, tSmeCmd, Link);
581 /* Print only 1st five commands from pending queue. */
582 if (idx <= 5)
583 sms_log(pMac, LOGE,
584 "Out of command buffer.... SME pending command #%d (0x%X)",
585 idx, pTempCmd->command);
586 idx++;
587 if (eSmeCsrCommandMask & pTempCmd->command) {
588 /* CSR command is stuck. See what the reason code is for that command */
589 dump_csr_command_info(pMac, pTempCmd);
590 }
591 pEntry =
592 csr_ll_next(&pMac->sme.smeCmdPendingList, pEntry,
593 LL_ACCESS_NOLOCK);
594 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800595 csr_ll_unlock(&pMac->sme.smeCmdPendingList);
596
DARAM SUDHAf6c3f972015-05-26 19:26:16 +0530597 idx = 1;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800598 /* There may be some more command in CSR's own pending queue */
599 csr_ll_lock(&pMac->roam.roamCmdPendingList);
600 pEntry =
601 csr_ll_peek_head(&pMac->roam.roamCmdPendingList,
602 LL_ACCESS_NOLOCK);
DARAM SUDHAf6c3f972015-05-26 19:26:16 +0530603 while (pEntry && !sme_command_queue_full) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800604 pTempCmd = GET_BASE_ADDR(pEntry, tSmeCmd, Link);
DARAM SUDHAf6c3f972015-05-26 19:26:16 +0530605 /* Print only 1st five commands from CSR pending queue */
606 if (idx <= 5)
607 sms_log(pMac, LOGE,
608 "Out of command buffer.... "
609 "CSR roamCmdPendingList command #%d (0x%X)",
610 idx, pTempCmd->command);
611 idx++;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800612 dump_csr_command_info(pMac, pTempCmd);
613 pEntry =
614 csr_ll_next(&pMac->roam.roamCmdPendingList, pEntry,
615 LL_ACCESS_NOLOCK);
616 }
DARAM SUDHAf6c3f972015-05-26 19:26:16 +0530617
618 /* Increment static variable so that it prints
619 * pending command only once
620 */
621 sme_command_queue_full++;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800622 csr_ll_unlock(&pMac->roam.roamCmdPendingList);
DARAM SUDHAf6c3f972015-05-26 19:26:16 +0530623
Abhishek Singh5ea86532016-04-27 14:10:53 +0530624 if (pMac->roam.configParam.enable_fatal_event)
625 cds_flush_logs(WLAN_LOG_TYPE_FATAL,
626 WLAN_LOG_INDICATOR_HOST_DRIVER,
627 WLAN_LOG_REASON_SME_OUT_OF_CMD_BUF,
628 false,
629 pMac->sme.enableSelfRecovery ? true : false);
630 else if (pMac->sme.enableSelfRecovery)
631 cds_trigger_recovery();
632 else
633 QDF_BUG(0);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800634 }
635
636 /* memset to zero */
637 if (pRetCmd) {
Anurag Chouhan600c3a02016-03-01 10:33:54 +0530638 qdf_mem_set((uint8_t *)&pRetCmd->command,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800639 sizeof(pRetCmd->command), 0);
Anurag Chouhan600c3a02016-03-01 10:33:54 +0530640 qdf_mem_set((uint8_t *)&pRetCmd->sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800641 sizeof(pRetCmd->sessionId), 0);
Anurag Chouhan600c3a02016-03-01 10:33:54 +0530642 qdf_mem_set((uint8_t *)&pRetCmd->u, sizeof(pRetCmd->u), 0);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800643 }
644
645 return pRetCmd;
646}
647
648void sme_push_command(tpAniSirGlobal pMac, tSmeCmd *pCmd, bool fHighPriority)
649{
650 if (!SME_IS_START(pMac)) {
651 sms_log(pMac, LOGE, FL("Sme in stop state"));
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +0530652 QDF_ASSERT(0);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800653 return;
654 }
655
656 if (fHighPriority) {
657 csr_ll_insert_head(&pMac->sme.smeCmdPendingList, &pCmd->Link,
658 LL_ACCESS_LOCK);
659 } else {
660 csr_ll_insert_tail(&pMac->sme.smeCmdPendingList, &pCmd->Link,
661 LL_ACCESS_LOCK);
662 }
663
664 /* process the command queue... */
665 sme_process_pending_queue(pMac);
666
667 return;
668}
669
670/* For commands that need to do extra cleanup. */
671static void sme_abort_command(tpAniSirGlobal pMac, tSmeCmd *pCommand,
672 bool fStopping)
673{
674 if (eSmePmcCommandMask & pCommand->command) {
675 sms_log(pMac, LOG1,
676 "No need to process PMC commands");
677 return;
678 }
679 if (eSmeCsrCommandMask & pCommand->command) {
680 csr_abort_command(pMac, pCommand, fStopping);
681 return;
682 }
683 switch (pCommand->command) {
684 case eSmeCommandRemainOnChannel:
685 if (NULL != pCommand->u.remainChlCmd.callback) {
686 remainOnChanCallback callback =
687 pCommand->u.remainChlCmd.callback;
688 /* process the msg */
689 if (callback) {
690 callback(pMac, pCommand->u.remainChlCmd.
691 callbackCtx, eCSR_SCAN_ABORT,
692 pCommand->u.remainChlCmd.scan_id);
693 }
694 }
695 sme_release_command(pMac, pCommand);
696 break;
697 default:
698 sme_release_command(pMac, pCommand);
699 break;
700 }
701
702}
703
704tListElem *csr_get_cmd_to_process(tpAniSirGlobal pMac, tDblLinkList *pList,
705 uint8_t sessionId, bool fInterlocked)
706{
707 tListElem *pCurEntry = NULL;
708 tSmeCmd *pCommand;
709
710 /* Go through the list and return the command whose session id is not
711 * matching with the current ongoing scan cmd sessionId */
712 pCurEntry = csr_ll_peek_head(pList, LL_ACCESS_LOCK);
713 while (pCurEntry) {
714 pCommand = GET_BASE_ADDR(pCurEntry, tSmeCmd, Link);
715 if (pCommand->sessionId != sessionId) {
716 sms_log(pMac, LOG1,
717 "selected the command with different sessionId");
718 return pCurEntry;
719 }
720
721 pCurEntry = csr_ll_next(pList, pCurEntry, fInterlocked);
722 }
723
724 sms_log(pMac, LOG1, "No command pending with different sessionId");
725 return NULL;
726}
727
728bool sme_process_scan_queue(tpAniSirGlobal pMac)
729{
730 tListElem *pEntry;
731 tSmeCmd *pCommand;
732 tListElem *pSmeEntry = NULL;
733 tSmeCmd *pSmeCommand = NULL;
734 bool status = true;
735
736 if ((!csr_ll_is_list_empty(&pMac->sme.smeCmdActiveList,
737 LL_ACCESS_LOCK))) {
738 pSmeEntry = csr_ll_peek_head(&pMac->sme.smeCmdActiveList,
739 LL_ACCESS_LOCK);
740 if (pSmeEntry)
741 pSmeCommand = GET_BASE_ADDR(pSmeEntry, tSmeCmd, Link);
742 }
743 csr_ll_lock(&pMac->sme.smeScanCmdActiveList);
744 if (csr_ll_is_list_empty(&pMac->sme.smeScanCmdPendingList,
745 LL_ACCESS_LOCK))
746 goto end;
747 pEntry = csr_ll_peek_head(&pMac->sme.smeScanCmdPendingList,
748 LL_ACCESS_LOCK);
749 if (!pEntry)
750 goto end;
751
752 sms_log(pMac, LOGE,
753 FL("scan_count in active scanlist %d "),
754 pMac->sme.smeScanCmdActiveList.Count);
755
756 pCommand = GET_BASE_ADDR(pEntry, tSmeCmd, Link);
757 if (pSmeCommand != NULL) {
758 /*
759 * if scan is running on one interface and SME receives
760 * the next command on the same interface then
761 * dont the allow the command to be queued to
762 * smeCmdPendingList. If next scan is allowed on
763 * the same interface the CSR state machine will
764 * get screwed up.
765 */
766 if (pSmeCommand->sessionId == pCommand->sessionId) {
767 status = false;
768 goto end;
769 }
770 }
771 /*
772 * We cannot execute any command in wait-for-key state until setKey is
773 * through.
774 */
775 if (CSR_IS_WAIT_FOR_KEY(pMac, pCommand->sessionId)) {
776 if (!CSR_IS_SET_KEY_COMMAND(pCommand)) {
777 sms_log(pMac, LOGE,
778 FL("Can't process cmd(%d), waiting for key"),
779 pCommand->command);
780 status = false;
781 goto end;
782 }
783 }
784 if (csr_ll_remove_entry(&pMac->sme.smeScanCmdPendingList, pEntry,
785 LL_ACCESS_LOCK)) {
786 csr_ll_insert_head(&pMac->sme.smeScanCmdActiveList,
787 &pCommand->Link, LL_ACCESS_NOLOCK);
788 switch (pCommand->command) {
789 case eSmeCommandScan:
790 sms_log(pMac, LOG1, FL("Processing scan offload cmd."));
Anurag Chouhan210db072016-02-22 18:42:15 +0530791 qdf_mc_timer_start(&pCommand->u.scanCmd.csr_scan_timer,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800792 CSR_ACTIVE_SCAN_LIST_CMD_TIMEOUT);
793 csr_process_scan_command(pMac, pCommand);
794 break;
795 case eSmeCommandRemainOnChannel:
796 sms_log(pMac, LOG1,
797 FL("Processing remain on channel offload cmd"));
798 p2p_process_remain_on_channel_cmd(pMac, pCommand);
799 break;
800 default:
801 sms_log(pMac, LOGE,
802 FL("Wrong cmd enqueued to ScanCmdPendingList"));
803 pEntry = csr_ll_remove_head(
804 &pMac->sme.smeScanCmdActiveList,
805 LL_ACCESS_NOLOCK);
806 pCommand = GET_BASE_ADDR(pEntry, tSmeCmd, Link);
807 sme_release_command(pMac, pCommand);
808 break;
809 }
810 }
811end:
812 csr_ll_unlock(&pMac->sme.smeScanCmdActiveList);
813 return status;
814}
815
816/**
817 * sme_process_command() - processes SME commnd
818 * @mac_ctx: mac global context
819 *
820 * This function is called by sme_process_pending_queue() in a while loop
821 *
822 * Return: true indicates that caller function can proceed to next cmd
823 * false otherwise.
824 */
825bool sme_process_command(tpAniSirGlobal pMac)
826{
827 bool fContinue = false;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530828 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800829 tListElem *pEntry;
830 tSmeCmd *pCommand;
831 tListElem *pSmeEntry;
832 tSmeCmd *pSmeCommand;
833
834 /*
835 * if the ActiveList is empty, then nothing is active so we can process
836 * a pending command...
837 * alwasy lock active list before locking pending list
838 */
839 csr_ll_lock(&pMac->sme.smeCmdActiveList);
840 if (!csr_ll_is_list_empty(&pMac->sme.smeCmdActiveList,
841 LL_ACCESS_NOLOCK)) {
842 csr_ll_unlock(&pMac->sme.smeCmdActiveList);
843 goto process_scan_q;
844 }
845
846 if (csr_ll_is_list_empty(&pMac->sme.smeCmdPendingList,
847 LL_ACCESS_LOCK)) {
848 /* No command waiting */
849 csr_ll_unlock(&pMac->sme.smeCmdActiveList);
850 goto process_scan_q;
851 }
852
853 /*
854 * If scan command is pending in the smeScanCmdActive list then pick the
855 * command from smeCmdPendingList which is not matching with the scan
856 * command session id. At any point of time only one command will be
857 * allowed on a single session.
858 */
859 if (!csr_ll_is_list_empty(
860 &pMac->sme.smeScanCmdActiveList, LL_ACCESS_LOCK)) {
861 pSmeEntry = csr_ll_peek_head(&pMac->sme.smeScanCmdActiveList,
862 LL_ACCESS_LOCK);
863 if (pSmeEntry) {
864 pSmeCommand = GET_BASE_ADDR(pSmeEntry, tSmeCmd, Link);
865 pEntry = csr_get_cmd_to_process(pMac,
866 &pMac->sme.smeCmdPendingList,
867 pSmeCommand->sessionId,
868 LL_ACCESS_LOCK);
869 goto sme_process_cmd;
870 }
871 }
872
873 /* Peek the command */
874 pEntry = csr_ll_peek_head(&pMac->sme.smeCmdPendingList, LL_ACCESS_LOCK);
875sme_process_cmd:
876 if (!pEntry) {
877 csr_ll_unlock(&pMac->sme.smeCmdActiveList);
878 goto process_scan_q;
879 }
880 pCommand = GET_BASE_ADDR(pEntry, tSmeCmd, Link);
881 /*
882 * Allow only disconnect command in wait-for-key state until setKey is
883 * through.
884 */
885 if (CSR_IS_WAIT_FOR_KEY(pMac, pCommand->sessionId)
886 && !CSR_IS_DISCONNECT_COMMAND(pCommand)
887 && !CSR_IS_SET_KEY_COMMAND(pCommand)) {
888 if (CSR_IS_CLOSE_SESSION_COMMAND(pCommand)) {
889 tSmeCmd *sme_cmd = NULL;
890
891 sms_log(pMac, LOGE,
892 FL("SessionId %d: close session command issued while waiting for key, issue disconnect first"),
893 pCommand->sessionId);
894 status = csr_prepare_disconnect_command(pMac,
895 pCommand->sessionId, &sme_cmd);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530896 if (status == QDF_STATUS_SUCCESS && sme_cmd) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800897 csr_ll_lock(&pMac->sme.smeCmdPendingList);
898 csr_ll_insert_head(&pMac->sme.smeCmdPendingList,
899 &sme_cmd->Link, LL_ACCESS_NOLOCK);
900 pEntry = csr_ll_peek_head(
901 &pMac->sme.smeCmdPendingList,
902 LL_ACCESS_NOLOCK);
903 csr_ll_unlock(&pMac->sme.smeCmdPendingList);
904 goto sme_process_cmd;
905 }
906 }
907
908 csr_ll_unlock(&pMac->sme.smeCmdActiveList);
909 sms_log(pMac, LOGE,
910 FL("SessionId %d: Can't process cmd(%d), waiting for key"),
911 pCommand->sessionId, pCommand->command);
912 fContinue = false;
913 goto process_scan_q;
914 }
915
916 if (!csr_ll_remove_entry(&pMac->sme.smeCmdPendingList, pEntry,
917 LL_ACCESS_LOCK)) {
918 /* This is odd. Some one else pull off the command. */
919 csr_ll_unlock(&pMac->sme.smeCmdActiveList);
920 goto process_scan_q;
921 }
922 /* we can reuse the pCommand. Insert the command onto the ActiveList */
923 csr_ll_insert_head(&pMac->sme.smeCmdActiveList, &pCommand->Link,
924 LL_ACCESS_NOLOCK);
925 /* .... and process the command. */
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +0530926 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_COMMAND,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800927 pCommand->sessionId, pCommand->command));
928
929 switch (pCommand->command) {
930 case eSmeCommandScan:
931 csr_ll_unlock(&pMac->sme.smeCmdActiveList);
932 status = csr_process_scan_command(pMac, pCommand);
933 break;
934 case eSmeCommandRoam:
935 csr_ll_unlock(&pMac->sme.smeCmdActiveList);
936 status = csr_roam_process_command(pMac, pCommand);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530937 if (!QDF_IS_STATUS_SUCCESS(status)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800938 && csr_ll_remove_entry(&pMac->sme.smeCmdActiveList,
939 &pCommand->Link, LL_ACCESS_LOCK))
940 csr_release_command_roam(pMac, pCommand);
941 break;
942 case eSmeCommandWmStatusChange:
943 csr_ll_unlock(&pMac->sme.smeCmdActiveList);
944 csr_roam_process_wm_status_change_command(pMac, pCommand);
945 break;
946 case eSmeCommandSetKey:
947 csr_ll_unlock(&pMac->sme.smeCmdActiveList);
948 status = csr_roam_process_set_key_command(pMac, pCommand);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530949 if (!QDF_IS_STATUS_SUCCESS(status)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800950 && csr_ll_remove_entry(&pMac->sme.smeCmdActiveList,
951 &pCommand->Link, LL_ACCESS_LOCK)) {
952 csr_release_command_set_key(pMac, pCommand);
953 }
954 break;
955 case eSmeCommandAddStaSession:
956 csr_ll_unlock(&pMac->sme.smeCmdActiveList);
957 csr_process_add_sta_session_command(pMac, pCommand);
958 break;
Deepak Dhamdhere0f076bd2016-06-02 11:29:21 -0700959 case eSmeCommandNdpInitiatorRequest:
960 csr_ll_unlock(&pMac->sme.smeCmdActiveList);
961 if (csr_process_ndp_initiator_request(pMac, pCommand) !=
962 QDF_STATUS_SUCCESS)
963 if (csr_ll_remove_entry(
964 &pMac->sme.smeCmdActiveList,
965 &pCommand->Link, LL_ACCESS_LOCK))
966 csr_release_command(pMac, pCommand);
Abhishek Singh4fef7472016-06-06 11:36:03 -0700967 break;
968 case eSmeCommandNdpResponderRequest:
969 csr_ll_unlock(&pMac->sme.smeCmdActiveList);
970 status = csr_process_ndp_responder_request(pMac, pCommand);
971 if (status != QDF_STATUS_SUCCESS) {
972 if (csr_ll_remove_entry(&pMac->sme.smeCmdActiveList,
Naveen Rawatf28315c2016-06-29 18:06:02 -0700973 &pCommand->Link, LL_ACCESS_LOCK))
974 csr_release_command(pMac, pCommand);
975 }
976 break;
977 case eSmeCommandNdpDataEndInitiatorRequest:
978 csr_ll_unlock(&pMac->sme.smeCmdActiveList);
979 status = csr_process_ndp_data_end_request(pMac, pCommand);
980 if (status != QDF_STATUS_SUCCESS) {
981 if (csr_ll_remove_entry(&pMac->sme.smeCmdActiveList,
982 &pCommand->Link, LL_ACCESS_LOCK))
Abhishek Singh4fef7472016-06-06 11:36:03 -0700983 csr_release_command(pMac, pCommand);
984 }
985 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800986 case eSmeCommandDelStaSession:
987 csr_ll_unlock(&pMac->sme.smeCmdActiveList);
988 csr_process_del_sta_session_command(pMac, pCommand);
989 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800990 case eSmeCommandRemainOnChannel:
991 csr_ll_unlock(&pMac->sme.smeCmdActiveList);
992 p2p_process_remain_on_channel_cmd(pMac, pCommand);
993 break;
994 /*
995 * Treat standby differently here because caller may not be able
996 * to handle the failure so we do our best here
997 */
998 case eSmeCommandEnterStandby:
999 break;
1000 case eSmeCommandAddTs:
1001 case eSmeCommandDelTs:
1002 csr_ll_unlock(&pMac->sme.smeCmdActiveList);
1003#ifndef WLAN_MDM_CODE_REDUCTION_OPT
1004 fContinue = qos_process_command(pMac, pCommand);
1005 if (fContinue && csr_ll_remove_entry(
1006 &pMac->sme.smeCmdActiveList,
1007 &pCommand->Link, LL_ACCESS_NOLOCK)) {
1008 /* The command failed, remove it */
1009 qos_release_command(pMac, pCommand);
1010 }
1011#endif
1012 break;
1013#ifdef FEATURE_WLAN_TDLS
1014 case eSmeCommandTdlsSendMgmt:
1015 case eSmeCommandTdlsAddPeer:
1016 case eSmeCommandTdlsDelPeer:
1017 case eSmeCommandTdlsLinkEstablish:
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301018 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001019 FL("sending TDLS Command 0x%x to PE"),
1020 pCommand->command);
1021 csr_ll_unlock(&pMac->sme.smeCmdActiveList);
1022 status = csr_tdls_process_cmd(pMac, pCommand);
1023 break;
1024#endif
1025 case e_sme_command_set_hw_mode:
1026 csr_ll_unlock(&pMac->sme.smeCmdActiveList);
1027 csr_process_set_hw_mode(pMac, pCommand);
1028 break;
1029 case e_sme_command_nss_update:
1030 csr_ll_unlock(&pMac->sme.smeCmdActiveList);
1031 csr_process_nss_update_req(pMac, pCommand);
1032 break;
1033 case e_sme_command_set_dual_mac_config:
1034 csr_ll_unlock(&pMac->sme.smeCmdActiveList);
1035 csr_process_set_dual_mac_config(pMac, pCommand);
1036 break;
Archana Ramachandrana20ef812015-11-13 16:12:13 -08001037 case e_sme_command_set_antenna_mode:
1038 csr_ll_unlock(&pMac->sme.smeCmdActiveList);
1039 csr_process_set_antenna_mode(pMac, pCommand);
1040 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001041 default:
1042 /* something is wrong */
1043 /* remove it from the active list */
1044 sms_log(pMac, LOGE, FL("unknown command %d"),
1045 pCommand->command);
1046 pEntry = csr_ll_remove_head(&pMac->sme.smeCmdActiveList,
1047 LL_ACCESS_NOLOCK);
1048 csr_ll_unlock(&pMac->sme.smeCmdActiveList);
1049 pCommand = GET_BASE_ADDR(pEntry, tSmeCmd, Link);
1050 sme_release_command(pMac, pCommand);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301051 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001052 break;
1053 }
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301054 if (!QDF_IS_STATUS_SUCCESS(status))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001055 fContinue = true;
1056process_scan_q:
1057 if (!(sme_process_scan_queue(pMac)))
1058 fContinue = false;
1059 return fContinue;
1060}
1061
1062void sme_process_pending_queue(tpAniSirGlobal pMac)
1063{
1064 while (sme_process_command(pMac))
1065 ;
1066}
1067
1068bool sme_command_pending(tpAniSirGlobal pMac)
1069{
1070 return !csr_ll_is_list_empty(&pMac->sme.smeCmdActiveList, LL_ACCESS_NOLOCK)
1071 || !csr_ll_is_list_empty(&pMac->sme.smeCmdPendingList,
1072 LL_ACCESS_NOLOCK);
1073}
1074
1075/* Global APIs */
1076
1077/**
1078 * sme_open() - Initialze all SME modules and put them at idle state
1079 * @hHal: The handle returned by mac_open
1080 *
1081 * The function initializes each module inside SME, PMC, CSR, etc. Upon
1082 * successfully return, all modules are at idle state ready to start.
1083 * smeOpen must be called before any other SME APIs can be involved.
1084 * smeOpen must be called after mac_open.
1085 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301086 * Return: QDF_STATUS_SUCCESS - SME is successfully initialized.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001087 * Other status means SME is failed to be initialized
1088 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301089QDF_STATUS sme_open(tHalHandle hHal)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001090{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301091 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001092 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001093
1094 pMac->sme.state = SME_STATE_STOP;
Anurag Chouhan6d760662016-02-20 16:05:43 +05301095 pMac->sme.currDeviceMode = QDF_STA_MODE;
Anurag Chouhana37b5b72016-02-21 14:53:42 +05301096 if (!QDF_IS_STATUS_SUCCESS(qdf_mutex_create(
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001097 &pMac->sme.lkSmeGlobalLock))) {
1098 sms_log(pMac, LOGE, FL("sme_open failed init lock"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301099 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001100 }
1101 status = csr_open(pMac);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301102 if (!QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001103 sms_log(pMac, LOGE, FL("csr_open failed, status=%d"), status);
1104 return status;
1105 }
1106
1107 status = sme_ps_open(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301108 if (!QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001109 sms_log(pMac, LOGE,
1110 FL("sme_ps_open failed during initialization with status=%d"),
1111 status);
1112 return status;
1113 }
1114#ifdef FEATURE_WLAN_TDLS
1115 pMac->is_tdls_power_save_prohibited = 0;
1116#endif
1117
1118#ifndef WLAN_MDM_CODE_REDUCTION_OPT
1119 status = sme_qos_open(pMac);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301120 if (!QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001121 sms_log(pMac, LOGE, FL("Qos open, status=%d"), status);
1122 return status;
1123 }
1124#endif
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001125 status = init_sme_cmd_list(pMac);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301126 if (!QDF_IS_STATUS_SUCCESS(status))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001127 return status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001128
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001129 status = rrm_open(pMac);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301130 if (!QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001131 sms_log(pMac, LOGE, FL("rrm_open failed, status=%d"), status);
1132 return status;
1133 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001134 sme_p2p_open(pMac);
1135 sme_trace_init(pMac);
1136 return status;
1137}
1138
1139/*
1140 * sme_init_chan_list, triggers channel setup based on country code.
1141 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301142QDF_STATUS sme_init_chan_list(tHalHandle hal, uint8_t *alpha2,
Amar Singhala297bfa2015-10-15 15:07:29 -07001143 enum country_src cc_src)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001144{
1145 tpAniSirGlobal pmac = PMAC_STRUCT(hal);
1146
Amar Singhala297bfa2015-10-15 15:07:29 -07001147 if ((cc_src == SOURCE_USERSPACE) &&
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001148 (pmac->roam.configParam.fSupplicantCountryCodeHasPriority)) {
1149 pmac->roam.configParam.Is11dSupportEnabled = false;
1150 }
1151
1152 return csr_init_chan_list(pmac, alpha2);
1153}
1154
1155/*--------------------------------------------------------------------------
1156
1157 \brief sme_set11dinfo() - Set the 11d information about valid channels
1158 and there power using information from nvRAM
1159 This function is called only for AP.
1160
1161 This is a synchronous call
1162
1163 \param hHal - The handle returned by mac_open.
1164 \Param pSmeConfigParams - a pointer to a caller allocated object of
1165 typedef struct _smeConfigParams.
1166
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301167 \return QDF_STATUS_SUCCESS - SME update the config parameters successfully.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001168
1169 Other status means SME is failed to update the config parameters.
1170 \sa
1171 --------------------------------------------------------------------------*/
1172
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301173QDF_STATUS sme_set11dinfo(tHalHandle hHal, tpSmeConfigParams pSmeConfigParams)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001174{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301175 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001176 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
1177
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301178 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001179 TRACE_CODE_SME_RX_HDD_MSG_SET_11DINFO, NO_SESSION, 0));
1180 if (NULL == pSmeConfigParams) {
1181 sms_log(pMac, LOGE,
1182 "Empty config param structure for SME, nothing to update");
1183 return status;
1184 }
1185
1186 status = csr_set_channels(hHal, &pSmeConfigParams->csrConfig);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301187 if (!QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001188 sms_log(pMac, LOGE,
1189 "csr_change_default_config_param failed with status=%d",
1190 status);
1191 }
1192 return status;
1193}
1194
1195/**
1196 * sme_set_scan_disable() - Dynamically enable/disable scan
1197 * @h_hal: Handle to HAL
1198 *
1199 * This command gives the user an option to dynamically
1200 * enable or disable scans.
1201 *
1202 * Return: None
1203 */
1204void sme_set_scan_disable(tHalHandle h_hal, int value)
1205{
1206 tpAniSirGlobal mac_ctx = PMAC_STRUCT(h_hal);
1207 mac_ctx->lim.scan_disabled = value;
1208 sms_log(mac_ctx, LOG1, FL("value=%d"), value);
1209}
1210/*--------------------------------------------------------------------------
1211
1212 \brief sme_get_soft_ap_domain() - Get the current regulatory domain of softAp.
1213
1214 This is a synchronous call
1215
1216 \param hHal - The handle returned by HostapdAdapter.
1217 \Param v_REGDOMAIN_t - The current Regulatory Domain requested for SoftAp.
1218
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301219 \return QDF_STATUS_SUCCESS - SME successfully completed the request.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001220
1221 Other status means, failed to get the current regulatory domain.
1222 \sa
1223 --------------------------------------------------------------------------*/
1224
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301225QDF_STATUS sme_get_soft_ap_domain(tHalHandle hHal, v_REGDOMAIN_t *domainIdSoftAp)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001226{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301227 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001228 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
1229
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301230 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001231 TRACE_CODE_SME_RX_HDD_MSG_GET_SOFTAP_DOMAIN,
1232 NO_SESSION, 0));
1233 if (NULL == domainIdSoftAp) {
1234 sms_log(pMac, LOGE, "Uninitialized domain Id");
1235 return status;
1236 }
1237
1238 *domainIdSoftAp = pMac->scan.domainIdCurrent;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301239 status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001240
1241 return status;
1242}
1243
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301244QDF_STATUS sme_set_reg_info(tHalHandle hHal, uint8_t *apCntryCode)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001245{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301246 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001247 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
1248
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301249 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001250 TRACE_CODE_SME_RX_HDD_MSG_SET_REGINFO, NO_SESSION, 0));
1251 if (NULL == apCntryCode) {
1252 sms_log(pMac, LOGE, "Empty Country Code, nothing to update");
1253 return status;
1254 }
1255
1256 status = csr_set_reg_info(hHal, apCntryCode);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301257 if (!QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001258 sms_log(pMac, LOGE, "csr_set_reg_info failed with status=%d",
1259 status);
1260 }
1261 return status;
1262}
1263
Krunal Sonie3531942016-04-12 17:43:53 -07001264/**
1265 * sme_update_fine_time_measurement_capab() - Update the FTM capabitlies from
1266 * incoming val
1267 * @hal: Handle for Hal layer
1268 * @val: New FTM capability value
1269 *
1270 * Return: None
1271 */
1272void sme_update_fine_time_measurement_capab(tHalHandle hal, uint32_t val)
1273{
1274 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
1275 mac_ctx->fine_time_meas_cap = val;
1276
1277 if (val == 0) {
1278 mac_ctx->rrm.rrmPEContext.rrmEnabledCaps.fine_time_meas_rpt = 0;
1279 ((tpRRMCaps)mac_ctx->rrm.rrmSmeContext.
1280 rrmConfig.rm_capability)->fine_time_meas_rpt = 0;
1281 } else {
1282 mac_ctx->rrm.rrmPEContext.rrmEnabledCaps.fine_time_meas_rpt = 1;
1283 ((tpRRMCaps)mac_ctx->rrm.rrmSmeContext.
1284 rrmConfig.rm_capability)->fine_time_meas_rpt = 1;
1285 }
1286}
1287
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001288/*--------------------------------------------------------------------------
1289
1290 \brief sme_update_config() - Change configurations for all SME moduels
1291
1292 The function updates some configuration for modules in SME, CSR, etc
1293 during SMEs close open sequence.
1294
1295 Modules inside SME apply the new configuration at the next transaction.
1296
1297 This is a synchronous call
1298
1299 \param hHal - The handle returned by mac_open.
1300 \Param pSmeConfigParams - a pointer to a caller allocated object of
1301 typedef struct _smeConfigParams.
1302
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301303 \return QDF_STATUS_SUCCESS - SME update the config parameters successfully.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001304
1305 Other status means SME is failed to update the config parameters.
1306 \sa
1307
1308 --------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301309QDF_STATUS sme_update_config(tHalHandle hHal, tpSmeConfigParams pSmeConfigParams)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001310{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301311 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001312 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
1313
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301314 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001315 TRACE_CODE_SME_RX_HDD_MSG_UPDATE_CONFIG, NO_SESSION,
1316 0));
1317 if (NULL == pSmeConfigParams) {
1318 sms_log(pMac, LOGE,
1319 "Empty config param structure for SME, nothing to update");
1320 return status;
1321 }
1322
1323 status =
1324 csr_change_default_config_param(pMac, &pSmeConfigParams->csrConfig);
1325
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301326 if (!QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001327 sms_log(pMac, LOGE,
1328 "csr_change_default_config_param failed with status=%d",
1329 status);
1330 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001331 status =
1332 rrm_change_default_config_param(hHal, &pSmeConfigParams->rrmConfig);
1333
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301334 if (!QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001335 sms_log(pMac, LOGE,
1336 "rrm_change_default_config_param failed with status=%d",
1337 status);
1338 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001339 /* For SOC, CFG is set before start */
1340 /* We don't want to apply global CFG in connect state because that may cause some side affect */
1341 if (csr_is_all_session_disconnected(pMac)) {
1342 csr_set_global_cfgs(pMac);
1343 }
1344
1345 /*
1346 * If scan offload is enabled then lim has allow the sending of
1347 * scan request to firmware even in powersave mode. The firmware has
1348 * to take care of exiting from power save mode
1349 */
1350 status = sme_cfg_set_int(hHal, WNI_CFG_SCAN_IN_POWERSAVE, true);
1351
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301352 if (QDF_STATUS_SUCCESS != status) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301353 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001354 "Could not pass on WNI_CFG_SCAN_IN_POWERSAVE to CFG");
1355 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001356 return status;
1357}
1358
1359/**
1360 * sme_update_roam_params() - Store/Update the roaming params
1361 * @hal: Handle for Hal layer
1362 * @session_id: SME Session ID
1363 * @roam_params_src: The source buffer to copy
1364 * @update_param: Type of parameter to be updated
1365 *
1366 * Return: Return the status of the updation.
1367 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301368QDF_STATUS sme_update_roam_params(tHalHandle hal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001369 uint8_t session_id, struct roam_ext_params roam_params_src,
1370 int update_param)
1371{
1372 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
1373 struct roam_ext_params *roam_params_dst;
1374 uint8_t i;
1375
1376 roam_params_dst = &mac_ctx->roam.configParam.roam_params;
1377 switch (update_param) {
1378 case REASON_ROAM_EXT_SCAN_PARAMS_CHANGED:
1379 roam_params_dst->raise_rssi_thresh_5g =
1380 roam_params_src.raise_rssi_thresh_5g;
1381 roam_params_dst->drop_rssi_thresh_5g =
1382 roam_params_src.drop_rssi_thresh_5g;
1383 roam_params_dst->raise_factor_5g =
1384 roam_params_src.raise_factor_5g;
1385 roam_params_dst->drop_factor_5g =
1386 roam_params_src.drop_factor_5g;
1387 roam_params_dst->max_raise_rssi_5g =
1388 roam_params_src.max_raise_rssi_5g;
1389 roam_params_dst->max_drop_rssi_5g =
1390 roam_params_src.max_drop_rssi_5g;
1391 roam_params_dst->alert_rssi_threshold =
1392 roam_params_src.alert_rssi_threshold;
1393 roam_params_dst->is_5g_pref_enabled = true;
1394 break;
1395 case REASON_ROAM_SET_SSID_ALLOWED:
Anurag Chouhan600c3a02016-03-01 10:33:54 +05301396 qdf_mem_set(&roam_params_dst->ssid_allowed_list, 0,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001397 sizeof(tSirMacSSid) * MAX_SSID_ALLOWED_LIST);
1398 roam_params_dst->num_ssid_allowed_list =
1399 roam_params_src.num_ssid_allowed_list;
1400 for (i = 0; i < roam_params_dst->num_ssid_allowed_list; i++) {
1401 roam_params_dst->ssid_allowed_list[i].length =
1402 roam_params_src.ssid_allowed_list[i].length;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05301403 qdf_mem_copy(roam_params_dst->ssid_allowed_list[i].ssId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001404 roam_params_src.ssid_allowed_list[i].ssId,
1405 roam_params_dst->ssid_allowed_list[i].length);
1406 }
1407 break;
1408 case REASON_ROAM_SET_FAVORED_BSSID:
Anurag Chouhan600c3a02016-03-01 10:33:54 +05301409 qdf_mem_set(&roam_params_dst->bssid_favored, 0,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001410 sizeof(tSirMacAddr) * MAX_BSSID_FAVORED);
1411 roam_params_dst->num_bssid_favored =
1412 roam_params_src.num_bssid_favored;
1413 for (i = 0; i < roam_params_dst->num_bssid_favored; i++) {
Anurag Chouhan600c3a02016-03-01 10:33:54 +05301414 qdf_mem_copy(&roam_params_dst->bssid_favored[i],
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001415 &roam_params_src.bssid_favored[i],
1416 sizeof(tSirMacAddr));
1417 roam_params_dst->bssid_favored_factor[i] =
1418 roam_params_src.bssid_favored_factor[i];
1419 }
1420 break;
1421 case REASON_ROAM_SET_BLACKLIST_BSSID:
Anurag Chouhan600c3a02016-03-01 10:33:54 +05301422 qdf_mem_set(&roam_params_dst->bssid_avoid_list, 0,
Anurag Chouhan6d760662016-02-20 16:05:43 +05301423 QDF_MAC_ADDR_SIZE * MAX_BSSID_AVOID_LIST);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001424 roam_params_dst->num_bssid_avoid_list =
1425 roam_params_src.num_bssid_avoid_list;
1426 for (i = 0; i < roam_params_dst->num_bssid_avoid_list; i++) {
Anurag Chouhanc5548422016-02-24 18:33:27 +05301427 qdf_copy_macaddr(&roam_params_dst->bssid_avoid_list[i],
Srinivas Girigowdab0532392015-11-24 11:50:16 -08001428 &roam_params_src.bssid_avoid_list[i]);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001429 }
1430 break;
1431 case REASON_ROAM_GOOD_RSSI_CHANGED:
1432 roam_params_dst->good_rssi_roam =
1433 roam_params_src.good_rssi_roam;
1434 break;
1435 default:
1436 break;
1437 }
1438 csr_roam_offload_scan(mac_ctx, session_id, ROAM_SCAN_OFFLOAD_UPDATE_CFG,
1439 update_param);
1440 return 0;
1441}
1442
1443#ifdef WLAN_FEATURE_GTK_OFFLOAD
1444void sme_process_get_gtk_info_rsp(tHalHandle hHal,
1445 tpSirGtkOffloadGetInfoRspParams
1446 pGtkOffloadGetInfoRsp)
1447{
1448 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
1449
1450 if (NULL == pMac) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301451 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_FATAL,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001452 "%s: pMac is null", __func__);
1453 return;
1454 }
1455 if (pMac->sme.gtk_offload_get_info_cb == NULL) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301456 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001457 "%s: HDD callback is null", __func__);
1458 return;
1459 }
1460 pMac->sme.gtk_offload_get_info_cb(
1461 pMac->sme.gtk_offload_get_info_cb_context,
1462 pGtkOffloadGetInfoRsp);
1463}
1464#endif
1465
1466/*--------------------------------------------------------------------------
1467
1468 \fn - sme_process_ready_to_suspend
1469 \brief - On getting ready to suspend indication, this function calls
1470 callback registered (HDD callbacks) with SME to inform
1471 ready to suspend indication.
1472
1473 \param hHal - Handle returned by mac_open.
1474 pReadyToSuspend - Parameter received along with ready to suspend
1475 indication from WMA.
1476
1477 \return None
1478
1479 \sa
1480
1481 --------------------------------------------------------------------------*/
1482void sme_process_ready_to_suspend(tHalHandle hHal,
1483 tpSirReadyToSuspendInd pReadyToSuspend)
1484{
1485 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
1486
1487 if (NULL == pMac) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301488 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_FATAL,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001489 "%s: pMac is null", __func__);
1490 return;
1491 }
1492
1493 if (NULL != pMac->readyToSuspendCallback) {
1494 pMac->readyToSuspendCallback(pMac->readyToSuspendContext,
1495 pReadyToSuspend->suspended);
1496 pMac->readyToSuspendCallback = NULL;
1497 }
1498}
1499
1500#ifdef WLAN_FEATURE_EXTWOW_SUPPORT
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001501
Krishna Kumaar Natarajand9131902015-10-19 11:52:47 -07001502/**
1503 * sme_process_ready_to_ext_wow() - inform ready to ExtWoW indication.
1504 * @hHal - Handle returned by mac_open.
1505 * @pReadyToExtWoW - Parameter received along with ready to Ext WoW
1506 * indication from WMA.
1507 *
1508 * On getting ready to Ext WoW indication, this function calls callback
1509 * registered (HDD callback)with SME to inform ready to ExtWoW indication.
1510 *
1511 * Return: None
1512 */
1513void sme_process_ready_to_ext_wow(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001514 tpSirReadyToExtWoWInd pReadyToExtWoW)
1515{
1516 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
1517
1518 if (NULL == pMac) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301519 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_FATAL,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001520 "%s: pMac is null", __func__);
1521 return;
1522 }
1523
1524 if (NULL != pMac->readyToExtWoWCallback) {
1525 pMac->readyToExtWoWCallback(pMac->readyToExtWoWContext,
1526 pReadyToExtWoW->status);
1527 pMac->readyToExtWoWCallback = NULL;
1528 pMac->readyToExtWoWContext = NULL;
1529 }
1530
1531}
1532#endif
1533
1534/* ---------------------------------------------------------------------------
1535 \fn sme_change_config_params
1536 \brief The SME API exposed for HDD to provide config params to SME during
1537 SMEs stop -> start sequence.
1538
1539 If HDD changed the domain that will cause a reset. This function will
1540 provide the new set of 11d information for the new domain. Currrently this
1541 API provides info regarding 11d only at reset but we can extend this for
1542 other params (PMC, QoS) which needs to be initialized again at reset.
1543
1544 This is a synchronous call
1545
1546 \param hHal - The handle returned by mac_open.
1547
1548 \Param
1549 pUpdateConfigParam - a pointer to a structure (tCsrUpdateConfigParam) that
1550 currently provides 11d related information like Country code,
1551 Regulatory domain, valid channel list, Tx power per channel, a
1552 list with active/passive scan allowed per valid channel.
1553
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301554 \return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001555 ---------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301556QDF_STATUS sme_change_config_params(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001557 tCsrUpdateConfigParam *pUpdateConfigParam)
1558{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301559 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001560 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
1561
1562 if (NULL == pUpdateConfigParam) {
1563 sms_log(pMac, LOGE,
1564 "Empty config param structure for SME, nothing to reset");
1565 return status;
1566 }
1567
1568 status = csr_change_config_params(pMac, pUpdateConfigParam);
1569
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301570 if (!QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001571 sms_log(pMac, LOGE, "csrUpdateConfigParam failed with status=%d",
1572 status);
1573 }
1574
1575 return status;
1576
1577}
1578
1579/*--------------------------------------------------------------------------
1580
1581 \brief sme_hdd_ready_ind() - SME sends eWNI_SME_SYS_READY_IND to PE to inform
1582 that the NIC is ready tio run.
1583
1584 The function is called by HDD at the end of initialization stage so PE/HAL can
1585 enable the NIC to running state.
1586
1587 This is a synchronous call
1588 \param hHal - The handle returned by mac_open.
1589
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301590 \return QDF_STATUS_SUCCESS - eWNI_SME_SYS_READY_IND is sent to PE
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001591 successfully.
1592
1593 Other status means SME failed to send the message to PE.
1594 \sa
1595
1596 --------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301597QDF_STATUS sme_hdd_ready_ind(tHalHandle hHal)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001598{
1599 tSirSmeReadyReq Msg;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301600 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001601 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
1602
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301603 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001604 TRACE_CODE_SME_RX_HDD_MSG_HDDREADYIND, NO_SESSION, 0));
1605 do {
1606
1607 Msg.messageType = eWNI_SME_SYS_READY_IND;
1608 Msg.length = sizeof(tSirSmeReadyReq);
1609 Msg.add_bssdescr_cb = csr_scan_process_single_bssdescr;
Varun Reddy Yeturud5939f82015-12-24 18:14:02 -08001610 Msg.csr_roam_synch_cb = csr_roam_synch_callback;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001611
1612
1613 if (eSIR_FAILURE != u_mac_post_ctrl_msg(hHal, (tSirMbMsg *) &Msg)) {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301614 status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001615 } else {
1616 sms_log(pMac, LOGE,
1617 "u_mac_post_ctrl_msg failed to send eWNI_SME_SYS_READY_IND");
1618 break;
1619 }
1620
1621 status = csr_ready(pMac);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301622 if (!QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001623 sms_log(pMac, LOGE,
1624 "csr_ready failed with status=%d",
1625 status);
1626 break;
1627 }
1628
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301629 if (QDF_STATUS_SUCCESS != rrm_ready(hHal)) {
1630 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001631 sms_log(pMac, LOGE, "rrm_ready failed");
1632 break;
1633 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001634 pMac->sme.state = SME_STATE_READY;
1635 } while (0);
1636
1637 return status;
1638}
1639
1640/*--------------------------------------------------------------------------
1641
1642 \brief sme_start() - Put all SME modules at ready state.
1643
1644 The function starts each module in SME, PMC, CSR, etc. . Upon
1645 successfully return, all modules are ready to run.
1646 This is a synchronous call
1647 \param hHal - The handle returned by mac_open.
1648
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301649 \return QDF_STATUS_SUCCESS - SME is ready.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001650
1651 Other status means SME is failed to start
1652 \sa
1653
1654 --------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301655QDF_STATUS sme_start(tHalHandle hHal)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001656{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301657 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001658 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
1659
1660 do {
1661 status = csr_start(pMac);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301662 if (!QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001663 sms_log(pMac, LOGE,
1664 "csr_start failed during smeStart with status=%d",
1665 status);
1666 break;
1667 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001668 pMac->sme.state = SME_STATE_START;
1669 } while (0);
1670
1671 return status;
1672}
1673
1674/**
1675 * sme_handle_scan_req() - Scan request handler
1676 * @mac_ctx: MAC global context
1677 * @msg: message buffer
1678 *
1679 * Scan request message from upper layer is handled as
1680 * part of this API
1681 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301682 * Return: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001683 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301684static QDF_STATUS sme_handle_scan_req(tpAniSirGlobal mac_ctx,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001685 void *msg)
1686{
1687 struct ani_scan_req *scan_msg;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301688 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001689 uint16_t session_id;
1690 csr_scan_completeCallback callback;
1691
1692 scan_msg = msg;
1693 session_id = scan_msg->session_id;
1694 callback = scan_msg->callback;
1695 status = csr_scan_request(mac_ctx, session_id,
1696 scan_msg->scan_param,
1697 callback, scan_msg->ctx);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301698 if (!QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001699 sms_log(mac_ctx, LOGE,
1700 FL("scan request failed. session_id %d"), session_id);
1701 }
1702 csr_scan_free_request(mac_ctx, scan_msg->scan_param);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05301703 qdf_mem_free(scan_msg->scan_param);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001704 return status;
1705}
1706
1707/**
1708 * sme_handle_roc_req() - Roc request handler
1709 * @mac_ctx: MAC global context
1710 * @msg: message buffer
1711 *
1712 * Roc request message from upper layer is handled as
1713 * part of this API
1714 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301715 * Return: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001716 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301717static QDF_STATUS sme_handle_roc_req(tHalHandle hal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001718 void *msg)
1719{
1720 struct ani_roc_req *roc_msg;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301721 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001722 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
1723 remainOnChanCallback callback;
1724
1725 if (msg == NULL) {
1726 sms_log(mac_ctx, LOGE, FL("ROC request is NULL"));
1727 return status;
1728 }
1729
1730 roc_msg = msg;
1731 callback = roc_msg->callback;
1732 status = p2p_remain_on_channel(hal, roc_msg->session_id,
1733 roc_msg->channel, roc_msg->duration, callback,
1734 roc_msg->ctx, roc_msg->is_p2pprobe_allowed,
1735 roc_msg->scan_id);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301736 if (!QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001737 sms_log(mac_ctx, LOGE,
1738 FL("scan request failed. session_id %d scan_id %d"),
1739 roc_msg->session_id, roc_msg->scan_id);
1740 }
1741 return status;
1742}
1743
1744#ifdef WLAN_FEATURE_11W
1745/*------------------------------------------------------------------
1746 *
1747 * Handle the unprotected management frame indication from LIM and
1748 * forward it to HDD.
1749 *
1750 *------------------------------------------------------------------*/
1751
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301752QDF_STATUS sme_unprotected_mgmt_frm_ind(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001753 tpSirSmeUnprotMgmtFrameInd pSmeMgmtFrm)
1754{
1755 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301756 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001757 tCsrRoamInfo pRoamInfo = { 0 };
1758 uint32_t SessionId = pSmeMgmtFrm->sessionId;
1759
1760 pRoamInfo.nFrameLength = pSmeMgmtFrm->frameLen;
1761 pRoamInfo.pbFrames = pSmeMgmtFrm->frameBuf;
1762 pRoamInfo.frameType = pSmeMgmtFrm->frameType;
1763
1764 /* forward the mgmt frame to HDD */
1765 csr_roam_call_callback(pMac, SessionId, &pRoamInfo, 0,
1766 eCSR_ROAM_UNPROT_MGMT_FRAME_IND, 0);
1767
1768 return status;
1769}
1770#endif
1771
1772/*------------------------------------------------------------------
1773 *
1774 * Handle the DFS Radar Event and indicate it to the SAP
1775 *
1776 *------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301777QDF_STATUS dfs_msg_processor(tpAniSirGlobal pMac, uint16_t msgType, void *pMsgBuf)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001778{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301779 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001780 tCsrRoamInfo roamInfo = { 0 };
1781 tSirSmeDfsEventInd *dfs_event;
1782 tSirSmeCSAIeTxCompleteRsp *csaIeTxCompleteRsp;
1783 uint32_t sessionId = 0;
1784 eRoamCmdStatus roamStatus;
1785 eCsrRoamResult roamResult;
1786 int i;
1787
1788 switch (msgType) {
1789 case eWNI_SME_DFS_RADAR_FOUND:
1790 {
1791 /* Radar found !! */
1792 dfs_event = (tSirSmeDfsEventInd *) pMsgBuf;
1793 if (NULL == dfs_event) {
1794 sms_log(pMac, LOGE,
1795 "%s: pMsg is NULL for eWNI_SME_DFS_RADAR_FOUND message",
1796 __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301797 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001798 }
1799 sessionId = dfs_event->sessionId;
1800 roamInfo.dfs_event.sessionId = sessionId;
1801 roamInfo.dfs_event.chan_list.nchannels =
1802 dfs_event->chan_list.nchannels;
1803 for (i = 0; i < dfs_event->chan_list.nchannels; i++) {
1804 roamInfo.dfs_event.chan_list.channels[i] =
1805 dfs_event->chan_list.channels[i];
1806 }
1807
1808 roamInfo.dfs_event.dfs_radar_status =
1809 dfs_event->dfs_radar_status;
1810 roamInfo.dfs_event.use_nol = dfs_event->use_nol;
1811
1812 roamStatus = eCSR_ROAM_DFS_RADAR_IND;
1813 roamResult = eCSR_ROAM_RESULT_DFS_RADAR_FOUND_IND;
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301814 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO_MED,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001815 "sapdfs: Radar indication event occurred");
1816 break;
1817 }
1818 case eWNI_SME_DFS_CSAIE_TX_COMPLETE_IND:
1819 {
1820 csaIeTxCompleteRsp =
1821 (tSirSmeCSAIeTxCompleteRsp *) pMsgBuf;
1822 if (NULL == csaIeTxCompleteRsp) {
1823 sms_log(pMac, LOGE,
1824 "%s: pMsg is NULL for eWNI_SME_DFS_CSAIE_TX_COMPLETE_IND",
1825 __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301826 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001827 }
1828 sessionId = csaIeTxCompleteRsp->sessionId;
1829 roamStatus = eCSR_ROAM_DFS_CHAN_SW_NOTIFY;
1830 roamResult = eCSR_ROAM_RESULT_DFS_CHANSW_UPDATE_SUCCESS;
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301831 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO_MED,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001832 "sapdfs: Received eWNI_SME_DFS_CSAIE_TX_COMPLETE_IND for session id [%d]",
1833 sessionId);
1834 break;
1835 }
1836 default:
1837 {
1838 sms_log(pMac, LOG1, "%s: Invalid DFS message = 0x%x",
1839 __func__, msgType);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301840 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001841 return status;
1842 }
1843 }
1844
1845 /* Indicate Radar Event to SAP */
1846 csr_roam_call_callback(pMac, sessionId, &roamInfo, 0,
1847 roamStatus, roamResult);
1848 return status;
1849}
1850
Abhishek Singh518323d2015-10-19 17:42:01 +05301851/**
1852 * sme_extended_change_channel_ind()- function to indicate ECSA
1853 * action frame is received in lim to SAP
1854 * @mac_ctx: pointer to global mac structure
1855 * @msg_buf: contain new channel and session id.
1856 *
1857 * This function is called to post ECSA action frame
1858 * receive event to SAP.
1859 *
1860 * Return: success if msg indicated to SAP else return failure
1861 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301862static QDF_STATUS sme_extended_change_channel_ind(tpAniSirGlobal mac_ctx,
Abhishek Singh518323d2015-10-19 17:42:01 +05301863 void *msg_buf)
1864{
1865 struct sir_sme_ext_cng_chan_ind *ext_chan_ind;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301866 QDF_STATUS status = QDF_STATUS_SUCCESS;
Abhishek Singh518323d2015-10-19 17:42:01 +05301867 uint32_t session_id = 0;
1868 tCsrRoamInfo roamInfo = {0};
1869 eRoamCmdStatus roam_status;
1870 eCsrRoamResult roam_result;
1871
1872
1873 ext_chan_ind = msg_buf;
1874 if (NULL == ext_chan_ind) {
1875 sms_log(mac_ctx, LOGE,
1876 FL("pMsg is NULL for eWNI_SME_EXT_CHANGE_CHANNEL_IND"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301877 return QDF_STATUS_E_FAILURE;
Abhishek Singh518323d2015-10-19 17:42:01 +05301878 }
1879 session_id = ext_chan_ind->session_id;
1880 roamInfo.target_channel = ext_chan_ind->new_channel;
1881 roam_status = eCSR_ROAM_EXT_CHG_CHNL_IND;
1882 roam_result = eCSR_ROAM_EXT_CHG_CHNL_UPDATE_IND;
1883 sms_log(mac_ctx, LOG1,
1884 FL("sapdfs: Received eWNI_SME_EXT_CHANGE_CHANNEL_IND for session id [%d]"),
1885 session_id);
1886
1887 /* Indicate Ext Channel Change event to SAP */
1888 csr_roam_call_callback(mac_ctx, session_id, &roamInfo, 0,
1889 roam_status, roam_result);
1890 return status;
1891}
1892
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001893/**
1894 * sme_process_fw_mem_dump_rsp - process fw memory dump response from WMA
1895 *
1896 * @mac_ctx: pointer to MAC handle.
1897 * @msg: pointer to received SME msg.
1898 *
1899 * This function process the received SME message and calls the corresponding
1900 * callback which was already registered with SME.
1901 *
1902 * Return: None
1903 */
1904#ifdef WLAN_FEATURE_MEMDUMP
1905static void sme_process_fw_mem_dump_rsp(tpAniSirGlobal mac_ctx, cds_msg_t *msg)
1906{
1907 if (msg->bodyptr) {
1908 if (mac_ctx->sme.fw_dump_callback)
1909 mac_ctx->sme.fw_dump_callback(mac_ctx->hHdd,
1910 (struct fw_dump_rsp *) msg->bodyptr);
1911 qdf_mem_free(msg->bodyptr);
1912 }
1913}
1914#else
1915static void sme_process_fw_mem_dump_rsp(tpAniSirGlobal mac_ctx, cds_msg_t *msg)
1916{
1917}
1918#endif
1919
1920#ifdef FEATURE_WLAN_ESE
1921/**
1922 * sme_update_is_ese_feature_enabled() - enable/disable ESE support at runtime
1923 * @hHal: HAL handle
1924 * @sessionId: session id
1925 * @isEseIniFeatureEnabled: ese ini enabled
1926 *
1927 * It is used at in the REG_DYNAMIC_VARIABLE macro definition of
1928 * isEseIniFeatureEnabled. This is a synchronous call
1929 *
1930 * Return: QDF_STATUS enumeration
1931 */
1932QDF_STATUS sme_update_is_ese_feature_enabled(tHalHandle hHal,
1933 uint8_t sessionId, const bool isEseIniFeatureEnabled)
1934{
1935 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
1936
1937 if (pMac->roam.configParam.isEseIniFeatureEnabled ==
1938 isEseIniFeatureEnabled) {
1939 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO,
1940 "%s: ESE Mode is already enabled or disabled, nothing to do (returning) old(%d) new(%d)",
1941 __func__,
1942 pMac->roam.configParam.isEseIniFeatureEnabled,
1943 isEseIniFeatureEnabled);
1944 return QDF_STATUS_SUCCESS;
1945 }
1946
1947 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO,
1948 "%s: EseEnabled is changed from %d to %d", __func__,
1949 pMac->roam.configParam.isEseIniFeatureEnabled,
1950 isEseIniFeatureEnabled);
1951 pMac->roam.configParam.isEseIniFeatureEnabled = isEseIniFeatureEnabled;
Varun Reddy Yeturuff4feb02016-04-20 12:26:11 -07001952 csr_neighbor_roam_update_fast_roaming_enabled(
1953 pMac, sessionId, isEseIniFeatureEnabled);
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001954
1955 if (true == isEseIniFeatureEnabled)
1956 sme_update_fast_transition_enabled(hHal, true);
1957
1958 if (pMac->roam.configParam.isRoamOffloadScanEnabled)
1959 csr_roam_offload_scan(pMac, sessionId,
1960 ROAM_SCAN_OFFLOAD_UPDATE_CFG,
1961 REASON_ESE_INI_CFG_CHANGED);
1962
1963 return QDF_STATUS_SUCCESS;
1964}
1965
1966/**
1967 * sme_set_plm_request() - set plm request
1968 * @hHal: HAL handle
1969 * @pPlmReq: Pointer to input plm request
1970 *
1971 * Return: QDF_STATUS enumeration
1972 */
1973QDF_STATUS sme_set_plm_request(tHalHandle hHal, tpSirPlmReq pPlmReq)
1974{
1975 QDF_STATUS status;
1976 bool ret = false;
1977 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
1978 uint8_t ch_list[WNI_CFG_VALID_CHANNEL_LIST] = { 0 };
1979 uint8_t count, valid_count = 0;
1980 cds_msg_t msg;
1981 tCsrRoamSession *pSession = CSR_GET_SESSION(pMac, pPlmReq->sessionId);
1982
1983 status = sme_acquire_global_lock(&pMac->sme);
1984 if (!QDF_IS_STATUS_SUCCESS(status))
1985 return status;
1986
1987 if (!pSession) {
1988 sms_log(pMac, LOGE, FL("session %d not found"),
1989 pPlmReq->sessionId);
1990 sme_release_global_lock(&pMac->sme);
1991 return QDF_STATUS_E_FAILURE;
1992 }
1993
1994 if (!pSession->sessionActive) {
1995 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
1996 FL("Invalid Sessionid"));
1997 sme_release_global_lock(&pMac->sme);
1998 return QDF_STATUS_E_FAILURE;
1999 }
2000
2001 if (!pPlmReq->enable)
2002 goto send_plm_start;
2003 /* validating channel numbers */
2004 for (count = 0; count < pPlmReq->plmNumCh; count++) {
2005 ret = csr_is_supported_channel(pMac, pPlmReq->plmChList[count]);
2006 if (ret && pPlmReq->plmChList[count] > 14) {
2007 if (CHANNEL_STATE_DFS == cds_get_channel_state(
2008 pPlmReq->plmChList[count])) {
2009 /* DFS channel is provided, no PLM bursts can be
2010 * transmitted. Ignoring these channels.
2011 */
2012 QDF_TRACE(QDF_MODULE_ID_SME,
2013 QDF_TRACE_LEVEL_INFO,
2014 FL("DFS channel %d ignored for PLM"),
2015 pPlmReq->plmChList[count]);
2016 continue;
2017 }
2018 } else if (!ret) {
2019 /* Not supported, ignore the channel */
2020 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO,
2021 FL("Unsupported channel %d ignored for PLM"),
2022 pPlmReq->plmChList[count]);
2023 continue;
2024 }
2025 ch_list[valid_count] = pPlmReq->plmChList[count];
2026 valid_count++;
2027 } /* End of for () */
2028
2029 /* Copying back the valid channel list to plm struct */
2030 qdf_mem_set((void *)pPlmReq->plmChList,
2031 pPlmReq->plmNumCh, 0);
2032 if (valid_count)
2033 qdf_mem_copy(pPlmReq->plmChList, ch_list,
2034 valid_count);
2035 /* All are invalid channels, FW need to send the PLM
2036 * report with "incapable" bit set.
2037 */
2038 pPlmReq->plmNumCh = valid_count;
2039
2040send_plm_start:
2041 /* PLM START */
2042 msg.type = WMA_SET_PLM_REQ;
2043 msg.reserved = 0;
2044 msg.bodyptr = pPlmReq;
2045
2046 if (!QDF_IS_STATUS_SUCCESS(cds_mq_post_message(QDF_MODULE_ID_WMA,
2047 &msg))) {
2048 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
2049 FL("Not able to post WMA_SET_PLM_REQ to WMA"));
2050 sme_release_global_lock(&pMac->sme);
2051 return QDF_STATUS_E_FAILURE;
2052 }
2053
2054 sme_release_global_lock(&pMac->sme);
2055 return status;
2056}
2057
2058/**
2059 * sme_tsm_ie_ind() - sme tsm ie indication
2060 * @hHal: HAL handle
2061 * @pSmeTsmIeInd: Pointer to tsm ie indication
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002062 *
2063 * Handle the tsm ie indication from LIM and forward it to HDD.
2064 *
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08002065 * Return: QDF_STATUS enumeration
2066 */
2067static QDF_STATUS sme_tsm_ie_ind(tHalHandle hHal, tSirSmeTsmIEInd *pSmeTsmIeInd)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002068{
2069 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302070 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002071 tCsrRoamInfo pRoamInfo = { 0 };
2072 uint32_t SessionId = pSmeTsmIeInd->sessionId;
2073 pRoamInfo.tsmIe.tsid = pSmeTsmIeInd->tsmIe.tsid;
2074 pRoamInfo.tsmIe.state = pSmeTsmIeInd->tsmIe.state;
2075 pRoamInfo.tsmIe.msmt_interval = pSmeTsmIeInd->tsmIe.msmt_interval;
2076 /* forward the tsm ie information to HDD */
2077 csr_roam_call_callback(pMac,
2078 SessionId, &pRoamInfo, 0, eCSR_ROAM_TSM_IE_IND, 0);
2079 return status;
2080}
2081
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08002082/**
2083 * sme_set_cckm_ie() - set cckm ie
2084 * @hHal: HAL handle
2085 * @sessionId: session id
2086 * @pCckmIe: Pointer to CCKM Ie
2087 * @cckmIeLen: Length of @pCckmIe
2088 *
2089 * Function to store the CCKM IE passed from supplicant and use
2090 * it while packing reassociation request.
2091 *
2092 * Return: QDF_STATUS enumeration
2093 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302094QDF_STATUS sme_set_cckm_ie(tHalHandle hHal, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002095 uint8_t *pCckmIe, uint8_t cckmIeLen)
2096{
2097 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302098 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002099 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302100 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002101 csr_set_cckm_ie(pMac, sessionId, pCckmIe, cckmIeLen);
2102 sme_release_global_lock(&pMac->sme);
2103 }
2104 return status;
2105}
2106
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08002107/**
2108 * sme_set_ese_beacon_request() - set ese beacon request
2109 * @hHal: HAL handle
2110 * @sessionId: session id
2111 * @pEseBcnReq: Ese beacon report
2112 *
2113 * function to set ESE beacon request parameters
2114 *
2115 * Return: QDF_STATUS enumeration
2116 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302117QDF_STATUS sme_set_ese_beacon_request(tHalHandle hHal, const uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002118 const tCsrEseBeaconReq *pEseBcnReq)
2119{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302120 QDF_STATUS status = eSIR_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002121 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
2122 tpSirBeaconReportReqInd pSmeBcnReportReq = NULL;
2123 tCsrEseBeaconReqParams *pBeaconReq = NULL;
2124 uint8_t counter = 0;
2125 tCsrRoamSession *pSession = CSR_GET_SESSION(pMac, sessionId);
2126 tpRrmSMEContext pSmeRrmContext = &pMac->rrm.rrmSmeContext;
2127
2128 if (pSmeRrmContext->eseBcnReqInProgress == true) {
2129 sms_log(pMac, LOGE,
2130 "A Beacon Report Req is already in progress");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302131 return QDF_STATUS_E_RESOURCES;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002132 }
2133
2134 /* Store the info in RRM context */
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302135 qdf_mem_copy(&pSmeRrmContext->eseBcnReqInfo, pEseBcnReq,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002136 sizeof(tCsrEseBeaconReq));
2137
2138 /* Prepare the request to send to SME. */
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302139 pSmeBcnReportReq = qdf_mem_malloc(sizeof(tSirBeaconReportReqInd));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002140 if (NULL == pSmeBcnReportReq) {
2141 sms_log(pMac, LOGP,
2142 "Memory Allocation Failure!!! ESE BcnReq Ind to SME");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302143 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002144 }
2145
2146 pSmeRrmContext->eseBcnReqInProgress = true;
2147
2148 sms_log(pMac, LOGE, "Sending Beacon Report Req to SME");
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302149 qdf_mem_zero(pSmeBcnReportReq, sizeof(tSirBeaconReportReqInd));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002150
2151 pSmeBcnReportReq->messageType = eWNI_SME_BEACON_REPORT_REQ_IND;
2152 pSmeBcnReportReq->length = sizeof(tSirBeaconReportReqInd);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302153 qdf_mem_copy(pSmeBcnReportReq->bssId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002154 pSession->connectedProfile.bssid.bytes,
2155 sizeof(tSirMacAddr));
2156 pSmeBcnReportReq->channelInfo.channelNum = 255;
2157 pSmeBcnReportReq->channelList.numChannels = pEseBcnReq->numBcnReqIe;
2158 pSmeBcnReportReq->msgSource = eRRM_MSG_SOURCE_ESE_UPLOAD;
2159
2160 for (counter = 0; counter < pEseBcnReq->numBcnReqIe; counter++) {
2161 pBeaconReq =
2162 (tCsrEseBeaconReqParams *) &pEseBcnReq->bcnReq[counter];
2163 pSmeBcnReportReq->fMeasurementtype[counter] =
2164 pBeaconReq->scanMode;
2165 pSmeBcnReportReq->measurementDuration[counter] =
2166 SYS_TU_TO_MS(pBeaconReq->measurementDuration);
2167 pSmeBcnReportReq->channelList.channelNumber[counter] =
2168 pBeaconReq->channel;
2169 }
2170
2171 status = sme_rrm_process_beacon_report_req_ind(pMac, pSmeBcnReportReq);
2172
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302173 if (status != QDF_STATUS_SUCCESS)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002174 pSmeRrmContext->eseBcnReqInProgress = false;
2175
Hanumanth Reddy Pothula7f7a2712016-09-07 18:44:47 +05302176 qdf_mem_free(pSmeBcnReportReq);
2177
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002178 return status;
2179}
2180
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08002181/**
2182 * sme_get_tsm_stats() - SME get tsm stats
2183 * @hHal: HAL handle
2184 * @callback: SME sends back the requested stats using the callback
2185 * @staId: The station ID for which the stats is requested for
2186 * @bssId: bssid
2187 * @pContext: user context to be passed back along with the callback
2188 * @p_cds_context: CDS context
2189 * @tid: Traffic id
2190 *
2191 * API register a callback to get TSM Stats.
2192 *
2193 * Return: QDF_STATUS enumeration
2194 */
2195QDF_STATUS sme_get_tsm_stats(tHalHandle hHal,
2196 tCsrTsmStatsCallback callback,
2197 uint8_t staId, struct qdf_mac_addr bssId,
2198 void *pContext, void *p_cds_context, uint8_t tid)
2199{
2200 QDF_STATUS status = QDF_STATUS_E_FAILURE;
2201 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
2202
2203 status = sme_acquire_global_lock(&pMac->sme);
2204 if (QDF_IS_STATUS_SUCCESS(status)) {
2205 status = csr_get_tsm_stats(pMac, callback,
2206 staId, bssId, pContext,
2207 p_cds_context, tid);
2208 sme_release_global_lock(&pMac->sme);
2209 }
2210 return status;
2211}
2212
2213/**
2214 * sme_set_ese_roam_scan_channel_list() - To set ese roam scan channel list
2215 * @hHal: pointer HAL handle returned by mac_open
2216 * @sessionId: sme session id
2217 * @pChannelList: Output channel list
2218 * @numChannels: Output number of channels
2219 *
2220 * This routine is called to set ese roam scan channel list.
2221 * This is a synchronous call
2222 *
2223 * Return: QDF_STATUS
2224 */
2225QDF_STATUS sme_set_ese_roam_scan_channel_list(tHalHandle hHal,
2226 uint8_t sessionId,
2227 uint8_t *pChannelList,
2228 uint8_t numChannels)
2229{
2230 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
2231 QDF_STATUS status = QDF_STATUS_SUCCESS;
2232 tpCsrNeighborRoamControlInfo pNeighborRoamInfo
2233 = &pMac->roam.neighborRoamInfo[sessionId];
2234 tpCsrChannelInfo curchnl_list_info
2235 = &pNeighborRoamInfo->roamChannelInfo.currentChannelListInfo;
2236 uint8_t oldChannelList[WNI_CFG_VALID_CHANNEL_LIST_LEN * 2] = { 0 };
2237 uint8_t newChannelList[128] = { 0 };
2238 uint8_t i = 0, j = 0;
2239
2240 status = sme_acquire_global_lock(&pMac->sme);
2241 if (!QDF_IS_STATUS_SUCCESS(status)) {
2242 if (pMac->roam.configParam.isRoamOffloadScanEnabled)
2243 csr_roam_offload_scan(pMac, sessionId,
2244 ROAM_SCAN_OFFLOAD_UPDATE_CFG,
2245 REASON_CHANNEL_LIST_CHANGED);
2246 return status;
2247 }
2248 if (NULL != curchnl_list_info->ChannelList) {
2249 for (i = 0; i < curchnl_list_info->numOfChannels; i++) {
2250 j += snprintf(oldChannelList + j,
2251 sizeof(oldChannelList) - j, "%d",
2252 curchnl_list_info->ChannelList[i]);
2253 }
2254 }
2255 status = csr_create_roam_scan_channel_list(pMac, sessionId,
2256 pChannelList, numChannels,
2257 csr_get_current_band(hHal));
2258 if (QDF_IS_STATUS_SUCCESS(status)) {
2259 if (NULL != curchnl_list_info->ChannelList) {
2260 j = 0;
2261 for (i = 0; i < curchnl_list_info->numOfChannels; i++) {
2262 j += snprintf(newChannelList + j,
2263 sizeof(newChannelList) - j, "%d",
2264 curchnl_list_info->ChannelList[i]);
2265 }
2266 }
2267 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
2268 "ESE roam scan chnl list successfully set to %s-old value is %s-roam state is %d",
2269 newChannelList, oldChannelList,
2270 pNeighborRoamInfo->neighborRoamState);
2271 }
2272 sme_release_global_lock(&pMac->sme);
2273 if (pMac->roam.configParam.isRoamOffloadScanEnabled)
2274 csr_roam_offload_scan(pMac, sessionId,
2275 ROAM_SCAN_OFFLOAD_UPDATE_CFG,
2276 REASON_CHANNEL_LIST_CHANGED);
2277 return status;
2278}
2279
2280#endif /* FEATURE_WLAN_ESE */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002281
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08002282QDF_STATUS sme_ibss_peer_info_response_handleer(tHalHandle hHal,
2283 tpSirIbssGetPeerInfoRspParams
2284 pIbssPeerInfoParams)
2285{
2286 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
2287
2288 if (NULL == pMac) {
2289 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_FATAL,
2290 "%s: pMac is null", __func__);
2291 return QDF_STATUS_E_FAILURE;
2292 }
2293 if (pMac->sme.peerInfoParams.peerInfoCbk == NULL) {
2294 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
2295 "%s: HDD callback is null", __func__);
2296 return QDF_STATUS_E_FAILURE;
2297 }
2298 pMac->sme.peerInfoParams.peerInfoCbk(pMac->sme.peerInfoParams.pUserData,
2299 &pIbssPeerInfoParams->
2300 ibssPeerInfoRspParams);
2301 return QDF_STATUS_SUCCESS;
2302}
2303
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002304/**
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002305 * sme_process_dual_mac_config_resp() - Process set Dual mac config response
2306 * @mac: Global MAC pointer
2307 * @msg: Dual mac config response
2308 *
2309 * Processes the dual mac configuration response and invokes the HDD callback
2310 * to process further
2311 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302312static QDF_STATUS sme_process_dual_mac_config_resp(tpAniSirGlobal mac,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002313 uint8_t *msg)
2314{
2315 tListElem *entry = NULL;
2316 tSmeCmd *command = NULL;
2317 bool found;
2318 dual_mac_cb callback = NULL;
2319 struct sir_dual_mac_config_resp *param;
2320
2321 param = (struct sir_dual_mac_config_resp *)msg;
2322 if (!param) {
2323 sms_log(mac, LOGE, FL("Dual mac config resp param is NULL"));
2324 /* Not returning. Need to check if active command list
2325 * needs to be freed
2326 */
2327 }
2328
2329 entry = csr_ll_peek_head(&mac->sme.smeCmdActiveList,
2330 LL_ACCESS_LOCK);
2331 if (!entry) {
2332 sms_log(mac, LOGE, FL("No cmd found in active list"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302333 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002334 }
2335
2336 command = GET_BASE_ADDR(entry, tSmeCmd, Link);
2337 if (!command) {
2338 sms_log(mac, LOGE, FL("Base address is NULL"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302339 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002340 }
2341
2342 if (e_sme_command_set_dual_mac_config != command->command) {
2343 sms_log(mac, LOGE, FL("Command mismatch!"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302344 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002345 }
2346
2347 callback = command->u.set_dual_mac_cmd.set_dual_mac_cb;
2348 if (callback) {
2349 if (!param) {
2350 sms_log(mac, LOGE,
2351 FL("Callback failed-Dual mac config is NULL"));
2352 } else {
2353 sms_log(mac, LOG1,
2354 FL("Calling HDD callback for Dual mac config"));
2355 callback(param->status,
2356 command->u.set_dual_mac_cmd.scan_config,
2357 command->u.set_dual_mac_cmd.fw_mode_config);
2358 }
2359 } else {
2360 sms_log(mac, LOGE, FL("Callback does not exist"));
2361 }
2362
2363 found = csr_ll_remove_entry(&mac->sme.smeCmdActiveList, entry,
2364 LL_ACCESS_LOCK);
2365 if (found)
2366 /* Now put this command back on the available command list */
2367 sme_release_command(mac, command);
2368
2369 sme_process_pending_queue(mac);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302370 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002371}
2372
Archana Ramachandrana20ef812015-11-13 16:12:13 -08002373/**
2374 * sme_process_antenna_mode_resp() - Process set antenna mode
2375 * response
2376 * @mac: Global MAC pointer
2377 * @msg: antenna mode response
2378 *
2379 * Processes the antenna mode response and invokes the HDD
2380 * callback to process further
2381 */
2382static QDF_STATUS sme_process_antenna_mode_resp(tpAniSirGlobal mac,
2383 uint8_t *msg)
2384{
2385 tListElem *entry;
2386 tSmeCmd *command;
2387 bool found;
2388 antenna_mode_cb callback;
2389 struct sir_antenna_mode_resp *param;
2390
2391 param = (struct sir_antenna_mode_resp *)msg;
2392 if (!param) {
2393 sms_log(mac, LOGE, FL("set antenna mode resp is NULL"));
2394 /* Not returning. Need to check if active command list
2395 * needs to be freed
2396 */
2397 }
2398
2399 entry = csr_ll_peek_head(&mac->sme.smeCmdActiveList,
2400 LL_ACCESS_LOCK);
2401 if (!entry) {
2402 sms_log(mac, LOGE, FL("No cmd found in active list"));
2403 return QDF_STATUS_E_FAILURE;
2404 }
2405
2406 command = GET_BASE_ADDR(entry, tSmeCmd, Link);
2407 if (!command) {
2408 sms_log(mac, LOGE, FL("Base address is NULL"));
2409 return QDF_STATUS_E_FAILURE;
2410 }
2411
2412 if (e_sme_command_set_antenna_mode != command->command) {
2413 sms_log(mac, LOGE, FL("Command mismatch!"));
2414 return QDF_STATUS_E_FAILURE;
2415 }
2416
2417 callback =
2418 command->u.set_antenna_mode_cmd.set_antenna_mode_resp;
2419 if (callback) {
2420 if (!param) {
2421 sms_log(mac, LOGE,
2422 FL("Set antenna mode call back is NULL"));
2423 } else {
2424 sms_log(mac, LOG1,
2425 FL("HDD callback for set antenna mode"));
2426 callback(param->status);
2427 }
2428 } else {
2429 sms_log(mac, LOGE, FL("Callback does not exist"));
2430 }
2431
2432 found = csr_ll_remove_entry(&mac->sme.smeCmdActiveList, entry,
2433 LL_ACCESS_LOCK);
2434 if (found)
2435 /* Now put this command back on the available command list */
2436 sme_release_command(mac, command);
2437
2438 sme_process_pending_queue(mac);
2439 return QDF_STATUS_SUCCESS;
2440}
2441
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002442/*--------------------------------------------------------------------------
2443
2444 \brief sme_process_msg() - The main message processor for SME.
2445
2446 The function is called by a message dispatcher when to process a message
2447 targeted for SME.
2448
2449 This is a synchronous call
2450 \param hHal - The handle returned by mac_open.
2451 \param pMsg - A pointer to a caller allocated object of tSirMsgQ.
2452
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302453 \return QDF_STATUS_SUCCESS - SME successfully process the message.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002454
2455 Other status means SME failed to process the message to HAL.
2456 \sa
2457
2458 --------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302459QDF_STATUS sme_process_msg(tHalHandle hHal, cds_msg_t *pMsg)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002460{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302461 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002462 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
2463
2464 if (pMsg == NULL) {
2465 sms_log(pMac, LOGE, "Empty message for SME");
2466 return status;
2467 }
2468 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302469 if (!QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002470 sms_log(pMac, LOGW, FL("Locking failed, bailing out"));
2471 if (pMsg->bodyptr)
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302472 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002473 return status;
2474 }
2475 if (!SME_IS_START(pMac)) {
2476 sms_log(pMac, LOGW, FL("message type %d in stop state ignored"),
2477 pMsg->type);
2478 if (pMsg->bodyptr)
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302479 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002480 goto release_lock;
2481 }
2482 switch (pMsg->type) {
2483#ifdef WLAN_FEATURE_ROAM_OFFLOAD
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002484 case eWNI_SME_HO_FAIL_IND:
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302485 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002486 FL("LFR3: Rcvd eWNI_SME_HO_FAIL_IND"));
2487 csr_process_ho_fail_ind(pMac, pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302488 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002489 break;
2490#endif
2491 case eWNI_PMC_SMPS_STATE_IND:
2492 break;
2493 case WNI_CFG_SET_CNF:
2494 case WNI_CFG_DNLD_CNF:
2495 case WNI_CFG_GET_RSP:
2496 case WNI_CFG_ADD_GRP_ADDR_CNF:
2497 case WNI_CFG_DEL_GRP_ADDR_CNF:
2498 break;
2499 case eWNI_SME_ADDTS_RSP:
2500 case eWNI_SME_DELTS_RSP:
2501 case eWNI_SME_DELTS_IND:
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002502 case eWNI_SME_FT_AGGR_QOS_RSP:
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002503 /* QoS */
2504 if (pMsg->bodyptr) {
2505#ifndef WLAN_MDM_CODE_REDUCTION_OPT
2506 status = sme_qos_msg_processor(pMac, pMsg->type,
2507 pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302508 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002509#endif
2510 } else {
2511 sms_log(pMac, LOGE, FL("Empty message for %d"),
2512 pMsg->type);
2513 }
2514 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002515 case eWNI_SME_NEIGHBOR_REPORT_IND:
2516 case eWNI_SME_BEACON_REPORT_REQ_IND:
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002517 if (pMsg->bodyptr) {
2518 status = sme_rrm_msg_processor(pMac, pMsg->type,
2519 pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302520 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002521 } else {
2522 sms_log(pMac, LOGE, FL("Empty message for %d"),
2523 pMsg->type);
2524 }
2525 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002526 case eWNI_SME_ADD_STA_SELF_RSP:
2527 if (pMsg->bodyptr) {
2528 status = csr_process_add_sta_session_rsp(pMac,
2529 pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302530 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002531 } else {
2532 sms_log(pMac, LOGE, FL("Empty message for %d"),
2533 pMsg->type);
2534 }
2535 break;
2536 case eWNI_SME_DEL_STA_SELF_RSP:
2537 if (pMsg->bodyptr) {
2538 status = csr_process_del_sta_session_rsp(pMac,
2539 pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302540 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002541 } else {
2542 sms_log(pMac, LOGE, FL("Empty message for %d"),
2543 pMsg->type);
2544 }
2545 break;
2546 case eWNI_SME_REMAIN_ON_CHN_RSP:
2547 if (pMsg->bodyptr) {
2548 status = sme_remain_on_chn_rsp(pMac, pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302549 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002550 } else {
2551 sms_log(pMac, LOGE, FL("Empty message for %d"),
2552 pMsg->type);
2553 }
2554 break;
2555 case eWNI_SME_REMAIN_ON_CHN_RDY_IND:
2556 if (pMsg->bodyptr) {
2557 status = sme_remain_on_chn_ready(pMac, pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302558 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002559 } else {
2560 sms_log(pMac, LOGE, FL("Empty message for %d"),
2561 pMsg->type);
2562 }
2563 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002564#ifdef FEATURE_WLAN_SCAN_PNO
2565 case eWNI_SME_PREF_NETWORK_FOUND_IND:
Sreelakshmi Konamki6a065362016-05-31 16:05:01 +05302566 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_RX_WMA_MSG,
2567 NO_SESSION, pMsg->type));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002568 if (pMsg->bodyptr) {
2569 status = sme_preferred_network_found_ind((void *)pMac,
2570 pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302571 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002572 } else {
2573 sms_log(pMac, LOGE, FL("Empty message for %d"),
2574 pMsg->type);
2575 }
2576 break;
2577#endif /* FEATURE_WLAN_SCAN_PNO */
2578 case eWNI_SME_CHANGE_COUNTRY_CODE:
2579 if (pMsg->bodyptr) {
2580 status = sme_handle_change_country_code((void *)pMac,
2581 pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302582 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002583 } else {
2584 sms_log(pMac, LOGE, FL("Empty message for %d"),
2585 pMsg->type);
2586 }
2587 break;
2588 case eWNI_SME_GENERIC_CHANGE_COUNTRY_CODE:
2589 if (pMsg->bodyptr) {
2590 status = sme_handle_generic_change_country_code(
2591 (void *)pMac, 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;
2598 case eWNI_SME_SCAN_CMD:
2599 if (pMsg->bodyptr) {
2600 status = sme_handle_scan_req(pMac, pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302601 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002602 } else {
2603 sms_log(pMac, LOGE, FL("Empty message for %d"),
2604 pMsg->type);
2605 }
2606 break;
2607 case eWNI_SME_ROC_CMD:
2608 if (pMsg->bodyptr) {
2609 status = sme_handle_roc_req(hHal, pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302610 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002611 } else {
2612 sms_log(pMac, LOGE, FL("Empty message for %d"),
2613 pMsg->type);
2614 }
2615 break;
2616#ifdef FEATURE_WLAN_TDLS
2617 /*
2618 * command rescived from PE, SME tdls msg processor shall be called
2619 * to process commands recieved from PE
2620 */
2621 case eWNI_SME_TDLS_SEND_MGMT_RSP:
2622 case eWNI_SME_TDLS_ADD_STA_RSP:
2623 case eWNI_SME_TDLS_DEL_STA_RSP:
2624 case eWNI_SME_TDLS_DEL_STA_IND:
2625 case eWNI_SME_TDLS_DEL_ALL_PEER_IND:
2626 case eWNI_SME_MGMT_FRM_TX_COMPLETION_IND:
2627 case eWNI_SME_TDLS_LINK_ESTABLISH_RSP:
2628 case eWNI_SME_TDLS_SHOULD_DISCOVER:
2629 case eWNI_SME_TDLS_SHOULD_TEARDOWN:
2630 case eWNI_SME_TDLS_PEER_DISCONNECTED:
2631 if (pMsg->bodyptr) {
2632 status = tdls_msg_processor(pMac, pMsg->type,
2633 pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302634 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002635 } else {
2636 sms_log(pMac, LOGE, FL("Empty message for %d"),
2637 pMsg->type);
2638 }
2639 break;
2640#endif
2641#ifdef WLAN_FEATURE_11W
2642 case eWNI_SME_UNPROT_MGMT_FRM_IND:
2643 if (pMsg->bodyptr) {
2644 sme_unprotected_mgmt_frm_ind(pMac, pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302645 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002646 } else {
2647 sms_log(pMac, LOGE, FL("Empty message for %d"),
2648 pMsg->type);
2649 }
2650 break;
2651#endif
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08002652#ifdef FEATURE_WLAN_ESE
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002653 case eWNI_SME_TSM_IE_IND:
2654 if (pMsg->bodyptr) {
2655 sme_tsm_ie_ind(pMac, pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302656 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002657 } else {
2658 sms_log(pMac, LOGE, FL("Empty message for %d"),
2659 pMsg->type);
2660 }
2661 break;
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08002662#endif /* FEATURE_WLAN_ESE */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002663 case eWNI_SME_ROAM_SCAN_OFFLOAD_RSP:
2664 status = csr_roam_offload_scan_rsp_hdlr((void *)pMac,
2665 pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302666 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002667 break;
2668#ifdef WLAN_FEATURE_GTK_OFFLOAD
2669 case eWNI_PMC_GTK_OFFLOAD_GETINFO_RSP:
Sreelakshmi Konamki6a065362016-05-31 16:05:01 +05302670 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_RX_WMA_MSG,
2671 NO_SESSION, pMsg->type));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002672 if (pMsg->bodyptr) {
2673 sme_process_get_gtk_info_rsp(pMac, pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302674 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002675 } else {
2676 sms_log(pMac, LOGE, FL("Empty message for %d"),
2677 pMsg->type);
2678 }
2679 break;
2680#endif
2681#ifdef FEATURE_WLAN_LPHB
2682 /* LPHB timeout indication arrived, send IND to client */
2683 case eWNI_SME_LPHB_IND:
Sreelakshmi Konamki6a065362016-05-31 16:05:01 +05302684 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_RX_WMA_MSG,
2685 NO_SESSION, pMsg->type));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002686 if (pMac->sme.pLphbIndCb)
2687 pMac->sme.pLphbIndCb(pMac->hHdd, pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302688 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002689 break;
2690#endif /* FEATURE_WLAN_LPHB */
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08002691 case eWNI_SME_IBSS_PEER_INFO_RSP:
2692 if (pMsg->bodyptr) {
2693 sme_ibss_peer_info_response_handleer(pMac,
2694 pMsg->
2695 bodyptr);
2696 qdf_mem_free(pMsg->bodyptr);
2697 } else {
2698 sms_log(pMac, LOGE, FL("Empty message for %d"),
2699 pMsg->type);
2700 }
2701 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002702 case eWNI_SME_READY_TO_SUSPEND_IND:
2703 if (pMsg->bodyptr) {
2704 sme_process_ready_to_suspend(pMac, pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302705 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002706 } else {
2707 sms_log(pMac, LOGE, FL("Empty message for %d"),
2708 pMsg->type);
2709 }
2710 break;
2711#ifdef WLAN_FEATURE_EXTWOW_SUPPORT
2712 case eWNI_SME_READY_TO_EXTWOW_IND:
2713 if (pMsg->bodyptr) {
Krishna Kumaar Natarajand9131902015-10-19 11:52:47 -07002714 sme_process_ready_to_ext_wow(pMac, pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302715 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002716 } else {
2717 sms_log(pMac, LOGE, FL("Empty message for %d"),
2718 pMsg->type);
2719 }
2720 break;
2721#endif
2722#ifdef FEATURE_WLAN_CH_AVOID
2723 /* channel avoid message arrived, send IND to client */
2724 case eWNI_SME_CH_AVOID_IND:
Sreelakshmi Konamki6a065362016-05-31 16:05:01 +05302725 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_RX_WMA_MSG,
2726 NO_SESSION, pMsg->type));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002727 if (pMac->sme.pChAvoidNotificationCb) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302728 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002729 FL("CH avoid notification"));
2730 pMac->sme.pChAvoidNotificationCb(pMac->hHdd,
2731 pMsg->bodyptr);
2732 }
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302733 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002734 break;
2735#endif /* FEATURE_WLAN_CH_AVOID */
2736#ifdef FEATURE_WLAN_AUTO_SHUTDOWN
2737 case eWNI_SME_AUTO_SHUTDOWN_IND:
2738 if (pMac->sme.pAutoShutdownNotificationCb) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302739 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002740 FL("Auto shutdown notification"));
2741 pMac->sme.pAutoShutdownNotificationCb();
2742 }
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302743 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002744 break;
2745#endif
2746 case eWNI_SME_DFS_RADAR_FOUND:
2747 case eWNI_SME_DFS_CSAIE_TX_COMPLETE_IND:
2748 status = dfs_msg_processor(pMac, pMsg->type, pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302749 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002750 break;
2751 case eWNI_SME_CHANNEL_CHANGE_RSP:
2752 if (pMsg->bodyptr) {
2753 status = sme_process_channel_change_resp(pMac,
2754 pMsg->type,
2755 pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302756 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002757 } else {
2758 sms_log(pMac, LOGE, FL("Empty message for %d"),
2759 pMsg->type);
2760 }
2761 break;
2762#ifdef WLAN_FEATURE_STATS_EXT
2763 case eWNI_SME_STATS_EXT_EVENT:
2764 if (pMsg->bodyptr) {
2765 status = sme_stats_ext_event(hHal, pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302766 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002767 } else {
2768 sms_log(pMac, LOGE, FL("Empty message for %d"),
2769 pMsg->type);
2770 }
2771 break;
2772#endif
2773 case eWNI_SME_LINK_SPEED_IND:
2774 if (pMac->sme.pLinkSpeedIndCb)
2775 pMac->sme.pLinkSpeedIndCb(pMsg->bodyptr,
2776 pMac->sme.pLinkSpeedCbContext);
2777 if (pMsg->bodyptr)
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302778 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002779 break;
2780 case eWNI_SME_CSA_OFFLOAD_EVENT:
2781 if (pMsg->bodyptr) {
2782 csr_scan_flush_bss_entry(pMac, pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302783 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002784 }
2785 break;
Manikandan Mohandcc21ba2016-03-15 14:31:56 -07002786 case eWNI_SME_TSF_EVENT:
2787 if (pMac->sme.get_tsf_cb) {
2788 pMac->sme.get_tsf_cb(pMac->sme.get_tsf_cxt,
2789 (struct stsf *)pMsg->bodyptr);
2790 }
2791 if (pMsg->bodyptr)
2792 qdf_mem_free(pMsg->bodyptr);
2793 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002794#ifdef WLAN_FEATURE_NAN
2795 case eWNI_SME_NAN_EVENT:
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 (pMsg->bodyptr) {
2799 sme_nan_event(hHal, pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302800 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002801 }
2802 break;
2803#endif /* WLAN_FEATURE_NAN */
2804 case eWNI_SME_LINK_STATUS_IND:
2805 {
2806 tAniGetLinkStatus *pLinkStatus =
2807 (tAniGetLinkStatus *) pMsg->bodyptr;
2808 if (pLinkStatus) {
2809 if (pMac->sme.linkStatusCallback) {
2810 pMac->sme.linkStatusCallback(
2811 pLinkStatus->linkStatus,
2812 pMac->sme.linkStatusContext);
2813 }
2814 pMac->sme.linkStatusCallback = NULL;
2815 pMac->sme.linkStatusContext = NULL;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302816 qdf_mem_free(pLinkStatus);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002817 }
2818 break;
2819 }
2820 case eWNI_SME_MSG_GET_TEMPERATURE_IND:
2821 if (pMac->sme.pGetTemperatureCb) {
2822 pMac->sme.pGetTemperatureCb(pMsg->bodyval,
2823 pMac->sme.pTemperatureCbContext);
2824 }
2825 break;
2826 case eWNI_SME_SNR_IND:
2827 {
2828 tAniGetSnrReq *pSnrReq = (tAniGetSnrReq *) pMsg->bodyptr;
2829 if (pSnrReq) {
2830 if (pSnrReq->snrCallback) {
2831 ((tCsrSnrCallback)
2832 (pSnrReq->snrCallback))
2833 (pSnrReq->snr, pSnrReq->staId,
2834 pSnrReq->pDevContext);
2835 }
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302836 qdf_mem_free(pSnrReq);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002837 }
2838 break;
2839 }
2840#ifdef FEATURE_WLAN_EXTSCAN
2841 case eWNI_SME_EXTSCAN_FULL_SCAN_RESULT_IND:
2842 if (pMac->sme.pExtScanIndCb)
2843 pMac->sme.pExtScanIndCb(pMac->hHdd,
2844 eSIR_EXTSCAN_FULL_SCAN_RESULT_IND,
2845 pMsg->bodyptr);
2846 else
2847 sms_log(pMac, LOGE,
2848 FL("callback not registered to process %d"),
2849 pMsg->type);
2850
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302851 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002852 break;
2853 case eWNI_SME_EPNO_NETWORK_FOUND_IND:
2854 if (pMac->sme.pExtScanIndCb)
2855 pMac->sme.pExtScanIndCb(pMac->hHdd,
2856 eSIR_EPNO_NETWORK_FOUND_IND,
2857 pMsg->bodyptr);
2858 else
2859 sms_log(pMac, LOGE,
2860 FL("callback not registered to process %d"),
2861 pMsg->type);
2862
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302863 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002864 break;
2865#endif
2866 case eWNI_SME_FW_DUMP_IND:
2867 sme_process_fw_mem_dump_rsp(pMac, pMsg);
2868 break;
2869 case eWNI_SME_SET_HW_MODE_RESP:
2870 if (pMsg->bodyptr) {
2871 status = sme_process_set_hw_mode_resp(pMac,
2872 pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302873 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002874 } else {
2875 sms_log(pMac, LOGE, FL("Empty message for %d"),
2876 pMsg->type);
2877 }
2878 break;
2879 case eWNI_SME_HW_MODE_TRANS_IND:
2880 if (pMsg->bodyptr) {
2881 status = sme_process_hw_mode_trans_ind(pMac,
2882 pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302883 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002884 } else {
2885 sms_log(pMac, LOGE, FL("Empty message for %d"),
2886 pMsg->type);
2887 }
2888 break;
2889 case eWNI_SME_NSS_UPDATE_RSP:
2890 if (pMsg->bodyptr) {
2891 status = sme_process_nss_update_resp(pMac,
2892 pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302893 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002894 } else {
2895 sms_log(pMac, LOGE, FL("Empty message for %d"),
2896 pMsg->type);
2897 }
2898 break;
2899 case eWNI_SME_OCB_SET_CONFIG_RSP:
2900 if (pMac->sme.ocb_set_config_callback) {
2901 pMac->sme.ocb_set_config_callback(
2902 pMac->sme.ocb_set_config_context,
2903 pMsg->bodyptr);
2904 } else {
2905 sms_log(pMac, LOGE, FL(
2906 "Message error. The callback is NULL."));
2907 }
2908 pMac->sme.ocb_set_config_callback = NULL;
2909 pMac->sme.ocb_set_config_context = NULL;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302910 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002911 break;
2912 case eWNI_SME_OCB_GET_TSF_TIMER_RSP:
2913 if (pMac->sme.ocb_get_tsf_timer_callback) {
2914 pMac->sme.ocb_get_tsf_timer_callback(
2915 pMac->sme.ocb_get_tsf_timer_context,
2916 pMsg->bodyptr);
2917 } else {
2918 sms_log(pMac, LOGE, FL(
2919 "Message error. The callback is NULL."));
2920 }
2921 pMac->sme.ocb_get_tsf_timer_callback = NULL;
2922 pMac->sme.ocb_get_tsf_timer_context = NULL;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302923 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002924 break;
2925 case eWNI_SME_DCC_GET_STATS_RSP:
2926 if (pMac->sme.dcc_get_stats_callback) {
2927 pMac->sme.dcc_get_stats_callback(
2928 pMac->sme.dcc_get_stats_context,
2929 pMsg->bodyptr);
2930 } else {
2931 sms_log(pMac, LOGE, FL(
2932 "Message error. The callback is NULL."));
2933 }
2934 pMac->sme.dcc_get_stats_callback = NULL;
2935 pMac->sme.dcc_get_stats_context = NULL;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302936 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002937 break;
2938 case eWNI_SME_DCC_UPDATE_NDL_RSP:
2939 if (pMac->sme.dcc_update_ndl_callback) {
2940 pMac->sme.dcc_update_ndl_callback(
2941 pMac->sme.dcc_update_ndl_context,
2942 pMsg->bodyptr);
2943 } else {
2944 sms_log(pMac, LOGE, FL(
2945 "Message error. The callback is NULL."));
2946 }
2947 pMac->sme.dcc_update_ndl_callback = NULL;
2948 pMac->sme.dcc_update_ndl_context = NULL;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302949 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002950 break;
2951 case eWNI_SME_DCC_STATS_EVENT:
2952 if (pMac->sme.dcc_stats_event_callback) {
2953 pMac->sme.dcc_stats_event_callback(
2954 pMac->sme.dcc_stats_event_context,
2955 pMsg->bodyptr);
2956 } else {
2957 sms_log(pMac, LOGE, FL(
2958 "Message error. The callback is NULL."));
2959 }
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302960 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002961 break;
2962 case eWNI_SME_SET_DUAL_MAC_CFG_RESP:
2963 if (pMsg->bodyptr) {
2964 status = sme_process_dual_mac_config_resp(pMac,
2965 pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302966 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002967 } else {
2968 sms_log(pMac, LOGE, FL("Empty message for %d"),
2969 pMsg->type);
2970 }
2971 case eWNI_SME_SET_THERMAL_LEVEL_IND:
2972 if (pMac->sme.set_thermal_level_cb)
2973 pMac->sme.set_thermal_level_cb(pMac->hHdd,
2974 pMsg->bodyval);
2975 break;
Abhishek Singh518323d2015-10-19 17:42:01 +05302976 case eWNI_SME_EXT_CHANGE_CHANNEL_IND:
2977 status = sme_extended_change_channel_ind(pMac, pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302978 qdf_mem_free(pMsg->bodyptr);
Abhishek Singh518323d2015-10-19 17:42:01 +05302979 break;
Archana Ramachandrana20ef812015-11-13 16:12:13 -08002980 case eWNI_SME_SET_ANTENNA_MODE_RESP:
2981 if (pMsg->bodyptr) {
2982 status = sme_process_antenna_mode_resp(pMac,
2983 pMsg->bodyptr);
2984 qdf_mem_free(pMsg->bodyptr);
2985 } else {
2986 sms_log(pMac, LOGE, FL("Empty message for %d"),
2987 pMsg->type);
2988 }
2989 break;
Deepak Dhamdhere0f076bd2016-06-02 11:29:21 -07002990 case eWNI_SME_NDP_CONFIRM_IND:
2991 case eWNI_SME_NDP_NEW_PEER_IND:
2992 case eWNI_SME_NDP_INITIATOR_RSP:
Abhishek Singh4fef7472016-06-06 11:36:03 -07002993 case eWNI_SME_NDP_INDICATION:
2994 case eWNI_SME_NDP_RESPONDER_RSP:
Naveen Rawatf28315c2016-06-29 18:06:02 -07002995 case eWNI_SME_NDP_END_RSP:
Deepak Dhamdherea6d2f4c2016-06-04 00:24:52 -07002996 case eWNI_SME_NDP_END_IND:
2997 case eWNI_SME_NDP_PEER_DEPARTED_IND:
Deepak Dhamdhere0f076bd2016-06-02 11:29:21 -07002998 sme_ndp_msg_processor(pMac, pMsg);
2999 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003000 default:
3001
3002 if ((pMsg->type >= eWNI_SME_MSG_TYPES_BEGIN)
3003 && (pMsg->type <= eWNI_SME_MSG_TYPES_END)) {
3004 /* CSR */
3005 if (pMsg->bodyptr) {
3006 status = csr_msg_processor(hHal, pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303007 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003008 } else {
3009 sms_log(pMac, LOGE, FL("Empty message for %d"),
3010 pMsg->type);
3011 }
3012 } else {
3013 sms_log(pMac, LOGW, FL("Unknown message type %d"),
3014 pMsg->type);
3015 if (pMsg->bodyptr)
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303016 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003017 }
3018 } /* switch */
3019release_lock:
3020 sme_release_global_lock(&pMac->sme);
3021 return status;
3022}
3023
3024/**
3025 * sme_process_nss_update_resp() - Process nss update response
3026 * @mac: Global MAC pointer
3027 * @msg: nss update response
3028 *
3029 * Processes the nss update response and invokes the HDD
3030 * callback to process further
3031 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303032QDF_STATUS sme_process_nss_update_resp(tpAniSirGlobal mac, uint8_t *msg)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003033{
3034 tListElem *entry = NULL;
3035 tSmeCmd *command = NULL;
3036 bool found;
3037 nss_update_cb callback = NULL;
3038 struct sir_beacon_tx_complete_rsp *param;
3039
3040 param = (struct sir_beacon_tx_complete_rsp *)msg;
3041 if (!param) {
3042 sms_log(mac, LOGE, FL("nss update resp param is NULL"));
3043 /* Not returning. Need to check if active command list
3044 * needs to be freed
3045 */
3046 }
3047
3048 entry = csr_ll_peek_head(&mac->sme.smeCmdActiveList,
3049 LL_ACCESS_LOCK);
3050 if (!entry) {
3051 sms_log(mac, LOGE, FL("No cmd found in active list"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303052 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003053 }
3054
3055 command = GET_BASE_ADDR(entry, tSmeCmd, Link);
3056 if (!command) {
3057 sms_log(mac, LOGE, FL("Base address is NULL"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303058 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003059 }
3060
3061 if (e_sme_command_nss_update != command->command) {
3062 sms_log(mac, LOGE, FL("Command mismatch!"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303063 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003064 }
3065
3066 callback = command->u.nss_update_cmd.nss_update_cb;
3067 if (callback) {
3068 if (!param) {
3069 sms_log(mac, LOGE,
3070 FL("Callback failed since nss update params is NULL"));
3071 } else {
3072 sms_log(mac, LOGE,
3073 FL("Calling HDD callback for nss update response"));
3074 callback(command->u.nss_update_cmd.context,
3075 param->tx_status,
3076 param->session_id,
Chandrasekaran, Manishekarce2172e2016-02-18 16:12:43 +05303077 command->u.nss_update_cmd.next_action,
3078 command->u.nss_update_cmd.reason);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003079 }
3080 } else {
3081 sms_log(mac, LOGE, FL("Callback does not exisit"));
3082 }
3083
3084 found = csr_ll_remove_entry(&mac->sme.smeCmdActiveList, entry,
3085 LL_ACCESS_LOCK);
3086 if (found) {
3087 /* Now put this command back on the avilable command list */
3088 sme_release_command(mac, command);
3089 }
3090 sme_process_pending_queue(mac);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303091 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003092}
3093
3094/* No need to hold the global lock here because this function can only be called */
3095/* after sme_stop. */
3096void sme_free_msg(tHalHandle hHal, cds_msg_t *pMsg)
3097{
3098 if (pMsg) {
3099 if (pMsg->bodyptr) {
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303100 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003101 }
3102 }
3103
3104}
3105
3106/*--------------------------------------------------------------------------
3107
3108 \brief sme_stop() - Stop all SME modules and put them at idle state
3109
3110 The function stops each module in SME, PMC, CSR, etc. . Upon
3111 return, all modules are at idle state ready to start.
3112
3113 This is a synchronous call
3114 \param hHal - The handle returned by mac_open
3115 \param tHalStopType - reason for stopping
3116
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303117 \return QDF_STATUS_SUCCESS - SME is stopped.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003118
3119 Other status means SME is failed to stop but caller should still
3120 consider SME is stopped.
3121 \sa
3122
3123 --------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303124QDF_STATUS sme_stop(tHalHandle hHal, tHalStopType stopType)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003125{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303126 QDF_STATUS status = QDF_STATUS_E_FAILURE;
3127 QDF_STATUS fail_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003128 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
3129
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003130 p2p_stop(hHal);
3131
3132 status = csr_stop(pMac, stopType);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303133 if (!QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003134 sms_log(pMac, LOGE,
3135 "csr_stop failed during smeStop with status=%d", status);
3136 fail_status = status;
3137 }
3138
3139 purge_sme_cmd_list(pMac);
3140
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303141 if (!QDF_IS_STATUS_SUCCESS(fail_status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003142 status = fail_status;
3143 }
3144
3145 pMac->sme.state = SME_STATE_STOP;
3146
3147 return status;
3148}
3149
3150/*--------------------------------------------------------------------------
3151
3152 \brief sme_close() - Release all SME modules and their resources.
3153
3154 The function release each module in SME, PMC, CSR, etc. . Upon
3155 return, all modules are at closed state.
3156
3157 No SME APIs can be involved after smeClose except smeOpen.
3158 smeClose must be called before mac_close.
3159 This is a synchronous call
3160 \param hHal - The handle returned by mac_open
3161
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303162 \return QDF_STATUS_SUCCESS - SME is successfully close.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003163
3164 Other status means SME is failed to be closed but caller still cannot
3165 call any other SME functions except smeOpen.
3166 \sa
3167
3168 --------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303169QDF_STATUS sme_close(tHalHandle hHal)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003170{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303171 QDF_STATUS status = QDF_STATUS_E_FAILURE;
3172 QDF_STATUS fail_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003173 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
3174
3175 if (!pMac)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303176 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003177
3178 /* Note: pSession will be invalid from here on, do not access */
3179 status = csr_close(pMac);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303180 if (!QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003181 sms_log(pMac, LOGE,
3182 "csr_close failed during sme close with status=%d",
3183 status);
3184 fail_status = status;
3185 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003186#ifndef WLAN_MDM_CODE_REDUCTION_OPT
3187 status = sme_qos_close(pMac);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303188 if (!QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003189 sms_log(pMac, LOGE,
3190 "Qos close failed during sme close with status=%d",
3191 status);
3192 fail_status = status;
3193 }
3194#endif
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003195 status = sme_ps_close(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303196 if (!QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003197 sms_log(pMac, LOGE,
3198 "sme_ps_close failed during smeClose status=%d",
3199 status);
3200 fail_status = status;
3201 }
3202
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003203 status = rrm_close(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303204 if (!QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003205 sms_log(pMac, LOGE,
3206 "RRM close failed during sme close with status=%d",
3207 status);
3208 fail_status = status;
3209 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003210
3211 sme_p2p_close(hHal);
3212
3213 free_sme_cmd_list(pMac);
3214
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303215 if (!QDF_IS_STATUS_SUCCESS
Anurag Chouhana37b5b72016-02-21 14:53:42 +05303216 (qdf_mutex_destroy(&pMac->sme.lkSmeGlobalLock))) {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303217 fail_status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003218 }
3219
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303220 if (!QDF_IS_STATUS_SUCCESS(fail_status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003221 status = fail_status;
3222 }
3223
3224 pMac->sme.state = SME_STATE_STOP;
3225
3226 return status;
3227}
3228
3229/**
3230 * sme_scan_request() - wrapper function to Request a 11d or full scan from CSR.
3231 * @hal: hal global context
3232 * @session_id: session id
3233 * @scan_req: scan req
3234 * @callback: a callback function that scan calls upon finish, will not
3235 * be called if csr_scan_request returns error
3236 * @ctx: a pointer passed in for the callback
3237 *
3238 * This is a wrapper function to Request a 11d or full scan from CSR. This is
3239 * an asynchronous call
3240 *
3241 * Return: Status of operation
3242 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303243QDF_STATUS sme_scan_request(tHalHandle hal, uint8_t session_id,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003244 tCsrScanRequest *scan_req,
3245 csr_scan_completeCallback callback, void *ctx)
3246{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303247 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003248 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
3249 struct ani_scan_req *scan_msg;
3250 cds_msg_t msg;
3251 uint32_t scan_req_id, scan_count;
3252
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303253 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003254 TRACE_CODE_SME_RX_HDD_MSG_SCAN_REQ, session_id,
3255 scan_req->scanType));
Chandrasekaran, Manishekar2859de42016-02-11 16:17:38 +05303256
3257 if (!CSR_IS_SESSION_VALID(mac_ctx, session_id)) {
3258 sms_log(mac_ctx, LOGE, FL("Invalid session id:%d"),
3259 session_id);
3260 return status;
3261 }
3262
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003263 if (!mac_ctx->scan.fScanEnable) {
3264 sms_log(mac_ctx, LOGE, FL("fScanEnable false"));
3265 return status;
3266 }
3267
3268 scan_count = csr_ll_count(&mac_ctx->sme.smeScanCmdActiveList);
3269 if (scan_count >= mac_ctx->scan.max_scan_count) {
3270 sms_log(mac_ctx, LOGE, FL("Max scan reached"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303271 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003272 }
3273 wma_get_scan_id(&scan_req_id);
3274 scan_req->scan_id = scan_req_id;
3275
3276 status = sme_acquire_global_lock(&mac_ctx->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303277 if (!QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003278 sms_log(mac_ctx, LOGE, FL("Unable to acquire lock"));
3279 return status;
3280 }
3281 sms_log(mac_ctx, LOG1, FL(" called"));
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303282 scan_msg = qdf_mem_malloc(sizeof(struct ani_scan_req));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003283 if (NULL == scan_msg) {
3284 sms_log(mac_ctx, LOGE,
3285 " scan_req: failed to allocate mem for msg");
3286 sme_release_global_lock(&mac_ctx->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303287 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003288 }
3289 scan_msg->msg_type = eWNI_SME_SCAN_CMD;
3290 scan_msg->msg_len = (uint16_t) sizeof(struct ani_scan_req);
3291 scan_msg->session_id = session_id;
3292 scan_msg->callback = callback;
3293 scan_msg->ctx = ctx;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303294 scan_msg->scan_param = qdf_mem_malloc(sizeof(tCsrScanRequest));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003295 if (NULL == scan_msg->scan_param) {
3296 sms_log(mac_ctx, LOGE,
3297 "scan_req:failed to allocate mem for scanreq");
3298 sme_release_global_lock(&mac_ctx->sme);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303299 qdf_mem_free(scan_msg);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303300 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003301 }
3302 csr_scan_copy_request(mac_ctx, scan_msg->scan_param, scan_req);
3303 msg.type = eWNI_SME_SCAN_CMD;
3304 msg.bodyptr = scan_msg;
3305 msg.reserved = 0;
3306 msg.bodyval = 0;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303307 if (QDF_STATUS_SUCCESS !=
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003308 cds_mq_post_message(CDS_MQ_ID_SME, &msg)) {
3309 sms_log(mac_ctx, LOGE,
3310 " sme_scan_req failed to post msg");
3311 csr_scan_free_request(mac_ctx, scan_msg->scan_param);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303312 qdf_mem_free(scan_msg->scan_param);
3313 qdf_mem_free(scan_msg);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303314 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003315 }
3316 sme_release_global_lock(&mac_ctx->sme);
3317 return status;
3318}
3319
3320/* ---------------------------------------------------------------------------
3321 \fn sme_scan_get_result
3322 \brief a wrapper function to request scan results from CSR.
3323 This is a synchronous call
3324 \param pFilter - If pFilter is NULL, all cached results are returned
3325 \param phResult - an object for the result.
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303326 \return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003327 ---------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303328QDF_STATUS sme_scan_get_result(tHalHandle hHal, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003329 tCsrScanResultFilter *pFilter,
3330 tScanResultHandle *phResult)
3331{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303332 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003333 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
3334
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303335 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003336 TRACE_CODE_SME_RX_HDD_MSG_SCAN_GET_RESULTS, sessionId,
3337 0));
3338 sms_log(pMac, LOG2, FL("enter"));
3339 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303340 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003341 status = csr_scan_get_result(hHal, pFilter, phResult);
3342 sme_release_global_lock(&pMac->sme);
3343 }
3344 sms_log(pMac, LOG2, FL("exit status %d"), status);
3345
3346 return status;
3347}
3348
3349/**
3350 * sme_get_ap_channel_from_scan_cache() - a wrapper function to get AP's
3351 * channel id from CSR by filtering the
3352 * result which matches our roam profile.
3353 * @profile: SAP adapter
3354 * @ap_chnl_id: pointer to channel id of SAP. Fill the value after finding the
3355 * best ap from scan cache.
3356 *
3357 * This function is written to get AP's channel id from CSR by filtering
3358 * the result which matches our roam profile. This is a synchronous call.
3359 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303360 * Return: QDF_STATUS.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003361 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303362QDF_STATUS sme_get_ap_channel_from_scan_cache(tHalHandle hal_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003363 tCsrRoamProfile *profile,
3364 tScanResultHandle *scan_cache,
3365 uint8_t *ap_chnl_id)
3366{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303367 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003368 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal_handle);
3369 tCsrScanResultFilter *scan_filter = NULL;
3370 tScanResultHandle filtered_scan_result = NULL;
3371 tSirBssDescription first_ap_profile;
3372
3373 if (NULL == mac_ctx) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303374 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003375 FL("mac_ctx is NULL"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303376 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003377 }
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303378 scan_filter = qdf_mem_malloc(sizeof(tCsrScanResultFilter));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003379 if (NULL == scan_filter) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303380 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003381 FL("scan_filter mem alloc failed"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303382 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003383 } else {
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303384 qdf_mem_set(scan_filter, sizeof(tCsrScanResultFilter), 0);
3385 qdf_mem_set(&first_ap_profile, sizeof(tSirBssDescription), 0);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003386
3387 if (NULL == profile) {
3388 scan_filter->EncryptionType.numEntries = 1;
3389 scan_filter->EncryptionType.encryptionType[0]
3390 = eCSR_ENCRYPT_TYPE_NONE;
3391 } else {
3392 /* Here is the profile we need to connect to */
3393 status = csr_roam_prepare_filter_from_profile(mac_ctx,
3394 profile,
3395 scan_filter);
3396 }
3397
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303398 if (QDF_STATUS_SUCCESS == status) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003399 /* Save the WPS info */
3400 if (NULL != profile) {
3401 scan_filter->bWPSAssociation =
3402 profile->bWPSAssociation;
3403 scan_filter->bOSENAssociation =
3404 profile->bOSENAssociation;
3405 } else {
3406 scan_filter->bWPSAssociation = 0;
3407 scan_filter->bOSENAssociation = 0;
3408 }
3409 } else {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303410 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003411 FL("Preparing the profile filter failed"));
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303412 qdf_mem_free(scan_filter);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303413 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003414 }
3415 }
3416 status = sme_acquire_global_lock(&mac_ctx->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303417 if (QDF_STATUS_SUCCESS == status) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003418 status = csr_scan_get_result(hal_handle, scan_filter,
3419 &filtered_scan_result);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303420 if (QDF_STATUS_SUCCESS == status) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003421 csr_get_bssdescr_from_scan_handle(filtered_scan_result,
3422 &first_ap_profile);
3423 *scan_cache = filtered_scan_result;
3424 if (0 != first_ap_profile.channelId) {
3425 *ap_chnl_id = first_ap_profile.channelId;
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303426 QDF_TRACE(QDF_MODULE_ID_SME,
3427 QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003428 FL("Found best AP & its on chnl[%d]"),
3429 first_ap_profile.channelId);
3430 } else {
3431 /*
3432 * This means scan result is empty
3433 * so set the channel to zero, caller should
3434 * take of zero channel id case.
3435 */
3436 *ap_chnl_id = 0;
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303437 QDF_TRACE(QDF_MODULE_ID_SME,
3438 QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003439 FL("Scan is empty, set chnl to 0"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303440 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003441 }
3442 } else {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303443 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003444 FL("Failed to get scan get result"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303445 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003446 }
3447 csr_free_scan_filter(mac_ctx, scan_filter);
3448 sme_release_global_lock(&mac_ctx->sme);
3449 } else {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303450 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003451 FL("Aquiring lock failed"));
Krunal Sonif9882222016-01-22 17:16:50 -08003452 csr_free_scan_filter(mac_ctx, scan_filter);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303453 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003454 }
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303455 qdf_mem_free(scan_filter);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003456 return status;
3457}
3458
3459/**
3460 * sme_store_joinreq_param() - This function will pass station's join
3461 * request to store to csr.
3462 * @hal_handle: pointer to hal context.
3463 * @profile: pointer to station's roam profile.
3464 * @scan_cache: pointer to station's scan cache.
3465 * @roam_id: reference to roam_id variable being passed.
3466 * @session_id: station's session id.
3467 *
3468 * This function will pass station's join request further down to csr
3469 * to store it. this stored parameter will be used later.
3470 *
3471 * Return: true or false based on function's overall success.
3472 **/
3473bool sme_store_joinreq_param(tHalHandle hal_handle,
3474 tCsrRoamProfile *profile,
3475 tScanResultHandle scan_cache,
3476 uint32_t *roam_id,
3477 uint32_t session_id)
3478{
3479 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal_handle);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303480 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003481 bool ret_status = true;
3482
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303483 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003484 TRACE_CODE_SME_RX_HDD_STORE_JOIN_REQ,
3485 session_id, 0));
3486 status = sme_acquire_global_lock(&mac_ctx->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303487 if (QDF_STATUS_SUCCESS == status) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003488 if (false == csr_store_joinreq_param(mac_ctx, profile,
3489 scan_cache, roam_id, session_id)) {
3490 ret_status = false;
3491 }
3492 sme_release_global_lock(&mac_ctx->sme);
3493 } else {
3494 ret_status = false;
3495 }
3496
3497 return ret_status;
3498}
3499
3500/**
3501 * sme_clear_joinreq_param() - This function will pass station's clear
3502 * the join request to csr.
3503 * @hal_handle: pointer to hal context.
3504 * @session_id: station's session id.
3505 *
3506 * This function will pass station's clear join request further down to csr
3507 * to cleanup.
3508 *
3509 * Return: true or false based on function's overall success.
3510 **/
3511bool sme_clear_joinreq_param(tHalHandle hal_handle,
3512 uint32_t session_id)
3513{
3514 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal_handle);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303515 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003516 bool ret_status = true;
3517
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303518 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003519 TRACE_CODE_SME_RX_HDD_CLEAR_JOIN_REQ,
3520 session_id, 0));
3521 status = sme_acquire_global_lock(&mac_ctx->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303522 if (QDF_STATUS_SUCCESS == status) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003523 if (false == csr_clear_joinreq_param(mac_ctx,
3524 session_id)) {
3525 ret_status = false;
3526 }
3527 sme_release_global_lock(&mac_ctx->sme);
3528 } else {
3529 ret_status = false;
3530 }
3531
3532 return ret_status;
3533}
3534
3535/**
3536 * sme_issue_stored_joinreq() - This function will issues station's stored
3537 * the join request to csr.
3538 * @hal_handle: pointer to hal context.
3539 * @roam_id: reference to roam_id variable being passed.
3540 * @session_id: station's session id.
3541 *
3542 * This function will issue station's stored join request further down to csr
3543 * to proceed forward.
3544 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303545 * Return: QDF_STATUS_SUCCESS or QDF_STATUS_E_FAILURE.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003546 **/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303547QDF_STATUS sme_issue_stored_joinreq(tHalHandle hal_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003548 uint32_t *roam_id,
3549 uint32_t session_id)
3550{
3551 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal_handle);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303552 QDF_STATUS status = QDF_STATUS_E_FAILURE;
3553 QDF_STATUS ret_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003554
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303555 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003556 TRACE_CODE_SME_RX_HDD_ISSUE_JOIN_REQ,
3557 session_id, 0));
3558 status = sme_acquire_global_lock(&mac_ctx->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303559 if (QDF_STATUS_SUCCESS == status) {
3560 if (QDF_STATUS_SUCCESS != csr_issue_stored_joinreq(mac_ctx,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003561 roam_id,
3562 session_id)) {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303563 ret_status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003564 }
3565 sme_release_global_lock(&mac_ctx->sme);
3566 } else {
3567 csr_clear_joinreq_param(mac_ctx, session_id);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303568 ret_status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003569 }
3570 return ret_status;
3571}
3572
3573/* ---------------------------------------------------------------------------
3574 \fn sme_scan_flush_result
3575 \brief a wrapper function to request CSR to clear scan results.
3576 This is a synchronous call
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303577 \return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003578 ---------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303579QDF_STATUS sme_scan_flush_result(tHalHandle hHal)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003580{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303581 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003582 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
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_MSG_SCAN_FLUSH_RESULTS,
3586 0, 0));
3587 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303588 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003589 status = csr_scan_flush_result(hHal);
3590 sme_release_global_lock(&pMac->sme);
3591 }
3592
3593 return status;
3594}
3595
3596/* ---------------------------------------------------------------------------
3597 \fn sme_filter_scan_results
3598 \brief a wrapper function to request CSR to clear scan results.
3599 This is a synchronous call
3600 \param tHalHandle - HAL context handle
3601 \param sessionId - session id
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303602 \return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003603 ---------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303604QDF_STATUS sme_filter_scan_results(tHalHandle hHal, uint8_t sessionId)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003605{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303606 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003607 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
3608
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303609 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003610 TRACE_CODE_SME_RX_HDD_MSG_SCAN_FLUSH_RESULTS,
3611 sessionId, 0));
3612 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303613 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003614 csr_scan_filter_results(pMac);
3615 sme_release_global_lock(&pMac->sme);
3616 }
3617
3618 return status;
3619}
3620
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303621QDF_STATUS sme_scan_flush_p2p_result(tHalHandle hHal, uint8_t sessionId)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003622{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303623 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003624 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
3625
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303626 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003627 TRACE_CODE_SME_RX_HDD_MSG_SCAN_FLUSH_P2PRESULTS,
3628 sessionId, 0));
3629 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303630 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003631 status = csr_scan_flush_selective_result(hHal, true);
3632 sme_release_global_lock(&pMac->sme);
3633 }
3634
3635 return status;
3636}
3637
3638/* ---------------------------------------------------------------------------
3639 \fn sme_scan_result_get_first
3640 \brief a wrapper function to request CSR to returns the first element of
3641 scan result.
3642 This is a synchronous call
3643 \param hScanResult - returned from csr_scan_get_result
3644 \return tCsrScanResultInfo * - NULL if no result
3645 ---------------------------------------------------------------------------*/
3646tCsrScanResultInfo *sme_scan_result_get_first(tHalHandle hHal,
3647 tScanResultHandle hScanResult)
3648{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303649 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003650 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
3651 tCsrScanResultInfo *pRet = NULL;
3652
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303653 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003654 TRACE_CODE_SME_RX_HDD_MSG_SCAN_RESULT_GETFIRST,
3655 NO_SESSION, 0));
3656 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303657 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003658 pRet = csr_scan_result_get_first(pMac, hScanResult);
3659 sme_release_global_lock(&pMac->sme);
3660 }
3661
3662 return pRet;
3663}
3664
3665/* ---------------------------------------------------------------------------
3666 \fn sme_scan_result_get_next
3667 \brief a wrapper function to request CSR to returns the next element of
3668 scan result. It can be called without calling csr_scan_result_get_first
3669 first
3670 This is a synchronous call
3671 \param hScanResult - returned from csr_scan_get_result
3672 \return Null if no result or reach the end
3673 ---------------------------------------------------------------------------*/
3674tCsrScanResultInfo *sme_scan_result_get_next(tHalHandle hHal,
3675 tScanResultHandle hScanResult)
3676{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303677 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003678 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
3679 tCsrScanResultInfo *pRet = NULL;
3680
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003681 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303682 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003683 pRet = csr_scan_result_get_next(pMac, hScanResult);
3684 sme_release_global_lock(&pMac->sme);
3685 }
3686
3687 return pRet;
3688}
3689
3690/* ---------------------------------------------------------------------------
3691 \fn sme_scan_result_purge
3692 \brief a wrapper function to request CSR to remove all items(tCsrScanResult)
3693 in the list and free memory for each item
3694 This is a synchronous call
3695 \param hScanResult - returned from csr_scan_get_result. hScanResult is
3696 considered gone by
3697 calling this function and even before this function reutrns.
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303698 \return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003699 ---------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303700QDF_STATUS sme_scan_result_purge(tHalHandle hHal, tScanResultHandle hScanResult)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003701{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303702 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003703 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
3704
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303705 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003706 TRACE_CODE_SME_RX_HDD_MSG_SCAN_RESULT_PURGE,
3707 NO_SESSION, 0));
3708 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303709 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003710 status = csr_scan_result_purge(hHal, hScanResult);
3711 sme_release_global_lock(&pMac->sme);
3712 }
3713
3714 return status;
3715}
3716
3717/* ---------------------------------------------------------------------------
3718 \fn sme_scan_get_pmkid_candidate_list
3719 \brief a wrapper function to return the PMKID candidate list
3720 This is a synchronous call
3721 \param pPmkidList - caller allocated buffer point to an array of
3722 tPmkidCandidateInfo
3723 \param pNumItems - pointer to a variable that has the number of
3724 tPmkidCandidateInfo allocated when retruning, this is
3725 either the number needed or number of items put into
3726 pPmkidList
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303727 \return QDF_STATUS - when fail, it usually means the buffer allocated is not
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003728 big enough and pNumItems
3729 has the number of tPmkidCandidateInfo.
3730 \Note: pNumItems is a number of tPmkidCandidateInfo,
3731 not sizeof(tPmkidCandidateInfo) * something
3732 ---------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303733QDF_STATUS sme_scan_get_pmkid_candidate_list(tHalHandle hHal, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003734 tPmkidCandidateInfo *pPmkidList,
3735 uint32_t *pNumItems)
3736{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303737 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003738 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
3739
3740 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303741 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003742 status =
3743 csr_scan_get_pmkid_candidate_list(pMac, sessionId,
3744 pPmkidList,
3745 pNumItems);
3746 sme_release_global_lock(&pMac->sme);
3747 }
3748
3749 return status;
3750}
3751
3752eCsrPhyMode sme_get_phy_mode(tHalHandle hHal)
3753{
3754 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
3755 return pMac->roam.configParam.phyMode;
3756}
3757
3758/* ---------------------------------------------------------------------------
3759 \fn sme_get_channel_bonding_mode5_g
3760 \brief get the channel bonding mode for 5G band
3761 \param hHal - HAL handle
3762 \return channel bonding mode for 5G
3763 ---------------------------------------------------------------------------*/
3764uint32_t sme_get_channel_bonding_mode5_g(tHalHandle hHal)
3765{
3766 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
3767 tSmeConfigParams smeConfig;
3768
3769 sme_get_config_param(pMac, &smeConfig);
3770
3771 return smeConfig.csrConfig.channelBondingMode5GHz;
3772}
3773
3774/* ---------------------------------------------------------------------------
3775 \fn sme_get_channel_bonding_mode24_g
3776 \brief get the channel bonding mode for 2.4G band
3777 \param hHal - HAL handle
3778 \return channel bonding mode for 2.4G
3779 ---------------------------------------------------------------------------*/
3780uint32_t sme_get_channel_bonding_mode24_g(tHalHandle hHal)
3781{
3782 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
3783 tSmeConfigParams smeConfig;
3784
3785 sme_get_config_param(pMac, &smeConfig);
3786
3787 return smeConfig.csrConfig.channelBondingMode24GHz;
3788}
3789
3790/* ---------------------------------------------------------------------------
3791 \fn sme_roam_connect
3792 \brief a wrapper function to request CSR to inititiate an association
3793 This is an asynchronous call.
3794 \param sessionId - the sessionId returned by sme_open_session.
3795 \param pProfile - description of the network to which to connect
3796 \param hBssListIn - a list of BSS descriptor to roam to. It is returned
3797 from csr_scan_get_result
3798 \param pRoamId - to get back the request ID
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_roam_connect(tHalHandle hHal, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003802 tCsrRoamProfile *pProfile, uint32_t *pRoamId)
3803{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303804 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003805 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
3806
3807 if (!pMac) {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303808 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003809 }
3810
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303811 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003812 TRACE_CODE_SME_RX_HDD_MSG_CONNECT, sessionId, 0));
3813 sms_log(pMac, LOG2, FL("enter"));
3814 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303815 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003816 if (CSR_IS_SESSION_VALID(pMac, sessionId)) {
3817 status =
3818 csr_roam_connect(pMac, sessionId, pProfile,
3819 pRoamId);
3820 } else {
3821 sms_log(pMac, LOGE, FL("invalid sessionID %d"),
3822 sessionId);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303823 status = QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003824 }
3825 sme_release_global_lock(&pMac->sme);
3826 } else {
3827 sms_log(pMac, LOGE, FL("sme_acquire_global_lock failed"));
3828 }
3829
3830 return status;
3831}
3832
3833/* ---------------------------------------------------------------------------
3834
3835 \fn sme_set_phy_mode
3836
3837 \brief Changes the PhyMode.
3838
3839 \param hHal - The handle returned by mac_open.
3840
3841 \param phyMode new phyMode which is to set
3842
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303843 \return QDF_STATUS SUCCESS.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003844
3845 -------------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303846QDF_STATUS sme_set_phy_mode(tHalHandle hHal, eCsrPhyMode phyMode)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003847{
3848 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
3849
3850 if (NULL == pMac) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303851 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003852 "%s: invalid context", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303853 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003854 }
3855
3856 pMac->roam.configParam.phyMode = phyMode;
3857 pMac->roam.configParam.uCfgDot11Mode =
3858 csr_get_cfg_dot11_mode_from_csr_phy_mode(NULL,
3859 pMac->roam.configParam.phyMode,
3860 pMac->roam.configParam.
3861 ProprietaryRatesEnabled);
3862
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303863 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003864}
3865
3866/* ---------------------------------------------------------------------------
3867 \fn sme_roam_reassoc
3868 \brief a wrapper function to request CSR to inititiate a re-association
3869 \param pProfile - can be NULL to join the currently connected AP. In that
3870 case modProfileFields should carry the modified field(s) which could trigger
3871 reassoc
3872 \param modProfileFields - fields which are part of tCsrRoamConnectedProfile
3873 that might need modification dynamically once STA is up & running and this
3874 could trigger a reassoc
3875 \param pRoamId - to get back the request ID
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303876 \return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003877 -------------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303878QDF_STATUS sme_roam_reassoc(tHalHandle hHal, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003879 tCsrRoamProfile *pProfile,
3880 tCsrRoamModifyProfileFields modProfileFields,
3881 uint32_t *pRoamId, bool fForce)
3882{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303883 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003884 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
3885
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303886 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003887 TRACE_CODE_SME_RX_HDD_ROAM_REASSOC, sessionId, 0));
3888 sms_log(pMac, LOG2, FL("enter"));
3889 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303890 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003891 if (CSR_IS_SESSION_VALID(pMac, sessionId)) {
3892 if ((NULL == pProfile) && (fForce == 1)) {
3893 status =
3894 csr_reassoc(pMac, sessionId,
3895 &modProfileFields, pRoamId,
3896 fForce);
3897 } else {
3898 status =
3899 csr_roam_reassoc(pMac, sessionId, pProfile,
3900 modProfileFields, pRoamId);
3901 }
3902 } else {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303903 status = QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003904 }
3905 sme_release_global_lock(&pMac->sme);
3906 }
3907
3908 return status;
3909}
3910
3911/* ---------------------------------------------------------------------------
3912 \fn sme_roam_connect_to_last_profile
3913 \brief a wrapper function to request CSR to disconnect and reconnect with
3914 the same profile
3915 This is an asynchronous call.
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303916 \return QDF_STATUS. It returns fail if currently connected
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003917 ---------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303918QDF_STATUS sme_roam_connect_to_last_profile(tHalHandle hHal, uint8_t sessionId)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003919{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303920 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003921 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
3922
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303923 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003924 TRACE_CODE_SME_RX_HDD_ROAM_GET_CONNECTPROFILE,
3925 sessionId, 0));
3926 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303927 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003928 if (CSR_IS_SESSION_VALID(pMac, sessionId)) {
3929 status = csr_roam_connect_to_last_profile(pMac, sessionId);
3930 } else {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303931 status = QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003932 }
3933 sme_release_global_lock(&pMac->sme);
3934 }
3935
3936 return status;
3937}
3938
3939/* ---------------------------------------------------------------------------
3940 \fn sme_roam_disconnect
3941 \brief a wrapper function to request CSR to disconnect from a network
3942 This is an asynchronous call.
3943 \param reason -- To indicate the reason for disconnecting. Currently, only
3944 eCSR_DISCONNECT_REASON_MIC_ERROR is meanful.
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303945 \return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003946 ---------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303947QDF_STATUS sme_roam_disconnect(tHalHandle hHal, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003948 eCsrRoamDisconnectReason reason)
3949{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303950 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003951 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
3952
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303953 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003954 TRACE_CODE_SME_RX_HDD_ROAM_DISCONNECT, sessionId,
3955 reason));
3956 sms_log(pMac, LOG2, FL("enter"));
3957 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303958 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003959 if (CSR_IS_SESSION_VALID(pMac, sessionId)) {
3960 status = csr_roam_disconnect(pMac, sessionId, reason);
3961 } else {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303962 status = QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003963 }
3964 sme_release_global_lock(&pMac->sme);
3965 }
3966
3967 return status;
3968}
3969
3970/* ---------------------------------------------------------------------------
3971 \fn sme_roam_stop_bss
3972 \brief To stop BSS for Soft AP. This is an asynchronous API.
3973 \param hHal - Global structure
3974 \param sessionId - sessionId of SoftAP
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303975 \return QDF_STATUS SUCCESS Roam callback will be called to indicate actual results
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003976 -------------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303977QDF_STATUS sme_roam_stop_bss(tHalHandle hHal, uint8_t sessionId)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003978{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303979 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003980 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
3981
3982 sms_log(pMac, LOG2, FL("enter"));
3983 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303984 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003985 if (CSR_IS_SESSION_VALID(pMac, sessionId)) {
3986 status = csr_roam_issue_stop_bss_cmd(pMac, sessionId, true);
3987 } else {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303988 status = QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003989 }
3990 sme_release_global_lock(&pMac->sme);
3991 }
3992
3993 return status;
3994}
3995
Deepthi Gowrib3bfefd2016-09-13 15:14:34 +05303996/**
3997 * sme_roam_disconnect_sta() - disassociate a station
3998 * @hHal: Global structure
3999 * @sessionId: SessionId of SoftAP
4000 * @p_del_sta_params: Pointer to parameters of the station to disassoc
4001 *
4002 * To disassociate a station. This is an asynchronous API.
4003 *
4004 * Return: QDF_STATUS_SUCCESS on success.Roam callback will
4005 * be called to indicate actual result.
4006 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304007QDF_STATUS sme_roam_disconnect_sta(tHalHandle hHal, uint8_t sessionId,
Deepthi Gowrib3bfefd2016-09-13 15:14:34 +05304008 struct tagCsrDelStaParams *p_del_sta_params)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004009{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304010 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004011 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
4012
4013 if (NULL == pMac) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05304014 QDF_ASSERT(0);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004015 return status;
4016 }
4017
4018 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304019 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004020 if (CSR_IS_SESSION_VALID(pMac, sessionId)) {
4021 status = csr_roam_issue_disassociate_sta_cmd(pMac,
Deepthi Gowrib3bfefd2016-09-13 15:14:34 +05304022 sessionId, p_del_sta_params);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004023 } else {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304024 status = QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004025 }
4026 sme_release_global_lock(&pMac->sme);
4027 }
4028
4029 return status;
4030}
4031
4032/**
4033 * sme_roam_deauth_sta() - deauthenticate a station
4034 * @hHal: Global structure
4035 * @sessionId: SessionId of SoftAP
4036 * @pDelStaParams: Pointer to parameters of the station to deauthenticate
4037 *
4038 * To disassociate a station. This is an asynchronous API.
4039 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304040 * Return: QDF_STATUS_SUCCESS on success or another QDF_STATUS error
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004041 * code on error. Roam callback will be called to indicate actual
4042 * result
4043 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304044QDF_STATUS sme_roam_deauth_sta(tHalHandle hHal, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004045 struct tagCsrDelStaParams *pDelStaParams)
4046{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304047 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004048 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
4049
4050 if (NULL == pMac) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05304051 QDF_ASSERT(0);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004052 return status;
4053 }
4054
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05304055 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Sreelakshmi Konamki6744cff2015-09-07 12:10:39 +05304056 TRACE_CODE_SME_RX_HDD_MSG_DEAUTH_STA,
4057 sessionId, pDelStaParams->reason_code));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004058 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 =
4062 csr_roam_issue_deauth_sta_cmd(pMac, sessionId,
4063 pDelStaParams);
4064 } else {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304065 status = QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004066 }
4067 sme_release_global_lock(&pMac->sme);
4068 }
4069
4070 return status;
4071}
4072
4073/* ---------------------------------------------------------------------------
4074 \fn sme_roam_tkip_counter_measures
4075 \brief To start or stop TKIP counter measures. This is an asynchronous API.
4076 \param sessionId - sessionId of SoftAP
4077 \param pPeerMacAddr - Caller allocated memory filled with peer MAC address (6 bytes)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304078 \return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004079 -------------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304080QDF_STATUS sme_roam_tkip_counter_measures(tHalHandle hHal, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004081 bool bEnable)
4082{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304083 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004084 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
4085
4086 if (NULL == pMac) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05304087 QDF_ASSERT(0);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004088 return status;
4089 }
4090
4091 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304092 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004093 if (CSR_IS_SESSION_VALID(pMac, sessionId)) {
4094 status =
4095 csr_roam_issue_tkip_counter_measures(pMac, sessionId,
4096 bEnable);
4097 } else {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304098 status = QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004099 }
4100 sme_release_global_lock(&pMac->sme);
4101 }
4102
4103 return status;
4104}
4105
4106/* ---------------------------------------------------------------------------
4107 \fn sme_roam_get_associated_stas
4108 \brief To probe the list of associated stations from various modules
4109 of CORE stack.
4110 \This is an asynchronous API.
4111 \param sessionId - sessionId of SoftAP
4112 \param modId - Module from whom list of associtated stations is
4113 to be probed. If an invalid module is passed then
Anurag Chouhan6d760662016-02-20 16:05:43 +05304114 by default QDF_MODULE_ID_PE will be probed.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004115 \param pUsrContext - Opaque HDD context
4116 \param pfnSapEventCallback - Sap event callback in HDD
4117 \param pAssocBuf - Caller allocated memory to be filled with associatd
4118 stations info
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304119 \return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004120 -------------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304121QDF_STATUS sme_roam_get_associated_stas(tHalHandle hHal, uint8_t sessionId,
Anurag Chouhan6d760662016-02-20 16:05:43 +05304122 QDF_MODULE_ID modId, void *pUsrContext,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004123 void *pfnSapEventCallback,
4124 uint8_t *pAssocStasBuf)
4125{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304126 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004127 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
4128
4129 if (NULL == pMac) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05304130 QDF_ASSERT(0);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004131 return status;
4132 }
4133
4134 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304135 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004136 if (CSR_IS_SESSION_VALID(pMac, sessionId)) {
4137 status =
4138 csr_roam_get_associated_stas(pMac, sessionId, modId,
4139 pUsrContext,
4140 pfnSapEventCallback,
4141 pAssocStasBuf);
4142 } else {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304143 status = QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004144 }
4145 sme_release_global_lock(&pMac->sme);
4146 }
4147
4148 return status;
4149}
4150
4151/* ---------------------------------------------------------------------------
4152 \fn sme_roam_get_wps_session_overlap
4153 \brief To get the WPS PBC session overlap information.
4154 \This is an asynchronous API.
4155 \param sessionId - sessionId of SoftAP
4156 \param pUsrContext - Opaque HDD context
4157 \param pfnSapEventCallback - Sap event callback in HDD
4158 \pRemoveMac - pointer to Mac address which needs to be removed from session
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304159 \return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004160 -------------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304161QDF_STATUS sme_roam_get_wps_session_overlap(tHalHandle hHal, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004162 void *pUsrContext, void
4163 *pfnSapEventCallback,
Anurag Chouhan6d760662016-02-20 16:05:43 +05304164 struct qdf_mac_addr pRemoveMac)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004165{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304166 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004167 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
4168
4169 if (NULL == pMac) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05304170 QDF_ASSERT(0);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004171 return status;
4172 }
4173
4174 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304175 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004176 if (CSR_IS_SESSION_VALID(pMac, sessionId)) {
4177 status =
4178 csr_roam_get_wps_session_overlap(pMac, sessionId,
4179 pUsrContext,
4180 pfnSapEventCallback,
4181 pRemoveMac);
4182 } else {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304183 status = QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004184 }
4185 sme_release_global_lock(&pMac->sme);
4186 }
4187
4188 return status;
4189}
4190
4191/* ---------------------------------------------------------------------------
4192 \fn sme_roam_get_connect_state
4193 \brief a wrapper function to request CSR to return the current connect state
4194 of Roaming
4195 This is a synchronous call.
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304196 \return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004197 ---------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304198QDF_STATUS sme_roam_get_connect_state(tHalHandle hHal, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004199 eCsrConnectState *pState)
4200{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304201 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004202 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
4203
4204 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304205 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004206 if (CSR_IS_SESSION_VALID(pMac, sessionId)) {
4207 status =
4208 csr_roam_get_connect_state(pMac, sessionId, pState);
4209 } else {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304210 status = QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004211 }
4212 sme_release_global_lock(&pMac->sme);
4213 }
4214
4215 return status;
4216}
4217
4218/* ---------------------------------------------------------------------------
4219 \fn sme_roam_get_connect_profile
4220 \brief a wrapper function to request CSR to return the current connect
4221 profile. Caller must call csr_roam_free_connect_profile after it is done
4222 and before reuse for another csr_roam_get_connect_profile call.
4223 This is a synchronous call.
4224 \param pProfile - pointer to a caller allocated structure
4225 tCsrRoamConnectedProfile
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304226 \return QDF_STATUS. Failure if not connected
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004227 ---------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304228QDF_STATUS sme_roam_get_connect_profile(tHalHandle hHal, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004229 tCsrRoamConnectedProfile *pProfile)
4230{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304231 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004232 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
4233
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05304234 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004235 TRACE_CODE_SME_RX_HDD_ROAM_GET_CONNECTPROFILE,
4236 sessionId, 0));
4237 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304238 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004239 if (CSR_IS_SESSION_VALID(pMac, sessionId)) {
4240 status =
4241 csr_roam_get_connect_profile(pMac, sessionId, pProfile);
4242 } else {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304243 status = QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004244 }
4245 sme_release_global_lock(&pMac->sme);
4246 }
4247
4248 return status;
4249}
4250
Naveen Rawatdf0a7e72016-01-06 18:35:53 -08004251/**
4252 * sme_roam_free_connect_profile - a wrapper function to request CSR to free and
4253 * reinitialize the profile returned previously by csr_roam_get_connect_profile.
4254 *
4255 * @profile - pointer to a caller allocated structure tCsrRoamConnectedProfile
4256 *
4257 * Return: none
4258 */
4259void sme_roam_free_connect_profile(tCsrRoamConnectedProfile *profile)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004260{
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05304261 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004262 TRACE_CODE_SME_RX_HDD_ROAM_FREE_CONNECTPROFILE,
4263 NO_SESSION, 0));
Naveen Rawatdf0a7e72016-01-06 18:35:53 -08004264 csr_roam_free_connect_profile(profile);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004265}
4266
4267/* ---------------------------------------------------------------------------
4268 \fn sme_roam_set_pmkid_cache
4269 \brief a wrapper function to request CSR to return the PMKID candidate list
4270 This is a synchronous call.
4271 \param pPMKIDCache - caller allocated buffer point to an array of
4272 tPmkidCacheInfo
4273 \param numItems - a variable that has the number of tPmkidCacheInfo
4274 allocated when retruning, this is either the number needed
4275 or number of items put into pPMKIDCache
4276 \param update_entire_cache - this bool value specifies if the entire pmkid
4277 cache should be overwritten or should it be
4278 updated entry by entry.
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304279 \return QDF_STATUS - when fail, it usually means the buffer allocated is not
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004280 big enough and pNumItems has the number of
4281 tPmkidCacheInfo.
4282 \Note: pNumItems is a number of tPmkidCacheInfo,
4283 not sizeof(tPmkidCacheInfo) * something
4284 ---------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304285QDF_STATUS sme_roam_set_pmkid_cache(tHalHandle hHal, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004286 tPmkidCacheInfo *pPMKIDCache,
4287 uint32_t numItems, bool update_entire_cache)
4288{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304289 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004290 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
4291
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05304292 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004293 TRACE_CODE_SME_RX_HDD_ROAM_SET_PMKIDCACHE, sessionId,
4294 numItems));
4295 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304296 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004297 if (CSR_IS_SESSION_VALID(pMac, sessionId)) {
4298 status =
4299 csr_roam_set_pmkid_cache(pMac, sessionId, pPMKIDCache,
4300 numItems, update_entire_cache);
4301 } else {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304302 status = QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004303 }
4304 sme_release_global_lock(&pMac->sme);
4305 }
4306
4307 return status;
4308}
4309
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304310QDF_STATUS sme_roam_del_pmkid_from_cache(tHalHandle hHal, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004311 const uint8_t *pBSSId, bool flush_cache)
4312{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304313 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004314 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Sreelakshmi Konamki6744cff2015-09-07 12:10:39 +05304315
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05304316 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Sreelakshmi Konamki6744cff2015-09-07 12:10:39 +05304317 TRACE_CODE_SME_RX_HDD_ROAM_DEL_PMKIDCACHE,
4318 sessionId, flush_cache));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004319 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304320 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004321 if (CSR_IS_SESSION_VALID(pMac, sessionId)) {
4322 status = csr_roam_del_pmkid_from_cache(pMac, sessionId,
4323 pBSSId, flush_cache);
4324 } else {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304325 status = QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004326 }
4327 sme_release_global_lock(&pMac->sme);
4328 }
4329 return status;
4330}
4331
4332#ifdef WLAN_FEATURE_ROAM_OFFLOAD
4333/* ---------------------------------------------------------------------------
4334 * \fn sme_roam_set_psk_pmk
4335 * \brief a wrapper function to request CSR to save PSK/PMK
4336 * This is a synchronous call.
4337 * \param hHal - Global structure
4338 * \param sessionId - SME sessionId
4339 * \param pPSK_PMK - pointer to an array of Psk[]/Pmk
4340 * \param pmk_len - Length could be only 16 bytes in case if LEAP
4341 * connections. Need to pass this information to
4342 * firmware.
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304343 * \return QDF_STATUS -status whether PSK/PMK is set or not
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004344 *---------------------------------------------------------------------------
4345 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304346QDF_STATUS sme_roam_set_psk_pmk(tHalHandle hHal, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004347 uint8_t *pPSK_PMK, size_t pmk_len)
4348{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304349 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004350 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
4351 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304352 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004353 if (CSR_IS_SESSION_VALID(pMac, sessionId)) {
4354 status =
4355 csr_roam_set_psk_pmk(pMac, sessionId, pPSK_PMK,
4356 pmk_len);
4357 } else {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304358 status = QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004359 }
4360 sme_release_global_lock(&pMac->sme);
4361 }
4362 return status;
4363}
4364#endif
4365/* ---------------------------------------------------------------------------
4366 \fn sme_roam_get_security_req_ie
4367 \brief a wrapper function to request CSR to return the WPA or RSN or WAPI IE CSR
4368 passes to PE to JOIN request or START_BSS request
4369 This is a synchronous call.
4370 \param pLen - caller allocated memory that has the length of pBuf as input.
4371 Upon returned, *pLen has the needed or IE length in pBuf.
4372 \param pBuf - Caller allocated memory that contain the IE field, if any,
4373 upon return
4374 \param secType - Specifies whether looking for WPA/WPA2/WAPI IE
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304375 \return QDF_STATUS - when fail, it usually means the buffer allocated is not
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004376 big enough
4377 ---------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304378QDF_STATUS sme_roam_get_security_req_ie(tHalHandle hHal, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004379 uint32_t *pLen, uint8_t *pBuf,
4380 eCsrSecurityType secType)
4381{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304382 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004383 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
4384
4385 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304386 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004387 if (CSR_IS_SESSION_VALID(pMac, sessionId)) {
4388 status =
4389 csr_roam_get_wpa_rsn_req_ie(hHal, sessionId, pLen, pBuf);
4390 } else {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304391 status = QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004392 }
4393 sme_release_global_lock(&pMac->sme);
4394 }
4395
4396 return status;
4397}
4398
4399/* ---------------------------------------------------------------------------
4400 \fn sme_roam_get_security_rsp_ie
4401 \brief a wrapper function to request CSR to return the WPA or RSN or
4402 WAPI IE from the beacon or probe rsp if connected
4403 This is a synchronous call.
4404 \param pLen - caller allocated memory that has the length of pBuf as input.
4405 Upon returned, *pLen has the needed or IE length in pBuf.
4406 \param pBuf - Caller allocated memory that contain the IE field, if any,
4407 upon return
4408 \param secType - Specifies whether looking for WPA/WPA2/WAPI IE
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304409 \return QDF_STATUS - when fail, it usually means the buffer allocated is not
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004410 big enough
4411 ---------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304412QDF_STATUS sme_roam_get_security_rsp_ie(tHalHandle hHal, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004413 uint32_t *pLen, uint8_t *pBuf,
4414 eCsrSecurityType secType)
4415{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304416 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004417 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
4418
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_get_wpa_rsn_rsp_ie(pMac, sessionId, pLen, pBuf);
4424 } else {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304425 status = QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004426 }
4427 sme_release_global_lock(&pMac->sme);
4428 }
4429
4430 return status;
4431
4432}
4433
4434/* ---------------------------------------------------------------------------
4435 \fn sme_roam_get_num_pmkid_cache
4436 \brief a wrapper function to request CSR to return number of PMKID cache
4437 entries
4438 This is a synchronous call.
4439 \return uint32_t - the number of PMKID cache entries
4440 ---------------------------------------------------------------------------*/
4441uint32_t sme_roam_get_num_pmkid_cache(tHalHandle hHal, uint8_t sessionId)
4442{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304443 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004444 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
4445 uint32_t numPmkidCache = 0;
4446
4447 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304448 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004449 if (CSR_IS_SESSION_VALID(pMac, sessionId)) {
4450 numPmkidCache =
4451 csr_roam_get_num_pmkid_cache(pMac, sessionId);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304452 status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004453 } else {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304454 status = QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004455 }
4456 sme_release_global_lock(&pMac->sme);
4457 }
4458
4459 return numPmkidCache;
4460}
4461
4462/* ---------------------------------------------------------------------------
4463 \fn sme_roam_get_pmkid_cache
4464 \brief a wrapper function to request CSR to return PMKID cache from CSR
4465 This is a synchronous call.
4466 \param pNum - caller allocated memory that has the space of the number of
4467 pBuf tPmkidCacheInfo as input. Upon returned, *pNum has the
4468 needed or actually number in tPmkidCacheInfo.
4469 \param pPmkidCache - Caller allocated memory that contains PMKID cache, if
4470 any, upon return
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304471 \return QDF_STATUS - when fail, it usually means the buffer allocated is not
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004472 big enough
4473 ---------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304474QDF_STATUS sme_roam_get_pmkid_cache(tHalHandle hHal, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004475 uint32_t *pNum, tPmkidCacheInfo *pPmkidCache)
4476{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304477 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004478 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
4479
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05304480 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004481 TRACE_CODE_SME_RX_HDD_ROAM_GET_PMKIDCACHE, sessionId,
4482 0));
4483 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304484 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004485 if (CSR_IS_SESSION_VALID(pMac, sessionId)) {
4486 status =
4487 csr_roam_get_pmkid_cache(pMac, sessionId, pNum,
4488 pPmkidCache);
4489 } else {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304490 status = QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004491 }
4492 sme_release_global_lock(&pMac->sme);
4493 }
4494
4495 return status;
4496}
4497
4498/* ---------------------------------------------------------------------------
4499 \fn sme_get_config_param
4500 \brief a wrapper function that HDD calls to get the global settings
4501 currently maintained by CSR.
4502 This is a synchronous call.
4503 \param pParam - caller allocated memory
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304504 \return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004505 ---------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304506QDF_STATUS sme_get_config_param(tHalHandle hHal, tSmeConfigParams *pParam)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004507{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304508 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004509 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
4510
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05304511 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004512 TRACE_CODE_SME_RX_HDD_GET_CONFIGPARAM, NO_SESSION, 0));
4513 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304514 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004515 status = csr_get_config_param(pMac, &pParam->csrConfig);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304516 if (status != QDF_STATUS_SUCCESS) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004517 sms_log(pMac, LOGE, "%s csr_get_config_param failed",
4518 __func__);
4519 sme_release_global_lock(&pMac->sme);
4520 return status;
4521 }
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304522 qdf_mem_copy(&pParam->rrmConfig,
Krunal Soni1878d3a2016-01-14 13:00:44 -08004523 &pMac->rrm.rrmSmeContext.rrmConfig,
4524 sizeof(pMac->rrm.rrmSmeContext.rrmConfig));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004525 sme_release_global_lock(&pMac->sme);
4526 }
4527
4528 return status;
4529}
4530
4531/**
4532 * sme_cfg_set_int() - Sets the cfg parameter value.
4533 * @hal: Handle to hal.
4534 * @cfg_id: Configuration parameter ID.
4535 * @value: value to be saved in the cfg parameter.
4536 *
4537 * This function sets the string value in cfg parameter.
4538 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304539 * Return: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004540 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304541QDF_STATUS sme_cfg_set_int(tHalHandle hal, uint16_t cfg_id, uint32_t value)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004542{
4543 tpAniSirGlobal pmac = PMAC_STRUCT(hal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304544 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004545
4546 if (eSIR_SUCCESS != cfg_set_int(pmac, cfg_id, value))
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304547 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004548
4549 return status;
4550}
4551
4552/**
4553 * sme_cfg_set_str() - Sets the cfg parameter string.
4554 * @hal: Handle to hal.
4555 * @cfg_id: Configuration parameter ID.
4556 * @str: Pointer to the string buffer.
4557 * @length: Length of the string.
4558 *
4559 * This function sets the string value in cfg parameter.
4560 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304561 * Return: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004562 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304563QDF_STATUS sme_cfg_set_str(tHalHandle hal, uint16_t cfg_id, uint8_t *str,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004564 uint32_t length)
4565{
4566 tpAniSirGlobal pmac = PMAC_STRUCT(hal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304567 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004568
4569 if (eSIR_SUCCESS != cfg_set_str(pmac, cfg_id, str, length))
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304570 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004571
4572 return status;
4573}
4574
4575/**
4576 * sme_cfg_get_int() - Gets the cfg parameter value.
4577 * @hal: Handle to hal.
4578 * @cfg_id: Configuration parameter ID.
4579 * @cfg_value: Pointer to variable in which cfg value
4580 * will be saved.
4581 *
4582 * This function gets the value of the cfg parameter.
4583 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304584 * Return: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004585 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304586QDF_STATUS sme_cfg_get_int(tHalHandle hal, uint16_t cfg_id, uint32_t *cfg_value)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004587{
4588 tpAniSirGlobal pmac = PMAC_STRUCT(hal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304589 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004590
4591 if (eSIR_SUCCESS != wlan_cfg_get_int(pmac, cfg_id, cfg_value))
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304592 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004593
4594 return status;
4595}
4596
4597/**
4598 * sme_cfg_get_str() - Gets the cfg parameter string.
4599 * @hal: Handle to hal.
4600 * @cfg_id: Configuration parameter ID.
4601 * @str: Pointer to the string buffer.
4602 * @length: Pointer to length of the string.
4603 *
4604 * This function gets the string value of the cfg parameter.
4605 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304606 * Return: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004607 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304608QDF_STATUS sme_cfg_get_str(tHalHandle hal, uint16_t cfg_id, uint8_t *str,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004609 uint32_t *length)
4610{
4611 tpAniSirGlobal pmac = PMAC_STRUCT(hal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304612 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004613
4614 if (eSIR_SUCCESS != wlan_cfg_get_str(pmac, cfg_id, str, length))
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304615 status = QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004616
4617 return status;
4618}
4619
4620/* ---------------------------------------------------------------------------
4621 \fn sme_get_modify_profile_fields
4622 \brief HDD or SME - QOS calls this function to get the current values of
4623 connected profile fields, changing which can cause reassoc.
4624 This function must be called after CFG is downloaded and STA is in connected
4625 state. Also, make sure to call this function to get the current profile
4626 fields before calling the reassoc. So that pModifyProfileFields will have
4627 all the latest values plus the one(s) has been updated as part of reassoc
4628 request.
4629 \param pModifyProfileFields - pointer to the connected profile fields
4630 changing which can cause reassoc
4631
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304632 \return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004633 -------------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304634QDF_STATUS sme_get_modify_profile_fields(tHalHandle hHal, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004635 tCsrRoamModifyProfileFields *
4636 pModifyProfileFields)
4637{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304638 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004639 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
4640
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05304641 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004642 TRACE_CODE_SME_RX_HDD_GET_MODPROFFIELDS, sessionId,
4643 0));
4644 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304645 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004646 if (CSR_IS_SESSION_VALID(pMac, sessionId)) {
4647 status =
4648 csr_get_modify_profile_fields(pMac, sessionId,
4649 pModifyProfileFields);
4650 } else {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304651 status = QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004652 }
4653 sme_release_global_lock(&pMac->sme);
4654 }
4655
4656 return status;
4657}
4658
4659/* ---------------------------------------------------------------------------
4660 \fn sme_set_dhcp_till_power_active_flag
4661 \brief Sets/Clears DHCP related flag to disable/enable auto PS
4662 \param hal - The handle returned by mac_open.
4663 ---------------------------------------------------------------------------*/
4664void sme_set_dhcp_till_power_active_flag(tHalHandle hal, uint8_t flag)
4665{
4666 tpAniSirGlobal mac = PMAC_STRUCT(hal);
4667 struct ps_global_info *ps_global_info = &mac->sme.ps_global_info;
4668
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05304669 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004670 TRACE_CODE_SME_RX_HDD_SET_DHCP_FLAG, NO_SESSION,
4671 flag));
4672 /* Set/Clear the DHCP flag which will disable/enable auto PS */
4673 ps_global_info->remain_in_power_active_till_dhcp = flag;
4674}
4675
4676/* ---------------------------------------------------------------------------
4677 \fn sme_register11d_scan_done_callback
4678 \brief Register a routine of type csr_scan_completeCallback which is
4679 called whenever an 11d scan is done
4680 \param hHal - The handle returned by mac_open.
4681 \param callback - 11d scan complete routine to be registered
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304682 \return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004683 ---------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304684QDF_STATUS sme_register11d_scan_done_callback(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004685 csr_scan_completeCallback callback)
4686{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304687 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004688 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
4689
4690 pMac->scan.callback11dScanDone = callback;
4691
4692 return status;
4693}
4694
Arun Khandavalli4b55da72016-07-19 19:55:01 +05304695/**
4696 * sme_deregister11d_scan_done_callback() - De-register scandone callback
4697 * @h_hal: Handler return by mac_open
4698 *
4699 * This function De-registers the scandone callback to SME
4700 *
4701 * Return: None
4702 */
4703void sme_deregister11d_scan_done_callback(tHalHandle h_hal)
4704{
4705 tpAniSirGlobal pmac;
4706
4707 if (!h_hal) {
4708 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
4709 FL("hHal is not valid"));
4710 return;
4711 }
4712
4713 pmac = PMAC_STRUCT(h_hal);
4714 pmac->scan.callback11dScanDone = NULL;
4715}
4716
4717
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004718#ifdef FEATURE_OEM_DATA_SUPPORT
4719/**
4720 * sme_register_oem_data_rsp_callback() - Register a routine of
4721 * type send_oem_data_rsp_msg
4722 * @h_hal: Handle returned by mac_open.
4723 * @callback: Callback to send response
4724 * to oem application.
4725 *
4726 * sme_oem_data_rsp_callback is used to register sme_send_oem_data_rsp_msg
4727 * callback function.
4728 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304729 * Return: QDF_STATUS.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004730 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304731QDF_STATUS sme_register_oem_data_rsp_callback(tHalHandle h_hal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004732 sme_send_oem_data_rsp_msg callback)
4733{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304734 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004735 tpAniSirGlobal pmac = PMAC_STRUCT(h_hal);
4736
Krishna Kumaar Natarajanbbbf2ef2016-08-03 14:06:26 -07004737 pmac->sme.oem_data_rsp_callback = callback;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004738
4739 return status;
4740
4741}
Arun Khandavalli4b55da72016-07-19 19:55:01 +05304742
4743/**
4744 * sme_deregister_oem_data_rsp_callback() - De-register OEM datarsp callback
4745 * @h_hal: Handler return by mac_open
4746 * This function De-registers the OEM data response callback to SME
4747 *
4748 * Return: None
4749 */
4750void sme_deregister_oem_data_rsp_callback(tHalHandle h_hal)
4751{
4752 tpAniSirGlobal pmac;
4753
4754 if (!h_hal) {
4755 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
4756 FL("hHal is not valid"));
4757 return;
4758 }
4759 pmac = PMAC_STRUCT(h_hal);
4760
Krishna Kumaar Natarajanbbbf2ef2016-08-03 14:06:26 -07004761 pmac->sme.oem_data_rsp_callback = NULL;
Arun Khandavalli4b55da72016-07-19 19:55:01 +05304762}
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004763#endif
4764
4765/**
Krishna Kumaar Natarajan53ca2902015-12-04 14:01:46 -08004766 * sme_oem_update_capability() - update UMAC's oem related capability.
4767 * @hal: Handle returned by mac_open
4768 * @oem_cap: pointer to oem_capability
4769 *
4770 * This function updates OEM capability to UMAC. Currently RTT
4771 * related capabilities are updated. More capabilities can be
4772 * added in future.
4773 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304774 * Return: QDF_STATUS
Krishna Kumaar Natarajan53ca2902015-12-04 14:01:46 -08004775 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304776QDF_STATUS sme_oem_update_capability(tHalHandle hal,
Krishna Kumaar Natarajan53ca2902015-12-04 14:01:46 -08004777 struct sme_oem_capability *cap)
4778{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304779 QDF_STATUS status = QDF_STATUS_SUCCESS;
Krishna Kumaar Natarajan53ca2902015-12-04 14:01:46 -08004780 tpAniSirGlobal pmac = PMAC_STRUCT(hal);
4781 uint8_t *bytes;
4782
4783 bytes = pmac->rrm.rrmSmeContext.rrmConfig.rm_capability;
4784
4785 if (cap->ftm_rr)
4786 bytes[4] |= RM_CAP_FTM_RANGE_REPORT;
4787 if (cap->lci_capability)
4788 bytes[4] |= RM_CAP_CIVIC_LOC_MEASUREMENT;
4789
4790 return status;
4791}
4792
4793/**
4794 * sme_oem_get_capability() - get oem capability
4795 * @hal: Handle returned by mac_open
4796 * @oem_cap: pointer to oem_capability
4797 *
4798 * This function is used to get the OEM capability from UMAC.
4799 * Currently RTT related capabilities are received. More
4800 * capabilities can be added in future.
4801 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304802 * Return: QDF_STATUS
Krishna Kumaar Natarajan53ca2902015-12-04 14:01:46 -08004803 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304804QDF_STATUS sme_oem_get_capability(tHalHandle hal,
Krishna Kumaar Natarajan53ca2902015-12-04 14:01:46 -08004805 struct sme_oem_capability *cap)
4806{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304807 QDF_STATUS status = QDF_STATUS_SUCCESS;
Krishna Kumaar Natarajan53ca2902015-12-04 14:01:46 -08004808 tpAniSirGlobal pmac = PMAC_STRUCT(hal);
4809 uint8_t *bytes;
4810
4811 bytes = pmac->rrm.rrmSmeContext.rrmConfig.rm_capability;
4812
4813 cap->ftm_rr = bytes[4] & RM_CAP_FTM_RANGE_REPORT;
4814 cap->lci_capability = bytes[4] & RM_CAP_CIVIC_LOC_MEASUREMENT;
4815
4816 return status;
4817}
4818
4819/**
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004820 * sme_register_ftm_msg_processor() - registers hdd ftm message processor
4821 * function to MAC/SYS
4822 *
4823 * @hal: hal handle
4824 * @callback: hdd function that has to be registered
4825 *
4826 * Return: void
4827 */
4828void sme_register_ftm_msg_processor(tHalHandle hal,
4829 hdd_ftm_msg_processor callback)
4830{
4831 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
4832
4833 if (mac_ctx == NULL) {
Naveen Rawatcf684762016-06-27 15:30:24 -07004834 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
4835 FL("mac ctx is NULL"));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004836 return;
4837 }
Naveen Rawatcf684762016-06-27 15:30:24 -07004838
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004839 mac_ctx->ftm_msg_processor_callback = callback;
4840 return;
4841}
4842
4843/**
4844 * sme_wow_add_pattern() - add a wow pattern in fw
4845 * @hHal: handle returned by mac_open
4846 * @pattern: pointer to input pattern
4847 *
4848 * Add a pattern for Pattern Byte Matching in WoW mode. Firmware will
4849 * do a pattern match on these patterns when WoW is enabled during system
4850 * suspend.
4851 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304852 * Return: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004853 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304854QDF_STATUS sme_wow_add_pattern(tHalHandle hal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004855 struct wow_add_pattern *pattern,
4856 uint8_t session_id)
4857{
4858 tpAniSirGlobal pMac = PMAC_STRUCT(hal);
4859 struct wow_add_pattern *ptrn;
4860 tSirRetStatus ret_code = eSIR_SUCCESS;
4861 tSirMsgQ msg_q;
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05304862 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004863 TRACE_CODE_SME_RX_HDD_WOWL_ADDBCAST_PATTERN, session_id,
4864 0));
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304865 ptrn = qdf_mem_malloc(sizeof(*ptrn));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004866 if (NULL == ptrn) {
4867 sms_log(pMac, LOGP,
4868 FL("Fail to allocate memory for WoWLAN Add Bcast Pattern "));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304869 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004870 }
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304871 (void)qdf_mem_copy(ptrn, pattern, sizeof(*ptrn));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004872
4873 msg_q.type = WMA_WOW_ADD_PTRN;
4874 msg_q.reserved = 0;
4875 msg_q.bodyptr = ptrn;
4876 msg_q.bodyval = 0;
4877
4878 sms_log(pMac, LOG1, FL("Sending WMA_WOWL_ADD_BCAST_PTRN to HAL"));
4879 ret_code = wma_post_ctrl_msg(pMac, &msg_q);
4880 if (eSIR_SUCCESS != ret_code) {
4881 sms_log(pMac, LOGE,
4882 FL("Posting WMA_WOWL_ADD_BCAST_PTRN failed, reason=%X"),
4883 ret_code);
4884 }
4885 return ret_code;
4886}
4887
4888/**
4889 * sme_wow_delete_pattern() - delete user configured wow pattern in target
4890 * @hHal: handle returned by mac_open.
4891 * @pattern: pointer to delete pattern parameter
4892 * @sessionId: session id
4893 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304894 * Return: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004895 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304896QDF_STATUS sme_wow_delete_pattern(tHalHandle hal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004897 struct wow_delete_pattern *pattern, uint8_t sessionId)
4898{
4899 tpAniSirGlobal pMac = PMAC_STRUCT(hal);
4900 struct wow_delete_pattern *delete_ptrn;
4901 tSirRetStatus ret_code = eSIR_SUCCESS;
4902 tSirMsgQ msg_q;
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05304903 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004904 TRACE_CODE_SME_RX_HDD_WOWL_DELBCAST_PATTERN, sessionId,
4905 0));
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304906 delete_ptrn = qdf_mem_malloc(sizeof(*delete_ptrn));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004907 if (NULL == delete_ptrn) {
4908 sms_log(pMac, LOGP,
4909 FL("Fail to allocate memory for WoWLAN Delete Bcast Pattern "));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304910 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004911 }
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304912 (void)qdf_mem_copy(delete_ptrn, pattern, sizeof(*delete_ptrn));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004913 msg_q.type = WMA_WOW_DEL_PTRN;
4914 msg_q.reserved = 0;
4915 msg_q.bodyptr = delete_ptrn;
4916 msg_q.bodyval = 0;
4917
4918 sms_log(pMac, LOG1, FL("Sending WMA_WOWL_DEL_BCAST_PTRN"));
4919
4920 ret_code = wma_post_ctrl_msg(pMac, &msg_q);
4921 if (eSIR_SUCCESS != ret_code) {
4922 sms_log(pMac, LOGE,
4923 FL("Posting WMA_WOWL_DEL_BCAST_PTRN failed, reason=%X"),
4924 ret_code);
4925 }
4926 return ret_code;
4927}
4928
4929/**
4930 * sme_enter_wowl(): SME API exposed to HDD to request enabling of WOWL mode.
4931 * @hal_ctx - The handle returned by mac_open.
4932 * @enter_wowl_callback_routine - Callback routine provided by HDD.
4933 * Used for success/failure notification by SME
4934 * @enter_wowl_callback_context - A cookie passed by HDD, that is passed
4935 * back to HDD at the time of callback.
4936 * @wake_reason_ind_cb - Callback routine provided by HDD.
4937 * Used for Wake Reason Indication by SME
4938 * @wake_reason_ind_cb_ctx - A cookie passed by HDD, that is passed
4939 * back to HDD at the time of callback.
4940 *
4941 * WoWLAN works on top of BMPS mode.
4942 * If the device is not in BMPS mode,
4943 * SME will will cache the information that
4944 * WOWL has been enabled and attempt to put the device
4945 * in BMPS. On entry into BMPS, SME will enable the
4946 * WOWL mode.
4947 * Note 1: If we exit BMPS mode (someone requests full power),
4948 * we will NOT resume WOWL when we go back to BMPS again.
4949 * Request for full power (while in WOWL mode) means disable
4950 * WOWL and go to full power.
4951 * Note 2: Both UAPSD and WOWL work on top of BMPS.
4952 * On entry into BMPS, SME will give priority to UAPSD and
4953 * enable only UAPSD if both UAPSD and WOWL are required.
4954 * Currently there is no requirement or use case to support
4955 * UAPSD and WOWL at the same time.
4956 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304957 * Return: QDF_STATUS
4958 * QDF_STATUS_SUCCESS Device is already in WoWLAN mode
4959 * QDF_STATUS_E_FAILURE Device cannot enter WoWLAN mode.
4960 * QDF_STATUS_PMC_PENDING Request accepted. SME will enable
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004961 * WOWL after BMPS mode is entered.
4962 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304963QDF_STATUS sme_enter_wowl(tHalHandle hal_ctx,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004964 void (*enter_wowl_callback_routine)(void
4965 *callback_context,
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304966 QDF_STATUS status),
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004967 void *enter_wowl_callback_context,
4968#ifdef WLAN_WAKEUP_EVENTS
4969 void (*wakeIndicationCB)(void *callback_context,
4970 tpSirWakeReasonInd
4971 wake_reason_ind),
4972 void *wakeIndicationCBContext,
4973#endif /* WLAN_WAKEUP_EVENTS */
4974 tpSirSmeWowlEnterParams wowl_enter_params,
4975 uint8_t session_id)
4976{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304977 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004978 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal_ctx);
4979 struct ps_global_info *ps_global_info = &mac_ctx->sme.ps_global_info;
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05304980 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004981 TRACE_CODE_SME_RX_HDD_ENTER_WOWL, session_id, 0));
4982
4983 /* cache the WOWL information */
4984 ps_global_info->ps_params[session_id].wowl_enter_params =
4985 *wowl_enter_params;
4986 ps_global_info->ps_params[session_id].enter_wowl_callback_routine =
4987 enter_wowl_callback_routine;
4988 ps_global_info->ps_params[session_id].enter_wowl_callback_context =
4989 enter_wowl_callback_context;
4990#ifdef WLAN_WAKEUP_EVENTS
4991 /* Cache the Wake Reason Indication callback information */
4992 ps_global_info->ps_params[session_id].wake_reason_ind_cb =
4993 wakeIndicationCB;
4994 ps_global_info->ps_params[session_id].wake_reason_ind_cb_ctx =
4995 wakeIndicationCBContext;
4996#endif /* WLAN_WAKEUP_EVENTS */
4997
4998 status = sme_ps_process_command(mac_ctx, session_id, SME_PS_WOWL_ENTER);
4999 return status;
5000}
5001/**
5002 *sme_exit_wowl(): SME API exposed to HDD to request exit from WoWLAN mode.
5003 * @hal_ctx - The handle returned by mac_open.
5004 * @wowl_exit_params - Carries info on which smesession
5005 * wowl exit is requested.
5006 *
5007 * SME will initiate exit from WoWLAN mode and device will be
5008 * put in BMPS mode.
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305009 * Return QDF_STATUS
5010 * QDF_STATUS_E_FAILURE Device cannot exit WoWLAN mode.
5011 * QDF_STATUS_SUCCESS Request accepted to exit WoWLAN mode.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005012 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305013QDF_STATUS sme_exit_wowl(tHalHandle hal_ctx,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005014 tpSirSmeWowlExitParams wowl_exit_params)
5015{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305016 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005017 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal_ctx);
5018 uint8_t session_id;
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05305019 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005020 TRACE_CODE_SME_RX_HDD_EXIT_WOWL, NO_SESSION, 0));
5021 session_id = wowl_exit_params->sessionId;
5022 status = sme_ps_process_command(mac_ctx, session_id, SME_PS_WOWL_EXIT);
5023 return status;
5024}
5025
5026/**
5027 * sme_roam_set_key() - To set encryption key.
5028 * @hal: hal global context
5029 * @session_id: session id
5030 * @set_key: pointer to a caller allocated object of tCsrSetContextInfo
5031 * @ptr_roam_id: Upon success return, this is the id caller can use to
5032 * identify the request in roamcallback
5033 *
5034 * This function should be called only when connected. This is an asynchronous
5035 * API.
5036 *
5037 * Return: Status of operation
5038 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305039QDF_STATUS sme_roam_set_key(tHalHandle hal, uint8_t session_id,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005040 tCsrRoamSetKey *set_key, uint32_t *ptr_roam_id)
5041{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305042 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005043 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
5044 uint32_t roam_id;
5045 uint32_t i;
5046 tCsrRoamSession *session = NULL;
5047 struct ps_global_info *ps_global_info = &mac_ctx->sme.ps_global_info;
5048
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05305049 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_RX_HDD_SET_KEY,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005050 session_id, 0));
5051 if (set_key->keyLength > CSR_MAX_KEY_LEN) {
5052 sms_log(mac_ctx, LOGE, FL("Invalid key length %d"),
5053 set_key->keyLength);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305054 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005055 }
5056 /*Once Setkey is done, we can go in BMPS */
5057 if (set_key->keyLength)
5058 ps_global_info->remain_in_power_active_till_dhcp = false;
5059
5060 status = sme_acquire_global_lock(&mac_ctx->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305061 if (!QDF_IS_STATUS_SUCCESS(status))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005062 return status;
5063
5064 roam_id = GET_NEXT_ROAM_ID(&mac_ctx->roam);
5065 if (ptr_roam_id)
5066 *ptr_roam_id = roam_id;
5067
5068 sms_log(mac_ctx, LOG2, FL("keyLength %d"), set_key->keyLength);
5069 for (i = 0; i < set_key->keyLength; i++)
5070 sms_log(mac_ctx, LOG2, FL("%02x"), set_key->Key[i]);
5071
5072 sms_log(mac_ctx, LOG2, "\n session_id=%d roam_id=%d", session_id,
5073 roam_id);
5074 session = CSR_GET_SESSION(mac_ctx, session_id);
5075 if (!session) {
5076 sms_log(mac_ctx, LOGE, FL("session %d not found"), session_id);
5077 sme_release_global_lock(&mac_ctx->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305078 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005079 }
5080 if (CSR_IS_INFRA_AP(&session->connectedProfile)
5081 && set_key->keyDirection == eSIR_TX_DEFAULT) {
5082 if ((eCSR_ENCRYPT_TYPE_WEP40 == set_key->encType)
5083 || (eCSR_ENCRYPT_TYPE_WEP40_STATICKEY ==
5084 set_key->encType)) {
5085 session->pCurRoamProfile->negotiatedUCEncryptionType =
5086 eCSR_ENCRYPT_TYPE_WEP40_STATICKEY;
5087 }
5088 if ((eCSR_ENCRYPT_TYPE_WEP104 == set_key->encType)
5089 || (eCSR_ENCRYPT_TYPE_WEP104_STATICKEY ==
5090 set_key->encType)) {
5091 session->pCurRoamProfile->negotiatedUCEncryptionType =
5092 eCSR_ENCRYPT_TYPE_WEP104_STATICKEY;
5093 }
5094 }
5095 status = csr_roam_set_key(mac_ctx, session_id, set_key, roam_id);
5096 sme_release_global_lock(&mac_ctx->sme);
5097 return status;
5098}
5099
Masti, Narayanraddiab712a72016-08-04 11:59:11 +05305100/**
5101 * sme_roam_set_default_key_index - To set default wep key idx
5102 * @hal: pointer to hal handler
5103 * @session_id: session id
5104 * @default_idx: default wep key index
5105 *
5106 * This function prepares a message and post to WMA to set wep default
5107 * key index
5108 *
5109 * Return: Success:QDF_STATUS_SUCCESS Failure: Error value
5110 */
5111QDF_STATUS sme_roam_set_default_key_index(tHalHandle hal, uint8_t session_id,
5112 uint8_t default_idx)
5113{
5114 cds_msg_t msg;
5115 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
5116 struct wep_update_default_key_idx *update_key;
5117
5118 update_key = qdf_mem_malloc(sizeof(*update_key));
5119 if (!update_key) {
5120 sms_log(mac_ctx, LOGE,
5121 FL("Failed to allocate memory for update key"));
5122 return QDF_STATUS_E_NOMEM;
5123 }
5124
5125 update_key->session_id = session_id;
5126 update_key->default_idx = default_idx;
5127
5128 msg.type = WMA_UPDATE_WEP_DEFAULT_KEY;
5129 msg.reserved = 0;
5130 msg.bodyptr = (void *)update_key;
5131
5132 if (QDF_STATUS_SUCCESS !=
5133 cds_mq_post_message(QDF_MODULE_ID_WMA, &msg)) {
5134 sms_log(mac_ctx, LOGE,
5135 FL("Failed to post WMA_UPDATE_WEP_DEFAULT_KEY to WMA"));
5136 qdf_mem_free(update_key);
5137 return QDF_STATUS_E_FAILURE;
5138 }
5139
5140 return QDF_STATUS_SUCCESS;
5141}
5142
5143
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005144/* ---------------------------------------------------------------------------
5145 \fn sme_get_rssi
5146 \brief a wrapper function that client calls to register a callback to get
5147 RSSI
5148
5149 \param hHal - HAL handle for device
5150 \param callback - SME sends back the requested stats using the callback
5151 \param staId - The station ID for which the stats is requested for
5152 \param bssid - The bssid of the connected session
5153 \param lastRSSI - RSSI value at time of request. In case fw cannot provide
5154 RSSI, do not hold up but return this value.
5155 \param pContext - user context to be passed back along with the callback
5156 \param p_cds_context - cds context
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305157 \return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005158 ---------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305159QDF_STATUS sme_get_rssi(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005160 tCsrRssiCallback callback,
Anurag Chouhan6d760662016-02-20 16:05:43 +05305161 uint8_t staId, struct qdf_mac_addr bssId, int8_t lastRSSI,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005162 void *pContext, void *p_cds_context)
5163{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305164 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005165 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
5166
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05305167 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005168 TRACE_CODE_SME_RX_HDD_GET_RSSI, NO_SESSION, 0));
5169 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305170 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005171 status = csr_get_rssi(pMac, callback,
5172 staId, bssId, lastRSSI,
5173 pContext, p_cds_context);
5174 sme_release_global_lock(&pMac->sme);
5175 }
5176 return status;
5177}
5178
5179/* ---------------------------------------------------------------------------
5180 \fn sme_get_snr
5181 \brief a wrapper function that client calls to register a callback to
5182 get SNR
5183
5184 \param callback - SME sends back the requested stats using the callback
5185 \param staId - The station ID for which the stats is requested for
5186 \param pContext - user context to be passed back along with the callback
5187 \param p_cds_context - cds context
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305188 \return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005189 ---------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305190QDF_STATUS sme_get_snr(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005191 tCsrSnrCallback callback,
Anurag Chouhan6d760662016-02-20 16:05:43 +05305192 uint8_t staId, struct qdf_mac_addr bssId, void *pContext)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005193{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305194 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005195 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
5196
5197 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305198 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005199 status = csr_get_snr(pMac, callback, staId, bssId, pContext);
5200 sme_release_global_lock(&pMac->sme);
5201 }
5202 return status;
5203}
5204
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005205/* ---------------------------------------------------------------------------
5206 \fn sme_get_statistics
5207 \brief a wrapper function that client calls to register a callback to get
5208 different PHY level statistics from CSR.
5209
5210 \param requesterId - different client requesting for statistics,
5211 HDD, UMA/GAN etc
5212 \param statsMask - The different category/categories of stats requester
5213 is looking for
5214 \param callback - SME sends back the requested stats using the callback
5215 \param periodicity - If requester needs periodic update in millisec, 0 means
5216 it's an one time request
5217 \param cache - If requester is happy with cached stats
5218 \param staId - The station ID for which the stats is requested for
5219 \param pContext - user context to be passed back along with the callback
5220 \param sessionId - sme session interface
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305221 \return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005222 ---------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305223QDF_STATUS sme_get_statistics(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005224 eCsrStatsRequesterType requesterId,
5225 uint32_t statsMask, tCsrStatsCallback callback,
5226 uint32_t periodicity, bool cache, uint8_t staId,
5227 void *pContext, uint8_t sessionId)
5228{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305229 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005230 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
5231
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05305232 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005233 TRACE_CODE_SME_RX_HDD_GET_STATS, NO_SESSION,
5234 periodicity));
5235 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305236 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005237 status =
5238 csr_get_statistics(pMac, requesterId, statsMask, callback,
5239 periodicity, cache, staId, pContext,
5240 sessionId);
5241 sme_release_global_lock(&pMac->sme);
5242 }
5243
5244 return status;
5245
5246}
5247
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305248QDF_STATUS sme_get_link_status(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005249 tCsrLinkStatusCallback callback,
5250 void *pContext, uint8_t sessionId)
5251{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305252 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005253 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
5254 tAniGetLinkStatus *pMsg;
5255 cds_msg_t cds_message;
5256
5257 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305258 if (QDF_IS_STATUS_SUCCESS(status)) {
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305259 pMsg = qdf_mem_malloc(sizeof(tAniGetLinkStatus));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005260 if (NULL == pMsg) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05305261 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005262 "%s: Not able to allocate memory for link status",
5263 __func__);
5264 sme_release_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305265 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005266 }
5267
5268 pMsg->msgType = WMA_LINK_STATUS_GET_REQ;
5269 pMsg->msgLen = (uint16_t) sizeof(tAniGetLinkStatus);
5270 pMsg->sessionId = sessionId;
5271 pMac->sme.linkStatusContext = pContext;
5272 pMac->sme.linkStatusCallback = callback;
5273
5274 cds_message.type = WMA_LINK_STATUS_GET_REQ;
5275 cds_message.bodyptr = pMsg;
5276 cds_message.reserved = 0;
5277
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305278 if (!QDF_IS_STATUS_SUCCESS
Anurag Chouhan6d760662016-02-20 16:05:43 +05305279 (cds_mq_post_message(QDF_MODULE_ID_WMA, &cds_message))) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05305280 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005281 "%s: Post LINK STATUS MSG fail", __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305282 qdf_mem_free(pMsg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005283 pMac->sme.linkStatusContext = NULL;
5284 pMac->sme.linkStatusCallback = NULL;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305285 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005286 }
5287
5288 sme_release_global_lock(&pMac->sme);
5289 }
5290
5291 return status;
5292}
5293
5294/* ---------------------------------------------------------------------------
5295
5296 \fn sme_get_country_code
5297
5298 \brief To return the current country code. If no country code is applied,
5299 default country code is used to fill the buffer.
5300 If 11d supported is turned off, an error is return and the last
5301 applied/default country code is used.
5302 This is a synchronous API.
5303
5304 \param pBuf - pointer to a caller allocated buffer for returned country code.
5305
5306 \param pbLen For input, this parameter indicates how big is the buffer.
5307 Upon return, this parameter has the number of bytes for
5308 country. If pBuf doesn't have enough space, this function
5309 returns fail status and this parameter contains the number
5310 that is needed.
5311
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305312 \return QDF_STATUS SUCCESS.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005313
5314 FAILURE or RESOURCES The API finished and failed.
5315
5316 -------------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305317QDF_STATUS sme_get_country_code(tHalHandle hHal, uint8_t *pBuf, uint8_t *pbLen)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005318{
5319 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
5320
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05305321 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005322 TRACE_CODE_SME_RX_HDD_GET_CNTRYCODE, NO_SESSION, 0));
5323
5324 return csr_get_country_code(pMac, pBuf, pbLen);
5325}
5326
5327/**
5328 * sme_apply_channel_power_info_to_fw() - sends channel info to fw
5329 * @hHal: hal handle
5330 *
5331 * This function sends the channel power info to firmware
5332 *
5333 * Return: none
5334 */
5335void sme_apply_channel_power_info_to_fw(tHalHandle hHal)
5336{
5337 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
5338
5339 csr_apply_channel_power_info_wrapper(pMac);
5340}
5341
5342/* some support functions */
5343bool sme_is11d_supported(tHalHandle hHal)
5344{
5345 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
5346
5347 return csr_is11d_supported(pMac);
5348}
5349
5350bool sme_is11h_supported(tHalHandle hHal)
5351{
5352 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
5353
5354 return csr_is11h_supported(pMac);
5355}
5356
5357bool sme_is_wmm_supported(tHalHandle hHal)
5358{
5359 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
5360
5361 return csr_is_wmm_supported(pMac);
5362}
5363
5364/* ---------------------------------------------------------------------------
5365
5366 \fn sme_change_country_code
5367
5368 \brief Change Country code from upperlayer during WLAN driver operation.
5369 This is a synchronous API.
5370
5371 \param hHal - The handle returned by mac_open.
5372
5373 \param pCountry New Country Code String
5374
5375 \param sendRegHint If we want to send reg hint to nl80211
5376
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305377 \return QDF_STATUS SUCCESS.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005378
5379 FAILURE or RESOURCES The API finished and failed.
5380
5381 -------------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305382QDF_STATUS sme_change_country_code(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005383 tSmeChangeCountryCallback callback,
5384 uint8_t *pCountry,
5385 void *pContext,
5386 void *p_cds_context,
5387 tAniBool countryFromUserSpace,
5388 tAniBool sendRegHint)
5389{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305390 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005391 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
5392 cds_msg_t msg;
5393 tAniChangeCountryCodeReq *pMsg;
5394
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05305395 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005396 TRACE_CODE_SME_RX_HDD_CHANGE_CNTRYCODE, NO_SESSION,
5397 0));
5398 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305399 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005400 sms_log(pMac, LOG1, FL(" called"));
5401
5402 if ((pMac->roam.configParam.Is11dSupportEnabledOriginal == true)
5403 && (!pMac->roam.configParam.
5404 fSupplicantCountryCodeHasPriority)) {
5405
5406 sms_log(pMac, LOGW,
5407 "Set Country Code Fail since the STA is associated and userspace does not have priority ");
5408
5409 sme_release_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305410 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005411 return status;
5412 }
5413
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305414 pMsg = qdf_mem_malloc(sizeof(tAniChangeCountryCodeReq));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005415 if (NULL == pMsg) {
5416 sms_log(pMac, LOGE,
5417 " csrChangeCountryCode: failed to allocate mem for req");
5418 sme_release_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305419 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005420 }
5421
5422 pMsg->msgType = eWNI_SME_CHANGE_COUNTRY_CODE;
5423 pMsg->msgLen = (uint16_t) sizeof(tAniChangeCountryCodeReq);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305424 qdf_mem_copy(pMsg->countryCode, pCountry, 3);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005425 pMsg->countryFromUserSpace = countryFromUserSpace;
5426 pMsg->sendRegHint = sendRegHint;
5427 pMsg->changeCCCallback = callback;
5428 pMsg->pDevContext = pContext;
5429 pMsg->p_cds_context = p_cds_context;
5430
5431 msg.type = eWNI_SME_CHANGE_COUNTRY_CODE;
5432 msg.bodyptr = pMsg;
5433 msg.reserved = 0;
5434
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305435 if (QDF_STATUS_SUCCESS !=
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005436 cds_mq_post_message(CDS_MQ_ID_SME, &msg)) {
5437 sms_log(pMac, LOGE,
5438 " sme_change_country_code failed to post msg to self ");
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305439 qdf_mem_free((void *)pMsg);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305440 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005441 }
5442 sms_log(pMac, LOG1, FL(" returned"));
5443 sme_release_global_lock(&pMac->sme);
5444 }
5445
5446 return status;
5447}
5448
5449/*--------------------------------------------------------------------------
5450
5451 \fn sme_generic_change_country_code
5452
5453 \brief Change Country code from upperlayer during WLAN driver operation.
5454 This is a synchronous API.
5455
5456 \param hHal - The handle returned by mac_open.
5457
5458 \param pCountry New Country Code String
5459
5460 \param reg_domain regulatory domain
5461
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305462 \return QDF_STATUS SUCCESS.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005463
5464 FAILURE or RESOURCES The API finished and failed.
5465
5466 -----------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305467QDF_STATUS sme_generic_change_country_code(tHalHandle hHal,
Amar Singhal7f1f3ec2015-10-13 17:14:08 -07005468 uint8_t *pCountry)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005469{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305470 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005471 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
5472 cds_msg_t msg;
5473 tAniGenericChangeCountryCodeReq *pMsg;
5474
5475 if (NULL == pMac) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05305476 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_FATAL,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005477 "%s: pMac is null", __func__);
5478 return status;
5479 }
5480
5481 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305482 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005483 sms_log(pMac, LOG1, FL(" called"));
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305484 pMsg = qdf_mem_malloc(sizeof(tAniGenericChangeCountryCodeReq));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005485
5486 if (NULL == pMsg) {
5487 sms_log(pMac, LOGE,
5488 " sme_generic_change_country_code: failed to allocate mem for req");
5489 sme_release_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305490 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005491 }
5492
5493 pMsg->msgType = eWNI_SME_GENERIC_CHANGE_COUNTRY_CODE;
5494 pMsg->msgLen =
5495 (uint16_t) sizeof(tAniGenericChangeCountryCodeReq);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305496 qdf_mem_copy(pMsg->countryCode, pCountry, 2);
Amar Singhal7f1f3ec2015-10-13 17:14:08 -07005497 pMsg->countryCode[2] = ' ';
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005498
5499 msg.type = eWNI_SME_GENERIC_CHANGE_COUNTRY_CODE;
5500 msg.bodyptr = pMsg;
5501 msg.reserved = 0;
5502
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305503 if (QDF_STATUS_SUCCESS !=
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005504 cds_mq_post_message(CDS_MQ_ID_SME, &msg)) {
5505 sms_log(pMac, LOGE,
5506 "sme_generic_change_country_code failed to post msg to self");
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305507 qdf_mem_free(pMsg);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305508 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005509 }
5510 sms_log(pMac, LOG1, FL(" returned"));
5511 sme_release_global_lock(&pMac->sme);
5512 }
5513
5514 return status;
5515}
5516
5517/* ---------------------------------------------------------------------------
5518
5519 \fn sme_dhcp_start_ind
5520
5521 \brief API to signal the FW about the DHCP Start event.
5522
5523 \param hHal - HAL handle for device.
5524
5525 \param device_mode - mode(AP,SAP etc) of the device.
5526
5527 \param macAddr - MAC address of the adapter.
5528
5529 \param sessionId - session ID.
5530
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305531 \return QDF_STATUS SUCCESS.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005532
5533 FAILURE or RESOURCES The API finished and failed.
5534 --------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305535QDF_STATUS sme_dhcp_start_ind(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005536 uint8_t device_mode,
5537 uint8_t *macAddr, uint8_t sessionId)
5538{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305539 QDF_STATUS status;
5540 QDF_STATUS qdf_status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005541 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
5542 cds_msg_t cds_message;
5543 tAniDHCPInd *pMsg;
5544 tCsrRoamSession *pSession;
5545
5546 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305547 if (QDF_STATUS_SUCCESS == status) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005548 pSession = CSR_GET_SESSION(pMac, sessionId);
5549
5550 if (!pSession) {
5551 sms_log(pMac, LOGE, FL("session %d not found "),
5552 sessionId);
5553 sme_release_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305554 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005555 }
5556
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305557 pMsg = (tAniDHCPInd *) qdf_mem_malloc(sizeof(tAniDHCPInd));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005558 if (NULL == pMsg) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05305559 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005560 "%s: Not able to allocate memory for dhcp start",
5561 __func__);
5562 sme_release_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305563 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005564 }
5565 pMsg->msgType = WMA_DHCP_START_IND;
5566 pMsg->msgLen = (uint16_t) sizeof(tAniDHCPInd);
5567 pMsg->device_mode = device_mode;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305568 qdf_mem_copy(pMsg->adapterMacAddr.bytes, macAddr,
Anurag Chouhan6d760662016-02-20 16:05:43 +05305569 QDF_MAC_ADDR_SIZE);
Anurag Chouhanc5548422016-02-24 18:33:27 +05305570 qdf_copy_macaddr(&pMsg->peerMacAddr,
Srinivas Girigowda296105a2015-09-24 16:31:16 -07005571 &pSession->connectedProfile.bssid);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005572
5573 cds_message.type = WMA_DHCP_START_IND;
5574 cds_message.bodyptr = pMsg;
5575 cds_message.reserved = 0;
Sreelakshmi Konamki6a065362016-05-31 16:05:01 +05305576 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
5577 sessionId, cds_message.type));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305578 qdf_status = cds_mq_post_message(CDS_MQ_ID_WMA, &cds_message);
5579 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05305580 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005581 "%s: Post DHCP Start MSG fail", __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305582 qdf_mem_free(pMsg);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305583 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005584 }
5585 sme_release_global_lock(&pMac->sme);
5586 }
5587 return status;
5588}
5589
5590/* ---------------------------------------------------------------------------
5591 \fn sme_dhcp_stop_ind
5592
5593 \brief API to signal the FW about the DHCP complete event.
5594
5595 \param hHal - HAL handle for device.
5596
5597 \param device_mode - mode(AP, SAP etc) of the device.
5598
5599 \param macAddr - MAC address of the adapter.
5600
5601 \param sessionId - session ID.
5602
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305603 \return QDF_STATUS SUCCESS.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005604 FAILURE or RESOURCES The API finished and failed.
5605 --------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305606QDF_STATUS sme_dhcp_stop_ind(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005607 uint8_t device_mode,
5608 uint8_t *macAddr, uint8_t sessionId)
5609{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305610 QDF_STATUS status;
5611 QDF_STATUS qdf_status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005612 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
5613 cds_msg_t cds_message;
5614 tAniDHCPInd *pMsg;
5615 tCsrRoamSession *pSession;
5616
5617 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305618 if (QDF_STATUS_SUCCESS == status) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005619 pSession = CSR_GET_SESSION(pMac, sessionId);
5620
5621 if (!pSession) {
5622 sms_log(pMac, LOGE, FL("session %d not found "),
5623 sessionId);
5624 sme_release_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305625 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005626 }
5627
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305628 pMsg = (tAniDHCPInd *) qdf_mem_malloc(sizeof(tAniDHCPInd));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005629 if (NULL == pMsg) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05305630 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005631 "%s: Not able to allocate memory for dhcp stop",
5632 __func__);
5633 sme_release_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305634 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005635 }
5636
5637 pMsg->msgType = WMA_DHCP_STOP_IND;
5638 pMsg->msgLen = (uint16_t) sizeof(tAniDHCPInd);
5639 pMsg->device_mode = device_mode;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305640 qdf_mem_copy(pMsg->adapterMacAddr.bytes, macAddr,
Anurag Chouhan6d760662016-02-20 16:05:43 +05305641 QDF_MAC_ADDR_SIZE);
Anurag Chouhanc5548422016-02-24 18:33:27 +05305642 qdf_copy_macaddr(&pMsg->peerMacAddr,
Srinivas Girigowda296105a2015-09-24 16:31:16 -07005643 &pSession->connectedProfile.bssid);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005644
5645 cds_message.type = WMA_DHCP_STOP_IND;
5646 cds_message.bodyptr = pMsg;
5647 cds_message.reserved = 0;
Sreelakshmi Konamki6a065362016-05-31 16:05:01 +05305648 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
5649 sessionId, cds_message.type));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305650 qdf_status = cds_mq_post_message(CDS_MQ_ID_WMA, &cds_message);
5651 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05305652 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005653 "%s: Post DHCP Stop MSG fail", __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305654 qdf_mem_free(pMsg);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305655 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005656 }
5657
5658 sme_release_global_lock(&pMac->sme);
5659 }
5660 return status;
5661}
5662
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08005663/*---------------------------------------------------------------------------
5664
5665 \fn sme_TXFailMonitorStopInd
5666
5667 \brief API to signal the FW to start monitoring TX failures
5668
5669 \return QDF_STATUS SUCCESS.
5670
5671 FAILURE or RESOURCES The API finished and failed.
5672 --------------------------------------------------------------------------*/
5673QDF_STATUS sme_tx_fail_monitor_start_stop_ind(tHalHandle hHal, uint8_t tx_fail_count,
5674 void *txFailIndCallback)
5675{
5676 QDF_STATUS status;
5677 QDF_STATUS qdf_status;
5678 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
5679 cds_msg_t cds_message;
5680 tAniTXFailMonitorInd *pMsg;
5681
5682 status = sme_acquire_global_lock(&pMac->sme);
5683 if (QDF_STATUS_SUCCESS == status) {
5684 pMsg = (tAniTXFailMonitorInd *)
5685 qdf_mem_malloc(sizeof(tAniTXFailMonitorInd));
5686 if (NULL == pMsg) {
5687 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
5688 "%s: Failed to allocate memory", __func__);
5689 sme_release_global_lock(&pMac->sme);
5690 return QDF_STATUS_E_NOMEM;
5691 }
5692
5693 pMsg->msgType = WMA_TX_FAIL_MONITOR_IND;
5694 pMsg->msgLen = (uint16_t) sizeof(tAniTXFailMonitorInd);
5695
5696 /* tx_fail_count = 0 should disable the Monitoring in FW */
5697 pMsg->tx_fail_count = tx_fail_count;
5698 pMsg->txFailIndCallback = txFailIndCallback;
5699
5700 cds_message.type = WMA_TX_FAIL_MONITOR_IND;
5701 cds_message.bodyptr = pMsg;
5702 cds_message.reserved = 0;
5703
5704 qdf_status = cds_mq_post_message(CDS_MQ_ID_WMA, &cds_message);
5705 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
5706 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
5707 "%s: Post TX Fail monitor Start MSG fail",
5708 __func__);
5709 qdf_mem_free(pMsg);
5710 status = QDF_STATUS_E_FAILURE;
5711 }
5712 sme_release_global_lock(&pMac->sme);
5713 }
5714 return status;
5715}
5716
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005717/* ---------------------------------------------------------------------------
5718 \fn sme_set_cfg_privacy
5719 \brief API to set configure privacy parameters
5720 \param hHal - The handle returned by mac_open.
5721 \param pProfile - Pointer CSR Roam profile.
5722 \param fPrivacy - This parameter indicates status of privacy
5723
5724 \return void
5725 ---------------------------------------------------------------------------*/
5726void sme_set_cfg_privacy(tHalHandle hHal,
5727 tCsrRoamProfile *pProfile, bool fPrivacy)
5728{
5729 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05305730 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005731 TRACE_CODE_SME_RX_HDD_SET_CFGPRIVACY, NO_SESSION, 0));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305732 if (QDF_STATUS_SUCCESS == sme_acquire_global_lock(&pMac->sme)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005733 csr_set_cfg_privacy(pMac, pProfile, fPrivacy);
5734 sme_release_global_lock(&pMac->sme);
5735 }
5736}
5737
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005738/* ---------------------------------------------------------------------------
5739 \fn sme_neighbor_report_request
5740 \brief API to request neighbor report.
5741 \param hHal - The handle returned by mac_open.
5742 \param pRrmNeighborReq - Pointer to a caller allocated object of type
5743 tRrmNeighborReq. Caller owns the memory and is
5744 responsible for freeing it.
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305745 \return QDF_STATUS
5746 QDF_STATUS_E_FAILURE - failure
5747 QDF_STATUS_SUCCESS success
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005748 ---------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305749QDF_STATUS sme_neighbor_report_request(tHalHandle hHal, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005750 tpRrmNeighborReq pRrmNeighborReq,
5751 tpRrmNeighborRspCallbackInfo callbackInfo)
5752{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305753 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005754 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05305755 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005756 TRACE_CODE_SME_RX_HDD_NEIGHBOR_REPORTREQ, NO_SESSION,
5757 0));
5758
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305759 if (QDF_STATUS_SUCCESS == sme_acquire_global_lock(&pMac->sme)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005760 status =
5761 sme_rrm_neighbor_report_request(hHal, sessionId,
5762 pRrmNeighborReq, callbackInfo);
5763 sme_release_global_lock(&pMac->sme);
5764 }
5765
5766 return status;
5767}
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005768
5769void sms_log(tpAniSirGlobal pMac, uint32_t loglevel, const char *pString, ...)
5770{
5771#ifdef WLAN_DEBUG
5772 /* Verify against current log level */
5773 if (loglevel >
5774 pMac->utils.gLogDbgLevel[LOG_INDEX_FOR_MODULE(SIR_SMS_MODULE_ID)])
5775 return;
5776 else {
5777 va_list marker;
5778
5779 va_start(marker, pString); /* Initialize variable arguments. */
5780
5781 log_debug(pMac, SIR_SMS_MODULE_ID, loglevel, pString, marker);
5782
5783 va_end(marker); /* Reset variable arguments. */
5784 }
5785#endif
5786}
5787
5788/* ---------------------------------------------------------------------------
5789 \fn sme_get_wcnss_wlan_compiled_version
5790 \brief This API returns the version of the WCNSS WLAN API with
5791 which the HOST driver was built
5792 \param hHal - The handle returned by mac_open.
5793 \param pVersion - Points to the Version structure to be filled
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305794 \return QDF_STATUS
5795 QDF_STATUS_E_INVAL - failure
5796 QDF_STATUS_SUCCESS success
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005797 ---------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305798QDF_STATUS sme_get_wcnss_wlan_compiled_version(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005799 tSirVersionType *pVersion)
5800{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305801 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005802 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
5803
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305804 if (QDF_STATUS_SUCCESS == sme_acquire_global_lock(&pMac->sme)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005805 if (pVersion != NULL)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305806 status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005807 else
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305808 status = QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005809
5810 sme_release_global_lock(&pMac->sme);
5811 }
5812
5813 return status;
5814}
5815
5816/* ---------------------------------------------------------------------------
5817 \fn sme_get_wcnss_wlan_reported_version
5818 \brief This API returns the version of the WCNSS WLAN API with
5819 which the WCNSS driver reports it was built
5820 \param hHal - The handle returned by mac_open.
5821 \param pVersion - Points to the Version structure to be filled
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305822 \return QDF_STATUS
5823 QDF_STATUS_E_INVAL - failure
5824 QDF_STATUS_SUCCESS success
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005825 ---------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305826QDF_STATUS sme_get_wcnss_wlan_reported_version(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005827 tSirVersionType *pVersion)
5828{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305829 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005830 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
5831
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305832 if (QDF_STATUS_SUCCESS == sme_acquire_global_lock(&pMac->sme)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005833 if (pVersion != NULL)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305834 status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005835 else
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305836 status = QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005837
5838 sme_release_global_lock(&pMac->sme);
5839 }
5840
5841 return status;
5842}
5843
5844/* ---------------------------------------------------------------------------
5845 \fn sme_get_wcnss_software_version
5846 \brief This API returns the version string of the WCNSS driver
5847 \param hHal - The handle returned by mac_open.
5848 \param pVersion - Points to the Version string buffer to be filled
5849 \param versionBufferSize - THe size of the Version string buffer
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305850 \return QDF_STATUS
5851 QDF_STATUS_E_INVAL - failure
5852 QDF_STATUS_SUCCESS success
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005853 ---------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305854QDF_STATUS sme_get_wcnss_software_version(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005855 uint8_t *pVersion,
5856 uint32_t versionBufferSize)
5857{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305858 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005859 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
5860 v_CONTEXT_t cds_context = cds_get_global_context();
5861
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305862 if (QDF_STATUS_SUCCESS == sme_acquire_global_lock(&pMac->sme)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005863 if (pVersion != NULL) {
5864 status =
5865 wma_get_wcnss_software_version(cds_context,
5866 pVersion,
5867 versionBufferSize);
5868 } else {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305869 status = QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005870 }
5871 sme_release_global_lock(&pMac->sme);
5872 }
5873
5874 return status;
5875}
5876
5877/* ---------------------------------------------------------------------------
5878 \fn sme_get_wcnss_hardware_version
5879 \brief This API returns the version string of the WCNSS hardware
5880 \param hHal - The handle returned by mac_open.
5881 \param pVersion - Points to the Version string buffer to be filled
5882 \param versionBufferSize - THe size of the Version string buffer
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305883 \return QDF_STATUS
5884 QDF_STATUS_E_INVAL - failure
5885 QDF_STATUS_SUCCESS success
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005886 ---------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305887QDF_STATUS sme_get_wcnss_hardware_version(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005888 uint8_t *pVersion,
5889 uint32_t versionBufferSize)
5890{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305891 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005892 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
5893
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305894 if (QDF_STATUS_SUCCESS == sme_acquire_global_lock(&pMac->sme)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005895 if (pVersion != NULL)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305896 status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005897 else
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305898 status = QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005899
5900 sme_release_global_lock(&pMac->sme);
5901 }
5902
5903 return status;
5904}
5905
5906#ifdef FEATURE_WLAN_WAPI
5907
5908/* ---------------------------------------------------------------------------
5909 \fn sme_scan_get_bkid_candidate_list
5910 \brief a wrapper function to return the BKID candidate list
5911 \param pBkidList - caller allocated buffer point to an array of
5912 tBkidCandidateInfo
5913 \param pNumItems - pointer to a variable that has the number of
5914 tBkidCandidateInfo allocated when retruning, this is
5915 either the number needed or number of items put into
5916 pPmkidList
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305917 \return QDF_STATUS - when fail, it usually means the buffer allocated is not
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005918 big enough and pNumItems
5919 has the number of tBkidCandidateInfo.
5920 \Note: pNumItems is a number of tBkidCandidateInfo,
5921 not sizeof(tBkidCandidateInfo) * something
5922 ---------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305923QDF_STATUS sme_scan_get_bkid_candidate_list(tHalHandle hHal, uint32_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005924 tBkidCandidateInfo *pBkidList,
5925 uint32_t *pNumItems)
5926{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305927 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005928 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
5929
5930 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305931 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005932 status =
5933 csr_scan_get_bkid_candidate_list(pMac, sessionId, pBkidList,
5934 pNumItems);
5935 sme_release_global_lock(&pMac->sme);
5936 }
5937
5938 return status;
5939}
5940#endif /* FEATURE_WLAN_WAPI */
5941
5942#ifdef FEATURE_OEM_DATA_SUPPORT
Krishna Kumaar Natarajanc5e06ac2016-06-30 16:49:19 -07005943/**
5944 * sme_oem_data_req() - send oem data request to WMA
5945 * @hal: HAL handle
5946 * @hdd_oem_req: OEM data request from HDD
5947 *
5948 * Return: QDF_STATUS
5949 */
Krishna Kumaar Natarajanc1fa17d2016-08-03 14:19:20 -07005950QDF_STATUS sme_oem_data_req(tHalHandle hal, struct oem_data_req *hdd_oem_req)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005951{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305952 QDF_STATUS status = QDF_STATUS_SUCCESS;
Krishna Kumaar Natarajanc5e06ac2016-06-30 16:49:19 -07005953 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
Krishna Kumaar Natarajanc1fa17d2016-08-03 14:19:20 -07005954 struct oem_data_req *oem_data_req;
Krishna Kumaar Natarajanc5e06ac2016-06-30 16:49:19 -07005955 void *wma_handle;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005956
Krishna Kumaar Natarajanc5e06ac2016-06-30 16:49:19 -07005957 sms_log(mac_ctx, LOG1, FL("enter"));
5958 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
5959 if (!wma_handle) {
5960 sms_log(mac_ctx, LOGE, FL("wma_handle is NULL"));
5961 return QDF_STATUS_E_FAILURE;
5962 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005963
Krishna Kumaar Natarajanc5e06ac2016-06-30 16:49:19 -07005964 oem_data_req = qdf_mem_malloc(sizeof(*oem_data_req));
5965 if (!oem_data_req) {
5966 sms_log(mac_ctx, LOGE, FL("mem alloc failed"));
5967 return QDF_STATUS_E_NOMEM;
5968 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005969
Krishna Kumaar Natarajanc5e06ac2016-06-30 16:49:19 -07005970 oem_data_req->data_len = hdd_oem_req->data_len;
5971 oem_data_req->data = qdf_mem_malloc(oem_data_req->data_len);
5972 if (!oem_data_req->data) {
5973 sms_log(mac_ctx, LOGE, FL("mem alloc failed"));
5974 return QDF_STATUS_E_NOMEM;
5975 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005976
Krishna Kumaar Natarajanc5e06ac2016-06-30 16:49:19 -07005977 qdf_mem_copy(oem_data_req->data, hdd_oem_req->data,
5978 oem_data_req->data_len);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005979
Krishna Kumaar Natarajanc5e06ac2016-06-30 16:49:19 -07005980 status = wma_start_oem_data_req(wma_handle, oem_data_req);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005981
Krishna Kumaar Natarajanc5e06ac2016-06-30 16:49:19 -07005982 if (!QDF_IS_STATUS_SUCCESS(status)) {
5983 sms_log(mac_ctx, LOGE, FL("Post oem data request msg fail"));
5984 } else {
5985 sms_log(mac_ctx, LOG1,
5986 FL("OEM request(length: %d) sent to WMA"),
5987 oem_data_req->data_len);
5988 }
5989
5990 if (oem_data_req->data_len)
5991 qdf_mem_free(oem_data_req->data);
5992 qdf_mem_free(oem_data_req);
5993
5994 sms_log(mac_ctx, LOG1, FL("exit"));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005995 return status;
5996}
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005997#endif /*FEATURE_OEM_DATA_SUPPORT */
5998
5999/*--------------------------------------------------------------------------
6000
6001 \brief sme_open_session() - Open a session for scan/roam operation.
6002
6003 This is a synchronous API.
6004
6005 \param hHal - The handle returned by mac_open.
6006 \param callback - A pointer to the function caller specifies for
6007 roam/connect status indication
6008 \param pContext - The context passed with callback
6009 \param pSelfMacAddr - Caller allocated memory filled with self MAC address
6010 (6 bytes)
6011 \param pbSessionId - pointer to a caller allocated buffer for returned session ID
6012
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306013 \return QDF_STATUS_SUCCESS - session is opened. sessionId returned.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006014
6015 Other status means SME is failed to open the session.
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306016 QDF_STATUS_E_RESOURCES - no more session available.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006017 \sa
6018
6019 --------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306020QDF_STATUS sme_open_session(tHalHandle hHal, csr_roam_completeCallback callback,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006021 void *pContext,
6022 uint8_t *pSelfMacAddr, uint8_t *pbSessionId,
6023 uint32_t type, uint32_t subType)
6024{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306025 QDF_STATUS status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006026 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
6027
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05306028 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_HIGH,
Peng Xu66162de2016-02-11 17:01:20 -08006029 "%s: type=%d, subType=%d addr:%pM",
6030 __func__, type, subType, pSelfMacAddr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006031
6032 if (NULL == pbSessionId) {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306033 status = QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006034 } else {
6035 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306036 if (QDF_IS_STATUS_SUCCESS(status)) {
Peng Xu66162de2016-02-11 17:01:20 -08006037 status = csr_roam_open_session(pMac, callback, pContext,
6038 pSelfMacAddr,
6039 pbSessionId, type,
6040 subType);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006041
6042 sme_release_global_lock(&pMac->sme);
6043 }
6044 }
6045 if (NULL != pbSessionId)
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05306046 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006047 TRACE_CODE_SME_RX_HDD_OPEN_SESSION,
6048 *pbSessionId, 0));
6049
6050 return status;
6051}
6052
6053/*--------------------------------------------------------------------------
6054
6055 \brief sme_close_session() - Open a session for scan/roam operation.
6056
6057 This is a synchronous API.
6058
6059 \param hHal - The handle returned by mac_open.
6060
6061 \param sessionId - A previous opened session's ID.
6062
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306063 \return QDF_STATUS_SUCCESS - session is closed.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006064
6065 Other status means SME is failed to open the session.
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306066 QDF_STATUS_E_INVAL - session is not opened.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006067 \sa
6068
6069 --------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306070QDF_STATUS sme_close_session(tHalHandle hHal, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006071 csr_roamSessionCloseCallback callback,
6072 void *pContext)
6073{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306074 QDF_STATUS status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006075 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
6076
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05306077 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006078 TRACE_CODE_SME_RX_HDD_CLOSE_SESSION, sessionId, 0));
6079 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306080 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006081 status = csr_roam_close_session(pMac, sessionId, false,
6082 callback, pContext);
6083
6084 sme_release_global_lock(&pMac->sme);
6085 }
6086
6087 return status;
6088}
6089
6090/* ---------------------------------------------------------------------------
6091
6092 \fn sme_roam_update_apwpsie
6093
6094 \brief To update AP's WPS IE. This function should be called after SME AP session is created
6095 This is an asynchronous API.
6096
6097 \param pAPWPSIES - pointer to a caller allocated object of tSirAPWPSIEs
6098
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306099 \return QDF_STATUS – SUCCESS –
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006100
6101 FAILURE or RESOURCES – The API finished and failed.
6102
6103 -------------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306104QDF_STATUS sme_roam_update_apwpsie(tHalHandle hHal, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006105 tSirAPWPSIEs *pAPWPSIES)
6106{
6107
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306108 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006109 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
6110
6111 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306112 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006113
6114 status = csr_roam_update_apwpsie(pMac, sessionId, pAPWPSIES);
6115
6116 sme_release_global_lock(&pMac->sme);
6117 }
6118
6119 return status;
6120}
6121
6122/* ---------------------------------------------------------------------------
6123
6124 \fn sme_roam_update_apwparsni_es
6125
6126 \brief To update AP's WPA/RSN IEs. This function should be called after SME AP session is created
6127 This is an asynchronous API.
6128
6129 \param pAPSirRSNie - pointer to a caller allocated object of tSirRSNie with WPS/RSN IEs
6130
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306131 \return QDF_STATUS – SUCCESS –
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006132
6133 FAILURE or RESOURCES – The API finished and failed.
6134
6135 -------------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306136QDF_STATUS sme_roam_update_apwparsni_es(tHalHandle hHal, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006137 tSirRSNie *pAPSirRSNie)
6138{
6139
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306140 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006141 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
6142
6143 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306144 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006145
6146 status = csr_roam_update_wparsni_es(pMac, sessionId, pAPSirRSNie);
6147
6148 sme_release_global_lock(&pMac->sme);
6149 }
6150
6151 return status;
6152}
6153
6154/* ---------------------------------------------------------------------------
6155
6156 \fn sme_change_mcc_beacon_interval
6157
6158 \brief To update P2P-GO beaconInterval. This function should be called after
6159 disassociating all the station is done
6160 This is an asynchronous API.
6161
6162 \param
6163
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306164 \return QDF_STATUS SUCCESS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006165 FAILURE or RESOURCES
6166 The API finished and failed.
6167
6168 -------------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306169QDF_STATUS sme_change_mcc_beacon_interval(tHalHandle hHal, uint8_t sessionId)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006170{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306171 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006172 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
6173
6174 sms_log(pMac, LOG1, FL("Update Beacon PARAMS "));
6175 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306176 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006177 status = csr_send_chng_mcc_beacon_interval(pMac, sessionId);
6178 sme_release_global_lock(&pMac->sme);
6179 }
6180 return status;
6181}
6182
6183/**
6184 * sme_set_host_offload(): API to set the host offload feature.
6185 * @hHal: The handle returned by mac_open.
6186 * @sessionId: Session Identifier
6187 * @request: Pointer to the offload request.
6188 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306189 * Return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006190 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306191QDF_STATUS sme_set_host_offload(tHalHandle hHal, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006192 tpSirHostOffloadReq request)
6193{
6194 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306195 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006196
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05306197 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006198 TRACE_CODE_SME_RX_HDD_SET_HOSTOFFLOAD, sessionId, 0));
6199 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306200 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006201#ifdef WLAN_NS_OFFLOAD
6202 if (SIR_IPV6_NS_OFFLOAD == request->offloadType) {
6203 status = sme_set_ps_ns_offload(hHal, request,
6204 sessionId);
6205 } else
6206#endif /* WLAN_NS_OFFLOAD */
6207 {
6208 status = sme_set_ps_host_offload(hHal, request,
6209 sessionId);
6210 }
6211 sme_release_global_lock(&pMac->sme);
6212 }
6213
6214 return status;
6215}
6216
6217#ifdef WLAN_FEATURE_GTK_OFFLOAD
6218/**
6219 * sme_set_gtk_offload(): API to set GTK offload information.
6220 * @hHal: The handle returned by mac_open.
6221 * @sessionId: Session Identifier
6222 * @pGtkOffload: Pointer to the GTK offload request..
6223 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306224 * Return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006225 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306226QDF_STATUS sme_set_gtk_offload(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006227 tpSirGtkOffloadParams pGtkOffload,
6228 uint8_t sessionId)
6229{
6230 tpSirGtkOffloadParams request_buf;
6231 cds_msg_t msg;
6232 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
6233 tCsrRoamSession *pSession = CSR_GET_SESSION(pMac, sessionId);
6234
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05306235 QDF_TRACE(QDF_MODULE_ID_HDD, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006236 "%s: KeyReplayCounter: %lld", __func__,
6237 pGtkOffload->ullKeyReplayCounter);
6238
6239 if (NULL == pSession) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05306240 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006241 "%s: Session not found ", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306242 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006243 }
6244
Anurag Chouhan600c3a02016-03-01 10:33:54 +05306245 request_buf = qdf_mem_malloc(sizeof(*request_buf));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006246 if (NULL == request_buf) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05306247 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006248 FL("Not able to allocate memory for GTK offload request"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306249 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006250 }
6251
Anurag Chouhanc5548422016-02-24 18:33:27 +05306252 qdf_copy_macaddr(&pGtkOffload->bssid,
Srinivas Girigowda2213b1d2015-11-20 17:10:11 -08006253 &pSession->connectedProfile.bssid);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006254
6255 *request_buf = *pGtkOffload;
6256
6257 msg.type = WMA_GTK_OFFLOAD_REQ;
6258 msg.reserved = 0;
6259 msg.bodyptr = request_buf;
Sreelakshmi Konamki6a065362016-05-31 16:05:01 +05306260 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
6261 sessionId, msg.type));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306262 if (!QDF_IS_STATUS_SUCCESS
Anurag Chouhan6d760662016-02-20 16:05:43 +05306263 (cds_mq_post_message(QDF_MODULE_ID_WMA, &msg))) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05306264 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006265 FL("Not able to post SIR_HAL_SET_GTK_OFFLOAD message to HAL"));
Anurag Chouhan600c3a02016-03-01 10:33:54 +05306266 qdf_mem_free(request_buf);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306267 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006268 }
6269
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306270 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006271}
6272
6273/**
6274 * sme_get_gtk_offload(): API to get GTK offload information
6275 * @hHal: The handle returned by mac_open.
6276 * @callback_routine: callback_routine.
6277 * @sessionId: Session Identifier.
6278 * callback_context: callback_context.
6279 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306280 * Return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006281 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306282QDF_STATUS sme_get_gtk_offload(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006283 gtk_offload_get_info_callback callback_routine,
6284 void *callback_context, uint8_t session_id)
6285{
6286 tpSirGtkOffloadGetInfoRspParams request_buf;
6287 cds_msg_t msg;
6288 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
6289 tCsrRoamSession *pSession = CSR_GET_SESSION(pMac, session_id);
6290
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05306291 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO, "%s: Entered",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006292 __func__);
6293
6294 if (NULL == pSession) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05306295 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Srinivas Girigowda2213b1d2015-11-20 17:10:11 -08006296 "%s: Session not found", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306297 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006298 }
6299
Anurag Chouhan600c3a02016-03-01 10:33:54 +05306300 request_buf = qdf_mem_malloc(sizeof(*request_buf));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006301 if (NULL == request_buf) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05306302 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006303 FL("Not able to allocate memory for Get GTK offload request"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306304 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006305 }
6306
Anurag Chouhanc5548422016-02-24 18:33:27 +05306307 qdf_copy_macaddr(&request_buf->bssid,
Srinivas Girigowda2213b1d2015-11-20 17:10:11 -08006308 &pSession->connectedProfile.bssid);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006309
6310 msg.type = WMA_GTK_OFFLOAD_GETINFO_REQ;
6311 msg.reserved = 0;
6312 msg.bodyptr = request_buf;
6313
6314 /* Cache the Get GTK Offload callback information */
6315 if (NULL != pMac->sme.gtk_offload_get_info_cb) {
6316
6317 /* Do we need to check if the callback is in use? */
6318 /* Because we are not sending the same message again
6319 * when it is pending,
6320 * the only case when the callback is not NULL is that
6321 * the previous message was timed out or failed.
6322 * So, it will be safe to set the callback in this case.
6323 */
6324 }
6325
6326 pMac->sme.gtk_offload_get_info_cb = callback_routine;
6327 pMac->sme.gtk_offload_get_info_cb_context = callback_context;
Sreelakshmi Konamki6a065362016-05-31 16:05:01 +05306328 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
6329 session_id, msg.type));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306330 if (!QDF_IS_STATUS_SUCCESS
Anurag Chouhan6d760662016-02-20 16:05:43 +05306331 (cds_mq_post_message(QDF_MODULE_ID_WMA, &msg))) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05306332 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006333 FL("Not able to post WMA_GTK_OFFLOAD_GETINFO_REQ message to WMA"));
Anurag Chouhan600c3a02016-03-01 10:33:54 +05306334 qdf_mem_free(request_buf);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306335 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006336 }
6337
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306338 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006339}
6340#endif /* WLAN_FEATURE_GTK_OFFLOAD */
6341
6342/* ---------------------------------------------------------------------------
6343 \fn sme_set_keep_alive
6344 \brief API to set the Keep Alive feature.
6345 \param hHal - The handle returned by mac_open.
6346 \param request - Pointer to the Keep Alive request.
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306347 \return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006348 ---------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306349QDF_STATUS sme_set_keep_alive(tHalHandle hHal, uint8_t session_id,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006350 tpSirKeepAliveReq request)
6351{
6352 tpSirKeepAliveReq request_buf;
6353 cds_msg_t msg;
6354 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
6355 tCsrRoamSession *pSession = CSR_GET_SESSION(pMac, session_id);
6356
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05306357 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO_LOW,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006358 FL("WMA_SET_KEEP_ALIVE message"));
6359
6360 if (pSession == NULL) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05306361 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006362 FL("Session not Found"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306363 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006364 }
Anurag Chouhan600c3a02016-03-01 10:33:54 +05306365 request_buf = qdf_mem_malloc(sizeof(tSirKeepAliveReq));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006366 if (NULL == request_buf) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05306367 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006368 FL("Not able to allocate memory for keep alive request"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306369 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006370 }
6371
Anurag Chouhanc5548422016-02-24 18:33:27 +05306372 qdf_copy_macaddr(&request->bssid, &pSession->connectedProfile.bssid);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05306373 qdf_mem_copy(request_buf, request, sizeof(tSirKeepAliveReq));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006374
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05306375 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO_LOW,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006376 "buff TP %d input TP %d ", request_buf->timePeriod,
6377 request->timePeriod);
6378 request_buf->sessionId = session_id;
6379
6380 msg.type = WMA_SET_KEEP_ALIVE;
6381 msg.reserved = 0;
6382 msg.bodyptr = request_buf;
Sreelakshmi Konamki6a065362016-05-31 16:05:01 +05306383 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
6384 session_id, msg.type));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306385 if (QDF_STATUS_SUCCESS !=
Anurag Chouhan6d760662016-02-20 16:05:43 +05306386 cds_mq_post_message(QDF_MODULE_ID_WMA, &msg)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05306387 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006388 FL("Not able to post WMA_SET_KEEP_ALIVE message to WMA"));
Anurag Chouhan600c3a02016-03-01 10:33:54 +05306389 qdf_mem_free(request_buf);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306390 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006391 }
6392
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306393 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006394}
6395
6396#ifdef FEATURE_WLAN_SCAN_PNO
6397/* ---------------------------------------------------------------------------
6398 \fn sme_set_preferred_network_list
6399 \brief API to set the Preferred Network List Offload feature.
6400 \param hHal - The handle returned by mac_open.
6401 \param request - Pointer to the offload request.
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306402 \return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006403 ---------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306404QDF_STATUS sme_set_preferred_network_list(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006405 tpSirPNOScanReq request,
6406 uint8_t sessionId,
6407 void (*callback_routine)(void *callback_context,
6408 tSirPrefNetworkFoundInd
6409 *pPrefNetworkFoundInd),
6410 void *callback_context)
6411{
6412 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306413 QDF_STATUS status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006414
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05306415 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Sreelakshmi Konamki6744cff2015-09-07 12:10:39 +05306416 TRACE_CODE_SME_RX_HDD_PREF_NET_LIST,
6417 sessionId, request->ucNetworksCount));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006418 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306419 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006420 sme_set_ps_preferred_network_list(hHal, request, sessionId,
6421 callback_routine, callback_context);
6422 sme_release_global_lock(&pMac->sme);
6423 }
6424
6425 return status;
6426}
6427
6428#endif /* FEATURE_WLAN_SCAN_PNO */
6429
6430/* ---------------------------------------------------------------------------
6431 \fn sme_abort_mac_scan
6432 \brief API to cancel MAC scan.
6433 \param hHal - The handle returned by mac_open.
6434 \param sessionId - sessionId on which we need to abort scan.
6435 \param reason - Reason to abort the scan.
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306436 \return QDF_STATUS
6437 QDF_STATUS_E_FAILURE - failure
6438 QDF_STATUS_SUCCESS success
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006439 ---------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306440QDF_STATUS sme_abort_mac_scan(tHalHandle hHal, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006441 eCsrAbortReason reason)
6442{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306443 QDF_STATUS status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006444 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
6445
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05306446 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006447 TRACE_CODE_SME_RX_HDD_ABORT_MACSCAN, NO_SESSION, 0));
6448 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306449 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006450 status = csr_scan_abort_mac_scan(pMac, sessionId, reason);
6451
6452 sme_release_global_lock(&pMac->sme);
6453 }
6454
6455 return status;
6456}
6457
6458/* ----------------------------------------------------------------------------
6459 \fn sme_get_operation_channel
6460 \brief API to get current channel on which STA is parked
6461 this function gives channel information only of infra station or IBSS station
6462 \param hHal, pointer to memory location and sessionId
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306463 \returns QDF_STATUS_SUCCESS
6464 QDF_STATUS_E_FAILURE
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006465 -------------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306466QDF_STATUS sme_get_operation_channel(tHalHandle hHal, uint32_t *pChannel,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006467 uint8_t sessionId)
6468{
6469 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
6470 tCsrRoamSession *pSession;
6471
6472 if (CSR_IS_SESSION_VALID(pMac, sessionId)) {
6473 pSession = CSR_GET_SESSION(pMac, sessionId);
6474
6475 if ((pSession->connectedProfile.BSSType ==
6476 eCSR_BSS_TYPE_INFRASTRUCTURE)
6477 || (pSession->connectedProfile.BSSType ==
6478 eCSR_BSS_TYPE_IBSS)
6479 || (pSession->connectedProfile.BSSType ==
6480 eCSR_BSS_TYPE_INFRA_AP)
6481 || (pSession->connectedProfile.BSSType ==
6482 eCSR_BSS_TYPE_START_IBSS)) {
6483 *pChannel = pSession->connectedProfile.operationChannel;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306484 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006485 }
6486 }
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306487 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006488} /* sme_get_operation_channel ends here */
6489
Abhishek Singh7996eb72015-12-30 17:24:02 +05306490/**
Selvaraj, Sridhar4577a9b2016-09-04 15:17:07 +05306491 * sme_register_p2p_ack_ind_callback() - p2p ack indication callback
6492 * @hal: hal pointer
6493 * @callback: callback pointer to be registered
6494 *
6495 * This function is used to register a callback to PE for p2p ack
6496 * indication
6497 *
6498 * Return: Success if msg is posted to PE else Failure.
6499 */
6500QDF_STATUS sme_register_p2p_ack_ind_callback(tHalHandle hal,
6501 sir_p2p_ack_ind_callback callback)
6502{
6503 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
6504 struct sir_sme_p2p_ack_ind_cb_req *msg;
6505 QDF_STATUS status = QDF_STATUS_SUCCESS;
6506 sms_log(mac_ctx, LOG1, FL(": ENTER"));
6507 status = sme_acquire_global_lock(&mac_ctx->sme);
6508 if (QDF_IS_STATUS_SUCCESS(status)) {
6509 msg = qdf_mem_malloc(sizeof(*msg));
6510 if (NULL == msg) {
6511 sms_log(mac_ctx, LOGE,
6512 FL("Failed to allocate memory"));
6513 sme_release_global_lock(&mac_ctx->sme);
6514 return QDF_STATUS_E_NOMEM;
6515 }
6516 qdf_mem_zero(msg, sizeof(*msg));
6517 msg->message_type = eWNI_SME_REGISTER_P2P_ACK_CB;
6518 msg->length = sizeof(*msg);
6519
6520 msg->callback = callback;
6521 status = cds_send_mb_message_to_mac(msg);
6522 sme_release_global_lock(&mac_ctx->sme);
6523 return status;
6524 }
6525 return status;
6526}
6527
6528/**
Abhishek Singh7996eb72015-12-30 17:24:02 +05306529 * sme_register_mgmt_frame_ind_callback() - Register a callback for
6530 * management frame indication to PE.
6531 *
6532 * @hal: hal pointer
6533 * @callback: callback pointer to be registered
6534 *
6535 * This function is used to register a callback for management
6536 * frame indication to PE.
6537 *
6538 * Return: Success if msg is posted to PE else Failure.
6539 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306540QDF_STATUS sme_register_mgmt_frame_ind_callback(tHalHandle hal,
Abhishek Singh7996eb72015-12-30 17:24:02 +05306541 sir_mgmt_frame_ind_callback callback)
6542{
6543 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
6544 struct sir_sme_mgmt_frame_cb_req *msg;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306545 QDF_STATUS status = QDF_STATUS_SUCCESS;
Abhishek Singh7996eb72015-12-30 17:24:02 +05306546
6547 sms_log(mac_ctx, LOG1, FL(": ENTER"));
6548
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306549 if (QDF_STATUS_SUCCESS ==
Abhishek Singh7996eb72015-12-30 17:24:02 +05306550 sme_acquire_global_lock(&mac_ctx->sme)) {
Anurag Chouhan600c3a02016-03-01 10:33:54 +05306551 msg = qdf_mem_malloc(sizeof(*msg));
Abhishek Singh7996eb72015-12-30 17:24:02 +05306552 if (NULL == msg) {
6553 sms_log(mac_ctx, LOGE,
6554 FL("Not able to allocate memory for eWNI_SME_REGISTER_MGMT_FRAME_CB"));
6555 sme_release_global_lock(&mac_ctx->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306556 return QDF_STATUS_E_NOMEM;
Abhishek Singh7996eb72015-12-30 17:24:02 +05306557 }
Anurag Chouhan600c3a02016-03-01 10:33:54 +05306558 qdf_mem_set(msg, sizeof(*msg), 0);
Abhishek Singh7996eb72015-12-30 17:24:02 +05306559 msg->message_type = eWNI_SME_REGISTER_MGMT_FRAME_CB;
6560 msg->length = sizeof(*msg);
6561
6562 msg->callback = callback;
6563 status = cds_send_mb_message_to_mac(msg);
6564 sme_release_global_lock(&mac_ctx->sme);
6565 return status;
6566 }
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306567 return QDF_STATUS_E_FAILURE;
Abhishek Singh7996eb72015-12-30 17:24:02 +05306568}
6569
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006570/* ---------------------------------------------------------------------------
6571
6572 \fn sme_RegisterMgtFrame
6573
6574 \brief To register managment frame of specified type and subtype.
6575 \param frameType - type of the frame that needs to be passed to HDD.
6576 \param matchData - data which needs to be matched before passing frame
6577 to HDD.
6578 \param matchDataLen - Length of matched data.
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306579 \return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006580 -------------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306581QDF_STATUS sme_register_mgmt_frame(tHalHandle hHal, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006582 uint16_t frameType, uint8_t *matchData,
6583 uint16_t matchLen)
6584{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306585 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006586 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
6587
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05306588 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006589 TRACE_CODE_SME_RX_HDD_REGISTER_MGMTFR, sessionId, 0));
6590 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306591 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006592 tSirRegisterMgmtFrame *pMsg;
6593 uint16_t len;
6594 tCsrRoamSession *pSession = CSR_GET_SESSION(pMac, sessionId);
6595
6596 if (!CSR_IS_SESSION_ANY(sessionId) && !pSession) {
6597 sms_log(pMac, LOGE, FL(" session %d not found "),
6598 sessionId);
6599 sme_release_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306600 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006601 }
6602
6603 if (!CSR_IS_SESSION_ANY(sessionId) && !pSession->sessionActive) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05306604 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006605 "%s Invalid Sessionid", __func__);
6606 sme_release_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306607 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006608 }
6609
6610 len = sizeof(tSirRegisterMgmtFrame) + matchLen;
6611
Anurag Chouhan600c3a02016-03-01 10:33:54 +05306612 pMsg = qdf_mem_malloc(len);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006613 if (NULL == pMsg)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306614 status = QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006615 else {
Anurag Chouhan600c3a02016-03-01 10:33:54 +05306616 qdf_mem_set(pMsg, len, 0);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006617 pMsg->messageType = eWNI_SME_REGISTER_MGMT_FRAME_REQ;
6618 pMsg->length = len;
6619 pMsg->sessionId = sessionId;
6620 pMsg->registerFrame = true;
6621 pMsg->frameType = frameType;
6622 pMsg->matchLen = matchLen;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05306623 qdf_mem_copy(pMsg->matchData, matchData, matchLen);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006624 status = cds_send_mb_message_to_mac(pMsg);
6625 }
6626 sme_release_global_lock(&pMac->sme);
6627 }
6628 return status;
6629}
6630
6631/* ---------------------------------------------------------------------------
6632
6633 \fn sme_DeregisterMgtFrame
6634
6635 \brief To De-register managment frame of specified type and subtype.
6636 \param frameType - type of the frame that needs to be passed to HDD.
6637 \param matchData - data which needs to be matched before passing frame
6638 to HDD.
6639 \param matchDataLen - Length of matched data.
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306640 \return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006641 -------------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306642QDF_STATUS sme_deregister_mgmt_frame(tHalHandle hHal, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006643 uint16_t frameType, uint8_t *matchData,
6644 uint16_t matchLen)
6645{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306646 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006647 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
6648
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05306649 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006650 TRACE_CODE_SME_RX_HDD_DEREGISTER_MGMTFR, sessionId,
6651 0));
6652 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306653 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006654 tSirRegisterMgmtFrame *pMsg;
6655 uint16_t len;
6656 tCsrRoamSession *pSession = CSR_GET_SESSION(pMac, sessionId);
6657
6658 if (!CSR_IS_SESSION_ANY(sessionId) && !pSession) {
6659 sms_log(pMac, LOGE, FL(" session %d not found "),
6660 sessionId);
6661 sme_release_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306662 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006663 }
6664
6665 if (!CSR_IS_SESSION_ANY(sessionId) && !pSession->sessionActive) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05306666 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006667 "%s Invalid Sessionid", __func__);
6668 sme_release_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306669 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006670 }
6671
6672 len = sizeof(tSirRegisterMgmtFrame) + matchLen;
6673
Anurag Chouhan600c3a02016-03-01 10:33:54 +05306674 pMsg = qdf_mem_malloc(len);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006675 if (NULL == pMsg)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306676 status = QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006677 else {
Anurag Chouhan600c3a02016-03-01 10:33:54 +05306678 qdf_mem_set(pMsg, len, 0);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006679 pMsg->messageType = eWNI_SME_REGISTER_MGMT_FRAME_REQ;
6680 pMsg->length = len;
6681 pMsg->registerFrame = false;
6682 pMsg->frameType = frameType;
6683 pMsg->matchLen = matchLen;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05306684 qdf_mem_copy(pMsg->matchData, matchData, matchLen);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006685 status = cds_send_mb_message_to_mac(pMsg);
6686 }
6687 sme_release_global_lock(&pMac->sme);
6688 }
6689 return status;
6690}
6691
6692/**
6693 * sme_remain_on_channel - API to request remain on channel for 'x' duration
6694 *
6695 * @hHal: pointer to MAC handle
6696 * @session_id: Session identifier
6697 * @channel: channel information
6698 * @duration: duration in ms
6699 * @callback: HDD registered callback to process reaminOnChannelRsp
6700 * @context: HDD Callback param
6701 * @scan_id: scan identifier
6702 *
6703 * This function process the roc request and generates scan identifier.s
6704 *
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_remain_on_channel(tHalHandle hHal, uint8_t session_id,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006708 uint8_t channel, uint32_t duration,
6709 remainOnChanCallback callback,
6710 void *pContext, uint8_t isP2PProbeReqAllowed,
6711 uint32_t *scan_id)
6712{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306713 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006714 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hHal);
6715 uint32_t san_req_id, scan_count;
6716 struct ani_roc_req *roc_msg;
6717 cds_msg_t msg;
6718
6719
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05306720 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006721 TRACE_CODE_SME_RX_HDD_REMAIN_ONCHAN, session_id, 0));
6722
6723 scan_count = csr_ll_count(&mac_ctx->sme.smeScanCmdActiveList);
6724 if (scan_count >= mac_ctx->scan.max_scan_count) {
6725 sms_log(mac_ctx, LOGE, FL("Max scan reached"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306726 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006727 }
6728
6729 wma_get_scan_id(&san_req_id);
6730 *scan_id = san_req_id;
6731 status = sme_acquire_global_lock(&mac_ctx->sme);
6732
6733 sms_log(mac_ctx, LOG1, FL(" called"));
Anurag Chouhan600c3a02016-03-01 10:33:54 +05306734 roc_msg = qdf_mem_malloc(sizeof(struct ani_roc_req));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006735 if (NULL == roc_msg) {
6736 sms_log(mac_ctx, LOGE,
6737 " scan_req: failed to allocate mem for msg");
6738 sme_release_global_lock(&mac_ctx->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306739 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006740 }
6741 roc_msg->msg_type = eWNI_SME_ROC_CMD;
6742 roc_msg->msg_len = (uint16_t) sizeof(struct ani_roc_req);
6743 roc_msg->session_id = session_id;
6744 roc_msg->callback = callback;
6745 roc_msg->duration = duration;
6746 roc_msg->channel = channel;
6747 roc_msg->is_p2pprobe_allowed = isP2PProbeReqAllowed;
6748 roc_msg->ctx = pContext;
6749 roc_msg->scan_id = *scan_id;
6750 msg.type = eWNI_SME_ROC_CMD;
6751 msg.bodyptr = roc_msg;
6752 msg.reserved = 0;
6753 msg.bodyval = 0;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306754 if (QDF_STATUS_SUCCESS !=
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006755 cds_mq_post_message(CDS_MQ_ID_SME, &msg)) {
6756 sms_log(mac_ctx, LOGE,
6757 " sme_scan_req failed to post msg");
Anurag Chouhan600c3a02016-03-01 10:33:54 +05306758 qdf_mem_free(roc_msg);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306759 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006760 }
6761 sme_release_global_lock(&mac_ctx->sme);
6762 return status;
6763}
6764
6765/* ---------------------------------------------------------------------------
6766 \fn sme_report_probe_req
6767 \brief API to enable/disable forwarding of probeReq to apps in p2p.
6768 \param hHal - The handle returned by mac_open.
6769 \param falg: to set the Probe request forarding to wpa_supplicant in listen state in p2p
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306770 \return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006771 ---------------------------------------------------------------------------*/
6772
6773#ifndef WLAN_FEATURE_CONCURRENT_P2P
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306774QDF_STATUS sme_report_probe_req(tHalHandle hHal, uint8_t flag)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006775{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306776 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006777 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
6778
6779 do {
6780 /* acquire the lock for the sme object */
6781 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306782 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006783 /* call set in context */
6784 pMac->p2pContext.probeReqForwarding = flag;
6785 /* release the lock for the sme object */
6786 sme_release_global_lock(&pMac->sme);
6787 }
6788 } while (0);
6789
6790 sms_log(pMac, LOGW, "exiting function %s", __func__);
6791
6792 return status;
6793}
6794
6795/* ---------------------------------------------------------------------------
6796 \fn sme_update_p2p_ie
6797 \brief API to set the P2p Ie in p2p context
6798 \param hHal - The handle returned by mac_open.
6799 \param p2pIe - Ptr to p2pIe from HDD.
6800 \param p2pIeLength: length of p2pIe
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306801 \return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006802 ---------------------------------------------------------------------------*/
6803
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306804QDF_STATUS sme_update_p2p_ie(tHalHandle hHal, void *p2pIe, uint32_t p2pIeLength)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006805{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306806 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006807 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
6808
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05306809 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006810 TRACE_CODE_SME_RX_HDD_UPDATE_P2P_IE, NO_SESSION, 0));
6811 /* acquire the lock for the sme object */
6812 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306813 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006814 if (NULL != pMac->p2pContext.probeRspIe) {
Anurag Chouhan600c3a02016-03-01 10:33:54 +05306815 qdf_mem_free(pMac->p2pContext.probeRspIe);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006816 pMac->p2pContext.probeRspIeLength = 0;
6817 }
6818
Anurag Chouhan600c3a02016-03-01 10:33:54 +05306819 pMac->p2pContext.probeRspIe = qdf_mem_malloc(p2pIeLength);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006820 if (NULL == pMac->p2pContext.probeRspIe) {
6821 sms_log(pMac, LOGE, "%s: Unable to allocate P2P IE",
6822 __func__);
6823 pMac->p2pContext.probeRspIeLength = 0;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306824 status = QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006825 } else {
6826 pMac->p2pContext.probeRspIeLength = p2pIeLength;
6827
6828 sir_dump_buf(pMac, SIR_LIM_MODULE_ID, LOG2,
6829 pMac->p2pContext.probeRspIe,
6830 pMac->p2pContext.probeRspIeLength);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05306831 qdf_mem_copy((uint8_t *) pMac->p2pContext.probeRspIe,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006832 p2pIe, p2pIeLength);
6833 }
6834
6835 /* release the lock for the sme object */
6836 sme_release_global_lock(&pMac->sme);
6837 }
6838
6839 sms_log(pMac, LOG2, "exiting function %s", __func__);
6840
6841 return status;
6842}
6843#endif
6844
6845/* ---------------------------------------------------------------------------
6846 \fn sme_send_action
6847 \brief API to send action frame from supplicant.
6848 \param hHal - The handle returned by mac_open.
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306849 \return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006850 ---------------------------------------------------------------------------*/
6851
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306852QDF_STATUS sme_send_action(tHalHandle hHal, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006853 const uint8_t *pBuf, uint32_t len,
6854 uint16_t wait, bool noack,
6855 uint16_t channel_freq)
6856{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306857 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006858 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
6859
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05306860 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006861 TRACE_CODE_SME_RX_HDD_SEND_ACTION, sessionId, 0));
6862 /* acquire the lock for the sme object */
6863 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306864 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006865 p2p_send_action(hHal, sessionId, pBuf, len, wait, noack,
6866 channel_freq);
6867 /* release the lock for the sme object */
6868 sme_release_global_lock(&pMac->sme);
6869 }
6870
6871 sms_log(pMac, LOGW, "exiting function %s", __func__);
6872
6873 return status;
6874}
6875
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306876QDF_STATUS sme_cancel_remain_on_channel(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006877 uint8_t sessionId, uint32_t scan_id)
6878{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306879 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006880 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
6881
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05306882 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006883 TRACE_CODE_SME_RX_HDD_CANCEL_REMAIN_ONCHAN, sessionId,
6884 0));
6885 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306886 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006887 status = p2p_cancel_remain_on_channel(hHal, sessionId, scan_id);
6888 sme_release_global_lock(&pMac->sme);
6889 }
6890 return status;
6891}
6892
6893/* Power Save Related */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306894QDF_STATUS sme_p2p_set_ps(tHalHandle hHal, tP2pPsConfig *data)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006895{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306896 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006897 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
6898
6899 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306900 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006901 status = p2p_set_ps(hHal, data);
6902 sme_release_global_lock(&pMac->sme);
6903 }
6904 return status;
6905}
6906
6907/* ---------------------------------------------------------------------------
6908
6909 \fn sme_configure_rxp_filter
6910
6911 \brief
6912 SME will pass this request to lower mac to set/reset the filter on RXP for
6913 multicast & broadcast traffic.
6914
6915 \param
6916
6917 hHal - The handle returned by mac_open.
6918
6919 filterMask- Currently the API takes a 1 or 0 (set or reset) as filter.
6920 Basically to enable/disable the filter (to filter "all" mcbc traffic) based
6921 on this param. In future we can use this as a mask to set various types of
6922 filters as suggested below:
6923 FILTER_ALL_MULTICAST:
6924 FILTER_ALL_BROADCAST:
6925 FILTER_ALL_MULTICAST_BROADCAST:
6926
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306927 \return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006928
6929 --------------------------------------------------------------------------- */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306930QDF_STATUS sme_configure_rxp_filter(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006931 tpSirWlanSetRxpFilters wlanRxpFilterParam)
6932{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306933 QDF_STATUS status = QDF_STATUS_SUCCESS;
6934 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006935 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
6936 cds_msg_t cds_message;
6937
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05306938 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006939 TRACE_CODE_SME_RX_HDD_CONFIG_RXPFIL, NO_SESSION, 0));
6940 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306941 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006942 /* serialize the req through MC thread */
6943 cds_message.bodyptr = wlanRxpFilterParam;
6944 cds_message.type = WMA_CFG_RXP_FILTER_REQ;
Sreelakshmi Konamki6a065362016-05-31 16:05:01 +05306945 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
6946 NO_SESSION, cds_message.type));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306947 qdf_status = cds_mq_post_message(CDS_MQ_ID_WMA, &cds_message);
6948 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
6949 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006950 }
6951 sme_release_global_lock(&pMac->sme);
6952 }
6953 return status;
6954}
6955
6956/* ---------------------------------------------------------------------------
6957
6958 \fn sme_configure_suspend_ind
6959
6960 \brief
6961 SME will pass this request to lower mac to Indicate that the wlan needs to
6962 be suspended
6963
6964 \param
6965
6966 hHal - The handle returned by mac_open.
6967
6968 wlanSuspendParam- Depicts the wlan suspend params
6969
6970 csr_readyToSuspendCallback - Callback to be called when ready to suspend
6971 event is received.
6972 callback_context - Context associated with csr_readyToSuspendCallback.
6973
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306974 \return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006975
6976 --------------------------------------------------------------------------- */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306977QDF_STATUS sme_configure_suspend_ind(tHalHandle hHal,
Houston Hoffman7260ecb2015-10-05 18:43:07 -07006978 uint32_t conn_state_mask,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006979 csr_readyToSuspendCallback callback,
6980 void *callback_context)
6981{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306982 QDF_STATUS status = QDF_STATUS_SUCCESS;
6983 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006984 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
6985 cds_msg_t cds_message;
6986
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05306987 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006988 TRACE_CODE_SME_RX_HDD_CONFIG_SUSPENDIND, NO_SESSION,
6989 0));
6990
6991 pMac->readyToSuspendCallback = callback;
6992 pMac->readyToSuspendContext = callback_context;
6993
6994 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306995 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006996 /* serialize the req through MC thread */
Houston Hoffman7260ecb2015-10-05 18:43:07 -07006997 cds_message.bodyval = conn_state_mask;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006998 cds_message.type = WMA_WLAN_SUSPEND_IND;
Sreelakshmi Konamki6a065362016-05-31 16:05:01 +05306999 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
7000 NO_SESSION, cds_message.type));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307001 qdf_status = cds_mq_post_message(CDS_MQ_ID_WMA, &cds_message);
7002 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007003 pMac->readyToSuspendCallback = NULL;
7004 pMac->readyToSuspendContext = NULL;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307005 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007006 }
7007 sme_release_global_lock(&pMac->sme);
7008 }
7009
7010 return status;
7011}
7012
7013/* ---------------------------------------------------------------------------
7014
7015 \fn sme_configure_resume_req
7016
7017 \brief
7018 SME will pass this request to lower mac to Indicate that the wlan needs to
7019 be Resumed
7020
7021 \param
7022
7023 hHal - The handle returned by mac_open.
7024
7025 wlanResumeParam- Depicts the wlan resume params
7026
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307027 \return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007028
7029 --------------------------------------------------------------------------- */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307030QDF_STATUS sme_configure_resume_req(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007031 tpSirWlanResumeParam wlanResumeParam)
7032{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307033 QDF_STATUS status = QDF_STATUS_SUCCESS;
7034 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007035 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
7036 cds_msg_t cds_message;
7037
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05307038 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007039 TRACE_CODE_SME_RX_HDD_CONFIG_RESUMEREQ, NO_SESSION,
7040 0));
7041 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307042 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007043 /* serialize the req through MC thread */
7044 cds_message.bodyptr = wlanResumeParam;
7045 cds_message.type = WMA_WLAN_RESUME_REQ;
Sreelakshmi Konamki6a065362016-05-31 16:05:01 +05307046 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
7047 NO_SESSION, cds_message.type));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307048 qdf_status = cds_mq_post_message(CDS_MQ_ID_WMA, &cds_message);
7049 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
7050 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007051 }
7052 sme_release_global_lock(&pMac->sme);
7053 }
7054 return status;
7055}
7056
7057#ifdef WLAN_FEATURE_EXTWOW_SUPPORT
Krishna Kumaar Natarajand9131902015-10-19 11:52:47 -07007058/**
7059 * sme_configure_ext_wow() - configure Extr WoW
7060 * @hHal - The handle returned by mac_open.
7061 * @wlanExtParams - Depicts the wlan Ext params.
7062 * @callback - ext_wow callback to be registered.
7063 * @callback_context - ext_wow callback context
7064 *
7065 * SME will pass this request to lower mac to configure Extr WoW
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307066 * Return: QDF_STATUS
Krishna Kumaar Natarajand9131902015-10-19 11:52:47 -07007067 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307068QDF_STATUS sme_configure_ext_wow(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007069 tpSirExtWoWParams wlanExtParams,
7070 csr_readyToExtWoWCallback callback,
7071 void *callback_context)
7072{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307073 QDF_STATUS status = QDF_STATUS_SUCCESS;
7074 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007075 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
7076 cds_msg_t cds_message;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05307077 tpSirExtWoWParams MsgPtr = qdf_mem_malloc(sizeof(*MsgPtr));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007078
7079 if (!MsgPtr)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307080 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007081
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05307082 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007083 TRACE_CODE_SME_RX_HDD_CONFIG_EXTWOW, NO_SESSION, 0));
7084
7085 pMac->readyToExtWoWCallback = callback;
7086 pMac->readyToExtWoWContext = callback_context;
7087
7088 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307089 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007090
7091 /* serialize the req through MC thread */
Anurag Chouhan600c3a02016-03-01 10:33:54 +05307092 qdf_mem_copy(MsgPtr, wlanExtParams, sizeof(*MsgPtr));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007093 cds_message.bodyptr = MsgPtr;
7094 cds_message.type = WMA_WLAN_EXT_WOW;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307095 qdf_status = cds_mq_post_message(CDS_MQ_ID_WMA, &cds_message);
7096 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007097 pMac->readyToExtWoWCallback = NULL;
7098 pMac->readyToExtWoWContext = NULL;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05307099 qdf_mem_free(MsgPtr);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307100 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007101 }
7102 sme_release_global_lock(&pMac->sme);
7103 } else {
7104 pMac->readyToExtWoWCallback = NULL;
7105 pMac->readyToExtWoWContext = NULL;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05307106 qdf_mem_free(MsgPtr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007107 }
7108
7109 return status;
7110}
7111
7112/* ---------------------------------------------------------------------------
7113
7114 \fn sme_configure_app_type1_params
7115
7116 \brief
7117 SME will pass this request to lower mac to configure Indoor WoW parameters.
7118
7119 \param
7120
7121 hHal - The handle returned by mac_open.
7122
7123 wlanAppType1Params- Depicts the wlan App Type 1(Indoor) params
7124
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307125 \return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007126
7127 --------------------------------------------------------------------------- */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307128QDF_STATUS sme_configure_app_type1_params(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007129 tpSirAppType1Params wlanAppType1Params)
7130{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307131 QDF_STATUS status = QDF_STATUS_SUCCESS;
7132 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007133 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
7134 cds_msg_t cds_message;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05307135 tpSirAppType1Params MsgPtr = qdf_mem_malloc(sizeof(*MsgPtr));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007136
7137 if (!MsgPtr)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307138 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007139
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05307140 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007141 TRACE_CODE_SME_RX_HDD_CONFIG_APP_TYPE1, NO_SESSION,
7142 0));
7143
7144 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307145 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007146 /* serialize the req through MC thread */
Anurag Chouhan600c3a02016-03-01 10:33:54 +05307147 qdf_mem_copy(MsgPtr, wlanAppType1Params, sizeof(*MsgPtr));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007148 cds_message.bodyptr = MsgPtr;
7149 cds_message.type = WMA_WLAN_SET_APP_TYPE1_PARAMS;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307150 qdf_status = cds_mq_post_message(CDS_MQ_ID_WMA, &cds_message);
7151 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
Anurag Chouhan600c3a02016-03-01 10:33:54 +05307152 qdf_mem_free(MsgPtr);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307153 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007154 }
7155 sme_release_global_lock(&pMac->sme);
7156 } else {
Anurag Chouhan600c3a02016-03-01 10:33:54 +05307157 qdf_mem_free(MsgPtr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007158 }
7159
7160 return status;
7161}
7162
7163/* ---------------------------------------------------------------------------
7164
7165 \fn sme_configure_app_type2_params
7166
7167 \brief
7168 SME will pass this request to lower mac to configure Indoor WoW parameters.
7169
7170 \param
7171
7172 hHal - The handle returned by mac_open.
7173
7174 wlanAppType2Params- Depicts the wlan App Type 2 (Outdoor) params
7175
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307176 \return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007177
7178 --------------------------------------------------------------------------- */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307179QDF_STATUS sme_configure_app_type2_params(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007180 tpSirAppType2Params wlanAppType2Params)
7181{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307182 QDF_STATUS status = QDF_STATUS_SUCCESS;
7183 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007184 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
7185 cds_msg_t cds_message;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05307186 tpSirAppType2Params MsgPtr = qdf_mem_malloc(sizeof(*MsgPtr));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007187
7188 if (!MsgPtr)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307189 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007190
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05307191 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007192 TRACE_CODE_SME_RX_HDD_CONFIG_APP_TYPE2, NO_SESSION,
7193 0));
7194
7195 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307196 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007197 /* serialize the req through MC thread */
Anurag Chouhan600c3a02016-03-01 10:33:54 +05307198 qdf_mem_copy(MsgPtr, wlanAppType2Params, sizeof(*MsgPtr));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007199 cds_message.bodyptr = MsgPtr;
7200 cds_message.type = WMA_WLAN_SET_APP_TYPE2_PARAMS;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307201 qdf_status = cds_mq_post_message(CDS_MQ_ID_WMA, &cds_message);
7202 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
Anurag Chouhan600c3a02016-03-01 10:33:54 +05307203 qdf_mem_free(MsgPtr);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307204 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007205 }
7206 sme_release_global_lock(&pMac->sme);
7207 } else {
Anurag Chouhan600c3a02016-03-01 10:33:54 +05307208 qdf_mem_free(MsgPtr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007209 }
7210
7211 return status;
7212}
7213#endif
7214
7215/* ---------------------------------------------------------------------------
7216
7217 \fn sme_get_infra_session_id
7218
7219 \brief To get the session ID for infra session, if connected
7220 This is a synchronous API.
7221
7222 \param hHal - The handle returned by mac_open.
7223
7224 \return sessionid, -1 if infra session is not connected
7225
7226 -------------------------------------------------------------------------------*/
7227int8_t sme_get_infra_session_id(tHalHandle hHal)
7228{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307229 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007230 int8_t sessionid = -1;
7231 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
7232
7233 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307234 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007235
7236 sessionid = csr_get_infra_session_id(pMac);
7237
7238 sme_release_global_lock(&pMac->sme);
7239 }
7240
7241 return sessionid;
7242}
7243
7244/* ---------------------------------------------------------------------------
7245
7246 \fn sme_get_infra_operation_channel
7247
7248 \brief To get the operating channel for infra session, if connected
7249 This is a synchronous API.
7250
7251 \param hHal - The handle returned by mac_open.
7252 \param sessionId - the sessionId returned by sme_open_session.
7253
7254 \return operating channel, 0 if infra session is not connected
7255
7256 -------------------------------------------------------------------------------*/
7257uint8_t sme_get_infra_operation_channel(tHalHandle hHal, uint8_t sessionId)
7258{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307259 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007260 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
7261 uint8_t channel = 0;
7262 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307263 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007264
7265 channel = csr_get_infra_operation_channel(pMac, sessionId);
7266
7267 sme_release_global_lock(&pMac->sme);
7268 }
7269
7270 return channel;
7271}
7272
7273/* This routine will return poerating channel on which other BSS is operating to be used for concurrency mode. */
7274/* If other BSS is not up or not connected it will return 0 */
7275uint8_t sme_get_concurrent_operation_channel(tHalHandle hHal)
7276{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307277 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007278 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
7279 uint8_t channel = 0;
7280 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307281 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007282
7283 channel = csr_get_concurrent_operation_channel(pMac);
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05307284 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO_HIGH, "%s: "
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007285 " Other Concurrent Channel = %d", __func__, channel);
7286 sme_release_global_lock(&pMac->sme);
7287 }
7288
7289 return channel;
7290}
7291
7292#ifdef FEATURE_WLAN_MCC_TO_SCC_SWITCH
7293uint16_t sme_check_concurrent_channel_overlap(tHalHandle hHal, uint16_t sap_ch,
7294 eCsrPhyMode sapPhyMode,
7295 uint8_t cc_switch_mode)
7296{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307297 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007298 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
7299 uint16_t channel = 0;
7300
7301 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307302 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007303 channel =
7304 csr_check_concurrent_channel_overlap(pMac, sap_ch, sapPhyMode,
7305 cc_switch_mode);
7306 sme_release_global_lock(&pMac->sme);
7307 }
7308
7309 return channel;
7310}
7311#endif
7312
7313#ifdef FEATURE_WLAN_SCAN_PNO
Varun Reddy Yeturub43fda12015-09-10 18:16:21 -07007314/**
7315 * sme_update_roam_pno_channel_prediction_config() - Update PNO config
Krunal Soni1878d3a2016-01-14 13:00:44 -08007316 * @csr_config: config from SME context
Varun Reddy Yeturub43fda12015-09-10 18:16:21 -07007317 * @hal: Global Hal handle
7318 * @copy_from_to: Used to specify the source and destination
7319 *
7320 * Copy the PNO channel prediction configuration parameters from
7321 * SME context to MAC context or vice-versa
7322 *
7323 * Return: None
7324 */
7325void sme_update_roam_pno_channel_prediction_config(
Krunal Soni1878d3a2016-01-14 13:00:44 -08007326 tHalHandle hal, tCsrConfigParam *csr_config,
Varun Reddy Yeturub43fda12015-09-10 18:16:21 -07007327 uint8_t copy_from_to)
7328{
7329 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
7330 if (copy_from_to == SME_CONFIG_TO_ROAM_CONFIG) {
7331 mac_ctx->roam.configParam.pno_channel_prediction =
Krunal Soni1878d3a2016-01-14 13:00:44 -08007332 csr_config->pno_channel_prediction;
Varun Reddy Yeturub43fda12015-09-10 18:16:21 -07007333 mac_ctx->roam.configParam.top_k_num_of_channels =
Krunal Soni1878d3a2016-01-14 13:00:44 -08007334 csr_config->top_k_num_of_channels;
Varun Reddy Yeturub43fda12015-09-10 18:16:21 -07007335 mac_ctx->roam.configParam.stationary_thresh =
Krunal Soni1878d3a2016-01-14 13:00:44 -08007336 csr_config->stationary_thresh;
Varun Reddy Yeturub43fda12015-09-10 18:16:21 -07007337 mac_ctx->roam.configParam.channel_prediction_full_scan =
Krunal Soni1878d3a2016-01-14 13:00:44 -08007338 csr_config->channel_prediction_full_scan;
Gupta, Kapil96c7f2f2016-04-25 19:13:41 +05307339 mac_ctx->roam.configParam.pnoscan_adaptive_dwell_mode =
7340 csr_config->pnoscan_adaptive_dwell_mode;
Varun Reddy Yeturub43fda12015-09-10 18:16:21 -07007341 } else if (copy_from_to == ROAM_CONFIG_TO_SME_CONFIG) {
Krunal Soni1878d3a2016-01-14 13:00:44 -08007342 csr_config->pno_channel_prediction =
Varun Reddy Yeturub43fda12015-09-10 18:16:21 -07007343 mac_ctx->roam.configParam.pno_channel_prediction;
Krunal Soni1878d3a2016-01-14 13:00:44 -08007344 csr_config->top_k_num_of_channels =
Varun Reddy Yeturub43fda12015-09-10 18:16:21 -07007345 mac_ctx->roam.configParam.top_k_num_of_channels;
Krunal Soni1878d3a2016-01-14 13:00:44 -08007346 csr_config->stationary_thresh =
Varun Reddy Yeturub43fda12015-09-10 18:16:21 -07007347 mac_ctx->roam.configParam.stationary_thresh;
Krunal Soni1878d3a2016-01-14 13:00:44 -08007348 csr_config->channel_prediction_full_scan =
Varun Reddy Yeturub43fda12015-09-10 18:16:21 -07007349 mac_ctx->roam.configParam.channel_prediction_full_scan;
Gupta, Kapil96c7f2f2016-04-25 19:13:41 +05307350 csr_config->pnoscan_adaptive_dwell_mode =
7351 mac_ctx->roam.configParam.pnoscan_adaptive_dwell_mode;
Varun Reddy Yeturub43fda12015-09-10 18:16:21 -07007352 }
7353
7354}
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007355/******************************************************************************
7356*
7357* Name: sme_preferred_network_found_ind
7358*
7359* Description:
7360* Invoke Preferred Network Found Indication
7361*
7362* Parameters:
7363* hHal - HAL handle for device
7364* pMsg - found network description
7365*
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307366* Returns: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007367*
7368******************************************************************************/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307369QDF_STATUS sme_preferred_network_found_ind(tHalHandle hHal, void *pMsg)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007370{
7371 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307372 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007373 tSirPrefNetworkFoundInd *pPrefNetworkFoundInd =
7374 (tSirPrefNetworkFoundInd *) pMsg;
7375 uint8_t dumpSsId[SIR_MAC_MAX_SSID_LENGTH + 1];
7376 uint8_t ssIdLength = 0;
7377
7378 if (NULL == pMsg) {
7379 sms_log(pMac, LOGE, "in %s msg ptr is NULL", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307380 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007381 }
7382
7383 if (pMac->pnoOffload) {
7384 /* Call Preferred Network Found Indication callback routine. */
7385 if (pMac->sme.pref_netw_found_cb != NULL) {
7386 pMac->sme.pref_netw_found_cb(pMac->sme.
7387 preferred_network_found_ind_cb_ctx,
7388 pPrefNetworkFoundInd);
7389 }
7390 return status;
7391 }
7392
7393 if (pPrefNetworkFoundInd->ssId.length > 0) {
7394 ssIdLength = CSR_MIN(SIR_MAC_MAX_SSID_LENGTH,
7395 pPrefNetworkFoundInd->ssId.length);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05307396 qdf_mem_copy(dumpSsId, pPrefNetworkFoundInd->ssId.ssId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007397 ssIdLength);
7398 dumpSsId[ssIdLength] = 0;
7399 sms_log(pMac, LOG2, "%s:SSID=%s frame length %d",
7400 __func__, dumpSsId, pPrefNetworkFoundInd->frameLength);
7401
7402 /* Flush scan results, So as to avoid indication/updation of
7403 * stale entries, which may not have aged out during APPS collapse
7404 */
7405 sme_scan_flush_result(hHal);
7406
7407 /* Save the frame to scan result */
7408 if (pPrefNetworkFoundInd->mesgLen >
7409 sizeof(tSirPrefNetworkFoundInd)) {
7410 /* we may have a frame */
7411 status = csr_scan_save_preferred_network_found(pMac,
7412 pPrefNetworkFoundInd);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307413 if (!QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007414 sms_log(pMac, LOGE,
7415 FL(" fail to save preferred network"));
7416 }
7417 } else {
7418 sms_log(pMac, LOGE,
7419 FL(" not enough data length %d needed %zu"),
7420 pPrefNetworkFoundInd->mesgLen,
7421 sizeof(tSirPrefNetworkFoundInd));
7422 }
7423
7424 /* Call Preferred Netowrk Found Indication callback routine. */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307425 if (QDF_IS_STATUS_SUCCESS(status)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007426 && (pMac->sme.pref_netw_found_cb != NULL)) {
7427 pMac->sme.pref_netw_found_cb(pMac->sme.
7428 preferred_network_found_ind_cb_ctx,
7429 pPrefNetworkFoundInd);
7430 }
7431 } else {
7432 sms_log(pMac, LOGE, "%s: callback failed - SSID is NULL",
7433 __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307434 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007435 }
7436
7437 return status;
7438}
7439
7440#endif /* FEATURE_WLAN_SCAN_PNO */
7441
Arun Khandavalli4b55da72016-07-19 19:55:01 +05307442/**
Manikandan Mohandcc21ba2016-03-15 14:31:56 -07007443 * sme_set_tsfcb() - Set callback for TSF capture
Manikandan Mohan976e7562016-03-15 16:33:31 -07007444 * @h_hal: Handler return by mac_open
Manikandan Mohandcc21ba2016-03-15 14:31:56 -07007445 * @cb_fn: Callback function pointer
7446 * @db_ctx: Callback data
7447 *
7448 * Return: QDF_STATUS
7449 */
Manikandan Mohan976e7562016-03-15 16:33:31 -07007450QDF_STATUS sme_set_tsfcb(tHalHandle h_hal,
Manikandan Mohandcc21ba2016-03-15 14:31:56 -07007451 int (*cb_fn)(void *cb_ctx, struct stsf *ptsf), void *cb_ctx)
7452{
Manikandan Mohan976e7562016-03-15 16:33:31 -07007453 tpAniSirGlobal mac = PMAC_STRUCT(h_hal);
Manikandan Mohandcc21ba2016-03-15 14:31:56 -07007454 QDF_STATUS status;
7455
Manikandan Mohan976e7562016-03-15 16:33:31 -07007456 status = sme_acquire_global_lock(&mac->sme);
Manikandan Mohandcc21ba2016-03-15 14:31:56 -07007457 if (QDF_IS_STATUS_SUCCESS(status)) {
Manikandan Mohan976e7562016-03-15 16:33:31 -07007458 mac->sme.get_tsf_cb = cb_fn;
7459 mac->sme.get_tsf_cxt = cb_ctx;
7460 sme_release_global_lock(&mac->sme);
Manikandan Mohandcc21ba2016-03-15 14:31:56 -07007461 }
7462 return status;
7463}
7464
Arun Khandavalli4b55da72016-07-19 19:55:01 +05307465/**
7466 * sme_reset_tsfcb() - Reset callback for TSF capture
7467 * @h_hal: Handler return by mac_open
7468 *
7469 * This function reset the tsf capture callback to SME
7470 *
7471 * Return: QDF_STATUS
7472 */
7473QDF_STATUS sme_reset_tsfcb(tHalHandle h_hal)
7474{
7475 tpAniSirGlobal mac;
7476 QDF_STATUS status;
7477
7478 if (!h_hal) {
7479 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
7480 FL("h_hal is not valid"));
7481 return QDF_STATUS_E_INVAL;
7482 }
7483 mac = PMAC_STRUCT(h_hal);
7484
7485 status = sme_acquire_global_lock(&mac->sme);
7486 if (QDF_IS_STATUS_SUCCESS(status)) {
7487 mac->sme.get_tsf_cb = NULL;
7488 mac->sme.get_tsf_cxt = NULL;
7489 sme_release_global_lock(&mac->sme);
7490 }
7491 return status;
7492}
7493
Manikandan Mohan976e7562016-03-15 16:33:31 -07007494#ifdef WLAN_FEATURE_TSF
7495/*
7496 * sme_set_tsf_gpio() - set gpio pin that be toggled when capture tef
7497 * @h_hal: Handler return by mac_open
7498 * @pinvalue: gpio pin id
7499 *
7500 * Return: QDF_STATUS
7501 */
7502QDF_STATUS sme_set_tsf_gpio(tHalHandle h_hal, uint32_t pinvalue)
7503{
7504 QDF_STATUS status;
7505 cds_msg_t tsf_msg = {0};
7506 tpAniSirGlobal mac = PMAC_STRUCT(h_hal);
7507
7508 status = sme_acquire_global_lock(&mac->sme);
7509 if (QDF_IS_STATUS_SUCCESS(status)) {
7510 tsf_msg.type = WMA_TSF_GPIO_PIN;
7511 tsf_msg.reserved = 0;
7512 tsf_msg.bodyval = pinvalue;
7513
7514 status = cds_mq_post_message(CDS_MQ_ID_WMA, &tsf_msg);
7515 if (!QDF_IS_STATUS_SUCCESS(status)) {
7516 sms_log(mac, LOGE, "Unable to post WMA_TSF_GPIO_PIN");
7517 status = QDF_STATUS_E_FAILURE;
7518 }
7519 sme_release_global_lock(&mac->sme);
7520 }
7521 return status;
7522}
7523#endif
7524
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307525QDF_STATUS sme_get_cfg_valid_channels(tHalHandle hHal, uint8_t *aValidChannels,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007526 uint32_t *len)
7527{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307528 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007529 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
7530
7531 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307532 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007533 status = csr_get_cfg_valid_channels(pMac, aValidChannels, len);
7534 sme_release_global_lock(&pMac->sme);
7535 }
7536
7537 return status;
7538}
7539
7540/* ---------------------------------------------------------------------------
7541
7542 \fn sme_handle_change_country_code
7543
7544 \brief Change Country code, Reg Domain and channel list
7545
7546 \details Country Code Priority
7547 If Supplicant country code is priority than 11d is disabled.
7548 If 11D is enabled, we update the country code after every scan.
7549 Hence when Supplicant country code is priority, we don't need 11D info.
7550 Country code from Supplicant is set as current courtry code.
7551 User can send reset command XX (instead of country code) to reset the
7552 country code to default values.
7553 If 11D is priority,
7554 Than Supplicant country code code is set to default code. But 11D code is set as current country code
7555
7556 \param pMac - The handle returned by mac_open.
7557 \param pMsgBuf - MSG Buffer
7558
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307559 \return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007560
7561 -------------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307562QDF_STATUS sme_handle_change_country_code(tpAniSirGlobal pMac, void *pMsgBuf)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007563{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307564 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007565 tAniChangeCountryCodeReq *pMsg;
7566 v_REGDOMAIN_t domainIdIoctl;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307567 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Amar Singhala297bfa2015-10-15 15:07:29 -07007568 static uint8_t default_country[CDS_COUNTRY_CODE_LEN + 1];
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007569 pMsg = (tAniChangeCountryCodeReq *) pMsgBuf;
7570
7571 /*
7572 * if the reset Supplicant country code command is triggered,
7573 * enable 11D, reset the country code and return
7574 */
Kiran Kumar Lokereea85ee02016-08-26 18:09:20 -07007575 if (false ==
Anurag Chouhan600c3a02016-03-01 10:33:54 +05307576 qdf_mem_cmp(pMsg->countryCode, SME_INVALID_COUNTRY_CODE, 2)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007577 pMac->roam.configParam.Is11dSupportEnabled =
7578 pMac->roam.configParam.Is11dSupportEnabledOriginal;
7579
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307580 qdf_status = cds_read_default_country(default_country);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007581
7582 /* read the country code and use it */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307583 if (QDF_IS_STATUS_SUCCESS(qdf_status)) {
Anurag Chouhan600c3a02016-03-01 10:33:54 +05307584 qdf_mem_copy(pMsg->countryCode,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007585 default_country,
7586 WNI_CFG_COUNTRY_CODE_LEN);
7587 } else {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307588 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007589 return status;
7590 }
7591 /*
7592 * Update the 11d country to default country so that when
7593 * callback is received for this default country, driver will
7594 * not disable the 11d taking it as valid country by user.
7595 */
7596 sms_log(pMac, LOG1,
7597 FL("Set default country code (%c%c) as invalid country received"),
7598 pMsg->countryCode[0], pMsg->countryCode[1]);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05307599 qdf_mem_copy(pMac->scan.countryCode11d,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007600 pMsg->countryCode,
7601 WNI_CFG_COUNTRY_CODE_LEN);
7602 } else {
7603 /* if Supplicant country code has priority, disable 11d */
7604 if (pMac->roam.configParam.fSupplicantCountryCodeHasPriority &&
7605 pMsg->countryFromUserSpace) {
7606 pMac->roam.configParam.Is11dSupportEnabled = false;
7607 }
7608 }
7609
7610 if (pMac->roam.configParam.Is11dSupportEnabled)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307611 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007612
7613 /* Set Current Country code and Current Regulatory domain */
7614 status = csr_set_country_code(pMac, pMsg->countryCode);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307615 if (QDF_STATUS_SUCCESS != status) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007616 /* Supplicant country code failed. So give 11D priority */
7617 pMac->roam.configParam.Is11dSupportEnabled =
7618 pMac->roam.configParam.Is11dSupportEnabledOriginal;
7619 sms_log(pMac, LOGE, "Set Country Code Fail %d", status);
7620 return status;
7621 }
7622
7623 /* overwrite the defualt country code */
Anurag Chouhan600c3a02016-03-01 10:33:54 +05307624 qdf_mem_copy(pMac->scan.countryCodeDefault,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007625 pMac->scan.countryCodeCurrent, WNI_CFG_COUNTRY_CODE_LEN);
7626
7627 /* Get Domain ID from country code */
7628 status = csr_get_regulatory_domain_for_country(pMac,
7629 pMac->scan.countryCodeCurrent,
7630 (v_REGDOMAIN_t *) &
Amar Singhala297bfa2015-10-15 15:07:29 -07007631 domainIdIoctl,
7632 SOURCE_QUERY);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307633 if (status != QDF_STATUS_SUCCESS) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007634 sms_log(pMac, LOGE, FL(" fail to get regId %d"), domainIdIoctl);
7635 return status;
7636 } else if (REGDOMAIN_WORLD == domainIdIoctl) {
7637 /* Supplicant country code is invalid, so we are on world mode now. So
7638 give 11D chance to update */
7639 pMac->roam.configParam.Is11dSupportEnabled =
7640 pMac->roam.configParam.Is11dSupportEnabledOriginal;
7641 sms_log(pMac, LOG1, FL("Country Code unrecognized by driver"));
7642 }
7643
7644 status = wma_set_reg_domain(pMac, domainIdIoctl);
7645
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307646 if (status != QDF_STATUS_SUCCESS) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007647 sms_log(pMac, LOGE, FL(" fail to set regId %d"), domainIdIoctl);
7648 return status;
7649 } else {
7650 /* if 11d has priority, clear currentCountryBssid & countryCode11d to get */
7651 /* set again if we find AP with 11d info during scan */
7652 if (!pMac->roam.configParam.fSupplicantCountryCodeHasPriority) {
7653 sms_log(pMac, LOGW,
7654 FL
7655 ("Clearing currentCountryBssid, countryCode11d"));
Anurag Chouhan600c3a02016-03-01 10:33:54 +05307656 qdf_mem_zero(&pMac->scan.currentCountryBssid,
Anurag Chouhan6d760662016-02-20 16:05:43 +05307657 sizeof(struct qdf_mac_addr));
Anurag Chouhan600c3a02016-03-01 10:33:54 +05307658 qdf_mem_zero(pMac->scan.countryCode11d,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007659 sizeof(pMac->scan.countryCode11d));
7660 }
7661 }
7662
7663 if (pMsg->changeCCCallback) {
7664 ((tSmeChangeCountryCallback) (pMsg->changeCCCallback))((void *)
7665 pMsg->
7666 pDevContext);
7667 }
7668
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307669 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007670}
7671
7672/**
Amar Singhal7f1f3ec2015-10-13 17:14:08 -07007673 * sme_handle_generic_change_country_code() - handles country ch req
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007674 * @mac_ctx: mac global context
7675 * @msg: request msg packet
7676 *
7677 * If Supplicant country code is priority than 11d is disabled.
7678 * If 11D is enabled, we update the country code after every scan.
7679 * Hence when Supplicant country code is priority, we don't need 11D info.
7680 * Country code from Supplicant is set as current country code.
7681 *
7682 * Return: status of operation
7683 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307684QDF_STATUS
Amar Singhal7f1f3ec2015-10-13 17:14:08 -07007685sme_handle_generic_change_country_code(tpAniSirGlobal mac_ctx,
7686 void *pMsgBuf)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007687{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307688 QDF_STATUS status = QDF_STATUS_SUCCESS;
Amar Singhal7f1f3ec2015-10-13 17:14:08 -07007689 v_REGDOMAIN_t reg_domain_id = 0;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007690 bool is_11d_country = false;
7691 bool supplicant_priority =
7692 mac_ctx->roam.configParam.fSupplicantCountryCodeHasPriority;
Amar Singhal7f1f3ec2015-10-13 17:14:08 -07007693 tAniGenericChangeCountryCodeReq *msg = pMsgBuf;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007694
7695 sms_log(mac_ctx, LOG1, FL(" called"));
Amar Singhal7f1f3ec2015-10-13 17:14:08 -07007696
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007697 if (memcmp(msg->countryCode, mac_ctx->scan.countryCode11d,
7698 CDS_COUNTRY_CODE_LEN) == 0) {
7699 is_11d_country = true;
7700 }
7701 /* Set the country code given by userspace when 11dOriginal is false
7702 * when 11doriginal is True,is_11d_country =0 and
7703 * fSupplicantCountryCodeHasPriority = 0, then revert the country code,
7704 * and return failure
7705 */
7706 if (mac_ctx->roam.configParam.Is11dSupportEnabledOriginal == true
7707 && !is_11d_country && !supplicant_priority) {
7708 sms_log(mac_ctx, LOGW,
7709 FL("Incorrect country req, nullify this"));
7710
7711 /* we have got a request for a country that should not have been
7712 * added since the STA is associated; nullify this request. If
7713 * both countryCode11d[0] and countryCode11d[1] are zero, revert
7714 * it to World domain to avoid from causing cfg80211 call trace.
7715 */
7716 if ((mac_ctx->scan.countryCode11d[0] == 0)
7717 && (mac_ctx->scan.countryCode11d[1] == 0))
7718 status = csr_get_regulatory_domain_for_country(mac_ctx,
7719 "00", (v_REGDOMAIN_t *) &reg_domain_id,
Amar Singhala297bfa2015-10-15 15:07:29 -07007720 SOURCE_11D);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007721 else
7722 status = csr_get_regulatory_domain_for_country(mac_ctx,
7723 mac_ctx->scan.countryCode11d,
7724 (v_REGDOMAIN_t *) &reg_domain_id,
Amar Singhala297bfa2015-10-15 15:07:29 -07007725 SOURCE_11D);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007726
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307727 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007728 }
Amar Singhal7f1f3ec2015-10-13 17:14:08 -07007729
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007730 /* if Supplicant country code has priority, disable 11d */
7731 if (!is_11d_country && supplicant_priority)
7732 mac_ctx->roam.configParam.Is11dSupportEnabled = false;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05307733 qdf_mem_copy(mac_ctx->scan.countryCodeCurrent, msg->countryCode,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007734 WNI_CFG_COUNTRY_CODE_LEN);
7735 status = wma_set_reg_domain(mac_ctx, reg_domain_id);
7736 if (false == is_11d_country) {
7737 /* overwrite the defualt country code */
Anurag Chouhan600c3a02016-03-01 10:33:54 +05307738 qdf_mem_copy(mac_ctx->scan.countryCodeDefault,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007739 mac_ctx->scan.countryCodeCurrent,
7740 WNI_CFG_COUNTRY_CODE_LEN);
7741 /* set to default domain ID */
7742 mac_ctx->scan.domainIdDefault = mac_ctx->scan.domainIdCurrent;
7743 }
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307744 if (status != QDF_STATUS_SUCCESS) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007745 sms_log(mac_ctx, LOGE, FL("fail to set regId %d"),
7746 reg_domain_id);
7747 return status;
7748 } else {
7749 /* if 11d has priority, clear currentCountryBssid &
7750 * countryCode11d to get set again if we find AP with 11d info
7751 * during scan
7752 */
7753 if (!supplicant_priority && (false == is_11d_country)) {
7754 sms_log(mac_ctx, LOGW,
7755 FL("Clearing currentCountryBssid, countryCode11d"));
Anurag Chouhan600c3a02016-03-01 10:33:54 +05307756 qdf_mem_zero(&mac_ctx->scan.currentCountryBssid,
Anurag Chouhan6d760662016-02-20 16:05:43 +05307757 sizeof(struct qdf_mac_addr));
Anurag Chouhan600c3a02016-03-01 10:33:54 +05307758 qdf_mem_zero(mac_ctx->scan.countryCode11d,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007759 sizeof(mac_ctx->scan.countryCode11d));
7760 }
7761 }
7762 /* get the channels based on new cc */
7763 status = csr_get_channel_and_power_list(mac_ctx);
7764
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307765 if (status != QDF_STATUS_SUCCESS) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007766 sms_log(mac_ctx, LOGE, FL("fail to get Channels"));
7767 return status;
7768 }
7769 /* reset info based on new cc, and we are done */
7770 csr_apply_channel_power_info_wrapper(mac_ctx);
7771
7772 /* Country code Changed, Purge Only scan result
7773 * which does not have channel number belong to 11d
7774 * channel list
7775 */
7776 csr_scan_filter_results(mac_ctx);
7777 /* Do active scans after the country is set by User hints or
7778 * Country IE
7779 */
7780 mac_ctx->scan.curScanType = eSIR_ACTIVE_SCAN;
7781 sme_disconnect_connected_sessions(mac_ctx);
7782 sms_log(mac_ctx, LOG1, FL(" returned"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307783 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007784}
7785
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007786static bool
7787sme_search_in_base_ch_lst(tpAniSirGlobal mac_ctx, uint8_t curr_ch)
7788{
7789 uint8_t i;
7790 tCsrChannel *ch_lst_info;
7791 ch_lst_info = &mac_ctx->scan.base_channels;
7792 for (i = 0; i < ch_lst_info->numChannels; i++) {
7793 if (ch_lst_info->channelList[i] == curr_ch)
7794 return true;
7795 }
7796
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007797 return false;
7798}
7799/**
7800 * sme_disconnect_connected_sessions() - Disconnect STA and P2P client session
7801 * if channel is not supported
7802 * @mac_ctx: mac global context
7803 *
7804 * If new country code does not support the channel on which STA/P2P client
7805 * is connetced, it sends the disconnect to the AP/P2P GO
7806 *
7807 * Return: void
7808 */
7809void sme_disconnect_connected_sessions(tpAniSirGlobal mac_ctx)
7810{
7811 uint8_t session_id, found = false;
7812 uint8_t curr_ch;
7813
7814 for (session_id = 0; session_id < CSR_ROAM_SESSION_MAX; session_id++) {
7815 if (!csr_is_session_client_and_connected(mac_ctx, session_id))
7816 continue;
7817 found = false;
7818 /* Session is connected.Check the channel */
7819 curr_ch = csr_get_infra_operation_channel(mac_ctx,
7820 session_id);
7821 sms_log(mac_ctx, LOGW,
7822 FL("Current Operating channel : %d, session :%d"),
7823 curr_ch, session_id);
7824 found = sme_search_in_base_ch_lst(mac_ctx, curr_ch);
7825 if (!found) {
7826 sms_log(mac_ctx, LOGW, FL("Disconnect Session :%d"),
7827 session_id);
7828 csr_roam_disconnect(mac_ctx, session_id,
7829 eCSR_DISCONNECT_REASON_UNSPECIFIED);
7830 }
7831 }
7832}
7833
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007834#ifdef WLAN_FEATURE_PACKET_FILTERING
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307835QDF_STATUS sme_8023_multicast_list(tHalHandle hHal, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007836 tpSirRcvFltMcAddrList pMulticastAddrs)
7837{
7838 tpSirRcvFltMcAddrList request_buf;
7839 cds_msg_t msg;
7840 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
7841 tCsrRoamSession *pSession = NULL;
7842
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05307843 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO, "%s: "
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007844 "ulMulticastAddrCnt=%d, multicastAddr[0]=%p", __func__,
7845 pMulticastAddrs->ulMulticastAddrCnt,
Srinivas Girigowda98530492015-11-20 17:39:24 -08007846 pMulticastAddrs->multicastAddr[0].bytes);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007847
Ravi Joshi4f447cb2016-07-19 13:42:01 -07007848 /* Find the connected Infra / P2P_client connected session */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007849 if (CSR_IS_SESSION_VALID(pMac, sessionId) &&
Ravi Joshi4f447cb2016-07-19 13:42:01 -07007850 (csr_is_conn_state_infra(pMac, sessionId) ||
7851 csr_is_ndi_started(pMac, sessionId))) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007852 pSession = CSR_GET_SESSION(pMac, sessionId);
7853 }
7854
7855 if (pSession == NULL) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05307856 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_WARN,
Srinivas Girigowdaf2599dd2015-11-16 18:20:46 -08007857 "%s: Unable to find the session Id: %d", __func__,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007858 sessionId);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307859 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007860 }
7861
Anurag Chouhan600c3a02016-03-01 10:33:54 +05307862 request_buf = qdf_mem_malloc(sizeof(tSirRcvFltMcAddrList));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007863 if (NULL == request_buf) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05307864 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007865 "%s: Not able to "
7866 "allocate memory for 8023 Multicast List request",
7867 __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307868 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007869 }
7870
Ravi Joshi4f447cb2016-07-19 13:42:01 -07007871 if (!csr_is_conn_state_connected_infra(pMac, sessionId) &&
7872 !csr_is_ndi_started(pMac, sessionId)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05307873 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Ravi Joshi4f447cb2016-07-19 13:42:01 -07007874 "%s: Request ignored, session %d is not connected or started",
7875 __func__, sessionId);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05307876 qdf_mem_free(request_buf);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307877 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007878 }
7879
Anurag Chouhan600c3a02016-03-01 10:33:54 +05307880 qdf_mem_copy(request_buf, pMulticastAddrs,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007881 sizeof(tSirRcvFltMcAddrList));
7882
Anurag Chouhanc5548422016-02-24 18:33:27 +05307883 qdf_copy_macaddr(&request_buf->self_macaddr, &pSession->selfMacAddr);
7884 qdf_copy_macaddr(&request_buf->bssid,
Srinivas Girigowda98530492015-11-20 17:39:24 -08007885 &pSession->connectedProfile.bssid);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007886
7887 msg.type = WMA_8023_MULTICAST_LIST_REQ;
7888 msg.reserved = 0;
7889 msg.bodyptr = request_buf;
Sreelakshmi Konamki6a065362016-05-31 16:05:01 +05307890 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
7891 sessionId, msg.type));
Anurag Chouhan6d760662016-02-20 16:05:43 +05307892 if (QDF_STATUS_SUCCESS != cds_mq_post_message(QDF_MODULE_ID_WMA, &msg)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05307893 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007894 "%s: Not able to "
7895 "post WMA_8023_MULTICAST_LIST message to WMA",
7896 __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05307897 qdf_mem_free(request_buf);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307898 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007899 }
7900
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307901 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007902}
7903
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307904QDF_STATUS sme_receive_filter_set_filter(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007905 tpSirRcvPktFilterCfgType pRcvPktFilterCfg,
7906 uint8_t sessionId)
7907{
7908 tpSirRcvPktFilterCfgType request_buf;
7909 int32_t allocSize;
7910 cds_msg_t msg;
7911 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
7912 tCsrRoamSession *pSession = CSR_GET_SESSION(pMac, sessionId);
7913 uint8_t idx = 0;
7914
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05307915 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO, "%s: filterType=%d, "
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007916 "filterId = %d", __func__,
7917 pRcvPktFilterCfg->filterType, pRcvPktFilterCfg->filterId);
7918
7919 allocSize = sizeof(tSirRcvPktFilterCfgType);
7920
Anurag Chouhan600c3a02016-03-01 10:33:54 +05307921 request_buf = qdf_mem_malloc(allocSize);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007922
7923 if (NULL == request_buf) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05307924 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007925 "%s: Not able to "
7926 "allocate memory for Receive Filter Set Filter request",
7927 __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307928 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007929 }
7930
7931 if (NULL == pSession) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05307932 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007933 "%s: Session Not found ", __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05307934 qdf_mem_free(request_buf);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307935 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007936 }
7937
Anurag Chouhanc5548422016-02-24 18:33:27 +05307938 qdf_copy_macaddr(&pRcvPktFilterCfg->self_macaddr,
Srinivas Girigowda98530492015-11-20 17:39:24 -08007939 &pSession->selfMacAddr);
Anurag Chouhanc5548422016-02-24 18:33:27 +05307940 qdf_copy_macaddr(&pRcvPktFilterCfg->bssid,
Srinivas Girigowda98530492015-11-20 17:39:24 -08007941 &pSession->connectedProfile.bssid);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05307942 qdf_mem_copy(request_buf, pRcvPktFilterCfg, allocSize);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007943
7944 msg.type = WMA_RECEIVE_FILTER_SET_FILTER_REQ;
7945 msg.reserved = 0;
7946 msg.bodyptr = request_buf;
Sreelakshmi Konamki6a065362016-05-31 16:05:01 +05307947 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
7948 sessionId, msg.type));
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05307949 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO, "Pkt Flt Req : "
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007950 "FT %d FID %d ",
7951 request_buf->filterType, request_buf->filterId);
7952
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05307953 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO, "Pkt Flt Req : "
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007954 "params %d CT %d",
7955 request_buf->numFieldParams, request_buf->coalesceTime);
7956
7957 for (idx = 0; idx < request_buf->numFieldParams; idx++) {
7958
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05307959 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007960 "Proto %d Comp Flag %d ",
7961 request_buf->paramsData[idx].protocolLayer,
7962 request_buf->paramsData[idx].cmpFlag);
7963
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05307964 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007965 "Data Offset %d Data Len %d",
7966 request_buf->paramsData[idx].dataOffset,
7967 request_buf->paramsData[idx].dataLength);
7968
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05307969 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007970 "CData: %d:%d:%d:%d:%d:%d",
7971 request_buf->paramsData[idx].compareData[0],
7972 request_buf->paramsData[idx].compareData[1],
7973 request_buf->paramsData[idx].compareData[2],
7974 request_buf->paramsData[idx].compareData[3],
7975 request_buf->paramsData[idx].compareData[4],
7976 request_buf->paramsData[idx].compareData[5]);
7977
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05307978 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007979 "MData: %d:%d:%d:%d:%d:%d",
7980 request_buf->paramsData[idx].dataMask[0],
7981 request_buf->paramsData[idx].dataMask[1],
7982 request_buf->paramsData[idx].dataMask[2],
7983 request_buf->paramsData[idx].dataMask[3],
7984 request_buf->paramsData[idx].dataMask[4],
7985 request_buf->paramsData[idx].dataMask[5]);
7986
7987 }
7988
Anurag Chouhan6d760662016-02-20 16:05:43 +05307989 if (QDF_STATUS_SUCCESS != cds_mq_post_message(QDF_MODULE_ID_WMA, &msg)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05307990 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007991 "%s: Not able to post "
7992 "WMA_RECEIVE_FILTER_SET_FILTER message to WMA",
7993 __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05307994 qdf_mem_free(request_buf);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307995 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007996 }
7997
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307998 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007999}
8000
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308001QDF_STATUS sme_receive_filter_clear_filter(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008002 tpSirRcvFltPktClearParam
8003 pRcvFltPktClearParam, uint8_t sessionId)
8004{
8005 tpSirRcvFltPktClearParam request_buf;
8006 cds_msg_t msg;
8007 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
8008 tCsrRoamSession *pSession = CSR_GET_SESSION(pMac, sessionId);
8009
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308010 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO, "%s: filterId = %d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008011 __func__, pRcvFltPktClearParam->filterId);
8012
Srinivas Girigowda98530492015-11-20 17:39:24 -08008013 if (NULL == pSession) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308014 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Srinivas Girigowda98530492015-11-20 17:39:24 -08008015 "%s: Session Not found", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308016 return QDF_STATUS_E_FAILURE;
Srinivas Girigowda98530492015-11-20 17:39:24 -08008017 }
8018
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308019 request_buf = qdf_mem_malloc(sizeof(tSirRcvFltPktClearParam));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008020 if (NULL == request_buf) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308021 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008022 "%s: Not able to allocate memory for Receive Filter "
8023 "Clear Filter request", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308024 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008025 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008026
Anurag Chouhanc5548422016-02-24 18:33:27 +05308027 qdf_copy_macaddr(&pRcvFltPktClearParam->self_macaddr,
Srinivas Girigowda98530492015-11-20 17:39:24 -08008028 &pSession->selfMacAddr);
Anurag Chouhanc5548422016-02-24 18:33:27 +05308029 qdf_copy_macaddr(&pRcvFltPktClearParam->bssid,
Srinivas Girigowda98530492015-11-20 17:39:24 -08008030 &pSession->connectedProfile.bssid);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008031
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308032 qdf_mem_copy(request_buf, pRcvFltPktClearParam,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008033 sizeof(tSirRcvFltPktClearParam));
8034
8035 msg.type = WMA_RECEIVE_FILTER_CLEAR_FILTER_REQ;
8036 msg.reserved = 0;
8037 msg.bodyptr = request_buf;
Sreelakshmi Konamki6a065362016-05-31 16:05:01 +05308038 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
8039 sessionId, msg.type));
Anurag Chouhan6d760662016-02-20 16:05:43 +05308040 if (QDF_STATUS_SUCCESS != cds_mq_post_message(QDF_MODULE_ID_WMA, &msg)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308041 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008042 "%s: Not able to post "
8043 "WMA_RECEIVE_FILTER_CLEAR_FILTER message to WMA",
8044 __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308045 qdf_mem_free(request_buf);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308046 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008047 }
8048
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308049 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008050}
8051#endif /* WLAN_FEATURE_PACKET_FILTERING */
8052
8053/* ---------------------------------------------------------------------------
8054
8055 \fn sme_is_channel_valid
8056
8057 \brief To check if the channel is valid for currently established domain
8058 This is a synchronous API.
8059
8060 \param hHal - The handle returned by mac_open.
8061 \param channel - channel to verify
8062
8063 \return true/false, true if channel is valid
8064
8065 -------------------------------------------------------------------------------*/
8066bool sme_is_channel_valid(tHalHandle hHal, uint8_t channel)
8067{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308068 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008069 bool valid = false;
8070 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
8071
8072 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308073 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008074
8075 valid = csr_roam_is_channel_valid(pMac, channel);
8076
8077 sme_release_global_lock(&pMac->sme);
8078 }
8079
8080 return valid;
8081}
8082
8083/* ---------------------------------------------------------------------------
8084 \fn sme_set_freq_band
8085 \brief Used to set frequency band.
8086 \param hHal
8087 \param sessionId - Session Identifier
8088 \eBand band value to be configured
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308089 \- return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008090 -------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308091QDF_STATUS sme_set_freq_band(tHalHandle hHal, uint8_t sessionId, eCsrBand eBand)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008092{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308093 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008094 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
8095
8096 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308097 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008098 status = csr_set_band(hHal, sessionId, eBand);
8099 sme_release_global_lock(&pMac->sme);
8100 }
8101 return status;
8102}
8103
8104/* ---------------------------------------------------------------------------
8105 \fn sme_get_freq_band
8106 \brief Used to get the current band settings.
8107 \param hHal
8108 \pBand pointer to hold band value
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308109 \- return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008110 -------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308111QDF_STATUS sme_get_freq_band(tHalHandle hHal, eCsrBand *pBand)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008112{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308113 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008114 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
8115
8116 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308117 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008118 *pBand = csr_get_current_band(hHal);
8119 sme_release_global_lock(&pMac->sme);
8120 }
8121 return status;
8122}
8123
8124/* ---------------------------------------------------------------------------
8125 \fn sme_set_max_tx_power_per_band
8126
8127 \brief Set the Maximum Transmit Power specific to band dynamically.
8128 Note: this setting will not persist over reboots.
8129
8130 \param band
8131 \param power to set in dB
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308132 \- return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008133
8134 ----------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308135QDF_STATUS sme_set_max_tx_power_per_band(eCsrBand band, int8_t dB)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008136{
8137 cds_msg_t msg;
8138 tpMaxTxPowerPerBandParams pMaxTxPowerPerBandParams = NULL;
8139
8140 pMaxTxPowerPerBandParams =
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308141 qdf_mem_malloc(sizeof(tMaxTxPowerPerBandParams));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008142 if (NULL == pMaxTxPowerPerBandParams) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308143 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008144 "%s:Not able to allocate memory for pMaxTxPowerPerBandParams",
8145 __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308146 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008147 }
8148
8149 pMaxTxPowerPerBandParams->power = dB;
8150 pMaxTxPowerPerBandParams->bandInfo = band;
8151
8152 msg.type = WMA_SET_MAX_TX_POWER_PER_BAND_REQ;
8153 msg.reserved = 0;
8154 msg.bodyptr = pMaxTxPowerPerBandParams;
Sreelakshmi Konamki6a065362016-05-31 16:05:01 +05308155 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
8156 NO_SESSION, msg.type));
Anurag Chouhan6d760662016-02-20 16:05:43 +05308157 if (QDF_STATUS_SUCCESS != cds_mq_post_message(QDF_MODULE_ID_WMA, &msg)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308158 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008159 "%s:Not able to post WMA_SET_MAX_TX_POWER_PER_BAND_REQ",
8160 __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308161 qdf_mem_free(pMaxTxPowerPerBandParams);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308162 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008163 }
8164
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308165 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008166}
8167
8168/* ---------------------------------------------------------------------------
8169
8170 \fn sme_set_max_tx_power
8171
8172 \brief Set the Maximum Transmit Power dynamically. Note: this setting will
8173 not persist over reboots.
8174
8175 \param hHal
8176 \param pBssid BSSID to set the power cap for
8177 \param pBssid pSelfMacAddress self MAC Address
8178 \param pBssid power to set in dB
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308179 \- return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008180
8181 -------------------------------------------------------------------------------*/
Anurag Chouhan6d760662016-02-20 16:05:43 +05308182QDF_STATUS sme_set_max_tx_power(tHalHandle hHal, struct qdf_mac_addr pBssid,
8183 struct qdf_mac_addr pSelfMacAddress, int8_t dB)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008184{
8185 cds_msg_t msg;
8186 tpMaxTxPowerParams pMaxTxParams = NULL;
8187
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308188 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008189 TRACE_CODE_SME_RX_HDD_SET_MAXTXPOW, NO_SESSION, 0));
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308190 pMaxTxParams = qdf_mem_malloc(sizeof(tMaxTxPowerParams));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008191 if (NULL == pMaxTxParams) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308192 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008193 "%s: Not able to allocate memory for pMaxTxParams",
8194 __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308195 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008196 }
8197
Anurag Chouhanc5548422016-02-24 18:33:27 +05308198 qdf_copy_macaddr(&pMaxTxParams->bssId, &pBssid);
8199 qdf_copy_macaddr(&pMaxTxParams->selfStaMacAddr, &pSelfMacAddress);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008200 pMaxTxParams->power = dB;
8201
8202 msg.type = WMA_SET_MAX_TX_POWER_REQ;
8203 msg.reserved = 0;
8204 msg.bodyptr = pMaxTxParams;
8205
Anurag Chouhan6d760662016-02-20 16:05:43 +05308206 if (QDF_STATUS_SUCCESS != cds_mq_post_message(QDF_MODULE_ID_WMA, &msg)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308207 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008208 "%s: Not able to post WMA_SET_MAX_TX_POWER_REQ message to WMA",
8209 __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308210 qdf_mem_free(pMaxTxParams);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308211 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008212 }
8213
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308214 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008215}
8216
8217/* ---------------------------------------------------------------------------
8218
8219 \fn sme_set_custom_mac_addr
8220
8221 \brief Set the customer Mac Address.
8222
8223 \param customMacAddr customer MAC Address
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_custom_mac_addr(tSirMacAddr customMacAddr)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008228{
8229 cds_msg_t msg;
8230 tSirMacAddr *pBaseMacAddr;
8231
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308232 pBaseMacAddr = qdf_mem_malloc(sizeof(tSirMacAddr));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008233 if (NULL == pBaseMacAddr) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308234 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008235 FL("Not able to allocate memory for pBaseMacAddr"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308236 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008237 }
8238
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308239 qdf_mem_copy(*pBaseMacAddr, customMacAddr, sizeof(tSirMacAddr));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008240
8241 msg.type = SIR_HAL_SET_BASE_MACADDR_IND;
8242 msg.reserved = 0;
8243 msg.bodyptr = pBaseMacAddr;
8244
Anurag Chouhan6d760662016-02-20 16:05:43 +05308245 if (QDF_STATUS_SUCCESS != cds_mq_post_message(QDF_MODULE_ID_WMA, &msg)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308246 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008247 FL
8248 ("Not able to post SIR_HAL_SET_BASE_MACADDR_IND message to WMA"));
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308249 qdf_mem_free(pBaseMacAddr);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308250 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008251 }
8252
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308253 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008254}
8255
8256/* ----------------------------------------------------------------------------
8257 \fn sme_set_tx_power
8258 \brief Set Transmit Power dynamically.
8259 \param hHal
8260 \param sessionId Target Session ID
8261 \pBSSId BSSID
8262 \dev_mode dev_mode such as station, P2PGO, SAP
8263 \param dBm power to set
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308264 \- return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008265 ---------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308266QDF_STATUS sme_set_tx_power(tHalHandle hHal, uint8_t sessionId,
Anurag Chouhan6d760662016-02-20 16:05:43 +05308267 struct qdf_mac_addr pBSSId,
8268 enum tQDF_ADAPTER_MODE dev_mode, int dBm)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008269{
8270 cds_msg_t msg;
8271 tpMaxTxPowerParams pTxParams = NULL;
8272 int8_t power = (int8_t) dBm;
8273
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308274 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008275 TRACE_CODE_SME_RX_HDD_SET_TXPOW, sessionId, 0));
8276
8277 /* make sure there is no overflow */
8278 if ((int)power != dBm) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308279 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008280 "%s: error, invalid power = %d", __func__, dBm);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308281 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008282 }
8283
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308284 pTxParams = qdf_mem_malloc(sizeof(tMaxTxPowerParams));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008285 if (NULL == pTxParams) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308286 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008287 "%s: Not able to allocate memory for pTxParams",
8288 __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308289 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008290 }
8291
Anurag Chouhanc5548422016-02-24 18:33:27 +05308292 qdf_copy_macaddr(&pTxParams->bssId, &pBSSId);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008293 pTxParams->power = power; /* unit is dBm */
8294 pTxParams->dev_mode = dev_mode;
8295 msg.type = WMA_SET_TX_POWER_REQ;
8296 msg.reserved = 0;
8297 msg.bodyptr = pTxParams;
8298
Anurag Chouhan6d760662016-02-20 16:05:43 +05308299 if (QDF_STATUS_SUCCESS != cds_mq_post_message(QDF_MODULE_ID_WMA, &msg)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308300 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008301 "%s: failed to post WMA_SET_TX_POWER_REQ to WMA",
8302 __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308303 qdf_mem_free(pTxParams);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308304 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008305 }
8306
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308307 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008308}
8309
8310/* ---------------------------------------------------------------------------
8311
8312 \fn sme_hide_ssid
8313
8314 \brief hide/show SSID dynamically. Note: this setting will
8315 not persist over reboots.
8316
8317 \param hHal
8318 \param sessionId
8319 \param ssidHidden 0 - Broadcast SSID, 1 - Disable broadcast SSID
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308320 \- return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008321
8322 -------------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308323QDF_STATUS sme_hide_ssid(tHalHandle hHal, uint8_t sessionId, uint8_t ssidHidden)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008324{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308325 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008326 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
8327 uint16_t len;
8328
8329 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308330 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008331 tpSirUpdateParams pMsg;
8332 tCsrRoamSession *pSession = CSR_GET_SESSION(pMac, sessionId);
8333
8334 if (!pSession) {
8335 sms_log(pMac, LOGE, FL(" session %d not found "),
8336 sessionId);
8337 sme_release_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308338 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008339 }
8340
8341 if (!pSession->sessionActive)
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308342 QDF_ASSERT(0);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008343
8344 /* Create the message and send to lim */
8345 len = sizeof(tSirUpdateParams);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308346 pMsg = qdf_mem_malloc(len);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008347 if (NULL == pMsg)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308348 status = QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008349 else {
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308350 qdf_mem_set(pMsg, sizeof(tSirUpdateParams), 0);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008351 pMsg->messageType = eWNI_SME_HIDE_SSID_REQ;
8352 pMsg->length = len;
8353 /* Data starts from here */
8354 pMsg->sessionId = sessionId;
8355 pMsg->ssidHidden = ssidHidden;
8356 status = cds_send_mb_message_to_mac(pMsg);
8357 }
8358 sme_release_global_lock(&pMac->sme);
8359 }
8360 return status;
8361}
8362
8363/* ---------------------------------------------------------------------------
8364
8365 \fn sme_set_tm_level
8366 \brief Set Thermal Mitigation Level to RIVA
8367 \param hHal - The handle returned by mac_open.
8368 \param newTMLevel - new Thermal Mitigation Level
8369 \param tmMode - Thermal Mitigation handle mode, default 0
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308370 \return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008371 ---------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308372QDF_STATUS sme_set_tm_level(tHalHandle hHal, uint16_t newTMLevel, uint16_t tmMode)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008373{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308374 QDF_STATUS status = QDF_STATUS_SUCCESS;
8375 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008376 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
8377 cds_msg_t cds_message;
8378 tAniSetTmLevelReq *setTmLevelReq = NULL;
8379
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308380 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008381 TRACE_CODE_SME_RX_HDD_SET_TMLEVEL, NO_SESSION, 0));
8382 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308383 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008384 setTmLevelReq =
8385 (tAniSetTmLevelReq *)
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308386 qdf_mem_malloc(sizeof(tAniSetTmLevelReq));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008387 if (NULL == setTmLevelReq) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308388 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008389 "%s: Not able to allocate memory for sme_set_tm_level",
8390 __func__);
8391 sme_release_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308392 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008393 }
8394
8395 setTmLevelReq->tmMode = tmMode;
8396 setTmLevelReq->newTmLevel = newTMLevel;
8397
8398 /* serialize the req through MC thread */
8399 cds_message.bodyptr = setTmLevelReq;
8400 cds_message.type = WMA_SET_TM_LEVEL_REQ;
Sreelakshmi Konamki6a065362016-05-31 16:05:01 +05308401 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
8402 NO_SESSION, cds_message.type));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308403 qdf_status = cds_mq_post_message(CDS_MQ_ID_WMA, &cds_message);
8404 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308405 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008406 "%s: Post Set TM Level MSG fail", __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308407 qdf_mem_free(setTmLevelReq);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308408 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008409 }
8410 sme_release_global_lock(&pMac->sme);
8411 }
8412 return status;
8413}
8414
8415/*---------------------------------------------------------------------------
8416
8417 \brief sme_feature_caps_exchange() - SME interface to exchange capabilities between
8418 Host and FW.
8419
8420 \param hHal - HAL handle for device
8421
8422 \return NONE
8423
8424 ---------------------------------------------------------------------------*/
8425void sme_feature_caps_exchange(tHalHandle hHal)
8426{
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308427 MTRACE(qdf_trace
Anurag Chouhan6d760662016-02-20 16:05:43 +05308428 (QDF_MODULE_ID_SME, TRACE_CODE_SME_RX_HDD_CAPS_EXCH, NO_SESSION,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008429 0));
8430}
8431
8432/*---------------------------------------------------------------------------
8433
8434 \brief sme_disable_feature_capablity() - SME interface to disable Active mode offload capablity
8435 in Host.
8436
8437 \param hHal - HAL handle for device
8438
8439 \return NONE
8440
8441 ---------------------------------------------------------------------------*/
8442void sme_disable_feature_capablity(uint8_t feature_index)
8443{
8444}
8445
8446/* ---------------------------------------------------------------------------
8447 \fn sme_reset_power_values_for5_g
8448 \brief Reset the power values for 5G band with default power values.
8449 \param hHal - HAL handle for device
8450 \- return NONE
8451 -------------------------------------------------------------------------*/
8452void sme_reset_power_values_for5_g(tHalHandle hHal)
8453{
8454 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308455 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008456 TRACE_CODE_SME_RX_HDD_RESET_PW5G, NO_SESSION, 0));
8457 csr_save_channel_power_for_band(pMac, true);
8458 csr_apply_power2_current(pMac); /* Store the channel+power info in the global place: Cfg */
8459}
8460
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008461/* ---------------------------------------------------------------------------
8462 \fn sme_update_roam_prefer5_g_hz
8463 \brief enable/disable Roam prefer 5G runtime option
8464 This function is called through dynamic setConfig callback function
8465 to configure the Roam prefer 5G runtime option
8466 \param hHal - HAL handle for device
8467 \param nRoamPrefer5GHz Enable/Disable Roam prefer 5G runtime option
8468 \- return Success or failure
8469 -------------------------------------------------------------------------*/
8470
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308471QDF_STATUS sme_update_roam_prefer5_g_hz(tHalHandle hHal, bool nRoamPrefer5GHz)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008472{
8473 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308474 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008475
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308476 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008477 TRACE_CODE_SME_RX_HDD_UPDATE_RP5G, NO_SESSION, 0));
8478 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308479 if (QDF_IS_STATUS_SUCCESS(status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308480 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008481 "%s: gRoamPrefer5GHz is changed from %d to %d",
8482 __func__, pMac->roam.configParam.nRoamPrefer5GHz,
8483 nRoamPrefer5GHz);
8484 pMac->roam.configParam.nRoamPrefer5GHz = nRoamPrefer5GHz;
8485 sme_release_global_lock(&pMac->sme);
8486 }
8487
8488 return status;
8489}
8490
8491/* ---------------------------------------------------------------------------
8492 \fn sme_set_roam_intra_band
8493 \brief enable/disable Intra band roaming
8494 This function is called through dynamic setConfig callback function
8495 to configure the intra band roaming
8496 \param hHal - HAL handle for device
8497 \param nRoamIntraBand Enable/Disable Intra band roaming
8498 \- return Success or failure
8499 -------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308500QDF_STATUS sme_set_roam_intra_band(tHalHandle hHal, const bool nRoamIntraBand)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008501{
8502 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308503 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008504
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308505 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008506 TRACE_CODE_SME_RX_HDD_SET_ROAMIBAND, NO_SESSION, 0));
8507 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308508 if (QDF_IS_STATUS_SUCCESS(status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308509 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008510 "%s: gRoamIntraBand is changed from %d to %d",
8511 __func__, pMac->roam.configParam.nRoamIntraBand,
8512 nRoamIntraBand);
8513 pMac->roam.configParam.nRoamIntraBand = nRoamIntraBand;
8514 sme_release_global_lock(&pMac->sme);
8515 }
8516
8517 return status;
8518}
8519
8520/* ---------------------------------------------------------------------------
8521 \fn sme_update_roam_scan_n_probes
8522 \brief function to update roam scan N probes
8523 This function is called through dynamic setConfig callback function
8524 to update roam scan N probes
8525 \param hHal - HAL handle for device
8526 \param sessionId - Session Identifier
8527 \param nProbes number of probe requests to be sent out
8528 \- return Success or failure
8529 -------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308530QDF_STATUS sme_update_roam_scan_n_probes(tHalHandle hHal, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008531 const uint8_t nProbes)
8532{
8533 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308534 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008535
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308536 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008537 TRACE_CODE_SME_RX_HDD_UPDATE_ROAM_SCAN_N_PROBES,
8538 NO_SESSION, 0));
8539 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308540 if (QDF_IS_STATUS_SUCCESS(status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308541 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008542 "%s: gRoamScanNProbes is changed from %d to %d",
8543 __func__, pMac->roam.configParam.nProbes, nProbes);
8544 pMac->roam.configParam.nProbes = nProbes;
8545 sme_release_global_lock(&pMac->sme);
8546 }
8547 if (pMac->roam.configParam.isRoamOffloadScanEnabled) {
8548 csr_roam_offload_scan(pMac, sessionId,
8549 ROAM_SCAN_OFFLOAD_UPDATE_CFG,
8550 REASON_NPROBES_CHANGED);
8551 }
8552 return status;
8553}
8554
8555/* ---------------------------------------------------------------------------
8556 \fn sme_update_roam_scan_home_away_time
8557 \brief function to update roam scan Home away time
8558 This function is called through dynamic setConfig callback function
8559 to update roam scan home away time
8560 \param hHal - HAL handle for device
8561 \param sessionId - Session Identifier
8562 \param nRoamScanAwayTime Scan home away time
8563 \param bSendOffloadCmd If true then send offload command to firmware
8564 If false then command is not sent to firmware
8565 \- return Success or failure
8566 -------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308567QDF_STATUS sme_update_roam_scan_home_away_time(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008568 uint8_t sessionId,
8569 const uint16_t nRoamScanHomeAwayTime,
8570 const bool bSendOffloadCmd)
8571{
8572 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308573 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008574
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308575 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008576 TRACE_CODE_SME_RX_HDD_UPDATE_ROAM_SCAN_HOME_AWAY_TIME,
8577 NO_SESSION, 0));
8578 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308579 if (QDF_IS_STATUS_SUCCESS(status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308580 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008581 "%s: gRoamScanHomeAwayTime is changed from %d to %d",
8582 __func__,
8583 pMac->roam.configParam.nRoamScanHomeAwayTime,
8584 nRoamScanHomeAwayTime);
8585 pMac->roam.configParam.nRoamScanHomeAwayTime =
8586 nRoamScanHomeAwayTime;
8587 sme_release_global_lock(&pMac->sme);
8588 }
8589 if (pMac->roam.configParam.isRoamOffloadScanEnabled && bSendOffloadCmd) {
8590 csr_roam_offload_scan(pMac, sessionId,
8591 ROAM_SCAN_OFFLOAD_UPDATE_CFG,
8592 REASON_HOME_AWAY_TIME_CHANGED);
8593 }
8594 return status;
8595}
8596
Abhishek Singh518323d2015-10-19 17:42:01 +05308597/**
8598 * sme_ext_change_channel()- function to post send ECSA
8599 * action frame to csr.
8600 * @hHal: Hal context
8601 * @channel: new channel to switch
8602 * @session_id: senssion it should be sent on.
8603 *
8604 * This function is called to post ECSA frame to csr.
8605 *
8606 * Return: success if msg is sent else return failure
8607 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308608QDF_STATUS sme_ext_change_channel(tHalHandle h_hal, uint32_t channel,
Abhishek Singh518323d2015-10-19 17:42:01 +05308609 uint8_t session_id)
8610{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308611 QDF_STATUS status = QDF_STATUS_SUCCESS;
Abhishek Singh518323d2015-10-19 17:42:01 +05308612 tpAniSirGlobal mac_ctx = PMAC_STRUCT(h_hal);
8613 uint8_t channel_state;
8614
8615 sms_log(mac_ctx, LOGE, FL(" Set Channel %d "), channel);
8616 channel_state =
8617 cds_get_channel_state(channel);
8618
8619 if (CHANNEL_STATE_DISABLE == channel_state) {
8620 sms_log(mac_ctx, LOGE, FL(" Invalid channel %d "), channel);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308621 return QDF_STATUS_E_INVAL;
Abhishek Singh518323d2015-10-19 17:42:01 +05308622 }
8623
8624 status = sme_acquire_global_lock(&mac_ctx->sme);
8625
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308626 if (QDF_STATUS_SUCCESS == status) {
Abhishek Singh518323d2015-10-19 17:42:01 +05308627 /* update the channel list to the firmware */
8628 status = csr_send_ext_change_channel(mac_ctx,
8629 channel, session_id);
8630 sme_release_global_lock(&mac_ctx->sme);
8631 }
8632
8633 return status;
8634}
8635
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008636/* ---------------------------------------------------------------------------
8637 \fn sme_get_roam_intra_band
8638 \brief get Intra band roaming
8639 \param hHal - HAL handle for device
8640 \- return Success or failure
8641 -------------------------------------------------------------------------*/
8642bool sme_get_roam_intra_band(tHalHandle hHal)
8643{
8644 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308645 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008646 TRACE_CODE_SME_RX_HDD_GET_ROAMIBAND, NO_SESSION, 0));
8647 return pMac->roam.configParam.nRoamIntraBand;
8648}
8649
8650/* ---------------------------------------------------------------------------
8651 \fn sme_get_roam_scan_n_probes
8652 \brief get N Probes
8653 \param hHal - HAL handle for device
8654 \- return Success or failure
8655 -------------------------------------------------------------------------*/
8656uint8_t sme_get_roam_scan_n_probes(tHalHandle hHal)
8657{
8658 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
8659 return pMac->roam.configParam.nProbes;
8660}
8661
8662/* ---------------------------------------------------------------------------
8663 \fn sme_get_roam_scan_home_away_time
8664 \brief get Roam scan home away time
8665 \param hHal - HAL handle for device
8666 \- return Success or failure
8667 -------------------------------------------------------------------------*/
8668uint16_t sme_get_roam_scan_home_away_time(tHalHandle hHal)
8669{
8670 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
8671 return pMac->roam.configParam.nRoamScanHomeAwayTime;
8672}
8673
8674/* ---------------------------------------------------------------------------
8675 \fn sme_update_roam_rssi_diff
8676 \brief Update RoamRssiDiff
8677 This function is called through dynamic setConfig callback function
8678 to configure RoamRssiDiff
8679 Usage: adb shell iwpriv wlan0 setConfig RoamRssiDiff=[0 .. 125]
8680 \param hHal - HAL handle for device
8681 \param sessionId - Session Identifier
8682 \param RoamRssiDiff - minimum rssi difference between potential
8683 candidate and current AP.
8684 \- return Success or failure
8685 -------------------------------------------------------------------------*/
8686
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308687QDF_STATUS sme_update_roam_rssi_diff(tHalHandle hHal, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008688 uint8_t RoamRssiDiff)
8689{
8690 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308691 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008692
8693 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308694 if (QDF_IS_STATUS_SUCCESS(status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308695 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008696 "LFR runtime successfully set roam rssi diff to %d - old value is %d - roam state is %s",
8697 RoamRssiDiff,
8698 pMac->roam.configParam.RoamRssiDiff,
8699 mac_trace_get_neighbour_roam_state(pMac->roam.
8700 neighborRoamInfo
8701 [sessionId].
8702 neighborRoamState));
8703 pMac->roam.configParam.RoamRssiDiff = RoamRssiDiff;
8704 sme_release_global_lock(&pMac->sme);
8705 }
8706 if (pMac->roam.configParam.isRoamOffloadScanEnabled) {
8707 csr_roam_offload_scan(pMac, sessionId,
8708 ROAM_SCAN_OFFLOAD_UPDATE_CFG,
8709 REASON_RSSI_DIFF_CHANGED);
8710 }
8711 return status;
8712}
8713
8714/*--------------------------------------------------------------------------
8715 \brief sme_update_fast_transition_enabled() - enable/disable Fast Transition
8716 support at runtime
8717 It is used at in the REG_DYNAMIC_VARIABLE macro definition of
8718 isFastTransitionEnabled.
8719 This is a synchronous call
8720 \param hHal - The handle returned by mac_open.
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308721 \return QDF_STATUS_SUCCESS - SME update isFastTransitionEnabled config
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008722 successfully.
8723 Other status means SME is failed to update isFastTransitionEnabled.
8724 \sa
8725 --------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308726QDF_STATUS sme_update_fast_transition_enabled(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008727 bool isFastTransitionEnabled)
8728{
8729 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308730 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008731
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308732 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008733 TRACE_CODE_SME_RX_HDD_UPDATE_FTENABLED, NO_SESSION,
8734 0));
8735 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308736 if (QDF_IS_STATUS_SUCCESS(status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308737 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008738 "%s: FastTransitionEnabled is changed from %d to %d",
8739 __func__,
8740 pMac->roam.configParam.isFastTransitionEnabled,
8741 isFastTransitionEnabled);
8742 pMac->roam.configParam.isFastTransitionEnabled =
8743 isFastTransitionEnabled;
8744 sme_release_global_lock(&pMac->sme);
8745 }
8746
8747 return status;
8748}
8749
8750/* ---------------------------------------------------------------------------
8751 \fn sme_update_wes_mode
8752 \brief Update WES Mode
8753 This function is called through dynamic setConfig callback function
8754 to configure isWESModeEnabled
8755 \param hHal - HAL handle for device
8756 \param isWESModeEnabled - WES mode
8757 \param sessionId - Session Identifier
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308758 \return QDF_STATUS_SUCCESS - SME update isWESModeEnabled config successfully.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008759 Other status means SME is failed to update isWESModeEnabled.
8760 -------------------------------------------------------------------------*/
8761
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308762QDF_STATUS sme_update_wes_mode(tHalHandle hHal, bool isWESModeEnabled,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008763 uint8_t sessionId)
8764{
8765 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308766 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008767
8768 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308769 if (QDF_IS_STATUS_SUCCESS(status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308770 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008771 "LFR runtime successfully set WES Mode to %d - old value is %d - roam state is %s",
8772 isWESModeEnabled,
8773 pMac->roam.configParam.isWESModeEnabled,
8774 mac_trace_get_neighbour_roam_state(pMac->roam.
8775 neighborRoamInfo
8776 [sessionId].
8777 neighborRoamState));
8778 pMac->roam.configParam.isWESModeEnabled = isWESModeEnabled;
8779 sme_release_global_lock(&pMac->sme);
8780 }
8781
8782 return status;
8783}
8784
8785/* ---------------------------------------------------------------------------
8786 \fn sme_set_roam_scan_control
8787 \brief Set roam scan control
8788 This function is called to set roam scan control
8789 if roam scan control is set to 0, roaming scan cache is cleared
8790 any value other than 0 is treated as invalid value
8791 \param hHal - HAL handle for device
8792 \param sessionId - Session Identifier
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308793 \return QDF_STATUS_SUCCESS - SME update config successfully.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008794 Other status means SME failure to update
8795 -------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308796QDF_STATUS sme_set_roam_scan_control(tHalHandle hHal, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008797 bool roamScanControl)
8798{
8799 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308800 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008801
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308802 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008803 TRACE_CODE_SME_RX_HDD_SET_SCANCTRL, NO_SESSION, 0));
8804 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308805 if (QDF_IS_STATUS_SUCCESS(status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308806 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008807 "LFR runtime successfully set roam scan control to %d - old value is %d - roam state is %s",
8808 roamScanControl,
8809 pMac->roam.configParam.nRoamScanControl,
8810 mac_trace_get_neighbour_roam_state(pMac->roam.
8811 neighborRoamInfo
8812 [sessionId].
8813 neighborRoamState));
8814 pMac->roam.configParam.nRoamScanControl = roamScanControl;
8815 if (0 == roamScanControl) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308816 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008817 "LFR runtime successfully cleared roam scan cache");
8818 csr_flush_cfg_bg_scan_roam_channel_list(pMac, sessionId);
8819 if (pMac->roam.configParam.isRoamOffloadScanEnabled) {
8820 csr_roam_offload_scan(pMac, sessionId,
8821 ROAM_SCAN_OFFLOAD_UPDATE_CFG,
8822 REASON_FLUSH_CHANNEL_LIST);
8823 }
8824 }
8825 sme_release_global_lock(&pMac->sme);
8826 }
8827 return status;
8828}
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008829
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008830/*--------------------------------------------------------------------------
8831 \brief sme_update_is_fast_roam_ini_feature_enabled() - enable/disable LFR
8832 support at runtime
8833 It is used at in the REG_DYNAMIC_VARIABLE macro definition of
8834 isFastRoamIniFeatureEnabled.
8835 This is a synchronous call
8836 \param hHal - The handle returned by mac_open.
8837 \param sessionId - Session Identifier
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308838 \return QDF_STATUS_SUCCESS - SME update isFastRoamIniFeatureEnabled config
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008839 successfully.
8840 Other status means SME is failed to update isFastRoamIniFeatureEnabled.
8841 \sa
8842 --------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308843QDF_STATUS sme_update_is_fast_roam_ini_feature_enabled
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008844 (tHalHandle hHal,
8845 uint8_t sessionId, const bool isFastRoamIniFeatureEnabled) {
8846 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
8847
8848 if (pMac->roam.configParam.isFastRoamIniFeatureEnabled ==
8849 isFastRoamIniFeatureEnabled) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308850 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008851 "%s: FastRoam is already enabled or disabled, nothing to do (returning) old(%d) new(%d)",
8852 __func__,
8853 pMac->roam.configParam.isFastRoamIniFeatureEnabled,
8854 isFastRoamIniFeatureEnabled);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308855 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008856 }
8857
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308858 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008859 "%s: FastRoamEnabled is changed from %d to %d", __func__,
8860 pMac->roam.configParam.isFastRoamIniFeatureEnabled,
8861 isFastRoamIniFeatureEnabled);
8862 pMac->roam.configParam.isFastRoamIniFeatureEnabled =
8863 isFastRoamIniFeatureEnabled;
8864 csr_neighbor_roam_update_fast_roaming_enabled(pMac, sessionId,
8865 isFastRoamIniFeatureEnabled);
8866
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308867 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008868}
8869
8870/*--------------------------------------------------------------------------
8871 \brief sme_update_is_mawc_ini_feature_enabled() -
8872 Enable/disable LFR MAWC support at runtime
8873 It is used at in the REG_DYNAMIC_VARIABLE macro definition of
8874 isMAWCIniFeatureEnabled.
8875 This is a synchronous call
8876 \param hHal - The handle returned by mac_open.
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308877 \return QDF_STATUS_SUCCESS - SME update MAWCEnabled config successfully.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008878 Other status means SME is failed to update MAWCEnabled.
8879 \sa
8880 --------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308881QDF_STATUS sme_update_is_mawc_ini_feature_enabled(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008882 const bool MAWCEnabled)
8883{
8884 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308885 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008886
8887 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308888 if (QDF_IS_STATUS_SUCCESS(status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308889 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008890 "%s: MAWCEnabled is changed from %d to %d", __func__,
8891 pMac->roam.configParam.MAWCEnabled, MAWCEnabled);
8892 pMac->roam.configParam.MAWCEnabled = MAWCEnabled;
8893 sme_release_global_lock(&pMac->sme);
8894 }
8895
8896 return status;
8897
8898}
8899
8900/*--------------------------------------------------------------------------
8901 \brief sme_stop_roaming() - Stop roaming for a given sessionId
8902 This is a synchronous call
8903 \param hHal - The handle returned by mac_open
8904 \param sessionId - Session Identifier
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308905 \return QDF_STATUS_SUCCESS on success
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008906 Other status on failure
8907 \sa
8908 --------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308909QDF_STATUS sme_stop_roaming(tHalHandle hHal, uint8_t sessionId, uint8_t reason)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008910{
8911 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308912 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008913
8914 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308915 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008916 csr_roam_offload_scan(pMac, sessionId, ROAM_SCAN_OFFLOAD_STOP,
8917 reason);
8918 sme_release_global_lock(&pMac->sme);
8919 }
8920
8921 return status;
8922}
8923
8924/*--------------------------------------------------------------------------
8925 \brief sme_start_roaming() - Start roaming for a given sessionId
8926 This is a synchronous call
8927 \param hHal - The handle returned by mac_open
8928 \param sessionId - Session Identifier
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308929 \return QDF_STATUS_SUCCESS on success
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008930 Other status on failure
8931 \sa
8932 --------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308933QDF_STATUS sme_start_roaming(tHalHandle hHal, uint8_t sessionId, uint8_t reason)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008934{
8935 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308936 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008937
8938 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308939 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008940 csr_roam_offload_scan(pMac, sessionId, ROAM_SCAN_OFFLOAD_START,
8941 reason);
8942 sme_release_global_lock(&pMac->sme);
8943 }
8944
8945 return status;
8946}
8947
8948/*--------------------------------------------------------------------------
8949 \brief sme_update_enable_fast_roam_in_concurrency() - enable/disable LFR if
8950 Concurrent session exists
8951 This is a synchronuous call
8952 \param hHal - The handle returned by mac_open.
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308953 \return QDF_STATUS_SUCCESS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008954 Other status means SME is failed
8955 \sa
8956 --------------------------------------------------------------------------*/
8957
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308958QDF_STATUS sme_update_enable_fast_roam_in_concurrency(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008959 bool
8960 bFastRoamInConIniFeatureEnabled)
8961{
8962
8963 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308964 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008965
8966 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308967 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008968 pMac->roam.configParam.bFastRoamInConIniFeatureEnabled =
8969 bFastRoamInConIniFeatureEnabled;
8970 if (0 == pMac->roam.configParam.isRoamOffloadScanEnabled) {
8971 pMac->roam.configParam.bFastRoamInConIniFeatureEnabled =
8972 0;
8973 }
8974 sme_release_global_lock(&pMac->sme);
8975 }
8976
8977 return status;
8978}
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008979
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008980/*--------------------------------------------------------------------------
8981 \brief sme_update_config_fw_rssi_monitoring() - enable/disable firmware RSSI
8982 Monitoring at runtime
8983 It is used at in the REG_DYNAMIC_VARIABLE macro definition of
8984 fEnableFwRssiMonitoring.
8985 This is a synchronous call
8986 \param hHal - The handle returned by mac_open.
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308987 \return QDF_STATUS_SUCCESS - SME update fEnableFwRssiMonitoring.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008988 config successfully.
8989 Other status means SME is failed to update fEnableFwRssiMonitoring.
8990 \sa
8991 --------------------------------------------------------------------------*/
8992
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308993QDF_STATUS sme_update_config_fw_rssi_monitoring(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008994 bool fEnableFwRssiMonitoring)
8995{
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05308996 QDF_STATUS qdf_ret_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008997
8998 if (sme_cfg_set_int (hHal, WNI_CFG_PS_ENABLE_RSSI_MONITOR,
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308999 fEnableFwRssiMonitoring) == QDF_STATUS_E_FAILURE) {
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05309000 qdf_ret_status = QDF_STATUS_E_FAILURE;
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05309001 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009002 "Could not pass on WNI_CFG_PS_RSSI_MONITOR to CFG");
9003 }
9004
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05309005 return qdf_ret_status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009006}
9007
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009008/* ---------------------------------------------------------------------------
9009 \fn sme_set_roam_opportunistic_scan_threshold_diff
9010 \brief Update Opportunistic Scan threshold diff
9011 This function is called through dynamic setConfig callback function
9012 to configure nOpportunisticThresholdDiff
9013 \param hHal - HAL handle for device
9014 \param sessionId - Session Identifier
9015 \param nOpportunisticThresholdDiff - Opportunistic Scan threshold diff
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309016 \return QDF_STATUS_SUCCESS - SME update nOpportunisticThresholdDiff config
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009017 successfully.
9018 else SME is failed to update nOpportunisticThresholdDiff.
9019 -------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309020QDF_STATUS sme_set_roam_opportunistic_scan_threshold_diff(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009021 uint8_t sessionId,
9022 const uint8_t
9023 nOpportunisticThresholdDiff)
9024{
9025 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309026 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009027
9028 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309029 if (QDF_IS_STATUS_SUCCESS(status)) {
Varun Reddy Yeturuff4feb02016-04-20 12:26:11 -07009030 status = csr_neighbor_roam_update_config(pMac, sessionId,
9031 nOpportunisticThresholdDiff,
9032 REASON_OPPORTUNISTIC_THRESH_DIFF_CHANGED);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309033 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009034 pMac->roam.configParam.neighborRoamConfig.
9035 nOpportunisticThresholdDiff =
9036 nOpportunisticThresholdDiff;
9037 }
9038 sme_release_global_lock(&pMac->sme);
9039 }
9040 return status;
9041}
9042
9043/*--------------------------------------------------------------------------
9044 \fn sme_get_roam_opportunistic_scan_threshold_diff()
9045 \brief gets Opportunistic Scan threshold diff
9046 This is a synchronous call
9047 \param hHal - The handle returned by mac_open
9048 \return uint8_t - nOpportunisticThresholdDiff
9049 \sa
9050 --------------------------------------------------------------------------*/
9051uint8_t sme_get_roam_opportunistic_scan_threshold_diff(tHalHandle hHal)
9052{
9053 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
9054 return pMac->roam.configParam.neighborRoamConfig.
9055 nOpportunisticThresholdDiff;
9056}
9057
9058/* ---------------------------------------------------------------------------
9059 \fn sme_set_roam_rescan_rssi_diff
9060 \brief Update roam rescan rssi diff
9061 This function is called through dynamic setConfig callback function
9062 to configure nRoamRescanRssiDiff
9063 \param hHal - HAL handle for device
9064 \param sessionId - Session Identifier
9065 \param nRoamRescanRssiDiff - roam rescan rssi diff
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309066 \return QDF_STATUS_SUCCESS - SME update nRoamRescanRssiDiff config
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009067 successfully.
9068 else SME is failed to update nRoamRescanRssiDiff.
9069 -------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309070QDF_STATUS sme_set_roam_rescan_rssi_diff(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009071 uint8_t sessionId,
9072 const uint8_t nRoamRescanRssiDiff)
9073{
9074 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309075 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009076
9077 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309078 if (QDF_IS_STATUS_SUCCESS(status)) {
Varun Reddy Yeturuff4feb02016-04-20 12:26:11 -07009079 status = csr_neighbor_roam_update_config(pMac, sessionId,
9080 nRoamRescanRssiDiff,
9081 REASON_ROAM_RESCAN_RSSI_DIFF_CHANGED);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309082 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009083 pMac->roam.configParam.neighborRoamConfig.
9084 nRoamRescanRssiDiff = nRoamRescanRssiDiff;
9085 }
9086 sme_release_global_lock(&pMac->sme);
9087 }
9088 return status;
9089}
9090
9091/*--------------------------------------------------------------------------
9092 \fn sme_get_roam_rescan_rssi_diff
9093 \brief gets roam rescan rssi diff
9094 This is a synchronous call
9095 \param hHal - The handle returned by mac_open
9096 \return int8_t - nRoamRescanRssiDiff
9097 \sa
9098 --------------------------------------------------------------------------*/
9099uint8_t sme_get_roam_rescan_rssi_diff(tHalHandle hHal)
9100{
9101 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
9102 return pMac->roam.configParam.neighborRoamConfig.nRoamRescanRssiDiff;
9103}
9104
9105/* ---------------------------------------------------------------------------
9106 \fn sme_set_roam_bmiss_first_bcnt
9107 \brief Update Roam count for first beacon miss
9108 This function is called through dynamic setConfig callback function
9109 to configure nRoamBmissFirstBcnt
9110 \param hHal - HAL handle for device
9111 \param sessionId - Session Identifier
9112 \param nRoamBmissFirstBcnt - Roam first bmiss count
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309113 \return QDF_STATUS_SUCCESS - SME update nRoamBmissFirstBcnt
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009114 successfully.
9115 else SME is failed to update nRoamBmissFirstBcnt
9116 -------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309117QDF_STATUS sme_set_roam_bmiss_first_bcnt(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009118 uint8_t sessionId,
9119 const uint8_t nRoamBmissFirstBcnt)
9120{
9121 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309122 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009123
9124 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309125 if (QDF_IS_STATUS_SUCCESS(status)) {
Varun Reddy Yeturuff4feb02016-04-20 12:26:11 -07009126 status = csr_neighbor_roam_update_config(pMac, sessionId,
9127 nRoamBmissFirstBcnt,
9128 REASON_ROAM_BMISS_FIRST_BCNT_CHANGED);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309129 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009130 pMac->roam.configParam.neighborRoamConfig.
9131 nRoamBmissFirstBcnt = nRoamBmissFirstBcnt;
9132 }
9133 sme_release_global_lock(&pMac->sme);
9134 }
9135 return status;
9136}
9137
9138/* ---------------------------------------------------------------------------
9139 \fn sme_get_roam_bmiss_first_bcnt
9140 \brief get neighbor roam beacon miss first count
9141 \param hHal - The handle returned by mac_open.
9142 \return uint8_t - neighbor roam beacon miss first count
9143 -------------------------------------------------------------------------*/
9144uint8_t sme_get_roam_bmiss_first_bcnt(tHalHandle hHal)
9145{
9146 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
9147 return pMac->roam.configParam.neighborRoamConfig.nRoamBmissFirstBcnt;
9148}
9149
9150/* ---------------------------------------------------------------------------
9151 \fn sme_set_roam_bmiss_final_bcnt
9152 \brief Update Roam count for final beacon miss
9153 This function is called through dynamic setConfig callback function
9154 to configure nRoamBmissFinalBcnt
9155 \param hHal - HAL handle for device
9156 \param sessionId - Session Identifier
9157 \param nRoamBmissFinalBcnt - Roam final bmiss count
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309158 \return QDF_STATUS_SUCCESS - SME update nRoamBmissFinalBcnt
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009159 successfully.
9160 else SME is failed to update nRoamBmissFinalBcnt
9161 -------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309162QDF_STATUS sme_set_roam_bmiss_final_bcnt(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009163 uint8_t sessionId,
9164 const uint8_t nRoamBmissFinalBcnt)
9165{
9166 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309167 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009168
9169 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309170 if (QDF_IS_STATUS_SUCCESS(status)) {
Varun Reddy Yeturuff4feb02016-04-20 12:26:11 -07009171 status = csr_neighbor_roam_update_config(pMac, sessionId,
9172 nRoamBmissFinalBcnt,
9173 REASON_ROAM_BMISS_FINAL_BCNT_CHANGED);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309174 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009175 pMac->roam.configParam.neighborRoamConfig.
9176 nRoamBmissFinalBcnt = nRoamBmissFinalBcnt;
9177 }
9178 sme_release_global_lock(&pMac->sme);
9179 }
9180 return status;
9181}
9182
9183/*--------------------------------------------------------------------------
9184 \fn sme_get_roam_bmiss_final_bcnt
9185 \brief gets Roam count for final beacon miss
9186 This is a synchronous call
9187 \param hHal - The handle returned by mac_open
9188 \return uint8_t - nRoamBmissFinalBcnt
9189 \sa
9190 --------------------------------------------------------------------------*/
9191uint8_t sme_get_roam_bmiss_final_bcnt(tHalHandle hHal)
9192{
9193 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
9194 return pMac->roam.configParam.neighborRoamConfig.nRoamBmissFinalBcnt;
9195}
9196
9197/* ---------------------------------------------------------------------------
9198 \fn sme_set_roam_beacon_rssi_weight
9199 \brief Update Roam beacon rssi weight
9200 This function is called through dynamic setConfig callback function
9201 to configure nRoamBeaconRssiWeight
9202 \param hHal - HAL handle for device
9203 \param sessionId - Session Identifier
9204 \param nRoamBeaconRssiWeight - Roam beacon rssi weight
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309205 \return QDF_STATUS_SUCCESS - SME update nRoamBeaconRssiWeight config
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009206 successfully.
9207 else SME is failed to update nRoamBeaconRssiWeight
9208 -------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309209QDF_STATUS sme_set_roam_beacon_rssi_weight(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009210 uint8_t sessionId,
9211 const uint8_t nRoamBeaconRssiWeight)
9212{
9213 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309214 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009215
9216 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309217 if (QDF_IS_STATUS_SUCCESS(status)) {
Varun Reddy Yeturuff4feb02016-04-20 12:26:11 -07009218 status = csr_neighbor_roam_update_config(pMac, sessionId,
9219 nRoamBeaconRssiWeight,
9220 REASON_ROAM_BEACON_RSSI_WEIGHT_CHANGED);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309221 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009222 pMac->roam.configParam.neighborRoamConfig.
9223 nRoamBeaconRssiWeight = nRoamBeaconRssiWeight;
9224 }
9225 sme_release_global_lock(&pMac->sme);
9226 }
9227 return status;
9228}
9229
9230/*--------------------------------------------------------------------------
9231 \fn sme_get_roam_beacon_rssi_weight
9232 \brief gets Roam beacon rssi weight
9233 This is a synchronous call
9234 \param hHal - The handle returned by mac_open
9235 \return uint8_t - nRoamBeaconRssiWeight
9236 \sa
9237 --------------------------------------------------------------------------*/
9238uint8_t sme_get_roam_beacon_rssi_weight(tHalHandle hHal)
9239{
9240 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
9241 return pMac->roam.configParam.neighborRoamConfig.nRoamBeaconRssiWeight;
9242}
9243
9244/*--------------------------------------------------------------------------
9245 \brief sme_set_neighbor_lookup_rssi_threshold() - update neighbor lookup
9246 rssi threshold
9247 This is a synchronous call
9248 \param hHal - The handle returned by mac_open.
9249 \param sessionId - Session Identifier
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309250 \return QDF_STATUS_SUCCESS - SME update config successful.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009251 Other status means SME is failed to update
9252 \sa
9253 --------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309254QDF_STATUS sme_set_neighbor_lookup_rssi_threshold
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009255 (tHalHandle hHal, uint8_t sessionId, uint8_t neighborLookupRssiThreshold) {
9256 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309257 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009258
9259 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309260 if (QDF_IS_STATUS_SUCCESS(status)) {
Varun Reddy Yeturuff4feb02016-04-20 12:26:11 -07009261 status = csr_neighbor_roam_update_config(pMac,
9262 sessionId, neighborLookupRssiThreshold,
9263 REASON_LOOKUP_THRESH_CHANGED);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309264 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009265 pMac->roam.configParam.neighborRoamConfig.
9266 nNeighborLookupRssiThreshold =
9267 neighborLookupRssiThreshold;
9268 }
9269 sme_release_global_lock(&pMac->sme);
9270 }
9271 return status;
9272}
9273
9274/*--------------------------------------------------------------------------
9275 \brief sme_set_delay_before_vdev_stop() - update delay before VDEV_STOP
9276 This is a synchronous call
9277 \param hal - The handle returned by macOpen.
9278 \param session_id - Session Identifier
9279 \param delay_before_vdev_stop - value to be set
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309280 \return QDF_STATUS_SUCCESS - SME update config successful.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009281 Other status means SME is failed to update
9282 \sa
9283 --------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309284QDF_STATUS sme_set_delay_before_vdev_stop(tHalHandle hal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009285 uint8_t session_id,
9286 uint8_t delay_before_vdev_stop)
9287{
9288 tpAniSirGlobal pMac = PMAC_STRUCT(hal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309289 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009290 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309291 if (QDF_IS_STATUS_SUCCESS(status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05309292 QDF_TRACE(QDF_MODULE_ID_SME,
9293 QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009294 FL("LFR param delay_before_vdev_stop changed from %d to %d"),
9295 pMac->roam.configParam.neighborRoamConfig.
9296 delay_before_vdev_stop,
9297 delay_before_vdev_stop);
9298 pMac->roam.neighborRoamInfo[session_id].cfgParams.
9299 delay_before_vdev_stop = delay_before_vdev_stop;
9300 pMac->roam.configParam.neighborRoamConfig.
9301 delay_before_vdev_stop = delay_before_vdev_stop;
9302 sme_release_global_lock(&pMac->sme);
9303 }
9304 return status;
9305}
9306
9307/*--------------------------------------------------------------------------
9308 \brief sme_get_neighbor_lookup_rssi_threshold() - get neighbor lookup
9309 rssi threshold
9310 This is a synchronous call
9311 \param hHal - The handle returned by mac_open.
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309312 \return QDF_STATUS_SUCCESS - SME update config successful.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009313 Other status means SME is failed to update
9314 \sa
9315 --------------------------------------------------------------------------*/
9316uint8_t sme_get_neighbor_lookup_rssi_threshold(tHalHandle hHal)
9317{
9318 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
9319 return pMac->roam.configParam.neighborRoamConfig.
9320 nNeighborLookupRssiThreshold;
9321}
9322
9323/*--------------------------------------------------------------------------
9324 \brief sme_set_neighbor_scan_refresh_period() - set neighbor scan results
9325 refresh period
9326 This is a synchronous call
9327 \param hHal - The handle returned by mac_open.
9328 \param sessionId - Session Identifier
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309329 \return QDF_STATUS_SUCCESS - SME update config successful.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009330 Other status means SME is failed to update
9331 \sa
9332 --------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309333QDF_STATUS sme_set_neighbor_scan_refresh_period
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009334 (tHalHandle hHal,
9335 uint8_t sessionId, uint16_t neighborScanResultsRefreshPeriod) {
9336 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309337 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009338 tCsrNeighborRoamConfig *pNeighborRoamConfig = NULL;
9339 tpCsrNeighborRoamControlInfo pNeighborRoamInfo = NULL;
9340
9341 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309342 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009343 pNeighborRoamConfig =
9344 &pMac->roam.configParam.neighborRoamConfig;
9345 pNeighborRoamInfo = &pMac->roam.neighborRoamInfo[sessionId];
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05309346 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009347 "LFR runtime successfully set roam scan refresh period to %d- old value is %d - roam state is %s",
9348 neighborScanResultsRefreshPeriod,
9349 pMac->roam.configParam.neighborRoamConfig.
9350 nNeighborResultsRefreshPeriod,
9351 mac_trace_get_neighbour_roam_state(pMac->roam.
9352 neighborRoamInfo
9353 [sessionId].
9354 neighborRoamState));
9355 pNeighborRoamConfig->nNeighborResultsRefreshPeriod =
9356 neighborScanResultsRefreshPeriod;
9357 pNeighborRoamInfo->cfgParams.neighborResultsRefreshPeriod =
9358 neighborScanResultsRefreshPeriod;
9359
9360 sme_release_global_lock(&pMac->sme);
9361 }
9362 if (pMac->roam.configParam.isRoamOffloadScanEnabled) {
9363 csr_roam_offload_scan(pMac, sessionId,
9364 ROAM_SCAN_OFFLOAD_UPDATE_CFG,
9365 REASON_NEIGHBOR_SCAN_REFRESH_PERIOD_CHANGED);
9366 }
9367 return status;
9368}
9369
9370/*--------------------------------------------------------------------------
9371 \brief sme_update_roam_scan_offload_enabled() - enable/disable roam scan
9372 offload feaure
9373 It is used at in the REG_DYNAMIC_VARIABLE macro definition of
9374 gRoamScanOffloadEnabled.
9375 This is a synchronous call
9376 \param hHal - The handle returned by mac_open.
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309377 \return QDF_STATUS_SUCCESS - SME update config successfully.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009378 Other status means SME is failed to update.
9379 \sa
9380 --------------------------------------------------------------------------*/
9381
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309382QDF_STATUS sme_update_roam_scan_offload_enabled(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009383 bool nRoamScanOffloadEnabled)
9384{
9385 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309386 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009387
9388 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309389 if (QDF_IS_STATUS_SUCCESS(status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05309390 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009391 FL
9392 ("gRoamScanOffloadEnabled is changed from %d to %d"),
9393 pMac->roam.configParam.isRoamOffloadScanEnabled,
9394 nRoamScanOffloadEnabled);
9395 pMac->roam.configParam.isRoamOffloadScanEnabled =
9396 nRoamScanOffloadEnabled;
9397 sme_release_global_lock(&pMac->sme);
9398 }
9399
9400 return status;
9401}
9402
9403/*--------------------------------------------------------------------------
9404 \brief sme_get_neighbor_scan_refresh_period() - get neighbor scan results
9405 refresh period
9406 This is a synchronous call
9407 \param hHal - The handle returned by mac_open.
9408 \return uint16_t - Neighbor scan results refresh period value
9409 \sa
9410 --------------------------------------------------------------------------*/
9411uint16_t sme_get_neighbor_scan_refresh_period(tHalHandle hHal)
9412{
9413 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
9414 return pMac->roam.configParam.neighborRoamConfig.
9415 nNeighborResultsRefreshPeriod;
9416}
9417
9418/*--------------------------------------------------------------------------
9419 \brief sme_get_empty_scan_refresh_period() - get empty scan refresh period
9420 This is a synchronuous call
9421 \param hHal - The handle returned by mac_open.
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309422 \return QDF_STATUS_SUCCESS - SME update config successful.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009423 Other status means SME is failed to update
9424 \sa
9425 --------------------------------------------------------------------------*/
9426uint16_t sme_get_empty_scan_refresh_period(tHalHandle hHal)
9427{
9428 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
9429 return pMac->roam.configParam.neighborRoamConfig.
9430 nEmptyScanRefreshPeriod;
9431}
9432
9433/* ---------------------------------------------------------------------------
9434 \fn sme_update_empty_scan_refresh_period
9435 \brief Update nEmptyScanRefreshPeriod
9436 This function is called through dynamic setConfig callback function
9437 to configure nEmptyScanRefreshPeriod
9438 Usage: adb shell iwpriv wlan0 setConfig
9439 nEmptyScanRefreshPeriod=[0 .. 60]
9440 \param hHal - HAL handle for device
9441 \param sessionId - Session Identifier
9442 \param nEmptyScanRefreshPeriod - scan period following empty scan results.
9443 \- return Success or failure
9444 -------------------------------------------------------------------------*/
9445
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309446QDF_STATUS sme_update_empty_scan_refresh_period(tHalHandle hHal, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009447 uint16_t nEmptyScanRefreshPeriod)
9448{
9449 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309450 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009451 tCsrNeighborRoamConfig *pNeighborRoamConfig = NULL;
9452 tpCsrNeighborRoamControlInfo pNeighborRoamInfo = NULL;
9453
9454 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309455 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009456 pNeighborRoamConfig =
9457 &pMac->roam.configParam.neighborRoamConfig;
9458 pNeighborRoamInfo = &pMac->roam.neighborRoamInfo[sessionId];
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05309459 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009460 "LFR runtime successfully set roam scan period to %d -old value is %d - roam state is %s",
9461 nEmptyScanRefreshPeriod,
9462 pMac->roam.configParam.neighborRoamConfig.
9463 nEmptyScanRefreshPeriod,
9464 mac_trace_get_neighbour_roam_state(pMac->roam.
9465 neighborRoamInfo
9466 [sessionId].
9467 neighborRoamState));
9468 pNeighborRoamConfig->nEmptyScanRefreshPeriod =
9469 nEmptyScanRefreshPeriod;
9470 pNeighborRoamInfo->cfgParams.emptyScanRefreshPeriod =
9471 nEmptyScanRefreshPeriod;
9472 sme_release_global_lock(&pMac->sme);
9473 }
9474 if (pMac->roam.configParam.isRoamOffloadScanEnabled) {
9475 csr_roam_offload_scan(pMac, sessionId,
9476 ROAM_SCAN_OFFLOAD_UPDATE_CFG,
9477 REASON_EMPTY_SCAN_REF_PERIOD_CHANGED);
9478 }
9479 return status;
9480}
9481
9482/* ---------------------------------------------------------------------------
9483 \fn sme_set_neighbor_scan_min_chan_time
9484 \brief Update nNeighborScanMinChanTime
9485 This function is called through dynamic setConfig callback function
9486 to configure gNeighborScanChannelMinTime
9487 Usage: adb shell iwpriv wlan0 setConfig
9488 gNeighborScanChannelMinTime=[0 .. 60]
9489 \param hHal - HAL handle for device
9490 \param nNeighborScanMinChanTime - Channel minimum dwell time
9491 \param sessionId - Session Identifier
9492 \- return Success or failure
9493 -------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309494QDF_STATUS sme_set_neighbor_scan_min_chan_time(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009495 const uint16_t
9496 nNeighborScanMinChanTime,
9497 uint8_t sessionId)
9498{
9499 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309500 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009501
9502 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309503 if (QDF_IS_STATUS_SUCCESS(status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05309504 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009505 "LFR runtime successfully set channel min dwell time to %d - old value is %d - roam state is %s",
9506 nNeighborScanMinChanTime,
9507 pMac->roam.configParam.neighborRoamConfig.
9508 nNeighborScanMinChanTime,
9509 mac_trace_get_neighbour_roam_state(pMac->roam.
9510 neighborRoamInfo
9511 [sessionId].
9512 neighborRoamState));
9513
9514 pMac->roam.configParam.neighborRoamConfig.
9515 nNeighborScanMinChanTime = nNeighborScanMinChanTime;
9516 pMac->roam.neighborRoamInfo[sessionId].cfgParams.
9517 minChannelScanTime = nNeighborScanMinChanTime;
9518 sme_release_global_lock(&pMac->sme);
9519 }
9520
9521 return status;
9522}
9523
9524/* ---------------------------------------------------------------------------
9525 \fn sme_set_neighbor_scan_max_chan_time
9526 \brief Update nNeighborScanMaxChanTime
9527 This function is called through dynamic setConfig callback function
9528 to configure gNeighborScanChannelMaxTime
9529 Usage: adb shell iwpriv wlan0 setConfig
9530 gNeighborScanChannelMaxTime=[0 .. 60]
9531 \param hHal - HAL handle for device
9532 \param sessionId - Session Identifier
9533 \param nNeighborScanMinChanTime - Channel maximum dwell time
9534 \- return Success or failure
9535 -------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309536QDF_STATUS sme_set_neighbor_scan_max_chan_time(tHalHandle hHal, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009537 const uint16_t
9538 nNeighborScanMaxChanTime)
9539{
9540 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309541 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009542 tCsrNeighborRoamConfig *pNeighborRoamConfig = NULL;
9543 tpCsrNeighborRoamControlInfo pNeighborRoamInfo = NULL;
9544
9545 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309546 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009547 pNeighborRoamConfig =
9548 &pMac->roam.configParam.neighborRoamConfig;
9549 pNeighborRoamInfo = &pMac->roam.neighborRoamInfo[sessionId];
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05309550 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009551 "LFR runtime successfully set channel max dwell time to %d - old value is %d - roam state is %s",
9552 nNeighborScanMaxChanTime,
9553 pMac->roam.configParam.neighborRoamConfig.
9554 nNeighborScanMaxChanTime,
9555 mac_trace_get_neighbour_roam_state(pMac->roam.
9556 neighborRoamInfo
9557 [sessionId].
9558 neighborRoamState));
9559 pNeighborRoamConfig->nNeighborScanMaxChanTime =
9560 nNeighborScanMaxChanTime;
9561 pNeighborRoamInfo->cfgParams.maxChannelScanTime =
9562 nNeighborScanMaxChanTime;
9563 sme_release_global_lock(&pMac->sme);
9564 }
9565 if (pMac->roam.configParam.isRoamOffloadScanEnabled) {
9566 csr_roam_offload_scan(pMac, sessionId,
9567 ROAM_SCAN_OFFLOAD_UPDATE_CFG,
9568 REASON_SCAN_CH_TIME_CHANGED);
9569 }
9570
9571 return status;
9572}
9573
9574/* ---------------------------------------------------------------------------
9575 \fn sme_get_neighbor_scan_min_chan_time
9576 \brief get neighbor scan min channel time
9577 \param hHal - The handle returned by mac_open.
9578 \param sessionId - Session Identifier
9579 \return uint16_t - channel min time value
9580 -------------------------------------------------------------------------*/
9581uint16_t sme_get_neighbor_scan_min_chan_time(tHalHandle hHal, uint8_t sessionId)
9582{
9583 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
9584 return pMac->roam.neighborRoamInfo[sessionId].cfgParams.
9585 minChannelScanTime;
9586}
9587
9588/* ---------------------------------------------------------------------------
9589 \fn sme_get_neighbor_roam_state
9590 \brief get neighbor roam state
9591 \param hHal - The handle returned by mac_open.
9592 \param sessionId - Session Identifier
9593 \return uint32_t - neighbor roam state
9594 -------------------------------------------------------------------------*/
9595uint32_t sme_get_neighbor_roam_state(tHalHandle hHal, uint8_t sessionId)
9596{
9597 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
9598 return pMac->roam.neighborRoamInfo[sessionId].neighborRoamState;
9599}
9600
9601/* ---------------------------------------------------------------------------
9602 \fn sme_get_current_roam_state
9603 \brief get current roam state
9604 \param hHal - The handle returned by mac_open.
9605 \param sessionId - Session Identifier
9606 \return uint32_t - current roam state
9607 -------------------------------------------------------------------------*/
9608uint32_t sme_get_current_roam_state(tHalHandle hHal, uint8_t sessionId)
9609{
9610 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
9611 return pMac->roam.curState[sessionId];
9612}
9613
9614/* ---------------------------------------------------------------------------
9615 \fn sme_get_current_roam_sub_state
9616 \brief get neighbor roam sub state
9617 \param hHal - The handle returned by mac_open.
9618 \param sessionId - Session Identifier
9619 \return uint32_t - current roam sub state
9620 -------------------------------------------------------------------------*/
9621uint32_t sme_get_current_roam_sub_state(tHalHandle hHal, uint8_t sessionId)
9622{
9623 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
9624 return pMac->roam.curSubState[sessionId];
9625}
9626
9627/* ---------------------------------------------------------------------------
9628 \fn sme_get_lim_sme_state
9629 \brief get Lim Sme state
9630 \param hHal - The handle returned by mac_open.
9631 \return uint32_t - Lim Sme state
9632 -------------------------------------------------------------------------*/
9633uint32_t sme_get_lim_sme_state(tHalHandle hHal)
9634{
9635 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
9636 return pMac->lim.gLimSmeState;
9637}
9638
9639/* ---------------------------------------------------------------------------
9640 \fn sme_get_lim_mlm_state
9641 \brief get Lim Mlm state
9642 \param hHal - The handle returned by mac_open.
9643 \return uint32_t - Lim Mlm state
9644 -------------------------------------------------------------------------*/
9645uint32_t sme_get_lim_mlm_state(tHalHandle hHal)
9646{
9647 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
9648 return pMac->lim.gLimMlmState;
9649}
9650
9651/* ---------------------------------------------------------------------------
9652 \fn sme_is_lim_session_valid
9653 \brief is Lim session valid
9654 \param hHal - The handle returned by mac_open.
9655 \param sessionId - Session Identifier
9656 \return bool - true or false
9657 -------------------------------------------------------------------------*/
9658bool sme_is_lim_session_valid(tHalHandle hHal, uint8_t sessionId)
9659{
9660 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Hanumantha Reddy Pothula589fd702015-11-17 15:25:16 +05309661
9662 if (sessionId > pMac->lim.maxBssId)
9663 return false;
9664
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009665 return pMac->lim.gpSession[sessionId].valid;
9666}
9667
9668/* ---------------------------------------------------------------------------
9669 \fn sme_get_lim_sme_session_state
9670 \brief get Lim Sme session state
9671 \param hHal - The handle returned by mac_open.
9672 \param sessionId - Session Identifier
9673 \return uint32_t - Lim Sme session state
9674 -------------------------------------------------------------------------*/
9675uint32_t sme_get_lim_sme_session_state(tHalHandle hHal, uint8_t sessionId)
9676{
9677 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
9678 return pMac->lim.gpSession[sessionId].limSmeState;
9679}
9680
9681/* ---------------------------------------------------------------------------
9682 \fn sme_get_lim_mlm_session_state
9683 \brief get Lim Mlm session state
9684 \param hHal - The handle returned by mac_open.
9685 \param sessionId - Session Identifier
9686 \return uint32_t - Lim Mlm session state
9687 -------------------------------------------------------------------------*/
9688uint32_t sme_get_lim_mlm_session_state(tHalHandle hHal, uint8_t sessionId)
9689{
9690 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
9691 return pMac->lim.gpSession[sessionId].limMlmState;
9692}
9693
9694/* ---------------------------------------------------------------------------
9695 \fn sme_get_neighbor_scan_max_chan_time
9696 \brief get neighbor scan max channel time
9697 \param hHal - The handle returned by mac_open.
9698 \param sessionId - Session Identifier
9699 \return uint16_t - channel max time value
9700 -------------------------------------------------------------------------*/
9701uint16_t sme_get_neighbor_scan_max_chan_time(tHalHandle hHal, uint8_t sessionId)
9702{
9703 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
9704 return pMac->roam.neighborRoamInfo[sessionId].cfgParams.
9705 maxChannelScanTime;
9706}
9707
9708/* ---------------------------------------------------------------------------
9709 \fn sme_set_neighbor_scan_period
9710 \brief Update nNeighborScanPeriod
9711 This function is called through dynamic setConfig callback function
9712 to configure nNeighborScanPeriod
9713 Usage: adb shell iwpriv wlan0 setConfig
9714 nNeighborScanPeriod=[0 .. 1000]
9715 \param hHal - HAL handle for device
9716 \param sessionId - Session Identifier
9717 \param nNeighborScanPeriod - neighbor scan period
9718 \- return Success or failure
9719 -------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309720QDF_STATUS sme_set_neighbor_scan_period(tHalHandle hHal, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009721 const uint16_t nNeighborScanPeriod)
9722{
9723 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309724 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009725 tCsrNeighborRoamConfig *pNeighborRoamConfig = NULL;
9726 tpCsrNeighborRoamControlInfo pNeighborRoamInfo = NULL;
9727
9728 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309729 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009730 pNeighborRoamConfig =
9731 &pMac->roam.configParam.neighborRoamConfig;
9732 pNeighborRoamInfo = &pMac->roam.neighborRoamInfo[sessionId];
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05309733 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009734 "LFR runtime successfully set neighbor scan period to %d"
9735 " - old value is %d - roam state is %s",
9736 nNeighborScanPeriod,
9737 pMac->roam.configParam.neighborRoamConfig.
9738 nNeighborScanTimerPeriod,
9739 mac_trace_get_neighbour_roam_state(pMac->roam.
9740 neighborRoamInfo
9741 [sessionId].
9742 neighborRoamState));
9743 pNeighborRoamConfig->nNeighborScanTimerPeriod =
9744 nNeighborScanPeriod;
9745 pNeighborRoamInfo->cfgParams.neighborScanPeriod =
9746 nNeighborScanPeriod;
9747 sme_release_global_lock(&pMac->sme);
9748 }
9749 if (pMac->roam.configParam.isRoamOffloadScanEnabled) {
9750 csr_roam_offload_scan(pMac, sessionId,
9751 ROAM_SCAN_OFFLOAD_UPDATE_CFG,
9752 REASON_SCAN_HOME_TIME_CHANGED);
9753 }
9754
9755 return status;
9756}
9757
9758/* ---------------------------------------------------------------------------
9759 \fn sme_get_neighbor_scan_period
9760 \brief get neighbor scan period
9761 \param hHal - The handle returned by mac_open.
9762 \param sessionId - Session Identifier
9763 \return uint16_t - neighbor scan period
9764 -------------------------------------------------------------------------*/
9765uint16_t sme_get_neighbor_scan_period(tHalHandle hHal, uint8_t sessionId)
9766{
9767 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
9768 return pMac->roam.neighborRoamInfo[sessionId].cfgParams.
9769 neighborScanPeriod;
9770}
9771
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009772
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009773
9774/*--------------------------------------------------------------------------
9775 \brief sme_get_roam_rssi_diff() - get Roam rssi diff
9776 This is a synchronous call
9777 \param hHal - The handle returned by mac_open.
9778 \return uint16_t - Rssi diff value
9779 \sa
9780 --------------------------------------------------------------------------*/
9781uint8_t sme_get_roam_rssi_diff(tHalHandle hHal)
9782{
9783 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
9784 return pMac->roam.configParam.RoamRssiDiff;
9785}
9786
9787/**
9788 * sme_change_roam_scan_channel_list() - to change scan channel list
9789 * @hHal: pointer HAL handle returned by mac_open
9790 * @sessionId: sme session id
9791 * @pChannelList: Output channel list
9792 * @numChannels: Output number of channels
9793 *
9794 * This routine is called to Change roam scan channel list.
9795 * This is a synchronous call
9796 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309797 * Return: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009798 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309799QDF_STATUS sme_change_roam_scan_channel_list(tHalHandle hHal, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009800 uint8_t *pChannelList,
9801 uint8_t numChannels)
9802{
9803 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309804 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009805 tpCsrNeighborRoamControlInfo pNeighborRoamInfo =
9806 &pMac->roam.neighborRoamInfo[sessionId];
9807 uint8_t oldChannelList[WNI_CFG_VALID_CHANNEL_LIST_LEN * 2] = { 0 };
9808 uint8_t newChannelList[WNI_CFG_VALID_CHANNEL_LIST_LEN * 2] = { 0 };
9809 uint8_t i = 0, j = 0;
9810 tCsrChannelInfo *chan_info;
9811
9812
9813 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309814 if (!QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009815 if (pMac->roam.configParam.isRoamOffloadScanEnabled)
9816 csr_roam_offload_scan(pMac, sessionId,
9817 ROAM_SCAN_OFFLOAD_UPDATE_CFG,
9818 REASON_CHANNEL_LIST_CHANGED);
9819 return status;
9820 }
9821 chan_info = &pNeighborRoamInfo->cfgParams.channelInfo;
9822
9823 if (NULL != chan_info->ChannelList) {
9824 for (i = 0; i < chan_info->numOfChannels; i++) {
9825 if (j < sizeof(oldChannelList))
9826 j += snprintf(oldChannelList + j,
9827 sizeof(oldChannelList) -
9828 j, "%d",
9829 chan_info->ChannelList[i]);
9830 else
9831 break;
9832 }
9833 }
9834 csr_flush_cfg_bg_scan_roam_channel_list(pMac, sessionId);
9835 csr_create_bg_scan_roam_channel_list(pMac, sessionId, pChannelList,
9836 numChannels);
9837 sme_set_roam_scan_control(hHal, sessionId, 1);
9838 if (NULL != chan_info->ChannelList) {
9839 j = 0;
9840 for (i = 0; i < chan_info->numOfChannels; i++) {
9841 if (j < sizeof(newChannelList))
9842 j += snprintf(newChannelList + j,
9843 sizeof(newChannelList) -
9844 j, " %d",
9845 chan_info->ChannelList[i]);
9846 else
9847 break;
9848 }
9849 }
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05309850 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009851 FL("LFR runtime successfully set roam scan channels to %s - old value is %s - roam state is %d"),
9852 newChannelList, oldChannelList,
9853 pMac->roam.neighborRoamInfo[sessionId].neighborRoamState);
9854 sme_release_global_lock(&pMac->sme);
9855
9856 if (pMac->roam.configParam.isRoamOffloadScanEnabled)
9857 csr_roam_offload_scan(pMac, sessionId,
9858 ROAM_SCAN_OFFLOAD_UPDATE_CFG,
9859 REASON_CHANNEL_LIST_CHANGED);
9860 return status;
9861}
9862
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009863/**
9864 * sme_get_roam_scan_channel_list() - To get roam scan channel list
9865 * @hHal: HAL pointer
9866 * @pChannelList: Output channel list
9867 * @pNumChannels: Output number of channels
9868 * @sessionId: Session Identifier
9869 *
9870 * To get roam scan channel list This is a synchronous call
9871 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309872 * Return: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009873 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309874QDF_STATUS sme_get_roam_scan_channel_list(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009875 uint8_t *pChannelList, uint8_t *pNumChannels,
9876 uint8_t sessionId)
9877{
9878 int i = 0;
9879 uint8_t *pOutPtr = pChannelList;
9880 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
9881 tpCsrNeighborRoamControlInfo pNeighborRoamInfo =
9882 &pMac->roam.neighborRoamInfo[sessionId];
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309883 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009884
9885 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309886 if (!QDF_IS_STATUS_SUCCESS(status))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009887 return status;
9888 if (NULL == pNeighborRoamInfo->cfgParams.channelInfo.ChannelList) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05309889 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_WARN,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009890 FL("Roam Scan channel list is NOT yet initialized"));
9891 *pNumChannels = 0;
9892 sme_release_global_lock(&pMac->sme);
9893 return status;
9894 }
9895
9896 *pNumChannels = pNeighborRoamInfo->cfgParams.channelInfo.numOfChannels;
9897 for (i = 0; i < (*pNumChannels); i++) {
9898 pOutPtr[i] =
9899 pNeighborRoamInfo->cfgParams.channelInfo.ChannelList[i];
9900 }
9901 pOutPtr[i] = '\0';
9902 sme_release_global_lock(&pMac->sme);
9903 return status;
9904}
9905
9906/*--------------------------------------------------------------------------
9907 \brief sme_get_is_ese_feature_enabled() - get ESE feature enabled or not
9908 This is a synchronuous call
9909 \param hHal - The handle returned by mac_open.
9910 \return true (1) - if the ESE feature is enabled
9911 false (0) - if feature is disabled (compile or runtime)
9912 \sa
9913 --------------------------------------------------------------------------*/
9914bool sme_get_is_ese_feature_enabled(tHalHandle hHal)
9915{
9916#ifdef FEATURE_WLAN_ESE
9917 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
9918 return csr_roam_is_ese_ini_feature_enabled(pMac);
9919#else
9920 return false;
9921#endif
9922}
9923
9924/*--------------------------------------------------------------------------
9925 \brief sme_get_wes_mode() - get WES Mode
9926 This is a synchronous call
9927 \param hHal - The handle returned by mac_open
9928 \return uint8_t - WES Mode Enabled(1)/Disabled(0)
9929 \sa
9930 --------------------------------------------------------------------------*/
9931bool sme_get_wes_mode(tHalHandle hHal)
9932{
9933 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
9934 return pMac->roam.configParam.isWESModeEnabled;
9935}
9936
9937/*--------------------------------------------------------------------------
9938 \brief sme_get_roam_scan_control() - get scan control
9939 This is a synchronous call
9940 \param hHal - The handle returned by mac_open.
9941 \return bool - Enabled(1)/Disabled(0)
9942 \sa
9943 --------------------------------------------------------------------------*/
9944bool sme_get_roam_scan_control(tHalHandle hHal)
9945{
9946 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
9947 return pMac->roam.configParam.nRoamScanControl;
9948}
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009949
9950/*--------------------------------------------------------------------------
9951 \brief sme_get_is_lfr_feature_enabled() - get LFR feature enabled or not
9952 This is a synchronuous call
9953 \param hHal - The handle returned by mac_open.
9954 \return true (1) - if the feature is enabled
9955 false (0) - if feature is disabled (compile or runtime)
9956 \sa
9957 --------------------------------------------------------------------------*/
9958bool sme_get_is_lfr_feature_enabled(tHalHandle hHal)
9959{
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009960 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
9961 return pMac->roam.configParam.isFastRoamIniFeatureEnabled;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009962}
9963
9964/*--------------------------------------------------------------------------
9965 \brief sme_get_is_ft_feature_enabled() - get FT feature enabled or not
9966 This is a synchronuous call
9967 \param hHal - The handle returned by mac_open.
9968 \return true (1) - if the feature is enabled
9969 false (0) - if feature is disabled (compile or runtime)
9970 \sa
9971 --------------------------------------------------------------------------*/
9972bool sme_get_is_ft_feature_enabled(tHalHandle hHal)
9973{
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009974 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
9975 return pMac->roam.configParam.isFastTransitionEnabled;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009976}
9977
9978/* ---------------------------------------------------------------------------
9979 \fn sme_is_feature_supported_by_fw
9980 \brief Check if an feature is enabled by FW
9981
9982 \param feattEnumValue - Enumeration value from placeHolderInCapBitmap
9983 \- return 1/0 (true/false)
9984 -------------------------------------------------------------------------*/
9985uint8_t sme_is_feature_supported_by_fw(uint8_t featEnumValue)
9986{
9987 return IS_FEATURE_SUPPORTED_BY_FW(featEnumValue);
9988}
9989
9990#ifdef FEATURE_WLAN_TDLS
9991
9992/* ---------------------------------------------------------------------------
9993 \fn sme_send_tdls_link_establish_params
9994 \brief API to send TDLS Peer Link Establishment Parameters.
9995
9996 \param peerMac - peer's Mac Adress.
9997 \param tdlsLinkEstablishParams - TDLS Peer Link Establishment Parameters
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05309998 \- return QDF_STATUS_SUCCES
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009999 -------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010000QDF_STATUS sme_send_tdls_link_establish_params(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010001 uint8_t sessionId,
10002 const tSirMacAddr peerMac,
10003 tCsrTdlsLinkEstablishParams *
10004 tdlsLinkEstablishParams)
10005{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010006 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010007 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
10008
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053010009 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Sreelakshmi Konamki6744cff2015-09-07 12:10:39 +053010010 TRACE_CODE_SME_RX_HDD_TDLS_LINK_ESTABLISH_PARAM,
10011 sessionId,
10012 tdlsLinkEstablishParams->isOffChannelSupported));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010013 status = sme_acquire_global_lock(&pMac->sme);
10014
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010015 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010016 status = csr_tdls_send_link_establish_params(hHal, sessionId,
10017 peerMac, tdlsLinkEstablishParams);
10018 sme_release_global_lock(&pMac->sme);
10019 }
10020 return status;
10021}
10022
10023/* ---------------------------------------------------------------------------
10024 \fn sme_send_tdls_mgmt_frame
10025 \brief API to send TDLS management frames.
10026
10027 \param peerMac - peer's Mac Adress.
10028 \param frame_type - Type of TDLS mgmt frame to be sent.
10029 \param dialog - dialog token used in the frame.
10030 \param status - status to be incuded in the frame.
10031 \param peerCapability - peer cpabilities
10032 \param buf - additional IEs to be included
10033 \param len - lenght of additional Ies
10034 \param responder - Tdls request type
Anurag Chouhanf04e84f2016-03-03 10:12:12 +053010035 \- return QDF_STATUS_SUCCES
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010036 -------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010037QDF_STATUS sme_send_tdls_mgmt_frame(tHalHandle hHal, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010038 const tSirMacAddr peerMac,
10039 uint8_t frame_type,
10040 uint8_t dialog, uint16_t statusCode,
10041 uint32_t peerCapability, uint8_t *buf,
10042 uint8_t len, uint8_t responder)
10043{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010044 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010045 tCsrTdlsSendMgmt sendTdlsReq = { {0} };
10046 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
10047
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053010048 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Sreelakshmi Konamki6744cff2015-09-07 12:10:39 +053010049 TRACE_CODE_SME_RX_HDD_TDLS_SEND_MGMT_FRAME,
10050 sessionId, statusCode));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010051 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010052 if (QDF_IS_STATUS_SUCCESS(status)) {
Anurag Chouhan600c3a02016-03-01 10:33:54 +053010053 qdf_mem_copy(sendTdlsReq.peerMac, peerMac, sizeof(tSirMacAddr));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010054 sendTdlsReq.frameType = frame_type;
10055 sendTdlsReq.buf = buf;
10056 sendTdlsReq.len = len;
10057 sendTdlsReq.dialog = dialog;
10058 sendTdlsReq.statusCode = statusCode;
10059 sendTdlsReq.responder = responder;
10060 sendTdlsReq.peerCapability = peerCapability;
10061
10062 status = csr_tdls_send_mgmt_req(hHal, sessionId, &sendTdlsReq);
10063
10064 sme_release_global_lock(&pMac->sme);
10065 }
10066
10067 return status;
10068
10069}
10070
10071/* ---------------------------------------------------------------------------
10072 \fn sme_change_tdls_peer_sta
10073 \brief API to Update TDLS peer sta parameters.
10074
10075 \param peerMac - peer's Mac Adress.
10076 \param staParams - Peer Station Parameters
Anurag Chouhanf04e84f2016-03-03 10:12:12 +053010077 \- return QDF_STATUS_SUCCES
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010078 -------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010079QDF_STATUS sme_change_tdls_peer_sta(tHalHandle hHal, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010080 const tSirMacAddr peerMac,
10081 tCsrStaParams *pstaParams)
10082{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010083 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010084 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
10085
10086 if (NULL == pstaParams) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053010087 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010088 "%s :pstaParams is NULL", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010089 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010090 }
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053010091 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Sreelakshmi Konamki6744cff2015-09-07 12:10:39 +053010092 TRACE_CODE_SME_RX_HDD_TDLS_CHANGE_PEER_STA,
10093 sessionId, pstaParams->capability));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010094 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010095 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010096 status = csr_tdls_change_peer_sta(hHal, sessionId, peerMac,
10097 pstaParams);
10098
10099 sme_release_global_lock(&pMac->sme);
10100 }
10101
10102 return status;
10103
10104}
10105
10106/* ---------------------------------------------------------------------------
10107 \fn sme_add_tdls_peer_sta
10108 \brief API to Add TDLS peer sta entry.
10109
10110 \param peerMac - peer's Mac Adress.
Anurag Chouhanf04e84f2016-03-03 10:12:12 +053010111 \- return QDF_STATUS_SUCCES
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010112 -------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010113QDF_STATUS sme_add_tdls_peer_sta(tHalHandle hHal, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010114 const tSirMacAddr peerMac)
10115{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010116 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010117 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
10118
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053010119 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Sreelakshmi Konamki6744cff2015-09-07 12:10:39 +053010120 TRACE_CODE_SME_RX_HDD_TDLS_ADD_PEER_STA,
10121 sessionId, 0));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010122 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010123 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010124 status = csr_tdls_add_peer_sta(hHal, sessionId, peerMac);
10125
10126 sme_release_global_lock(&pMac->sme);
10127 }
10128
10129 return status;
10130
10131}
10132
10133/* ---------------------------------------------------------------------------
10134 \fn sme_delete_tdls_peer_sta
10135 \brief API to Delete TDLS peer sta entry.
10136
10137 \param peerMac - peer's Mac Adress.
Anurag Chouhanf04e84f2016-03-03 10:12:12 +053010138 \- return QDF_STATUS_SUCCES
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010139 -------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010140QDF_STATUS sme_delete_tdls_peer_sta(tHalHandle hHal, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010141 const tSirMacAddr peerMac)
10142{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010143 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010144 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
10145
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053010146 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Sreelakshmi Konamki6744cff2015-09-07 12:10:39 +053010147 TRACE_CODE_SME_RX_HDD_TDLS_DEL_PEER_STA,
10148 sessionId, 0));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010149 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010150 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010151 status = csr_tdls_del_peer_sta(hHal, sessionId, peerMac);
10152
10153 sme_release_global_lock(&pMac->sme);
10154 }
10155
10156 return status;
10157
10158}
10159
10160/* ---------------------------------------------------------------------------
10161 \fn sme_set_tdls_power_save_prohibited
10162 \API to set/reset the is_tdls_power_save_prohibited.
10163
10164 \- return void
10165 -------------------------------------------------------------------------*/
10166void sme_set_tdls_power_save_prohibited(tHalHandle hHal, uint32_t sessionId,
10167 bool val)
10168{
10169 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
10170 struct ps_global_info *ps_global_info = &pMac->sme.ps_global_info;
10171 struct ps_params *ps_param = &ps_global_info->ps_params[sessionId];
10172 ps_param->is_tdls_power_save_prohibited = val;
10173 return;
10174}
10175
10176/* ---------------------------------------------------------------------------
10177 \fn sme_update_fw_tdls_state
10178
10179 \brief
10180 SME will send message to WMA to set TDLS state in f/w
10181
10182 \param
10183
10184 hHal - The handle returned by mac_open
10185
10186 psmeTdlsParams - TDLS state info to update in f/w
10187
10188 useSmeLock - Need to acquire SME Global Lock before state update or not
10189
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010190 \return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010191 --------------------------------------------------------------------------- */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010192QDF_STATUS sme_update_fw_tdls_state(tHalHandle hHal, void *psmeTdlsParams,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010193 bool useSmeLock)
10194{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010195 QDF_STATUS status = QDF_STATUS_SUCCESS;
10196 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010197 tpAniSirGlobal pMac = NULL;
10198 cds_msg_t cds_message;
10199
Mukul Sharmaeae172c2016-09-03 13:40:46 +053010200 pMac = PMAC_STRUCT(hHal);
10201 if (NULL == pMac) {
10202 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
10203 FL("pMac is Null"));
10204 return QDF_STATUS_E_FAILURE;
10205 }
10206
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010207 /* only acquire sme global lock before state update if asked to */
10208 if (useSmeLock) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010209 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010210 if (QDF_STATUS_SUCCESS != status)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010211 return status;
10212 }
10213
10214 /* serialize the req through MC thread */
10215 cds_message.bodyptr = psmeTdlsParams;
10216 cds_message.type = WMA_UPDATE_FW_TDLS_STATE;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010217 qdf_status = cds_mq_post_message(CDS_MQ_ID_WMA, &cds_message);
10218 if (!QDF_IS_STATUS_SUCCESS(qdf_status))
10219 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010220
10221 /* release the lock if it was acquired */
10222 if (useSmeLock)
10223 sme_release_global_lock(&pMac->sme);
10224
10225 return status;
10226}
10227
10228/**
10229 * sme_update_tdls_peer_state() - to update the state of TDLS peer
10230 * @hHal: The handle returned by mac_open
10231 * @peerStateParams: TDLS Peer state info to update in f/w
10232 *
10233 * SME will send message to WMA to set TDLS Peer state in f/w
10234 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010235 * Return: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010236 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010237QDF_STATUS sme_update_tdls_peer_state(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010238 tSmeTdlsPeerStateParams *peerStateParams)
10239{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010240 QDF_STATUS status = QDF_STATUS_SUCCESS;
10241 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010242 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
10243 tTdlsPeerStateParams *pTdlsPeerStateParams = NULL;
10244 tTdlsPeerCapParams *peer_cap = NULL;
10245 cds_msg_t cds_message;
10246 uint8_t num;
Kabilan Kannan44f65862016-06-28 23:46:51 -070010247 uint8_t peer_chan_len;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010248 uint8_t chanId;
10249 uint8_t i;
10250
10251 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010252 if (!QDF_IS_STATUS_SUCCESS(status))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010253 return status;
Anurag Chouhan600c3a02016-03-01 10:33:54 +053010254 pTdlsPeerStateParams = qdf_mem_malloc(sizeof(*pTdlsPeerStateParams));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010255 if (NULL == pTdlsPeerStateParams) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053010256 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010257 FL("failed to allocate mem for tdls peer state param"));
10258 sme_release_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010259 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010260 }
10261
Anurag Chouhan600c3a02016-03-01 10:33:54 +053010262 qdf_mem_zero(pTdlsPeerStateParams, sizeof(*pTdlsPeerStateParams));
10263 qdf_mem_copy(&pTdlsPeerStateParams->peerMacAddr,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010264 &peerStateParams->peerMacAddr, sizeof(tSirMacAddr));
10265 pTdlsPeerStateParams->vdevId = peerStateParams->vdevId;
10266 pTdlsPeerStateParams->peerState = peerStateParams->peerState;
10267
10268 switch (peerStateParams->peerState) {
10269 case eSME_TDLS_PEER_STATE_PEERING:
10270 pTdlsPeerStateParams->peerState =
10271 WMA_TDLS_PEER_STATE_PEERING;
10272 break;
10273
10274 case eSME_TDLS_PEER_STATE_CONNECTED:
10275 pTdlsPeerStateParams->peerState =
10276 WMA_TDLS_PEER_STATE_CONNECTED;
10277 break;
10278
10279 case eSME_TDLS_PEER_STATE_TEARDOWN:
10280 pTdlsPeerStateParams->peerState =
10281 WMA_TDLS_PEER_STATE_TEARDOWN;
10282 break;
10283
Kabilan Kannan421714b2015-11-23 04:44:59 -080010284 case eSME_TDLS_PEER_ADD_MAC_ADDR:
10285 pTdlsPeerStateParams->peerState = WMA_TDLS_PEER_ADD_MAC_ADDR;
10286 break;
10287
10288 case eSME_TDLS_PEER_REMOVE_MAC_ADDR:
10289 pTdlsPeerStateParams->peerState = WMA_TDLS_PEER_REMOVE_MAC_ADDR;
10290 break;
10291
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010292 default:
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053010293 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010294 FL("invalid peer state param (%d)"),
10295 peerStateParams->peerState);
Kabilan Kannan44f65862016-06-28 23:46:51 -070010296 goto error_return;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010297 }
10298 peer_cap = &(pTdlsPeerStateParams->peerCap);
10299 peer_cap->isPeerResponder =
10300 peerStateParams->peerCap.isPeerResponder;
10301 peer_cap->peerUapsdQueue =
10302 peerStateParams->peerCap.peerUapsdQueue;
10303 peer_cap->peerMaxSp =
10304 peerStateParams->peerCap.peerMaxSp;
10305 peer_cap->peerBuffStaSupport =
10306 peerStateParams->peerCap.peerBuffStaSupport;
10307 peer_cap->peerOffChanSupport =
10308 peerStateParams->peerCap.peerOffChanSupport;
10309 peer_cap->peerCurrOperClass =
10310 peerStateParams->peerCap.peerCurrOperClass;
10311 peer_cap->selfCurrOperClass =
10312 peerStateParams->peerCap.selfCurrOperClass;
10313
10314 num = 0;
Kabilan Kannan44f65862016-06-28 23:46:51 -070010315 peer_chan_len = peerStateParams->peerCap.peerChanLen;
10316
10317 if (peer_chan_len >= 0 &&
10318 peer_chan_len <= SME_TDLS_MAX_SUPP_CHANNELS) {
10319 for (i = 0; i < peerStateParams->peerCap.peerChanLen; i++) {
10320 chanId = peerStateParams->peerCap.peerChan[i];
10321 if (csr_roam_is_channel_valid(pMac, chanId) &&
10322 !(cds_get_channel_state(chanId) ==
10323 CHANNEL_STATE_DFS) &&
10324 !cds_is_dsrc_channel(cds_chan_to_freq(chanId))) {
10325 peer_cap->peerChan[num].chanId = chanId;
10326 peer_cap->peerChan[num].pwr =
10327 csr_get_cfg_max_tx_power(pMac, chanId);
10328 peer_cap->peerChan[num].dfsSet = false;
Archana Ramachandran63f64dd2016-04-28 15:13:35 -070010329 num++;
Kabilan Kannan44f65862016-06-28 23:46:51 -070010330 }
Archana Ramachandran63f64dd2016-04-28 15:13:35 -070010331 }
Kabilan Kannan44f65862016-06-28 23:46:51 -070010332 } else {
10333 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
10334 FL("invalid peer channel len (%d)"),
10335 peer_chan_len);
10336 goto error_return;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010337 }
Kabilan Kannan44f65862016-06-28 23:46:51 -070010338
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010339 peer_cap->peerChanLen = num;
10340 peer_cap->peerOperClassLen =
10341 peerStateParams->peerCap.peerOperClassLen;
10342 for (i = 0; i < HAL_TDLS_MAX_SUPP_OPER_CLASSES; i++) {
10343 peer_cap->peerOperClass[i] =
10344 peerStateParams->peerCap.peerOperClass[i];
10345 }
10346
10347 peer_cap->prefOffChanNum =
10348 peerStateParams->peerCap.prefOffChanNum;
10349 peer_cap->prefOffChanBandwidth =
10350 peerStateParams->peerCap.prefOffChanBandwidth;
Masti, Narayanraddic4a7ab82015-11-25 15:41:10 +053010351 peer_cap->opClassForPrefOffChan =
10352 peerStateParams->peerCap.opClassForPrefOffChan;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010353
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010354 cds_message.type = WMA_UPDATE_TDLS_PEER_STATE;
10355 cds_message.reserved = 0;
10356 cds_message.bodyptr = pTdlsPeerStateParams;
10357
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010358 qdf_status = cds_mq_post_message(CDS_MQ_ID_WMA, &cds_message);
10359 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
Kabilan Kannan44f65862016-06-28 23:46:51 -070010360 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
10361 FL("cds_mq_post_message failed "));
10362 goto error_return;
10363 } else {
10364 goto success_return;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010365 }
Kabilan Kannan44f65862016-06-28 23:46:51 -070010366
10367error_return:
10368 status = QDF_STATUS_E_FAILURE;
10369 qdf_mem_free(pTdlsPeerStateParams);
10370success_return:
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010371 sme_release_global_lock(&pMac->sme);
10372 return status;
10373}
10374
10375/**
10376 * sme_send_tdls_chan_switch_req() - send tdls channel switch request
10377 * @hal: UMAC handler
10378 * @ch_switch_params: Pointer to the chan switch parameter structure
10379 *
10380 * API to set tdls channel switch parameters.
10381 *
Anurag Chouhanf04e84f2016-03-03 10:12:12 +053010382 * Return: QDF_STATUS_SUCCESS on success; another QDF_STATUS_** code otherwise
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010383 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010384QDF_STATUS sme_send_tdls_chan_switch_req(tHalHandle hal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010385 sme_tdls_chan_switch_params *ch_switch_params)
10386{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010387 QDF_STATUS status = QDF_STATUS_SUCCESS;
10388 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010389 tpAniSirGlobal mac = PMAC_STRUCT(hal);
10390 tdls_chan_switch_params *chan_switch_params = NULL;
10391 cds_msg_t cds_message;
10392
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053010393 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Sreelakshmi Konamki6744cff2015-09-07 12:10:39 +053010394 TRACE_CODE_SME_RX_HDD_TDLS_CHAN_SWITCH_REQ,
10395 NO_SESSION, ch_switch_params->tdls_off_channel));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010396 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010397 if (QDF_STATUS_SUCCESS != status)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010398 return status;
Anurag Chouhan600c3a02016-03-01 10:33:54 +053010399 chan_switch_params = qdf_mem_malloc(sizeof(*chan_switch_params));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010400 if (NULL == chan_switch_params) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053010401 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010402 FL("fail to alloc mem for tdls chan switch param"));
10403 sme_release_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010404 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010405 }
Anurag Chouhan600c3a02016-03-01 10:33:54 +053010406 qdf_mem_zero(chan_switch_params, sizeof(*chan_switch_params));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010407
10408 switch (ch_switch_params->tdls_off_ch_mode) {
10409 case ENABLE_CHANSWITCH:
10410 chan_switch_params->tdls_sw_mode = WMA_TDLS_ENABLE_OFFCHANNEL;
10411 break;
10412
10413 case DISABLE_CHANSWITCH:
10414 chan_switch_params->tdls_sw_mode = WMA_TDLS_DISABLE_OFFCHANNEL;
10415 break;
10416
10417 default:
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053010418 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010419 FL("invalid off channel command (%d)"),
10420 ch_switch_params->tdls_off_ch_mode);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053010421 qdf_mem_free(chan_switch_params);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010422 sme_release_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010423 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010424 }
10425
Anurag Chouhan600c3a02016-03-01 10:33:54 +053010426 qdf_mem_copy(&chan_switch_params->peer_mac_addr,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010427 &ch_switch_params->peer_mac_addr, sizeof(tSirMacAddr));
10428 chan_switch_params->vdev_id = ch_switch_params->vdev_id;
10429 chan_switch_params->tdls_off_ch = ch_switch_params->tdls_off_channel;
10430 chan_switch_params->tdls_off_ch_bw_offset =
10431 ch_switch_params->tdls_off_ch_bw_offset;
10432 chan_switch_params->is_responder = ch_switch_params->is_responder;
Masti, Narayanraddic4a7ab82015-11-25 15:41:10 +053010433 chan_switch_params->oper_class = ch_switch_params->opclass;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010434
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053010435 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010436 FL("Country Code=%s, Req offset=%d, Selected Operate Class=%d"),
10437 mac->scan.countryCodeCurrent,
10438 chan_switch_params->tdls_off_ch_bw_offset,
10439 chan_switch_params->oper_class);
10440
10441 cds_message.type = WMA_TDLS_SET_OFFCHAN_MODE;
10442 cds_message.reserved = 0;
10443 cds_message.bodyptr = chan_switch_params;
10444
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010445 qdf_status = cds_mq_post_message(CDS_MQ_ID_WMA, &cds_message);
10446 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053010447 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010448 FL("Message Post failed status=%d"),
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010449 qdf_status);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053010450 qdf_mem_free(chan_switch_params);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010451 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010452 }
10453 sme_release_global_lock(&mac->sme);
10454 return status;
10455}
10456#endif /* FEATURE_WLAN_TDLS */
10457
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010458QDF_STATUS sme_get_link_speed(tHalHandle hHal, tSirLinkSpeedInfo *lsReq,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010459 void *plsContext,
10460 void (*pCallbackfn)(tSirLinkSpeedInfo *indParam,
10461 void *pContext))
10462{
10463
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010464 QDF_STATUS status = QDF_STATUS_SUCCESS;
10465 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010466 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
10467 cds_msg_t cds_message;
10468
10469 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010470 if (QDF_STATUS_SUCCESS == status) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010471 if ((NULL == pCallbackfn) &&
10472 (NULL == pMac->sme.pLinkSpeedIndCb)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053010473 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010474 "%s: Indication Call back did not registered",
10475 __func__);
10476 sme_release_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010477 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010478 } else if (NULL != pCallbackfn) {
10479 pMac->sme.pLinkSpeedCbContext = plsContext;
10480 pMac->sme.pLinkSpeedIndCb = pCallbackfn;
10481 }
10482 /* serialize the req through MC thread */
10483 cds_message.bodyptr = lsReq;
10484 cds_message.type = WMA_GET_LINK_SPEED;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010485 qdf_status = cds_mq_post_message(CDS_MQ_ID_WMA, &cds_message);
10486 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053010487 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010488 "%s: Post Link Speed msg fail", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010489 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010490 }
10491 sme_release_global_lock(&pMac->sme);
10492 }
10493 return status;
10494}
10495
10496
10497/*
10498 * SME API to enable/disable WLAN driver initiated SSR
10499 */
10500void sme_update_enable_ssr(tHalHandle hHal, bool enableSSR)
10501{
10502 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010503 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010504
10505 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010506 if (QDF_IS_STATUS_SUCCESS(status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053010507 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010508 "SSR level is changed %d", enableSSR);
10509 /* not serializing this messsage, as this is only going
10510 * to set a variable in WMA/WDI
10511 */
10512 WMA_SetEnableSSR(enableSSR);
10513 sme_release_global_lock(&pMac->sme);
10514 }
10515 return;
10516}
10517
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010518QDF_STATUS sme_check_ch_in_band(tpAniSirGlobal mac_ctx, uint8_t start_ch,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010519 uint8_t ch_cnt)
10520{
10521 uint8_t i;
10522 for (i = 0; i < ch_cnt; i++) {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010523 if (QDF_STATUS_SUCCESS != csr_is_valid_channel(mac_ctx,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010524 (start_ch + i*4)))
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010525 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010526 }
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010527 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010528}
10529
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010530/*convert the ini value to the ENUM used in csr and MAC for CB state*/
10531ePhyChanBondState sme_get_cb_phy_state_from_cb_ini_value(uint32_t cb_ini_value)
10532{
10533 return csr_convert_cb_ini_value_to_phy_cb_state(cb_ini_value);
10534}
10535
10536/*--------------------------------------------------------------------------
10537
10538 \brief sme_set_curr_device_mode() - Sets the current operating device mode.
10539 \param hHal - The handle returned by mac_open.
10540 \param currDeviceMode - Current operating device mode.
10541 --------------------------------------------------------------------------*/
10542
Peng Xuf5d60c82015-10-02 17:17:03 -070010543void sme_set_curr_device_mode(tHalHandle hHal,
Anurag Chouhan6d760662016-02-20 16:05:43 +053010544 enum tQDF_ADAPTER_MODE currDeviceMode)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010545{
10546 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
10547 pMac->sme.currDeviceMode = currDeviceMode;
10548 return;
10549}
10550
10551/*--------------------------------------------------------------------------
10552 \brief sme_handoff_request() - a wrapper function to Request a handoff
10553 from CSR.
10554 This is a synchronous call
10555 \param hHal - The handle returned by mac_open
10556 \param sessionId - Session Identifier
10557 \param pHandoffInfo - info provided by HDD with the handoff request (namely:
10558 BSSID, channel etc.)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010559 \return QDF_STATUS_SUCCESS - SME passed the request to CSR successfully.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010560 Other status means SME is failed to send the request.
10561 \sa
10562 --------------------------------------------------------------------------*/
10563
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010564QDF_STATUS sme_handoff_request(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010565 uint8_t sessionId,
10566 tCsrHandoffRequest *pHandoffInfo)
10567{
10568 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010569 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010570
10571 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010572 if (QDF_IS_STATUS_SUCCESS(status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053010573 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010574 "%s: invoked", __func__);
10575 status = csr_handoff_request(pMac, sessionId, pHandoffInfo);
10576 sme_release_global_lock(&pMac->sme);
10577 }
10578
10579 return status;
10580}
10581
10582#ifdef IPA_OFFLOAD
10583/* ---------------------------------------------------------------------------
10584 \fn sme_ipa_offload_enable_disable
10585 \brief API to enable/disable IPA offload
10586 \param hal - The handle returned by macOpen.
10587 \param session_id - Session Identifier
10588 \param request - Pointer to the offload request.
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010589 \return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010590 ---------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010591QDF_STATUS sme_ipa_offload_enable_disable(tHalHandle hal, uint8_t session_id,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010592 struct sir_ipa_offload_enable_disable *request)
10593{
10594 tpAniSirGlobal pMac = PMAC_STRUCT(hal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010595 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010596 struct sir_ipa_offload_enable_disable *request_buf;
10597 cds_msg_t msg;
10598
10599 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010600 if (QDF_STATUS_SUCCESS == status) {
Anurag Chouhan600c3a02016-03-01 10:33:54 +053010601 request_buf = qdf_mem_malloc(sizeof(*request_buf));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010602 if (NULL == request_buf) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053010603 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010604 FL("Not able to allocate memory for \
10605 IPA_OFFLOAD_ENABLE_DISABLE"));
10606 sme_release_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010607 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010608 }
10609
10610 request_buf->offload_type = request->offload_type;
10611 request_buf->vdev_id = request->vdev_id;
10612 request_buf->enable = request->enable;
10613
10614 msg.type = WMA_IPA_OFFLOAD_ENABLE_DISABLE;
10615 msg.reserved = 0;
10616 msg.bodyptr = request_buf;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010617 if (!QDF_IS_STATUS_SUCCESS(
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010618 cds_mq_post_message(CDS_MQ_ID_WMA, &msg))) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053010619 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010620 FL("Not able to post WMA_IPA_OFFLOAD_\
10621 ENABLE_DISABLE message to WMA"));
Anurag Chouhan600c3a02016-03-01 10:33:54 +053010622 qdf_mem_free(request_buf);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010623 sme_release_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010624 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010625 }
10626
10627 sme_release_global_lock(&pMac->sme);
10628 }
10629
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010630 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010631}
10632#endif /* IPA_OFFLOAD */
10633
10634/*
10635 * SME API to check if there is any infra station or
10636 * P2P client is connected
10637 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010638QDF_STATUS sme_is_sta_p2p_client_connected(tHalHandle hHal)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010639{
10640 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
10641 if (csr_is_infra_connected(pMac)) {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010642 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010643 }
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010644 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010645}
10646
10647#ifdef FEATURE_WLAN_LPHB
10648/* ---------------------------------------------------------------------------
10649 \fn sme_lphb_config_req
10650 \API to make configuration LPHB within FW.
10651 \param hHal - The handle returned by mac_open
10652 \param lphdReq - LPHB request argument by client
10653 \param pCallbackfn - LPHB timeout notification callback function pointer
10654 \- return Configuration message posting status, SUCCESS or Fail
10655 -------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010656QDF_STATUS sme_lphb_config_req
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010657 (tHalHandle hHal,
10658 tSirLPHBReq *lphdReq,
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010659 void (*pCallbackfn)(void *pHddCtx, tSirLPHBInd * indParam)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010660 ) {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010661 QDF_STATUS status = QDF_STATUS_SUCCESS;
10662 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010663 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
10664 cds_msg_t cds_message;
10665
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053010666 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Sreelakshmi Konamki6744cff2015-09-07 12:10:39 +053010667 TRACE_CODE_SME_RX_HDD_LPHB_CONFIG_REQ,
10668 NO_SESSION, lphdReq->cmd));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010669 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010670 if (QDF_STATUS_SUCCESS == status) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010671 if ((LPHB_SET_EN_PARAMS_INDID == lphdReq->cmd) &&
10672 (NULL == pCallbackfn) && (NULL == pMac->sme.pLphbIndCb)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053010673 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010674 "%s: Indication Call back did not registered",
10675 __func__);
10676 sme_release_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010677 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010678 } else if (NULL != pCallbackfn) {
10679 pMac->sme.pLphbIndCb = pCallbackfn;
10680 }
10681
10682 /* serialize the req through MC thread */
10683 cds_message.bodyptr = lphdReq;
10684 cds_message.type = WMA_LPHB_CONF_REQ;
Sreelakshmi Konamki6a065362016-05-31 16:05:01 +053010685 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
10686 NO_SESSION, cds_message.type));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010687 qdf_status = cds_mq_post_message(CDS_MQ_ID_WMA, &cds_message);
10688 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053010689 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010690 "%s: Post Config LPHB MSG fail", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010691 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010692 }
10693 sme_release_global_lock(&pMac->sme);
10694 }
10695
10696 return status;
10697}
10698#endif /* FEATURE_WLAN_LPHB */
10699/*--------------------------------------------------------------------------
10700 \brief sme_enable_disable_split_scan() - a wrapper function to set the split
10701 scan parameter.
10702 This is a synchronous call
10703 \param hHal - The handle returned by mac_open
10704 \return NONE.
10705 \sa
10706 --------------------------------------------------------------------------*/
10707void sme_enable_disable_split_scan(tHalHandle hHal, uint8_t nNumStaChan,
10708 uint8_t nNumP2PChan)
10709{
10710 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
10711
10712 pMac->roam.configParam.nNumStaChanCombinedConc = nNumStaChan;
10713 pMac->roam.configParam.nNumP2PChanCombinedConc = nNumP2PChan;
10714
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053010715 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010716 "%s: SCAN nNumStaChanCombinedConc : %d,"
10717 "nNumP2PChanCombinedConc : %d ",
10718 __func__, nNumStaChan, nNumP2PChan);
10719
10720 return;
10721
10722}
10723
10724/**
10725 * sme_add_periodic_tx_ptrn() - Add Periodic TX Pattern
10726 * @hal: global hal handle
10727 * @addPeriodicTxPtrnParams: request message
10728 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010729 * Return: QDF_STATUS enumeration
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010730 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010731QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010732sme_add_periodic_tx_ptrn(tHalHandle hal,
10733 struct sSirAddPeriodicTxPtrn *addPeriodicTxPtrnParams)
10734{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010735 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010736 tpAniSirGlobal mac = PMAC_STRUCT(hal);
10737 struct sSirAddPeriodicTxPtrn *req_msg;
10738 cds_msg_t msg;
10739
10740 sms_log(mac, LOG1, FL("enter"));
10741
Anurag Chouhan600c3a02016-03-01 10:33:54 +053010742 req_msg = qdf_mem_malloc(sizeof(*req_msg));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010743 if (!req_msg) {
10744 sms_log(mac, LOGE, FL("memory allocation failed"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010745 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010746 }
10747
10748 *req_msg = *addPeriodicTxPtrnParams;
10749
10750 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010751 if (!QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010752 sms_log(mac, LOGE,
10753 FL("sme_acquire_global_lock failed!(status=%d)"),
10754 status);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053010755 qdf_mem_free(req_msg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010756 return status;
10757 }
10758
10759 /* Serialize the req through MC thread */
10760 msg.bodyptr = req_msg;
10761 msg.type = WMA_ADD_PERIODIC_TX_PTRN_IND;
Sreelakshmi Konamki6a065362016-05-31 16:05:01 +053010762 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
10763 NO_SESSION, msg.type));
Anurag Chouhan6d760662016-02-20 16:05:43 +053010764 status = cds_mq_post_message(QDF_MODULE_ID_WMA, &msg);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010765 if (!QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010766 sms_log(mac, LOGE,
10767 FL("cds_mq_post_message failed!(err=%d)"),
10768 status);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053010769 qdf_mem_free(req_msg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010770 }
10771 sme_release_global_lock(&mac->sme);
10772 return status;
10773}
10774
10775/**
10776 * sme_del_periodic_tx_ptrn() - Delete Periodic TX Pattern
10777 * @hal: global hal handle
10778 * @delPeriodicTxPtrnParams: request message
10779 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010780 * Return: QDF_STATUS enumeration
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010781 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010782QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010783sme_del_periodic_tx_ptrn(tHalHandle hal,
10784 struct sSirDelPeriodicTxPtrn *delPeriodicTxPtrnParams)
10785{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010786 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010787 tpAniSirGlobal mac = PMAC_STRUCT(hal);
10788 struct sSirDelPeriodicTxPtrn *req_msg;
10789 cds_msg_t msg;
10790
10791 sms_log(mac, LOG1, FL("enter"));
10792
Anurag Chouhan600c3a02016-03-01 10:33:54 +053010793 req_msg = qdf_mem_malloc(sizeof(*req_msg));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010794 if (!req_msg) {
10795 sms_log(mac, LOGE, FL("memory allocation failed"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010796 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010797 }
10798
10799 *req_msg = *delPeriodicTxPtrnParams;
10800
10801 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010802 if (!QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010803 sms_log(mac, LOGE,
10804 FL("sme_acquire_global_lock failed!(status=%d)"),
10805 status);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053010806 qdf_mem_free(req_msg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010807 return status;
10808 }
10809
10810 /* Serialize the req through MC thread */
10811 msg.bodyptr = req_msg;
10812 msg.type = WMA_DEL_PERIODIC_TX_PTRN_IND;
Sreelakshmi Konamki6a065362016-05-31 16:05:01 +053010813 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
10814 NO_SESSION, msg.type));
Anurag Chouhan6d760662016-02-20 16:05:43 +053010815 status = cds_mq_post_message(QDF_MODULE_ID_WMA, &msg);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010816 if (!QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010817 sms_log(mac, LOGE,
10818 FL("cds_mq_post_message failed!(err=%d)"),
10819 status);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053010820 qdf_mem_free(req_msg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010821 }
10822 sme_release_global_lock(&mac->sme);
10823 return status;
10824}
10825
Rajeev Kumar8e3e2832015-11-06 16:02:54 -080010826/**
10827 * sme_enable_rmc() - enables RMC
10828 * @hHal : Pointer to global HAL handle
10829 * @sessionId : Session ID
10830 *
10831 * Return: QDF_STATUS
10832 */
10833QDF_STATUS sme_enable_rmc(tHalHandle hHal, uint32_t sessionId)
10834{
10835 QDF_STATUS status = QDF_STATUS_E_FAILURE;
10836 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
10837 cds_msg_t cds_message;
10838 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
10839
10840 sms_log(pMac, LOG1, FL("enable RMC"));
10841 status = sme_acquire_global_lock(&pMac->sme);
10842 if (QDF_IS_STATUS_SUCCESS(status)) {
10843 cds_message.bodyptr = NULL;
10844 cds_message.type = WMA_RMC_ENABLE_IND;
10845 qdf_status = cds_mq_post_message(CDS_MQ_ID_WMA, &cds_message);
10846 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
10847 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
10848 "%s: failed to post message to WMA",
10849 __func__);
10850 status = QDF_STATUS_E_FAILURE;
10851 }
10852 sme_release_global_lock(&pMac->sme);
10853 }
10854 return status;
10855}
10856
10857/**
10858 * sme_disable_rmc() - disables RMC
10859 * @hHal : Pointer to global HAL handle
10860 * @sessionId : Session ID
10861 *
10862 * Return: QDF_STATUS
10863 */
10864QDF_STATUS sme_disable_rmc(tHalHandle hHal, uint32_t sessionId)
10865{
10866 QDF_STATUS status = QDF_STATUS_E_FAILURE;
10867 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
10868 cds_msg_t cds_message;
10869 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
10870
10871 sms_log(pMac, LOG1, FL("disable RMC"));
10872 status = sme_acquire_global_lock(&pMac->sme);
10873 if (QDF_IS_STATUS_SUCCESS(status)) {
10874 cds_message.bodyptr = NULL;
10875 cds_message.type = WMA_RMC_DISABLE_IND;
10876 qdf_status = cds_mq_post_message(CDS_MQ_ID_WMA, &cds_message);
10877 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
10878 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
10879 "%s: failed to post message to WMA",
10880 __func__);
10881 status = QDF_STATUS_E_FAILURE;
10882 }
10883 sme_release_global_lock(&pMac->sme);
10884 }
10885 return status;
10886}
10887
10888/**
10889 * sme_send_rmc_action_period() - sends RMC action period param to target
10890 * @hHal : Pointer to global HAL handle
10891 * @sessionId : Session ID
10892 *
10893 * Return: QDF_STATUS
10894 */
10895QDF_STATUS sme_send_rmc_action_period(tHalHandle hHal, uint32_t sessionId)
10896{
10897 QDF_STATUS status = QDF_STATUS_SUCCESS;
10898 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
10899 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
10900 cds_msg_t cds_message;
10901
10902 status = sme_acquire_global_lock(&pMac->sme);
10903 if (QDF_STATUS_SUCCESS == status) {
10904 cds_message.bodyptr = NULL;
10905 cds_message.type = WMA_RMC_ACTION_PERIOD_IND;
10906 qdf_status = cds_mq_post_message(CDS_MQ_ID_WMA, &cds_message);
10907 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
10908 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
10909 "%s: failed to post message to WMA",
10910 __func__);
10911 status = QDF_STATUS_E_FAILURE;
10912 }
10913 sme_release_global_lock(&pMac->sme);
10914 }
10915
10916 return status;
10917}
10918
10919/**
10920 * sme_request_ibss_peer_info() - request ibss peer info
10921 * @hHal : Pointer to global HAL handle
10922 * @pUserData : Pointer to user data
10923 * @peerInfoCbk : Peer info callback
10924 * @allPeerInfoReqd : All peer info required or not
10925 * @staIdx : sta index
10926 *
10927 * Return: QDF_STATUS
10928 */
10929QDF_STATUS sme_request_ibss_peer_info(tHalHandle hHal, void *pUserData,
10930 pIbssPeerInfoCb peerInfoCbk,
10931 bool allPeerInfoReqd, uint8_t staIdx)
10932{
10933 QDF_STATUS status = QDF_STATUS_E_FAILURE;
10934 QDF_STATUS qdf_status = QDF_STATUS_E_FAILURE;
10935 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
10936 cds_msg_t cds_message;
10937 tSirIbssGetPeerInfoReqParams *pIbssInfoReqParams;
10938
10939 status = sme_acquire_global_lock(&pMac->sme);
10940 if (QDF_STATUS_SUCCESS == status) {
10941 pMac->sme.peerInfoParams.peerInfoCbk = peerInfoCbk;
10942 pMac->sme.peerInfoParams.pUserData = pUserData;
10943
10944 pIbssInfoReqParams = (tSirIbssGetPeerInfoReqParams *)
10945 qdf_mem_malloc(sizeof(tSirIbssGetPeerInfoReqParams));
10946 if (NULL == pIbssInfoReqParams) {
10947 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
10948 "%s: Not able to allocate memory for dhcp start",
10949 __func__);
10950 sme_release_global_lock(&pMac->sme);
10951 return QDF_STATUS_E_NOMEM;
10952 }
10953 pIbssInfoReqParams->allPeerInfoReqd = allPeerInfoReqd;
10954 pIbssInfoReqParams->staIdx = staIdx;
10955
10956 cds_message.type = WMA_GET_IBSS_PEER_INFO_REQ;
10957 cds_message.bodyptr = pIbssInfoReqParams;
10958 cds_message.reserved = 0;
10959
10960 qdf_status = cds_mq_post_message(CDS_MQ_ID_WMA, &cds_message);
10961 if (QDF_STATUS_SUCCESS != qdf_status) {
10962 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
10963 "%s: Post WMA_GET_IBSS_PEER_INFO_REQ MSG failed",
10964 __func__);
10965 qdf_mem_free(pIbssInfoReqParams);
10966 qdf_status = QDF_STATUS_E_FAILURE;
10967 }
10968 sme_release_global_lock(&pMac->sme);
10969 }
10970
10971 return qdf_status;
10972}
10973
10974/* ---------------------------------------------------------------------------
10975 \fn sme_send_cesium_enable_ind
10976 \brief Used to send proprietary cesium enable indication to fw
10977 \param hHal
10978 \param sessionId
10979 \- return QDF_STATUS
10980 -------------------------------------------------------------------------*/
10981QDF_STATUS sme_send_cesium_enable_ind(tHalHandle hHal, uint32_t sessionId)
10982{
10983 QDF_STATUS status = QDF_STATUS_SUCCESS;
10984 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
10985 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
10986 cds_msg_t cds_message;
10987
10988 status = sme_acquire_global_lock(&pMac->sme);
10989 if (QDF_STATUS_SUCCESS == status) {
10990 cds_message.bodyptr = NULL;
10991 cds_message.type = WMA_IBSS_CESIUM_ENABLE_IND;
10992 qdf_status = cds_mq_post_message(CDS_MQ_ID_WMA, &cds_message);
10993 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
10994 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
10995 "%s: failed to post message to WMA",
10996 __func__);
10997 status = QDF_STATUS_E_FAILURE;
10998 }
10999 sme_release_global_lock(&pMac->sme);
11000 }
11001
11002 return status;
11003}
11004
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011005void sme_get_command_q_status(tHalHandle hHal)
11006{
11007 tSmeCmd *pTempCmd = NULL;
11008 tListElem *pEntry;
11009 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
11010
11011 if (NULL == pMac) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053011012 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011013 "%s: pMac is NULL", __func__);
11014 return;
11015 }
11016
11017 pEntry = csr_ll_peek_head(&pMac->sme.smeCmdActiveList, LL_ACCESS_LOCK);
11018 if (pEntry) {
11019 pTempCmd = GET_BASE_ADDR(pEntry, tSmeCmd, Link);
11020 }
11021 sms_log(pMac, LOGE, "Currently smeCmdActiveList has command (0x%X)",
11022 (pTempCmd) ? pTempCmd->command : eSmeNoCommand);
11023 if (pTempCmd) {
11024 if (eSmeCsrCommandMask & pTempCmd->command) {
11025 /* CSR command is stuck. See what the reason code is for that command */
11026 dump_csr_command_info(pMac, pTempCmd);
11027 }
11028 } /* if(pTempCmd) */
11029
11030 sms_log(pMac, LOGE, "Currently smeCmdPendingList has %d commands",
11031 csr_ll_count(&pMac->sme.smeCmdPendingList));
11032
11033 sms_log(pMac, LOGE, "Currently roamCmdPendingList has %d commands",
11034 csr_ll_count(&pMac->roam.roamCmdPendingList));
11035
11036 return;
11037}
11038
11039/**
11040 * sme_set_dot11p_config() - API to set the 802.11p config
11041 * @hHal: The handle returned by macOpen
11042 * @enable_dot11p: 802.11p config param
11043 */
11044void sme_set_dot11p_config(tHalHandle hHal, bool enable_dot11p)
11045{
11046 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
11047 pMac->enable_dot11p = enable_dot11p;
11048}
11049
11050/**
11051 * copy_sir_ocb_config() - Performs deep copy of an OCB configuration
11052 * @src: the source configuration
11053 *
11054 * Return: pointer to the copied OCB configuration
11055 */
11056static struct sir_ocb_config *sme_copy_sir_ocb_config(
11057 struct sir_ocb_config *src)
11058{
11059 struct sir_ocb_config *dst;
11060 uint32_t length;
11061 void *cursor;
11062
11063 length = sizeof(*src) +
11064 src->channel_count * sizeof(*src->channels) +
11065 src->schedule_size * sizeof(*src->schedule) +
11066 src->dcc_ndl_chan_list_len +
11067 src->dcc_ndl_active_state_list_len;
11068
Anurag Chouhan600c3a02016-03-01 10:33:54 +053011069 dst = qdf_mem_malloc(length);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011070 if (!dst)
11071 return NULL;
11072
11073 *dst = *src;
11074
11075 cursor = dst;
11076 cursor += sizeof(*dst);
11077 dst->channels = cursor;
11078 cursor += src->channel_count * sizeof(*src->channels);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053011079 qdf_mem_copy(dst->channels, src->channels,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011080 src->channel_count * sizeof(*src->channels));
11081 dst->schedule = cursor;
11082 cursor += src->schedule_size * sizeof(*src->schedule);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053011083 qdf_mem_copy(dst->schedule, src->schedule,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011084 src->schedule_size * sizeof(*src->schedule));
11085 dst->dcc_ndl_chan_list = cursor;
11086 cursor += src->dcc_ndl_chan_list_len;
Anurag Chouhan600c3a02016-03-01 10:33:54 +053011087 qdf_mem_copy(dst->dcc_ndl_chan_list, src->dcc_ndl_chan_list,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011088 src->dcc_ndl_chan_list_len);
11089 dst->dcc_ndl_active_state_list = cursor;
11090 cursor += src->dcc_ndl_active_state_list_len;
Anurag Chouhan600c3a02016-03-01 10:33:54 +053011091 qdf_mem_copy(dst->dcc_ndl_active_state_list,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011092 src->dcc_ndl_active_state_list,
11093 src->dcc_ndl_active_state_list_len);
11094 return dst;
11095}
11096
11097/**
11098 * sme_ocb_set_config() - Set the OCB configuration
11099 * @hHal: reference to the HAL
11100 * @context: the context of the call
11101 * @callback: the callback to hdd
11102 * @config: the OCB configuration
11103 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011104 * Return: QDF_STATUS_SUCCESS on success, QDF_STATUS_E_FAILURE on failure
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011105 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011106QDF_STATUS sme_ocb_set_config(tHalHandle hHal, void *context,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011107 ocb_callback callback,
11108 struct sir_ocb_config *config)
11109{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011110 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011111 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
11112 cds_msg_t msg = {0};
11113 struct sir_ocb_config *msg_body;
11114
11115 /* Lock the SME structure */
11116 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011117 if (!QDF_IS_STATUS_SUCCESS(status))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011118 return status;
11119
11120 /*
11121 * Check if there is a pending request and return an error if one
11122 * exists
11123 */
11124 if (pMac->sme.ocb_set_config_callback) {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011125 status = QDF_STATUS_E_BUSY;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011126 goto end;
11127 }
11128
11129 msg_body = sme_copy_sir_ocb_config(config);
11130
11131 if (!msg_body) {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011132 status = QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011133 goto end;
11134 }
11135
11136 msg.type = WMA_OCB_SET_CONFIG_CMD;
11137 msg.bodyptr = msg_body;
11138
11139 /* Set the request callback and context */
11140 pMac->sme.ocb_set_config_callback = callback;
11141 pMac->sme.ocb_set_config_context = context;
11142
Anurag Chouhan6d760662016-02-20 16:05:43 +053011143 status = cds_mq_post_message(QDF_MODULE_ID_WMA, &msg);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011144 if (!QDF_IS_STATUS_SUCCESS(status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053011145 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011146 FL("Error posting message to WDA: %d"), status);
11147 pMac->sme.ocb_set_config_callback = callback;
11148 pMac->sme.ocb_set_config_context = context;
Anurag Chouhan600c3a02016-03-01 10:33:54 +053011149 qdf_mem_free(msg_body);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011150 goto end;
11151 }
11152
11153end:
11154 sme_release_global_lock(&pMac->sme);
11155
11156 return status;
11157}
11158
11159/**
11160 * sme_ocb_set_utc_time() - Set the OCB UTC time
11161 * @hHal: reference to the HAL
11162 * @utc: the UTC time struct
11163 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011164 * Return: QDF_STATUS_SUCCESS on success, QDF_STATUS_E_FAILURE on failure
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011165 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011166QDF_STATUS sme_ocb_set_utc_time(tHalHandle hHal, struct sir_ocb_utc *utc)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011167{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011168 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011169 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
11170 cds_msg_t msg = {0};
11171 struct sir_ocb_utc *sme_utc;
11172
11173 /* Lock the SME structure */
11174 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011175 if (!QDF_IS_STATUS_SUCCESS(status))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011176 return status;
11177
Anurag Chouhan600c3a02016-03-01 10:33:54 +053011178 sme_utc = qdf_mem_malloc(sizeof(*sme_utc));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011179 if (!sme_utc) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053011180 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011181 FL("Malloc failed"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011182 status = QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011183 goto end;
11184 }
11185 *sme_utc = *utc;
11186
11187 msg.type = WMA_OCB_SET_UTC_TIME_CMD;
11188 msg.reserved = 0;
11189 msg.bodyptr = sme_utc;
Anurag Chouhan6d760662016-02-20 16:05:43 +053011190 status = cds_mq_post_message(QDF_MODULE_ID_WMA, &msg);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011191 if (!QDF_IS_STATUS_SUCCESS(status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053011192 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011193 FL("Not able to post message to WDA"));
Anurag Chouhan600c3a02016-03-01 10:33:54 +053011194 qdf_mem_free(utc);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011195 goto end;
11196 }
11197
11198end:
11199 sme_release_global_lock(&pMac->sme);
11200
11201 return status;
11202}
11203
11204/**
11205 * sme_ocb_start_timing_advert() - Start sending timing advert frames
11206 * @hHal: reference to the HAL
11207 * @timing_advert: the timing advertisement struct
11208 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011209 * Return: QDF_STATUS_SUCCESS on success, QDF_STATUS_E_FAILURE on failure
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011210 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011211QDF_STATUS sme_ocb_start_timing_advert(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011212 struct sir_ocb_timing_advert *timing_advert)
11213{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011214 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011215 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
11216 cds_msg_t msg = {0};
11217 void *buf;
11218 struct sir_ocb_timing_advert *sme_timing_advert;
11219
11220 /* Lock the SME structure */
11221 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011222 if (!QDF_IS_STATUS_SUCCESS(status))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011223 return status;
11224
Anurag Chouhan600c3a02016-03-01 10:33:54 +053011225 buf = qdf_mem_malloc(sizeof(*sme_timing_advert) +
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011226 timing_advert->template_length);
11227 if (!buf) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053011228 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011229 FL("Not able to allocate memory for start TA"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011230 status = QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011231 goto end;
11232 }
11233
11234 sme_timing_advert = (struct sir_ocb_timing_advert *)buf;
11235 *sme_timing_advert = *timing_advert;
11236 sme_timing_advert->template_value = buf + sizeof(*sme_timing_advert);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053011237 qdf_mem_copy(sme_timing_advert->template_value,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011238 timing_advert->template_value, timing_advert->template_length);
11239
11240 msg.type = WMA_OCB_START_TIMING_ADVERT_CMD;
11241 msg.reserved = 0;
11242 msg.bodyptr = buf;
Anurag Chouhan6d760662016-02-20 16:05:43 +053011243 status = cds_mq_post_message(QDF_MODULE_ID_WMA, &msg);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011244 if (!QDF_IS_STATUS_SUCCESS(status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053011245 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011246 FL("Not able to post msg to WDA"));
11247 goto end;
11248 }
11249
11250end:
11251 sme_release_global_lock(&pMac->sme);
11252
11253 return status;
11254}
11255
11256/**
11257 * sme_ocb_stop_timing_advert() - Stop sending timing advert frames on a channel
11258 * @hHal: reference to the HAL
11259 * @timing_advert: the timing advertisement struct
11260 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011261 * Return: QDF_STATUS_SUCCESS on success, QDF_STATUS_E_FAILURE on failure
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011262 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011263QDF_STATUS sme_ocb_stop_timing_advert(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011264 struct sir_ocb_timing_advert *timing_advert)
11265{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011266 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011267 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
11268 cds_msg_t msg = {0};
11269 struct sir_ocb_timing_advert *sme_timing_advert;
11270
11271 /* Lock the SME structure */
11272 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011273 if (!QDF_IS_STATUS_SUCCESS(status))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011274 return status;
11275
Anurag Chouhan600c3a02016-03-01 10:33:54 +053011276 sme_timing_advert = qdf_mem_malloc(sizeof(*timing_advert));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011277 if (!sme_timing_advert) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053011278 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011279 FL("Not able to allocate memory for stop TA"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011280 status = QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011281 goto end;
11282 }
11283 *sme_timing_advert = *timing_advert;
11284
11285 msg.type = WMA_OCB_STOP_TIMING_ADVERT_CMD;
11286 msg.reserved = 0;
11287 msg.bodyptr = sme_timing_advert;
Anurag Chouhan6d760662016-02-20 16:05:43 +053011288 status = cds_mq_post_message(QDF_MODULE_ID_WMA, &msg);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011289 if (!QDF_IS_STATUS_SUCCESS(status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053011290 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011291 FL("Not able to post msg to WDA"));
11292 goto end;
11293 }
11294
11295end:
11296 sme_release_global_lock(&pMac->sme);
11297
11298 return status;
11299}
11300
11301/**
Naveen Rawatb4d37622015-11-13 16:15:25 -080011302 * sme_ocb_gen_timing_advert_frame() - generate TA frame and populate the buffer
11303 * @hal_handle: reference to the HAL
11304 * @self_addr: the self MAC address
11305 * @buf: the buffer that will contain the frame
11306 * @timestamp_offset: return for the offset of the timestamp field
11307 * @time_value_offset: return for the time_value field in the TA IE
11308 *
11309 * Return: the length of the buffer.
11310 */
11311int sme_ocb_gen_timing_advert_frame(tHalHandle hal_handle,
11312 tSirMacAddr self_addr, uint8_t **buf,
11313 uint32_t *timestamp_offset,
11314 uint32_t *time_value_offset)
11315{
11316 int template_length;
11317 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal_handle);
11318
11319 template_length = sch_gen_timing_advert_frame(mac_ctx, self_addr, buf,
11320 timestamp_offset,
11321 time_value_offset);
11322 return template_length;
11323}
11324/**
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011325 * sme_ocb_get_tsf_timer() - Get the TSF timer value
11326 * @hHal: reference to the HAL
11327 * @context: the context of the call
11328 * @callback: the callback to hdd
11329 * @request: the TSF timer request
11330 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011331 * Return: QDF_STATUS_SUCCESS on success, QDF_STATUS_E_FAILURE on failure
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011332 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011333QDF_STATUS sme_ocb_get_tsf_timer(tHalHandle hHal, void *context,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011334 ocb_callback callback,
11335 struct sir_ocb_get_tsf_timer *request)
11336{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011337 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011338 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
11339 cds_msg_t msg = {0};
11340 struct sir_ocb_get_tsf_timer *msg_body;
11341
11342 /* Lock the SME structure */
11343 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011344 if (!QDF_IS_STATUS_SUCCESS(status))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011345 return status;
11346
11347 /* Allocate memory for the WMI request, and copy the parameter */
Anurag Chouhan600c3a02016-03-01 10:33:54 +053011348 msg_body = qdf_mem_malloc(sizeof(*msg_body));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011349 if (!msg_body) {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011350 status = QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011351 goto end;
11352 }
11353 *msg_body = *request;
11354
11355 msg.type = WMA_OCB_GET_TSF_TIMER_CMD;
11356 msg.bodyptr = msg_body;
11357
11358 /* Set the request callback and the context */
11359 pMac->sme.ocb_get_tsf_timer_callback = callback;
11360 pMac->sme.ocb_get_tsf_timer_context = context;
11361
11362 /* Post the message to WDA */
Anurag Chouhan6d760662016-02-20 16:05:43 +053011363 status = cds_mq_post_message(QDF_MODULE_ID_WMA, &msg);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011364 if (!QDF_IS_STATUS_SUCCESS(status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053011365 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011366 FL("Error posting message to WDA: %d"), status);
11367 pMac->sme.ocb_get_tsf_timer_callback = NULL;
11368 pMac->sme.ocb_get_tsf_timer_context = NULL;
Anurag Chouhan600c3a02016-03-01 10:33:54 +053011369 qdf_mem_free(msg_body);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011370 goto end;
11371 }
11372
11373end:
11374 sme_release_global_lock(&pMac->sme);
11375
11376 return status;
11377}
11378
11379/**
11380 * sme_dcc_get_stats() - Get the DCC stats
11381 * @hHal: reference to the HAL
11382 * @context: the context of the call
11383 * @callback: the callback to hdd
11384 * @request: the get DCC stats request
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_dcc_get_stats(tHalHandle hHal, void *context,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011389 ocb_callback callback,
11390 struct sir_dcc_get_stats *request)
11391{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011392 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011393 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
11394 cds_msg_t msg = {0};
11395 struct sir_dcc_get_stats *msg_body;
11396
11397 /* Lock the SME structure */
11398 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011399 if (!QDF_IS_STATUS_SUCCESS(status))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011400 return status;
11401
11402 /* Allocate memory for the WMI request, and copy the parameter */
Anurag Chouhan600c3a02016-03-01 10:33:54 +053011403 msg_body = qdf_mem_malloc(sizeof(*msg_body) +
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011404 request->request_array_len);
11405 if (!msg_body) {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011406 status = QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011407 goto end;
11408 }
11409 *msg_body = *request;
11410 msg_body->request_array = (void *)msg_body + sizeof(*msg_body);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053011411 qdf_mem_copy(msg_body->request_array, request->request_array,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011412 request->request_array_len);
11413
11414 msg.type = WMA_DCC_GET_STATS_CMD;
11415 msg.bodyptr = msg_body;
11416
11417 /* Set the request callback and context */
11418 pMac->sme.dcc_get_stats_callback = callback;
11419 pMac->sme.dcc_get_stats_context = context;
11420
Anurag Chouhan6d760662016-02-20 16:05:43 +053011421 status = cds_mq_post_message(QDF_MODULE_ID_WMA, &msg);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011422 if (!QDF_IS_STATUS_SUCCESS(status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053011423 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011424 FL("Error posting message to WDA: %d"), status);
11425 pMac->sme.dcc_get_stats_callback = callback;
11426 pMac->sme.dcc_get_stats_context = context;
Anurag Chouhan600c3a02016-03-01 10:33:54 +053011427 qdf_mem_free(msg_body);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011428 goto end;
11429 }
11430
11431end:
11432 sme_release_global_lock(&pMac->sme);
11433
11434 return status;
11435}
11436
11437/**
11438 * sme_dcc_clear_stats() - Clear the DCC stats
11439 * @hHal: reference to the HAL
11440 * @vdev_id: vdev id for OCB interface
11441 * @dcc_stats_bitmap: the entries in the stats to clear
11442 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011443 * Return: QDF_STATUS_SUCCESS on success, QDF_STATUS_E_FAILURE on failure
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011444 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011445QDF_STATUS sme_dcc_clear_stats(tHalHandle hHal, uint32_t vdev_id,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011446 uint32_t dcc_stats_bitmap)
11447{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011448 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011449 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
11450 cds_msg_t msg = {0};
11451 struct sir_dcc_clear_stats *request;
11452
11453 /* Lock the SME structure */
11454 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011455 if (!QDF_IS_STATUS_SUCCESS(status))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011456 return status;
11457
Anurag Chouhan600c3a02016-03-01 10:33:54 +053011458 request = qdf_mem_malloc(sizeof(struct sir_dcc_clear_stats));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011459 if (!request) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053011460 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011461 FL("Not able to allocate memory"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011462 status = QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011463 goto end;
11464 }
11465
Anurag Chouhan600c3a02016-03-01 10:33:54 +053011466 qdf_mem_zero(request, sizeof(*request));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011467 request->vdev_id = vdev_id;
11468 request->dcc_stats_bitmap = dcc_stats_bitmap;
11469
11470 msg.type = WMA_DCC_CLEAR_STATS_CMD;
11471 msg.bodyptr = request;
11472
Anurag Chouhan6d760662016-02-20 16:05:43 +053011473 status = cds_mq_post_message(QDF_MODULE_ID_WMA, &msg);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011474 if (!QDF_IS_STATUS_SUCCESS(status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053011475 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011476 FL("Not able to post msg to WDA"));
Anurag Chouhan600c3a02016-03-01 10:33:54 +053011477 qdf_mem_free(request);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011478 goto end;
11479 }
11480
11481end:
11482 sme_release_global_lock(&pMac->sme);
11483
11484 return status;
11485}
11486
11487/**
11488 * sme_dcc_update_ndl() - Update the DCC settings
11489 * @hHal: reference to the HAL
11490 * @context: the context of the call
11491 * @callback: the callback to hdd
11492 * @request: the update DCC request
11493 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011494 * Return: QDF_STATUS_SUCCESS on success, QDF_STATUS_E_FAILURE on failure
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011495 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011496QDF_STATUS sme_dcc_update_ndl(tHalHandle hHal, void *context,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011497 ocb_callback callback,
11498 struct sir_dcc_update_ndl *request)
11499{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011500 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011501 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
11502 cds_msg_t msg = {0};
11503 struct sir_dcc_update_ndl *msg_body;
11504
11505 /* Lock the SME structure */
11506 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011507 if (!QDF_IS_STATUS_SUCCESS(status))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011508 return status;
11509
11510 /* Allocate memory for the WMI request, and copy the parameter */
Anurag Chouhan600c3a02016-03-01 10:33:54 +053011511 msg_body = qdf_mem_malloc(sizeof(*msg_body) +
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011512 request->dcc_ndl_chan_list_len +
11513 request->dcc_ndl_active_state_list_len);
11514 if (!msg_body) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053011515 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011516 FL("Failed to allocate memory"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011517 status = QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011518 goto end;
11519 }
11520
11521 *msg_body = *request;
11522
11523 msg_body->dcc_ndl_chan_list = (void *)msg_body + sizeof(*msg_body);
11524 msg_body->dcc_ndl_active_state_list = msg_body->dcc_ndl_chan_list +
11525 request->dcc_ndl_chan_list_len;
Anurag Chouhan600c3a02016-03-01 10:33:54 +053011526 qdf_mem_copy(msg_body->dcc_ndl_chan_list, request->dcc_ndl_chan_list,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011527 request->dcc_ndl_active_state_list_len);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053011528 qdf_mem_copy(msg_body->dcc_ndl_active_state_list,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011529 request->dcc_ndl_active_state_list,
11530 request->dcc_ndl_active_state_list_len);
11531
11532 msg.type = WMA_DCC_UPDATE_NDL_CMD;
11533 msg.bodyptr = msg_body;
11534
11535 /* Set the request callback and the context */
11536 pMac->sme.dcc_update_ndl_callback = callback;
11537 pMac->sme.dcc_update_ndl_context = context;
11538
Anurag Chouhan6d760662016-02-20 16:05:43 +053011539 status = cds_mq_post_message(QDF_MODULE_ID_WMA, &msg);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011540 if (!QDF_IS_STATUS_SUCCESS(status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053011541 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011542 FL("Error posting message to WDA: %d"), status);
11543 pMac->sme.dcc_update_ndl_callback = NULL;
11544 pMac->sme.dcc_update_ndl_context = NULL;
Anurag Chouhan600c3a02016-03-01 10:33:54 +053011545 qdf_mem_free(msg_body);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011546 goto end;
11547 }
11548
11549end:
11550 sme_release_global_lock(&pMac->sme);
11551
11552 return status;
11553}
11554
11555/**
11556 * sme_register_for_dcc_stats_event() - Register for the periodic DCC stats
11557 * event
11558 * @hHal: reference to the HAL
11559 * @context: the context of the call
11560 * @callback: the callback to hdd
11561 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011562 * Return: QDF_STATUS_SUCCESS on success, QDF_STATUS_E_FAILURE on failure
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011563 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011564QDF_STATUS sme_register_for_dcc_stats_event(tHalHandle hHal, void *context,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011565 ocb_callback callback)
11566{
11567 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011568 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011569
11570 status = sme_acquire_global_lock(&pMac->sme);
11571 pMac->sme.dcc_stats_event_callback = callback;
11572 pMac->sme.dcc_stats_event_context = context;
11573 sme_release_global_lock(&pMac->sme);
11574
11575 return 0;
11576}
11577
Arun Khandavalli4b55da72016-07-19 19:55:01 +053011578/**
11579 * sme_deregister_for_dcc_stats_event() - De-Register for the periodic DCC stats
11580 * event
11581 * @h_hal: Hal Handle
11582 *
11583 * This function de-registers the DCC perioc stats callback
11584 *
11585 * Return: QDF_STATUS Enumeration
11586 */
11587QDF_STATUS sme_deregister_for_dcc_stats_event(tHalHandle h_hal)
11588{
11589 tpAniSirGlobal mac;
11590 QDF_STATUS status;
11591
11592 if (!h_hal) {
11593 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
11594 FL("h_hal is not valid"));
11595 return QDF_STATUS_E_INVAL;
11596 }
11597 mac = PMAC_STRUCT(h_hal);
11598
11599 status = sme_acquire_global_lock(&mac->sme);
11600 if (!QDF_IS_STATUS_SUCCESS(status)) {
11601 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
11602 FL("Failed to acquire global lock"));
11603 return status;
11604 }
11605 mac->sme.dcc_stats_event_callback = NULL;
11606 mac->sme.dcc_stats_event_context = NULL;
11607 sme_release_global_lock(&mac->sme);
11608
11609 return status;
11610}
11611
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011612void sme_get_recovery_stats(tHalHandle hHal)
11613{
11614 uint8_t i;
11615
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053011616 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011617 "Self Recovery Stats");
11618 for (i = 0; i < MAX_ACTIVE_CMD_STATS; i++) {
11619 if (eSmeNoCommand !=
11620 g_self_recovery_stats.activeCmdStats[i].command) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053011621 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011622 "timestamp %llu: command 0x%0X: reason %d: session %d",
11623 g_self_recovery_stats.activeCmdStats[i].
11624 timestamp,
11625 g_self_recovery_stats.activeCmdStats[i].command,
11626 g_self_recovery_stats.activeCmdStats[i].reason,
11627 g_self_recovery_stats.activeCmdStats[i].
11628 sessionId);
11629 }
11630 }
11631}
11632
11633/**
11634 * sme_save_active_cmd_stats() - To save active command stats
11635 * @hHal: HAL context
11636 *
11637 * This routine is to save active command stats
11638 *
11639 * Return: None
11640 */
11641void sme_save_active_cmd_stats(tHalHandle hHal)
11642{
11643 tSmeCmd *pTempCmd = NULL;
11644 tListElem *pEntry;
11645 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
11646 uint8_t statidx = 0;
11647 tActiveCmdStats *actv_cmd_stat = NULL;
11648
11649 if (NULL == pMac) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053011650 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011651 FL("pMac is NULL"));
11652 return;
11653 }
11654
11655 pEntry = csr_ll_peek_head(&pMac->sme.smeCmdActiveList, LL_ACCESS_LOCK);
11656 if (pEntry)
11657 pTempCmd = GET_BASE_ADDR(pEntry, tSmeCmd, Link);
11658
11659 if (!pTempCmd)
11660 return;
11661
11662 if (eSmeCsrCommandMask & pTempCmd->command) {
11663 statidx = g_self_recovery_stats.cmdStatsIndx;
11664 actv_cmd_stat = &g_self_recovery_stats.activeCmdStats[statidx];
11665 actv_cmd_stat->command = pTempCmd->command;
11666 actv_cmd_stat->sessionId = pTempCmd->sessionId;
11667 actv_cmd_stat->timestamp = cds_get_monotonic_boottime();
11668 if (eSmeCommandRoam == pTempCmd->command)
11669 actv_cmd_stat->reason = pTempCmd->u.roamCmd.roamReason;
11670 else if (eSmeCommandScan == pTempCmd->command)
11671 actv_cmd_stat->reason = pTempCmd->u.scanCmd.reason;
11672 else
11673 actv_cmd_stat->reason = 0xFF;
11674
11675 g_self_recovery_stats.cmdStatsIndx =
11676 ((g_self_recovery_stats.cmdStatsIndx + 1) &
11677 (MAX_ACTIVE_CMD_STATS - 1));
11678 }
11679 return;
11680}
11681
11682void active_list_cmd_timeout_handle(void *userData)
11683{
Abhishek Singh5ea86532016-04-27 14:10:53 +053011684 tHalHandle hal = (tHalHandle)userData;
11685 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
Kapil Gupta63ddab22016-08-09 16:41:24 +053011686 tListElem *entry;
11687 tSmeCmd *temp_cmd = NULL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011688
Abhishek Singh5ea86532016-04-27 14:10:53 +053011689 if (NULL == mac_ctx) {
11690 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
11691 "%s: mac_ctx is null", __func__);
11692 return;
11693 }
11694 /* Return if no cmd pending in active list as
11695 * in this case we should not be here.
11696 */
11697 if (0 == csr_ll_count(&mac_ctx->sme.smeCmdActiveList))
11698 return;
11699 sms_log(mac_ctx, LOGE,
11700 FL("Active List command timeout Cmd List Count %d"),
11701 csr_ll_count(&mac_ctx->sme.smeCmdActiveList));
11702 sme_get_command_q_status(hal);
11703
11704 if (mac_ctx->roam.configParam.enable_fatal_event)
11705 cds_flush_logs(WLAN_LOG_TYPE_FATAL,
11706 WLAN_LOG_INDICATOR_HOST_DRIVER,
11707 WLAN_LOG_REASON_SME_COMMAND_STUCK,
11708 false,
11709 mac_ctx->sme.enableSelfRecovery ? true : false);
11710 else
11711 qdf_trace_dump_all(mac_ctx, 0, 0, 500, 0);
11712
Kapil Gupta63ddab22016-08-09 16:41:24 +053011713 entry = csr_ll_peek_head(&mac_ctx->sme.smeCmdActiveList,
11714 LL_ACCESS_LOCK);
11715 if (entry)
11716 temp_cmd = GET_BASE_ADDR(entry, tSmeCmd, Link);
11717 /* Ignore if ROC took more than 120 sec */
11718 if (temp_cmd && (eSmeCommandRemainOnChannel == temp_cmd->command))
11719 return;
11720
Abhishek Singh5ea86532016-04-27 14:10:53 +053011721 if (mac_ctx->sme.enableSelfRecovery) {
11722 sme_save_active_cmd_stats(hal);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011723 cds_trigger_recovery();
11724 } else {
Abhishek Singh5ea86532016-04-27 14:10:53 +053011725 if (!mac_ctx->roam.configParam.enable_fatal_event &&
11726 !(cds_is_load_or_unload_in_progress() ||
11727 cds_is_driver_recovering()))
11728 QDF_BUG(0);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011729 }
11730}
11731
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011732QDF_STATUS sme_notify_modem_power_state(tHalHandle hHal, uint32_t value)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011733{
11734 cds_msg_t msg;
11735 tpSirModemPowerStateInd request_buf;
11736 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
11737
11738 if (NULL == pMac) {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011739 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011740 }
11741
Anurag Chouhan600c3a02016-03-01 10:33:54 +053011742 request_buf = qdf_mem_malloc(sizeof(tSirModemPowerStateInd));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011743 if (NULL == request_buf) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053011744 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011745 "%s: Not able to allocate memory for MODEM POWER STATE IND",
11746 __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011747 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011748 }
11749
11750 request_buf->param = value;
11751
11752 msg.type = WMA_MODEM_POWER_STATE_IND;
11753 msg.reserved = 0;
11754 msg.bodyptr = request_buf;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011755 if (!QDF_IS_STATUS_SUCCESS
Anurag Chouhan6d760662016-02-20 16:05:43 +053011756 (cds_mq_post_message(QDF_MODULE_ID_WMA, &msg))) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053011757 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011758 "%s: Not able to post WMA_MODEM_POWER_STATE_IND message"
11759 " to WMA", __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053011760 qdf_mem_free(request_buf);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011761 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011762 }
11763
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011764 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011765}
11766
11767#ifdef QCA_HT_2040_COEX
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011768QDF_STATUS sme_notify_ht2040_mode(tHalHandle hHal, uint16_t staId,
Anurag Chouhan6d760662016-02-20 16:05:43 +053011769 struct qdf_mac_addr macAddrSTA,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011770 uint8_t sessionId,
11771 uint8_t channel_type)
11772{
11773 cds_msg_t msg;
11774 tUpdateVHTOpMode *pHtOpMode = NULL;
11775 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
11776
11777 if (NULL == pMac) {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011778 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011779 }
11780
Anurag Chouhan600c3a02016-03-01 10:33:54 +053011781 pHtOpMode = qdf_mem_malloc(sizeof(tUpdateVHTOpMode));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011782 if (NULL == pHtOpMode) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053011783 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011784 "%s: Not able to allocate memory for setting OP mode",
11785 __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011786 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011787 }
11788
11789 switch (channel_type) {
11790 case eHT_CHAN_HT20:
11791 pHtOpMode->opMode = eHT_CHANNEL_WIDTH_20MHZ;
11792 break;
11793
11794 case eHT_CHAN_HT40MINUS:
11795 case eHT_CHAN_HT40PLUS:
11796 pHtOpMode->opMode = eHT_CHANNEL_WIDTH_40MHZ;
11797 break;
11798
11799 default:
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053011800 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011801 "%s: Invalid OP mode", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011802 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011803 }
11804
11805 pHtOpMode->staId = staId,
Anurag Chouhan600c3a02016-03-01 10:33:54 +053011806 qdf_mem_copy(pHtOpMode->peer_mac, macAddrSTA.bytes,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011807 sizeof(tSirMacAddr));
11808 pHtOpMode->smesessionId = sessionId;
11809
11810 msg.type = WMA_UPDATE_OP_MODE;
11811 msg.reserved = 0;
11812 msg.bodyptr = pHtOpMode;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011813 if (!QDF_IS_STATUS_SUCCESS
Anurag Chouhan6d760662016-02-20 16:05:43 +053011814 (cds_mq_post_message(QDF_MODULE_ID_WMA, &msg))) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053011815 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011816 "%s: Not able to post WMA_UPDATE_OP_MODE message"
11817 " to WMA", __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053011818 qdf_mem_free(pHtOpMode);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011819 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011820 }
11821
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053011822 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011823 "%s: Notifed FW about OP mode: %d for staId=%d",
11824 __func__, pHtOpMode->opMode, staId);
11825
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011826 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011827}
11828
11829/* ---------------------------------------------------------------------------
11830
11831 \fn sme_set_ht2040_mode
11832
11833 \brief To update HT Operation beacon IE.
11834
11835 \param
11836
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011837 \return QDF_STATUS SUCCESS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011838 FAILURE or RESOURCES
11839 The API finished and failed.
11840
11841 -------------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011842QDF_STATUS sme_set_ht2040_mode(tHalHandle hHal, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011843 uint8_t channel_type, bool obssEnabled)
11844{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011845 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011846 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
11847 ePhyChanBondState cbMode;
11848
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053011849 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011850 "%s: Update HT operation beacon IE, channel_type=%d",
11851 __func__, channel_type);
11852
11853 switch (channel_type) {
11854 case eHT_CHAN_HT20:
11855 cbMode = PHY_SINGLE_CHANNEL_CENTERED;
11856 break;
11857 case eHT_CHAN_HT40MINUS:
11858 cbMode = PHY_DOUBLE_CHANNEL_HIGH_PRIMARY;
11859 break;
11860 case eHT_CHAN_HT40PLUS:
11861 cbMode = PHY_DOUBLE_CHANNEL_LOW_PRIMARY;
11862 break;
11863 default:
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053011864 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011865 "%s:Error!!! Invalid HT20/40 mode !", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011866 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011867 }
11868 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011869 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011870 status = csr_set_ht2040_mode(pMac, sessionId,
11871 cbMode, obssEnabled);
11872 sme_release_global_lock(&pMac->sme);
11873 }
11874 return status;
11875}
11876
11877/* ---------------------------------------------------------------------------
11878
11879 \fn sme_set_phy_cb_mode24_g
11880
11881 \brief Changes PHY channel bonding mode
11882
11883 \param hHal - The handle returned by mac_open.
11884
11885 \param cbMode new channel bonding mode which is to set
11886
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011887 \return QDF_STATUS SUCCESS.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011888
11889 -------------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011890QDF_STATUS sme_set_phy_cb_mode24_g(tHalHandle hHal, ePhyChanBondState phyCBMode)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011891{
11892 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
11893
11894 if (NULL == pMac) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053011895 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011896 "%s: invalid context", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011897 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011898 }
11899
11900 pMac->roam.configParam.channelBondingMode24GHz = phyCBMode;
11901
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011902 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011903}
11904#endif
11905
11906/*
11907 * SME API to enable/disable idle mode powersave
11908 * This should be called only if powersave offload
11909 * is enabled
11910 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011911QDF_STATUS sme_set_idle_powersave_config(void *cds_context,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011912 tHalHandle hHal, uint32_t value)
11913{
Anurag Chouhan6d760662016-02-20 16:05:43 +053011914 void *wmaContext = cds_get_context(QDF_MODULE_ID_WMA);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011915 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
11916
11917 if (NULL == wmaContext) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053011918 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011919 "%s: wmaContext is NULL", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011920 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011921 }
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053011922 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011923 " Idle Ps Set Value %d", value);
11924
11925 pMac->imps_enabled = false;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011926 if (QDF_STATUS_SUCCESS != wma_set_idle_ps_config(wmaContext, value)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053011927 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011928 " Failed to Set Idle Ps Value %d", value);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011929 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011930 }
11931 if (value)
11932 pMac->imps_enabled = true;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011933 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011934}
11935
11936int16_t sme_get_ht_config(tHalHandle hHal, uint8_t session_id, uint16_t ht_capab)
11937{
11938 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
11939 tCsrRoamSession *pSession = CSR_GET_SESSION(pMac, session_id);
11940
11941 if (NULL == pSession) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053011942 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011943 "%s: pSession is NULL", __func__);
11944 return -EIO;
11945 }
11946 switch (ht_capab) {
11947 case WNI_CFG_HT_CAP_INFO_ADVANCE_CODING:
11948 return pSession->htConfig.ht_rx_ldpc;
11949 case WNI_CFG_HT_CAP_INFO_TX_STBC:
11950 return pSession->htConfig.ht_tx_stbc;
11951 case WNI_CFG_HT_CAP_INFO_RX_STBC:
11952 return pSession->htConfig.ht_rx_stbc;
11953 case WNI_CFG_HT_CAP_INFO_SHORT_GI_20MHZ:
Sandeep Puligilla607f34a2016-05-25 14:37:47 -070011954 return pSession->htConfig.ht_sgi20;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011955 case WNI_CFG_HT_CAP_INFO_SHORT_GI_40MHZ:
Sandeep Puligilla607f34a2016-05-25 14:37:47 -070011956 return pSession->htConfig.ht_sgi40;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011957 default:
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053011958 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011959 "invalid ht capability");
11960 return -EIO;
11961 }
11962}
11963
11964int sme_update_ht_config(tHalHandle hHal, uint8_t sessionId, uint16_t htCapab,
11965 int value)
11966{
11967 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
11968 tCsrRoamSession *pSession = CSR_GET_SESSION(pMac, sessionId);
11969
11970 if (NULL == pSession) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053011971 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011972 "%s: pSession is NULL", __func__);
11973 return -EIO;
11974 }
11975
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011976 if (QDF_STATUS_SUCCESS != wma_set_htconfig(sessionId, htCapab, value)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053011977 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011978 "Failed to set ht capability in target");
11979 return -EIO;
11980 }
11981
11982 switch (htCapab) {
11983 case WNI_CFG_HT_CAP_INFO_ADVANCE_CODING:
11984 pSession->htConfig.ht_rx_ldpc = value;
11985 break;
11986 case WNI_CFG_HT_CAP_INFO_TX_STBC:
11987 pSession->htConfig.ht_tx_stbc = value;
11988 break;
11989 case WNI_CFG_HT_CAP_INFO_RX_STBC:
11990 pSession->htConfig.ht_rx_stbc = value;
11991 break;
11992 case WNI_CFG_HT_CAP_INFO_SHORT_GI_20MHZ:
Sandeep Puligilla607f34a2016-05-25 14:37:47 -070011993 pSession->htConfig.ht_sgi20 = value;
11994 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011995 case WNI_CFG_HT_CAP_INFO_SHORT_GI_40MHZ:
Sandeep Puligilla607f34a2016-05-25 14:37:47 -070011996 pSession->htConfig.ht_sgi40 = value;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011997 break;
11998 }
11999
12000 return 0;
12001}
12002
12003#define HT20_SHORT_GI_MCS7_RATE 722
12004/* ---------------------------------------------------------------------------
12005 \fn sme_send_rate_update_ind
12006 \brief API to Update rate
12007 \param hHal - The handle returned by mac_open
12008 \param rateUpdateParams - Pointer to rate update params
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012009 \return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012010 ---------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012011QDF_STATUS sme_send_rate_update_ind(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012012 tSirRateUpdateInd *rateUpdateParams)
12013{
12014 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012015 QDF_STATUS status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012016 cds_msg_t msg;
Anurag Chouhan600c3a02016-03-01 10:33:54 +053012017 tSirRateUpdateInd *rate_upd = qdf_mem_malloc(sizeof(tSirRateUpdateInd));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012018
12019 if (rate_upd == NULL) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053012020 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012021 "Rate update struct alloc failed");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012022 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012023 }
12024 *rate_upd = *rateUpdateParams;
12025
12026 if (rate_upd->mcastDataRate24GHz == HT20_SHORT_GI_MCS7_RATE)
12027 rate_upd->mcastDataRate24GHzTxFlag =
12028 eHAL_TX_RATE_HT20 | eHAL_TX_RATE_SGI;
12029 else if (rate_upd->reliableMcastDataRate ==
12030 HT20_SHORT_GI_MCS7_RATE)
12031 rate_upd->reliableMcastDataRateTxFlag =
12032 eHAL_TX_RATE_HT20 | eHAL_TX_RATE_SGI;
12033
12034 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012035 if (QDF_STATUS_SUCCESS == status) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012036 msg.type = WMA_RATE_UPDATE_IND;
12037 msg.bodyptr = rate_upd;
Sreelakshmi Konamki6a065362016-05-31 16:05:01 +053012038 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
12039 NO_SESSION, msg.type));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012040 if (!QDF_IS_STATUS_SUCCESS
Anurag Chouhan6d760662016-02-20 16:05:43 +053012041 (cds_mq_post_message(QDF_MODULE_ID_WMA, &msg))) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053012042 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012043 "%s: Not able "
12044 "to post WMA_SET_RMC_RATE_IND to WMA!",
12045 __func__);
12046
12047 sme_release_global_lock(&pMac->sme);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053012048 qdf_mem_free(rate_upd);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012049 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012050 }
12051
12052 sme_release_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012053 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012054 }
12055
12056 return status;
12057}
12058
12059/**
Kondabattini, Ganeshe4f18e02016-09-13 13:01:22 +053012060 * sme_update_access_policy_vendor_ie() - update vendor ie and access policy.
12061 * @hal: Pointer to the mac context
12062 * @session_id: sme session id
12063 * @vendor_ie: vendor ie
12064 * @access_policy: vendor ie access policy
12065 *
12066 * This function updates the vendor ie and access policy to lim.
12067 *
12068 * Return: success or failure.
12069 */
12070QDF_STATUS sme_update_access_policy_vendor_ie(tHalHandle hal,
12071 uint8_t session_id, uint8_t *vendor_ie, int access_policy)
12072{
12073 struct sme_update_access_policy_vendor_ie *msg;
12074 uint16_t msg_len;
12075 QDF_STATUS status = QDF_STATUS_E_FAILURE;
12076 tpAniSirGlobal mac = PMAC_STRUCT(hal);
12077
12078 msg_len = sizeof(*msg);
12079
12080 msg = qdf_mem_malloc(msg_len);
12081 if (!msg) {
12082 sms_log(mac, LOGE,
12083 "failed to allocate memory for sme_update_access_policy_vendor_ie");
12084 return QDF_STATUS_E_FAILURE;
12085 }
12086
12087 qdf_mem_set(msg, msg_len, 0);
12088 msg->msg_type = (uint16_t)eWNI_SME_UPDATE_ACCESS_POLICY_VENDOR_IE;
12089 msg->length = (uint16_t)msg_len;
12090
12091 qdf_mem_copy(&msg->ie[0], vendor_ie, sizeof(msg->ie));
12092
12093 msg->sme_session_id = session_id;
12094 msg->access_policy = access_policy;
12095
12096 sms_log(mac, LOG1, "sme_session_id %hu, access_policy %d", session_id,
12097 access_policy);
12098
12099 status = cds_send_mb_message_to_mac(msg);
12100
12101 return status;
12102}
12103
12104/**
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012105 * sme_get_reg_info() - To get registration info
12106 * @hHal: HAL context
12107 * @chanId: channel id
12108 * @regInfo1: first reg info to fill
12109 * @regInfo2: second reg info to fill
12110 *
12111 * This routine will give you reg info
12112 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012113 * Return: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012114 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012115QDF_STATUS sme_get_reg_info(tHalHandle hHal, uint8_t chanId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012116 uint32_t *regInfo1, uint32_t *regInfo2)
12117{
12118 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012119 QDF_STATUS status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012120 uint8_t i;
12121 bool found = false;
12122
12123 status = sme_acquire_global_lock(&pMac->sme);
12124 *regInfo1 = 0;
12125 *regInfo2 = 0;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012126 if (!QDF_IS_STATUS_SUCCESS(status))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012127 return status;
12128
12129 for (i = 0; i < WNI_CFG_VALID_CHANNEL_LIST_LEN; i++) {
Amar Singhala297bfa2015-10-15 15:07:29 -070012130 if (pMac->scan.defaultPowerTable[i].chan_num == chanId) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012131 SME_SET_CHANNEL_REG_POWER(*regInfo1,
Amar Singhala297bfa2015-10-15 15:07:29 -070012132 pMac->scan.defaultPowerTable[i].power);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012133
12134 SME_SET_CHANNEL_MAX_TX_POWER(*regInfo2,
Amar Singhala297bfa2015-10-15 15:07:29 -070012135 pMac->scan.defaultPowerTable[i].power);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012136 found = true;
12137 break;
12138 }
12139 }
12140 if (!found)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012141 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012142
12143 sme_release_global_lock(&pMac->sme);
12144 return status;
12145}
12146
12147#ifdef FEATURE_WLAN_AUTO_SHUTDOWN
12148/* ---------------------------------------------------------------------------
12149 \fn sme_auto_shutdown_cb
12150 \brief Used to plug in callback function for receiving auto shutdown evt
12151 \param hHal
12152 \param pCallbackfn : callback function pointer should be plugged in
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012153 \- return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012154 -------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012155QDF_STATUS sme_set_auto_shutdown_cb(tHalHandle hHal, void (*pCallbackfn)(void)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012156 ) {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012157 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012158 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
12159
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053012160 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012161 "%s: Plug in Auto shutdown event callback", __func__);
12162
12163 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012164 if (QDF_STATUS_SUCCESS == status) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012165 if (NULL != pCallbackfn) {
12166 pMac->sme.pAutoShutdownNotificationCb = pCallbackfn;
12167 }
12168 sme_release_global_lock(&pMac->sme);
12169 }
12170
12171 return status;
12172}
12173
12174/* ---------------------------------------------------------------------------
12175 \fn sme_set_auto_shutdown_timer
12176 \API to set auto shutdown timer value in FW.
12177 \param hHal - The handle returned by mac_open
12178 \param timer_val - The auto shutdown timer value to be set
12179 \- return Configuration message posting status, SUCCESS or Fail
12180 -------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012181QDF_STATUS sme_set_auto_shutdown_timer(tHalHandle hHal, uint32_t timer_val)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012182{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012183 QDF_STATUS status = QDF_STATUS_SUCCESS;
12184 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012185 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
12186 tSirAutoShutdownCmdParams *auto_sh_cmd;
12187 cds_msg_t cds_message;
12188
12189 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012190 if (QDF_STATUS_SUCCESS == status) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012191 auto_sh_cmd = (tSirAutoShutdownCmdParams *)
Anurag Chouhan600c3a02016-03-01 10:33:54 +053012192 qdf_mem_malloc(sizeof(tSirAutoShutdownCmdParams));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012193 if (auto_sh_cmd == NULL) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053012194 QDF_TRACE(QDF_MODULE_ID_HDD, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012195 "%s Request Buffer Alloc Fail", __func__);
12196 sme_release_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012197 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012198 }
12199
12200 auto_sh_cmd->timer_val = timer_val;
12201
12202 /* serialize the req through MC thread */
12203 cds_message.bodyptr = auto_sh_cmd;
12204 cds_message.type = WMA_SET_AUTO_SHUTDOWN_TIMER_REQ;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012205 qdf_status = cds_mq_post_message(CDS_MQ_ID_WMA, &cds_message);
12206 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053012207 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012208 "%s: Post Auto shutdown MSG fail", __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053012209 qdf_mem_free(auto_sh_cmd);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012210 sme_release_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012211 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012212 }
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053012213 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012214 "%s: Posted Auto shutdown MSG", __func__);
12215 sme_release_global_lock(&pMac->sme);
12216 }
12217
12218 return status;
12219}
12220#endif
12221
12222#ifdef FEATURE_WLAN_CH_AVOID
12223/* ---------------------------------------------------------------------------
12224 \fn sme_add_ch_avoid_callback
12225 \brief Used to plug in callback function
12226 Which notify channel may not be used with SAP or P2PGO mode.
12227 Notification come from FW.
12228 \param hHal
12229 \param pCallbackfn : callback function pointer should be plugged in
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012230 \- return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012231 -------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012232QDF_STATUS sme_add_ch_avoid_callback
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012233 (tHalHandle hHal, void (*pCallbackfn)(void *pAdapter, void *indParam)
12234 ) {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012235 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012236 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
12237
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053012238 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012239 "%s: Plug in CH AVOID CB", __func__);
12240
12241 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012242 if (QDF_STATUS_SUCCESS == status) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012243 if (NULL != pCallbackfn) {
12244 pMac->sme.pChAvoidNotificationCb = pCallbackfn;
12245 }
12246 sme_release_global_lock(&pMac->sme);
12247 }
12248
12249 return status;
12250}
12251
12252/* ---------------------------------------------------------------------------
12253 \fn sme_ch_avoid_update_req
12254 \API to request channel avoidance update from FW.
12255 \param hHal - The handle returned by mac_open
12256 \param update_type - The udpate_type parameter of this request call
12257 \- return Configuration message posting status, SUCCESS or Fail
12258 -------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012259QDF_STATUS sme_ch_avoid_update_req(tHalHandle hHal)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012260{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012261 QDF_STATUS status = QDF_STATUS_SUCCESS;
12262 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012263 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
12264 tSirChAvoidUpdateReq *cauReq;
12265 cds_msg_t cds_message;
12266
12267 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012268 if (QDF_STATUS_SUCCESS == status) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012269 cauReq = (tSirChAvoidUpdateReq *)
Anurag Chouhan600c3a02016-03-01 10:33:54 +053012270 qdf_mem_malloc(sizeof(tSirChAvoidUpdateReq));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012271 if (NULL == cauReq) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053012272 QDF_TRACE(QDF_MODULE_ID_HDD, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012273 "%s Request Buffer Alloc Fail", __func__);
12274 sme_release_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012275 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012276 }
12277
12278 cauReq->reserved_param = 0;
12279
12280 /* serialize the req through MC thread */
12281 cds_message.bodyptr = cauReq;
12282 cds_message.type = WMA_CH_AVOID_UPDATE_REQ;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012283 qdf_status = cds_mq_post_message(CDS_MQ_ID_WMA, &cds_message);
12284 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053012285 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012286 "%s: Post Ch Avoid Update MSG fail",
12287 __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053012288 qdf_mem_free(cauReq);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012289 sme_release_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012290 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012291 }
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053012292 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012293 "%s: Posted Ch Avoid Update MSG", __func__);
12294 sme_release_global_lock(&pMac->sme);
12295 }
12296
12297 return status;
12298}
12299#endif /* FEATURE_WLAN_CH_AVOID */
12300
12301/**
12302 * sme_set_miracast() - Function to set miracast value to UMAC
12303 * @hal: Handle returned by macOpen
12304 * @filter_type: 0-Disabled, 1-Source, 2-sink
12305 *
12306 * This function passes down the value of miracast set by
12307 * framework to UMAC
12308 *
12309 * Return: Configuration message posting status, SUCCESS or Fail
12310 *
12311 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012312QDF_STATUS sme_set_miracast(tHalHandle hal, uint8_t filter_type)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012313{
12314 cds_msg_t msg;
12315 uint32_t *val;
12316 tpAniSirGlobal mac_ptr = PMAC_STRUCT(hal);
12317
Anurag Chouhan600c3a02016-03-01 10:33:54 +053012318 val = qdf_mem_malloc(sizeof(*val));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012319 if (NULL == val || NULL == mac_ptr) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053012320 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012321 "%s: Invalid pointer", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012322 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012323 }
12324
12325 *val = filter_type;
12326
12327 msg.type = SIR_HAL_SET_MIRACAST;
12328 msg.reserved = 0;
12329 msg.bodyptr = val;
12330
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012331 if (!QDF_IS_STATUS_SUCCESS(
Anurag Chouhan6d760662016-02-20 16:05:43 +053012332 cds_mq_post_message(QDF_MODULE_ID_WMA, &msg))) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053012333 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012334 "%s: Not able to post WDA_SET_MAS_ENABLE_DISABLE to WMA!",
12335 __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053012336 qdf_mem_free(val);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012337 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012338 }
12339
12340 mac_ptr->sme.miracast_value = filter_type;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012341 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012342}
12343
12344/**
12345 * sme_set_mas() - Function to set MAS value to UMAC
12346 * @val: 1-Enable, 0-Disable
12347 *
12348 * This function passes down the value of MAS to the UMAC. A
12349 * value of 1 will enable MAS and a value of 0 will disable MAS
12350 *
12351 * Return: Configuration message posting status, SUCCESS or Fail
12352 *
12353 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012354QDF_STATUS sme_set_mas(uint32_t val)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012355{
12356 cds_msg_t msg;
12357 uint32_t *ptr_val;
12358
Anurag Chouhan600c3a02016-03-01 10:33:54 +053012359 ptr_val = qdf_mem_malloc(sizeof(*ptr_val));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012360 if (NULL == ptr_val) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053012361 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012362 "%s: could not allocate ptr_val", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012363 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012364 }
12365
12366 *ptr_val = val;
12367
12368 msg.type = SIR_HAL_SET_MAS;
12369 msg.reserved = 0;
12370 msg.bodyptr = ptr_val;
12371
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012372 if (!QDF_IS_STATUS_SUCCESS(
Anurag Chouhan6d760662016-02-20 16:05:43 +053012373 cds_mq_post_message(QDF_MODULE_ID_WMA, &msg))) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053012374 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012375 "%s: Not able to post WDA_SET_MAS_ENABLE_DISABLE to WMA!",
12376 __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053012377 qdf_mem_free(ptr_val);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012378 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012379 }
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012380 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012381}
12382
Kiran Kumar Lokere999e58c2016-01-07 02:18:39 -080012383/**
12384 * sme_roam_channel_change_req() - Channel change to new target channel
12385 * @hHal: handle returned by mac_open
12386 * @bssid: mac address of BSS
12387 * @ch_params: target channel information
12388 * @profile: CSR profile
12389 *
12390 * API to Indicate Channel change to new target channel
12391 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012392 * Return: QDF_STATUS
Kiran Kumar Lokere999e58c2016-01-07 02:18:39 -080012393 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012394QDF_STATUS sme_roam_channel_change_req(tHalHandle hHal,
Amar Singhale4f28ee2015-10-21 14:36:56 -070012395 struct qdf_mac_addr bssid,
12396 struct ch_params_s *ch_params,
12397 tCsrRoamProfile *profile)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012398{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012399 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012400 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012401
12402 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012403 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012404
Kiran Kumar Lokere999e58c2016-01-07 02:18:39 -080012405 status = csr_roam_channel_change_req(pMac, bssid, ch_params,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012406 profile);
12407 sme_release_global_lock(&pMac->sme);
12408 }
12409 return status;
12410}
12411
12412/* -------------------------------------------------------------------------
12413 \fn sme_process_channel_change_resp
12414 \brief API to Indicate Channel change response message to SAP.
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012415 \return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012416 ---------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012417QDF_STATUS sme_process_channel_change_resp(tpAniSirGlobal pMac,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012418 uint16_t msg_type, void *pMsgBuf)
12419{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012420 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012421 tCsrRoamInfo proam_info = { 0 };
12422 eCsrRoamResult roamResult;
12423 tpSwitchChannelParams pChnlParams = (tpSwitchChannelParams) pMsgBuf;
12424 uint32_t SessionId = pChnlParams->peSessionId;
12425
12426 proam_info.channelChangeRespEvent =
12427 (tSirChanChangeResponse *)
Anurag Chouhan600c3a02016-03-01 10:33:54 +053012428 qdf_mem_malloc(sizeof(tSirChanChangeResponse));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012429 if (NULL == proam_info.channelChangeRespEvent) {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012430 status = QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012431 sms_log(pMac, LOGE,
12432 "Channel Change Event Allocation Failed: %d\n", status);
12433 return status;
12434 }
12435 if (msg_type == eWNI_SME_CHANNEL_CHANGE_RSP) {
12436 proam_info.channelChangeRespEvent->sessionId = SessionId;
12437 proam_info.channelChangeRespEvent->newChannelNumber =
12438 pChnlParams->channelNumber;
12439 proam_info.channelChangeRespEvent->secondaryChannelOffset =
12440 pChnlParams->ch_width;
12441
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012442 if (pChnlParams->status == QDF_STATUS_SUCCESS) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053012443 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO_MED,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012444 "sapdfs: Received success eWNI_SME_CHANNEL_CHANGE_RSP for sessionId[%d]",
12445 SessionId);
12446 proam_info.channelChangeRespEvent->channelChangeStatus =
12447 1;
12448 roamResult = eCSR_ROAM_RESULT_CHANNEL_CHANGE_SUCCESS;
12449 } else {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053012450 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO_MED,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012451 "sapdfs: Received failure eWNI_SME_CHANNEL_CHANGE_RSP for sessionId[%d]",
12452 SessionId);
12453 proam_info.channelChangeRespEvent->channelChangeStatus =
12454 0;
12455 roamResult = eCSR_ROAM_RESULT_CHANNEL_CHANGE_FAILURE;
12456 }
12457
12458 csr_roam_call_callback(pMac, SessionId, &proam_info, 0,
12459 eCSR_ROAM_SET_CHANNEL_RSP, roamResult);
12460
12461 } else {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012462 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012463 sms_log(pMac, LOGE, "Invalid Channel Change Resp Message: %d\n",
12464 status);
12465 }
Anurag Chouhan600c3a02016-03-01 10:33:54 +053012466 qdf_mem_free(proam_info.channelChangeRespEvent);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012467
12468 return status;
12469}
12470
12471/* -------------------------------------------------------------------------
12472 \fn sme_roam_start_beacon_req
12473 \brief API to Indicate LIM to start Beacon Tx
12474 \after SAP CAC Wait is completed.
12475 \param hHal - The handle returned by mac_open
12476 \param sessionId - session ID
12477 \param dfsCacWaitStatus - CAC WAIT status flag
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012478 \return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012479 ---------------------------------------------------------------------------*/
Anurag Chouhan6d760662016-02-20 16:05:43 +053012480QDF_STATUS sme_roam_start_beacon_req(tHalHandle hHal, struct qdf_mac_addr bssid,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012481 uint8_t dfsCacWaitStatus)
12482{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012483 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012484 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
12485 status = sme_acquire_global_lock(&pMac->sme);
12486
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012487 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012488 status = csr_roam_start_beacon_req(pMac, bssid, dfsCacWaitStatus);
12489 sme_release_global_lock(&pMac->sme);
12490 }
12491 return status;
12492}
12493
Kiran Kumar Lokere999e58c2016-01-07 02:18:39 -080012494/**
12495 * sme_roam_csa_ie_request() - request CSA IE transmission from PE
12496 * @hHal: handle returned by mac_open
12497 * @bssid: SAP bssid
12498 * @targetChannel: target channel information
12499 * @csaIeReqd: CSA IE Request
12500 * @ch_params: channel information
12501 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012502 * Return: QDF_STATUS
Kiran Kumar Lokere999e58c2016-01-07 02:18:39 -080012503 */
Anurag Chouhan6d760662016-02-20 16:05:43 +053012504QDF_STATUS sme_roam_csa_ie_request(tHalHandle hHal, struct qdf_mac_addr bssid,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012505 uint8_t targetChannel, uint8_t csaIeReqd,
Amar Singhale4f28ee2015-10-21 14:36:56 -070012506 struct ch_params_s *ch_params)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012507{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012508 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012509 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
12510 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012511 if (QDF_IS_STATUS_SUCCESS(status)) {
Kiran Kumar Lokere999e58c2016-01-07 02:18:39 -080012512 status = csr_roam_send_chan_sw_ie_request(pMac, bssid,
12513 targetChannel, csaIeReqd, ch_params);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012514 sme_release_global_lock(&pMac->sme);
12515 }
12516 return status;
12517}
12518
12519/* ---------------------------------------------------------------------------
12520 \fn sme_init_thermal_info
12521 \brief SME API to initialize the thermal mitigation parameters
12522 \param hHal
12523 \param thermalParam : thermal mitigation parameters
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012524 \- return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012525 -------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012526QDF_STATUS sme_init_thermal_info(tHalHandle hHal, tSmeThermalParams thermalParam)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012527{
12528 t_thermal_mgmt *pWmaParam;
12529 cds_msg_t msg;
12530 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
12531
Anurag Chouhan600c3a02016-03-01 10:33:54 +053012532 pWmaParam = (t_thermal_mgmt *) qdf_mem_malloc(sizeof(t_thermal_mgmt));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012533 if (NULL == pWmaParam) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053012534 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012535 "%s: could not allocate tThermalMgmt", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012536 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012537 }
12538
Anurag Chouhan600c3a02016-03-01 10:33:54 +053012539 qdf_mem_zero((void *)pWmaParam, sizeof(t_thermal_mgmt));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012540
12541 pWmaParam->thermalMgmtEnabled = thermalParam.smeThermalMgmtEnabled;
12542 pWmaParam->throttlePeriod = thermalParam.smeThrottlePeriod;
Poddar, Siddarth83905022016-04-16 17:56:08 -070012543
12544 pWmaParam->throttle_duty_cycle_tbl[0] =
12545 thermalParam.sme_throttle_duty_cycle_tbl[0];
12546 pWmaParam->throttle_duty_cycle_tbl[1] =
12547 thermalParam.sme_throttle_duty_cycle_tbl[1];
12548 pWmaParam->throttle_duty_cycle_tbl[2] =
12549 thermalParam.sme_throttle_duty_cycle_tbl[2];
12550 pWmaParam->throttle_duty_cycle_tbl[3] =
12551 thermalParam.sme_throttle_duty_cycle_tbl[3];
12552
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012553 pWmaParam->thermalLevels[0].minTempThreshold =
12554 thermalParam.smeThermalLevels[0].smeMinTempThreshold;
12555 pWmaParam->thermalLevels[0].maxTempThreshold =
12556 thermalParam.smeThermalLevels[0].smeMaxTempThreshold;
12557 pWmaParam->thermalLevels[1].minTempThreshold =
12558 thermalParam.smeThermalLevels[1].smeMinTempThreshold;
12559 pWmaParam->thermalLevels[1].maxTempThreshold =
12560 thermalParam.smeThermalLevels[1].smeMaxTempThreshold;
12561 pWmaParam->thermalLevels[2].minTempThreshold =
12562 thermalParam.smeThermalLevels[2].smeMinTempThreshold;
12563 pWmaParam->thermalLevels[2].maxTempThreshold =
12564 thermalParam.smeThermalLevels[2].smeMaxTempThreshold;
12565 pWmaParam->thermalLevels[3].minTempThreshold =
12566 thermalParam.smeThermalLevels[3].smeMinTempThreshold;
12567 pWmaParam->thermalLevels[3].maxTempThreshold =
12568 thermalParam.smeThermalLevels[3].smeMaxTempThreshold;
12569
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012570 if (QDF_STATUS_SUCCESS == sme_acquire_global_lock(&pMac->sme)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012571 msg.type = WMA_INIT_THERMAL_INFO_CMD;
12572 msg.bodyptr = pWmaParam;
12573
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012574 if (!QDF_IS_STATUS_SUCCESS
Anurag Chouhan6d760662016-02-20 16:05:43 +053012575 (cds_mq_post_message(QDF_MODULE_ID_WMA, &msg))) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053012576 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012577 "%s: Not able to post WMA_SET_THERMAL_INFO_CMD to WMA!",
12578 __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053012579 qdf_mem_free(pWmaParam);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012580 sme_release_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012581 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012582 }
12583 sme_release_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012584 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012585 }
Anurag Chouhan600c3a02016-03-01 10:33:54 +053012586 qdf_mem_free(pWmaParam);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012587 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012588}
12589
12590/**
12591 * sme_add_set_thermal_level_callback() - Plug in set thermal level callback
12592 * @hal: Handle returned by macOpen
12593 * @callback: sme_set_thermal_level_callback
12594 *
12595 * Plug in set thermal level callback
12596 *
12597 * Return: none
12598 */
12599void sme_add_set_thermal_level_callback(tHalHandle hal,
12600 sme_set_thermal_level_callback callback)
12601{
12602 tpAniSirGlobal pMac = PMAC_STRUCT(hal);
12603
12604 pMac->sme.set_thermal_level_cb = callback;
12605}
12606
12607/**
12608 * sme_set_thermal_level() - SME API to set the thermal mitigation level
12609 * @hal: Handler to HAL
12610 * @level: Thermal mitigation level
12611 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012612 * Return: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012613 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012614QDF_STATUS sme_set_thermal_level(tHalHandle hal, uint8_t level)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012615{
12616 cds_msg_t msg;
12617 tpAniSirGlobal pMac = PMAC_STRUCT(hal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012618 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012619
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012620 if (QDF_STATUS_SUCCESS == sme_acquire_global_lock(&pMac->sme)) {
Anurag Chouhan600c3a02016-03-01 10:33:54 +053012621 qdf_mem_set(&msg, sizeof(msg), 0);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012622 msg.type = WMA_SET_THERMAL_LEVEL;
12623 msg.bodyval = level;
12624
Anurag Chouhan6d760662016-02-20 16:05:43 +053012625 qdf_status = cds_mq_post_message(QDF_MODULE_ID_WMA, &msg);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012626 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053012627 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012628 "%s: Not able to post WMA_SET_THERMAL_LEVEL to WMA!",
12629 __func__);
12630 sme_release_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012631 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012632 }
12633 sme_release_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012634 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012635 }
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012636 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012637}
12638
12639/* ---------------------------------------------------------------------------
12640 \fn sme_txpower_limit
12641 \brief SME API to set txpower limits
12642 \param hHal
12643 \param psmetx : power limits for 2g/5g
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012644 \- return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012645 -------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012646QDF_STATUS sme_txpower_limit(tHalHandle hHal, tSirTxPowerLimit *psmetx)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012647{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012648 QDF_STATUS status = QDF_STATUS_SUCCESS;
12649 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012650 cds_msg_t cds_message;
12651 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Prashanth Bhatta75fa9a12016-01-11 18:30:08 -080012652 tSirTxPowerLimit *tx_power_limit;
12653
Anurag Chouhan600c3a02016-03-01 10:33:54 +053012654 tx_power_limit = qdf_mem_malloc(sizeof(*tx_power_limit));
Prashanth Bhatta75fa9a12016-01-11 18:30:08 -080012655 if (!tx_power_limit) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053012656 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prashanth Bhatta75fa9a12016-01-11 18:30:08 -080012657 "%s: Memory allocation for TxPowerLimit failed!",
12658 __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012659 return QDF_STATUS_E_FAILURE;
Prashanth Bhatta75fa9a12016-01-11 18:30:08 -080012660 }
12661
12662 *tx_power_limit = *psmetx;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012663
12664 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012665 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012666 cds_message.type = WMA_TX_POWER_LIMIT;
12667 cds_message.reserved = 0;
Prashanth Bhatta75fa9a12016-01-11 18:30:08 -080012668 cds_message.bodyptr = tx_power_limit;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012669
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012670 qdf_status = cds_mq_post_message(CDS_MQ_ID_WMA, &cds_message);
12671 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053012672 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012673 "%s: not able to post WMA_TX_POWER_LIMIT",
12674 __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012675 status = QDF_STATUS_E_FAILURE;
Anurag Chouhan600c3a02016-03-01 10:33:54 +053012676 qdf_mem_free(tx_power_limit);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012677 }
12678 sme_release_global_lock(&pMac->sme);
12679 }
12680 return status;
12681}
12682
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012683QDF_STATUS sme_update_connect_debug(tHalHandle hHal, uint32_t set_value)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012684{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012685 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012686 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
12687 pMac->fEnableDebugLog = set_value;
12688 return status;
12689}
12690
12691/* ---------------------------------------------------------------------------
12692 \fn sme_ap_disable_intra_bss_fwd
12693
12694 \brief
12695 SME will send message to WMA to set Intra BSS in txrx
12696
12697 \param
12698
12699 hHal - The handle returned by mac_open
12700
12701 sessionId - session id ( vdev id)
12702
12703 disablefwd - bool value that indicate disable intrabss fwd disable
12704
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012705 \return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012706 --------------------------------------------------------------------------- */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012707QDF_STATUS sme_ap_disable_intra_bss_fwd(tHalHandle hHal, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012708 bool disablefwd)
12709{
12710 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012711 int status = QDF_STATUS_SUCCESS;
12712 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012713 cds_msg_t cds_message;
12714 tpDisableIntraBssFwd pSapDisableIntraFwd = NULL;
12715
12716 /* Prepare the request to send to SME. */
Anurag Chouhan600c3a02016-03-01 10:33:54 +053012717 pSapDisableIntraFwd = qdf_mem_malloc(sizeof(tDisableIntraBssFwd));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012718 if (NULL == pSapDisableIntraFwd) {
12719 sms_log(pMac, LOGP, "Memory Allocation Failure!!! %s", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012720 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012721 }
12722
Anurag Chouhan600c3a02016-03-01 10:33:54 +053012723 qdf_mem_zero(pSapDisableIntraFwd, sizeof(tDisableIntraBssFwd));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012724
12725 pSapDisableIntraFwd->sessionId = sessionId;
12726 pSapDisableIntraFwd->disableintrabssfwd = disablefwd;
12727
12728 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012729 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012730 /* serialize the req through MC thread */
12731 cds_message.bodyptr = pSapDisableIntraFwd;
12732 cds_message.type = WMA_SET_SAP_INTRABSS_DIS;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012733 qdf_status = cds_mq_post_message(CDS_MQ_ID_WMA, &cds_message);
12734 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
12735 status = QDF_STATUS_E_FAILURE;
Anurag Chouhan600c3a02016-03-01 10:33:54 +053012736 qdf_mem_free(pSapDisableIntraFwd);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012737 }
12738 sme_release_global_lock(&pMac->sme);
12739 }
12740 return status;
12741}
12742
12743#ifdef WLAN_FEATURE_STATS_EXT
12744
12745/******************************************************************************
12746 \fn sme_stats_ext_register_callback
12747
12748 \brief
12749 a function called to register the callback that send vendor event for stats
12750 ext
12751
12752 \param callback - callback to be registered
12753******************************************************************************/
12754void sme_stats_ext_register_callback(tHalHandle hHal, StatsExtCallback callback)
12755{
12756 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
12757
12758 pMac->sme.StatsExtCallback = callback;
12759}
12760
Arun Khandavalli4b55da72016-07-19 19:55:01 +053012761/**
12762 * sme_stats_ext_deregister_callback() - De-register ext stats callback
12763 * @h_hal: Hal Handle
12764 *
12765 * This function is called to de initialize the HDD NAN feature. Currently
12766 * the only operation required is to de-register a callback with SME.
12767 *
12768 * Return: None
12769 */
12770void sme_stats_ext_deregister_callback(tHalHandle h_hal)
12771{
12772 tpAniSirGlobal pmac;
12773
12774 if (!h_hal) {
12775 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
12776 FL("hHal is not valid"));
12777 return;
12778 }
12779
12780 pmac = PMAC_STRUCT(h_hal);
12781 pmac->sme.StatsExtCallback = NULL;
12782}
12783
12784
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012785/******************************************************************************
12786 \fn sme_stats_ext_request
12787
12788 \brief
12789 a function called when HDD receives STATS EXT vendor command from userspace
12790
12791 \param sessionID - vdevID for the stats ext request
12792
12793 \param input - Stats Ext Request structure ptr
12794
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012795 \return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012796******************************************************************************/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012797QDF_STATUS sme_stats_ext_request(uint8_t session_id, tpStatsExtRequestReq input)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012798{
12799 cds_msg_t msg;
12800 tpStatsExtRequest data;
12801 size_t data_len;
12802
12803 data_len = sizeof(tStatsExtRequest) + input->request_data_len;
Anurag Chouhan600c3a02016-03-01 10:33:54 +053012804 data = qdf_mem_malloc(data_len);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012805
12806 if (data == NULL) {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012807 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012808 }
12809
Anurag Chouhan600c3a02016-03-01 10:33:54 +053012810 qdf_mem_zero(data, data_len);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012811 data->vdev_id = session_id;
12812 data->request_data_len = input->request_data_len;
12813 if (input->request_data_len) {
Anurag Chouhan600c3a02016-03-01 10:33:54 +053012814 qdf_mem_copy(data->request_data,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012815 input->request_data, input->request_data_len);
12816 }
12817
12818 msg.type = WMA_STATS_EXT_REQUEST;
12819 msg.reserved = 0;
12820 msg.bodyptr = data;
12821
Anurag Chouhan6d760662016-02-20 16:05:43 +053012822 if (QDF_STATUS_SUCCESS != cds_mq_post_message(QDF_MODULE_ID_WMA, &msg)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053012823 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012824 "%s: Not able to post WMA_STATS_EXT_REQUEST message to WMA",
12825 __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053012826 qdf_mem_free(data);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012827 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012828 }
12829
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012830 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012831}
12832
12833/******************************************************************************
12834 \fn sme_stats_ext_event
12835
12836 \brief
12837 a callback function called when SME received eWNI_SME_STATS_EXT_EVENT
12838 response from WMA
12839
12840 \param hHal - HAL handle for device
12841 \param pMsg - Message body passed from WMA; includes NAN header
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012842 \return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012843******************************************************************************/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012844QDF_STATUS sme_stats_ext_event(tHalHandle hHal, void *pMsg)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012845{
12846 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012847 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012848
12849 if (NULL == pMsg) {
12850 sms_log(pMac, LOGE, "in %s msg ptr is NULL", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012851 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012852 } else {
12853 sms_log(pMac, LOG2, "SME: entering %s", __func__);
12854
12855 if (pMac->sme.StatsExtCallback) {
12856 pMac->sme.StatsExtCallback(pMac->hHdd,
12857 (tpStatsExtEvent) pMsg);
12858 }
12859 }
12860
12861 return status;
12862}
12863
12864#endif
12865
12866/* ---------------------------------------------------------------------------
12867 \fn sme_update_dfs_scan_mode
12868 \brief Update DFS roam scan mode
12869 This function is called through dynamic setConfig callback function
12870 to configure allowDFSChannelRoam.
12871 \param hHal - HAL handle for device
12872 \param sessionId - Session Identifier
12873 \param allowDFSChannelRoam - DFS roaming scan mode 0 (disable),
12874 1 (passive), 2 (active)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012875 \return QDF_STATUS_SUCCESS - SME update DFS roaming scan config
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012876 successfully.
12877 Other status means SME failed to update DFS roaming scan config.
12878 \sa
12879 -------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012880QDF_STATUS sme_update_dfs_scan_mode(tHalHandle hHal, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012881 uint8_t allowDFSChannelRoam)
12882{
12883 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012884 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012885
12886 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012887 if (QDF_IS_STATUS_SUCCESS(status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053012888 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012889 "LFR runtime successfully set AllowDFSChannelRoam Mode to "
12890 "%d - old value is %d - roam state is %s",
12891 allowDFSChannelRoam,
12892 pMac->roam.configParam.allowDFSChannelRoam,
12893 mac_trace_get_neighbour_roam_state(pMac->roam.
12894 neighborRoamInfo
12895 [sessionId].
12896 neighborRoamState));
12897 pMac->roam.configParam.allowDFSChannelRoam =
12898 allowDFSChannelRoam;
12899 sme_release_global_lock(&pMac->sme);
12900 }
12901 if (pMac->roam.configParam.isRoamOffloadScanEnabled) {
12902 csr_roam_offload_scan(pMac, sessionId,
12903 ROAM_SCAN_OFFLOAD_UPDATE_CFG,
12904 REASON_ROAM_DFS_SCAN_MODE_CHANGED);
12905 }
12906
12907 return status;
12908}
12909
12910/*--------------------------------------------------------------------------
12911 \brief sme_get_dfs_scan_mode() - get DFS roam scan mode
12912 This is a synchronous call
12913 \param hHal - The handle returned by mac_open.
12914 \return DFS roaming scan mode 0 (disable), 1 (passive), 2 (active)
12915 \sa
12916 --------------------------------------------------------------------------*/
12917uint8_t sme_get_dfs_scan_mode(tHalHandle hHal)
12918{
12919 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
12920 return pMac->roam.configParam.allowDFSChannelRoam;
12921}
12922
12923/*----------------------------------------------------------------------------
12924 \fn sme_modify_add_ie
12925 \brief This function sends msg to updates the additional IE buffers in PE
12926 \param hHal - global structure
12927 \param pModifyIE - pointer to tModifyIE structure
12928 \param updateType - type of buffer
12929 \- return Success or failure
12930 -----------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012931QDF_STATUS sme_modify_add_ie(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012932 tSirModifyIE *pModifyIE, eUpdateIEsType updateType)
12933{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012934 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012935 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
12936 status = sme_acquire_global_lock(&pMac->sme);
12937
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012938 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012939 status = csr_roam_modify_add_ies(pMac, pModifyIE, updateType);
12940 sme_release_global_lock(&pMac->sme);
12941 }
12942 return status;
12943}
12944
12945/*----------------------------------------------------------------------------
12946 \fn sme_update_add_ie
12947 \brief This function sends msg to updates the additional IE buffers in PE
12948 \param hHal - global structure
12949 \param pUpdateIE - pointer to structure tUpdateIE
12950 \param updateType - type of buffer
12951 \- return Success or failure
12952 -----------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012953QDF_STATUS sme_update_add_ie(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012954 tSirUpdateIE *pUpdateIE, eUpdateIEsType updateType)
12955{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012956 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012957 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
12958 status = sme_acquire_global_lock(&pMac->sme);
12959
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012960 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012961 status = csr_roam_update_add_ies(pMac, pUpdateIE, updateType);
12962 sme_release_global_lock(&pMac->sme);
12963 }
12964 return status;
12965}
12966
12967/* ---------------------------------------------------------------------------
12968 \fn sme_sta_in_middle_of_roaming
12969 \brief This function returns true if STA is in the middle of roaming state
12970 \param hHal - HAL handle for device
12971 \param sessionId - Session Identifier
12972 \- return true or false
12973 -------------------------------------------------------------------------*/
12974bool sme_sta_in_middle_of_roaming(tHalHandle hHal, uint8_t sessionId)
12975{
12976 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012977 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012978 bool ret = false;
12979
12980 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012981 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012982 ret = csr_neighbor_middle_of_roaming(hHal, sessionId);
12983 sme_release_global_lock(&pMac->sme);
12984 }
12985 return ret;
12986}
12987
12988
12989/**
12990 * sme_update_dsc_pto_up_mapping()
12991 * @hHal: HAL context
12992 * @dscpmapping: pointer to DSCP mapping structure
12993 * @sessionId: SME session id
12994 *
12995 * This routine is called to update dscp mapping
12996 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012997 * Return: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012998 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012999QDF_STATUS sme_update_dsc_pto_up_mapping(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013000 sme_QosWmmUpType *dscpmapping,
13001 uint8_t sessionId)
13002{
13003 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013004 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013005 uint8_t i, j, peSessionId;
13006 tCsrRoamSession *pCsrSession = NULL;
13007 tpPESession pSession = NULL;
13008
13009 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013010 if (!QDF_IS_STATUS_SUCCESS(status))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013011 return status;
13012 pCsrSession = CSR_GET_SESSION(pMac, sessionId);
13013 if (pCsrSession == NULL) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053013014 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013015 FL("Session lookup fails for CSR session"));
13016 sme_release_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013017 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013018 }
13019 if (!CSR_IS_SESSION_VALID(pMac, sessionId)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053013020 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013021 FL("Invalid session Id %u"), sessionId);
13022 sme_release_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013023 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013024 }
13025
13026 pSession = pe_find_session_by_bssid(pMac,
13027 pCsrSession->connectedProfile.bssid.bytes,
13028 &peSessionId);
13029
13030 if (pSession == NULL) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053013031 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013032 FL(" Session lookup fails for BSSID"));
13033 sme_release_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013034 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013035 }
13036
13037 if (!pSession->QosMapSet.present) {
Anurag Chouhan05d124f2016-09-03 16:21:50 +053013038 hdd_notice("QOS Mapping IE not present");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013039 sme_release_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013040 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013041 }
13042 for (i = 0; i < SME_QOS_WMM_UP_MAX; i++) {
13043 for (j = pSession->QosMapSet.dscp_range[i][0];
13044 j <= pSession->QosMapSet.dscp_range[i][1];
13045 j++) {
13046 if ((pSession->QosMapSet.dscp_range[i][0] == 255)
13047 && (pSession->QosMapSet.dscp_range[i][1] ==
13048 255)) {
13049 dscpmapping[j] = 0;
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053013050 QDF_TRACE(QDF_MODULE_ID_SME,
13051 QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013052 FL("User Priority %d isn't used"), i);
13053 break;
13054 } else {
13055 dscpmapping[j] = i;
13056 }
13057 }
13058 }
13059 for (i = 0; i < pSession->QosMapSet.num_dscp_exceptions; i++)
13060 if (pSession->QosMapSet.dscp_exceptions[i][0] != 255)
13061 dscpmapping[pSession->QosMapSet.dscp_exceptions[i][0]] =
13062 pSession->QosMapSet.dscp_exceptions[i][1];
13063
13064 sme_release_global_lock(&pMac->sme);
13065 return status;
13066}
13067
13068/* ---------------------------------------------------------------------------
13069 \fn sme_abort_roam_scan
13070 \brief API to abort current roam scan cycle by roam scan offload module.
13071 \param hHal - The handle returned by mac_open.
13072 \param sessionId - Session Identifier
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013073 \return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013074 ---------------------------------------------------------------------------*/
13075
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013076QDF_STATUS sme_abort_roam_scan(tHalHandle hHal, uint8_t sessionId)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013077{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013078 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013079 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
13080
13081 sms_log(pMac, LOGW, "entering function %s", __func__);
13082 if (pMac->roam.configParam.isRoamOffloadScanEnabled) {
13083 /* acquire the lock for the sme object */
13084 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013085 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013086 csr_roam_offload_scan(pMac, sessionId,
13087 ROAM_SCAN_OFFLOAD_ABORT_SCAN,
13088 REASON_ROAM_ABORT_ROAM_SCAN);
13089 /* release the lock for the sme object */
13090 sme_release_global_lock(&pMac->sme);
13091 }
13092 }
13093
13094 return status;
13095}
13096
13097#ifdef FEATURE_WLAN_EXTSCAN
13098/**
13099 * sme_get_valid_channels_by_band() - to fetch valid channels filtered by band
13100 * @hHal: HAL context
13101 * @wifiBand: RF band information
13102 * @aValidChannels: output array to store channel info
13103 * @pNumChannels: output number of channels
13104 *
13105 * SME API to fetch all valid channels filtered by band
13106 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013107 * Return: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013108 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013109QDF_STATUS sme_get_valid_channels_by_band(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013110 uint8_t wifiBand,
13111 uint32_t *aValidChannels,
13112 uint8_t *pNumChannels)
13113{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013114 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013115 uint8_t chanList[WNI_CFG_VALID_CHANNEL_LIST_LEN] = { 0 };
13116 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
13117 uint8_t numChannels = 0;
13118 uint8_t i = 0;
13119 uint32_t totValidChannels = WNI_CFG_VALID_CHANNEL_LIST_LEN;
13120
13121 if (!aValidChannels || !pNumChannels) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053013122 sms_log(pMac, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013123 FL("Output channel list/NumChannels is NULL"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013124 return QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013125 }
13126
13127 if ((wifiBand < WIFI_BAND_UNSPECIFIED) || (wifiBand >= WIFI_BAND_MAX)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053013128 sms_log(pMac, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013129 FL("Invalid wifiBand (%d)"), wifiBand);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013130 return QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013131 }
13132
13133 status = sme_get_cfg_valid_channels(hHal, &chanList[0],
13134 &totValidChannels);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013135 if (!QDF_IS_STATUS_SUCCESS(status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053013136 sms_log(pMac, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013137 FL("Fail to get valid channel list (err=%d)"), status);
13138 return status;
13139 }
13140
13141 switch (wifiBand) {
13142 case WIFI_BAND_UNSPECIFIED:
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053013143 sms_log(pMac, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013144 FL("Unspec Band, return all (%d) valid channels"),
13145 totValidChannels);
13146 numChannels = totValidChannels;
13147 for (i = 0; i < totValidChannels; i++) {
13148 aValidChannels[i] = cds_chan_to_freq(chanList[i]);
13149 }
13150 break;
13151
13152 case WIFI_BAND_BG:
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053013153 sms_log(pMac, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013154 FL("WIFI_BAND_BG (2.4 GHz)"));
13155 for (i = 0; i < totValidChannels; i++) {
13156 if (CDS_IS_CHANNEL_24GHZ(chanList[i])) {
13157 aValidChannels[numChannels++] =
13158 cds_chan_to_freq(chanList[i]);
13159 }
13160 }
13161 break;
13162
13163 case WIFI_BAND_A:
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053013164 sms_log(pMac, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013165 FL("WIFI_BAND_A (5 GHz without DFS)"));
13166 for (i = 0; i < totValidChannels; i++) {
13167 if (CDS_IS_CHANNEL_5GHZ(chanList[i]) &&
13168 !CDS_IS_DFS_CH(chanList[i])) {
13169 aValidChannels[numChannels++] =
13170 cds_chan_to_freq(chanList[i]);
13171 }
13172 }
13173 break;
13174
13175 case WIFI_BAND_ABG:
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053013176 sms_log(pMac, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013177 FL("WIFI_BAND_ABG (2.4 GHz + 5 GHz; no DFS)"));
13178 for (i = 0; i < totValidChannels; i++) {
13179 if ((CDS_IS_CHANNEL_24GHZ(chanList[i]) ||
13180 CDS_IS_CHANNEL_5GHZ(chanList[i])) &&
13181 !CDS_IS_DFS_CH(chanList[i])) {
13182 aValidChannels[numChannels++] =
13183 cds_chan_to_freq(chanList[i]);
13184 }
13185 }
13186 break;
13187
13188 case WIFI_BAND_A_DFS_ONLY:
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053013189 sms_log(pMac, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013190 FL("WIFI_BAND_A_DFS (5 GHz DFS only)"));
13191 for (i = 0; i < totValidChannels; i++) {
13192 if (CDS_IS_CHANNEL_5GHZ(chanList[i]) &&
13193 CDS_IS_DFS_CH(chanList[i])) {
13194 aValidChannels[numChannels++] =
13195 cds_chan_to_freq(chanList[i]);
13196 }
13197 }
13198 break;
13199
13200 case WIFI_BAND_A_WITH_DFS:
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053013201 sms_log(pMac, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013202 FL("WIFI_BAND_A_WITH_DFS (5 GHz with DFS)"));
13203 for (i = 0; i < totValidChannels; i++) {
13204 if (CDS_IS_CHANNEL_5GHZ(chanList[i])) {
13205 aValidChannels[numChannels++] =
13206 cds_chan_to_freq(chanList[i]);
13207 }
13208 }
13209 break;
13210
13211 case WIFI_BAND_ABG_WITH_DFS:
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053013212 sms_log(pMac, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013213 FL("WIFI_BAND_ABG_WITH_DFS (2.4 GHz+5 GHz with DFS)"));
13214 for (i = 0; i < totValidChannels; i++) {
13215 if (CDS_IS_CHANNEL_24GHZ(chanList[i]) ||
13216 CDS_IS_CHANNEL_5GHZ(chanList[i])) {
13217 aValidChannels[numChannels++] =
13218 cds_chan_to_freq(chanList[i]);
13219 }
13220 }
13221 break;
13222
13223 default:
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053013224 sms_log(pMac, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013225 FL("Unknown wifiBand (%d))"), wifiBand);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013226 return QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013227 break;
13228 }
13229 *pNumChannels = numChannels;
13230
13231 return status;
13232}
13233
13234/* ---------------------------------------------------------------------------
13235 \fn sme_ext_scan_get_capabilities
13236 \brief SME API to fetch extscan capabilities
13237 \param hHal
13238 \param pReq: extscan capabilities structure
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013239 \- return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013240 -------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013241QDF_STATUS sme_ext_scan_get_capabilities(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013242 tSirGetExtScanCapabilitiesReqParams *
13243 pReq)
13244{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013245 QDF_STATUS status = QDF_STATUS_SUCCESS;
13246 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013247 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
13248 cds_msg_t cds_message;
13249
13250 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013251 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013252 /* Serialize the req through MC thread */
13253 cds_message.bodyptr = pReq;
13254 cds_message.type = WMA_EXTSCAN_GET_CAPABILITIES_REQ;
Sreelakshmi Konamki6a065362016-05-31 16:05:01 +053013255 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
13256 NO_SESSION, cds_message.type));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013257 qdf_status = cds_mq_post_message(CDS_MQ_ID_WMA, &cds_message);
13258 if (!QDF_IS_STATUS_SUCCESS(qdf_status))
13259 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013260
13261 sme_release_global_lock(&pMac->sme);
13262 }
13263 return status;
13264}
13265
13266/* ---------------------------------------------------------------------------
13267 \fn sme_ext_scan_start
13268 \brief SME API to issue extscan start
13269 \param hHal
13270 \param pStartCmd: extscan start structure
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013271 \- return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013272 -------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013273QDF_STATUS sme_ext_scan_start(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013274 tSirWifiScanCmdReqParams *pStartCmd)
13275{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013276 QDF_STATUS status = QDF_STATUS_SUCCESS;
13277 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013278 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
13279 cds_msg_t cds_message;
13280
13281 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013282 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013283 /* Serialize the req through MC thread */
13284 cds_message.bodyptr = pStartCmd;
13285 cds_message.type = WMA_EXTSCAN_START_REQ;
Sreelakshmi Konamki6a065362016-05-31 16:05:01 +053013286 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
13287 NO_SESSION, cds_message.type));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013288 qdf_status = cds_mq_post_message(CDS_MQ_ID_WMA, &cds_message);
13289 if (!QDF_IS_STATUS_SUCCESS(qdf_status))
13290 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013291
13292 sme_release_global_lock(&pMac->sme);
13293 }
13294 return status;
13295}
13296
13297/* ---------------------------------------------------------------------------
13298 \fn sme_ext_scan_stop
13299 \brief SME API to issue extscan stop
13300 \param hHal
13301 \param pStopReq: extscan stop structure
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013302 \- return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013303 -------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013304QDF_STATUS sme_ext_scan_stop(tHalHandle hHal, tSirExtScanStopReqParams *pStopReq)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013305{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013306 QDF_STATUS status = QDF_STATUS_SUCCESS;
13307 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013308 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
13309 cds_msg_t cds_message;
13310
13311 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013312 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013313 /* Serialize the req through MC thread */
13314 cds_message.bodyptr = pStopReq;
13315 cds_message.type = WMA_EXTSCAN_STOP_REQ;
Sreelakshmi Konamki6a065362016-05-31 16:05:01 +053013316 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
13317 NO_SESSION, cds_message.type));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013318 qdf_status = cds_mq_post_message(CDS_MQ_ID_WMA, &cds_message);
13319 if (!QDF_IS_STATUS_SUCCESS(qdf_status))
13320 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013321 sme_release_global_lock(&pMac->sme);
13322 }
13323 return status;
13324}
13325
13326/* ---------------------------------------------------------------------------
13327 \fn sme_set_bss_hotlist
13328 \brief SME API to set BSSID hotlist
13329 \param hHal
13330 \param pSetHotListReq: extscan set hotlist structure
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013331 \- return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013332 -------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013333QDF_STATUS sme_set_bss_hotlist(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013334 tSirExtScanSetBssidHotListReqParams *
13335 pSetHotListReq)
13336{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013337 QDF_STATUS status = QDF_STATUS_SUCCESS;
13338 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013339 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
13340 cds_msg_t cds_message;
13341
13342 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013343 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013344 /* Serialize the req through MC thread */
13345 cds_message.bodyptr = pSetHotListReq;
13346 cds_message.type = WMA_EXTSCAN_SET_BSSID_HOTLIST_REQ;
Sreelakshmi Konamki6a065362016-05-31 16:05:01 +053013347 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
13348 NO_SESSION, cds_message.type));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013349 qdf_status = cds_mq_post_message(CDS_MQ_ID_WMA, &cds_message);
13350 if (!QDF_IS_STATUS_SUCCESS(qdf_status))
13351 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013352
13353 sme_release_global_lock(&pMac->sme);
13354 }
13355 return status;
13356}
13357
13358/* ---------------------------------------------------------------------------
13359 \fn sme_reset_bss_hotlist
13360 \brief SME API to reset BSSID hotlist
13361 \param hHal
13362 \param pSetHotListReq: extscan set hotlist structure
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013363 \- return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013364 -------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013365QDF_STATUS sme_reset_bss_hotlist(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013366 tSirExtScanResetBssidHotlistReqParams *
13367 pResetReq)
13368{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013369 QDF_STATUS status = QDF_STATUS_SUCCESS;
13370 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013371 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
13372 cds_msg_t cds_message;
13373
13374 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013375 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013376 /* Serialize the req through MC thread */
13377 cds_message.bodyptr = pResetReq;
13378 cds_message.type = WMA_EXTSCAN_RESET_BSSID_HOTLIST_REQ;
Sreelakshmi Konamki6a065362016-05-31 16:05:01 +053013379 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
13380 NO_SESSION, cds_message.type));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013381 qdf_status = cds_mq_post_message(CDS_MQ_ID_WMA, &cds_message);
13382 if (!QDF_IS_STATUS_SUCCESS(qdf_status))
13383 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013384
13385 sme_release_global_lock(&pMac->sme);
13386 }
13387 return status;
13388}
13389
Manikandan Mohan80dea792016-04-28 16:36:48 -070013390/**
13391 * sme_send_wisa_params(): Pass WISA mode to WMA
13392 * @hal: HAL context
13393 * @wisa_params: pointer to WISA params struct
13394 * @sessionId: SME session id
13395 *
13396 * Pass WISA params to WMA
13397 *
13398 * Return: QDF_STATUS
13399 */
13400QDF_STATUS sme_set_wisa_params(tHalHandle hal,
13401 struct sir_wisa_params *wisa_params)
13402{
13403 QDF_STATUS status = QDF_STATUS_SUCCESS;
13404 tpAniSirGlobal mac = PMAC_STRUCT(hal);
13405 cds_msg_t cds_message;
13406 struct sir_wisa_params *cds_msg_wisa_params;
13407
13408 cds_msg_wisa_params = qdf_mem_malloc(sizeof(struct sir_wisa_params));
13409 if (!cds_msg_wisa_params)
13410 return QDF_STATUS_E_NOMEM;
13411
13412 *cds_msg_wisa_params = *wisa_params;
13413 status = sme_acquire_global_lock(&mac->sme);
13414 if (QDF_IS_STATUS_SUCCESS(status)) {
13415 cds_message.bodyptr = cds_msg_wisa_params;
13416 cds_message.type = WMA_SET_WISA_PARAMS;
13417 status = cds_mq_post_message(CDS_MQ_ID_WMA, &cds_message);
13418 sme_release_global_lock(&mac->sme);
13419 }
13420 return status;
13421}
13422
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013423/* ---------------------------------------------------------------------------
13424 \fn sme_set_significant_change
13425 \brief SME API to set significant change
13426 \param hHal
13427 \param pSetSignificantChangeReq: extscan set significant change structure
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013428 \- return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013429 -------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013430QDF_STATUS sme_set_significant_change(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013431 tSirExtScanSetSigChangeReqParams *
13432 pSetSignificantChangeReq)
13433{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013434 QDF_STATUS status = QDF_STATUS_SUCCESS;
13435 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013436 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
13437 cds_msg_t cds_message;
13438
13439 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013440 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013441 /* Serialize the req through MC thread */
13442 cds_message.bodyptr = pSetSignificantChangeReq;
13443 cds_message.type = WMA_EXTSCAN_SET_SIGNF_CHANGE_REQ;
Sreelakshmi Konamki6a065362016-05-31 16:05:01 +053013444 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
13445 NO_SESSION, cds_message.type));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013446 qdf_status = cds_mq_post_message(CDS_MQ_ID_WMA, &cds_message);
13447 if (!QDF_IS_STATUS_SUCCESS(qdf_status))
13448 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013449
13450 sme_release_global_lock(&pMac->sme);
13451 }
13452 return status;
13453}
13454
13455/* ---------------------------------------------------------------------------
13456 \fn sme_reset_significant_change
13457 \brief SME API to reset significant change
13458 \param hHal
13459 \param pResetReq: extscan reset significant change structure
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013460 \- return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013461 -------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013462QDF_STATUS sme_reset_significant_change(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013463 tSirExtScanResetSignificantChangeReqParams
13464 *pResetReq)
13465{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013466 QDF_STATUS status = QDF_STATUS_SUCCESS;
13467 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013468 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
13469 cds_msg_t cds_message;
13470
13471 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013472 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013473 /* Serialize the req through MC thread */
13474 cds_message.bodyptr = pResetReq;
13475 cds_message.type = WMA_EXTSCAN_RESET_SIGNF_CHANGE_REQ;
Sreelakshmi Konamki6a065362016-05-31 16:05:01 +053013476 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
13477 NO_SESSION, cds_message.type));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013478 qdf_status = cds_mq_post_message(CDS_MQ_ID_WMA, &cds_message);
13479 if (!QDF_IS_STATUS_SUCCESS(qdf_status))
13480 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013481
13482 sme_release_global_lock(&pMac->sme);
13483 }
13484 return status;
13485}
13486
13487/* ---------------------------------------------------------------------------
13488 \fn sme_get_cached_results
13489 \brief SME API to get cached results
13490 \param hHal
13491 \param pCachedResultsReq: extscan get cached results structure
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013492 \- return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013493 -------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013494QDF_STATUS sme_get_cached_results(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013495 tSirExtScanGetCachedResultsReqParams *
13496 pCachedResultsReq)
13497{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013498 QDF_STATUS status = QDF_STATUS_SUCCESS;
13499 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013500 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
13501 cds_msg_t cds_message;
13502
13503 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013504 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013505 /* Serialize the req through MC thread */
13506 cds_message.bodyptr = pCachedResultsReq;
13507 cds_message.type = WMA_EXTSCAN_GET_CACHED_RESULTS_REQ;
Sreelakshmi Konamki6a065362016-05-31 16:05:01 +053013508 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
13509 NO_SESSION, cds_message.type));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013510 qdf_status = cds_mq_post_message(CDS_MQ_ID_WMA, &cds_message);
13511 if (!QDF_IS_STATUS_SUCCESS(qdf_status))
13512 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013513
13514 sme_release_global_lock(&pMac->sme);
13515 }
13516 return status;
13517}
13518
13519/**
13520 * sme_set_epno_list() - set epno network list
Deepak Dhamdhere0f076bd2016-06-02 11:29:21 -070013521 * @hal: global hal handle
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013522 * @input: request message
13523 *
13524 * This function constructs the cds message and fill in message type,
13525 * bodyptr with %input and posts it to WDA queue.
13526 *
Deepak Dhamdhere0f076bd2016-06-02 11:29:21 -070013527 * Return: QDF_STATUS enumeration
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013528 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013529QDF_STATUS sme_set_epno_list(tHalHandle hal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013530 struct wifi_epno_params *input)
13531{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013532 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013533 tpAniSirGlobal mac = PMAC_STRUCT(hal);
13534 cds_msg_t cds_message;
13535 struct wifi_epno_params *req_msg;
13536 int len, i;
13537
13538 sms_log(mac, LOG1, FL("enter"));
13539 len = sizeof(*req_msg) +
13540 (input->num_networks * sizeof(struct wifi_epno_network));
Anurag Chouhan600c3a02016-03-01 10:33:54 +053013541 req_msg = qdf_mem_malloc(len);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013542 if (!req_msg) {
Anurag Chouhan600c3a02016-03-01 10:33:54 +053013543 sms_log(mac, LOGE, FL("qdf_mem_malloc failed"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013544 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013545 }
13546
Anurag Chouhan600c3a02016-03-01 10:33:54 +053013547 qdf_mem_zero(req_msg, len);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013548 req_msg->num_networks = input->num_networks;
13549 req_msg->request_id = input->request_id;
13550 req_msg->session_id = input->session_id;
13551 for (i = 0; i < req_msg->num_networks; i++) {
13552 req_msg->networks[i].rssi_threshold =
13553 input->networks[i].rssi_threshold;
13554 req_msg->networks[i].flags = input->networks[i].flags;
13555 req_msg->networks[i].auth_bit_field =
13556 input->networks[i].auth_bit_field;
13557 req_msg->networks[i].ssid.length =
13558 input->networks[i].ssid.length;
Anurag Chouhan600c3a02016-03-01 10:33:54 +053013559 qdf_mem_copy(req_msg->networks[i].ssid.ssId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013560 input->networks[i].ssid.ssId,
13561 req_msg->networks[i].ssid.length);
13562 }
13563
13564 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013565 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013566 sms_log(mac, LOGE,
13567 FL("sme_acquire_global_lock failed!(status=%d)"),
13568 status);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053013569 qdf_mem_free(req_msg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013570 return status;
13571 }
13572
13573 /* Serialize the req through MC thread */
13574 cds_message.bodyptr = req_msg;
13575 cds_message.type = WMA_SET_EPNO_LIST_REQ;
13576 status = cds_mq_post_message(CDS_MQ_ID_WMA, &cds_message);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013577 if (!QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013578 sms_log(mac, LOGE,
13579 FL("cds_mq_post_message failed!(err=%d)"),
13580 status);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053013581 qdf_mem_free(req_msg);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013582 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013583 }
13584 sme_release_global_lock(&mac->sme);
13585 return status;
13586}
13587
13588/**
13589 * sme_set_passpoint_list() - set passpoint network list
13590 * @hal: global hal handle
13591 * @input: request message
13592 *
13593 * This function constructs the cds message and fill in message type,
13594 * bodyptr with @input and posts it to WDA queue.
13595 *
Deepak Dhamdhere0f076bd2016-06-02 11:29:21 -070013596 * Return: QDF_STATUS enumeration
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013597 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013598QDF_STATUS sme_set_passpoint_list(tHalHandle hal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013599 struct wifi_passpoint_req *input)
13600{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013601 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013602 tpAniSirGlobal mac = PMAC_STRUCT(hal);
13603 cds_msg_t cds_message;
13604 struct wifi_passpoint_req *req_msg;
13605 int len, i;
13606
13607 sms_log(mac, LOG1, FL("enter"));
13608 len = sizeof(*req_msg) +
13609 (input->num_networks * sizeof(struct wifi_passpoint_network));
Anurag Chouhan600c3a02016-03-01 10:33:54 +053013610 req_msg = qdf_mem_malloc(len);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013611 if (!req_msg) {
Anurag Chouhan600c3a02016-03-01 10:33:54 +053013612 sms_log(mac, LOGE, FL("qdf_mem_malloc failed"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013613 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013614 }
13615
Anurag Chouhan600c3a02016-03-01 10:33:54 +053013616 qdf_mem_zero(req_msg, len);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013617 req_msg->num_networks = input->num_networks;
13618 req_msg->request_id = input->request_id;
13619 req_msg->session_id = input->session_id;
13620 for (i = 0; i < req_msg->num_networks; i++) {
13621 req_msg->networks[i].id =
13622 input->networks[i].id;
Anurag Chouhan600c3a02016-03-01 10:33:54 +053013623 qdf_mem_copy(req_msg->networks[i].realm,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013624 input->networks[i].realm,
13625 strlen(input->networks[i].realm) + 1);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053013626 qdf_mem_copy(req_msg->networks[i].plmn,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013627 input->networks[i].plmn,
13628 SIR_PASSPOINT_PLMN_LEN);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053013629 qdf_mem_copy(req_msg->networks[i].roaming_consortium_ids,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013630 input->networks[i].roaming_consortium_ids,
13631 sizeof(req_msg->networks[i].roaming_consortium_ids));
13632 }
13633
13634 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013635 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013636 sms_log(mac, LOGE,
13637 FL("sme_acquire_global_lock failed!(status=%d)"),
13638 status);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053013639 qdf_mem_free(req_msg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013640 return status;
13641 }
13642
13643 /* Serialize the req through MC thread */
13644 cds_message.bodyptr = req_msg;
13645 cds_message.type = WMA_SET_PASSPOINT_LIST_REQ;
13646 status = cds_mq_post_message(CDS_MQ_ID_WMA, &cds_message);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013647 if (!QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013648 sms_log(mac, LOGE,
13649 FL("cds_mq_post_message failed!(err=%d)"),
13650 status);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053013651 qdf_mem_free(req_msg);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013652 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013653 }
13654 sme_release_global_lock(&mac->sme);
13655 return status;
13656}
13657
13658/**
13659 * sme_reset_passpoint_list() - reset passpoint network list
13660 * @hHal: global hal handle
13661 * @input: request message
13662 *
Deepak Dhamdhere0f076bd2016-06-02 11:29:21 -070013663 * Return: QDF_STATUS enumeration
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013664 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013665QDF_STATUS sme_reset_passpoint_list(tHalHandle hal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013666 struct wifi_passpoint_req *input)
13667{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013668 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013669 tpAniSirGlobal mac = PMAC_STRUCT(hal);
13670 cds_msg_t cds_message;
13671 struct wifi_passpoint_req *req_msg;
13672
13673 sms_log(mac, LOG1, FL("enter"));
Anurag Chouhan600c3a02016-03-01 10:33:54 +053013674 req_msg = qdf_mem_malloc(sizeof(*req_msg));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013675 if (!req_msg) {
Anurag Chouhan600c3a02016-03-01 10:33:54 +053013676 sms_log(mac, LOGE, FL("qdf_mem_malloc failed"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013677 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013678 }
13679
Anurag Chouhan600c3a02016-03-01 10:33:54 +053013680 qdf_mem_zero(req_msg, sizeof(*req_msg));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013681 req_msg->request_id = input->request_id;
13682 req_msg->session_id = input->session_id;
13683
13684 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013685 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013686 sms_log(mac, LOGE,
13687 FL("sme_acquire_global_lock failed!(status=%d)"),
13688 status);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053013689 qdf_mem_free(req_msg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013690 return status;
13691 }
13692
13693 /* Serialize the req through MC thread */
13694 cds_message.bodyptr = req_msg;
13695 cds_message.type = WMA_RESET_PASSPOINT_LIST_REQ;
13696 status = cds_mq_post_message(CDS_MQ_ID_WMA, &cds_message);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013697 if (!QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013698 sms_log(mac, LOGE,
13699 FL("cds_mq_post_message failed!(err=%d)"),
13700 status);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053013701 qdf_mem_free(req_msg);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013702 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013703 }
13704 sme_release_global_lock(&mac->sme);
13705 return status;
13706}
13707
13708/**
13709 * sme_set_ssid_hotlist() - Set the SSID hotlist
13710 * @hal: SME handle
13711 * @request: set ssid hotlist request
13712 *
Deepak Dhamdhere0f076bd2016-06-02 11:29:21 -070013713 * Return: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013714 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013715QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013716sme_set_ssid_hotlist(tHalHandle hal,
13717 struct sir_set_ssid_hotlist_request *request)
13718{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013719 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013720 tpAniSirGlobal mac = PMAC_STRUCT(hal);
13721 cds_msg_t cds_message;
13722 struct sir_set_ssid_hotlist_request *set_req;
13723
Anurag Chouhan600c3a02016-03-01 10:33:54 +053013724 set_req = qdf_mem_malloc(sizeof(*set_req));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013725 if (!set_req) {
Anurag Chouhan600c3a02016-03-01 10:33:54 +053013726 sms_log(mac, LOGE, FL("qdf_mem_malloc failed"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013727 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013728 }
13729
13730 *set_req = *request;
13731 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013732 if (QDF_STATUS_SUCCESS == status) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013733 /* Serialize the req through MC thread */
13734 cds_message.bodyptr = set_req;
13735 cds_message.type = WMA_EXTSCAN_SET_SSID_HOTLIST_REQ;
13736 status = cds_mq_post_message(CDS_MQ_ID_WMA, &cds_message);
13737 sme_release_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013738 if (!QDF_IS_STATUS_SUCCESS(status)) {
Anurag Chouhan600c3a02016-03-01 10:33:54 +053013739 qdf_mem_free(set_req);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013740 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013741 }
13742 } else {
13743 sms_log(mac, LOGE,
13744 FL("sme_acquire_global_lock failed!(status=%d)"),
13745 status);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053013746 qdf_mem_free(set_req);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013747 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013748 }
13749 return status;
13750}
13751
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013752QDF_STATUS sme_ext_scan_register_callback(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013753 void (*pExtScanIndCb)(void *,
13754 const uint16_t,
13755 void *))
13756{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013757 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013758 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
13759
13760 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013761 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013762 pMac->sme.pExtScanIndCb = pExtScanIndCb;
13763 sme_release_global_lock(&pMac->sme);
13764 }
13765 return status;
13766}
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013767#endif /* FEATURE_WLAN_EXTSCAN */
13768
13769#ifdef WLAN_FEATURE_LINK_LAYER_STATS
13770
13771/* ---------------------------------------------------------------------------
13772 \fn sme_ll_stats_clear_req
13773 \brief SME API to clear Link Layer Statistics
13774 \param hHal
13775 \param pclearStatsReq: Link Layer clear stats request params structure
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013776 \- return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013777 -------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013778QDF_STATUS sme_ll_stats_clear_req(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013779 tSirLLStatsClearReq *pclearStatsReq)
13780{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013781 QDF_STATUS status = QDF_STATUS_SUCCESS;
13782 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013783 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
13784 cds_msg_t cds_message;
13785 tSirLLStatsClearReq *clear_stats_req;
13786
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053013787 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013788 "staId = %u", pclearStatsReq->staId);
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053013789 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013790 "statsClearReqMask = 0x%X",
13791 pclearStatsReq->statsClearReqMask);
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053013792 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013793 "stopReq = %u", pclearStatsReq->stopReq);
13794
Anurag Chouhan600c3a02016-03-01 10:33:54 +053013795 clear_stats_req = qdf_mem_malloc(sizeof(*clear_stats_req));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013796
13797 if (!clear_stats_req) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053013798 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013799 "%s: Not able to allocate memory for WMA_LL_STATS_CLEAR_REQ",
13800 __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013801 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013802 }
13803
13804 *clear_stats_req = *pclearStatsReq;
13805
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013806 if (QDF_STATUS_SUCCESS == sme_acquire_global_lock(&pMac->sme)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013807 /* Serialize the req through MC thread */
13808 cds_message.bodyptr = clear_stats_req;
13809 cds_message.type = WMA_LINK_LAYER_STATS_CLEAR_REQ;
Sreelakshmi Konamki6a065362016-05-31 16:05:01 +053013810 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
13811 NO_SESSION, cds_message.type));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013812 qdf_status = cds_mq_post_message(CDS_MQ_ID_WMA, &cds_message);
13813 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053013814 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013815 "%s: not able to post WMA_LL_STATS_CLEAR_REQ",
13816 __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053013817 qdf_mem_free(clear_stats_req);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013818 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013819 }
13820 sme_release_global_lock(&pMac->sme);
13821 } else {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053013822 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR, "%s: "
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013823 "sme_acquire_global_lock error", __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053013824 qdf_mem_free(clear_stats_req);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013825 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013826 }
13827
13828 return status;
13829}
13830
13831/* ---------------------------------------------------------------------------
13832 \fn sme_ll_stats_set_req
13833 \brief SME API to set the Link Layer Statistics
13834 \param hHal
13835 \param psetStatsReq: Link Layer set stats request params structure
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013836 \- return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013837 -------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013838QDF_STATUS sme_ll_stats_set_req(tHalHandle hHal, tSirLLStatsSetReq *psetStatsReq)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013839{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013840 QDF_STATUS status = QDF_STATUS_SUCCESS;
13841 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013842 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
13843 cds_msg_t cds_message;
13844 tSirLLStatsSetReq *set_stats_req;
13845
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053013846 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013847 "%s: MPDU Size = %u", __func__,
13848 psetStatsReq->mpduSizeThreshold);
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053013849 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013850 " Aggressive Stats Collections = %u",
13851 psetStatsReq->aggressiveStatisticsGathering);
13852
Anurag Chouhan600c3a02016-03-01 10:33:54 +053013853 set_stats_req = qdf_mem_malloc(sizeof(*set_stats_req));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013854
13855 if (!set_stats_req) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053013856 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013857 "%s: Not able to allocate memory for WMA_LL_STATS_SET_REQ",
13858 __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013859 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013860 }
13861
13862 *set_stats_req = *psetStatsReq;
13863
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013864 if (QDF_STATUS_SUCCESS == sme_acquire_global_lock(&pMac->sme)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013865 /* Serialize the req through MC thread */
13866 cds_message.bodyptr = set_stats_req;
13867 cds_message.type = WMA_LINK_LAYER_STATS_SET_REQ;
Sreelakshmi Konamki6a065362016-05-31 16:05:01 +053013868 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
13869 NO_SESSION, cds_message.type));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013870 qdf_status = cds_mq_post_message(CDS_MQ_ID_WMA, &cds_message);
13871 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053013872 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013873 "%s: not able to post WMA_LL_STATS_SET_REQ",
13874 __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053013875 qdf_mem_free(set_stats_req);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013876 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013877 }
13878 sme_release_global_lock(&pMac->sme);
13879 } else {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053013880 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR, "%s: "
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013881 "sme_acquire_global_lock error", __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053013882 qdf_mem_free(set_stats_req);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013883 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013884 }
13885
13886 return status;
13887}
13888
13889/* ---------------------------------------------------------------------------
13890 \fn sme_ll_stats_get_req
13891 \brief SME API to get the Link Layer Statistics
13892 \param hHal
13893 \param pgetStatsReq: Link Layer get stats request params structure
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013894 \- return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013895 -------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013896QDF_STATUS sme_ll_stats_get_req(tHalHandle hHal, tSirLLStatsGetReq *pgetStatsReq)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013897{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013898 QDF_STATUS status = QDF_STATUS_SUCCESS;
13899 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013900 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
13901 cds_msg_t cds_message;
13902 tSirLLStatsGetReq *get_stats_req;
13903
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053013904 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013905 "reqId = %u", pgetStatsReq->reqId);
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053013906 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013907 "staId = %u", pgetStatsReq->staId);
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053013908 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013909 "Stats Type = %u", pgetStatsReq->paramIdMask);
13910
Anurag Chouhan600c3a02016-03-01 10:33:54 +053013911 get_stats_req = qdf_mem_malloc(sizeof(*get_stats_req));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013912
13913 if (!get_stats_req) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053013914 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013915 "%s: Not able to allocate memory for WMA_LL_STATS_GET_REQ",
13916 __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013917 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013918 }
13919
13920 *get_stats_req = *pgetStatsReq;
13921
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013922 if (QDF_STATUS_SUCCESS == sme_acquire_global_lock(&pMac->sme)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013923 /* Serialize the req through MC thread */
13924 cds_message.bodyptr = get_stats_req;
13925 cds_message.type = WMA_LINK_LAYER_STATS_GET_REQ;
Sreelakshmi Konamki6a065362016-05-31 16:05:01 +053013926 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
13927 NO_SESSION, cds_message.type));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013928 qdf_status = cds_mq_post_message(CDS_MQ_ID_WMA, &cds_message);
13929 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053013930 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013931 "%s: not able to post WMA_LL_STATS_GET_REQ",
13932 __func__);
13933
Anurag Chouhan600c3a02016-03-01 10:33:54 +053013934 qdf_mem_free(get_stats_req);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013935 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013936
13937 }
13938 sme_release_global_lock(&pMac->sme);
13939 } else {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053013940 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR, "%s: "
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013941 "sme_acquire_global_lock error", __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053013942 qdf_mem_free(get_stats_req);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013943 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013944 }
13945
13946 return status;
13947}
13948
13949/* ---------------------------------------------------------------------------
13950 \fn sme_set_link_layer_stats_ind_cb
13951 \brief SME API to trigger the stats are available after get request
13952 \param hHal
13953 \param callback_routine - HDD callback which needs to be invoked after
13954 getting status notification from FW
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013955 \- return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013956 -------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013957QDF_STATUS sme_set_link_layer_stats_ind_cb
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013958 (tHalHandle hHal,
13959 void (*callback_routine)(void *callbackCtx, int indType, void *pRsp)
13960 ) {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013961 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013962 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
13963
13964 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053013965 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013966 pMac->sme.pLinkLayerStatsIndCallback = callback_routine;
13967 sme_release_global_lock(&pMac->sme);
13968 } else {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053013969 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR, "%s: "
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013970 "sme_acquire_global_lock error", __func__);
13971 }
13972
13973 return status;
13974}
13975
Arun Khandavalli4b55da72016-07-19 19:55:01 +053013976/**
13977 * sme_reset_link_layer_stats_ind_cb() - SME API to reset link layer stats
13978 * indication
13979 * @h_hal: Hal Handle
13980 *
13981 * This function reset's the link layer stats indication
13982 *
13983 * Return: QDF_STATUS Enumeration
13984 */
13985
13986QDF_STATUS sme_reset_link_layer_stats_ind_cb(tHalHandle h_hal)
13987{
13988 QDF_STATUS status;
13989 tpAniSirGlobal pmac;
13990
13991 if (!h_hal) {
13992 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
13993 FL("hHal is not valid"));
13994 return QDF_STATUS_E_INVAL;
13995 }
13996 pmac = PMAC_STRUCT(h_hal);
13997
13998 status = sme_acquire_global_lock(&pmac->sme);
13999 if (QDF_IS_STATUS_SUCCESS(status)) {
14000 pmac->sme.pLinkLayerStatsIndCallback = NULL;
14001 sme_release_global_lock(&pmac->sme);
14002 } else {
14003 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR, "%s: sme_acquire_global_lock error",
14004 __func__);
14005 }
14006
14007 return status;
14008}
14009
14010
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014011#endif /* WLAN_FEATURE_LINK_LAYER_STATS */
14012
14013/**
14014 * sme_fw_mem_dump_register_cb() - Register fw memory dump callback
14015 *
14016 * @hal - MAC global handle
14017 * @callback_routine - callback routine from HDD
14018 *
14019 * This API is invoked by HDD to register its callback in SME
14020 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014021 * Return: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014022 */
14023#ifdef WLAN_FEATURE_MEMDUMP
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014024QDF_STATUS sme_fw_mem_dump_register_cb(tHalHandle hal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014025 void (*callback_routine)(void *cb_context,
14026 struct fw_dump_rsp *rsp))
14027{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014028 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014029 tpAniSirGlobal pmac = PMAC_STRUCT(hal);
14030
14031 status = sme_acquire_global_lock(&pmac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014032 if (QDF_STATUS_SUCCESS == status) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014033 pmac->sme.fw_dump_callback = callback_routine;
14034 sme_release_global_lock(&pmac->sme);
14035 } else {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053014036 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014037 FL("sme_acquire_global_lock error"));
14038 }
14039
14040 return status;
14041}
14042#else
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014043QDF_STATUS sme_fw_mem_dump_register_cb(tHalHandle hal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014044 void (*callback_routine)(void *cb_context,
14045 struct fw_dump_rsp *rsp))
14046{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014047 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014048}
14049#endif /* WLAN_FEATURE_MEMDUMP */
14050
14051/**
14052 * sme_fw_mem_dump_unregister_cb() - Unregister fw memory dump callback
14053 *
14054 * @hHal - MAC global handle
14055 *
14056 * This API is invoked by HDD to unregister its callback in SME
14057 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014058 * Return: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014059 */
14060#ifdef WLAN_FEATURE_MEMDUMP
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014061QDF_STATUS sme_fw_mem_dump_unregister_cb(tHalHandle hal)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014062{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014063 QDF_STATUS status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014064 tpAniSirGlobal pmac = PMAC_STRUCT(hal);
14065
14066 status = sme_acquire_global_lock(&pmac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014067 if (QDF_STATUS_SUCCESS == status) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014068 pmac->sme.fw_dump_callback = NULL;
14069 sme_release_global_lock(&pmac->sme);
14070 } else {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053014071 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014072 FL("sme_acquire_global_lock error"));
14073 }
14074
14075 return status;
14076}
14077#else
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014078QDF_STATUS sme_fw_mem_dump_unregister_cb(tHalHandle hal)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014079{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014080 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014081}
14082#endif /* WLAN_FEATURE_MEMDUMP */
14083
14084#ifdef WLAN_FEATURE_ROAM_OFFLOAD
14085/*--------------------------------------------------------------------------
14086 \brief sme_update_roam_offload_enabled() - enable/disable roam offload feaure
14087 It is used at in the REG_DYNAMIC_VARIABLE macro definition of
14088 \param hHal - The handle returned by mac_open.
14089 \param nRoamOffloadEnabled - The bool to update with
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014090 \return QDF_STATUS_SUCCESS - SME update config successfully.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014091 Other status means SME is failed to update.
14092 \sa
14093 --------------------------------------------------------------------------*/
14094
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014095QDF_STATUS sme_update_roam_offload_enabled(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014096 bool nRoamOffloadEnabled)
14097{
14098 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014099 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014100
14101 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014102 if (QDF_IS_STATUS_SUCCESS(status)) {
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 "%s: LFR3:gRoamOffloadEnabled is changed from %d to %d",
14105 __func__, pMac->roam.configParam.isRoamOffloadEnabled,
14106 nRoamOffloadEnabled);
14107 pMac->roam.configParam.isRoamOffloadEnabled =
14108 nRoamOffloadEnabled;
14109 sme_release_global_lock(&pMac->sme);
14110 }
14111
14112 return status;
14113}
14114
Deepak Dhamdheref2a7d8b2016-08-19 16:17:38 -070014115/**
14116 * sme_update_roam_key_mgmt_offload_enabled() - enable/disable key mgmt offload
14117 * This is a synchronous call
14118 * @hal_ctx: The handle returned by mac_open.
14119 * @session_id: Session Identifier
14120 * @key_mgmt_offload_enabled: key mgmt enable/disable flag
14121 * @okc_enabled: Opportunistic key caching enable/disable flag
14122 * Return: QDF_STATUS_SUCCESS - SME updated config successfully.
14123 * Other status means SME is failed to update.
14124 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014125
Deepak Dhamdheref2a7d8b2016-08-19 16:17:38 -070014126QDF_STATUS sme_update_roam_key_mgmt_offload_enabled(tHalHandle hal_ctx,
14127 uint8_t session_id,
14128 bool key_mgmt_offload_enabled,
14129 bool okc_enabled)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014130{
Deepak Dhamdheref2a7d8b2016-08-19 16:17:38 -070014131 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal_ctx);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014132 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014133
Deepak Dhamdheref2a7d8b2016-08-19 16:17:38 -070014134 status = sme_acquire_global_lock(&mac_ctx->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014135 if (QDF_IS_STATUS_SUCCESS(status)) {
Deepak Dhamdheref2a7d8b2016-08-19 16:17:38 -070014136 if (CSR_IS_SESSION_VALID(mac_ctx, session_id)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053014137 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO,
Deepak Dhamdheref2a7d8b2016-08-19 16:17:38 -070014138 "%s: LFR3: key_mgmt_offload_enabled changed to %d",
14139 __func__, key_mgmt_offload_enabled);
14140 status = csr_roam_set_key_mgmt_offload(mac_ctx,
14141 session_id,
14142 key_mgmt_offload_enabled,
14143 okc_enabled);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014144 } else {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014145 status = QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014146 }
Deepak Dhamdheref2a7d8b2016-08-19 16:17:38 -070014147 sme_release_global_lock(&mac_ctx->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014148 }
14149
14150 return status;
14151}
Prashanth Bhattabfc25292015-11-05 11:16:21 -080014152#endif
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014153
14154/* ---------------------------------------------------------------------------
14155 \fn sme_get_temperature
14156 \brief SME API to get the pdev temperature
14157 \param hHal
14158 \param temperature context
14159 \param pCallbackfn: callback fn with response (temperature)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014160 \- return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014161 -------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014162QDF_STATUS sme_get_temperature(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014163 void *tempContext,
14164 void (*pCallbackfn)(int temperature,
14165 void *pContext))
14166{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014167 QDF_STATUS status = QDF_STATUS_SUCCESS;
14168 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014169 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
14170 cds_msg_t cds_message;
14171
14172 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014173 if (QDF_STATUS_SUCCESS == status) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014174 if ((NULL == pCallbackfn) &&
14175 (NULL == pMac->sme.pGetTemperatureCb)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053014176 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014177 FL
14178 ("Indication Call back did not registered"));
14179 sme_release_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014180 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014181 } else if (NULL != pCallbackfn) {
14182 pMac->sme.pTemperatureCbContext = tempContext;
14183 pMac->sme.pGetTemperatureCb = pCallbackfn;
14184 }
14185 /* serialize the req through MC thread */
14186 cds_message.bodyptr = NULL;
14187 cds_message.type = WMA_GET_TEMPERATURE_REQ;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014188 qdf_status = cds_mq_post_message(CDS_MQ_ID_WMA, &cds_message);
14189 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053014190 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014191 FL("Post Get Temperature msg fail"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014192 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014193 }
14194 sme_release_global_lock(&pMac->sme);
14195 }
14196 return status;
14197}
14198
14199/* ---------------------------------------------------------------------------
14200 \fn sme_set_scanning_mac_oui
14201 \brief SME API to set scanning mac oui
14202 \param hHal
14203 \param pScanMacOui: Scanning Mac Oui (input 3 bytes)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014204 \- return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014205 -------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014206QDF_STATUS sme_set_scanning_mac_oui(tHalHandle hHal, tSirScanMacOui *pScanMacOui)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014207{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014208 QDF_STATUS status = QDF_STATUS_SUCCESS;
14209 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014210 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
14211 cds_msg_t cds_message;
14212
14213 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014214 if (QDF_STATUS_SUCCESS == status) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014215 /* Serialize the req through MC thread */
14216 cds_message.bodyptr = pScanMacOui;
14217 cds_message.type = WMA_SET_SCAN_MAC_OUI_REQ;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014218 qdf_status = cds_mq_post_message(CDS_MQ_ID_WMA, &cds_message);
14219 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053014220 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014221 FL("Msg post Set Scan Mac OUI failed"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014222 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014223 }
14224 sme_release_global_lock(&pMac->sme);
14225 }
14226 return status;
14227}
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014228
14229#ifdef DHCP_SERVER_OFFLOAD
14230/* ---------------------------------------------------------------------------
14231 \fn sme_set_dhcp_srv_offload
14232 \brief SME API to set DHCP server offload info
14233 \param hHal
14234 \param pDhcpSrvInfo : DHCP server offload info struct
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014235 \- return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014236 -------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014237QDF_STATUS sme_set_dhcp_srv_offload(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014238 tSirDhcpSrvOffloadInfo *pDhcpSrvInfo)
14239{
14240 cds_msg_t cds_message;
14241 tSirDhcpSrvOffloadInfo *pSmeDhcpSrvInfo;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014242 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014243 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
14244
Anurag Chouhan600c3a02016-03-01 10:33:54 +053014245 pSmeDhcpSrvInfo = qdf_mem_malloc(sizeof(*pSmeDhcpSrvInfo));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014246
14247 if (!pSmeDhcpSrvInfo) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053014248 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014249 "%s: Not able to allocate memory for WMA_SET_DHCP_SERVER_OFFLOAD_CMD",
14250 __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014251 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014252 }
14253
14254 *pSmeDhcpSrvInfo = *pDhcpSrvInfo;
14255
14256 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014257 if (QDF_STATUS_SUCCESS == status) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014258 /* serialize the req through MC thread */
14259 cds_message.type = WMA_SET_DHCP_SERVER_OFFLOAD_CMD;
14260 cds_message.bodyptr = pSmeDhcpSrvInfo;
14261
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014262 if (!QDF_IS_STATUS_SUCCESS
Anurag Chouhan6d760662016-02-20 16:05:43 +053014263 (cds_mq_post_message(QDF_MODULE_ID_WMA, &cds_message))) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053014264 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014265 "%s: Not able to post WMA_SET_DHCP_SERVER_OFFLOAD_CMD to WMA!",
14266 __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053014267 qdf_mem_free(pSmeDhcpSrvInfo);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014268 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014269 }
14270 sme_release_global_lock(&pMac->sme);
14271 } else {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053014272 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014273 "%s: sme_acquire_global_lock error!", __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053014274 qdf_mem_free(pSmeDhcpSrvInfo);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014275 }
14276
14277 return status;
14278}
14279#endif /* DHCP_SERVER_OFFLOAD */
14280
14281#ifdef WLAN_FEATURE_GPIO_LED_FLASHING
14282/* ---------------------------------------------------------------------------
14283 \fn sme_set_led_flashing
14284 \brief API to set the Led flashing parameters.
14285 \param hHal - The handle returned by mac_open.
14286 \param x0, x1 - led flashing parameters
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014287 \return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014288 ---------------------------------------------------------------------------*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014289QDF_STATUS sme_set_led_flashing(tHalHandle hHal, uint8_t type,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014290 uint32_t x0, uint32_t x1)
14291{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014292 QDF_STATUS status = QDF_STATUS_SUCCESS;
14293 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014294 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
14295 cds_msg_t cds_message;
14296 tSirLedFlashingReq *ledflashing;
14297
Anurag Chouhan600c3a02016-03-01 10:33:54 +053014298 ledflashing = qdf_mem_malloc(sizeof(*ledflashing));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014299 if (!ledflashing) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053014300 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014301 FL
14302 ("Not able to allocate memory for WMA_LED_TIMING_REQ"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014303 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014304 }
14305
14306 ledflashing->pattern_id = type;
14307 ledflashing->led_x0 = x0;
14308 ledflashing->led_x1 = x1;
14309
14310 status = sme_acquire_global_lock(&pMac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014311 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014312 /* Serialize the req through MC thread */
14313 cds_message.bodyptr = ledflashing;
14314 cds_message.type = WMA_LED_FLASHING_REQ;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014315 qdf_status = cds_mq_post_message(CDS_MQ_ID_WMA, &cds_message);
14316 if (!QDF_IS_STATUS_SUCCESS(qdf_status))
14317 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014318 sme_release_global_lock(&pMac->sme);
14319 }
14320 return status;
14321}
14322#endif
14323
14324/**
14325 * sme_handle_dfS_chan_scan() - handle DFS channel configuration
14326 * @h_hal: corestack handler
14327 * @dfs_flag: flag indicating dfs channel enable/disable
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014328 * Return: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014329 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014330QDF_STATUS sme_handle_dfs_chan_scan(tHalHandle h_hal, uint8_t dfs_flag)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014331{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014332 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014333 tpAniSirGlobal mac = PMAC_STRUCT(h_hal);
14334
14335 status = sme_acquire_global_lock(&mac->sme);
14336
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014337 if (QDF_STATUS_SUCCESS == status) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014338
14339 mac->scan.fEnableDFSChnlScan = dfs_flag;
14340
14341 /* update the channel list to the firmware */
14342 status = csr_update_channel_list(mac);
14343
14344 sme_release_global_lock(&mac->sme);
14345 }
14346
14347 return status;
14348}
14349
Edhar, Mahesh Kumardf2ec122015-11-16 11:33:16 +053014350#ifdef FEATURE_WLAN_MCC_TO_SCC_SWITCH
14351/**
14352 * sme_validate_sap_channel_switch() - validate target channel switch w.r.t
14353 * concurreny rules set to avoid channel interference.
14354 * @hal - Hal context
14355 * @sap_ch - channel to switch
14356 * @sap_phy_mode - phy mode of SAP
14357 * @cc_switch_mode - concurreny switch mode
14358 * @session_id - sme session id.
14359 *
14360 * Return: true if there is no channel interference else return false
14361 */
14362bool sme_validate_sap_channel_switch(tHalHandle hal,
14363 uint16_t sap_ch, eCsrPhyMode sap_phy_mode, uint8_t cc_switch_mode,
14364 uint8_t session_id)
14365{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014366 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Edhar, Mahesh Kumardf2ec122015-11-16 11:33:16 +053014367 tpAniSirGlobal mac = PMAC_STRUCT(hal);
14368 tCsrRoamSession *session = CSR_GET_SESSION(mac, session_id);
14369 uint16_t intf_channel = 0;
14370
14371 if (!session)
14372 return false;
14373
14374 session->ch_switch_in_progress = true;
14375 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014376 if (QDF_IS_STATUS_SUCCESS(status)) {
Edhar, Mahesh Kumardf2ec122015-11-16 11:33:16 +053014377 intf_channel = csr_check_concurrent_channel_overlap(mac, sap_ch,
14378 sap_phy_mode,
14379 cc_switch_mode);
14380 sme_release_global_lock(&mac->sme);
14381 } else {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053014382 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Edhar, Mahesh Kumardf2ec122015-11-16 11:33:16 +053014383 FL("sme_acquire_global_lock error!"));
14384 session->ch_switch_in_progress = false;
14385 return false;
14386 }
14387
14388 session->ch_switch_in_progress = false;
14389 return (intf_channel == 0) ? true : false;
14390}
14391#endif
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014392
14393/**
14394 * sme_configure_stats_avg_factor() - function to config avg. stats factor
14395 * @hal: hal
14396 * @session_id: session ID
14397 * @stats_avg_factor: average stats factor
14398 *
14399 * This function configures the stats avg factor in firmware
14400 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014401 * Return: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014402 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014403QDF_STATUS sme_configure_stats_avg_factor(tHalHandle hal, uint8_t session_id,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014404 uint16_t stats_avg_factor)
14405{
14406 cds_msg_t msg;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014407 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014408 tpAniSirGlobal mac = PMAC_STRUCT(hal);
14409 struct sir_stats_avg_factor *stats_factor;
14410
Anurag Chouhan600c3a02016-03-01 10:33:54 +053014411 stats_factor = qdf_mem_malloc(sizeof(*stats_factor));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014412
14413 if (!stats_factor) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053014414 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014415 "%s: Not able to allocate memory for SIR_HAL_CONFIG_STATS_FACTOR",
14416 __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014417 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014418 }
14419
14420 status = sme_acquire_global_lock(&mac->sme);
14421
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014422 if (QDF_STATUS_SUCCESS == status) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014423
14424 stats_factor->vdev_id = session_id;
14425 stats_factor->stats_avg_factor = stats_avg_factor;
14426
14427 /* serialize the req through MC thread */
14428 msg.type = SIR_HAL_CONFIG_STATS_FACTOR;
14429 msg.bodyptr = stats_factor;
14430
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014431 if (!QDF_IS_STATUS_SUCCESS(
Anurag Chouhan6d760662016-02-20 16:05:43 +053014432 cds_mq_post_message(QDF_MODULE_ID_WMA, &msg))) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053014433 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014434 "%s: Not able to post SIR_HAL_CONFIG_STATS_FACTOR to WMA!",
14435 __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053014436 qdf_mem_free(stats_factor);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014437 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014438 }
14439 sme_release_global_lock(&mac->sme);
14440 } else {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053014441 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014442 "%s: sme_acquire_global_lock error!",
14443 __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053014444 qdf_mem_free(stats_factor);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014445 }
14446
14447 return status;
14448}
14449
14450/**
14451 * sme_configure_guard_time() - function to configure guard time
14452 * @hal: hal
14453 * @session_id: session id
14454 * @guard_time: guard time
14455 *
14456 * This function configures the guard time in firmware
14457 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014458 * Return: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014459 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014460QDF_STATUS sme_configure_guard_time(tHalHandle hal, uint8_t session_id,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014461 uint32_t guard_time)
14462{
14463 cds_msg_t msg;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014464 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014465 tpAniSirGlobal mac = PMAC_STRUCT(hal);
14466 struct sir_guard_time_request *g_time;
14467
Anurag Chouhan600c3a02016-03-01 10:33:54 +053014468 g_time = qdf_mem_malloc(sizeof(*g_time));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014469
14470 if (!g_time) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053014471 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014472 "%s: Not able to allocate memory for SIR_HAL_CONFIG_GUARD_TIME",
14473 __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014474 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014475 }
14476
14477 status = sme_acquire_global_lock(&mac->sme);
14478
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014479 if (QDF_STATUS_SUCCESS == status) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014480
14481 g_time->vdev_id = session_id;
14482 g_time->guard_time = guard_time;
14483
14484 /* serialize the req through MC thread */
14485 msg.type = SIR_HAL_CONFIG_GUARD_TIME;
14486 msg.bodyptr = g_time;
14487
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014488 if (!QDF_IS_STATUS_SUCCESS(
Anurag Chouhan6d760662016-02-20 16:05:43 +053014489 cds_mq_post_message(QDF_MODULE_ID_WMA, &msg))) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053014490 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014491 "%s: Not able to post SIR_HAL_CONFIG_GUARD_TIME to WMA!",
14492 __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053014493 qdf_mem_free(g_time);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014494 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014495 }
14496 sme_release_global_lock(&mac->sme);
14497 } else {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053014498 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014499 "%s: sme_acquire_global_lock error!",
14500 __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053014501 qdf_mem_free(g_time);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014502 }
14503
14504 return status;
14505}
14506
14507/**
14508 * sme_configure_modulated_dtim() - function to configure modulated dtim
14509 * @h_hal: SME API to enable/disable modulated DTIM instantaneously
14510 * @session_id: session ID
14511 * @modulated_dtim: modulated dtim value
14512 *
14513 * This function configures the modulated dtim in firmware
14514 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014515 * Return: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014516 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014517QDF_STATUS sme_configure_modulated_dtim(tHalHandle h_hal, uint8_t session_id,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014518 uint32_t modulated_dtim)
14519{
14520 cds_msg_t msg;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014521 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014522 tpAniSirGlobal mac = PMAC_STRUCT(h_hal);
14523 wma_cli_set_cmd_t *iwcmd;
14524
Anurag Chouhan600c3a02016-03-01 10:33:54 +053014525 iwcmd = qdf_mem_malloc(sizeof(*iwcmd));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014526 if (NULL == iwcmd) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053014527 QDF_TRACE(QDF_MODULE_ID_SME,
14528 QDF_TRACE_LEVEL_FATAL,
Anurag Chouhanf04e84f2016-03-03 10:12:12 +053014529 "%s: qdf_mem_malloc failed", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014530 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014531 }
14532
14533 status = sme_acquire_global_lock(&mac->sme);
14534
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014535 if (QDF_STATUS_SUCCESS == status) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014536
Anurag Chouhan600c3a02016-03-01 10:33:54 +053014537 qdf_mem_zero((void *)iwcmd, sizeof(*iwcmd));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014538 iwcmd->param_value = modulated_dtim;
14539 iwcmd->param_vdev_id = session_id;
14540 iwcmd->param_id = GEN_PARAM_MODULATED_DTIM;
14541 iwcmd->param_vp_dev = GEN_CMD;
14542 msg.type = WMA_CLI_SET_CMD;
14543 msg.reserved = 0;
14544 msg.bodyptr = (void *)iwcmd;
14545
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014546 if (!QDF_IS_STATUS_SUCCESS(
Anurag Chouhan6d760662016-02-20 16:05:43 +053014547 cds_mq_post_message(QDF_MODULE_ID_WMA, &msg))) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053014548 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014549 "%s: Not able to post GEN_PARAM_DYNAMIC_DTIM to WMA!",
14550 __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053014551 qdf_mem_free(iwcmd);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014552 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014553 }
14554 sme_release_global_lock(&mac->sme);
14555 } else {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053014556 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014557 "%s: sme_acquire_global_lock error!",
14558 __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053014559 qdf_mem_free(iwcmd);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014560 }
14561
14562 return status;
14563}
14564
14565/*
14566 * sme_wifi_start_logger() - Send the start/stop logging command to WMA
14567 * to either start/stop logging
14568 * @hal: HAL context
14569 * @start_log: Structure containing the wifi start logger params
14570 *
14571 * This function sends the start/stop logging command to WMA
14572 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014573 * Return: QDF_STATUS_SUCCESS on successful posting
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014574 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014575QDF_STATUS sme_wifi_start_logger(tHalHandle hal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014576 struct sir_wifi_start_log start_log)
14577{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014578 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014579 tpAniSirGlobal mac = PMAC_STRUCT(hal);
14580 cds_msg_t cds_message;
14581 struct sir_wifi_start_log *req_msg;
14582 uint32_t len;
14583
14584 len = sizeof(*req_msg);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053014585 req_msg = qdf_mem_malloc(len);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014586 if (!req_msg) {
Anurag Chouhan600c3a02016-03-01 10:33:54 +053014587 sms_log(mac, LOGE, FL("qdf_mem_malloc failed"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014588 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014589 }
14590
Anurag Chouhan600c3a02016-03-01 10:33:54 +053014591 qdf_mem_zero(req_msg, len);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014592
14593 req_msg->verbose_level = start_log.verbose_level;
14594 req_msg->flag = start_log.flag;
14595 req_msg->ring_id = start_log.ring_id;
Srinivas Girigowdac34f11d2016-02-25 16:02:42 -080014596 req_msg->ini_triggered = start_log.ini_triggered;
14597 req_msg->user_triggered = start_log.user_triggered;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014598
14599 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014600 if (status != QDF_STATUS_SUCCESS) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014601 sms_log(mac, LOGE,
14602 FL("sme_acquire_global_lock failed(status=%d)"),
14603 status);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053014604 qdf_mem_free(req_msg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014605 return status;
14606 }
14607
14608 /* Serialize the req through MC thread */
14609 cds_message.bodyptr = req_msg;
14610 cds_message.type = SIR_HAL_START_STOP_LOGGING;
14611 status = cds_mq_post_message(CDS_MQ_ID_WMA, &cds_message);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014612 if (!QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014613 sms_log(mac, LOGE,
Arun Khandavalli2476ef52016-04-26 20:19:43 +053014614 FL("cds_mq_post_message failed!(err=%d)"),
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014615 status);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053014616 qdf_mem_free(req_msg);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014617 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014618 }
14619 sme_release_global_lock(&mac->sme);
14620
14621 return status;
14622}
14623
14624/**
14625 * sme_neighbor_middle_of_roaming() - Function to know if
14626 * STA is in the middle of roaming states
14627 * @hal: Handle returned by macOpen
14628 * @sessionId: sessionId of the STA session
14629 *
14630 * This function is a wrapper to call
14631 * csr_neighbor_middle_of_roaming to know STA is in the
14632 * middle of roaming states
14633 *
14634 * Return: True or False
14635 *
14636 */
14637bool sme_neighbor_middle_of_roaming(tHalHandle hHal, uint8_t sessionId)
14638{
14639 return csr_neighbor_middle_of_roaming(PMAC_STRUCT(hHal), sessionId);
14640}
14641
14642/*
14643 * sme_send_flush_logs_cmd_to_fw() - Flush FW logs
14644 * @mac: MAC handle
14645 *
14646 * This function is used to send the command that will
14647 * be used to flush the logs in the firmware
14648 *
Deepak Dhamdhere0f076bd2016-06-02 11:29:21 -070014649 * Return: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014650 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014651QDF_STATUS sme_send_flush_logs_cmd_to_fw(tpAniSirGlobal mac)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014652{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014653 QDF_STATUS status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014654 cds_msg_t message;
14655
14656 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014657 if (status != QDF_STATUS_SUCCESS) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014658 sms_log(mac, LOGE,
14659 FL("sme_acquire_global_lock failed!(status=%d)"),
14660 status);
14661 return status;
14662 }
14663
14664 /* Serialize the req through MC thread */
14665 message.bodyptr = NULL;
14666 message.type = SIR_HAL_FLUSH_LOG_TO_FW;
14667 status = cds_mq_post_message(CDS_MQ_ID_WMA, &message);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014668 if (!QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014669 sms_log(mac, LOGE,
14670 FL("cds_mq_post_message failed!(err=%d)"),
14671 status);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014672 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014673 }
14674 sme_release_global_lock(&mac->sme);
14675 return status;
14676}
14677
14678/**
14679 * sme_enable_uapsd_for_ac() - enable uapsd for access catagory requerst to WMA
14680 * @cds_ctx: cds context
14681 * @sta_id: station id
14682 * @ac: access catagory
14683 * @tid: tid value
14684 * @pri: user priority
14685 * @srvc_int: service interval
14686 * @sus_int: suspend interval
14687 * @dir: tspec direction
14688 * @psb: PSB value
14689 * @sessionId: session id
14690 * @delay_interval: delay interval
14691 *
Anurag Chouhanf04e84f2016-03-03 10:12:12 +053014692 * Return: QDF status
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014693 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014694QDF_STATUS sme_enable_uapsd_for_ac(void *cds_ctx, uint8_t sta_id,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014695 sme_ac_enum_type ac, uint8_t tid,
14696 uint8_t pri, uint32_t srvc_int,
14697 uint32_t sus_int,
14698 sme_tspec_dir_type dir,
14699 uint8_t psb, uint32_t sessionId,
14700 uint32_t delay_interval)
14701{
14702 void *wma_handle;
14703 t_wma_trigger_uapsd_params uapsd_params;
14704 enum uapsd_ac access_category;
14705
14706 if (!psb) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053014707 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014708 "No need to configure auto trigger:psb is 0");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014709 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014710 }
14711
Anurag Chouhan6d760662016-02-20 16:05:43 +053014712 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014713 if (!wma_handle) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053014714 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014715 "wma_handle is NULL");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014716 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014717 }
14718
14719 switch (ac) {
14720 case SME_AC_BK:
14721 access_category = UAPSD_BK;
14722 break;
14723 case SME_AC_BE:
14724 access_category = UAPSD_BE;
14725 break;
14726 case SME_AC_VI:
14727 access_category = UAPSD_VI;
14728 break;
14729 case SME_AC_VO:
14730 access_category = UAPSD_VO;
14731 break;
14732 default:
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014733 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014734 }
14735
14736 uapsd_params.wmm_ac = access_category;
14737 uapsd_params.user_priority = pri;
14738 uapsd_params.service_interval = srvc_int;
14739 uapsd_params.delay_interval = delay_interval;
14740 uapsd_params.suspend_interval = sus_int;
14741
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014742 if (QDF_STATUS_SUCCESS !=
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014743 wma_trigger_uapsd_params(wma_handle, sessionId, &uapsd_params)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053014744 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014745 "Failed to Trigger Uapsd params for sessionId %d",
14746 sessionId);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014747 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014748 }
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014749 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014750}
14751
14752/**
14753 * sme_disable_uapsd_for_ac() - disable uapsed access catagory request to WMA
14754 * @cds_ctx: cds context
14755 * @sta_id: station id
14756 * @ac: access catagory
14757 * @sessionId: session id
14758 *
Anurag Chouhanf04e84f2016-03-03 10:12:12 +053014759 * Return: QDF status
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014760 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014761QDF_STATUS sme_disable_uapsd_for_ac(void *cds_ctx, uint8_t sta_id,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014762 sme_ac_enum_type ac,
14763 uint32_t sessionId)
14764{
14765 void *wma_handle;
14766 enum uapsd_ac access_category;
14767
14768 switch (ac) {
14769 case SME_AC_BK:
14770 access_category = UAPSD_BK;
14771 break;
14772 case SME_AC_BE:
14773 access_category = UAPSD_BE;
14774 break;
14775 case SME_AC_VI:
14776 access_category = UAPSD_VI;
14777 break;
14778 case SME_AC_VO:
14779 access_category = UAPSD_VO;
14780 break;
14781 default:
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014782 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014783 }
14784
Anurag Chouhan6d760662016-02-20 16:05:43 +053014785 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014786 if (!wma_handle) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053014787 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014788 "wma handle is NULL");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014789 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014790 }
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014791 if (QDF_STATUS_SUCCESS !=
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014792 wma_disable_uapsd_per_ac(wma_handle, sessionId, access_category)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053014793 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014794 "Failed to disable uapsd for ac %d for sessionId %d",
14795 ac, sessionId);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014796 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014797 }
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014798 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014799}
14800
14801/**
14802 * sme_update_nss() - SME API to change the number for spatial streams
14803 * (1 or 2)
14804 * @hal: Handle returned by mac open
14805 * @nss: Number of spatial streams
14806 *
14807 * This function is used to update the number of spatial streams supported.
14808 *
14809 * Return: Success upon successfully changing nss else failure
14810 *
14811 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014812QDF_STATUS sme_update_nss(tHalHandle h_hal, uint8_t nss)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014813{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014814 QDF_STATUS status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014815 tpAniSirGlobal mac_ctx = PMAC_STRUCT(h_hal);
14816 uint32_t i, value = 0;
14817 union {
14818 uint16_t cfg_value16;
14819 tSirMacHTCapabilityInfo ht_cap_info;
14820 } uHTCapabilityInfo;
14821 tCsrRoamSession *csr_session;
14822
14823 status = sme_acquire_global_lock(&mac_ctx->sme);
14824
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014825 if (QDF_STATUS_SUCCESS == status) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014826 mac_ctx->roam.configParam.enable2x2 = (nss == 1) ? 0 : 1;
14827
14828 /* get the HT capability info*/
14829 sme_cfg_get_int(mac_ctx, WNI_CFG_HT_CAP_INFO, &value);
14830 uHTCapabilityInfo.cfg_value16 = (0xFFFF & value);
14831
14832 for (i = 0; i < CSR_ROAM_SESSION_MAX; i++) {
14833 if (CSR_IS_SESSION_VALID(mac_ctx, i)) {
14834 csr_session = &mac_ctx->roam.roamSession[i];
14835 csr_session->htConfig.ht_tx_stbc =
14836 uHTCapabilityInfo.ht_cap_info.txSTBC;
14837 }
14838 }
14839
14840 sme_release_global_lock(&mac_ctx->sme);
14841 }
14842 return status;
14843}
14844
14845/**
Archana Ramachandran5041b252016-04-25 14:29:25 -070014846 * sme_update_user_configured_nss() - sets the nss based on user request
14847 * @hal: Pointer to HAL
14848 * @nss: number of streams
14849 *
14850 * Return: None
14851 */
14852void sme_update_user_configured_nss(tHalHandle hal, uint8_t nss)
14853{
14854 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
14855
14856 mac_ctx->user_configured_nss = nss;
14857}
14858
14859/**
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014860 * sme_set_rssi_threshold_breached_cb() - set rssi threshold breached callback
Arun Khandavalli4b55da72016-07-19 19:55:01 +053014861 * @h_hal: global hal handle
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014862 * @cb: callback function pointer
14863 *
14864 * This function stores the rssi threshold breached callback function.
14865 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014866 * Return: QDF_STATUS enumeration.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014867 */
Arun Khandavalli4b55da72016-07-19 19:55:01 +053014868QDF_STATUS sme_set_rssi_threshold_breached_cb(tHalHandle h_hal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014869 void (*cb)(void *, struct rssi_breach_event *))
14870{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014871 QDF_STATUS status = QDF_STATUS_SUCCESS;
Arun Khandavalli4b55da72016-07-19 19:55:01 +053014872 tpAniSirGlobal mac;
14873
14874 if (!h_hal) {
14875 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
14876 FL("hHal is not valid"));
14877 return QDF_STATUS_E_INVAL;
14878 }
14879 mac = PMAC_STRUCT(h_hal);
14880
14881 status = sme_acquire_global_lock(&mac->sme);
14882 if (!QDF_IS_STATUS_SUCCESS(status)) {
14883 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
14884 FL("sme_acquire_global_lock failed!(status=%d)"),
14885 status);
14886 return status;
14887 }
14888
14889 mac->sme.rssi_threshold_breached_cb = cb;
14890 sme_release_global_lock(&mac->sme);
14891 return status;
14892}
14893
14894/**
14895 * sme_set_rssi_threshold_breached_cb() - Reset rssi threshold breached callback
14896 * @hal: global hal handle
14897 *
14898 * This function de-registers the rssi threshold breached callback function.
14899 *
14900 * Return: QDF_STATUS enumeration.
14901 */
14902QDF_STATUS sme_reset_rssi_threshold_breached_cb(tHalHandle hal)
14903{
14904 QDF_STATUS status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014905 tpAniSirGlobal mac = PMAC_STRUCT(hal);
14906
14907 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014908 if (!QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014909 sms_log(mac, LOGE,
14910 FL("sme_acquire_global_lock failed!(status=%d)"),
14911 status);
14912 return status;
14913 }
14914
Arun Khandavalli4b55da72016-07-19 19:55:01 +053014915 mac->sme.rssi_threshold_breached_cb = NULL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014916 sme_release_global_lock(&mac->sme);
14917 return status;
14918}
14919
14920/**
14921 * sme_is_any_session_in_connected_state() - SME wrapper API to
14922 * check if any session is in connected state or not.
14923 *
14924 * @hal: Handle returned by mac open
14925 *
14926 * This function is used to check if any valid sme session is in
14927 * connected state or not.
14928 *
14929 * Return: true if any session is connected, else false.
14930 *
14931 */
14932bool sme_is_any_session_in_connected_state(tHalHandle h_hal)
14933{
14934 tpAniSirGlobal mac_ctx = PMAC_STRUCT(h_hal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014935 QDF_STATUS status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014936 bool ret = false;
14937
14938 status = sme_acquire_global_lock(&mac_ctx->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014939 if (QDF_STATUS_SUCCESS == status) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014940 ret = csr_is_any_session_in_connect_state(mac_ctx);
14941 sme_release_global_lock(&mac_ctx->sme);
14942 }
14943 return ret;
14944}
14945
14946/**
14947 * sme_set_rssi_monitoring() - set rssi monitoring
14948 * @hal: global hal handle
14949 * @input: request message
14950 *
14951 * This function constructs the vos message and fill in message type,
14952 * bodyptr with @input and posts it to WDA queue.
14953 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014954 * Return: QDF_STATUS enumeration
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014955 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014956QDF_STATUS sme_set_rssi_monitoring(tHalHandle hal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014957 struct rssi_monitor_req *input)
14958{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014959 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014960 tpAniSirGlobal mac = PMAC_STRUCT(hal);
14961 cds_msg_t cds_message;
14962 struct rssi_monitor_req *req_msg;
14963
14964 sms_log(mac, LOG1, FL("enter"));
Anurag Chouhan600c3a02016-03-01 10:33:54 +053014965 req_msg = qdf_mem_malloc(sizeof(*req_msg));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014966 if (!req_msg) {
14967 sms_log(mac, LOGE, FL("memory allocation failed"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014968 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014969 }
14970
14971 *req_msg = *input;
14972
14973 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014974 if (!QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014975 sms_log(mac, LOGE,
14976 FL("sme_acquire_global_lock failed!(status=%d)"),
14977 status);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053014978 qdf_mem_free(req_msg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014979 return status;
14980 }
14981
14982 /* Serialize the req through MC thread */
14983 cds_message.bodyptr = req_msg;
14984 cds_message.type = WMA_SET_RSSI_MONITOR_REQ;
14985 status = cds_mq_post_message(CDS_MQ_ID_WMA, &cds_message);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014986 if (!QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014987 sms_log(mac, LOGE,
14988 FL("cds_mq_post_message failed!(err=%d)"),
14989 status);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053014990 qdf_mem_free(req_msg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014991 }
14992 sme_release_global_lock(&mac->sme);
14993
14994 return status;
14995}
14996
14997/**
14998 * sme_fw_mem_dump() - Get FW memory dump
14999 * @hHal: hal handle
15000 * @recvd_req: received memory dump request.
15001 *
15002 * This API is invoked by HDD to indicate FW to start
15003 * dumping firmware memory.
15004 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015005 * Return: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015006 */
15007#ifdef WLAN_FEATURE_MEMDUMP
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015008QDF_STATUS sme_fw_mem_dump(tHalHandle hHal, void *recvd_req)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015009{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015010 QDF_STATUS status = QDF_STATUS_SUCCESS;
15011 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015012 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
15013 cds_msg_t msg;
15014 struct fw_dump_req *send_req;
15015 struct fw_dump_seg_req seg_req;
15016 int loop;
15017
Anurag Chouhan600c3a02016-03-01 10:33:54 +053015018 send_req = qdf_mem_malloc(sizeof(*send_req));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015019 if (!send_req) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053015020 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015021 FL("Memory allocation failed for WDA_FW_MEM_DUMP"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015022 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015023 }
Anurag Chouhan600c3a02016-03-01 10:33:54 +053015024 qdf_mem_copy(send_req, recvd_req, sizeof(*send_req));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015025
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053015026 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015027 FL("request_id:%d num_seg:%d"),
15028 send_req->request_id, send_req->num_seg);
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053015029 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015030 FL("Segment Information"));
15031 for (loop = 0; loop < send_req->num_seg; loop++) {
15032 seg_req = send_req->segment[loop];
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053015033 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015034 FL("seg_number:%d"), loop);
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053015035 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015036 FL("seg_id:%d start_addr_lo:0x%x start_addr_hi:0x%x"),
15037 seg_req.seg_id, seg_req.seg_start_addr_lo,
15038 seg_req.seg_start_addr_hi);
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053015039 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015040 FL("seg_length:%d dst_addr_lo:0x%x dst_addr_hi:0x%x"),
15041 seg_req.seg_length, seg_req.dst_addr_lo,
15042 seg_req.dst_addr_hi);
15043 }
15044
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015045 if (QDF_STATUS_SUCCESS == sme_acquire_global_lock(&pMac->sme)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015046 msg.bodyptr = send_req;
15047 msg.type = WMA_FW_MEM_DUMP_REQ;
15048 msg.reserved = 0;
15049
Anurag Chouhan6d760662016-02-20 16:05:43 +053015050 qdf_status = cds_mq_post_message(QDF_MODULE_ID_WMA, &msg);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015051 if (QDF_STATUS_SUCCESS != qdf_status) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053015052 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015053 FL("Not able to post WMA_FW_MEM_DUMP"));
Anurag Chouhan600c3a02016-03-01 10:33:54 +053015054 qdf_mem_free(send_req);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015055 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015056 }
15057 sme_release_global_lock(&pMac->sme);
15058 } else {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053015059 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015060 FL("Failed to acquire SME Global Lock"));
Anurag Chouhan600c3a02016-03-01 10:33:54 +053015061 qdf_mem_free(send_req);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015062 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015063 }
15064
15065 return status;
15066}
15067#else
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015068QDF_STATUS sme_fw_mem_dump(tHalHandle hHal, void *recvd_req)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015069{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015070 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015071}
15072#endif /* WLAN_FEATURE_MEMDUMP */
15073
15074/*
Manishekar Chandrasekaran7009f252016-04-21 19:14:15 +053015075 * sme_pdev_set_pcl() - Send WMI_PDEV_SET_PCL_CMDID to the WMA
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015076 * @hal: Handle returned by macOpen
15077 * @msg: PCL channel list and length structure
15078 *
Manishekar Chandrasekaran7009f252016-04-21 19:14:15 +053015079 * Sends the command to WMA to send WMI_PDEV_SET_PCL_CMDID to FW
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015080 * Return: QDF_STATUS_SUCCESS on successful posting
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015081 */
Manishekar Chandrasekaran7009f252016-04-21 19:14:15 +053015082QDF_STATUS sme_pdev_set_pcl(tHalHandle hal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015083 struct sir_pcl_list msg)
15084{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015085 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015086 tpAniSirGlobal mac = PMAC_STRUCT(hal);
15087 cds_msg_t cds_message;
Manishekar Chandrasekaran7009f252016-04-21 19:14:15 +053015088 struct wmi_pcl_chan_weights *req_msg;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015089 uint32_t len, i;
15090
15091 len = sizeof(*req_msg);
15092
Anurag Chouhan600c3a02016-03-01 10:33:54 +053015093 req_msg = qdf_mem_malloc(len);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015094 if (!req_msg) {
Anurag Chouhan600c3a02016-03-01 10:33:54 +053015095 sms_log(mac, LOGE, FL("qdf_mem_malloc failed"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015096 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015097 }
15098
Anurag Chouhan600c3a02016-03-01 10:33:54 +053015099 qdf_mem_zero(req_msg, len);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015100
Manishekar Chandrasekaran7009f252016-04-21 19:14:15 +053015101 for (i = 0; i < msg.pcl_len; i++) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015102 req_msg->pcl_list[i] = msg.pcl_list[i];
Manishekar Chandrasekaran7009f252016-04-21 19:14:15 +053015103 req_msg->weight_list[i] = msg.weight_list[i];
15104 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015105
15106 req_msg->pcl_len = msg.pcl_len;
15107
15108 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015109 if (status != QDF_STATUS_SUCCESS) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015110 sms_log(mac, LOGE,
Deepak Dhamdhere0f076bd2016-06-02 11:29:21 -070015111 FL("sme_acquire_global_lock failed!(status=%d)"),
15112 status);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053015113 qdf_mem_free(req_msg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015114 return status;
15115 }
15116
15117 /* Serialize the req through MC thread */
15118 cds_message.bodyptr = req_msg;
Manishekar Chandrasekaran7009f252016-04-21 19:14:15 +053015119 cds_message.type = SIR_HAL_PDEV_SET_PCL_TO_FW;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015120 status = cds_mq_post_message(CDS_MQ_ID_WMA, &cds_message);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015121 if (!QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015122 sms_log(mac, LOGE,
Deepak Dhamdhere0f076bd2016-06-02 11:29:21 -070015123 FL("cds_mq_post_message failed!(err=%d)"),
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015124 status);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053015125 qdf_mem_free(req_msg);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015126 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015127 }
15128 sme_release_global_lock(&mac->sme);
15129
15130 return status;
15131}
15132
15133/*
Manishekar Chandrasekarand9640342016-04-27 12:28:26 +053015134 * sme_pdev_set_hw_mode() - Send WMI_PDEV_SET_HW_MODE_CMDID to the WMA
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015135 * @hal: Handle returned by macOpen
15136 * @msg: HW mode structure containing hw mode and callback details
15137 *
Manishekar Chandrasekarand9640342016-04-27 12:28:26 +053015138 * Sends the command to CSR to send WMI_PDEV_SET_HW_MODE_CMDID to FW
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015139 * Return: QDF_STATUS_SUCCESS on successful posting
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015140 */
Manishekar Chandrasekarand9640342016-04-27 12:28:26 +053015141QDF_STATUS sme_pdev_set_hw_mode(tHalHandle hal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015142 struct sir_hw_mode msg)
15143{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015144 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015145 tpAniSirGlobal mac = PMAC_STRUCT(hal);
15146 tSmeCmd *cmd = NULL;
15147
15148 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015149 if (!QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015150 sms_log(mac, LOGE, FL("Failed to acquire lock"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015151 return QDF_STATUS_E_RESOURCES;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015152 }
15153
15154 cmd = sme_get_command_buffer(mac);
15155 if (!cmd) {
15156 sms_log(mac, LOGE, FL("Get command buffer failed"));
15157 sme_release_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015158 return QDF_STATUS_E_NULL_VALUE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015159 }
15160
15161 cmd->command = e_sme_command_set_hw_mode;
15162 cmd->u.set_hw_mode_cmd.hw_mode_index = msg.hw_mode_index;
15163 cmd->u.set_hw_mode_cmd.set_hw_mode_cb = msg.set_hw_mode_cb;
Chandrasekaran, Manishekaref70c0d2015-10-20 19:54:55 +053015164 cmd->u.set_hw_mode_cmd.reason = msg.reason;
15165 cmd->u.set_hw_mode_cmd.session_id = msg.session_id;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015166
Chandrasekaran, Manishekarce2172e2016-02-18 16:12:43 +053015167 sms_log(mac, LOG1,
15168 FL("Queuing set hw mode to CSR, session:%d reason:%d"),
15169 cmd->u.set_hw_mode_cmd.session_id,
15170 cmd->u.set_hw_mode_cmd.reason);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015171 csr_queue_sme_command(mac, cmd, false);
15172
15173 sme_release_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015174 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015175}
15176
15177/**
15178 * sme_register_hw_mode_trans_cb() - HW mode transition callback registration
15179 * @hal: Handle returned by macOpen
15180 * @callback: HDD callback to be registered
15181 *
15182 * Registers the HDD callback with SME. This callback will be invoked when
15183 * HW mode transition event is received from the FW
15184 *
15185 * Return: None
15186 */
15187void sme_register_hw_mode_trans_cb(tHalHandle hal,
15188 hw_mode_transition_cb callback)
15189{
15190 tpAniSirGlobal mac = PMAC_STRUCT(hal);
15191
15192 mac->sme.sme_hw_mode_trans_cb = callback;
15193 sms_log(mac, LOG1, FL("HW mode transition callback registered"));
15194}
15195
15196/**
15197 * sme_nss_update_request() - Send beacon templete update to FW with new
15198 * nss value
15199 * @hal: Handle returned by macOpen
15200 * @vdev_id: the session id
15201 * @new_nss: the new nss value
15202 * @cback: hdd callback
15203 * @next_action: next action to happen at policy mgr after beacon update
15204 *
15205 * Sends the command to CSR to send to PE
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015206 * Return: QDF_STATUS_SUCCESS on successful posting
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015207 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015208QDF_STATUS sme_nss_update_request(tHalHandle hHal, uint32_t vdev_id,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015209 uint8_t new_nss, void *cback, uint8_t next_action,
Chandrasekaran, Manishekarce2172e2016-02-18 16:12:43 +053015210 void *hdd_context,
15211 enum sir_conn_update_reason reason)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015212{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015213 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015214 tpAniSirGlobal mac = PMAC_STRUCT(hHal);
15215 tSmeCmd *cmd = NULL;
15216
15217 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015218 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015219 cmd = sme_get_command_buffer(mac);
15220 if (!cmd) {
15221 sms_log(mac, LOGE, FL("Get command buffer failed"));
15222 sme_release_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015223 return QDF_STATUS_E_NULL_VALUE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015224 }
15225 cmd->command = e_sme_command_nss_update;
15226 /* Sessionized modules may require this info */
15227 cmd->sessionId = vdev_id;
15228 cmd->u.nss_update_cmd.new_nss = new_nss;
15229 cmd->u.nss_update_cmd.session_id = vdev_id;
15230 cmd->u.nss_update_cmd.nss_update_cb = cback;
15231 cmd->u.nss_update_cmd.context = hdd_context;
15232 cmd->u.nss_update_cmd.next_action = next_action;
Chandrasekaran, Manishekarce2172e2016-02-18 16:12:43 +053015233 cmd->u.nss_update_cmd.reason = reason;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015234
15235 sms_log(mac, LOG1, FL("Queuing e_sme_command_nss_update to CSR"));
15236 csr_queue_sme_command(mac, cmd, false);
15237 sme_release_global_lock(&mac->sme);
15238 }
15239 return status;
15240}
15241
15242/**
15243 * sme_soc_set_dual_mac_config() - Set dual mac configurations
15244 * @hal: Handle returned by macOpen
15245 * @msg: Structure containing the dual mac config parameters
15246 *
15247 * Queues configuration information to CSR to configure
15248 * WLAN firmware for the dual MAC features
15249 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015250 * Return: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015251 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015252QDF_STATUS sme_soc_set_dual_mac_config(tHalHandle hal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015253 struct sir_dual_mac_config msg)
15254{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015255 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015256 tpAniSirGlobal mac = PMAC_STRUCT(hal);
15257 tSmeCmd *cmd;
15258
15259 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015260 if (!QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015261 sms_log(mac, LOGE, FL("Failed to acquire lock"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015262 return QDF_STATUS_E_RESOURCES;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015263 }
15264
15265 cmd = sme_get_command_buffer(mac);
15266 if (!cmd) {
15267 sms_log(mac, LOGE, FL("Get command buffer failed"));
15268 sme_release_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015269 return QDF_STATUS_E_NULL_VALUE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015270 }
15271
15272 cmd->command = e_sme_command_set_dual_mac_config;
15273 cmd->u.set_dual_mac_cmd.scan_config = msg.scan_config;
15274 cmd->u.set_dual_mac_cmd.fw_mode_config = msg.fw_mode_config;
15275 cmd->u.set_dual_mac_cmd.set_dual_mac_cb = msg.set_dual_mac_cb;
15276
15277 sms_log(mac, LOG1,
15278 FL("Queuing e_sme_command_set_dual_mac_config to CSR: %x %x"),
15279 cmd->u.set_dual_mac_cmd.scan_config,
15280 cmd->u.set_dual_mac_cmd.fw_mode_config);
15281 csr_queue_sme_command(mac, cmd, false);
15282
15283 sme_release_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015284 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015285}
15286
Ravi Joshi9e891ba2015-11-09 19:03:46 -080015287#ifdef FEATURE_LFR_SUBNET_DETECTION
15288/**
15289 * sme_gateway_param_update() - to update gateway parameters with WMA
15290 * @Hal: hal handle
15291 * @gw_params: request parameters from HDD
15292 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015293 * Return: QDF_STATUS
Ravi Joshi9e891ba2015-11-09 19:03:46 -080015294 *
15295 * This routine will update gateway parameters to WMA
15296 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015297QDF_STATUS sme_gateway_param_update(tHalHandle Hal,
Ravi Joshi9e891ba2015-11-09 19:03:46 -080015298 struct gateway_param_update_req *gw_params)
15299{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015300 QDF_STATUS qdf_status;
Ravi Joshi9e891ba2015-11-09 19:03:46 -080015301 cds_msg_t cds_message;
15302 struct gateway_param_update_req *request_buf;
15303
Anurag Chouhan600c3a02016-03-01 10:33:54 +053015304 request_buf = qdf_mem_malloc(sizeof(*request_buf));
Ravi Joshi9e891ba2015-11-09 19:03:46 -080015305 if (NULL == request_buf) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053015306 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Ravi Joshi9e891ba2015-11-09 19:03:46 -080015307 FL("Not able to allocate memory for gw param update request"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015308 return QDF_STATUS_E_NOMEM;
Ravi Joshi9e891ba2015-11-09 19:03:46 -080015309 }
15310
15311 *request_buf = *gw_params;
15312
15313 cds_message.type = WMA_GW_PARAM_UPDATE_REQ;
15314 cds_message.reserved = 0;
15315 cds_message.bodyptr = request_buf;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015316 qdf_status = cds_mq_post_message(CDS_MQ_ID_WMA, &cds_message);
15317 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053015318 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Ravi Joshi9e891ba2015-11-09 19:03:46 -080015319 FL("Not able to post WMA_GW_PARAM_UPDATE_REQ message to HAL"));
Anurag Chouhan600c3a02016-03-01 10:33:54 +053015320 qdf_mem_free(request_buf);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015321 return QDF_STATUS_E_FAILURE;
Ravi Joshi9e891ba2015-11-09 19:03:46 -080015322 }
15323
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015324 return QDF_STATUS_SUCCESS;
Ravi Joshi9e891ba2015-11-09 19:03:46 -080015325}
15326#endif /* FEATURE_LFR_SUBNET_DETECTION */
15327
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015328/**
Archana Ramachandrana20ef812015-11-13 16:12:13 -080015329 * sme_soc_set_antenna_mode() - set antenna mode
15330 * @hal: Handle returned by macOpen
15331 * @msg: Structure containing the antenna mode parameters
15332 *
15333 * Send the command to CSR to send
15334 * WMI_SOC_SET_ANTENNA_MODE_CMDID to FW
15335 *
15336 * Return: QDF_STATUS
15337 */
15338QDF_STATUS sme_soc_set_antenna_mode(tHalHandle hal,
15339 struct sir_antenna_mode_param *msg)
15340{
15341 QDF_STATUS status = QDF_STATUS_SUCCESS;
15342 tpAniSirGlobal mac = PMAC_STRUCT(hal);
15343 tSmeCmd *cmd;
15344
15345 if (NULL == msg) {
15346 sms_log(mac, LOGE, FL("antenna mode mesg is NULL"));
15347 return QDF_STATUS_E_FAILURE;
15348 }
15349
15350 status = sme_acquire_global_lock(&mac->sme);
15351 if (!QDF_IS_STATUS_SUCCESS(status)) {
15352 sms_log(mac, LOGE, FL("Failed to acquire lock"));
15353 return QDF_STATUS_E_RESOURCES;
15354 }
15355
15356 cmd = sme_get_command_buffer(mac);
15357 if (!cmd) {
15358 sme_release_global_lock(&mac->sme);
15359 sms_log(mac, LOGE, FL("Get command buffer failed"));
15360 return QDF_STATUS_E_NULL_VALUE;
15361 }
15362
15363 cmd->command = e_sme_command_set_antenna_mode;
15364 cmd->u.set_antenna_mode_cmd = *msg;
15365
15366 sms_log(mac, LOG1,
15367 FL("Queuing e_sme_command_set_antenna_mode to CSR: %d %d"),
15368 cmd->u.set_antenna_mode_cmd.num_rx_chains,
15369 cmd->u.set_antenna_mode_cmd.num_tx_chains);
15370
15371 csr_queue_sme_command(mac, cmd, false);
15372 sme_release_global_lock(&mac->sme);
15373
15374 return QDF_STATUS_SUCCESS;
15375}
15376
15377/**
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015378 * sme_set_peer_authorized() - call peer authorized callback
15379 * @peer_addr: peer mac address
15380 * @auth_cb: auth callback
15381 * @vdev_id: vdev id
15382 *
Anurag Chouhanf04e84f2016-03-03 10:12:12 +053015383 * Return: QDF Status
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015384 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015385QDF_STATUS sme_set_peer_authorized(uint8_t *peer_addr,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015386 sme_peer_authorized_fp auth_cb,
15387 uint32_t vdev_id)
15388{
15389 void *wma_handle;
15390
Anurag Chouhan6d760662016-02-20 16:05:43 +053015391 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015392 if (!wma_handle) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053015393 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015394 "wma handle is NULL");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015395 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015396 }
15397
15398 wma_set_peer_authorized_cb(wma_handle, auth_cb);
15399 return wma_set_peer_param(wma_handle, peer_addr, WMI_PEER_AUTHORIZE,
15400 1, vdev_id);
15401}
15402
15403/*
Amar Singhal7c1e8982016-05-19 15:08:09 -070015404 * sme_handle_set_fcc_channel() - set spec. tx power for non-fcc channel
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015405 * @hal: HAL pointer
Amar Singhal83a047a2016-05-19 15:56:11 -070015406 * @fcc_constraint: flag to enable/disable the constraint
15407 * @scan_pending: whether there is pending scan
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015408 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015409 * Return: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015410 */
Amar Singhal83a047a2016-05-19 15:56:11 -070015411QDF_STATUS sme_handle_set_fcc_channel(tHalHandle hal, bool fcc_constraint,
15412 bool scan_pending)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015413{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015414 QDF_STATUS status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015415 tpAniSirGlobal mac_ptr = PMAC_STRUCT(hal);
15416
15417 status = sme_acquire_global_lock(&mac_ptr->sme);
15418
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015419 if (QDF_STATUS_SUCCESS == status) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015420
15421 if (fcc_constraint != mac_ptr->scan.fcc_constraint) {
15422 mac_ptr->scan.fcc_constraint = fcc_constraint;
Amar Singhal83a047a2016-05-19 15:56:11 -070015423 if (scan_pending)
15424 mac_ptr->scan.defer_update_channel_list = true;
15425 else
15426 status = csr_update_channel_list(mac_ptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015427 /* update the channel list in firmware */
15428 status = csr_update_channel_list(mac_ptr);
15429 }
15430
15431 sme_release_global_lock(&mac_ptr->sme);
15432 }
15433
15434 return status;
15435}
15436/**
15437 * sme_setdef_dot11mode() - Updates pMac with default dot11mode
15438 * @hal: Global MAC pointer
15439 *
15440 * Return: NULL.
15441 */
15442void sme_setdef_dot11mode(tHalHandle hal)
15443{
15444 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
15445 csr_set_default_dot11_mode(mac_ctx);
15446}
15447
15448/**
15449 * sme_update_roam_scan_hi_rssi_scan_params() - update high rssi scan
15450 * params
15451 * @hal_handle - The handle returned by macOpen.
15452 * @session_id - Session Identifier
15453 * @notify_id - Identifies 1 of the 4 parameters to be modified
15454 * @val New value of the parameter
15455 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015456 * Return: QDF_STATUS - SME update config successful.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015457 * Other status means SME failed to update
15458 */
15459
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015460QDF_STATUS sme_update_roam_scan_hi_rssi_scan_params(tHalHandle hal_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015461 uint8_t session_id,
15462 uint32_t notify_id,
15463 int32_t val)
15464{
15465 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal_handle);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015466 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015467 tCsrNeighborRoamConfig *nr_config = NULL;
15468 tpCsrNeighborRoamControlInfo nr_info = NULL;
15469 uint32_t reason = 0;
15470
15471 status = sme_acquire_global_lock(&mac_ctx->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015472 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015473 nr_config = &mac_ctx->roam.configParam.neighborRoamConfig;
15474 nr_info = &mac_ctx->roam.neighborRoamInfo[session_id];
15475 switch (notify_id) {
15476 case eCSR_HI_RSSI_SCAN_MAXCOUNT_ID:
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053015477 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015478 "%s: gRoamScanHirssiMaxCount %d => %d",
15479 __func__, nr_config->nhi_rssi_scan_max_count,
15480 val);
15481 nr_config->nhi_rssi_scan_max_count = val;
15482 nr_info->cfgParams.hi_rssi_scan_max_count = val;
15483 reason = REASON_ROAM_SCAN_HI_RSSI_MAXCOUNT_CHANGED;
15484 break;
15485
15486 case eCSR_HI_RSSI_SCAN_RSSI_DELTA_ID:
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053015487 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015488 FL("gRoamScanHiRssiDelta %d => %d"),
15489 nr_config->nhi_rssi_scan_rssi_delta,
15490 val);
15491 nr_config->nhi_rssi_scan_rssi_delta = val;
15492 nr_info->cfgParams.hi_rssi_scan_rssi_delta = val;
15493 reason = REASON_ROAM_SCAN_HI_RSSI_DELTA_CHANGED;
15494 break;
15495
15496 case eCSR_HI_RSSI_SCAN_DELAY_ID:
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053015497 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015498 FL("gRoamScanHiRssiDelay %d => %d"),
15499 nr_config->nhi_rssi_scan_delay,
15500 val);
15501 nr_config->nhi_rssi_scan_delay = val;
15502 nr_info->cfgParams.hi_rssi_scan_delay = val;
15503 reason = REASON_ROAM_SCAN_HI_RSSI_DELAY_CHANGED;
15504 break;
15505
15506 case eCSR_HI_RSSI_SCAN_RSSI_UB_ID:
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053015507 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015508 FL("gRoamScanHiRssiUpperBound %d => %d"),
15509 nr_config->nhi_rssi_scan_rssi_ub,
15510 val);
15511 nr_config->nhi_rssi_scan_rssi_ub = val;
15512 nr_info->cfgParams.hi_rssi_scan_rssi_ub = val;
15513 reason = REASON_ROAM_SCAN_HI_RSSI_UB_CHANGED;
15514 break;
15515
15516 default:
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053015517 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015518 FL("invalid parameter notify_id %d"),
15519 notify_id);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015520 status = QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015521 break;
15522 }
15523 sme_release_global_lock(&mac_ctx->sme);
15524 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015525 if (mac_ctx->roam.configParam.isRoamOffloadScanEnabled &&
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015526 status == QDF_STATUS_SUCCESS) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015527 csr_roam_offload_scan(mac_ctx, session_id,
15528 ROAM_SCAN_OFFLOAD_UPDATE_CFG, reason);
15529 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080015530
15531 return status;
15532}
15533
Krishna Kumaar Natarajan052c6e62015-09-28 15:32:55 -070015534/**
15535 * sme_update_tgt_services() - update the target services config.
15536 * @hal: HAL pointer.
15537 * @cfg: wma_tgt_services parameters.
15538 *
15539 * update the target services config.
15540 *
15541 * Return: None.
15542 */
15543void sme_update_tgt_services(tHalHandle hal, struct wma_tgt_services *cfg)
15544{
15545 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
15546
15547 mac_ctx->lteCoexAntShare = cfg->lte_coex_ant_share;
Kiran Kumar Lokere666bf852016-05-02 12:23:02 -070015548 mac_ctx->per_band_chainmask_supp = cfg->per_band_chainmask_supp;
Krishna Kumaar Natarajan052c6e62015-09-28 15:32:55 -070015549 mac_ctx->beacon_offload = cfg->beacon_offload;
mukul sharma72c8b222015-09-04 17:02:01 +053015550 mac_ctx->pmf_offload = cfg->pmf_offload;
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053015551 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO,
mukul sharma72c8b222015-09-04 17:02:01 +053015552 FL("mac_ctx->pmf_offload: %d"), mac_ctx->pmf_offload);
Krishna Kumaar Natarajan052c6e62015-09-28 15:32:55 -070015553
15554 return;
15555}
Masti, Narayanraddic4a7ab82015-11-25 15:41:10 +053015556
Chandrasekaran, Manishekar2859de42016-02-11 16:17:38 +053015557/**
15558 * sme_is_session_id_valid() - Check if the session id is valid
15559 * @hal: Pointer to HAL
15560 * @session_id: Session id
15561 *
15562 * Checks if the session id is valid or not
15563 *
15564 * Return: True is the session id is valid, false otherwise
15565 */
15566bool sme_is_session_id_valid(tHalHandle hal, uint32_t session_id)
15567{
15568 tpAniSirGlobal mac = PMAC_STRUCT(hal);
15569 if (!mac) {
Chandrasekaran, Manishekard3cb4772016-02-22 22:21:10 +053015570 /* Using QDF_TRACE since mac is not available for sms_log */
15571 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
15572 "%s: null mac pointer", __func__);
Chandrasekaran, Manishekar2859de42016-02-11 16:17:38 +053015573 return false;
15574 }
15575
15576 if (CSR_IS_SESSION_VALID(mac, session_id)) {
15577 return true;
15578 } else {
15579 sms_log(mac, LOGE,
15580 FL("invalid session id:%d"), session_id);
15581 return false;
15582 }
15583}
15584
Masti, Narayanraddic4a7ab82015-11-25 15:41:10 +053015585#ifdef FEATURE_WLAN_TDLS
15586
15587/**
15588 * sme_get_opclass() - determine operating class
15589 * @hal: Pointer to HAL
15590 * @channel: channel id
15591 * @bw_offset: bandwidth offset
15592 * @opclass: pointer to operating class
15593 *
15594 * Function will determine operating class from regdm_get_opclass_from_channel
15595 *
15596 * Return: none
15597 */
15598void sme_get_opclass(tHalHandle hal, uint8_t channel, uint8_t bw_offset,
15599 uint8_t *opclass)
15600{
15601 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
15602
15603 /* redgm opclass table contains opclass for 40MHz low primary,
15604 * 40MHz high primary and 20MHz. No support for 80MHz yet. So
15605 * first we will check if bit for 40MHz is set and if so find
15606 * matching opclass either with low primary or high primary
15607 * (a channel would never be in both) and then search for opclass
15608 * matching 20MHz, else for any BW.
15609 */
15610 if (bw_offset & (1 << BW_40_OFFSET_BIT)) {
Amar Singhal22995112016-01-22 10:42:33 -080015611 *opclass = cds_reg_dmn_get_opclass_from_channel(
Masti, Narayanraddic4a7ab82015-11-25 15:41:10 +053015612 mac_ctx->scan.countryCodeCurrent,
15613 channel, BW40_LOW_PRIMARY);
15614 if (!(*opclass)) {
Amar Singhal22995112016-01-22 10:42:33 -080015615 *opclass = cds_reg_dmn_get_opclass_from_channel(
Masti, Narayanraddic4a7ab82015-11-25 15:41:10 +053015616 mac_ctx->scan.countryCodeCurrent,
15617 channel, BW40_HIGH_PRIMARY);
15618 }
15619 } else if (bw_offset & (1 << BW_20_OFFSET_BIT)) {
Amar Singhal22995112016-01-22 10:42:33 -080015620 *opclass = cds_reg_dmn_get_opclass_from_channel(
Masti, Narayanraddic4a7ab82015-11-25 15:41:10 +053015621 mac_ctx->scan.countryCodeCurrent,
15622 channel, BW20);
15623 } else {
Amar Singhal22995112016-01-22 10:42:33 -080015624 *opclass = cds_reg_dmn_get_opclass_from_channel(
Masti, Narayanraddic4a7ab82015-11-25 15:41:10 +053015625 mac_ctx->scan.countryCodeCurrent,
15626 channel, BWALL);
15627 }
15628}
15629#endif
Ryan Hsu3c8f79f2015-12-02 16:45:09 -080015630
15631#ifdef FEATURE_GREEN_AP
15632/**
15633 * sme_send_egap_conf_params() - set the enhanced green ap configuration params
15634 * @enable: enable/disable the enhanced green ap feature
15635 * @inactivity_time: inactivity timeout value
15636 * @wait_time: wait timeout value
15637 * @flag: feature flag in bitmasp
15638 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015639 * Return: Return QDF_STATUS, otherwise appropriate failure code
Ryan Hsu3c8f79f2015-12-02 16:45:09 -080015640 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015641QDF_STATUS sme_send_egap_conf_params(uint32_t enable, uint32_t inactivity_time,
Ryan Hsu3c8f79f2015-12-02 16:45:09 -080015642 uint32_t wait_time, uint32_t flags)
15643{
15644 cds_msg_t message;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015645 QDF_STATUS status;
Ryan Hsu3c8f79f2015-12-02 16:45:09 -080015646 struct egap_conf_params *egap_params;
15647
Anurag Chouhan600c3a02016-03-01 10:33:54 +053015648 egap_params = qdf_mem_malloc(sizeof(*egap_params));
Ryan Hsu3c8f79f2015-12-02 16:45:09 -080015649 if (NULL == egap_params) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053015650 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Ryan Hsu3c8f79f2015-12-02 16:45:09 -080015651 "%s: fail to alloc egap_params", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015652 return QDF_STATUS_E_NOMEM;
Ryan Hsu3c8f79f2015-12-02 16:45:09 -080015653 }
15654
15655 egap_params->enable = enable;
15656 egap_params->inactivity_time = inactivity_time;
15657 egap_params->wait_time = wait_time;
15658 egap_params->flags = flags;
15659
15660 message.type = WMA_SET_EGAP_CONF_PARAMS;
15661 message.bodyptr = egap_params;
Anurag Chouhan6d760662016-02-20 16:05:43 +053015662 status = cds_mq_post_message(QDF_MODULE_ID_WMA, &message);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053015663 if (!QDF_IS_STATUS_SUCCESS(status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053015664 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Ryan Hsu3c8f79f2015-12-02 16:45:09 -080015665 "%s: Not able to post msg to WMA!", __func__);
15666
Anurag Chouhan600c3a02016-03-01 10:33:54 +053015667 qdf_mem_free(egap_params);
Ryan Hsu3c8f79f2015-12-02 16:45:09 -080015668 }
15669 return status;
15670}
15671#endif
Sandeep Puligillae0875662016-02-12 16:09:21 -080015672
15673/**
Anurag Chouhanbf5e0e22016-09-12 12:54:09 +053015674 * sme_set_fw_test() - set fw test
15675 * @fw_test: fw test param
15676 *
15677 * Return: Return QDF_STATUS, otherwise appropriate failure code
15678 */
15679QDF_STATUS sme_set_fw_test(struct set_fwtest_params *fw_test)
15680{
15681 void *wma_handle;
15682
15683 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
15684 if (!wma_handle) {
15685 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
15686 "wma handle is NULL");
15687 return QDF_STATUS_E_FAILURE;
15688 }
15689 wma_process_fw_test_cmd(wma_handle, fw_test);
15690 return QDF_STATUS_SUCCESS;
15691}
15692
15693/**
Sandeep Puligillae0875662016-02-12 16:09:21 -080015694 * sme_ht40_stop_obss_scan() - ht40 obss stop scan
15695 * @hal: mac handel
15696 * @vdev_id: vdev identifier
15697 *
15698 * Return: Return QDF_STATUS, otherwise appropriate failure code
15699 */
15700QDF_STATUS sme_ht40_stop_obss_scan(tHalHandle hal, uint32_t vdev_id)
15701{
15702 void *wma_handle;
15703
15704 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
15705 if (!wma_handle) {
15706 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
15707 "wma handle is NULL");
15708 return QDF_STATUS_E_FAILURE;
15709 }
15710 wma_ht40_stop_obss_scan(wma_handle, vdev_id);
15711 return QDF_STATUS_SUCCESS;
15712}
Archana Ramachandran20d2e232016-02-11 16:58:40 -080015713
15714/**
15715 * sme_update_mimo_power_save() - Update MIMO power save
15716 * configuration
15717 * @hal: The handle returned by macOpen
15718 * @is_ht_smps_enabled: enable/disable ht smps
15719 * @ht_smps_mode: smps mode disabled/static/dynamic
Archana Ramachandranfec24812016-02-16 16:31:56 -080015720 * @send_smps_action: flag to send smps force mode command
15721 * to FW
Archana Ramachandran20d2e232016-02-11 16:58:40 -080015722 *
15723 * Return: QDF_STATUS if SME update mimo power save
15724 * configuration sucsess else failue status
15725 */
15726QDF_STATUS sme_update_mimo_power_save(tHalHandle hal,
15727 uint8_t is_ht_smps_enabled,
Archana Ramachandranfec24812016-02-16 16:31:56 -080015728 uint8_t ht_smps_mode,
15729 bool send_smps_action)
Archana Ramachandran20d2e232016-02-11 16:58:40 -080015730{
15731 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
Archana Ramachandranfec24812016-02-16 16:31:56 -080015732
Archana Ramachandran20d2e232016-02-11 16:58:40 -080015733 sms_log(mac_ctx, LOG1,
Archana Ramachandranfec24812016-02-16 16:31:56 -080015734 "SMPS enable: %d mode: %d send action: %d",
15735 is_ht_smps_enabled, ht_smps_mode,
15736 send_smps_action);
Archana Ramachandran20d2e232016-02-11 16:58:40 -080015737 mac_ctx->roam.configParam.enableHtSmps =
15738 is_ht_smps_enabled;
15739 mac_ctx->roam.configParam.htSmps = ht_smps_mode;
Archana Ramachandranfec24812016-02-16 16:31:56 -080015740 mac_ctx->roam.configParam.send_smps_action =
15741 send_smps_action;
Archana Ramachandran20d2e232016-02-11 16:58:40 -080015742
15743 return QDF_STATUS_SUCCESS;
15744}
15745
15746/**
15747 * sme_is_sta_smps_allowed() - check if the supported nss for
15748 * the session is greater than 1x1 to enable sta SMPS
15749 * @hal: The handle returned by macOpen
15750 * @session_id: session id
15751 *
15752 * Return: bool returns true if supported nss is greater than
15753 * 1x1 else false
15754 */
15755bool sme_is_sta_smps_allowed(tHalHandle hal, uint8_t session_id)
15756{
15757 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
15758 tCsrRoamSession *csr_session;
15759
Archana Ramachandran20d2e232016-02-11 16:58:40 -080015760 csr_session = CSR_GET_SESSION(mac_ctx, session_id);
15761 if (NULL == csr_session) {
15762 sms_log(mac_ctx, LOGE,
Sreelakshmi Konamki58697e12016-05-25 17:30:18 +053015763 FL("SME session not valid: %d"), session_id);
15764 return false;
15765 }
15766
15767 if (!CSR_IS_SESSION_VALID(mac_ctx, session_id)) {
15768 sms_log(mac_ctx, LOGE,
15769 FL("CSR session not valid: %d"), session_id);
Archana Ramachandran20d2e232016-02-11 16:58:40 -080015770 return false;
15771 }
15772
15773 return (csr_session->supported_nss_1x1 == true) ? false : true;
15774}
Gupta, Kapil4cb1d7d2016-04-16 18:16:25 -070015775
15776/**
15777 * sme_add_beacon_filter() - set the beacon filter configuration
15778 * @hal: The handle returned by macOpen
15779 * @session_id: session id
15780 * @ie_map: bitwise array of IEs
15781 *
15782 * Return: Return QDF_STATUS, otherwise appropriate failure code
15783 */
15784QDF_STATUS sme_add_beacon_filter(tHalHandle hal,
15785 uint32_t session_id,
15786 uint32_t *ie_map)
15787{
15788 cds_msg_t message;
15789 QDF_STATUS qdf_status;
15790 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
15791 struct beacon_filter_param *filter_param;
15792
15793 if (!CSR_IS_SESSION_VALID(mac_ctx, session_id)) {
15794 sms_log(mac_ctx, LOGE,
15795 "CSR session not valid: %d",
15796 session_id);
15797 return QDF_STATUS_E_FAILURE;
15798 }
15799
15800 filter_param = qdf_mem_malloc(sizeof(*filter_param));
15801 if (NULL == filter_param) {
15802 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
15803 "%s: fail to alloc filter_param", __func__);
15804 return QDF_STATUS_E_FAILURE;
15805 }
15806
15807 filter_param->vdev_id = session_id;
15808
15809 qdf_mem_copy(filter_param->ie_map, ie_map,
15810 BCN_FLT_MAX_ELEMS_IE_LIST * sizeof(uint32_t));
15811
15812 message.type = WMA_ADD_BCN_FILTER_CMDID;
15813 message.bodyptr = filter_param;
15814 qdf_status = cds_mq_post_message(QDF_MODULE_ID_WMA,
15815 &message);
15816 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
15817 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
15818 "%s: Not able to post msg to WDA!",
15819 __func__);
15820
15821 qdf_mem_free(filter_param);
15822 }
15823 return qdf_status;
15824}
15825
15826/**
15827 * sme_remove_beacon_filter() - set the beacon filter configuration
15828 * @hal: The handle returned by macOpen
15829 * @session_id: session id
15830 *
15831 * Return: Return QDF_STATUS, otherwise appropriate failure code
15832 */
15833QDF_STATUS sme_remove_beacon_filter(tHalHandle hal, uint32_t session_id)
15834{
15835 cds_msg_t message;
15836 QDF_STATUS qdf_status;
15837 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
15838 struct beacon_filter_param *filter_param;
15839
15840 if (!CSR_IS_SESSION_VALID(mac_ctx, session_id)) {
15841 sms_log(mac_ctx, LOGE,
15842 "CSR session not valid: %d",
15843 session_id);
15844 return QDF_STATUS_E_FAILURE;
15845 }
15846
15847 filter_param = qdf_mem_malloc(sizeof(*filter_param));
15848 if (NULL == filter_param) {
15849 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
15850 "%s: fail to alloc filter_param", __func__);
15851 return QDF_STATUS_E_FAILURE;
15852 }
15853
15854 filter_param->vdev_id = session_id;
15855
15856 message.type = WMA_REMOVE_BCN_FILTER_CMDID;
15857 message.bodyptr = filter_param;
15858 qdf_status = cds_mq_post_message(QDF_MODULE_ID_WMA,
15859 &message);
15860 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
15861 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
15862 "%s: Not able to post msg to WDA!",
15863 __func__);
15864
15865 qdf_mem_free(filter_param);
15866 }
15867 return qdf_status;
15868}
Arun Khandavalli2476ef52016-04-26 20:19:43 +053015869
Arun Khandavalli2476ef52016-04-26 20:19:43 +053015870/**
Kondabattini, Ganesh3f2d02c2016-09-13 12:23:47 +053015871 * sme_send_disassoc_req_frame - send disassoc req
15872 * @hal: handler to hal
15873 * @session_id: session id
15874 * @peer_mac: peer mac address
15875 * @reason: reason for disassociation
15876 * wait_for_ack: wait for acknowledgment
15877 *
15878 * function to send disassoc request to lim
15879 *
15880 * return: none
15881 */
15882void sme_send_disassoc_req_frame(tHalHandle hal, uint8_t session_id,
15883 uint8_t *peer_mac, uint16_t reason, uint8_t wait_for_ack)
15884{
15885 struct sme_send_disassoc_frm_req *msg;
15886 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
15887 A_UINT8 *buf;
15888 A_UINT16 tmp;
15889
15890 msg = qdf_mem_malloc(sizeof(struct sme_send_disassoc_frm_req));
15891
15892 if (NULL == msg)
15893 qdf_status = QDF_STATUS_E_FAILURE;
15894 else
15895 qdf_status = QDF_STATUS_SUCCESS;
15896
15897 if (!QDF_IS_STATUS_SUCCESS(qdf_status))
15898 return;
15899
15900 qdf_mem_set(msg, sizeof(struct sme_send_disassoc_frm_req), 0);
15901 msg->msg_type = (uint16_t) eWNI_SME_SEND_DISASSOC_FRAME;
15902
15903 msg->length = (uint16_t) sizeof(struct sme_send_disassoc_frm_req);
15904
15905 buf = &msg->session_id;
15906
15907 /* session id */
15908 *buf = (A_UINT8) session_id;
15909 buf += sizeof(A_UINT8);
15910
15911 /* transaction id */
15912 *buf = 0;
15913 *(buf + 1) = 0;
15914 buf += sizeof(A_UINT16);
15915
15916 /* Set the peer MAC address before sending the message to LIM */
15917 qdf_mem_copy(buf, peer_mac, QDF_MAC_ADDR_SIZE);
15918
15919 buf += QDF_MAC_ADDR_SIZE;
15920
15921 /* reasoncode */
15922 tmp = (uint16_t) reason;
15923 qdf_mem_copy(buf, &tmp, sizeof(uint16_t));
15924 buf += sizeof(uint16_t);
15925
15926 *buf = wait_for_ack;
15927 buf += sizeof(uint8_t);
15928
15929 qdf_status = cds_send_mb_message_to_mac(msg);
15930
15931 if (qdf_status != QDF_STATUS_SUCCESS)
15932 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
15933 FL("cds_send_mb_message Failed"));
15934}
15935
15936/**
Arun Khandavalli2476ef52016-04-26 20:19:43 +053015937 * sme_get_bpf_offload_capabilities() - Get length for BPF offload
15938 * @hal: Global HAL handle
15939 * This function constructs the cds message and fill in message type,
15940 * post the same to WDA.
15941 * Return: QDF_STATUS enumeration
15942 */
15943QDF_STATUS sme_get_bpf_offload_capabilities(tHalHandle hal)
15944{
15945 QDF_STATUS status = QDF_STATUS_SUCCESS;
15946 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
15947 cds_msg_t cds_msg;
15948
15949 sms_log(mac_ctx, LOG1, FL("enter"));
15950
15951 status = sme_acquire_global_lock(&mac_ctx->sme);
15952 if (QDF_STATUS_SUCCESS == status) {
15953 /* Serialize the req through MC thread */
15954 cds_msg.bodyptr = NULL;
15955 cds_msg.type = WDA_BPF_GET_CAPABILITIES_REQ;
15956 status = cds_mq_post_message(QDF_MODULE_ID_WMA, &cds_msg);
15957 if (!QDF_IS_STATUS_SUCCESS(status)) {
15958 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
15959 FL("Post bpf get offload msg fail"));
15960 status = QDF_STATUS_E_FAILURE;
15961 }
15962 sme_release_global_lock(&mac_ctx->sme);
15963 } else {
15964 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
15965 FL("sme_acquire_global_lock error"));
15966 }
15967 sms_log(mac_ctx, LOG1, FL("exit"));
15968 return status;
15969}
15970
15971
15972/**
15973 * sme_set_bpf_instructions() - Set BPF bpf filter instructions.
15974 * @hal: HAL handle
15975 * @bpf_set_offload: struct to set bpf filter instructions.
15976 *
15977 * Return: QDF_STATUS enumeration.
15978 */
15979QDF_STATUS sme_set_bpf_instructions(tHalHandle hal,
15980 struct sir_bpf_set_offload *req)
15981{
15982 QDF_STATUS status = QDF_STATUS_SUCCESS;
15983 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
15984 cds_msg_t cds_msg;
15985 struct sir_bpf_set_offload *set_offload;
15986
15987 set_offload = qdf_mem_malloc(sizeof(*set_offload));
15988
15989 if (NULL == set_offload) {
15990 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
15991 FL("Failed to alloc set_offload"));
15992 return QDF_STATUS_E_NOMEM;
15993 }
15994
15995 set_offload->session_id = req->session_id;
15996 set_offload->filter_id = req->filter_id;
15997 set_offload->current_offset = req->current_offset;
15998 set_offload->total_length = req->total_length;
Rajeev Kumare5a16822016-07-27 13:11:42 -070015999 set_offload->current_length = req->current_length;
Arun Khandavalli2476ef52016-04-26 20:19:43 +053016000 if (set_offload->total_length) {
Arun Khandavalli2476ef52016-04-26 20:19:43 +053016001 set_offload->program = qdf_mem_malloc(sizeof(uint8_t) *
16002 req->current_length);
Rajeev Kumar348ed992016-07-27 14:44:01 -070016003 if (NULL == set_offload->program) {
16004 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
16005 FL("Failed to alloc instruction memory"));
16006 qdf_mem_free(set_offload);
16007 return QDF_STATUS_E_NOMEM;
16008 }
Arun Khandavalli2476ef52016-04-26 20:19:43 +053016009 qdf_mem_copy(set_offload->program, req->program,
16010 set_offload->current_length);
16011 }
16012 status = sme_acquire_global_lock(&mac_ctx->sme);
16013 if (QDF_STATUS_SUCCESS == status) {
16014 /* Serialize the req through MC thread */
16015 cds_msg.bodyptr = set_offload;
16016 cds_msg.type = WDA_BPF_SET_INSTRUCTIONS_REQ;
16017 status = cds_mq_post_message(QDF_MODULE_ID_WMA, &cds_msg);
16018
16019 if (!QDF_IS_STATUS_SUCCESS(status)) {
16020 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
16021 FL("Post BPF set offload msg fail"));
16022 status = QDF_STATUS_E_FAILURE;
16023 if (set_offload->total_length)
16024 qdf_mem_free(set_offload->program);
16025 qdf_mem_free(set_offload);
16026 }
16027 sme_release_global_lock(&mac_ctx->sme);
16028 } else {
16029 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
16030 FL("sme_acquire_global_lock failed"));
16031 if (set_offload->total_length)
16032 qdf_mem_free(set_offload->program);
16033 qdf_mem_free(set_offload);
16034 }
16035 return status;
16036}
16037
16038/**
16039 * sme_bpf_offload_register_callback() - Register get bpf offload callbacK
16040 *
16041 * @hal - MAC global handle
16042 * @callback_routine - callback routine from HDD
16043 *
16044 * This API is invoked by HDD to register its callback in SME
16045 *
16046 * Return: QDF_STATUS
16047 */
16048QDF_STATUS sme_bpf_offload_register_callback(tHalHandle hal,
16049 void (*pbpf_get_offload_cb)(void *context,
16050 struct sir_bpf_get_offload *))
16051{
16052 QDF_STATUS status = QDF_STATUS_SUCCESS;
16053 tpAniSirGlobal mac = PMAC_STRUCT(hal);
16054
16055 status = sme_acquire_global_lock(&mac->sme);
16056 if (QDF_IS_STATUS_SUCCESS(status)) {
16057 mac->sme.pbpf_get_offload_cb = pbpf_get_offload_cb;
16058 sme_release_global_lock(&mac->sme);
16059 } else {
16060 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
16061 FL("sme_acquire_global_lock failed"));
16062 }
16063 return status;
16064}
Manjunathappa Prakash59f861d2016-04-21 10:33:31 -070016065
16066/**
Abhishek Singh1c676222016-05-09 14:20:28 +053016067 * sme_get_wni_dot11_mode() - return configured wni dot11mode
16068 * @hal: hal pointer
16069 *
16070 * Return: wni dot11 mode.
16071 */
16072uint32_t sme_get_wni_dot11_mode(tHalHandle hal)
16073{
16074 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
16075
16076 return csr_translate_to_wni_cfg_dot11_mode(mac_ctx,
16077 mac_ctx->roam.configParam.uCfgDot11Mode);
16078}
16079
16080/**
Arun Khandavalli4b55da72016-07-19 19:55:01 +053016081 * sme_bpf_offload_deregister_callback() - Register get bpf offload callbacK
16082 *
16083 * @h_hal - MAC global handle
16084 * @callback_routine - callback routine from HDD
16085 *
16086 * This API is invoked by HDD to de-register its callback in SME
16087 *
16088 * Return: QDF_STATUS Enumeration
16089 */
16090QDF_STATUS sme_bpf_offload_deregister_callback(tHalHandle h_hal)
16091{
16092 QDF_STATUS status = QDF_STATUS_SUCCESS;
16093 tpAniSirGlobal mac;
16094
16095 if (!h_hal) {
16096 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
16097 FL("hHal is not valid"));
16098 return QDF_STATUS_E_INVAL;
16099 }
16100
16101 mac = PMAC_STRUCT(h_hal);
16102
16103 status = sme_acquire_global_lock(&mac->sme);
16104 if (QDF_IS_STATUS_SUCCESS(status)) {
16105 mac->sme.pbpf_get_offload_cb = NULL;
16106 sme_release_global_lock(&mac->sme);
16107 } else {
16108 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
16109 FL("sme_acquire_global_lock failed"));
16110 }
16111 return status;
16112}
16113
16114
16115/**
Manjunathappa Prakash59f861d2016-04-21 10:33:31 -070016116 * sme_create_mon_session() - post message to create PE session for monitormode
16117 * operation
16118 * @hal_handle: Handle to the HAL
16119 * @bssid: pointer to bssid
16120 *
16121 * Return: QDF_STATUS_SUCCESS on success, non-zero error code on failure.
16122 */
16123QDF_STATUS sme_create_mon_session(tHalHandle hal_handle, tSirMacAddr bss_id)
16124{
16125 QDF_STATUS status = QDF_STATUS_E_FAILURE;
16126 struct sir_create_session *msg;
16127
16128 msg = qdf_mem_malloc(sizeof(*msg));
16129 if (NULL != msg) {
16130 msg->type = eWNI_SME_MON_INIT_SESSION;
16131 msg->msg_len = sizeof(*msg);
16132 qdf_mem_copy(msg->bss_id.bytes, bss_id, QDF_MAC_ADDR_SIZE);
16133 status = cds_send_mb_message_to_mac(msg);
16134 }
16135 return status;
16136}
Gupta, Kapil96c7f2f2016-04-25 19:13:41 +053016137
Gupta, Kapil96c7f2f2016-04-25 19:13:41 +053016138/**
16139 * sme_set_adaptive_dwelltime_config() - Update Adaptive dwelltime configuration
16140 * @hal: The handle returned by macOpen
16141 * @params: adaptive_dwelltime_params config
16142 *
16143 * Return: QDF_STATUS if adaptive dwell time update
16144 * configuration sucsess else failure status
16145 */
16146QDF_STATUS sme_set_adaptive_dwelltime_config(tHalHandle hal,
16147 struct adaptive_dwelltime_params *params)
16148{
16149 cds_msg_t message;
16150 QDF_STATUS status;
16151 struct adaptive_dwelltime_params *dwelltime_params;
16152
16153 dwelltime_params = qdf_mem_malloc(sizeof(*dwelltime_params));
16154 if (NULL == dwelltime_params) {
16155 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
16156 "%s: fail to alloc dwelltime_params", __func__);
16157 return QDF_STATUS_E_NOMEM;
16158 }
16159
16160 dwelltime_params->is_enabled = params->is_enabled;
16161 dwelltime_params->dwelltime_mode = params->dwelltime_mode;
16162 dwelltime_params->lpf_weight = params->lpf_weight;
16163 dwelltime_params->passive_mon_intval = params->passive_mon_intval;
16164 dwelltime_params->wifi_act_threshold = params->wifi_act_threshold;
16165
16166 message.type = WMA_SET_ADAPT_DWELLTIME_CONF_PARAMS;
16167 message.bodyptr = dwelltime_params;
16168 status = cds_mq_post_message(QDF_MODULE_ID_WMA, &message);
16169 if (!QDF_IS_STATUS_SUCCESS(status)) {
16170 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
16171 "%s: Not able to post msg to WMA!", __func__);
16172
16173 qdf_mem_free(dwelltime_params);
16174 }
16175 return status;
16176}
Kiran Kumar Lokere666bf852016-05-02 12:23:02 -070016177/**
16178 * sme_set_pdev_ht_vht_ies() - sends the set pdev IE req
16179 * @hal: Pointer to HAL
16180 * @enable2x2: 1x1 or 2x2 mode.
16181 *
16182 * Sends the set pdev IE req with Nss value.
16183 *
16184 * Return: None
16185 */
16186void sme_set_pdev_ht_vht_ies(tHalHandle hal, bool enable2x2)
16187{
16188 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
16189 struct sir_set_ht_vht_cfg *ht_vht_cfg;
16190 QDF_STATUS status = QDF_STATUS_E_FAILURE;
16191
16192 if (!mac_ctx->per_band_chainmask_supp)
16193 return;
16194
16195 if (!((mac_ctx->roam.configParam.uCfgDot11Mode ==
16196 eCSR_CFG_DOT11_MODE_AUTO) ||
16197 (mac_ctx->roam.configParam.uCfgDot11Mode ==
16198 eCSR_CFG_DOT11_MODE_11N) ||
16199 (mac_ctx->roam.configParam.uCfgDot11Mode ==
16200 eCSR_CFG_DOT11_MODE_11N_ONLY) ||
16201 (mac_ctx->roam.configParam.uCfgDot11Mode ==
16202 eCSR_CFG_DOT11_MODE_11AC) ||
16203 (mac_ctx->roam.configParam.uCfgDot11Mode ==
16204 eCSR_CFG_DOT11_MODE_11AC_ONLY)))
16205 return;
16206
16207 status = sme_acquire_global_lock(&mac_ctx->sme);
16208 if (QDF_STATUS_SUCCESS == status) {
16209 ht_vht_cfg = qdf_mem_malloc(sizeof(*ht_vht_cfg));
16210 if (NULL == ht_vht_cfg) {
16211 sms_log(mac_ctx, LOGE,
16212 "%s: mem alloc failed for ht_vht_cfg",
16213 __func__);
16214 sme_release_global_lock(&mac_ctx->sme);
16215 return;
16216 }
16217
16218 ht_vht_cfg->pdev_id = 0;
16219 if (enable2x2)
16220 ht_vht_cfg->nss = 2;
16221 else
16222 ht_vht_cfg->nss = 1;
16223 ht_vht_cfg->dot11mode =
16224 (uint8_t)csr_translate_to_wni_cfg_dot11_mode(mac_ctx,
16225 mac_ctx->roam.configParam.uCfgDot11Mode);
16226
16227 ht_vht_cfg->msg_type = eWNI_SME_PDEV_SET_HT_VHT_IE;
16228 ht_vht_cfg->len = sizeof(*ht_vht_cfg);
16229 sms_log(mac_ctx, LOG1,
16230 FL("SET_HT_VHT_IE with nss %d, dot11mode %d"),
16231 ht_vht_cfg->nss,
16232 ht_vht_cfg->dot11mode);
16233 status = cds_send_mb_message_to_mac(ht_vht_cfg);
16234 if (QDF_STATUS_SUCCESS != status) {
16235 sms_log(mac_ctx, LOGE, FL(
16236 "Send SME_PDEV_SET_HT_VHT_IE fail"));
16237 qdf_mem_free(ht_vht_cfg);
16238 }
16239 sme_release_global_lock(&mac_ctx->sme);
16240 }
16241 return;
16242}
16243
16244/**
16245 * sme_update_vdev_type_nss() - sets the nss per vdev type
16246 * @hal: Pointer to HAL
16247 * @max_supp_nss: max_supported Nss
16248 * @band: 5G or 2.4G band
16249 *
16250 * Sets the per band Nss for each vdev type based on INI and configured
16251 * chain mask value.
16252 *
16253 * Return: None
16254 */
16255void sme_update_vdev_type_nss(tHalHandle hal, uint8_t max_supp_nss,
16256 uint32_t vdev_type_nss, eCsrBand band)
16257{
16258 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
16259 struct vdev_type_nss *vdev_nss;
16260
16261 if (eCSR_BAND_5G == band)
16262 vdev_nss = &mac_ctx->vdev_type_nss_5g;
16263 else
16264 vdev_nss = &mac_ctx->vdev_type_nss_2g;
16265
16266 vdev_nss->sta = QDF_MIN(max_supp_nss, CFG_STA_NSS(vdev_type_nss));
16267 vdev_nss->sap = QDF_MIN(max_supp_nss, CFG_SAP_NSS(vdev_type_nss));
16268 vdev_nss->p2p_go = QDF_MIN(max_supp_nss,
16269 CFG_P2P_GO_NSS(vdev_type_nss));
16270 vdev_nss->p2p_cli = QDF_MIN(max_supp_nss,
16271 CFG_P2P_CLI_NSS(vdev_type_nss));
16272 vdev_nss->p2p_dev = QDF_MIN(max_supp_nss,
16273 CFG_P2P_DEV_NSS(vdev_type_nss));
16274 vdev_nss->ibss = QDF_MIN(max_supp_nss, CFG_IBSS_NSS(vdev_type_nss));
16275 vdev_nss->tdls = QDF_MIN(max_supp_nss, CFG_TDLS_NSS(vdev_type_nss));
16276 vdev_nss->ocb = QDF_MIN(max_supp_nss, CFG_OCB_NSS(vdev_type_nss));
16277
16278 sms_log(mac_ctx, LOG1,
16279 "band %d NSS:sta %d sap %d cli %d go %d dev %d ibss %d tdls %d ocb %d",
16280 band, vdev_nss->sta, vdev_nss->sap, vdev_nss->p2p_cli,
16281 vdev_nss->p2p_go, vdev_nss->p2p_dev, vdev_nss->ibss,
16282 vdev_nss->tdls, vdev_nss->ocb);
16283}
Peng Xu8fdaa492016-06-22 10:20:47 -070016284
16285/**
16286 * sme_register_p2p_lo_event() - Register for the p2p lo event
16287 * @hHal: reference to the HAL
16288 * @context: the context of the call
16289 * @callback: the callback to hdd
16290 *
16291 * This function registers the callback function for P2P listen
16292 * offload stop event.
16293 *
16294 * Return: none
16295 */
16296void sme_register_p2p_lo_event(tHalHandle hHal, void *context,
16297 p2p_lo_callback callback)
16298{
16299 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
16300 QDF_STATUS status = QDF_STATUS_E_FAILURE;
16301
16302 status = sme_acquire_global_lock(&pMac->sme);
16303 pMac->sme.p2p_lo_event_callback = callback;
16304 pMac->sme.p2p_lo_event_context = context;
16305 sme_release_global_lock(&pMac->sme);
16306}
Manjeet Singhf82ed072016-07-08 11:40:00 +053016307
16308/**
16309 * sme_process_mac_pwr_dbg_cmd() - enable mac pwr debugging
16310 * @hal: The handle returned by macOpen
16311 * @session_id: session id
16312 * @dbg_args: args for mac pwr debug command
16313 * Return: Return QDF_STATUS, otherwise appropriate failure code
16314 */
16315QDF_STATUS sme_process_mac_pwr_dbg_cmd(tHalHandle hal, uint32_t session_id,
16316 struct sir_mac_pwr_dbg_cmd*
16317 dbg_args)
16318{
16319 cds_msg_t message;
16320 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
16321 struct sir_mac_pwr_dbg_cmd *req;
16322 int i;
16323
16324 if (!CSR_IS_SESSION_VALID(mac_ctx, session_id)) {
16325 sms_log(mac_ctx, LOGE,
16326 "CSR session not valid: %d",
16327 session_id);
16328 return QDF_STATUS_E_FAILURE;
16329 }
16330
16331 req = qdf_mem_malloc(sizeof(*req));
16332 if (NULL == req) {
16333 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
16334 "%s: fail to alloc mac_pwr_dbg_args", __func__);
16335 return QDF_STATUS_E_FAILURE;
16336 }
16337 req->module_id = dbg_args->module_id;
16338 req->pdev_id = dbg_args->pdev_id;
16339 req->num_args = dbg_args->num_args;
16340 for (i = 0; i < req->num_args; i++)
16341 req->args[i] = dbg_args->args[i];
16342
16343 message.type = SIR_HAL_POWER_DBG_CMD;
16344 message.bodyptr = req;
16345
16346 if (!QDF_IS_STATUS_SUCCESS(cds_mq_post_message
16347 (QDF_MODULE_ID_WMA, &message))) {
16348 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
16349 "%s: Not able to post msg to WDA!",
16350 __func__);
16351 qdf_mem_free(req);
16352 }
16353 return QDF_STATUS_SUCCESS;
16354}
Tushnim Bhattacharyyaf44a9d82016-07-05 10:52:06 -070016355/**
16356 * sme_get_vdev_type_nss() - gets the nss per vdev type
16357 * @hal: Pointer to HAL
16358 * @dev_mode: connection type.
16359 * @nss2g: Pointer to the 2G Nss parameter.
16360 * @nss5g: Pointer to the 5G Nss parameter.
16361 *
16362 * Fills the 2G and 5G Nss values based on connection type.
16363 *
16364 * Return: None
16365 */
16366void sme_get_vdev_type_nss(tHalHandle hal, enum tQDF_ADAPTER_MODE dev_mode,
16367 uint8_t *nss_2g, uint8_t *nss_5g)
16368{
16369 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
16370 csr_get_vdev_type_nss(mac_ctx, dev_mode, nss_2g, nss_5g);
16371}