blob: 9c6b7b1886d7421135502b0ce5f54e4973f8eb4f [file] [log] [blame]
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001/*
Harprit Chhabadadc5bc152018-12-21 15:37:46 -08002 * Copyright (c) 2012-2019 The Linux Foundation. All rights reserved.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003 *
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004 * Permission to use, copy, modify, and/or distribute this software for
5 * any purpose with or without fee is hereby granted, provided that the
6 * above copyright notice and this permission notice appear in all
7 * copies.
8 *
9 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
10 * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
11 * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
12 * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
13 * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
14 * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
15 * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
16 * PERFORMANCE OF THIS SOFTWARE.
17 */
18
19/*
Jeff Johnson360135b2018-07-18 20:51:47 -070020 * DOC: sme_api.c
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053021 *
22 * Definitions for SME APIs
23 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080024
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053025/* Include Files */
Srinivas Girigowda2c263352017-03-17 17:49:53 -070026#include <sir_common.h>
27#include <ani_global.h>
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080028#include "sme_api.h"
29#include "csr_inside_api.h"
30#include "sme_inside.h"
31#include "csr_internal.h"
32#include "wma_types.h"
33#include "wma_if.h"
gaurank kathpalia748c7272018-10-24 22:05:15 +053034#include "wma.h"
Jeff Johnson6136fb92017-03-30 15:21:49 -070035#include "wma_fips_api.h"
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053036#include "qdf_trace.h"
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080037#include "sme_trace.h"
Anurag Chouhan6d760662016-02-20 16:05:43 +053038#include "qdf_types.h"
gaurank kathpalia78af1932018-10-27 20:33:10 +053039#include "qdf_util.h"
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053040#include "qdf_trace.h"
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080041#include "cds_utils.h"
42#include "sap_api.h"
43#include "mac_trace.h"
Naveen Rawat3b6068c2016-04-14 19:01:06 -070044#include "cds_regdomain.h"
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080045#include "sme_power_save_api.h"
46#include "wma.h"
Naveen Rawatb4d37622015-11-13 16:15:25 -080047#include "sch_api.h"
Deepak Dhamdhere0f076bd2016-06-02 11:29:21 -070048#include "sme_nan_datapath.h"
Agrawal Ashish21ba2572016-09-03 16:40:10 +053049#include "csr_api.h"
Kiran Kumar Lokerea3de2262017-04-12 12:15:04 -070050#include "wlan_reg_services_api.h"
Abhishek Singh158fe252017-03-23 11:09:34 +053051#include <wlan_scan_ucfg_api.h>
Kiran Kumar Lokereb1d412e2017-04-23 17:19:43 -070052#include "wlan_reg_ucfg_api.h"
Arif Hussainee677012017-01-26 17:50:13 -080053#include "ol_txrx.h"
Naveen Rawatd2657be2017-10-10 14:31:23 -070054#include "wifi_pos_api.h"
Vignesh Viswanathan9dd88d32017-11-22 14:22:03 +053055#include "net/cfg80211.h"
56#include <qca_vendor.h>
Sandeep Puligilla063a4342018-01-10 02:50:14 -080057#include <wlan_spectral_utils_api.h>
Vignesh Viswanathan21c58cb2018-05-24 15:53:58 +053058#include "wlan_mlme_public_struct.h"
gaurank kathpalia24ed0f42018-11-13 15:37:49 +053059#include "wlan_mlme_main.h"
Bala Venkatesh6d537092018-09-25 10:38:36 +053060#include "cfg_ucfg_api.h"
Manikandan Mohan9045e2e2018-11-26 16:44:19 -080061#include "wlan_fwol_ucfg_api.h"
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080062
Jeff Johnson0a8786a2018-12-02 10:49:01 -080063static QDF_STATUS init_sme_cmd_list(struct mac_context *mac);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080064
Jeff Johnson0a8786a2018-12-02 10:49:01 -080065static void sme_disconnect_connected_sessions(struct mac_context *mac);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080066
Jeff Johnson0a8786a2018-12-02 10:49:01 -080067static QDF_STATUS sme_handle_generic_change_country_code(struct mac_context *mac,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080068 void *pMsgBuf);
69
Jeff Johnson0a8786a2018-12-02 10:49:01 -080070static QDF_STATUS sme_process_nss_update_resp(struct mac_context *mac, uint8_t *msg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080071
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080072/* Channel Change Response Indication Handler */
Jeff Johnson0a8786a2018-12-02 10:49:01 -080073static QDF_STATUS sme_process_channel_change_resp(struct mac_context *mac,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080074 uint16_t msg_type, void *pMsgBuf);
75
Jeff Johnson0a8786a2018-12-02 10:49:01 -080076static QDF_STATUS sme_stats_ext_event(struct mac_context *mac,
Jeff Johnson45843652018-07-04 12:47:34 -070077 struct stats_ext_event *msg);
Jeff Johnsonfdecd512018-06-10 09:18:32 -070078
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080079/* Internal SME APIs */
Jeff Johnson50980e12019-02-17 11:38:30 -080080QDF_STATUS sme_acquire_global_lock(struct sme_context *sme)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080081{
Jeff Johnson50980e12019-02-17 11:38:30 -080082 if (!sme)
83 return QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080084
Jeff Johnson3e7a4932019-02-17 12:11:36 -080085 return qdf_mutex_acquire(&sme->sme_global_lock);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080086}
87
Jeff Johnson50980e12019-02-17 11:38:30 -080088QDF_STATUS sme_release_global_lock(struct sme_context *sme)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080089{
Jeff Johnson50980e12019-02-17 11:38:30 -080090 if (!sme)
91 return QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080092
Jeff Johnson3e7a4932019-02-17 12:11:36 -080093 return qdf_mutex_release(&sme->sme_global_lock);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080094}
95
Jeff Johnson0a8786a2018-12-02 10:49:01 -080096struct mac_context *sme_get_mac_context(void)
Archana Ramachandran2eb7a612017-03-23 22:58:42 -070097{
Jeff Johnson0a8786a2018-12-02 10:49:01 -080098 struct mac_context *mac_ctx;
Jeff Johnsonb460dd72018-11-08 10:26:51 -080099 mac_handle_t mac_handle;
Archana Ramachandran2eb7a612017-03-23 22:58:42 -0700100
Jeff Johnsonb460dd72018-11-08 10:26:51 -0800101 mac_handle = cds_get_context(QDF_MODULE_ID_SME);
102 if (NULL == mac_handle) {
Archana Ramachandran2eb7a612017-03-23 22:58:42 -0700103 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_FATAL,
Jeff Johnsonb460dd72018-11-08 10:26:51 -0800104 FL("invalid mac_handle"));
Archana Ramachandran2eb7a612017-03-23 22:58:42 -0700105 return NULL;
106 }
107
Jeff Johnsona0619e42018-11-28 17:43:00 -0800108 mac_ctx = MAC_CONTEXT(mac_handle);
Archana Ramachandran2eb7a612017-03-23 22:58:42 -0700109
110 return mac_ctx;
111}
112
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800113/**
114 * sme_process_set_hw_mode_resp() - Process set HW mode response
115 * @mac: Global MAC pointer
116 * @msg: HW mode response
117 *
118 * Processes the HW mode response and invokes the HDD callback
119 * to process further
120 */
Jeff Johnson0a8786a2018-12-02 10:49:01 -0800121static QDF_STATUS sme_process_set_hw_mode_resp(struct mac_context *mac, uint8_t *msg)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800122{
Krunal Sonia8270f52017-02-23 19:51:25 -0800123 tListElem *entry;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800124 tSmeCmd *command = NULL;
125 bool found;
Tushnim Bhattacharyyaeab33dd2017-11-15 15:20:02 -0800126 policy_mgr_pdev_set_hw_mode_cback callback = NULL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800127 struct sir_set_hw_mode_resp *param;
Tushnim Bhattacharyya3b99f4b2018-03-26 14:19:24 -0700128 enum policy_mgr_conn_update_reason reason;
gaurank kathpalia14e2f912017-08-31 14:51:45 +0530129 struct csr_roam_session *session;
Sandeep Puligillaa330c8c2017-03-09 18:03:21 -0800130 uint32_t session_id;
Sandeep Puligilla344d7252017-09-15 16:23:33 -0700131
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800132 param = (struct sir_set_hw_mode_resp *)msg;
133 if (!param) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -0700134 sme_err("HW mode resp param is NULL");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800135 /* Not returning. Need to check if active command list
136 * needs to be freed
137 */
138 }
139
Krunal Sonia8270f52017-02-23 19:51:25 -0800140 entry = csr_nonscan_active_ll_peek_head(mac, LL_ACCESS_LOCK);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800141 if (!entry) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -0700142 sme_err("No cmd found in active list");
Tushnim Bhattacharyya4a03db82017-11-10 17:58:28 -0800143 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800144 }
145
146 command = GET_BASE_ADDR(entry, tSmeCmd, Link);
147 if (!command) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -0700148 sme_err("Base address is NULL");
Tushnim Bhattacharyya4a03db82017-11-10 17:58:28 -0800149 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800150 }
151
152 if (e_sme_command_set_hw_mode != command->command) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -0700153 sme_err("Command mismatch!");
Tushnim Bhattacharyya4a03db82017-11-10 17:58:28 -0800154 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800155 }
156
157 callback = command->u.set_hw_mode_cmd.set_hw_mode_cb;
Chandrasekaran, Manishekaref70c0d2015-10-20 19:54:55 +0530158 reason = command->u.set_hw_mode_cmd.reason;
Sandeep Puligillaa330c8c2017-03-09 18:03:21 -0800159 session_id = command->u.set_hw_mode_cmd.session_id;
Chandrasekaran, Manishekarce2172e2016-02-18 16:12:43 +0530160
Srinivas Girigowda2da81e22017-03-16 21:22:19 -0700161 sme_debug("reason: %d session: %d",
Chandrasekaran, Manishekarce2172e2016-02-18 16:12:43 +0530162 command->u.set_hw_mode_cmd.reason,
163 command->u.set_hw_mode_cmd.session_id);
164
Chandrasekaran, Manishekar4dd215e2016-04-16 18:48:34 -0700165 if (!callback) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -0700166 sme_err("Callback does not exist");
Chandrasekaran, Manishekar4dd215e2016-04-16 18:48:34 -0700167 goto end;
168 }
169
170 if (!param) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -0700171 sme_err("Callback failed since HW mode params is NULL");
Chandrasekaran, Manishekar4dd215e2016-04-16 18:48:34 -0700172 goto end;
173 }
174
175 /* Irrespective of the reason for which the hw mode change request
176 * was issued, the policy manager connection table needs to be updated
177 * with the new vdev-mac id mapping, tx/rx spatial streams etc., if the
178 * set hw mode was successful.
179 */
180 callback(param->status,
181 param->cfgd_hw_mode_index,
182 param->num_vdev_mac_entries,
Tushnim Bhattacharyya0c4ad2d2017-03-09 15:59:03 -0800183 param->vdev_mac_map,
Tushnim Bhattacharyyaeab33dd2017-11-15 15:20:02 -0800184 command->u.set_hw_mode_cmd.next_action,
185 command->u.set_hw_mode_cmd.reason,
186 command->u.set_hw_mode_cmd.session_id,
Tushnim Bhattacharyya0c4ad2d2017-03-09 15:59:03 -0800187 command->u.set_hw_mode_cmd.context);
Krunal Soni3fa80e22018-01-09 14:16:02 -0800188 if (!CSR_IS_SESSION_VALID(mac, session_id)) {
189 sme_err("session %d is invalid", session_id);
190 goto end;
191 }
Sandeep Puligillaa330c8c2017-03-09 18:03:21 -0800192 session = CSR_GET_SESSION(mac, session_id);
Tushnim Bhattacharyya3b99f4b2018-03-26 14:19:24 -0700193 if (reason == POLICY_MGR_UPDATE_REASON_HIDDEN_STA) {
Chandrasekaran, Manishekar4dd215e2016-04-16 18:48:34 -0700194 /* In the case of hidden SSID, connection update
195 * (set hw mode) is done after the scan with reason
196 * code eCsrScanForSsid completes. The connect/failure
197 * needs to be handled after the response of set hw
198 * mode
199 */
Sandeep Puligillaa330c8c2017-03-09 18:03:21 -0800200 if (param->status == SET_HW_MODE_STATUS_OK) {
Srinivas Girigowda2c263352017-03-17 17:49:53 -0700201 sme_debug("search for ssid success");
Sandeep Puligillaa330c8c2017-03-09 18:03:21 -0800202 csr_scan_handle_search_for_ssid(mac,
203 session_id);
204 } else {
Srinivas Girigowda2c263352017-03-17 17:49:53 -0700205 sme_debug("search for ssid failure");
Sandeep Puligillaa330c8c2017-03-09 18:03:21 -0800206 csr_scan_handle_search_for_ssid_failure(mac,
207 session_id);
208 }
Deepak Dhamdhere6f7fbbe2017-02-28 13:35:52 -0800209 csr_saved_scan_cmd_free_fields(mac, session);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800210 }
211
Chandrasekaran, Manishekaref70c0d2015-10-20 19:54:55 +0530212end:
Krunal Soni72dba662017-02-15 20:13:17 -0800213 found = csr_nonscan_active_ll_remove_entry(mac, entry,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800214 LL_ACCESS_LOCK);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +0530215 if (found)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800216 /* Now put this command back on the avilable command list */
Krunal Soni78618d92017-02-14 21:46:31 -0800217 csr_release_command(mac, command);
Krunal Sonia8270f52017-02-23 19:51:25 -0800218
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530219 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800220}
221
222/**
223 * sme_process_hw_mode_trans_ind() - Process HW mode transition indication
224 * @mac: Global MAC pointer
225 * @msg: HW mode transition response
226 *
227 * Processes the HW mode transition indication and invoke the HDD callback
228 * to process further
229 */
Jeff Johnson0a8786a2018-12-02 10:49:01 -0800230static QDF_STATUS sme_process_hw_mode_trans_ind(struct mac_context *mac,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800231 uint8_t *msg)
232{
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800233 struct sir_hw_mode_trans_ind *param;
234
235 param = (struct sir_hw_mode_trans_ind *)msg;
236 if (!param) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -0700237 sme_err("HW mode trans ind param is NULL");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530238 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800239 }
240
Tushnim Bhattacharyya0c4ad2d2017-03-09 15:59:03 -0800241 policy_mgr_hw_mode_transition_cb(param->old_hw_mode_index,
Tushnim Bhattacharyya9e81b4c2017-02-15 17:11:14 -0800242 param->new_hw_mode_index,
243 param->num_vdev_mac_entries,
Tushnim Bhattacharyya0c4ad2d2017-03-09 15:59:03 -0800244 param->vdev_mac_map, mac->psoc);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800245
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530246 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800247}
248
Abhishek Singh0d0568a2018-11-22 15:01:51 +0530249void sme_purge_pdev_all_ser_cmd_list(mac_handle_t mac_handle)
250{
251 QDF_STATUS status;
Jeff Johnson0a8786a2018-12-02 10:49:01 -0800252 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Abhishek Singh0d0568a2018-11-22 15:01:51 +0530253
254 status = sme_acquire_global_lock(&mac_ctx->sme);
255 if (QDF_IS_STATUS_ERROR(status))
256 return;
257
258 csr_purge_pdev_all_ser_cmd_list(mac_ctx);
259 sme_release_global_lock(&mac_ctx->sme);
260}
261
Naveen Rawate7d86052015-11-13 12:01:43 -0800262/**
263 * free_sme_cmds() - This function frees memory allocated for SME commands
264 * @mac_ctx: Pointer to Global MAC structure
265 *
266 * This function frees memory allocated for SME commands
267 *
268 * @Return: void
269 */
Jeff Johnson0a8786a2018-12-02 10:49:01 -0800270static void free_sme_cmds(struct mac_context *mac_ctx)
Naveen Rawate7d86052015-11-13 12:01:43 -0800271{
272 uint32_t idx;
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +0530273
Jeff Johnson19353172019-02-17 12:53:46 -0800274 if (!mac_ctx->sme.sme_cmd_buf_addr)
Naveen Rawate7d86052015-11-13 12:01:43 -0800275 return;
276
Jeff Johnson2a84c532019-02-17 12:22:04 -0800277 for (idx = 0; idx < mac_ctx->sme.sme_cmd_count; idx++)
Jeff Johnson19353172019-02-17 12:53:46 -0800278 qdf_mem_free(mac_ctx->sme.sme_cmd_buf_addr[idx]);
Naveen Rawate7d86052015-11-13 12:01:43 -0800279
Jeff Johnson19353172019-02-17 12:53:46 -0800280 qdf_mem_free(mac_ctx->sme.sme_cmd_buf_addr);
281 mac_ctx->sme.sme_cmd_buf_addr = NULL;
Naveen Rawate7d86052015-11-13 12:01:43 -0800282}
283
Jeff Johnson0a8786a2018-12-02 10:49:01 -0800284static QDF_STATUS init_sme_cmd_list(struct mac_context *mac)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800285{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530286 QDF_STATUS status;
Jeff Johnson19353172019-02-17 12:53:46 -0800287 tSmeCmd *cmd;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800288 uint32_t cmd_idx;
Naveen Rawate7d86052015-11-13 12:01:43 -0800289 uint32_t sme_cmd_ptr_ary_sz;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800290
Jeff Johnson2a84c532019-02-17 12:22:04 -0800291 mac->sme.sme_cmd_count = SME_TOTAL_COMMAND;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800292
Jeff Johnsonea9f3d72019-02-17 13:27:55 -0800293 status = csr_ll_open(&mac->sme.sme_cmd_freelist);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530294 if (!QDF_IS_STATUS_SUCCESS(status))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800295 goto end;
296
Naveen Rawate7d86052015-11-13 12:01:43 -0800297 /* following pointer contains array of pointers for tSmeCmd* */
Jeff Johnson2a84c532019-02-17 12:22:04 -0800298 sme_cmd_ptr_ary_sz = sizeof(void *) * mac->sme.sme_cmd_count;
Jeff Johnson19353172019-02-17 12:53:46 -0800299 mac->sme.sme_cmd_buf_addr = qdf_mem_malloc(sme_cmd_ptr_ary_sz);
300 if (!mac->sme.sme_cmd_buf_addr) {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530301 status = QDF_STATUS_E_NOMEM;
Naveen Rawate7d86052015-11-13 12:01:43 -0800302 goto end;
303 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800304
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530305 status = QDF_STATUS_SUCCESS;
Jeff Johnson2a84c532019-02-17 12:22:04 -0800306 for (cmd_idx = 0; cmd_idx < mac->sme.sme_cmd_count; cmd_idx++) {
Naveen Rawate7d86052015-11-13 12:01:43 -0800307 /*
308 * Since total size of all commands together can be huge chunk
309 * of memory, allocate SME cmd individually. These SME CMDs are
310 * moved between pending and active queues. And these freeing of
311 * these queues just manipulates the list but does not actually
312 * frees SME CMD pointers. Hence store each SME CMD address in
Jeff Johnson19353172019-02-17 12:53:46 -0800313 * the array, sme.sme_cmd_buf_addr. This will later facilitate
Naveen Rawate7d86052015-11-13 12:01:43 -0800314 * freeing up of all SME CMDs with just a for loop.
315 */
Jeff Johnson19353172019-02-17 12:53:46 -0800316 cmd = qdf_mem_malloc(sizeof(*cmd));
317 if (!cmd) {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530318 status = QDF_STATUS_E_NOMEM;
Jeff Johnson01f2c232018-11-21 19:17:44 -0800319 free_sme_cmds(mac);
Naveen Rawate7d86052015-11-13 12:01:43 -0800320 goto end;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800321 }
Jeff Johnson19353172019-02-17 12:53:46 -0800322 mac->sme.sme_cmd_buf_addr[cmd_idx] = cmd;
Jeff Johnsonea9f3d72019-02-17 13:27:55 -0800323 csr_ll_insert_tail(&mac->sme.sme_cmd_freelist,
Jeff Johnson19353172019-02-17 12:53:46 -0800324 &cmd->Link, LL_ACCESS_LOCK);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800325 }
326
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800327end:
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530328 if (!QDF_IS_STATUS_SUCCESS(status))
Srinivas Girigowda2da81e22017-03-16 21:22:19 -0700329 sme_err("Failed to initialize sme command list: %d", status);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800330
331 return status;
332}
333
Jeff Johnson0a8786a2018-12-02 10:49:01 -0800334void sme_release_command(struct mac_context *mac_ctx, tSmeCmd *sme_cmd)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800335{
Krunal Sonia8270f52017-02-23 19:51:25 -0800336 sme_cmd->command = eSmeNoCommand;
Jeff Johnsonea9f3d72019-02-17 13:27:55 -0800337 csr_ll_insert_tail(&mac_ctx->sme.sme_cmd_freelist, &sme_cmd->Link,
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +0530338 LL_ACCESS_LOCK);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800339}
340
Jeff Johnson0a8786a2018-12-02 10:49:01 -0800341static QDF_STATUS free_sme_cmd_list(struct mac_context *mac)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800342{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530343 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800344
Jeff Johnsonea9f3d72019-02-17 13:27:55 -0800345 csr_ll_close(&mac->sme.sme_cmd_freelist);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800346
Jeff Johnson3e7a4932019-02-17 12:11:36 -0800347 status = sme_acquire_global_lock(&mac->sme);
Madhvapathi Sriram3e6627a2018-12-19 12:54:49 +0530348 if (status != QDF_STATUS_SUCCESS)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800349 goto done;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800350
Jeff Johnson01f2c232018-11-21 19:17:44 -0800351 free_sme_cmds(mac);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800352
Jeff Johnson3e7a4932019-02-17 12:11:36 -0800353 status = sme_release_global_lock(&mac->sme);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +0530354 if (status != QDF_STATUS_SUCCESS)
Srinivas Girigowda2da81e22017-03-16 21:22:19 -0700355 sme_err("Failed to release the lock status: %d", status);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800356done:
357 return status;
358}
359
Jeff Johnson0a8786a2018-12-02 10:49:01 -0800360static void dump_csr_command_info(struct mac_context *mac, tSmeCmd *pCmd)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800361{
362 switch (pCmd->command) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800363 case eSmeCommandRoam:
Srinivas Girigowda2da81e22017-03-16 21:22:19 -0700364 sme_debug("roam command reason is %d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800365 pCmd->u.roamCmd.roamReason);
366 break;
367
368 case eSmeCommandWmStatusChange:
Srinivas Girigowda2da81e22017-03-16 21:22:19 -0700369 sme_debug("WMStatusChange command type is %d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800370 pCmd->u.wmStatusChangeCmd.Type);
371 break;
372
Pragaspathi Thilagarajb37dad32018-07-01 16:48:01 +0530373 case e_sme_command_del_sta_session:
374 sme_debug("Issue del STA command for session:%d",
375 pCmd->sessionId);
376 break;
377
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800378 default:
Srinivas Girigowda2da81e22017-03-16 21:22:19 -0700379 sme_debug("default: Unhandled command %d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800380 pCmd->command);
381 break;
382 }
383}
384
Jeff Johnson0a8786a2018-12-02 10:49:01 -0800385tSmeCmd *sme_get_command_buffer(struct mac_context *mac)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800386{
387 tSmeCmd *pRetCmd = NULL, *pTempCmd = NULL;
388 tListElem *pEntry;
389 static int sme_command_queue_full;
390
Jeff Johnsonea9f3d72019-02-17 13:27:55 -0800391 pEntry = csr_ll_remove_head(&mac->sme.sme_cmd_freelist, LL_ACCESS_LOCK);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800392
Jeff Johnsonea9f3d72019-02-17 13:27:55 -0800393 /* If we can get another MS Msg buffer, then we are ok. Just
394 * link the entry onto the linked list. (We are using the
395 * linked list to keep track of the message buffers).
396 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800397 if (pEntry) {
398 pRetCmd = GET_BASE_ADDR(pEntry, tSmeCmd, Link);
399 /* reset when free list is available */
400 sme_command_queue_full = 0;
401 } else {
402 int idx = 1;
403
404 /* Cannot change pRetCmd here since it needs to return later. */
Jeff Johnson01f2c232018-11-21 19:17:44 -0800405 pEntry = csr_nonscan_active_ll_peek_head(mac, LL_ACCESS_LOCK);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +0530406 if (pEntry)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800407 pTempCmd = GET_BASE_ADDR(pEntry, tSmeCmd, Link);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +0530408
409 sme_err("Out of command buffer.... command (0x%X) stuck",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800410 (pTempCmd) ? pTempCmd->command : eSmeNoCommand);
411 if (pTempCmd) {
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +0530412 if (eSmeCsrCommandMask & pTempCmd->command)
413 /* CSR command is stuck. See what the reason
414 * code is for that command
415 */
Jeff Johnson01f2c232018-11-21 19:17:44 -0800416 dump_csr_command_info(mac, pTempCmd);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800417 } /* if(pTempCmd) */
418
419 /* dump what is in the pending queue */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800420 pEntry =
Jeff Johnson01f2c232018-11-21 19:17:44 -0800421 csr_nonscan_pending_ll_peek_head(mac,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800422 LL_ACCESS_NOLOCK);
423 while (pEntry && !sme_command_queue_full) {
424 pTempCmd = GET_BASE_ADDR(pEntry, tSmeCmd, Link);
425 /* Print only 1st five commands from pending queue. */
426 if (idx <= 5)
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +0530427 sme_err("Out of command buffer.... SME pending command #%d (0x%X)",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800428 idx, pTempCmd->command);
429 idx++;
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +0530430 if (eSmeCsrCommandMask & pTempCmd->command)
431 /* CSR command is stuck. See what the reason
432 * code is for that command
433 */
Jeff Johnson01f2c232018-11-21 19:17:44 -0800434 dump_csr_command_info(mac, pTempCmd);
435 pEntry = csr_nonscan_pending_ll_next(mac, pEntry,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800436 LL_ACCESS_NOLOCK);
437 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800438
Jeff Johnson01f2c232018-11-21 19:17:44 -0800439 if (mac->mlme_cfg->gen.fatal_event_trigger)
Abhishek Singh5ea86532016-04-27 14:10:53 +0530440 cds_flush_logs(WLAN_LOG_TYPE_FATAL,
441 WLAN_LOG_INDICATOR_HOST_DRIVER,
442 WLAN_LOG_REASON_SME_OUT_OF_CMD_BUF,
443 false,
Jeff Johnson01f2c232018-11-21 19:17:44 -0800444 mac->mlme_cfg->gen.self_recovery);
Abhishek Singh5ea86532016-04-27 14:10:53 +0530445 else
Anurag Chouhan4085ff72017-10-05 18:09:56 +0530446 cds_trigger_recovery(QDF_GET_MSG_BUFF_FAILURE);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800447 }
448
449 /* memset to zero */
450 if (pRetCmd) {
hangtian127c9532019-01-12 13:29:07 +0800451 qdf_mem_zero((uint8_t *)&pRetCmd->command,
452 sizeof(pRetCmd->command));
453 qdf_mem_zero((uint8_t *)&pRetCmd->sessionId,
454 sizeof(pRetCmd->sessionId));
455 qdf_mem_zero((uint8_t *)&pRetCmd->u, sizeof(pRetCmd->u));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800456 }
457
458 return pRetCmd;
459}
460
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800461/**
Krunal Sonia8270f52017-02-23 19:51:25 -0800462 * sme_ser_handle_active_cmd() - handle command activation callback from
463 * new serialization module
464 * @cmd: pointer to new serialization command
465 *
466 * This API is to handle command activation callback from new serialization
467 * callback
468 *
469 * Return: QDF_STATUS_SUCCESS
470 */
471static
472QDF_STATUS sme_ser_handle_active_cmd(struct wlan_serialization_command *cmd)
473{
474 tSmeCmd *sme_cmd;
Jeff Johnsonc7309062018-11-09 20:59:42 -0800475 mac_handle_t mac_handle;
Jeff Johnson0a8786a2018-12-02 10:49:01 -0800476 struct mac_context *mac_ctx;
Krunal Sonia8270f52017-02-23 19:51:25 -0800477 QDF_STATUS status = QDF_STATUS_SUCCESS;
478 bool do_continue;
479
480 if (!cmd) {
Srinivas Girigowda2c263352017-03-17 17:49:53 -0700481 sme_err("No serialization command found");
Krunal Sonia8270f52017-02-23 19:51:25 -0800482 return QDF_STATUS_E_FAILURE;
483 }
484
Jeff Johnsonc7309062018-11-09 20:59:42 -0800485 mac_handle = cds_get_context(QDF_MODULE_ID_SME);
486 if (NULL != mac_handle) {
Jeff Johnsona0619e42018-11-28 17:43:00 -0800487 mac_ctx = MAC_CONTEXT(mac_handle);
Pragaspathi Thilagarajb11dbe42018-07-23 16:42:17 +0530488 } else {
Jeff Johnsonc7309062018-11-09 20:59:42 -0800489 sme_err("No mac_handle found");
Krunal Sonia8270f52017-02-23 19:51:25 -0800490 return QDF_STATUS_E_FAILURE;
491 }
492 sme_cmd = cmd->umac_cmd;
493 if (!sme_cmd) {
Srinivas Girigowda2c263352017-03-17 17:49:53 -0700494 sme_err("No SME command found");
Krunal Sonia8270f52017-02-23 19:51:25 -0800495 return QDF_STATUS_E_FAILURE;
496 }
497
498 switch (sme_cmd->command) {
499 case eSmeCommandRoam:
500 status = csr_roam_process_command(mac_ctx, sme_cmd);
501 break;
502 case eSmeCommandWmStatusChange:
503 csr_roam_process_wm_status_change_command(mac_ctx,
504 sme_cmd);
505 break;
Pragaspathi Thilagarajb37dad32018-07-01 16:48:01 +0530506 case e_sme_command_del_sta_session:
507 csr_process_del_sta_session_command(mac_ctx, sme_cmd);
508 break;
Krunal Sonia8270f52017-02-23 19:51:25 -0800509 case eSmeCommandAddTs:
510 case eSmeCommandDelTs:
511#ifndef WLAN_MDM_CODE_REDUCTION_OPT
512 do_continue = qos_process_command(mac_ctx, sme_cmd);
513 if (do_continue)
514 status = QDF_STATUS_E_FAILURE;
515#endif
516 break;
Krunal Sonia8270f52017-02-23 19:51:25 -0800517 case e_sme_command_set_hw_mode:
518 csr_process_set_hw_mode(mac_ctx, sme_cmd);
519 break;
520 case e_sme_command_nss_update:
521 csr_process_nss_update_req(mac_ctx, sme_cmd);
522 break;
523 case e_sme_command_set_dual_mac_config:
524 csr_process_set_dual_mac_config(mac_ctx, sme_cmd);
525 break;
526 case e_sme_command_set_antenna_mode:
527 csr_process_set_antenna_mode(mac_ctx, sme_cmd);
528 break;
529 default:
530 /* something is wrong */
Srinivas Girigowda2da81e22017-03-16 21:22:19 -0700531 sme_err("unknown command %d", sme_cmd->command);
Krunal Sonia8270f52017-02-23 19:51:25 -0800532 status = QDF_STATUS_E_FAILURE;
533 break;
534 }
Krunal Sonia8270f52017-02-23 19:51:25 -0800535 return status;
536}
537
538QDF_STATUS sme_ser_cmd_callback(void *buf,
539 enum wlan_serialization_cb_reason reason)
540{
541 struct wlan_serialization_command *cmd = buf;
Jeff Johnsonc7309062018-11-09 20:59:42 -0800542 mac_handle_t mac_handle;
Jeff Johnson0a8786a2018-12-02 10:49:01 -0800543 struct mac_context *mac_ctx;
Krunal Sonia8270f52017-02-23 19:51:25 -0800544 QDF_STATUS status = QDF_STATUS_SUCCESS;
545 tSmeCmd *sme_cmd;
546
Jeff Johnsonc7309062018-11-09 20:59:42 -0800547 mac_handle = cds_get_context(QDF_MODULE_ID_SME);
548 if (mac_handle != NULL) {
Jeff Johnsona0619e42018-11-28 17:43:00 -0800549 mac_ctx = MAC_CONTEXT(mac_handle);
Pragaspathi Thilagarajb11dbe42018-07-23 16:42:17 +0530550 } else {
Jeff Johnsonc7309062018-11-09 20:59:42 -0800551 sme_err("mac_handle is null");
Krunal Sonia8270f52017-02-23 19:51:25 -0800552 return QDF_STATUS_E_FAILURE;
553 }
554 /*
555 * Do not acquire lock here as sme global lock is already acquired in
556 * caller or MC thread context
557 */
558 if (!cmd) {
Srinivas Girigowda2c263352017-03-17 17:49:53 -0700559 sme_err("serialization command is null");
Krunal Sonia8270f52017-02-23 19:51:25 -0800560 return QDF_STATUS_E_FAILURE;
561 }
562
563 switch (reason) {
564 case WLAN_SER_CB_ACTIVATE_CMD:
Srinivas Girigowda2c263352017-03-17 17:49:53 -0700565 sme_debug("WLAN_SER_CB_ACTIVATE_CMD callback");
Krunal Sonia8270f52017-02-23 19:51:25 -0800566 status = sme_ser_handle_active_cmd(cmd);
567 break;
568 case WLAN_SER_CB_CANCEL_CMD:
Srinivas Girigowda2c263352017-03-17 17:49:53 -0700569 sme_debug("WLAN_SER_CB_CANCEL_CMD callback");
Krunal Sonia8270f52017-02-23 19:51:25 -0800570 break;
571 case WLAN_SER_CB_RELEASE_MEM_CMD:
Srinivas Girigowda2c263352017-03-17 17:49:53 -0700572 sme_debug("WLAN_SER_CB_RELEASE_MEM_CMD callback");
Vignesh Viswanathan062b5162018-10-11 17:18:41 +0530573 if (cmd->vdev)
574 wlan_objmgr_vdev_release_ref(cmd->vdev,
575 WLAN_LEGACY_SME_ID);
Krunal Sonia8270f52017-02-23 19:51:25 -0800576 sme_cmd = cmd->umac_cmd;
577 csr_release_command_buffer(mac_ctx, sme_cmd);
578 break;
579 case WLAN_SER_CB_ACTIVE_CMD_TIMEOUT:
Srinivas Girigowda2c263352017-03-17 17:49:53 -0700580 sme_debug("WLAN_SER_CB_ACTIVE_CMD_TIMEOUT callback");
Krunal Sonia8270f52017-02-23 19:51:25 -0800581 break;
582 default:
Srinivas Girigowda2c263352017-03-17 17:49:53 -0700583 sme_debug("STOP: unknown reason code");
Krunal Sonia8270f52017-02-23 19:51:25 -0800584 return QDF_STATUS_E_FAILURE;
585 }
586 return status;
587}
588
Wen Gong3f003382018-05-14 14:26:37 +0800589#ifdef WLAN_FEATURE_MEMDUMP_ENABLE
Krunal Sonia8270f52017-02-23 19:51:25 -0800590/**
Padma, Santhosh Kumar9aba02f2016-08-11 16:30:25 +0530591 * sme_get_sessionid_from_activelist() - gets session id
592 * @mac: mac context
593 *
594 * This function is used to get session id from sme command
595 * active list
596 *
597 * Return: returns session id
598 */
Jeff Johnson0a8786a2018-12-02 10:49:01 -0800599static uint32_t sme_get_sessionid_from_activelist(struct mac_context *mac)
Padma, Santhosh Kumar9aba02f2016-08-11 16:30:25 +0530600{
601 tListElem *entry;
602 tSmeCmd *command;
603 uint32_t session_id = CSR_SESSION_ID_INVALID;
604
Krunal Sonia8270f52017-02-23 19:51:25 -0800605 entry = csr_nonscan_active_ll_peek_head(mac, LL_ACCESS_LOCK);
Padma, Santhosh Kumar9aba02f2016-08-11 16:30:25 +0530606 if (entry) {
607 command = GET_BASE_ADDR(entry, tSmeCmd, Link);
608 session_id = command->sessionId;
609 }
610
611 return session_id;
612}
613
614/**
615 * sme_state_info_dump() - prints state information of sme layer
616 * @buf: buffer pointer
617 * @size: size of buffer to be filled
618 *
619 * This function is used to dump state information of sme layer
620 *
621 * Return: None
622 */
623static void sme_state_info_dump(char **buf_ptr, uint16_t *size)
624{
625 uint32_t session_id, active_session_id;
Jeff Johnsonc7309062018-11-09 20:59:42 -0800626 mac_handle_t mac_handle;
Jeff Johnson0a8786a2018-12-02 10:49:01 -0800627 struct mac_context *mac;
Padma, Santhosh Kumar9aba02f2016-08-11 16:30:25 +0530628 uint16_t len = 0;
629 char *buf = *buf_ptr;
630 eCsrConnectState connect_state;
631
Jeff Johnsonc7309062018-11-09 20:59:42 -0800632 mac_handle = cds_get_context(QDF_MODULE_ID_SME);
633 if (mac_handle == NULL) {
Padma, Santhosh Kumar9aba02f2016-08-11 16:30:25 +0530634 QDF_ASSERT(0);
635 return;
636 }
637
Jeff Johnsona0619e42018-11-28 17:43:00 -0800638 mac = MAC_CONTEXT(mac_handle);
Padma, Santhosh Kumar9aba02f2016-08-11 16:30:25 +0530639
640 active_session_id = sme_get_sessionid_from_activelist(mac);
641 if (active_session_id != CSR_SESSION_ID_INVALID) {
642 len += qdf_scnprintf(buf + len, *size - len,
643 "\n active command sessionid %d", active_session_id);
644 }
645
Dustin Brownad06be62019-02-04 14:52:56 -0800646 for (session_id = 0; session_id < WLAN_MAX_VDEVS; session_id++) {
Padma, Santhosh Kumar9aba02f2016-08-11 16:30:25 +0530647 if (CSR_IS_SESSION_VALID(mac, session_id)) {
648 connect_state =
649 mac->roam.roamSession[session_id].connectState;
650 if ((eCSR_ASSOC_STATE_TYPE_INFRA_ASSOCIATED ==
651 connect_state)
652 || (eCSR_ASSOC_STATE_TYPE_INFRA_CONNECTED ==
653 connect_state)) {
654 len += qdf_scnprintf(buf + len, *size - len,
655 "\n NeighborRoamState: %d",
656 mac->roam.neighborRoamInfo[session_id].
657 neighborRoamState);
658 len += qdf_scnprintf(buf + len, *size - len,
659 "\n RoamState: %d", mac->roam.
660 curState[session_id]);
661 len += qdf_scnprintf(buf + len, *size - len,
662 "\n RoamSubState: %d", mac->roam.
663 curSubState[session_id]);
664 len += qdf_scnprintf(buf + len, *size - len,
665 "\n ConnectState: %d",
666 connect_state);
667 }
668 }
669 }
670
671 *size -= len;
672 *buf_ptr += len;
673}
674
675/**
676 * sme_register_debug_callback() - registration function sme layer
677 * to print sme state information
678 *
679 * Return: None
680 */
681static void sme_register_debug_callback(void)
682{
683 qdf_register_debug_callback(QDF_MODULE_ID_SME, &sme_state_info_dump);
684}
Wen Gong3f003382018-05-14 14:26:37 +0800685#else /* WLAN_FEATURE_MEMDUMP_ENABLE */
Wen Gongaa6d55d2018-04-26 16:33:21 +0800686static void sme_register_debug_callback(void)
687{
688}
Wen Gong3f003382018-05-14 14:26:37 +0800689#endif /* WLAN_FEATURE_MEMDUMP_ENABLE */
Padma, Santhosh Kumar9aba02f2016-08-11 16:30:25 +0530690
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800691/* Global APIs */
692
693/**
694 * sme_open() - Initialze all SME modules and put them at idle state
Jeff Johnsonb460dd72018-11-08 10:26:51 -0800695 * @mac_handle: The handle returned by mac_open
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800696 *
697 * The function initializes each module inside SME, PMC, CSR, etc. Upon
698 * successfully return, all modules are at idle state ready to start.
699 * smeOpen must be called before any other SME APIs can be involved.
700 * smeOpen must be called after mac_open.
701 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530702 * Return: QDF_STATUS_SUCCESS - SME is successfully initialized.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800703 * Other status means SME is failed to be initialized
704 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -0800705QDF_STATUS sme_open(mac_handle_t mac_handle)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800706{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530707 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -0800708 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800709
Jeff Johnson01f2c232018-11-21 19:17:44 -0800710 mac->sme.state = SME_STATE_STOP;
Jeff Johnson5a6a0c92019-02-17 16:12:02 -0800711 mac->sme.curr_device_mode = QDF_STA_MODE;
Anurag Chouhana37b5b72016-02-21 14:53:42 +0530712 if (!QDF_IS_STATUS_SUCCESS(qdf_mutex_create(
Jeff Johnson3e7a4932019-02-17 12:11:36 -0800713 &mac->sme.sme_global_lock))) {
Srinivas Girigowda09625b02018-09-10 15:28:09 -0700714 sme_err("Init lock failed");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530715 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800716 }
Jeff Johnson01f2c232018-11-21 19:17:44 -0800717 status = csr_open(mac);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530718 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -0700719 sme_err("csr_open failed, status: %d", status);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800720 return status;
721 }
722
Jeff Johnsonb460dd72018-11-08 10:26:51 -0800723 status = sme_ps_open(mac_handle);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530724 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -0700725 sme_err("sme_ps_open failed with status: %d", status);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800726 return status;
727 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800728
729#ifndef WLAN_MDM_CODE_REDUCTION_OPT
Jeff Johnson01f2c232018-11-21 19:17:44 -0800730 status = sme_qos_open(mac);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530731 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -0700732 sme_err("Qos open, status: %d", status);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800733 return status;
734 }
735#endif
Jeff Johnson01f2c232018-11-21 19:17:44 -0800736 status = init_sme_cmd_list(mac);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530737 if (!QDF_IS_STATUS_SUCCESS(status))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800738 return status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800739
Jeff Johnson01f2c232018-11-21 19:17:44 -0800740 status = rrm_open(mac);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530741 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -0700742 sme_err("rrm_open failed, status: %d", status);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800743 return status;
744 }
Jeff Johnson01f2c232018-11-21 19:17:44 -0800745 sme_trace_init(mac);
Padma, Santhosh Kumar9aba02f2016-08-11 16:30:25 +0530746 sme_register_debug_callback();
Krunal Soni33787902017-08-29 11:39:28 -0700747
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800748 return status;
749}
750
751/*
752 * sme_init_chan_list, triggers channel setup based on country code.
753 */
Jeff Johnsonc7309062018-11-09 20:59:42 -0800754QDF_STATUS sme_init_chan_list(mac_handle_t mac_handle, uint8_t *alpha2,
Amar Singhala297bfa2015-10-15 15:07:29 -0700755 enum country_src cc_src)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800756{
Jeff Johnson0a8786a2018-12-02 10:49:01 -0800757 struct mac_context *pmac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800758
Amar Singhala297bfa2015-10-15 15:07:29 -0700759 if ((cc_src == SOURCE_USERSPACE) &&
Bala Venkatesh46e29032018-11-14 18:24:55 +0530760 (pmac->mlme_cfg->sap_cfg.country_code_priority)) {
Abhinav Kumard4d6eb72018-12-04 20:30:37 +0530761 pmac->mlme_cfg->gen.enabled_11d = false;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800762 }
763
764 return csr_init_chan_list(pmac, alpha2);
765}
766
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +0530767/*
768 * sme_set11dinfo() - Set the 11d information about valid channels
769 * and there power using information from nvRAM
770 * This function is called only for AP.
771 *
772 * This is a synchronous call
773 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -0800774 * mac_handle - The handle returned by mac_open.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +0530775 * pSmeConfigParams - a pointer to a caller allocated object of
776 * typedef struct _smeConfigParams.
777 *
778 * Return QDF_STATUS_SUCCESS - SME update the config parameters successfully.
779 *
780 * Other status means SME is failed to update the config parameters.
781 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800782
Jeff Johnsonc7309062018-11-09 20:59:42 -0800783QDF_STATUS sme_set11dinfo(mac_handle_t mac_handle,
784 tpSmeConfigParams pSmeConfigParams)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800785{
Jeff Johnson0a8786a2018-12-02 10:49:01 -0800786 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530787 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800788
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +0530789 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800790 TRACE_CODE_SME_RX_HDD_MSG_SET_11DINFO, NO_SESSION, 0));
791 if (NULL == pSmeConfigParams) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -0700792 sme_err("SME config params empty");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800793 return status;
794 }
795
Jeff Johnsonff26c612018-06-10 20:57:13 -0700796 status = csr_set_channels(mac_ctx, &pSmeConfigParams->csrConfig);
Srinivas Girigowda2da81e22017-03-16 21:22:19 -0700797 if (!QDF_IS_STATUS_SUCCESS(status))
798 sme_err("csr_set_channels failed with status: %d", status);
799
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800800 return status;
801}
802
Krunal Sonie3531942016-04-12 17:43:53 -0700803/**
804 * sme_update_fine_time_measurement_capab() - Update the FTM capabitlies from
805 * incoming val
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -0800806 * @mac_handle: Opaque handle to the global MAC context
Krunal Sonie3531942016-04-12 17:43:53 -0700807 * @val: New FTM capability value
808 *
809 * Return: None
810 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -0800811void sme_update_fine_time_measurement_capab(mac_handle_t mac_handle,
Jeff Johnson1f2dabc2018-11-07 15:33:01 -0800812 uint8_t session_id,
813 uint32_t val)
Krunal Sonie3531942016-04-12 17:43:53 -0700814{
Jeff Johnson0a8786a2018-12-02 10:49:01 -0800815 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Vignesh Viswanathan4e65e8e2018-05-01 12:04:16 +0530816 QDF_STATUS status;
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +0530817
Naveen Rawatd2657be2017-10-10 14:31:23 -0700818 ucfg_wifi_pos_set_ftm_cap(mac_ctx->psoc, val);
Krunal Sonie3531942016-04-12 17:43:53 -0700819
Selvaraj, Sridhar57bb4d02016-08-31 16:14:15 +0530820 if (!val) {
Krunal Sonie3531942016-04-12 17:43:53 -0700821 mac_ctx->rrm.rrmPEContext.rrmEnabledCaps.fine_time_meas_rpt = 0;
822 ((tpRRMCaps)mac_ctx->rrm.rrmSmeContext.
823 rrmConfig.rm_capability)->fine_time_meas_rpt = 0;
824 } else {
825 mac_ctx->rrm.rrmPEContext.rrmEnabledCaps.fine_time_meas_rpt = 1;
826 ((tpRRMCaps)mac_ctx->rrm.rrmSmeContext.
827 rrmConfig.rm_capability)->fine_time_meas_rpt = 1;
828 }
Selvaraj, Sridhar57bb4d02016-08-31 16:14:15 +0530829
830 /* Inform this RRM IE change to FW */
Vignesh Viswanathan4e65e8e2018-05-01 12:04:16 +0530831 status = sme_acquire_global_lock(&mac_ctx->sme);
832 if (QDF_IS_STATUS_SUCCESS(status)) {
833 csr_roam_offload_scan(mac_ctx, session_id,
Selvaraj, Sridhar57bb4d02016-08-31 16:14:15 +0530834 ROAM_SCAN_OFFLOAD_UPDATE_CFG,
835 REASON_CONNECT_IES_CHANGED);
Vignesh Viswanathan4e65e8e2018-05-01 12:04:16 +0530836 sme_release_global_lock(&mac_ctx->sme);
Vignesh Viswanathan4e65e8e2018-05-01 12:04:16 +0530837 }
Krunal Sonie3531942016-04-12 17:43:53 -0700838}
839
Manikandan Mohan06d38d82018-11-26 18:36:58 -0800840/**
841 * sme_update_neighbor_report_config() - Update CSR config for 11k params
842 * @mac_handle: Pointer to MAC context
843 * @csr_config: Pointer to CSR config data structure
844 *
845 * Return: None
846 */
847static void sme_update_neighbor_report_config(struct mac_context *mac,
848 tCsrConfigParam *csr_config)
849{
850 struct wlan_fwol_neighbor_report_cfg fwol_neighbor_report_cfg = {0};
851 QDF_STATUS status;
852
853 status = ucfg_fwol_get_neighbor_report_cfg(mac->psoc,
854 &fwol_neighbor_report_cfg);
855 if (!QDF_IS_STATUS_SUCCESS(status))
856 sme_err("Using defaults for 11K offload params: Error: %d",
857 status);
858
859 csr_config->offload_11k_enable_bitmask =
860 fwol_neighbor_report_cfg.enable_bitmask;
861 csr_config->neighbor_report_offload.params_bitmask =
862 fwol_neighbor_report_cfg.params_bitmask;
863 csr_config->neighbor_report_offload.time_offset =
864 fwol_neighbor_report_cfg.time_offset;
865 csr_config->neighbor_report_offload.low_rssi_offset =
866 fwol_neighbor_report_cfg.low_rssi_offset;
867 csr_config->neighbor_report_offload.bmiss_count_trigger =
868 fwol_neighbor_report_cfg.bmiss_count_trigger;
869 csr_config->neighbor_report_offload.per_threshold_offset =
870 fwol_neighbor_report_cfg.per_threshold_offset;
871 csr_config->neighbor_report_offload.neighbor_report_cache_timeout =
872 fwol_neighbor_report_cfg.cache_timeout;
873 csr_config->neighbor_report_offload.max_neighbor_report_req_cap =
874 fwol_neighbor_report_cfg.max_req_cap;
875}
876
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +0530877/*
878 * sme_update_config() - Change configurations for all SME moduels
879 * The function updates some configuration for modules in SME, CSR, etc
880 * during SMEs close open sequence.
881 * Modules inside SME apply the new configuration at the next transaction.
882 * This is a synchronous call
883 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -0800884 * mac_handle - The handle returned by mac_open.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +0530885 * pSmeConfigParams - a pointer to a caller allocated object of
886 * typedef struct _smeConfigParams.
887 * Return QDF_STATUS_SUCCESS - SME update the config parameters successfully.
888 * Other status means SME is failed to update the config parameters.
889 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -0800890QDF_STATUS sme_update_config(mac_handle_t mac_handle, tpSmeConfigParams
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +0530891 pSmeConfigParams)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800892{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530893 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -0800894 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800895
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +0530896 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800897 TRACE_CODE_SME_RX_HDD_MSG_UPDATE_CONFIG, NO_SESSION,
898 0));
899 if (NULL == pSmeConfigParams) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -0700900 sme_err("SME config params empty");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800901 return status;
902 }
Manikandan Mohan06d38d82018-11-26 18:36:58 -0800903 sme_update_neighbor_report_config(mac, &pSmeConfigParams->csrConfig);
Jeff Johnson01f2c232018-11-21 19:17:44 -0800904 status = csr_change_default_config_param(mac, &pSmeConfigParams->
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +0530905 csrConfig);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800906
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +0530907 if (!QDF_IS_STATUS_SUCCESS(status))
Srinivas Girigowda2da81e22017-03-16 21:22:19 -0700908 sme_err("csr_change_default_config_param failed status: %d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800909 status);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800910
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +0530911 /* For SOC, CFG is set before start We don't want to apply global CFG
912 * in connect state because that may cause some side affect
913 */
Jeff Johnson01f2c232018-11-21 19:17:44 -0800914 if (csr_is_all_session_disconnected(mac))
915 csr_set_global_cfgs(mac);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800916
Jeff Johnson01f2c232018-11-21 19:17:44 -0800917 mac->snr_monitor_enabled = pSmeConfigParams->snr_monitor_enabled;
Kapil Gupta4f0c0c12017-02-07 15:21:15 +0530918
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800919 return status;
920}
921
922/**
Abhishek Singh158fe252017-03-23 11:09:34 +0530923 * sme_update_scan_roam_params() - Update the scan roaming params
924 * @mac_ctx: mac ctx
925 *
926 * Return: void.
927 */
Jeff Johnson0a8786a2018-12-02 10:49:01 -0800928static void sme_update_scan_roam_params(struct mac_context *mac_ctx)
Abhishek Singh158fe252017-03-23 11:09:34 +0530929{
930 struct roam_filter_params scan_params = {0};
931 struct roam_ext_params *roam_params_src;
932 uint8_t i;
933 QDF_STATUS status;
934
935 roam_params_src = &mac_ctx->roam.configParam.roam_params;
936
937 scan_params.num_bssid_avoid_list =
938 roam_params_src->num_bssid_avoid_list;
Abhishek Singh158fe252017-03-23 11:09:34 +0530939
940 if (scan_params.num_bssid_avoid_list >
941 MAX_AVOID_LIST_BSSID)
942 scan_params.num_bssid_avoid_list =
943 MAX_AVOID_LIST_BSSID;
944
945 for (i = 0; i < scan_params.num_bssid_avoid_list; i++) {
946 qdf_copy_macaddr(&scan_params.bssid_avoid_list[i],
947 &roam_params_src->bssid_avoid_list[i]);
948 }
949
950 status = ucfg_scan_update_roam_params(mac_ctx->psoc, &scan_params);
951 if (QDF_IS_STATUS_ERROR(status))
Srinivas Girigowda2c263352017-03-17 17:49:53 -0700952 sme_err("ailed to update scan roam params with status=%d",
Abhishek Singh158fe252017-03-23 11:09:34 +0530953 status);
954}
955
956/**
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800957 * sme_update_roam_params() - Store/Update the roaming params
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -0800958 * @mac_handle: Opaque handle to the global MAC context
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800959 * @session_id: SME Session ID
960 * @roam_params_src: The source buffer to copy
961 * @update_param: Type of parameter to be updated
962 *
963 * Return: Return the status of the updation.
964 */
Jeff Johnsonc7309062018-11-09 20:59:42 -0800965QDF_STATUS sme_update_roam_params(mac_handle_t mac_handle,
966 uint8_t session_id,
967 struct roam_ext_params *roam_params_src,
968 int update_param)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800969{
Jeff Johnson0a8786a2018-12-02 10:49:01 -0800970 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800971 struct roam_ext_params *roam_params_dst;
Vignesh Viswanathan4e65e8e2018-05-01 12:04:16 +0530972 QDF_STATUS status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800973 uint8_t i;
974
975 roam_params_dst = &mac_ctx->roam.configParam.roam_params;
976 switch (update_param) {
977 case REASON_ROAM_EXT_SCAN_PARAMS_CHANGED:
Wu Gaoca416ff2018-09-17 11:05:07 +0800978 mac_ctx->mlme_cfg->lfr.rssi_boost_threshold_5g =
Srinivas Girigowda72f30392017-07-13 18:55:09 -0700979 roam_params_src->raise_rssi_thresh_5g;
Wu Gaoca416ff2018-09-17 11:05:07 +0800980 mac_ctx->mlme_cfg->lfr.rssi_penalize_threshold_5g =
Srinivas Girigowda72f30392017-07-13 18:55:09 -0700981 roam_params_src->drop_rssi_thresh_5g;
Wu Gaoca416ff2018-09-17 11:05:07 +0800982 mac_ctx->mlme_cfg->lfr.rssi_boost_factor_5g =
Srinivas Girigowda72f30392017-07-13 18:55:09 -0700983 roam_params_src->raise_factor_5g;
Wu Gaoca416ff2018-09-17 11:05:07 +0800984 mac_ctx->mlme_cfg->lfr.rssi_penalize_factor_5g =
Srinivas Girigowda72f30392017-07-13 18:55:09 -0700985 roam_params_src->drop_factor_5g;
Wu Gaoca416ff2018-09-17 11:05:07 +0800986 mac_ctx->mlme_cfg->lfr.max_rssi_boost_5g =
Srinivas Girigowda72f30392017-07-13 18:55:09 -0700987 roam_params_src->max_raise_rssi_5g;
Wu Gaoca416ff2018-09-17 11:05:07 +0800988 mac_ctx->mlme_cfg->lfr.max_rssi_penalize_5g =
Srinivas Girigowda72f30392017-07-13 18:55:09 -0700989 roam_params_src->max_drop_rssi_5g;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800990 roam_params_dst->alert_rssi_threshold =
Srinivas Girigowda72f30392017-07-13 18:55:09 -0700991 roam_params_src->alert_rssi_threshold;
Wu Gaoca416ff2018-09-17 11:05:07 +0800992 mac_ctx->mlme_cfg->lfr.enable_5g_band_pref = true;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800993 break;
994 case REASON_ROAM_SET_SSID_ALLOWED:
hangtian127c9532019-01-12 13:29:07 +0800995 qdf_mem_zero(&roam_params_dst->ssid_allowed_list,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800996 sizeof(tSirMacSSid) * MAX_SSID_ALLOWED_LIST);
997 roam_params_dst->num_ssid_allowed_list =
Srinivas Girigowda72f30392017-07-13 18:55:09 -0700998 roam_params_src->num_ssid_allowed_list;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800999 for (i = 0; i < roam_params_dst->num_ssid_allowed_list; i++) {
1000 roam_params_dst->ssid_allowed_list[i].length =
Srinivas Girigowda72f30392017-07-13 18:55:09 -07001001 roam_params_src->ssid_allowed_list[i].length;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05301002 qdf_mem_copy(roam_params_dst->ssid_allowed_list[i].ssId,
Srinivas Girigowda72f30392017-07-13 18:55:09 -07001003 roam_params_src->ssid_allowed_list[i].ssId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001004 roam_params_dst->ssid_allowed_list[i].length);
1005 }
1006 break;
1007 case REASON_ROAM_SET_FAVORED_BSSID:
hangtian127c9532019-01-12 13:29:07 +08001008 qdf_mem_zero(&roam_params_dst->bssid_favored,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001009 sizeof(tSirMacAddr) * MAX_BSSID_FAVORED);
1010 roam_params_dst->num_bssid_favored =
Srinivas Girigowda72f30392017-07-13 18:55:09 -07001011 roam_params_src->num_bssid_favored;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001012 for (i = 0; i < roam_params_dst->num_bssid_favored; i++) {
Anurag Chouhan600c3a02016-03-01 10:33:54 +05301013 qdf_mem_copy(&roam_params_dst->bssid_favored[i],
Srinivas Girigowda72f30392017-07-13 18:55:09 -07001014 &roam_params_src->bssid_favored[i],
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001015 sizeof(tSirMacAddr));
1016 roam_params_dst->bssid_favored_factor[i] =
Srinivas Girigowda72f30392017-07-13 18:55:09 -07001017 roam_params_src->bssid_favored_factor[i];
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001018 }
1019 break;
1020 case REASON_ROAM_SET_BLACKLIST_BSSID:
hangtian127c9532019-01-12 13:29:07 +08001021 qdf_mem_zero(&roam_params_dst->bssid_avoid_list,
Anurag Chouhan6d760662016-02-20 16:05:43 +05301022 QDF_MAC_ADDR_SIZE * MAX_BSSID_AVOID_LIST);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001023 roam_params_dst->num_bssid_avoid_list =
Srinivas Girigowda72f30392017-07-13 18:55:09 -07001024 roam_params_src->num_bssid_avoid_list;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001025 for (i = 0; i < roam_params_dst->num_bssid_avoid_list; i++) {
Anurag Chouhanc5548422016-02-24 18:33:27 +05301026 qdf_copy_macaddr(&roam_params_dst->bssid_avoid_list[i],
Srinivas Girigowda72f30392017-07-13 18:55:09 -07001027 &roam_params_src->bssid_avoid_list[i]);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001028 }
1029 break;
1030 case REASON_ROAM_GOOD_RSSI_CHANGED:
1031 roam_params_dst->good_rssi_roam =
Srinivas Girigowda72f30392017-07-13 18:55:09 -07001032 roam_params_src->good_rssi_roam;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001033 break;
1034 default:
1035 break;
1036 }
Vignesh Viswanathan4e65e8e2018-05-01 12:04:16 +05301037
1038 status = sme_acquire_global_lock(&mac_ctx->sme);
1039 if (QDF_IS_STATUS_SUCCESS(status)) {
1040 csr_roam_offload_scan(mac_ctx, session_id,
1041 ROAM_SCAN_OFFLOAD_UPDATE_CFG,
1042 update_param);
1043 sme_release_global_lock(&mac_ctx->sme);
Vignesh Viswanathan4e65e8e2018-05-01 12:04:16 +05301044 }
Abhishek Singh158fe252017-03-23 11:09:34 +05301045
1046 sme_update_scan_roam_params(mac_ctx);
1047
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001048 return 0;
1049}
1050
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001051#ifdef WLAN_FEATURE_EXTWOW_SUPPORT
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001052
Krishna Kumaar Natarajand9131902015-10-19 11:52:47 -07001053/**
1054 * sme_process_ready_to_ext_wow() - inform ready to ExtWoW indication.
Jeff Johnson9d7c99e2018-06-28 15:36:00 -07001055 * @mac: Global MAC context
1056 * @indication: ready to Ext WoW indication from lower layer
Krishna Kumaar Natarajand9131902015-10-19 11:52:47 -07001057 *
1058 * On getting ready to Ext WoW indication, this function calls callback
Jeff Johnson9d7c99e2018-06-28 15:36:00 -07001059 * registered (HDD callback) with SME to inform ready to ExtWoW indication.
Krishna Kumaar Natarajand9131902015-10-19 11:52:47 -07001060 *
1061 * Return: None
1062 */
Jeff Johnson0a8786a2018-12-02 10:49:01 -08001063static void sme_process_ready_to_ext_wow(struct mac_context *mac,
Jeff Johnson9d7c99e2018-06-28 15:36:00 -07001064 tpSirReadyToExtWoWInd indication)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001065{
Jeff Johnson9d7c99e2018-06-28 15:36:00 -07001066 if (!mac) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301067 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_FATAL,
Jeff Johnson9d7c99e2018-06-28 15:36:00 -07001068 "%s: mac is null", __func__);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001069 return;
1070 }
1071
Jeff Johnson9d7c99e2018-06-28 15:36:00 -07001072 if (NULL != mac->readyToExtWoWCallback) {
1073 mac->readyToExtWoWCallback(mac->readyToExtWoWContext,
1074 indication->status);
1075 mac->readyToExtWoWCallback = NULL;
1076 mac->readyToExtWoWContext = NULL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001077 }
1078
1079}
1080#endif
1081
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05301082/*
1083 * sme_hdd_ready_ind() - SME sends eWNI_SME_SYS_READY_IND to PE to inform
1084 * that the NIC is ready tio run.
1085 * The function is called by HDD at the end of initialization stage so PE/HAL
1086 * can enable the NIC to running state.
1087 * This is a synchronous call
1088 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08001089 * @mac_handle - The handle returned by mac_open.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05301090 * Return QDF_STATUS_SUCCESS - eWNI_SME_SYS_READY_IND is sent to PE
1091 * successfully.
1092 * Other status means SME failed to send the message to PE.
1093 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08001094QDF_STATUS sme_hdd_ready_ind(mac_handle_t mac_handle)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001095{
Jeff Johnson47e4b552019-02-01 23:12:25 -08001096 struct sme_ready_req *msg;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301097 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08001098 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001099
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301100 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001101 TRACE_CODE_SME_RX_HDD_MSG_HDDREADYIND, NO_SESSION, 0));
1102 do {
1103
Abhishek Singhde410b72017-05-22 15:25:39 +05301104 msg = qdf_mem_malloc(sizeof(*msg));
Arif Hussain0ef77082018-10-10 16:42:53 -07001105 if (!msg)
Abhishek Singhde410b72017-05-22 15:25:39 +05301106 return QDF_STATUS_E_NOMEM;
Arif Hussain0ef77082018-10-10 16:42:53 -07001107
Abhishek Singhde410b72017-05-22 15:25:39 +05301108 msg->messageType = eWNI_SME_SYS_READY_IND;
1109 msg->length = sizeof(*msg);
Abhishek Singhde410b72017-05-22 15:25:39 +05301110 msg->csr_roam_synch_cb = csr_roam_synch_callback;
Sandeep Puligilla1426d612017-04-12 18:22:06 -07001111 msg->sme_msg_cb = sme_process_msg_callback;
Vignesh Viswanathan3d478032018-08-02 20:18:53 +05301112 msg->stop_roaming_cb = sme_stop_roaming;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001113
Jeff Johnsonb460dd72018-11-08 10:26:51 -08001114 status = u_mac_post_ctrl_msg(mac_handle, (tSirMbMsg *)msg);
Jeff Johnsonc09caa42018-06-07 22:58:55 -07001115 if (QDF_IS_STATUS_ERROR(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07001116 sme_err("u_mac_post_ctrl_msg failed to send eWNI_SME_SYS_READY_IND");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001117 break;
1118 }
1119
Jeff Johnson01f2c232018-11-21 19:17:44 -08001120 status = csr_ready(mac);
Jeff Johnsonc09caa42018-06-07 22:58:55 -07001121 if (QDF_IS_STATUS_ERROR(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07001122 sme_err("csr_ready failed with status: %d", status);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001123 break;
1124 }
1125
Jeff Johnson01f2c232018-11-21 19:17:44 -08001126 mac->sme.state = SME_STATE_READY;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001127 } while (0);
1128
1129 return status;
1130}
1131
Tushnim Bhattacharyyac3c375e2017-08-04 23:39:55 -07001132QDF_STATUS sme_get_valid_channels(uint8_t *chan_list, uint32_t *list_len)
1133{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08001134 struct mac_context *mac_ctx = sme_get_mac_context();
Tushnim Bhattacharyyac3c375e2017-08-04 23:39:55 -07001135
1136 if (NULL == mac_ctx) {
1137 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
1138 FL("Invalid MAC context"));
1139 return QDF_STATUS_E_FAILURE;
1140 }
1141
Wu Gaof3cbeaf2019-01-15 18:26:25 +08001142 *list_len = (uint32_t)mac_ctx->mlme_cfg->reg.valid_channel_list_num;
1143 qdf_mem_copy(chan_list, mac_ctx->mlme_cfg->reg.valid_channel_list,
1144 *list_len);
1145
1146 return QDF_STATUS_SUCCESS;
Tushnim Bhattacharyyac3c375e2017-08-04 23:39:55 -07001147}
1148
Sandeep Puligilla8e89d572018-04-02 18:07:45 -07001149#ifdef WLAN_CONV_SPECTRAL_ENABLE
Jeff Johnson0a8786a2018-12-02 10:49:01 -08001150static QDF_STATUS sme_register_spectral_cb(struct mac_context *mac_ctx)
Sandeep Puligilla8e89d572018-04-02 18:07:45 -07001151{
1152 struct spectral_legacy_cbacks spectral_cb;
1153 QDF_STATUS status;
1154
1155 spectral_cb.vdev_get_chan_freq = sme_get_oper_chan_freq;
1156 spectral_cb.vdev_get_ch_width = sme_get_oper_ch_width;
1157 spectral_cb.vdev_get_sec20chan_freq_mhz = sme_get_sec20chan_freq_mhz;
1158 status = spectral_register_legacy_cb(mac_ctx->psoc, &spectral_cb);
1159
1160 return status;
1161}
1162#else
Jeff Johnson0a8786a2018-12-02 10:49:01 -08001163static QDF_STATUS sme_register_spectral_cb(struct mac_context *mac_ctx)
Sandeep Puligilla8e89d572018-04-02 18:07:45 -07001164{
1165 return QDF_STATUS_SUCCESS;
1166}
1167#endif
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05301168/*
1169 * sme_start() - Put all SME modules at ready state.
1170 * The function starts each module in SME, PMC, CSR, etc. . Upon
1171 * successfully return, all modules are ready to run.
1172 * This is a synchronous call
1173 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08001174 * mac_handle - The handle returned by mac_open.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05301175 * Return QDF_STATUS_SUCCESS - SME is ready.
1176 * Other status means SME is failed to start
1177 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08001178QDF_STATUS sme_start(mac_handle_t mac_handle)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001179{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301180 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08001181 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Tushnim Bhattacharyya91049632017-03-17 17:31:27 -07001182 struct policy_mgr_sme_cbacks sme_cbacks;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001183
1184 do {
Jeff Johnson01f2c232018-11-21 19:17:44 -08001185 status = csr_start(mac);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301186 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07001187 sme_err("csr_start failed status: %d", status);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001188 break;
1189 }
Tushnim Bhattacharyya91049632017-03-17 17:31:27 -07001190 sme_cbacks.sme_get_nss_for_vdev = sme_get_vdev_type_nss;
Tushnim Bhattacharyyac3c375e2017-08-04 23:39:55 -07001191 sme_cbacks.sme_get_valid_channels = sme_get_valid_channels;
Tushnim Bhattacharyya91049632017-03-17 17:31:27 -07001192 sme_cbacks.sme_nss_update_request = sme_nss_update_request;
1193 sme_cbacks.sme_pdev_set_hw_mode = sme_pdev_set_hw_mode;
1194 sme_cbacks.sme_pdev_set_pcl = sme_pdev_set_pcl;
1195 sme_cbacks.sme_soc_set_dual_mac_config =
1196 sme_soc_set_dual_mac_config;
Archana Ramachandran2eb7a612017-03-23 22:58:42 -07001197 sme_cbacks.sme_change_mcc_beacon_interval =
1198 sme_change_mcc_beacon_interval;
1199 sme_cbacks.sme_get_ap_channel_from_scan =
1200 sme_get_ap_channel_from_scan;
1201 sme_cbacks.sme_scan_result_purge = sme_scan_result_purge;
Jeff Johnson01f2c232018-11-21 19:17:44 -08001202 status = policy_mgr_register_sme_cb(mac->psoc, &sme_cbacks);
Tushnim Bhattacharyya91049632017-03-17 17:31:27 -07001203 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda2c263352017-03-17 17:49:53 -07001204 sme_err("Failed to register sme cb with Policy Manager: %d",
Tushnim Bhattacharyya91049632017-03-17 17:31:27 -07001205 status);
1206 break;
1207 }
Jeff Johnson01f2c232018-11-21 19:17:44 -08001208 sme_register_spectral_cb(mac);
1209 mac->sme.state = SME_STATE_START;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001210
Sandeep Puligilla66d09c42017-09-06 17:10:27 -07001211 /* START RRM */
Jeff Johnson01f2c232018-11-21 19:17:44 -08001212 status = rrm_start(mac);
Sandeep Puligilla66d09c42017-09-06 17:10:27 -07001213 if (!QDF_IS_STATUS_SUCCESS(status)) {
1214 sme_err("Failed to start RRM");
1215 break;
1216 }
1217 } while (0);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001218 return status;
1219}
1220
Jeff Johnson0a8786a2018-12-02 10:49:01 -08001221static QDF_STATUS dfs_msg_processor(struct mac_context *mac,
Arif Hussaincd151632017-02-11 16:57:19 -08001222 struct scheduler_msg *msg)
1223{
1224 QDF_STATUS status = QDF_STATUS_SUCCESS;
Jeff Johnson172237b2017-11-07 15:32:59 -08001225 struct csr_roam_info roam_info = { 0 };
Arif Hussaincd151632017-02-11 16:57:19 -08001226 tSirSmeCSAIeTxCompleteRsp *csa_ie_tx_complete_rsp;
1227 uint32_t session_id = 0;
1228 eRoamCmdStatus roam_status;
1229 eCsrRoamResult roam_result;
1230
1231 switch (msg->type) {
1232 case eWNI_SME_DFS_RADAR_FOUND:
1233 {
1234 session_id = msg->bodyval;
1235 roam_status = eCSR_ROAM_DFS_RADAR_IND;
1236 roam_result = eCSR_ROAM_RESULT_DFS_RADAR_FOUND_IND;
Abhishek Singhe4a1f882017-08-10 17:59:44 +05301237 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Arif Hussaincd151632017-02-11 16:57:19 -08001238 "sapdfs: Radar indication event occurred");
1239 break;
1240 }
1241 case eWNI_SME_DFS_CSAIE_TX_COMPLETE_IND:
1242 {
1243 csa_ie_tx_complete_rsp =
1244 (tSirSmeCSAIeTxCompleteRsp *) msg->bodyptr;
1245 if (!csa_ie_tx_complete_rsp) {
1246 sme_err("eWNI_SME_DFS_CSAIE_TX_COMPLETE_IND null msg");
1247 return QDF_STATUS_E_FAILURE;
1248 }
1249 session_id = csa_ie_tx_complete_rsp->sessionId;
1250 roam_status = eCSR_ROAM_DFS_CHAN_SW_NOTIFY;
1251 roam_result = eCSR_ROAM_RESULT_DFS_CHANSW_UPDATE_SUCCESS;
Abhishek Singhe4a1f882017-08-10 17:59:44 +05301252 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Arif Hussaincd151632017-02-11 16:57:19 -08001253 "eWNI_SME_DFS_CSAIE_TX_COMPLETE_IND session=%d",
1254 session_id);
1255 break;
1256 }
1257 case eWNI_SME_DFS_CAC_COMPLETE:
1258 {
1259 session_id = msg->bodyval;
1260 roam_status = eCSR_ROAM_CAC_COMPLETE_IND;
1261 roam_result = eCSR_ROAM_RESULT_CAC_END_IND;
Abhishek Singhe4a1f882017-08-10 17:59:44 +05301262 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Arif Hussaincd151632017-02-11 16:57:19 -08001263 "sapdfs: Received eWNI_SME_DFS_CAC_COMPLETE vdevid%d",
1264 session_id);
1265 break;
1266 }
Abhishek Singh20a8e442018-09-12 15:50:44 +05301267 case eWNI_SME_CSA_RESTART_RSP:
1268 {
1269 session_id = msg->bodyval;
1270 roam_status = 0;
1271 roam_result = eCSR_ROAM_RESULT_CSA_RESTART_RSP;
1272 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
1273 "sapdfs: Received eCSR_ROAM_RESULT_DFS_CHANSW_UPDATE_REQ vdevid%d",
1274 session_id);
1275 break;
1276 }
Arif Hussaincd151632017-02-11 16:57:19 -08001277 default:
1278 {
1279 sme_err("Invalid DFS message: 0x%x", msg->type);
1280 status = QDF_STATUS_E_FAILURE;
1281 return status;
1282 }
1283 }
1284
1285 /* Indicate Radar Event to SAP */
1286 csr_roam_call_callback(mac, session_id, &roam_info, 0,
1287 roam_status, roam_result);
1288 return status;
1289}
1290
1291
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001292#ifdef WLAN_FEATURE_11W
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05301293/*
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001294 * Handle the unprotected management frame indication from LIM and
1295 * forward it to HDD.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05301296 */
Jeff Johnson2ef47442018-06-09 23:43:40 -07001297static QDF_STATUS
Jeff Johnson0a8786a2018-12-02 10:49:01 -08001298sme_unprotected_mgmt_frm_ind(struct mac_context *mac,
Jeff Johnson2ef47442018-06-09 23:43:40 -07001299 tpSirSmeUnprotMgmtFrameInd pSmeMgmtFrm)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001300{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301301 QDF_STATUS status = QDF_STATUS_SUCCESS;
Jeff Johnson172237b2017-11-07 15:32:59 -08001302 struct csr_roam_info roam_info = { 0 };
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001303 uint32_t SessionId = pSmeMgmtFrm->sessionId;
1304
Jeff Johnsoneddf5442017-10-04 10:55:53 -07001305 roam_info.nFrameLength = pSmeMgmtFrm->frameLen;
1306 roam_info.pbFrames = pSmeMgmtFrm->frameBuf;
1307 roam_info.frameType = pSmeMgmtFrm->frameType;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001308
1309 /* forward the mgmt frame to HDD */
Jeff Johnson2ef47442018-06-09 23:43:40 -07001310 csr_roam_call_callback(mac, SessionId, &roam_info, 0,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001311 eCSR_ROAM_UNPROT_MGMT_FRAME_IND, 0);
1312
1313 return status;
1314}
1315#endif
1316
Jeff Johnsonc7309062018-11-09 20:59:42 -08001317QDF_STATUS sme_update_new_channel_event(mac_handle_t mac_handle,
1318 uint8_t session_id)
Kapil Gupta8878ad92017-02-13 11:56:04 +05301319{
1320 QDF_STATUS status = QDF_STATUS_SUCCESS;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08001321 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Jeff Johnson172237b2017-11-07 15:32:59 -08001322 struct csr_roam_info *roamInfo;
Kapil Gupta8878ad92017-02-13 11:56:04 +05301323 eRoamCmdStatus roamStatus;
1324 eCsrRoamResult roamResult;
1325
1326 roamInfo = qdf_mem_malloc(sizeof(*roamInfo));
Arif Hussain0ef77082018-10-10 16:42:53 -07001327 if (!roamInfo)
Krunal Soni3fa80e22018-01-09 14:16:02 -08001328 return QDF_STATUS_E_FAILURE;
Kapil Gupta8878ad92017-02-13 11:56:04 +05301329
Arif Hussain0ef77082018-10-10 16:42:53 -07001330 roamInfo->dfs_event.sessionId = session_id;
Kapil Gupta8878ad92017-02-13 11:56:04 +05301331 roamStatus = eCSR_ROAM_CHANNEL_COMPLETE_IND;
1332 roamResult = eCSR_ROAM_RESULT_DFS_RADAR_FOUND_IND;
Abhishek Singhe4a1f882017-08-10 17:59:44 +05301333 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Kapil Gupta8878ad92017-02-13 11:56:04 +05301334 "sapdfs: Updated new channel event");
1335
1336 /* Indicate channel Event to SAP */
1337 csr_roam_call_callback(mac, session_id, roamInfo, 0,
1338 roamStatus, roamResult);
1339
1340 qdf_mem_free(roamInfo);
1341 return status;
1342}
1343
1344
Abhishek Singh518323d2015-10-19 17:42:01 +05301345/**
1346 * sme_extended_change_channel_ind()- function to indicate ECSA
1347 * action frame is received in lim to SAP
1348 * @mac_ctx: pointer to global mac structure
1349 * @msg_buf: contain new channel and session id.
1350 *
1351 * This function is called to post ECSA action frame
1352 * receive event to SAP.
1353 *
1354 * Return: success if msg indicated to SAP else return failure
1355 */
Jeff Johnson0a8786a2018-12-02 10:49:01 -08001356static QDF_STATUS sme_extended_change_channel_ind(struct mac_context *mac_ctx,
Abhishek Singh518323d2015-10-19 17:42:01 +05301357 void *msg_buf)
1358{
1359 struct sir_sme_ext_cng_chan_ind *ext_chan_ind;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301360 QDF_STATUS status = QDF_STATUS_SUCCESS;
Abhishek Singh518323d2015-10-19 17:42:01 +05301361 uint32_t session_id = 0;
Jeff Johnson172237b2017-11-07 15:32:59 -08001362 struct csr_roam_info roamInfo = {0};
Abhishek Singh518323d2015-10-19 17:42:01 +05301363 eRoamCmdStatus roam_status;
1364 eCsrRoamResult roam_result;
1365
Abhishek Singh518323d2015-10-19 17:42:01 +05301366 ext_chan_ind = msg_buf;
1367 if (NULL == ext_chan_ind) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07001368 sme_err("ext_chan_ind is NULL");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301369 return QDF_STATUS_E_FAILURE;
Abhishek Singh518323d2015-10-19 17:42:01 +05301370 }
1371 session_id = ext_chan_ind->session_id;
1372 roamInfo.target_channel = ext_chan_ind->new_channel;
1373 roam_status = eCSR_ROAM_EXT_CHG_CHNL_IND;
1374 roam_result = eCSR_ROAM_EXT_CHG_CHNL_UPDATE_IND;
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07001375 sme_debug("sapdfs: Received eWNI_SME_EXT_CHANGE_CHANNEL_IND for session id [%d]",
1376 session_id);
Abhishek Singh518323d2015-10-19 17:42:01 +05301377
1378 /* Indicate Ext Channel Change event to SAP */
1379 csr_roam_call_callback(mac_ctx, session_id, &roamInfo, 0,
1380 roam_status, roam_result);
1381 return status;
1382}
1383
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001384#ifdef FEATURE_WLAN_ESE
1385/**
1386 * sme_update_is_ese_feature_enabled() - enable/disable ESE support at runtime
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -08001387 * @mac_handle: Opaque handle to the global MAC context
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001388 * @sessionId: session id
1389 * @isEseIniFeatureEnabled: ese ini enabled
1390 *
1391 * It is used at in the REG_DYNAMIC_VARIABLE macro definition of
1392 * isEseIniFeatureEnabled. This is a synchronous call
1393 *
1394 * Return: QDF_STATUS enumeration
1395 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08001396QDF_STATUS sme_update_is_ese_feature_enabled(mac_handle_t mac_handle,
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001397 uint8_t sessionId, const bool isEseIniFeatureEnabled)
1398{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08001399 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Vignesh Viswanathan4e65e8e2018-05-01 12:04:16 +05301400 QDF_STATUS status;
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001401
Wu Gao51a63562018-11-08 16:29:10 +08001402 if (mac->mlme_cfg->lfr.ese_enabled ==
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001403 isEseIniFeatureEnabled) {
Abhishek Singhe4a1f882017-08-10 17:59:44 +05301404 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001405 "%s: ESE Mode is already enabled or disabled, nothing to do (returning) old(%d) new(%d)",
1406 __func__,
Wu Gao51a63562018-11-08 16:29:10 +08001407 mac->mlme_cfg->lfr.ese_enabled,
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001408 isEseIniFeatureEnabled);
1409 return QDF_STATUS_SUCCESS;
1410 }
1411
Abhishek Singhe4a1f882017-08-10 17:59:44 +05301412 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001413 "%s: EseEnabled is changed from %d to %d", __func__,
Wu Gao51a63562018-11-08 16:29:10 +08001414 mac->mlme_cfg->lfr.ese_enabled,
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001415 isEseIniFeatureEnabled);
Wu Gao51a63562018-11-08 16:29:10 +08001416 mac->mlme_cfg->lfr.ese_enabled = isEseIniFeatureEnabled;
Varun Reddy Yeturuff4feb02016-04-20 12:26:11 -07001417 csr_neighbor_roam_update_fast_roaming_enabled(
Jeff Johnson01f2c232018-11-21 19:17:44 -08001418 mac, sessionId, isEseIniFeatureEnabled);
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001419
1420 if (true == isEseIniFeatureEnabled)
Wu Gao51a63562018-11-08 16:29:10 +08001421 mac->mlme_cfg->lfr.fast_transition_enabled = true;
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001422
Wu Gao51a63562018-11-08 16:29:10 +08001423 if (mac->mlme_cfg->lfr.roam_scan_offload_enabled) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08001424 status = sme_acquire_global_lock(&mac->sme);
Vignesh Viswanathan4e65e8e2018-05-01 12:04:16 +05301425 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08001426 csr_roam_offload_scan(mac, sessionId,
Vignesh Viswanathan4e65e8e2018-05-01 12:04:16 +05301427 ROAM_SCAN_OFFLOAD_UPDATE_CFG,
1428 REASON_ESE_INI_CFG_CHANGED);
Jeff Johnson01f2c232018-11-21 19:17:44 -08001429 sme_release_global_lock(&mac->sme);
Vignesh Viswanathan4e65e8e2018-05-01 12:04:16 +05301430 } else {
Vignesh Viswanathan4e65e8e2018-05-01 12:04:16 +05301431 return status;
1432 }
1433 }
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001434 return QDF_STATUS_SUCCESS;
1435}
1436
1437/**
1438 * sme_set_plm_request() - set plm request
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -08001439 * @mac_handle: Opaque handle to the global MAC context
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001440 * @pPlmReq: Pointer to input plm request
1441 *
1442 * Return: QDF_STATUS enumeration
1443 */
Jeff Johnsonb120a822019-02-02 22:15:55 -08001444QDF_STATUS sme_set_plm_request(mac_handle_t mac_handle, struct plm_req *pPlmReq)
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001445{
1446 QDF_STATUS status;
1447 bool ret = false;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08001448 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Wu Gao0821b0d2019-01-11 17:31:11 +08001449 uint8_t ch_list[CFG_VALID_CHANNEL_LIST_LEN] = { 0 };
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001450 uint8_t count, valid_count = 0;
Rajeev Kumar37d478b2017-04-17 16:59:28 -07001451 struct scheduler_msg msg = {0};
Jeff Johnson01f2c232018-11-21 19:17:44 -08001452 struct csr_roam_session *pSession = CSR_GET_SESSION(mac,
gaurank kathpalia14e2f912017-08-31 14:51:45 +05301453 pPlmReq->sessionId);
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001454
Jeff Johnson01f2c232018-11-21 19:17:44 -08001455 status = sme_acquire_global_lock(&mac->sme);
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001456 if (!QDF_IS_STATUS_SUCCESS(status))
1457 return status;
1458
1459 if (!pSession) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07001460 sme_err("session %d not found", pPlmReq->sessionId);
Jeff Johnson01f2c232018-11-21 19:17:44 -08001461 sme_release_global_lock(&mac->sme);
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001462 return QDF_STATUS_E_FAILURE;
1463 }
1464
1465 if (!pSession->sessionActive) {
1466 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
1467 FL("Invalid Sessionid"));
Jeff Johnson01f2c232018-11-21 19:17:44 -08001468 sme_release_global_lock(&mac->sme);
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001469 return QDF_STATUS_E_FAILURE;
1470 }
1471
1472 if (!pPlmReq->enable)
1473 goto send_plm_start;
1474 /* validating channel numbers */
1475 for (count = 0; count < pPlmReq->plmNumCh; count++) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08001476 ret = csr_is_supported_channel(mac, pPlmReq->plmChList[count]);
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001477 if (ret && pPlmReq->plmChList[count] > 14) {
Kiran Kumar Lokerea3de2262017-04-12 12:15:04 -07001478 if (CHANNEL_STATE_DFS == wlan_reg_get_channel_state(
Jeff Johnson01f2c232018-11-21 19:17:44 -08001479 mac->pdev,
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001480 pPlmReq->plmChList[count])) {
1481 /* DFS channel is provided, no PLM bursts can be
1482 * transmitted. Ignoring these channels.
1483 */
1484 QDF_TRACE(QDF_MODULE_ID_SME,
Abhishek Singhe4a1f882017-08-10 17:59:44 +05301485 QDF_TRACE_LEVEL_DEBUG,
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001486 FL("DFS channel %d ignored for PLM"),
1487 pPlmReq->plmChList[count]);
1488 continue;
1489 }
1490 } else if (!ret) {
1491 /* Not supported, ignore the channel */
Abhishek Singhe4a1f882017-08-10 17:59:44 +05301492 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001493 FL("Unsupported channel %d ignored for PLM"),
1494 pPlmReq->plmChList[count]);
1495 continue;
1496 }
1497 ch_list[valid_count] = pPlmReq->plmChList[count];
1498 valid_count++;
1499 } /* End of for () */
1500
1501 /* Copying back the valid channel list to plm struct */
hangtian127c9532019-01-12 13:29:07 +08001502 qdf_mem_zero((void *)pPlmReq->plmChList,
1503 pPlmReq->plmNumCh);
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001504 if (valid_count)
1505 qdf_mem_copy(pPlmReq->plmChList, ch_list,
1506 valid_count);
1507 /* All are invalid channels, FW need to send the PLM
1508 * report with "incapable" bit set.
1509 */
1510 pPlmReq->plmNumCh = valid_count;
1511
1512send_plm_start:
1513 /* PLM START */
1514 msg.type = WMA_SET_PLM_REQ;
1515 msg.reserved = 0;
1516 msg.bodyptr = pPlmReq;
1517
gaurank kathpalia36b0c582018-08-28 17:45:43 +05301518 if (!QDF_IS_STATUS_SUCCESS(scheduler_post_message(QDF_MODULE_ID_SME,
1519 QDF_MODULE_ID_WMA,
1520 QDF_MODULE_ID_WMA,
1521 &msg))) {
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001522 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
1523 FL("Not able to post WMA_SET_PLM_REQ to WMA"));
Jeff Johnson01f2c232018-11-21 19:17:44 -08001524 sme_release_global_lock(&mac->sme);
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001525 return QDF_STATUS_E_FAILURE;
1526 }
1527
Jeff Johnson01f2c232018-11-21 19:17:44 -08001528 sme_release_global_lock(&mac->sme);
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001529 return status;
1530}
1531
1532/**
1533 * sme_tsm_ie_ind() - sme tsm ie indication
Jeff Johnson24e65b52018-06-10 08:45:26 -07001534 * @mac: Global mac context
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001535 * @pSmeTsmIeInd: Pointer to tsm ie indication
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001536 *
1537 * Handle the tsm ie indication from LIM and forward it to HDD.
1538 *
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001539 * Return: QDF_STATUS enumeration
1540 */
Jeff Johnson0a8786a2018-12-02 10:49:01 -08001541static QDF_STATUS sme_tsm_ie_ind(struct mac_context *mac,
Jeff Johnsone21b0eb2019-02-02 19:31:54 -08001542 struct tsm_ie_ind *pSmeTsmIeInd)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001543{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301544 QDF_STATUS status = QDF_STATUS_SUCCESS;
Jeff Johnson172237b2017-11-07 15:32:59 -08001545 struct csr_roam_info roam_info = { 0 };
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001546 uint32_t SessionId = pSmeTsmIeInd->sessionId;
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05301547
Jeff Johnson85ddb772019-02-02 19:01:52 -08001548 roam_info.tsm_ie.tsid = pSmeTsmIeInd->tsm_ie.tsid;
1549 roam_info.tsm_ie.state = pSmeTsmIeInd->tsm_ie.state;
1550 roam_info.tsm_ie.msmt_interval = pSmeTsmIeInd->tsm_ie.msmt_interval;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001551 /* forward the tsm ie information to HDD */
Jeff Johnson24e65b52018-06-10 08:45:26 -07001552 csr_roam_call_callback(mac, SessionId, &roam_info, 0,
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05301553 eCSR_ROAM_TSM_IE_IND, 0);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001554 return status;
1555}
1556
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001557/**
1558 * sme_set_cckm_ie() - set cckm ie
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -08001559 * @mac_handle: Opaque handle to the global MAC context
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001560 * @sessionId: session id
1561 * @pCckmIe: Pointer to CCKM Ie
1562 * @cckmIeLen: Length of @pCckmIe
1563 *
1564 * Function to store the CCKM IE passed from supplicant and use
1565 * it while packing reassociation request.
1566 *
1567 * Return: QDF_STATUS enumeration
1568 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08001569QDF_STATUS sme_set_cckm_ie(mac_handle_t mac_handle, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001570 uint8_t *pCckmIe, uint8_t cckmIeLen)
1571{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08001572 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301573 QDF_STATUS status = QDF_STATUS_SUCCESS;
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05301574
Jeff Johnson01f2c232018-11-21 19:17:44 -08001575 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301576 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08001577 csr_set_cckm_ie(mac, sessionId, pCckmIe, cckmIeLen);
1578 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001579 }
1580 return status;
1581}
1582
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001583/**
1584 * sme_set_ese_beacon_request() - set ese beacon request
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -08001585 * @mac_handle: Opaque handle to the global MAC context
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001586 * @sessionId: session id
1587 * @pEseBcnReq: Ese beacon report
1588 *
1589 * function to set ESE beacon request parameters
1590 *
1591 * Return: QDF_STATUS enumeration
1592 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08001593QDF_STATUS sme_set_ese_beacon_request(mac_handle_t mac_handle,
Jeff Johnson1f2dabc2018-11-07 15:33:01 -08001594 const uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001595 const tCsrEseBeaconReq *pEseBcnReq)
1596{
Varun Reddy Yeturu7b2a6572017-06-15 11:07:28 -07001597 QDF_STATUS status;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08001598 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001599 tpSirBeaconReportReqInd pSmeBcnReportReq = NULL;
1600 tCsrEseBeaconReqParams *pBeaconReq = NULL;
1601 uint8_t counter = 0;
Jeff Johnson01f2c232018-11-21 19:17:44 -08001602 struct csr_roam_session *pSession = CSR_GET_SESSION(mac, sessionId);
1603 tpRrmSMEContext pSmeRrmContext = &mac->rrm.rrmSmeContext;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001604
1605 if (pSmeRrmContext->eseBcnReqInProgress == true) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07001606 sme_err("A Beacon Report Req is already in progress");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301607 return QDF_STATUS_E_RESOURCES;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001608 }
1609
1610 /* Store the info in RRM context */
Anurag Chouhan600c3a02016-03-01 10:33:54 +05301611 qdf_mem_copy(&pSmeRrmContext->eseBcnReqInfo, pEseBcnReq,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001612 sizeof(tCsrEseBeaconReq));
1613
1614 /* Prepare the request to send to SME. */
Anurag Chouhan600c3a02016-03-01 10:33:54 +05301615 pSmeBcnReportReq = qdf_mem_malloc(sizeof(tSirBeaconReportReqInd));
Arif Hussain0ef77082018-10-10 16:42:53 -07001616 if (!pSmeBcnReportReq)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301617 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001618
1619 pSmeRrmContext->eseBcnReqInProgress = true;
1620
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07001621 sme_debug("Sending Beacon Report Req to SME");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001622
1623 pSmeBcnReportReq->messageType = eWNI_SME_BEACON_REPORT_REQ_IND;
1624 pSmeBcnReportReq->length = sizeof(tSirBeaconReportReqInd);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05301625 qdf_mem_copy(pSmeBcnReportReq->bssId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001626 pSession->connectedProfile.bssid.bytes,
1627 sizeof(tSirMacAddr));
1628 pSmeBcnReportReq->channelInfo.channelNum = 255;
1629 pSmeBcnReportReq->channelList.numChannels = pEseBcnReq->numBcnReqIe;
1630 pSmeBcnReportReq->msgSource = eRRM_MSG_SOURCE_ESE_UPLOAD;
1631
1632 for (counter = 0; counter < pEseBcnReq->numBcnReqIe; counter++) {
1633 pBeaconReq =
1634 (tCsrEseBeaconReqParams *) &pEseBcnReq->bcnReq[counter];
1635 pSmeBcnReportReq->fMeasurementtype[counter] =
1636 pBeaconReq->scanMode;
1637 pSmeBcnReportReq->measurementDuration[counter] =
1638 SYS_TU_TO_MS(pBeaconReq->measurementDuration);
1639 pSmeBcnReportReq->channelList.channelNumber[counter] =
1640 pBeaconReq->channel;
1641 }
1642
Jeff Johnson01f2c232018-11-21 19:17:44 -08001643 status = sme_rrm_process_beacon_report_req_ind(mac, pSmeBcnReportReq);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001644
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301645 if (status != QDF_STATUS_SUCCESS)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001646 pSmeRrmContext->eseBcnReqInProgress = false;
1647
Hanumanth Reddy Pothula7f7a2712016-09-07 18:44:47 +05301648 qdf_mem_free(pSmeBcnReportReq);
1649
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001650 return status;
1651}
1652
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001653/**
1654 * sme_get_tsm_stats() - SME get tsm stats
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -08001655 * @mac_handle: Opaque handle to the global MAC context
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001656 * @callback: SME sends back the requested stats using the callback
1657 * @staId: The station ID for which the stats is requested for
1658 * @bssId: bssid
1659 * @pContext: user context to be passed back along with the callback
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001660 * @tid: Traffic id
1661 *
1662 * API register a callback to get TSM Stats.
1663 *
1664 * Return: QDF_STATUS enumeration
1665 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08001666QDF_STATUS sme_get_tsm_stats(mac_handle_t mac_handle,
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001667 tCsrTsmStatsCallback callback,
1668 uint8_t staId, struct qdf_mac_addr bssId,
Jeff Johnson30f84552017-09-13 14:55:25 -07001669 void *pContext, uint8_t tid)
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001670{
1671 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08001672 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001673
Jeff Johnson01f2c232018-11-21 19:17:44 -08001674 status = sme_acquire_global_lock(&mac->sme);
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001675 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08001676 status = csr_get_tsm_stats(mac, callback,
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001677 staId, bssId, pContext,
Jeff Johnson30f84552017-09-13 14:55:25 -07001678 tid);
Jeff Johnson01f2c232018-11-21 19:17:44 -08001679 sme_release_global_lock(&mac->sme);
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001680 }
1681 return status;
1682}
1683
1684/**
1685 * sme_set_ese_roam_scan_channel_list() - To set ese roam scan channel list
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -08001686 * @mac_handle: Opaque handle to the global MAC context
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001687 * @sessionId: sme session id
1688 * @pChannelList: Output channel list
1689 * @numChannels: Output number of channels
1690 *
1691 * This routine is called to set ese roam scan channel list.
1692 * This is a synchronous call
1693 *
1694 * Return: QDF_STATUS
1695 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08001696QDF_STATUS sme_set_ese_roam_scan_channel_list(mac_handle_t mac_handle,
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001697 uint8_t sessionId,
1698 uint8_t *pChannelList,
1699 uint8_t numChannels)
1700{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08001701 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001702 QDF_STATUS status = QDF_STATUS_SUCCESS;
Naveen Rawatc36f7eb2016-11-10 20:01:03 -08001703 tpCsrNeighborRoamControlInfo pNeighborRoamInfo = NULL;
1704 tpCsrChannelInfo curchnl_list_info = NULL;
Wu Gao0821b0d2019-01-11 17:31:11 +08001705 uint8_t oldChannelList[CFG_VALID_CHANNEL_LIST_LEN * 2] = { 0 };
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001706 uint8_t newChannelList[128] = { 0 };
1707 uint8_t i = 0, j = 0;
1708
Dustin Brownad06be62019-02-04 14:52:56 -08001709 if (sessionId >= WLAN_MAX_VDEVS) {
Naveen Rawatc36f7eb2016-11-10 20:01:03 -08001710 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
1711 FL("Invalid sme session id: %d"), sessionId);
1712 return QDF_STATUS_E_INVAL;
1713 }
1714
Jeff Johnson01f2c232018-11-21 19:17:44 -08001715 pNeighborRoamInfo = &mac->roam.neighborRoamInfo[sessionId];
Naveen Rawatc36f7eb2016-11-10 20:01:03 -08001716 curchnl_list_info =
1717 &pNeighborRoamInfo->roamChannelInfo.currentChannelListInfo;
1718
Jeff Johnson01f2c232018-11-21 19:17:44 -08001719 status = sme_acquire_global_lock(&mac->sme);
Madhvapathi Sriram3e6627a2018-12-19 12:54:49 +05301720 if (!QDF_IS_STATUS_SUCCESS(status))
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001721 return status;
Madhvapathi Sriram3e6627a2018-12-19 12:54:49 +05301722
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001723 if (NULL != curchnl_list_info->ChannelList) {
1724 for (i = 0; i < curchnl_list_info->numOfChannels; i++) {
1725 j += snprintf(oldChannelList + j,
1726 sizeof(oldChannelList) - j, "%d",
1727 curchnl_list_info->ChannelList[i]);
1728 }
1729 }
Jeff Johnson01f2c232018-11-21 19:17:44 -08001730 status = csr_create_roam_scan_channel_list(mac, sessionId,
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001731 pChannelList, numChannels,
Jeff Johnson01f2c232018-11-21 19:17:44 -08001732 csr_get_current_band(mac));
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001733 if (QDF_IS_STATUS_SUCCESS(status)) {
1734 if (NULL != curchnl_list_info->ChannelList) {
1735 j = 0;
1736 for (i = 0; i < curchnl_list_info->numOfChannels; i++) {
1737 j += snprintf(newChannelList + j,
1738 sizeof(newChannelList) - j, "%d",
1739 curchnl_list_info->ChannelList[i]);
1740 }
1741 }
1742 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
1743 "ESE roam scan chnl list successfully set to %s-old value is %s-roam state is %d",
1744 newChannelList, oldChannelList,
1745 pNeighborRoamInfo->neighborRoamState);
1746 }
Vignesh Viswanathan4e65e8e2018-05-01 12:04:16 +05301747
Wu Gao51a63562018-11-08 16:29:10 +08001748 if (mac->mlme_cfg->lfr.roam_scan_offload_enabled)
Jeff Johnson01f2c232018-11-21 19:17:44 -08001749 csr_roam_offload_scan(mac, sessionId,
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001750 ROAM_SCAN_OFFLOAD_UPDATE_CFG,
1751 REASON_CHANNEL_LIST_CHANGED);
Vignesh Viswanathan4e65e8e2018-05-01 12:04:16 +05301752
Jeff Johnson01f2c232018-11-21 19:17:44 -08001753 sme_release_global_lock(&mac->sme);
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001754 return status;
1755}
1756
1757#endif /* FEATURE_WLAN_ESE */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001758
Jeff Johnson49c02f92016-10-07 10:29:09 -07001759static
Jeff Johnson0a8786a2018-12-02 10:49:01 -08001760QDF_STATUS sme_ibss_peer_info_response_handler(struct mac_context *mac,
Jeff Johnson49c02f92016-10-07 10:29:09 -07001761 tpSirIbssGetPeerInfoRspParams
1762 pIbssPeerInfoParams)
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08001763{
Jeff Johnson56ba88a2019-02-17 17:18:43 -08001764 struct ibss_peer_info_cb_info *cb_info;
1765
1766 if (!mac) {
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08001767 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_FATAL,
Jeff Johnson01f2c232018-11-21 19:17:44 -08001768 "%s: mac is null", __func__);
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08001769 return QDF_STATUS_E_FAILURE;
1770 }
Jeff Johnsone7aa5cd2019-02-17 19:36:01 -08001771 cb_info = &mac->sme.peer_info_cb_info;
Jeff Johnson56ba88a2019-02-17 17:18:43 -08001772 if (!cb_info->peer_info_cb) {
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08001773 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
1774 "%s: HDD callback is null", __func__);
1775 return QDF_STATUS_E_FAILURE;
1776 }
Jeff Johnson56ba88a2019-02-17 17:18:43 -08001777 cb_info->peer_info_cb(cb_info->peer_info_cb_context,
1778 &pIbssPeerInfoParams->ibssPeerInfoRspParams);
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08001779 return QDF_STATUS_SUCCESS;
1780}
1781
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001782/**
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001783 * sme_process_dual_mac_config_resp() - Process set Dual mac config response
1784 * @mac: Global MAC pointer
1785 * @msg: Dual mac config response
1786 *
1787 * Processes the dual mac configuration response and invokes the HDD callback
1788 * to process further
1789 */
Jeff Johnson0a8786a2018-12-02 10:49:01 -08001790static QDF_STATUS sme_process_dual_mac_config_resp(struct mac_context *mac,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001791 uint8_t *msg)
1792{
1793 tListElem *entry = NULL;
1794 tSmeCmd *command = NULL;
1795 bool found;
1796 dual_mac_cb callback = NULL;
1797 struct sir_dual_mac_config_resp *param;
1798
1799 param = (struct sir_dual_mac_config_resp *)msg;
1800 if (!param) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07001801 sme_err("Dual mac config resp param is NULL");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001802 /* Not returning. Need to check if active command list
1803 * needs to be freed
1804 */
1805 }
1806
Krunal Sonia8270f52017-02-23 19:51:25 -08001807 entry = csr_nonscan_active_ll_peek_head(mac, LL_ACCESS_LOCK);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001808 if (!entry) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07001809 sme_err("No cmd found in active list");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301810 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001811 }
1812
1813 command = GET_BASE_ADDR(entry, tSmeCmd, Link);
1814 if (!command) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07001815 sme_err("Base address is NULL");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301816 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001817 }
1818
1819 if (e_sme_command_set_dual_mac_config != command->command) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07001820 sme_err("Command mismatch!");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301821 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001822 }
1823
1824 callback = command->u.set_dual_mac_cmd.set_dual_mac_cb;
1825 if (callback) {
1826 if (!param) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07001827 sme_err("Callback failed-Dual mac config is NULL");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001828 } else {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07001829 sme_debug("Calling HDD callback for Dual mac config");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001830 callback(param->status,
1831 command->u.set_dual_mac_cmd.scan_config,
1832 command->u.set_dual_mac_cmd.fw_mode_config);
1833 }
1834 } else {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07001835 sme_err("Callback does not exist");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001836 }
1837
Krunal Soni72dba662017-02-15 20:13:17 -08001838 found = csr_nonscan_active_ll_remove_entry(mac, entry, LL_ACCESS_LOCK);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001839 if (found)
1840 /* Now put this command back on the available command list */
Krunal Soni78618d92017-02-14 21:46:31 -08001841 csr_release_command(mac, command);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001842
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301843 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001844}
1845
Archana Ramachandrana20ef812015-11-13 16:12:13 -08001846/**
1847 * sme_process_antenna_mode_resp() - Process set antenna mode
1848 * response
1849 * @mac: Global MAC pointer
1850 * @msg: antenna mode response
1851 *
1852 * Processes the antenna mode response and invokes the HDD
1853 * callback to process further
1854 */
Jeff Johnson0a8786a2018-12-02 10:49:01 -08001855static QDF_STATUS sme_process_antenna_mode_resp(struct mac_context *mac,
Archana Ramachandrana20ef812015-11-13 16:12:13 -08001856 uint8_t *msg)
1857{
1858 tListElem *entry;
1859 tSmeCmd *command;
1860 bool found;
Dundi Raviteja6bb9e322018-05-16 17:04:41 +05301861 void *context = NULL;
Archana Ramachandrana20ef812015-11-13 16:12:13 -08001862 antenna_mode_cb callback;
1863 struct sir_antenna_mode_resp *param;
1864
1865 param = (struct sir_antenna_mode_resp *)msg;
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05301866 if (!param)
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07001867 sme_err("set antenna mode resp is NULL");
Archana Ramachandrana20ef812015-11-13 16:12:13 -08001868 /* Not returning. Need to check if active command list
1869 * needs to be freed
1870 */
Archana Ramachandrana20ef812015-11-13 16:12:13 -08001871
Krunal Sonia8270f52017-02-23 19:51:25 -08001872 entry = csr_nonscan_active_ll_peek_head(mac, LL_ACCESS_LOCK);
Archana Ramachandrana20ef812015-11-13 16:12:13 -08001873 if (!entry) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07001874 sme_err("No cmd found in active list");
Archana Ramachandrana20ef812015-11-13 16:12:13 -08001875 return QDF_STATUS_E_FAILURE;
1876 }
1877
1878 command = GET_BASE_ADDR(entry, tSmeCmd, Link);
1879 if (!command) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07001880 sme_err("Base address is NULL");
Archana Ramachandrana20ef812015-11-13 16:12:13 -08001881 return QDF_STATUS_E_FAILURE;
1882 }
1883
1884 if (e_sme_command_set_antenna_mode != command->command) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07001885 sme_err("Command mismatch!");
Archana Ramachandrana20ef812015-11-13 16:12:13 -08001886 return QDF_STATUS_E_FAILURE;
1887 }
1888
Dundi Raviteja6bb9e322018-05-16 17:04:41 +05301889 context = command->u.set_antenna_mode_cmd.set_antenna_mode_ctx;
1890 callback = command->u.set_antenna_mode_cmd.set_antenna_mode_resp;
Archana Ramachandrana20ef812015-11-13 16:12:13 -08001891 if (callback) {
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05301892 if (!param)
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07001893 sme_err("Set antenna mode call back is NULL");
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05301894 else
Dundi Raviteja6bb9e322018-05-16 17:04:41 +05301895 callback(param->status, context);
Archana Ramachandrana20ef812015-11-13 16:12:13 -08001896 } else {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07001897 sme_err("Callback does not exist");
Archana Ramachandrana20ef812015-11-13 16:12:13 -08001898 }
1899
Krunal Soni72dba662017-02-15 20:13:17 -08001900 found = csr_nonscan_active_ll_remove_entry(mac, entry, LL_ACCESS_LOCK);
Archana Ramachandrana20ef812015-11-13 16:12:13 -08001901 if (found)
1902 /* Now put this command back on the available command list */
Krunal Soni78618d92017-02-14 21:46:31 -08001903 csr_release_command(mac, command);
Archana Ramachandrana20ef812015-11-13 16:12:13 -08001904
Archana Ramachandrana20ef812015-11-13 16:12:13 -08001905 return QDF_STATUS_SUCCESS;
1906}
1907
Jeff Johnson0a8786a2018-12-02 10:49:01 -08001908QDF_STATUS sme_process_msg(struct mac_context *mac, struct scheduler_msg *pMsg)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001909{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301910 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Ashish Kumar Dhanotiya443d31f2017-10-13 12:41:19 +05301911 struct sir_peer_info *peer_stats;
1912 struct sir_peer_info_resp *peer_info_rsp;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001913
1914 if (pMsg == NULL) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07001915 sme_err("Empty message for SME");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001916 return status;
1917 }
Jeff Johnson01f2c232018-11-21 19:17:44 -08001918 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301919 if (!QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001920 if (pMsg->bodyptr)
Anurag Chouhan600c3a02016-03-01 10:33:54 +05301921 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001922 return status;
1923 }
Jeff Johnson01f2c232018-11-21 19:17:44 -08001924 if (!SME_IS_START(mac)) {
Rajeev Kumar3887f9b2018-01-10 11:24:01 -08001925 sme_debug("message type %d in stop state ignored", pMsg->type);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001926 if (pMsg->bodyptr)
Anurag Chouhan600c3a02016-03-01 10:33:54 +05301927 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001928 goto release_lock;
1929 }
1930 switch (pMsg->type) {
1931#ifdef WLAN_FEATURE_ROAM_OFFLOAD
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001932 case eWNI_SME_HO_FAIL_IND:
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301933 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001934 FL("LFR3: Rcvd eWNI_SME_HO_FAIL_IND"));
Jeff Johnson01f2c232018-11-21 19:17:44 -08001935 csr_process_ho_fail_ind(mac, pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05301936 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001937 break;
1938#endif
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001939 case eWNI_SME_ADDTS_RSP:
1940 case eWNI_SME_DELTS_RSP:
1941 case eWNI_SME_DELTS_IND:
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001942 case eWNI_SME_FT_AGGR_QOS_RSP:
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001943 /* QoS */
1944 if (pMsg->bodyptr) {
1945#ifndef WLAN_MDM_CODE_REDUCTION_OPT
Jeff Johnson01f2c232018-11-21 19:17:44 -08001946 status = sme_qos_msg_processor(mac, pMsg->type,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001947 pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05301948 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001949#endif
1950 } else {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07001951 sme_err("Empty message for: %d", pMsg->type);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001952 }
1953 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001954 case eWNI_SME_NEIGHBOR_REPORT_IND:
1955 case eWNI_SME_BEACON_REPORT_REQ_IND:
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001956 if (pMsg->bodyptr) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08001957 status = sme_rrm_msg_processor(mac, pMsg->type,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001958 pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05301959 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001960 } else {
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05301961 sme_err("Empty message for: %d", pMsg->type);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001962 }
1963 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001964 case eWNI_SME_ADD_STA_SELF_RSP:
1965 if (pMsg->bodyptr) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08001966 status = csr_process_add_sta_session_rsp(mac,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001967 pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05301968 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001969 } else {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07001970 sme_err("Empty message for: %d", pMsg->type);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001971 }
1972 break;
1973 case eWNI_SME_DEL_STA_SELF_RSP:
1974 if (pMsg->bodyptr) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08001975 status = csr_process_del_sta_session_rsp(mac,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001976 pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05301977 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001978 } else {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07001979 sme_err("Empty message for: %d", pMsg->type);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001980 }
1981 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001982 case eWNI_SME_GENERIC_CHANGE_COUNTRY_CODE:
1983 if (pMsg->bodyptr) {
1984 status = sme_handle_generic_change_country_code(
Jeff Johnson01f2c232018-11-21 19:17:44 -08001985 (void *)mac, pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05301986 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001987 } else {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07001988 sme_err("Empty message for: %d", pMsg->type);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001989 }
1990 break;
Sandeep Puligilla8d6011b2017-11-08 00:06:18 -08001991
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001992#ifdef WLAN_FEATURE_11W
1993 case eWNI_SME_UNPROT_MGMT_FRM_IND:
1994 if (pMsg->bodyptr) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08001995 sme_unprotected_mgmt_frm_ind(mac, pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05301996 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001997 } else {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07001998 sme_err("Empty message for: %d", pMsg->type);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001999 }
2000 break;
2001#endif
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08002002#ifdef FEATURE_WLAN_ESE
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002003 case eWNI_SME_TSM_IE_IND:
2004 if (pMsg->bodyptr) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08002005 sme_tsm_ie_ind(mac, pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302006 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002007 } else {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002008 sme_err("Empty message for: %d", pMsg->type);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002009 }
2010 break;
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08002011#endif /* FEATURE_WLAN_ESE */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002012 case eWNI_SME_ROAM_SCAN_OFFLOAD_RSP:
Jeff Johnson01f2c232018-11-21 19:17:44 -08002013 status = csr_roam_offload_scan_rsp_hdlr((void *)mac,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002014 pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302015 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002016 break;
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08002017 case eWNI_SME_IBSS_PEER_INFO_RSP:
2018 if (pMsg->bodyptr) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08002019 sme_ibss_peer_info_response_handler(mac,
Jeff Johnson49c02f92016-10-07 10:29:09 -07002020 pMsg->bodyptr);
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08002021 qdf_mem_free(pMsg->bodyptr);
2022 } else {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002023 sme_err("Empty message for: %d", pMsg->type);
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08002024 }
2025 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002026#ifdef WLAN_FEATURE_EXTWOW_SUPPORT
2027 case eWNI_SME_READY_TO_EXTWOW_IND:
2028 if (pMsg->bodyptr) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08002029 sme_process_ready_to_ext_wow(mac, pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302030 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002031 } else {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002032 sme_err("Empty message for: %d", pMsg->type);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002033 }
2034 break;
2035#endif
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002036#ifdef FEATURE_WLAN_AUTO_SHUTDOWN
2037 case eWNI_SME_AUTO_SHUTDOWN_IND:
Jeff Johnsoneb7bbed2019-02-17 10:34:24 -08002038 if (mac->sme.auto_shutdown_cb) {
Abhishek Singhe4a1f882017-08-10 17:59:44 +05302039 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002040 FL("Auto shutdown notification"));
Jeff Johnsoneb7bbed2019-02-17 10:34:24 -08002041 mac->sme.auto_shutdown_cb();
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002042 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002043 break;
2044#endif
2045 case eWNI_SME_DFS_RADAR_FOUND:
Arif Hussaincd151632017-02-11 16:57:19 -08002046 case eWNI_SME_DFS_CAC_COMPLETE:
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002047 case eWNI_SME_DFS_CSAIE_TX_COMPLETE_IND:
Abhishek Singh20a8e442018-09-12 15:50:44 +05302048 case eWNI_SME_CSA_RESTART_RSP:
Jeff Johnson01f2c232018-11-21 19:17:44 -08002049 status = dfs_msg_processor(mac, pMsg);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302050 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002051 break;
2052 case eWNI_SME_CHANNEL_CHANGE_RSP:
2053 if (pMsg->bodyptr) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08002054 status = sme_process_channel_change_resp(mac,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002055 pMsg->type,
2056 pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302057 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002058 } else {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002059 sme_err("Empty message for: %d", pMsg->type);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002060 }
2061 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002062 case eWNI_SME_STATS_EXT_EVENT:
Jeff Johnson01f2c232018-11-21 19:17:44 -08002063 status = sme_stats_ext_event(mac, pMsg->bodyptr);
Jeff Johnsonfdecd512018-06-10 09:18:32 -07002064 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002065 break;
Will Huang558f8082017-05-31 16:22:24 +08002066 case eWNI_SME_GET_PEER_INFO_IND:
Jeff Johnson01f2c232018-11-21 19:17:44 -08002067 if (mac->sme.pget_peer_info_ind_cb)
2068 mac->sme.pget_peer_info_ind_cb(pMsg->bodyptr,
2069 mac->sme.pget_peer_info_cb_context);
Ashish Kumar Dhanotiya443d31f2017-10-13 12:41:19 +05302070 if (pMsg->bodyptr) {
2071 peer_info_rsp = (struct sir_peer_info_resp *)
2072 (pMsg->bodyptr);
2073 peer_stats = (struct sir_peer_info *)
2074 (peer_info_rsp->info);
2075 if (peer_stats) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08002076 mac->peer_rssi = peer_stats[0].rssi;
2077 mac->peer_txrate = peer_stats[0].tx_rate;
2078 mac->peer_rxrate = peer_stats[0].rx_rate;
Ashish Kumar Dhanotiya443d31f2017-10-13 12:41:19 +05302079 }
2080 }
Will Huang558f8082017-05-31 16:22:24 +08002081 qdf_mem_free(pMsg->bodyptr);
2082 break;
2083 case eWNI_SME_GET_PEER_INFO_EXT_IND:
Jeff Johnson01f2c232018-11-21 19:17:44 -08002084 if (mac->sme.pget_peer_info_ext_ind_cb)
2085 mac->sme.pget_peer_info_ext_ind_cb(pMsg->bodyptr,
2086 mac->sme.pget_peer_info_ext_cb_context);
Will Huang558f8082017-05-31 16:22:24 +08002087 qdf_mem_free(pMsg->bodyptr);
2088 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002089 case eWNI_SME_CSA_OFFLOAD_EVENT:
2090 if (pMsg->bodyptr) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08002091 csr_scan_flush_bss_entry(mac, pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302092 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002093 }
2094 break;
Manikandan Mohandcc21ba2016-03-15 14:31:56 -07002095 case eWNI_SME_TSF_EVENT:
Jeff Johnson01f2c232018-11-21 19:17:44 -08002096 if (mac->sme.get_tsf_cb) {
2097 mac->sme.get_tsf_cb(mac->sme.get_tsf_cxt,
Manikandan Mohandcc21ba2016-03-15 14:31:56 -07002098 (struct stsf *)pMsg->bodyptr);
2099 }
2100 if (pMsg->bodyptr)
2101 qdf_mem_free(pMsg->bodyptr);
2102 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002103 case eWNI_SME_LINK_STATUS_IND:
2104 {
2105 tAniGetLinkStatus *pLinkStatus =
2106 (tAniGetLinkStatus *) pMsg->bodyptr;
2107 if (pLinkStatus) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08002108 if (mac->sme.link_status_callback)
2109 mac->sme.link_status_callback(
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002110 pLinkStatus->linkStatus,
Jeff Johnson01f2c232018-11-21 19:17:44 -08002111 mac->sme.link_status_context);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302112
Jeff Johnson01f2c232018-11-21 19:17:44 -08002113 mac->sme.link_status_callback = NULL;
2114 mac->sme.link_status_context = NULL;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302115 qdf_mem_free(pLinkStatus);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002116 }
2117 break;
2118 }
2119 case eWNI_SME_MSG_GET_TEMPERATURE_IND:
Jeff Johnson3f3ad252019-02-17 20:44:11 -08002120 if (mac->sme.temperature_cb)
2121 mac->sme.temperature_cb(pMsg->bodyval,
2122 mac->sme.temperature_cb_context);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002123 break;
2124 case eWNI_SME_SNR_IND:
2125 {
2126 tAniGetSnrReq *pSnrReq = (tAniGetSnrReq *) pMsg->bodyptr;
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302127
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002128 if (pSnrReq) {
2129 if (pSnrReq->snrCallback) {
2130 ((tCsrSnrCallback)
2131 (pSnrReq->snrCallback))
2132 (pSnrReq->snr, pSnrReq->staId,
2133 pSnrReq->pDevContext);
2134 }
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302135 qdf_mem_free(pSnrReq);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002136 }
2137 break;
2138 }
2139#ifdef FEATURE_WLAN_EXTSCAN
2140 case eWNI_SME_EXTSCAN_FULL_SCAN_RESULT_IND:
Jeff Johnson01f2c232018-11-21 19:17:44 -08002141 if (mac->sme.ext_scan_ind_cb)
2142 mac->sme.ext_scan_ind_cb(mac->hdd_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002143 eSIR_EXTSCAN_FULL_SCAN_RESULT_IND,
2144 pMsg->bodyptr);
2145 else
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002146 sme_err("callback not registered to process: %d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002147 pMsg->type);
2148
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302149 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002150 break;
2151 case eWNI_SME_EPNO_NETWORK_FOUND_IND:
Jeff Johnson01f2c232018-11-21 19:17:44 -08002152 if (mac->sme.ext_scan_ind_cb)
2153 mac->sme.ext_scan_ind_cb(mac->hdd_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002154 eSIR_EPNO_NETWORK_FOUND_IND,
2155 pMsg->bodyptr);
2156 else
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002157 sme_err("callback not registered to process: %d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002158 pMsg->type);
2159
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302160 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002161 break;
2162#endif
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002163 case eWNI_SME_SET_HW_MODE_RESP:
2164 if (pMsg->bodyptr) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08002165 status = sme_process_set_hw_mode_resp(mac,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002166 pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302167 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002168 } else {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002169 sme_err("Empty message for: %d", pMsg->type);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002170 }
2171 break;
2172 case eWNI_SME_HW_MODE_TRANS_IND:
2173 if (pMsg->bodyptr) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08002174 status = sme_process_hw_mode_trans_ind(mac,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002175 pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302176 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002177 } else {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002178 sme_err("Empty message for: %d", pMsg->type);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002179 }
2180 break;
2181 case eWNI_SME_NSS_UPDATE_RSP:
2182 if (pMsg->bodyptr) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08002183 status = sme_process_nss_update_resp(mac,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002184 pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302185 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002186 } else {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002187 sme_err("Empty message for: %d", pMsg->type);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002188 }
2189 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002190 case eWNI_SME_SET_DUAL_MAC_CFG_RESP:
2191 if (pMsg->bodyptr) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08002192 status = sme_process_dual_mac_config_resp(mac,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002193 pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302194 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002195 } else {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002196 sme_err("Empty message for: %d", pMsg->type);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002197 }
gaurank kathpaliaebe3fc82018-05-07 09:39:46 +05302198 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002199 case eWNI_SME_SET_THERMAL_LEVEL_IND:
Jeff Johnson01f2c232018-11-21 19:17:44 -08002200 if (mac->sme.set_thermal_level_cb)
2201 mac->sme.set_thermal_level_cb(mac->hdd_handle,
Jeff Johnson6aaaa992018-06-30 10:43:04 -07002202 pMsg->bodyval);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002203 break;
Abhishek Singh518323d2015-10-19 17:42:01 +05302204 case eWNI_SME_EXT_CHANGE_CHANNEL_IND:
Jeff Johnson01f2c232018-11-21 19:17:44 -08002205 status = sme_extended_change_channel_ind(mac, pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302206 qdf_mem_free(pMsg->bodyptr);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302207 break;
Archana Ramachandrana20ef812015-11-13 16:12:13 -08002208 case eWNI_SME_SET_ANTENNA_MODE_RESP:
2209 if (pMsg->bodyptr) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08002210 status = sme_process_antenna_mode_resp(mac,
Archana Ramachandrana20ef812015-11-13 16:12:13 -08002211 pMsg->bodyptr);
2212 qdf_mem_free(pMsg->bodyptr);
2213 } else {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002214 sme_err("Empty message for: %d", pMsg->type);
Archana Ramachandrana20ef812015-11-13 16:12:13 -08002215 }
2216 break;
Sreelakshmi Konamki58c72432016-11-09 17:06:44 +05302217 case eWNI_SME_LOST_LINK_INFO_IND:
Jeff Johnson01f2c232018-11-21 19:17:44 -08002218 if (mac->sme.lost_link_info_cb)
2219 mac->sme.lost_link_info_cb(mac->hdd_handle,
Sreelakshmi Konamki58c72432016-11-09 17:06:44 +05302220 (struct sir_lost_link_info *)pMsg->bodyptr);
2221 qdf_mem_free(pMsg->bodyptr);
2222 break;
Sreelakshmi Konamki88a2a412017-04-14 15:11:55 +05302223 case eWNI_SME_RSO_CMD_STATUS_IND:
Jeff Johnson01f2c232018-11-21 19:17:44 -08002224 if (mac->sme.rso_cmd_status_cb)
2225 mac->sme.rso_cmd_status_cb(mac->hdd_handle,
Jeff Johnson6aaaa992018-06-30 10:43:04 -07002226 pMsg->bodyptr);
lifeng66831662017-05-19 16:01:35 +08002227 qdf_mem_free(pMsg->bodyptr);
2228 break;
Zhang Qiana6e9c102016-12-22 16:47:24 +08002229 case eWMI_SME_LL_STATS_IND:
Jeff Johnson01f2c232018-11-21 19:17:44 -08002230 if (mac->sme.link_layer_stats_ext_cb)
2231 mac->sme.link_layer_stats_ext_cb(mac->hdd_handle,
Zhang Qiana6e9c102016-12-22 16:47:24 +08002232 pMsg->bodyptr);
Sreelakshmi Konamki88a2a412017-04-14 15:11:55 +05302233 qdf_mem_free(pMsg->bodyptr);
2234 break;
Vidyullatha Kanchanapallybe0ebb32017-03-23 14:36:21 +05302235 case eWNI_SME_BT_ACTIVITY_INFO_IND:
Jeff Johnson01f2c232018-11-21 19:17:44 -08002236 if (mac->sme.bt_activity_info_cb)
2237 mac->sme.bt_activity_info_cb(mac->hdd_handle,
Vidyullatha Kanchanapallybe0ebb32017-03-23 14:36:21 +05302238 pMsg->bodyval);
2239 break;
Abhinav Kumar338e57d2019-02-04 17:30:10 +05302240 case eWNI_SME_HIDDEN_SSID_RESTART_RSP:
2241 if (mac->sme.hidden_ssid_cb)
2242 mac->sme.hidden_ssid_cb(mac->hdd_handle, pMsg->bodyval);
2243 else
2244 sme_err("callback is NULL");
2245 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002246 default:
2247
2248 if ((pMsg->type >= eWNI_SME_MSG_TYPES_BEGIN)
2249 && (pMsg->type <= eWNI_SME_MSG_TYPES_END)) {
2250 /* CSR */
2251 if (pMsg->bodyptr) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08002252 status = csr_msg_processor(mac, pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302253 qdf_mem_free(pMsg->bodyptr);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302254 } else
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002255 sme_err("Empty message for: %d", pMsg->type);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002256 } else {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002257 sme_warn("Unknown message type: %d", pMsg->type);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002258 if (pMsg->bodyptr)
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302259 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002260 }
2261 } /* switch */
2262release_lock:
Jeff Johnson01f2c232018-11-21 19:17:44 -08002263 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002264 return status;
2265}
2266
Krunal Sonid32c6bc2016-10-18 18:00:21 -07002267QDF_STATUS sme_mc_process_handler(struct scheduler_msg *msg)
2268{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08002269 struct mac_context *mac_ctx = cds_get_context(QDF_MODULE_ID_SME);
Krunal Sonid32c6bc2016-10-18 18:00:21 -07002270
2271 if (mac_ctx == NULL) {
2272 QDF_ASSERT(0);
2273 return QDF_STATUS_E_FAILURE;
2274 }
2275
Jeff Johnson5f9ce2d2018-06-09 21:20:45 -07002276 return sme_process_msg(mac_ctx, msg);
Krunal Sonid32c6bc2016-10-18 18:00:21 -07002277}
Krunal Sonid32c6bc2016-10-18 18:00:21 -07002278
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002279/**
2280 * sme_process_nss_update_resp() - Process nss update response
2281 * @mac: Global MAC pointer
2282 * @msg: nss update response
2283 *
2284 * Processes the nss update response and invokes the HDD
2285 * callback to process further
2286 */
Jeff Johnson0a8786a2018-12-02 10:49:01 -08002287static QDF_STATUS sme_process_nss_update_resp(struct mac_context *mac, uint8_t *msg)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002288{
2289 tListElem *entry = NULL;
2290 tSmeCmd *command = NULL;
2291 bool found;
Tushnim Bhattacharyyaeab33dd2017-11-15 15:20:02 -08002292 policy_mgr_nss_update_cback callback = NULL;
Abhishek Singhfc740be2018-10-12 11:34:26 +05302293 struct sir_bcn_update_rsp *param;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002294
Abhishek Singhfc740be2018-10-12 11:34:26 +05302295 param = (struct sir_bcn_update_rsp *)msg;
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302296 if (!param)
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002297 sme_err("nss update resp param is NULL");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002298 /* Not returning. Need to check if active command list
2299 * needs to be freed
2300 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002301
Abhishek Singhfc740be2018-10-12 11:34:26 +05302302 if (param && param->reason != REASON_NSS_UPDATE) {
2303 sme_err("reason not NSS update");
2304 return QDF_STATUS_E_INVAL;
2305 }
Krunal Sonia8270f52017-02-23 19:51:25 -08002306 entry = csr_nonscan_active_ll_peek_head(mac, LL_ACCESS_LOCK);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002307 if (!entry) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002308 sme_err("No cmd found in active list");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302309 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002310 }
2311
2312 command = GET_BASE_ADDR(entry, tSmeCmd, Link);
2313 if (!command) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002314 sme_err("Base address is NULL");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302315 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002316 }
2317
2318 if (e_sme_command_nss_update != command->command) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002319 sme_err("Command mismatch!");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302320 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002321 }
2322
2323 callback = command->u.nss_update_cmd.nss_update_cb;
2324 if (callback) {
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302325 if (!param)
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002326 sme_err("Callback failed since nss update params is NULL");
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302327 else
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002328 callback(command->u.nss_update_cmd.context,
Abhishek Singhfc740be2018-10-12 11:34:26 +05302329 param->status,
2330 param->vdev_id,
Chandrasekaran, Manishekarce2172e2016-02-18 16:12:43 +05302331 command->u.nss_update_cmd.next_action,
Liangwei Dong1ba99482018-10-19 02:57:29 -04002332 command->u.nss_update_cmd.reason,
2333 command->u.nss_update_cmd.original_vdev_id);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002334 } else {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002335 sme_err("Callback does not exisit");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002336 }
2337
Krunal Soni72dba662017-02-15 20:13:17 -08002338 found = csr_nonscan_active_ll_remove_entry(mac, entry, LL_ACCESS_LOCK);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002339 if (found) {
2340 /* Now put this command back on the avilable command list */
Krunal Soni78618d92017-02-14 21:46:31 -08002341 csr_release_command(mac, command);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002342 }
Krunal Sonia8270f52017-02-23 19:51:25 -08002343
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302344 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002345}
2346
Jeff Johnson62cd6802018-07-20 12:38:25 -07002347QDF_STATUS sme_stop(mac_handle_t mac_handle)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002348{
Jeff Johnson62cd6802018-07-20 12:38:25 -07002349 QDF_STATUS status;
2350 QDF_STATUS ret_status = QDF_STATUS_SUCCESS;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08002351 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002352
Jeff Johnson62cd6802018-07-20 12:38:25 -07002353 status = rrm_stop(mac);
2354 if (QDF_IS_STATUS_ERROR(status)) {
2355 ret_status = status;
Sandeep Puligilla66d09c42017-09-06 17:10:27 -07002356 sme_err("rrm_stop failed with status: %d", status);
2357 }
2358
Jeff Johnson62cd6802018-07-20 12:38:25 -07002359 status = csr_stop(mac);
2360 if (QDF_IS_STATUS_ERROR(status)) {
2361 ret_status = status;
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002362 sme_err("csr_stop failed with status: %d", status);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002363 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002364
Jeff Johnson62cd6802018-07-20 12:38:25 -07002365 mac->sme.state = SME_STATE_STOP;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002366
Jeff Johnson62cd6802018-07-20 12:38:25 -07002367 return ret_status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002368}
2369
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302370/*
2371 * sme_close() - Release all SME modules and their resources.
2372 * The function release each module in SME, PMC, CSR, etc. . Upon
2373 * return, all modules are at closed state.
2374 *
2375 * No SME APIs can be involved after smeClose except smeOpen.
2376 * smeClose must be called before mac_close.
2377 * This is a synchronous call
2378 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08002379 * mac_handle - The handle returned by mac_open
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302380 * Return QDF_STATUS_SUCCESS - SME is successfully close.
2381 *
2382 * Other status means SME is failed to be closed but caller still cannot
2383 * call any other SME functions except smeOpen.
2384 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08002385QDF_STATUS sme_close(mac_handle_t mac_handle)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002386{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302387 QDF_STATUS status = QDF_STATUS_E_FAILURE;
2388 QDF_STATUS fail_status = QDF_STATUS_SUCCESS;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08002389 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002390
Jeff Johnson01f2c232018-11-21 19:17:44 -08002391 if (!mac)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302392 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002393
Jeff Johnson01f2c232018-11-21 19:17:44 -08002394 status = csr_close(mac);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302395 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002396 sme_err("csr_close failed with status: %d", status);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002397 fail_status = status;
2398 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002399#ifndef WLAN_MDM_CODE_REDUCTION_OPT
Jeff Johnson01f2c232018-11-21 19:17:44 -08002400 status = sme_qos_close(mac);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302401 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002402 sme_err("Qos close failed with status: %d", status);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002403 fail_status = status;
2404 }
2405#endif
Jeff Johnsonb460dd72018-11-08 10:26:51 -08002406 status = sme_ps_close(mac_handle);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302407 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002408 sme_err("sme_ps_close failed status: %d", status);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002409 fail_status = status;
2410 }
2411
Jeff Johnson01f2c232018-11-21 19:17:44 -08002412 status = rrm_close(mac);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302413 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002414 sme_err("RRM close failed with status: %d", status);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002415 fail_status = status;
2416 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002417
Jeff Johnson01f2c232018-11-21 19:17:44 -08002418 free_sme_cmd_list(mac);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002419
Jeff Johnson3e7a4932019-02-17 12:11:36 -08002420 status = qdf_mutex_destroy(&mac->sme.sme_global_lock);
2421 if (!QDF_IS_STATUS_SUCCESS(status))
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302422 fail_status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002423
Jeff Johnson01f2c232018-11-21 19:17:44 -08002424 mac->sme.state = SME_STATE_STOP;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002425
Jeff Johnson3e7a4932019-02-17 12:11:36 -08002426 return fail_status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002427}
2428
2429/**
Abhishek Singhc9941602016-08-09 16:06:22 +05302430 * sme_remove_bssid_from_scan_list() - wrapper to remove the bssid from
2431 * scan list
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -08002432 * @mac_handle: Opaque handle to the global MAC context.
Abhishek Singhc9941602016-08-09 16:06:22 +05302433 * @bssid: bssid to be removed
2434 *
2435 * This function remove the given bssid from scan list.
2436 *
2437 * Return: QDF status.
2438 */
Jeff Johnsonc7309062018-11-09 20:59:42 -08002439QDF_STATUS sme_remove_bssid_from_scan_list(mac_handle_t mac_handle,
2440 tSirMacAddr bssid)
Abhishek Singhc9941602016-08-09 16:06:22 +05302441{
2442 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08002443 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Abhishek Singhc9941602016-08-09 16:06:22 +05302444
2445 status = sme_acquire_global_lock(&mac_ctx->sme);
2446 if (QDF_IS_STATUS_SUCCESS(status)) {
2447 csr_remove_bssid_from_scan_list(mac_ctx, bssid);
2448 sme_release_global_lock(&mac_ctx->sme);
2449 }
2450
2451 return status;
2452}
2453
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002454
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302455/*
2456 * sme_scan_get_result
2457 * A wrapper function to request scan results from CSR.
2458 * This is a synchronous call
2459 *
2460 * pFilter - If pFilter is NULL, all cached results are returned
2461 * phResult - an object for the result.
2462 * Return QDF_STATUS
2463 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08002464QDF_STATUS sme_scan_get_result(mac_handle_t mac_handle, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002465 tCsrScanResultFilter *pFilter,
2466 tScanResultHandle *phResult)
2467{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302468 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08002469 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002470
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302471 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002472 TRACE_CODE_SME_RX_HDD_MSG_SCAN_GET_RESULTS, sessionId,
2473 0));
Jeff Johnson01f2c232018-11-21 19:17:44 -08002474 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302475 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08002476 status = csr_scan_get_result(mac, pFilter, phResult);
2477 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002478 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002479
2480 return status;
2481}
2482
Jeff Johnsonb460dd72018-11-08 10:26:51 -08002483QDF_STATUS sme_scan_get_result_for_bssid(mac_handle_t mac_handle,
Vignesh Viswanathan9dd88d32017-11-22 14:22:03 +05302484 struct qdf_mac_addr *bssid,
2485 tCsrScanResultInfo *res)
2486{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08002487 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Vignesh Viswanathan9dd88d32017-11-22 14:22:03 +05302488 QDF_STATUS status;
2489
2490 status = sme_acquire_global_lock(&mac_ctx->sme);
2491 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson1b56f6b2018-06-10 18:17:10 -07002492 status = csr_scan_get_result_for_bssid(mac_ctx, bssid, res);
Vignesh Viswanathan9dd88d32017-11-22 14:22:03 +05302493 sme_release_global_lock(&mac_ctx->sme);
2494 }
2495
2496 return status;
2497}
2498
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002499/**
Archana Ramachandran2eb7a612017-03-23 22:58:42 -07002500 * sme_get_ap_channel_from_scan() - a wrapper function to get
Srinivas Girigowda828ef232017-10-13 22:31:27 -07002501 * AP's channel id from
2502 * CSR by filtering the
2503 * result which matches
2504 * our roam profile.
Archana Ramachandran2eb7a612017-03-23 22:58:42 -07002505 * @profile: SAP profile
2506 * @ap_chnl_id: pointer to channel id of SAP. Fill the value after finding the
2507 * best ap from scan cache.
2508 *
2509 * This function is written to get AP's channel id from CSR by filtering
2510 * the result which matches our roam profile. This is a synchronous call.
2511 *
2512 * Return: QDF_STATUS.
2513 */
2514QDF_STATUS sme_get_ap_channel_from_scan(void *profile,
2515 tScanResultHandle *scan_cache,
2516 uint8_t *ap_chnl_id)
2517{
Jeff Johnson66ee8a92018-03-17 15:24:26 -07002518 return sme_get_ap_channel_from_scan_cache((struct csr_roam_profile *)
Archana Ramachandran2eb7a612017-03-23 22:58:42 -07002519 profile,
2520 scan_cache,
2521 ap_chnl_id);
2522}
2523
2524/**
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002525 * sme_get_ap_channel_from_scan_cache() - a wrapper function to get AP's
2526 * channel id from CSR by filtering the
2527 * result which matches our roam profile.
2528 * @profile: SAP adapter
2529 * @ap_chnl_id: pointer to channel id of SAP. Fill the value after finding the
2530 * best ap from scan cache.
2531 *
2532 * This function is written to get AP's channel id from CSR by filtering
2533 * the result which matches our roam profile. This is a synchronous call.
2534 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302535 * Return: QDF_STATUS.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002536 */
Archana Ramachandran2eb7a612017-03-23 22:58:42 -07002537QDF_STATUS sme_get_ap_channel_from_scan_cache(
Jeff Johnson66ee8a92018-03-17 15:24:26 -07002538 struct csr_roam_profile *profile, tScanResultHandle *scan_cache,
Archana Ramachandran2eb7a612017-03-23 22:58:42 -07002539 uint8_t *ap_chnl_id)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002540{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302541 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08002542 struct mac_context *mac_ctx = sme_get_mac_context();
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002543 tCsrScanResultFilter *scan_filter = NULL;
2544 tScanResultHandle filtered_scan_result = NULL;
2545 tSirBssDescription first_ap_profile;
2546
2547 if (NULL == mac_ctx) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302548 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002549 FL("mac_ctx is NULL"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302550 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002551 }
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302552 scan_filter = qdf_mem_malloc(sizeof(tCsrScanResultFilter));
Arif Hussain0ef77082018-10-10 16:42:53 -07002553 if (!scan_filter)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302554 return QDF_STATUS_E_FAILURE;
Arif Hussain0ef77082018-10-10 16:42:53 -07002555
hangtian127c9532019-01-12 13:29:07 +08002556 qdf_mem_zero(&first_ap_profile, sizeof(tSirBssDescription));
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302557 if (NULL == profile) {
2558 scan_filter->EncryptionType.numEntries = 1;
2559 scan_filter->EncryptionType.encryptionType[0]
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002560 = eCSR_ENCRYPT_TYPE_NONE;
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302561 } else {
2562 /* Here is the profile we need to connect to */
2563 status = csr_roam_prepare_filter_from_profile(mac_ctx,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002564 profile,
2565 scan_filter);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302566 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002567
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302568 if (QDF_STATUS_SUCCESS == status) {
2569 /* Save the WPS info */
2570 if (NULL != profile) {
2571 scan_filter->bWPSAssociation =
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002572 profile->bWPSAssociation;
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302573 scan_filter->bOSENAssociation =
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002574 profile->bOSENAssociation;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002575 } else {
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302576 scan_filter->bWPSAssociation = 0;
2577 scan_filter->bOSENAssociation = 0;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002578 }
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302579 } else {
2580 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
2581 FL("Preparing the profile filter failed"));
2582 qdf_mem_free(scan_filter);
2583 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002584 }
2585 status = sme_acquire_global_lock(&mac_ctx->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302586 if (QDF_STATUS_SUCCESS == status) {
Archana Ramachandran2eb7a612017-03-23 22:58:42 -07002587 status = csr_scan_get_result(mac_ctx, scan_filter,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002588 &filtered_scan_result);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302589 if (QDF_STATUS_SUCCESS == status) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002590 csr_get_bssdescr_from_scan_handle(filtered_scan_result,
2591 &first_ap_profile);
2592 *scan_cache = filtered_scan_result;
2593 if (0 != first_ap_profile.channelId) {
2594 *ap_chnl_id = first_ap_profile.channelId;
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302595 QDF_TRACE(QDF_MODULE_ID_SME,
Abhishek Singh5d8d7332017-08-10 15:15:24 +05302596 QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002597 FL("Found best AP & its on chnl[%d]"),
2598 first_ap_profile.channelId);
2599 } else {
2600 /*
2601 * This means scan result is empty
2602 * so set the channel to zero, caller should
2603 * take of zero channel id case.
2604 */
2605 *ap_chnl_id = 0;
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302606 QDF_TRACE(QDF_MODULE_ID_SME,
2607 QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002608 FL("Scan is empty, set chnl to 0"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302609 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002610 }
2611 } else {
Sandeep Puligilla1f1e4002018-08-18 12:15:01 -07002612 sme_err("Failed to get scan get result");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302613 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002614 }
2615 csr_free_scan_filter(mac_ctx, scan_filter);
2616 sme_release_global_lock(&mac_ctx->sme);
2617 } else {
Krunal Sonif9882222016-01-22 17:16:50 -08002618 csr_free_scan_filter(mac_ctx, scan_filter);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302619 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002620 }
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302621 qdf_mem_free(scan_filter);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002622 return status;
2623}
2624
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302625/*
2626 * sme_scan_flush_result() -
2627 * A wrapper function to request CSR to clear scan results.
2628 * This is a synchronous call
2629 *
2630 * Return QDF_STATUS
2631 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08002632QDF_STATUS sme_scan_flush_result(mac_handle_t mac_handle)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002633{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302634 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08002635 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002636
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302637 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002638 TRACE_CODE_SME_RX_HDD_MSG_SCAN_FLUSH_RESULTS,
2639 0, 0));
Jeff Johnson01f2c232018-11-21 19:17:44 -08002640 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302641 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08002642 status = csr_scan_flush_result(mac);
2643 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002644 }
2645
2646 return status;
2647}
2648
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302649/*
2650 * sme_scan_result_get_first() -
2651 * A wrapper function to request CSR to returns the first element of
2652 * scan result.
2653 * This is a synchronous call
2654 *
2655 * hScanResult - returned from csr_scan_get_result
2656 * Return tCsrScanResultInfo * - NULL if no result
2657 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08002658tCsrScanResultInfo *sme_scan_result_get_first(mac_handle_t mac_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002659 tScanResultHandle hScanResult)
2660{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302661 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08002662 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002663 tCsrScanResultInfo *pRet = NULL;
2664
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302665 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002666 TRACE_CODE_SME_RX_HDD_MSG_SCAN_RESULT_GETFIRST,
2667 NO_SESSION, 0));
Jeff Johnson01f2c232018-11-21 19:17:44 -08002668 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302669 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08002670 pRet = csr_scan_result_get_first(mac, hScanResult);
2671 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002672 }
2673
2674 return pRet;
2675}
2676
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302677/*
2678 * sme_scan_result_get_next() -
2679 * A wrapper function to request CSR to returns the next element of
2680 * scan result. It can be called without calling csr_scan_result_get_first first
2681 * This is a synchronous call
2682 *
2683 * hScanResult - returned from csr_scan_get_result
2684 * Return Null if no result or reach the end
2685 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08002686tCsrScanResultInfo *sme_scan_result_get_next(mac_handle_t mac_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002687 tScanResultHandle hScanResult)
2688{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302689 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08002690 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002691 tCsrScanResultInfo *pRet = NULL;
2692
Jeff Johnson01f2c232018-11-21 19:17:44 -08002693 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302694 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08002695 pRet = csr_scan_result_get_next(mac, hScanResult);
2696 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002697 }
2698
2699 return pRet;
2700}
2701
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302702/*
2703 * sme_scan_result_purge() -
2704 * A wrapper function to request CSR to remove all items(tCsrScanResult)
2705 * in the list and free memory for each item
2706 * This is a synchronous call
2707 *
2708 * hScanResult - returned from csr_scan_get_result. hScanResult is
2709 * considered gone by
2710 * calling this function and even before this function reutrns.
2711 * Return QDF_STATUS
2712 */
Archana Ramachandran2eb7a612017-03-23 22:58:42 -07002713QDF_STATUS sme_scan_result_purge(tScanResultHandle hScanResult)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002714{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302715 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08002716 struct mac_context *mac_ctx = sme_get_mac_context();
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002717
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302718 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002719 TRACE_CODE_SME_RX_HDD_MSG_SCAN_RESULT_PURGE,
2720 NO_SESSION, 0));
Archana Ramachandran2eb7a612017-03-23 22:58:42 -07002721 status = sme_acquire_global_lock(&mac_ctx->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302722 if (QDF_IS_STATUS_SUCCESS(status)) {
Archana Ramachandran2eb7a612017-03-23 22:58:42 -07002723 status = csr_scan_result_purge(mac_ctx, hScanResult);
2724 sme_release_global_lock(&mac_ctx->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002725 }
2726
2727 return status;
2728}
2729
Jeff Johnsonb460dd72018-11-08 10:26:51 -08002730eCsrPhyMode sme_get_phy_mode(mac_handle_t mac_handle)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002731{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08002732 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302733
Jeff Johnson01f2c232018-11-21 19:17:44 -08002734 return mac->roam.configParam.phyMode;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002735}
2736
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302737/*
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302738 * sme_roam_connect() -
2739 * A wrapper function to request CSR to inititiate an association
2740 * This is an asynchronous call.
2741 *
2742 * sessionId - the sessionId returned by sme_open_session.
2743 * pProfile - description of the network to which to connect
2744 * hBssListIn - a list of BSS descriptor to roam to. It is returned
2745 * from csr_scan_get_result
2746 * pRoamId - to get back the request ID
2747 * Return QDF_STATUS
2748 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08002749QDF_STATUS sme_roam_connect(mac_handle_t mac_handle, uint8_t sessionId,
Jeff Johnson66ee8a92018-03-17 15:24:26 -07002750 struct csr_roam_profile *pProfile,
2751 uint32_t *pRoamId)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002752{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302753 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08002754 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002755
Jeff Johnson01f2c232018-11-21 19:17:44 -08002756 if (!mac)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302757 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002758
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302759 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002760 TRACE_CODE_SME_RX_HDD_MSG_CONNECT, sessionId, 0));
Jeff Johnson01f2c232018-11-21 19:17:44 -08002761 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302762 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08002763 if (CSR_IS_SESSION_VALID(mac, sessionId)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002764 status =
Jeff Johnson01f2c232018-11-21 19:17:44 -08002765 csr_roam_connect(mac, sessionId, pProfile,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002766 pRoamId);
2767 } else {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002768 sme_err("Invalid sessionID: %d", sessionId);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302769 status = QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002770 }
Jeff Johnson01f2c232018-11-21 19:17:44 -08002771 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002772 }
2773
2774 return status;
2775}
2776
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302777/*
2778 * sme_set_phy_mode() -
2779 * Changes the PhyMode.
2780 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08002781 * mac_handle - The handle returned by mac_open.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302782 * phyMode new phyMode which is to set
2783 * Return QDF_STATUS SUCCESS.
2784 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08002785QDF_STATUS sme_set_phy_mode(mac_handle_t mac_handle, eCsrPhyMode phyMode)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002786{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08002787 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002788
Jeff Johnson01f2c232018-11-21 19:17:44 -08002789 mac->roam.configParam.phyMode = phyMode;
2790 mac->roam.configParam.uCfgDot11Mode =
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002791 csr_get_cfg_dot11_mode_from_csr_phy_mode(NULL,
Jeff Johnson01f2c232018-11-21 19:17:44 -08002792 mac->roam.configParam.phyMode,
2793 mac->roam.configParam.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302794 ProprietaryRatesEnabled);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002795
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302796 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002797}
2798
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302799/*
2800 * sme_roam_reassoc() -
2801 * A wrapper function to request CSR to inititiate a re-association
2802 *
2803 * pProfile - can be NULL to join the currently connected AP. In that
2804 * case modProfileFields should carry the modified field(s) which could trigger
2805 * reassoc
2806 * modProfileFields - fields which are part of tCsrRoamConnectedProfile
2807 * that might need modification dynamically once STA is up & running and this
2808 * could trigger a reassoc
2809 * pRoamId - to get back the request ID
2810 * Return QDF_STATUS
2811 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08002812QDF_STATUS sme_roam_reassoc(mac_handle_t mac_handle, uint8_t sessionId,
Jeff Johnson66ee8a92018-03-17 15:24:26 -07002813 struct csr_roam_profile *pProfile,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002814 tCsrRoamModifyProfileFields modProfileFields,
2815 uint32_t *pRoamId, bool fForce)
2816{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302817 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08002818 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002819
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302820 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002821 TRACE_CODE_SME_RX_HDD_ROAM_REASSOC, sessionId, 0));
Jeff Johnson01f2c232018-11-21 19:17:44 -08002822 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302823 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08002824 if (CSR_IS_SESSION_VALID(mac, sessionId)) {
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302825 if ((NULL == pProfile) && (fForce == 1))
Jeff Johnson01f2c232018-11-21 19:17:44 -08002826 status = csr_reassoc(mac, sessionId,
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302827 &modProfileFields, pRoamId,
2828 fForce);
2829 else
Jeff Johnson01f2c232018-11-21 19:17:44 -08002830 status = csr_roam_reassoc(mac, sessionId,
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302831 pProfile,
2832 modProfileFields, pRoamId);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002833 } else {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302834 status = QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002835 }
Jeff Johnson01f2c232018-11-21 19:17:44 -08002836 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002837 }
2838
2839 return status;
2840}
2841
Jeff Johnsonc7309062018-11-09 20:59:42 -08002842QDF_STATUS sme_roam_disconnect(mac_handle_t mac_handle, uint8_t session_id,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002843 eCsrRoamDisconnectReason reason)
2844{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302845 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08002846 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002847
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302848 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Varun Reddy Yeturu363809c2018-06-27 14:12:52 -07002849 TRACE_CODE_SME_RX_HDD_ROAM_DISCONNECT, session_id,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002850 reason));
Varun Reddy Yeturu363809c2018-06-27 14:12:52 -07002851 status = sme_acquire_global_lock(&mac_ctx->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302852 if (QDF_IS_STATUS_SUCCESS(status)) {
Varun Reddy Yeturu363809c2018-06-27 14:12:52 -07002853 if (CSR_IS_SESSION_VALID(mac_ctx, session_id))
2854 status = csr_roam_disconnect(mac_ctx, session_id,
2855 reason);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302856 else
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302857 status = QDF_STATUS_E_INVAL;
Varun Reddy Yeturu363809c2018-06-27 14:12:52 -07002858 sme_release_global_lock(&mac_ctx->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002859 }
2860
2861 return status;
2862}
2863
Abhishek Singhca408032016-09-13 15:26:12 +05302864/* sme_dhcp_done_ind() - send dhcp done ind
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -08002865 * @mac_handle: Opaque handle to the global MAC context
Abhishek Singhca408032016-09-13 15:26:12 +05302866 * @session_id: session id
2867 *
2868 * Return: void.
2869 */
Jeff Johnsonc7309062018-11-09 20:59:42 -08002870void sme_dhcp_done_ind(mac_handle_t mac_handle, uint8_t session_id)
Abhishek Singhca408032016-09-13 15:26:12 +05302871{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08002872 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
gaurank kathpalia14e2f912017-08-31 14:51:45 +05302873 struct csr_roam_session *session;
Abhishek Singhca408032016-09-13 15:26:12 +05302874
2875 if (!mac_ctx)
2876 return;
2877
2878 session = CSR_GET_SESSION(mac_ctx, session_id);
2879 if (!session) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002880 sme_err("Session: %d not found", session_id);
Abhishek Singhca408032016-09-13 15:26:12 +05302881 return;
2882 }
2883 session->dhcp_done = true;
2884}
2885
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302886/*
2887 * sme_roam_stop_bss() -
2888 * To stop BSS for Soft AP. This is an asynchronous API.
2889 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08002890 * mac_handle - Global structure
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302891 * sessionId - sessionId of SoftAP
2892 * Return QDF_STATUS SUCCESS Roam callback will be called to indicate
2893 * actual results
2894 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08002895QDF_STATUS sme_roam_stop_bss(mac_handle_t mac_handle, uint8_t sessionId)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002896{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302897 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08002898 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002899
Jeff Johnson01f2c232018-11-21 19:17:44 -08002900 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302901 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08002902 if (CSR_IS_SESSION_VALID(mac, sessionId))
2903 status = csr_roam_issue_stop_bss_cmd(mac, sessionId,
Himanshu Agarwal75c8d792017-12-19 18:31:04 +05302904 false);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302905 else
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302906 status = QDF_STATUS_E_INVAL;
Jeff Johnson01f2c232018-11-21 19:17:44 -08002907 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002908 }
2909
2910 return status;
2911}
2912
Deepthi Gowrib3bfefd2016-09-13 15:14:34 +05302913/**
2914 * sme_roam_disconnect_sta() - disassociate a station
Jeff Johnsonb460dd72018-11-08 10:26:51 -08002915 * @mac_handle: Global structure
Deepthi Gowrib3bfefd2016-09-13 15:14:34 +05302916 * @sessionId: SessionId of SoftAP
2917 * @p_del_sta_params: Pointer to parameters of the station to disassoc
2918 *
2919 * To disassociate a station. This is an asynchronous API.
2920 *
2921 * Return: QDF_STATUS_SUCCESS on success.Roam callback will
2922 * be called to indicate actual result.
2923 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08002924QDF_STATUS sme_roam_disconnect_sta(mac_handle_t mac_handle, uint8_t sessionId,
Jeff Johnsone6bf7192017-11-07 15:16:09 -08002925 struct csr_del_sta_params *p_del_sta_params)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002926{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302927 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08002928 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002929
Jeff Johnson01f2c232018-11-21 19:17:44 -08002930 if (NULL == mac) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302931 QDF_ASSERT(0);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002932 return status;
2933 }
2934
Jeff Johnson01f2c232018-11-21 19:17:44 -08002935 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302936 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08002937 if (CSR_IS_SESSION_VALID(mac, sessionId))
2938 status = csr_roam_issue_disassociate_sta_cmd(mac,
Deepthi Gowrib3bfefd2016-09-13 15:14:34 +05302939 sessionId, p_del_sta_params);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302940 else
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302941 status = QDF_STATUS_E_INVAL;
Jeff Johnson01f2c232018-11-21 19:17:44 -08002942 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002943 }
2944
2945 return status;
2946}
2947
2948/**
2949 * sme_roam_deauth_sta() - deauthenticate a station
Jeff Johnsonb460dd72018-11-08 10:26:51 -08002950 * @mac_handle: Global structure
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002951 * @sessionId: SessionId of SoftAP
2952 * @pDelStaParams: Pointer to parameters of the station to deauthenticate
2953 *
2954 * To disassociate a station. This is an asynchronous API.
2955 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302956 * Return: QDF_STATUS_SUCCESS on success or another QDF_STATUS error
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002957 * code on error. Roam callback will be called to indicate actual
2958 * result
2959 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08002960QDF_STATUS sme_roam_deauth_sta(mac_handle_t mac_handle, uint8_t sessionId,
Jeff Johnsone6bf7192017-11-07 15:16:09 -08002961 struct csr_del_sta_params *pDelStaParams)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002962{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302963 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08002964 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002965
Jeff Johnson01f2c232018-11-21 19:17:44 -08002966 if (NULL == mac) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302967 QDF_ASSERT(0);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002968 return status;
2969 }
2970
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302971 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Sreelakshmi Konamki6744cff2015-09-07 12:10:39 +05302972 TRACE_CODE_SME_RX_HDD_MSG_DEAUTH_STA,
2973 sessionId, pDelStaParams->reason_code));
Jeff Johnson01f2c232018-11-21 19:17:44 -08002974 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302975 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08002976 if (CSR_IS_SESSION_VALID(mac, sessionId))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002977 status =
Jeff Johnson01f2c232018-11-21 19:17:44 -08002978 csr_roam_issue_deauth_sta_cmd(mac, sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002979 pDelStaParams);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302980 else
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302981 status = QDF_STATUS_E_INVAL;
Jeff Johnson01f2c232018-11-21 19:17:44 -08002982 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002983 }
2984
2985 return status;
2986}
2987
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302988/*
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302989 * sme_roam_get_connect_profile() -
2990 * A wrapper function to request CSR to return the current connect
2991 * profile. Caller must call csr_roam_free_connect_profile after it is done
2992 * and before reuse for another csr_roam_get_connect_profile call.
2993 * This is a synchronous call.
2994 *
2995 * pProfile - pointer to a caller allocated structure
2996 * tCsrRoamConnectedProfile
2997 * eturn QDF_STATUS. Failure if not connected
2998 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08002999QDF_STATUS sme_roam_get_connect_profile(mac_handle_t mac_handle,
3000 uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003001 tCsrRoamConnectedProfile *pProfile)
3002{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303003 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08003004 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003005
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303006 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003007 TRACE_CODE_SME_RX_HDD_ROAM_GET_CONNECTPROFILE,
3008 sessionId, 0));
Jeff Johnson01f2c232018-11-21 19:17:44 -08003009 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303010 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08003011 if (CSR_IS_SESSION_VALID(mac, sessionId))
3012 status = csr_roam_get_connect_profile(mac, sessionId,
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303013 pProfile);
3014 else
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303015 status = QDF_STATUS_E_INVAL;
Jeff Johnson01f2c232018-11-21 19:17:44 -08003016 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003017 }
3018
3019 return status;
3020}
3021
Naveen Rawatdf0a7e72016-01-06 18:35:53 -08003022/**
3023 * sme_roam_free_connect_profile - a wrapper function to request CSR to free and
3024 * reinitialize the profile returned previously by csr_roam_get_connect_profile.
3025 *
3026 * @profile - pointer to a caller allocated structure tCsrRoamConnectedProfile
3027 *
3028 * Return: none
3029 */
3030void sme_roam_free_connect_profile(tCsrRoamConnectedProfile *profile)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003031{
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303032 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003033 TRACE_CODE_SME_RX_HDD_ROAM_FREE_CONNECTPROFILE,
3034 NO_SESSION, 0));
Naveen Rawatdf0a7e72016-01-06 18:35:53 -08003035 csr_roam_free_connect_profile(profile);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003036}
3037
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303038/*
3039 * sme_roam_set_pmkid_cache() -
3040 * A wrapper function to request CSR to return the PMKID candidate list
3041 * This is a synchronous call.
3042
3043 * pPMKIDCache - caller allocated buffer point to an array of
3044 * tPmkidCacheInfo
3045 * numItems - a variable that has the number of tPmkidCacheInfo
3046 * allocated when retruning, this is either the number needed
3047 * or number of items put into pPMKIDCache
3048 * update_entire_cache - this bool value specifies if the entire pmkid
3049 * cache should be overwritten or should it be
3050 * updated entry by entry.
3051 * Return QDF_STATUS - when fail, it usually means the buffer allocated is not
3052 * big enough and pNumItems has the number of
3053 * tPmkidCacheInfo.
3054 * \Note: pNumItems is a number of tPmkidCacheInfo,
3055 * not sizeof(tPmkidCacheInfo) * something
3056 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08003057QDF_STATUS sme_roam_set_pmkid_cache(mac_handle_t mac_handle, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003058 tPmkidCacheInfo *pPMKIDCache,
3059 uint32_t numItems, bool update_entire_cache)
3060{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303061 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08003062 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003063
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303064 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003065 TRACE_CODE_SME_RX_HDD_ROAM_SET_PMKIDCACHE, sessionId,
3066 numItems));
Jeff Johnson01f2c232018-11-21 19:17:44 -08003067 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303068 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08003069 if (CSR_IS_SESSION_VALID(mac, sessionId))
3070 status = csr_roam_set_pmkid_cache(mac, sessionId,
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303071 pPMKIDCache,
3072 numItems, update_entire_cache);
3073 else
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303074 status = QDF_STATUS_E_INVAL;
Jeff Johnson01f2c232018-11-21 19:17:44 -08003075 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003076 }
3077
3078 return status;
3079}
3080
Jeff Johnsonb460dd72018-11-08 10:26:51 -08003081QDF_STATUS sme_roam_del_pmkid_from_cache(mac_handle_t mac_handle,
3082 uint8_t sessionId,
Sridhar Selvarajc3684c72017-08-21 14:32:47 +05303083 tPmkidCacheInfo *pmksa,
3084 bool flush_cache)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003085{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303086 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08003087 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Sreelakshmi Konamki6744cff2015-09-07 12:10:39 +05303088
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303089 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Sreelakshmi Konamki6744cff2015-09-07 12:10:39 +05303090 TRACE_CODE_SME_RX_HDD_ROAM_DEL_PMKIDCACHE,
3091 sessionId, flush_cache));
Jeff Johnson01f2c232018-11-21 19:17:44 -08003092 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303093 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08003094 if (CSR_IS_SESSION_VALID(mac, sessionId))
3095 status = csr_roam_del_pmkid_from_cache(mac, sessionId,
Sridhar Selvarajc3684c72017-08-21 14:32:47 +05303096 pmksa, flush_cache);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303097 else
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303098 status = QDF_STATUS_E_INVAL;
Jeff Johnson01f2c232018-11-21 19:17:44 -08003099 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003100 }
3101 return status;
3102}
3103
Abhinav Kumar7830d9c2018-06-27 17:57:48 +05303104#ifdef WLAN_FEATURE_ROAM_OFFLOAD
Jeff Johnsonc7309062018-11-09 20:59:42 -08003105void sme_get_pmk_info(mac_handle_t mac_handle, uint8_t session_id,
3106 tPmkidCacheInfo *pmk_cache)
gaurank kathpalia99d06c12018-05-16 16:28:35 +05303107{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08003108 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
gaurank kathpalia99d06c12018-05-16 16:28:35 +05303109 QDF_STATUS status = sme_acquire_global_lock(&mac_ctx->sme);
3110
3111 if (QDF_IS_STATUS_SUCCESS(status)) {
3112 if (CSR_IS_SESSION_VALID(mac_ctx, session_id))
3113 csr_get_pmk_info(mac_ctx, session_id, pmk_cache);
3114 sme_release_global_lock(&mac_ctx->sme);
3115 }
3116}
Abhinav Kumar7830d9c2018-06-27 17:57:48 +05303117#endif
3118
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003119#ifdef WLAN_FEATURE_ROAM_OFFLOAD
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303120/*
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003121 * \fn sme_roam_set_psk_pmk
3122 * \brief a wrapper function to request CSR to save PSK/PMK
3123 * This is a synchronous call.
Jeff Johnsonb460dd72018-11-08 10:26:51 -08003124 * \param mac_handle - Global structure
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003125 * \param sessionId - SME sessionId
3126 * \param pPSK_PMK - pointer to an array of Psk[]/Pmk
3127 * \param pmk_len - Length could be only 16 bytes in case if LEAP
3128 * connections. Need to pass this information to
3129 * firmware.
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303130 * \return QDF_STATUS -status whether PSK/PMK is set or not
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003131 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08003132QDF_STATUS sme_roam_set_psk_pmk(mac_handle_t mac_handle, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003133 uint8_t *pPSK_PMK, size_t pmk_len)
3134{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303135 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08003136 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303137
Jeff Johnson01f2c232018-11-21 19:17:44 -08003138 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303139 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08003140 if (CSR_IS_SESSION_VALID(mac, sessionId))
3141 status = csr_roam_set_psk_pmk(mac, sessionId, pPSK_PMK,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003142 pmk_len);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303143 else
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303144 status = QDF_STATUS_E_INVAL;
Jeff Johnson01f2c232018-11-21 19:17:44 -08003145 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003146 }
3147 return status;
3148}
3149#endif
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003150
Jeff Johnsonc7309062018-11-09 20:59:42 -08003151QDF_STATUS sme_roam_get_wpa_rsn_req_ie(mac_handle_t mac_handle,
3152 uint8_t session_id,
Jeff Johnson0a078b52018-06-01 16:15:54 -07003153 uint32_t *len, uint8_t *buf)
3154{
3155 QDF_STATUS status;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08003156 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Jeff Johnson0a078b52018-06-01 16:15:54 -07003157
3158 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303159 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson0a078b52018-06-01 16:15:54 -07003160 if (CSR_IS_SESSION_VALID(mac, session_id))
3161 status = csr_roam_get_wpa_rsn_req_ie(mac, session_id,
3162 len, buf);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303163 else
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303164 status = QDF_STATUS_E_INVAL;
Jeff Johnson0a078b52018-06-01 16:15:54 -07003165 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003166 }
3167
3168 return status;
3169}
3170
Jeff Johnsonc7309062018-11-09 20:59:42 -08003171QDF_STATUS sme_roam_get_wpa_rsn_rsp_ie(mac_handle_t mac_handle,
3172 uint8_t session_id,
Jeff Johnson0a078b52018-06-01 16:15:54 -07003173 uint32_t *len, uint8_t *buf)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003174{
Jeff Johnson0a078b52018-06-01 16:15:54 -07003175 QDF_STATUS status;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08003176 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003177
Jeff Johnson0a078b52018-06-01 16:15:54 -07003178 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303179 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson0a078b52018-06-01 16:15:54 -07003180 if (CSR_IS_SESSION_VALID(mac, session_id))
3181 status = csr_roam_get_wpa_rsn_rsp_ie(mac, session_id,
3182 len, buf);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303183 else
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303184 status = QDF_STATUS_E_INVAL;
Jeff Johnson0a078b52018-06-01 16:15:54 -07003185 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003186 }
3187
3188 return status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003189}
3190
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303191/*
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303192 * sme_get_config_param() -
3193 * A wrapper function that HDD calls to get the global settings
3194 * currently maintained by CSR.
3195 * This is a synchronous call.
3196 *
3197 * pParam - caller allocated memory
3198 * Return QDF_STATUS
3199 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08003200QDF_STATUS sme_get_config_param(mac_handle_t mac_handle,
3201 tSmeConfigParams *pParam)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003202{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303203 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08003204 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003205
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303206 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003207 TRACE_CODE_SME_RX_HDD_GET_CONFIGPARAM, NO_SESSION, 0));
Jeff Johnson01f2c232018-11-21 19:17:44 -08003208 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303209 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08003210 status = csr_get_config_param(mac, &pParam->csrConfig);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303211 if (status != QDF_STATUS_SUCCESS) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07003212 sme_err("csr_get_config_param failed");
Jeff Johnson01f2c232018-11-21 19:17:44 -08003213 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003214 return status;
3215 }
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303216 qdf_mem_copy(&pParam->rrmConfig,
Jeff Johnson01f2c232018-11-21 19:17:44 -08003217 &mac->rrm.rrmSmeContext.rrmConfig,
3218 sizeof(mac->rrm.rrmSmeContext.rrmConfig));
3219 pParam->snr_monitor_enabled = mac->snr_monitor_enabled;
3220 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003221 }
3222
3223 return status;
3224}
3225
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303226/*
3227 * sme_get_modify_profile_fields() -
3228 * HDD or SME - QOS calls this function to get the current values of
3229 * connected profile fields, changing which can cause reassoc.
3230 * This function must be called after CFG is downloaded and STA is in connected
3231 * state. Also, make sure to call this function to get the current profile
3232 * fields before calling the reassoc. So that pModifyProfileFields will have
3233 * all the latest values plus the one(s) has been updated as part of reassoc
3234 * request.
3235 *
3236 * pModifyProfileFields - pointer to the connected profile fields
3237 * changing which can cause reassoc
3238 * Return QDF_STATUS
3239 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08003240QDF_STATUS sme_get_modify_profile_fields(mac_handle_t mac_handle,
3241 uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003242 tCsrRoamModifyProfileFields *
3243 pModifyProfileFields)
3244{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303245 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08003246 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003247
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303248 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003249 TRACE_CODE_SME_RX_HDD_GET_MODPROFFIELDS, sessionId,
3250 0));
Jeff Johnson01f2c232018-11-21 19:17:44 -08003251 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303252 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08003253 if (CSR_IS_SESSION_VALID(mac, sessionId))
3254 status = csr_get_modify_profile_fields(mac, sessionId,
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303255 pModifyProfileFields);
3256 else
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303257 status = QDF_STATUS_E_INVAL;
Jeff Johnson01f2c232018-11-21 19:17:44 -08003258 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003259 }
3260
3261 return status;
3262}
3263
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003264#ifdef FEATURE_OEM_DATA_SUPPORT
3265/**
3266 * sme_register_oem_data_rsp_callback() - Register a routine of
3267 * type send_oem_data_rsp_msg
Jeff Johnsonb460dd72018-11-08 10:26:51 -08003268 * @mac_handle: Handle returned by mac_open.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003269 * @callback: Callback to send response
3270 * to oem application.
3271 *
3272 * sme_oem_data_rsp_callback is used to register sme_send_oem_data_rsp_msg
3273 * callback function.
3274 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303275 * Return: QDF_STATUS.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003276 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08003277QDF_STATUS sme_register_oem_data_rsp_callback(mac_handle_t mac_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003278 sme_send_oem_data_rsp_msg callback)
3279{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303280 QDF_STATUS status = QDF_STATUS_SUCCESS;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08003281 struct mac_context *pmac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003282
Krishna Kumaar Natarajanbbbf2ef2016-08-03 14:06:26 -07003283 pmac->sme.oem_data_rsp_callback = callback;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003284
3285 return status;
3286
3287}
Arun Khandavalli4b55da72016-07-19 19:55:01 +05303288
3289/**
3290 * sme_deregister_oem_data_rsp_callback() - De-register OEM datarsp callback
Jeff Johnsonb460dd72018-11-08 10:26:51 -08003291 * @mac_handle: Handler return by mac_open
Arun Khandavalli4b55da72016-07-19 19:55:01 +05303292 * This function De-registers the OEM data response callback to SME
3293 *
3294 * Return: None
3295 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08003296void sme_deregister_oem_data_rsp_callback(mac_handle_t mac_handle)
Arun Khandavalli4b55da72016-07-19 19:55:01 +05303297{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08003298 struct mac_context *pmac;
Arun Khandavalli4b55da72016-07-19 19:55:01 +05303299
Jeff Johnsonb460dd72018-11-08 10:26:51 -08003300 if (!mac_handle) {
Arun Khandavalli4b55da72016-07-19 19:55:01 +05303301 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Jeff Johnsonb460dd72018-11-08 10:26:51 -08003302 FL("mac_handle is not valid"));
Arun Khandavalli4b55da72016-07-19 19:55:01 +05303303 return;
3304 }
Jeff Johnsona0619e42018-11-28 17:43:00 -08003305 pmac = MAC_CONTEXT(mac_handle);
Arun Khandavalli4b55da72016-07-19 19:55:01 +05303306
Krishna Kumaar Natarajanbbbf2ef2016-08-03 14:06:26 -07003307 pmac->sme.oem_data_rsp_callback = NULL;
Arun Khandavalli4b55da72016-07-19 19:55:01 +05303308}
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003309
3310/**
Krishna Kumaar Natarajan53ca2902015-12-04 14:01:46 -08003311 * sme_oem_update_capability() - update UMAC's oem related capability.
Jeff Johnsonc7309062018-11-09 20:59:42 -08003312 * @mac_handle: Handle returned by mac_open
Krishna Kumaar Natarajan53ca2902015-12-04 14:01:46 -08003313 * @oem_cap: pointer to oem_capability
3314 *
3315 * This function updates OEM capability to UMAC. Currently RTT
3316 * related capabilities are updated. More capabilities can be
3317 * added in future.
3318 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303319 * Return: QDF_STATUS
Krishna Kumaar Natarajan53ca2902015-12-04 14:01:46 -08003320 */
Jeff Johnsonc7309062018-11-09 20:59:42 -08003321QDF_STATUS sme_oem_update_capability(mac_handle_t mac_handle,
Krishna Kumaar Natarajan53ca2902015-12-04 14:01:46 -08003322 struct sme_oem_capability *cap)
3323{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303324 QDF_STATUS status = QDF_STATUS_SUCCESS;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08003325 struct mac_context *pmac = MAC_CONTEXT(mac_handle);
Krishna Kumaar Natarajan53ca2902015-12-04 14:01:46 -08003326 uint8_t *bytes;
3327
3328 bytes = pmac->rrm.rrmSmeContext.rrmConfig.rm_capability;
3329
3330 if (cap->ftm_rr)
3331 bytes[4] |= RM_CAP_FTM_RANGE_REPORT;
3332 if (cap->lci_capability)
3333 bytes[4] |= RM_CAP_CIVIC_LOC_MEASUREMENT;
3334
3335 return status;
3336}
3337
3338/**
3339 * sme_oem_get_capability() - get oem capability
Jeff Johnsonc7309062018-11-09 20:59:42 -08003340 * @mac_handle: Handle returned by mac_open
Krishna Kumaar Natarajan53ca2902015-12-04 14:01:46 -08003341 * @oem_cap: pointer to oem_capability
3342 *
3343 * This function is used to get the OEM capability from UMAC.
3344 * Currently RTT related capabilities are received. More
3345 * capabilities can be added in future.
3346 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303347 * Return: QDF_STATUS
Krishna Kumaar Natarajan53ca2902015-12-04 14:01:46 -08003348 */
Jeff Johnsonc7309062018-11-09 20:59:42 -08003349QDF_STATUS sme_oem_get_capability(mac_handle_t mac_handle,
Krishna Kumaar Natarajan53ca2902015-12-04 14:01:46 -08003350 struct sme_oem_capability *cap)
3351{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303352 QDF_STATUS status = QDF_STATUS_SUCCESS;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08003353 struct mac_context *pmac = MAC_CONTEXT(mac_handle);
Krishna Kumaar Natarajan53ca2902015-12-04 14:01:46 -08003354 uint8_t *bytes;
3355
3356 bytes = pmac->rrm.rrmSmeContext.rrmConfig.rm_capability;
3357
3358 cap->ftm_rr = bytes[4] & RM_CAP_FTM_RANGE_REPORT;
3359 cap->lci_capability = bytes[4] & RM_CAP_CIVIC_LOC_MEASUREMENT;
3360
3361 return status;
3362}
Naveen Rawat910726a2017-03-06 11:42:51 -08003363#endif
Krishna Kumaar Natarajan53ca2902015-12-04 14:01:46 -08003364
3365/**
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003366 * sme_roam_set_key() - To set encryption key.
Jeff Johnsonc7309062018-11-09 20:59:42 -08003367 * @mac_handle: mac_handle global context
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003368 * @session_id: session id
3369 * @set_key: pointer to a caller allocated object of tCsrSetContextInfo
3370 * @ptr_roam_id: Upon success return, this is the id caller can use to
3371 * identify the request in roamcallback
3372 *
3373 * This function should be called only when connected. This is an asynchronous
3374 * API.
3375 *
3376 * Return: Status of operation
3377 */
Jeff Johnsonc7309062018-11-09 20:59:42 -08003378QDF_STATUS sme_roam_set_key(mac_handle_t mac_handle, uint8_t session_id,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003379 tCsrRoamSetKey *set_key, uint32_t *ptr_roam_id)
3380{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303381 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08003382 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003383 uint32_t roam_id;
gaurank kathpalia14e2f912017-08-31 14:51:45 +05303384 struct csr_roam_session *session = NULL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003385 struct ps_global_info *ps_global_info = &mac_ctx->sme.ps_global_info;
3386
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303387 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_RX_HDD_SET_KEY,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003388 session_id, 0));
3389 if (set_key->keyLength > CSR_MAX_KEY_LEN) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07003390 sme_err("Invalid key length: %d", set_key->keyLength);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303391 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003392 }
3393 /*Once Setkey is done, we can go in BMPS */
3394 if (set_key->keyLength)
3395 ps_global_info->remain_in_power_active_till_dhcp = false;
3396
3397 status = sme_acquire_global_lock(&mac_ctx->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303398 if (!QDF_IS_STATUS_SUCCESS(status))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003399 return status;
3400
3401 roam_id = GET_NEXT_ROAM_ID(&mac_ctx->roam);
3402 if (ptr_roam_id)
3403 *ptr_roam_id = roam_id;
3404
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07003405 sme_debug("keyLength: %d", set_key->keyLength);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003406
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07003407 sme_debug("Session_id: %d roam_id: %d", session_id, roam_id);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003408 session = CSR_GET_SESSION(mac_ctx, session_id);
3409 if (!session) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07003410 sme_err("session %d not found", session_id);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003411 sme_release_global_lock(&mac_ctx->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303412 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003413 }
3414 if (CSR_IS_INFRA_AP(&session->connectedProfile)
3415 && set_key->keyDirection == eSIR_TX_DEFAULT) {
3416 if ((eCSR_ENCRYPT_TYPE_WEP40 == set_key->encType)
3417 || (eCSR_ENCRYPT_TYPE_WEP40_STATICKEY ==
3418 set_key->encType)) {
3419 session->pCurRoamProfile->negotiatedUCEncryptionType =
3420 eCSR_ENCRYPT_TYPE_WEP40_STATICKEY;
3421 }
3422 if ((eCSR_ENCRYPT_TYPE_WEP104 == set_key->encType)
3423 || (eCSR_ENCRYPT_TYPE_WEP104_STATICKEY ==
3424 set_key->encType)) {
3425 session->pCurRoamProfile->negotiatedUCEncryptionType =
3426 eCSR_ENCRYPT_TYPE_WEP104_STATICKEY;
3427 }
3428 }
3429 status = csr_roam_set_key(mac_ctx, session_id, set_key, roam_id);
3430 sme_release_global_lock(&mac_ctx->sme);
3431 return status;
3432}
3433
Masti, Narayanraddiab712a72016-08-04 11:59:11 +05303434/**
3435 * sme_roam_set_default_key_index - To set default wep key idx
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -08003436 * @mac_handle: Opaque handle to the global MAC context
Masti, Narayanraddiab712a72016-08-04 11:59:11 +05303437 * @session_id: session id
3438 * @default_idx: default wep key index
3439 *
3440 * This function prepares a message and post to WMA to set wep default
3441 * key index
3442 *
3443 * Return: Success:QDF_STATUS_SUCCESS Failure: Error value
3444 */
Jeff Johnsonc7309062018-11-09 20:59:42 -08003445QDF_STATUS sme_roam_set_default_key_index(mac_handle_t mac_handle,
3446 uint8_t session_id,
Masti, Narayanraddiab712a72016-08-04 11:59:11 +05303447 uint8_t default_idx)
3448{
Rajeev Kumar37d478b2017-04-17 16:59:28 -07003449 struct scheduler_msg msg = {0};
Masti, Narayanraddiab712a72016-08-04 11:59:11 +05303450 struct wep_update_default_key_idx *update_key;
3451
3452 update_key = qdf_mem_malloc(sizeof(*update_key));
Arif Hussain0ef77082018-10-10 16:42:53 -07003453 if (!update_key)
Masti, Narayanraddiab712a72016-08-04 11:59:11 +05303454 return QDF_STATUS_E_NOMEM;
Masti, Narayanraddiab712a72016-08-04 11:59:11 +05303455
3456 update_key->session_id = session_id;
3457 update_key->default_idx = default_idx;
3458
3459 msg.type = WMA_UPDATE_WEP_DEFAULT_KEY;
3460 msg.reserved = 0;
3461 msg.bodyptr = (void *)update_key;
3462
3463 if (QDF_STATUS_SUCCESS !=
gaurank kathpalia36b0c582018-08-28 17:45:43 +05303464 scheduler_post_message(QDF_MODULE_ID_SME,
3465 QDF_MODULE_ID_WMA,
3466 QDF_MODULE_ID_WMA, &msg)) {
Masti, Narayanraddiab712a72016-08-04 11:59:11 +05303467 qdf_mem_free(update_key);
3468 return QDF_STATUS_E_FAILURE;
3469 }
3470
3471 return QDF_STATUS_SUCCESS;
3472}
3473
3474
Jeff Johnson8bd23352017-09-26 11:39:24 -07003475/**
3476 * sme_get_rssi() - API to retrieve current RSSI
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -08003477 * @mac_handle: Opaque handle to the global MAC context
Jeff Johnson8bd23352017-09-26 11:39:24 -07003478 * @callback: SME sends back the requested stats using the callback
3479 * @staId: The station ID for which the RSSI is requested for
3480 * @bssid: The bssid of the connected session
3481 * @lastRSSI: RSSI value at time of request. In case fw cannot provide
3482 * RSSI, do not hold up but return this value.
3483 * @pContext: user context to be passed back along with the callback
3484 *
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303485 * A wrapper function that client calls to register a callback to get RSSI
3486 *
Jeff Johnson8bd23352017-09-26 11:39:24 -07003487 * Return: QDF_STATUS
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303488 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08003489QDF_STATUS sme_get_rssi(mac_handle_t mac_handle,
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303490 tCsrRssiCallback callback, uint8_t staId,
3491 struct qdf_mac_addr bssId, int8_t lastRSSI,
Jeff Johnson8bd23352017-09-26 11:39:24 -07003492 void *pContext)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003493{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303494 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08003495 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003496
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303497 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003498 TRACE_CODE_SME_RX_HDD_GET_RSSI, NO_SESSION, 0));
Jeff Johnson01f2c232018-11-21 19:17:44 -08003499 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303500 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08003501 status = csr_get_rssi(mac, callback,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003502 staId, bssId, lastRSSI,
Jeff Johnson8bd23352017-09-26 11:39:24 -07003503 pContext);
Jeff Johnson01f2c232018-11-21 19:17:44 -08003504 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003505 }
3506 return status;
3507}
3508
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303509/*
3510 * sme_get_snr() -
3511 * A wrapper function that client calls to register a callback to get SNR
3512 *
3513 * callback - SME sends back the requested stats using the callback
3514 * staId - The station ID for which the stats is requested for
3515 * pContext - user context to be passed back along with the callback
3516 * p_cds_context - cds context
3517 * \return QDF_STATUS
3518 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08003519QDF_STATUS sme_get_snr(mac_handle_t mac_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003520 tCsrSnrCallback callback,
Anurag Chouhan6d760662016-02-20 16:05:43 +05303521 uint8_t staId, struct qdf_mac_addr bssId, void *pContext)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003522{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303523 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08003524 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003525
Jeff Johnson01f2c232018-11-21 19:17:44 -08003526 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303527 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08003528 status = csr_get_snr(mac, callback, staId, bssId, pContext);
3529 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003530 }
3531 return status;
3532}
3533
Naveen Rawatfa2a1002018-05-17 16:06:37 -07003534#ifndef QCA_SUPPORT_CP_STATS
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303535/*
3536 * sme_get_statistics() -
3537 * A wrapper function that client calls to register a callback to get
3538 * different PHY level statistics from CSR.
3539 *
3540 * requesterId - different client requesting for statistics,
3541 * HDD, UMA/GAN etc
3542 * statsMask - The different category/categories of stats requester
3543 * is looking for
3544 * callback - SME sends back the requested stats using the callback
3545 * periodicity - If requester needs periodic update in millisec, 0 means
3546 * it's an one time request
3547 * cache - If requester is happy with cached stats
3548 * staId - The station ID for which the stats is requested for
3549 * pContext - user context to be passed back along with the callback
3550 * sessionId - sme session interface
3551 * Return QDF_STATUS
3552 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08003553QDF_STATUS sme_get_statistics(mac_handle_t mac_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003554 eCsrStatsRequesterType requesterId,
3555 uint32_t statsMask, tCsrStatsCallback callback,
Naveen Rawatd0ca4412017-06-16 14:19:19 -07003556 uint8_t staId, void *pContext, uint8_t sessionId)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003557{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303558 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08003559 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003560
Jeff Johnson01f2c232018-11-21 19:17:44 -08003561 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303562 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08003563 status = csr_get_statistics(mac, requesterId, statsMask,
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303564 callback, staId, pContext,
3565 sessionId);
Jeff Johnson01f2c232018-11-21 19:17:44 -08003566 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003567 }
3568
3569 return status;
3570
3571}
Naveen Rawatfa2a1002018-05-17 16:06:37 -07003572#endif
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003573
Jeff Johnsonca7a7162018-07-07 12:56:54 -07003574QDF_STATUS sme_get_link_status(mac_handle_t mac_handle,
3575 csr_link_status_callback callback,
3576 void *context, uint8_t session_id)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003577{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303578 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08003579 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Jeff Johnsonca7a7162018-07-07 12:56:54 -07003580 tAniGetLinkStatus *msg;
Rajeev Kumar37d478b2017-04-17 16:59:28 -07003581 struct scheduler_msg message = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003582
Jeff Johnsonca7a7162018-07-07 12:56:54 -07003583 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303584 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnsonca7a7162018-07-07 12:56:54 -07003585 msg = qdf_mem_malloc(sizeof(*msg));
3586 if (!msg) {
Jeff Johnsonca7a7162018-07-07 12:56:54 -07003587 sme_release_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303588 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003589 }
3590
Jeff Johnsonca7a7162018-07-07 12:56:54 -07003591 msg->msgType = WMA_LINK_STATUS_GET_REQ;
3592 msg->msgLen = sizeof(*msg);
3593 msg->sessionId = session_id;
3594 mac->sme.link_status_context = context;
3595 mac->sme.link_status_callback = callback;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003596
Rajeev Kumar8eaedf62017-01-21 11:03:13 -08003597 message.type = WMA_LINK_STATUS_GET_REQ;
Jeff Johnsonca7a7162018-07-07 12:56:54 -07003598 message.bodyptr = msg;
Rajeev Kumar8eaedf62017-01-21 11:03:13 -08003599 message.reserved = 0;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003600
gaurank kathpalia36b0c582018-08-28 17:45:43 +05303601 status = scheduler_post_message(QDF_MODULE_ID_SME,
3602 QDF_MODULE_ID_WMA,
3603 QDF_MODULE_ID_WMA, &message);
Jeff Johnsonca7a7162018-07-07 12:56:54 -07003604 if (QDF_IS_STATUS_ERROR(status)) {
3605 sme_err("post msg failed, %d", status);
3606 qdf_mem_free(msg);
3607 mac->sme.link_status_context = NULL;
3608 mac->sme.link_status_callback = NULL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003609 }
3610
Jeff Johnsonca7a7162018-07-07 12:56:54 -07003611 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003612 }
3613
3614 return status;
3615}
3616
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303617/*
3618 * sme_get_country_code() -
3619 * To return the current country code. If no country code is applied,
3620 * default country code is used to fill the buffer.
3621 * If 11d supported is turned off, an error is return and the last
3622 * applied/default country code is used.
3623 * This is a synchronous API.
3624 *
3625 * pBuf - pointer to a caller allocated buffer for returned country code.
3626 * pbLen For input, this parameter indicates how big is the buffer.
3627 * Upon return, this parameter has the number of bytes for
3628 * country. If pBuf doesn't have enough space, this function
3629 * returns fail status and this parameter contains the number
3630 * that is needed.
3631 *
3632 * Return QDF_STATUS SUCCESS.
3633 *
3634 * FAILURE or RESOURCES The API finished and failed.
3635 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08003636QDF_STATUS sme_get_country_code(mac_handle_t mac_handle, uint8_t *pBuf,
Jeff Johnson1f2dabc2018-11-07 15:33:01 -08003637 uint8_t *pbLen)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003638{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08003639 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003640
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303641 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003642 TRACE_CODE_SME_RX_HDD_GET_CNTRYCODE, NO_SESSION, 0));
3643
Jeff Johnson01f2c232018-11-21 19:17:44 -08003644 return csr_get_country_code(mac, pBuf, pbLen);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003645}
3646
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303647/*
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303648 * sme_generic_change_country_code() -
3649 * Change Country code from upperlayer during WLAN driver operation.
3650 * This is a synchronous API.
3651 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08003652 * mac_handle - The handle returned by mac_open.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303653 * pCountry New Country Code String
3654 * reg_domain regulatory domain
3655 * Return QDF_STATUS SUCCESS.
3656 * FAILURE or RESOURCES The API finished and failed.
3657 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08003658QDF_STATUS sme_generic_change_country_code(mac_handle_t mac_handle,
Amar Singhal7f1f3ec2015-10-13 17:14:08 -07003659 uint8_t *pCountry)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003660{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303661 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08003662 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Rajeev Kumar37d478b2017-04-17 16:59:28 -07003663 struct scheduler_msg msg = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003664 tAniGenericChangeCountryCodeReq *pMsg;
3665
Jeff Johnson01f2c232018-11-21 19:17:44 -08003666 if (NULL == mac) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303667 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_FATAL,
Jeff Johnson01f2c232018-11-21 19:17:44 -08003668 "%s: mac is null", __func__);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003669 return status;
3670 }
3671
Jeff Johnson01f2c232018-11-21 19:17:44 -08003672 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303673 if (QDF_IS_STATUS_SUCCESS(status)) {
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303674 pMsg = qdf_mem_malloc(sizeof(tAniGenericChangeCountryCodeReq));
Arif Hussain0ef77082018-10-10 16:42:53 -07003675 if (!pMsg) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08003676 sme_release_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303677 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003678 }
3679
3680 pMsg->msgType = eWNI_SME_GENERIC_CHANGE_COUNTRY_CODE;
3681 pMsg->msgLen =
3682 (uint16_t) sizeof(tAniGenericChangeCountryCodeReq);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303683 qdf_mem_copy(pMsg->countryCode, pCountry, 2);
Amar Singhal7f1f3ec2015-10-13 17:14:08 -07003684 pMsg->countryCode[2] = ' ';
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003685
3686 msg.type = eWNI_SME_GENERIC_CHANGE_COUNTRY_CODE;
3687 msg.bodyptr = pMsg;
3688 msg.reserved = 0;
3689
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303690 if (QDF_STATUS_SUCCESS !=
gaurank kathpalia36b0c582018-08-28 17:45:43 +05303691 scheduler_post_message(QDF_MODULE_ID_SME,
3692 QDF_MODULE_ID_SME,
3693 QDF_MODULE_ID_SME, &msg)) {
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303694 qdf_mem_free(pMsg);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303695 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003696 }
Jeff Johnson01f2c232018-11-21 19:17:44 -08003697 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003698 }
3699
3700 return status;
3701}
3702
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303703/*
3704 * sme_dhcp_start_ind() -
3705 * API to signal the FW about the DHCP Start event.
3706 *
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -08003707 * mac_handle: Opaque handle to the global MAC context.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303708 * device_mode - mode(AP,SAP etc) of the device.
3709 * macAddr - MAC address of the adapter.
3710 * sessionId - session ID.
3711 * Return QDF_STATUS SUCCESS.
3712 * FAILURE or RESOURCES The API finished and failed.
3713 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08003714QDF_STATUS sme_dhcp_start_ind(mac_handle_t mac_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003715 uint8_t device_mode,
3716 uint8_t *macAddr, uint8_t sessionId)
3717{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303718 QDF_STATUS status;
3719 QDF_STATUS qdf_status;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08003720 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Rajeev Kumar37d478b2017-04-17 16:59:28 -07003721 struct scheduler_msg message = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003722 tAniDHCPInd *pMsg;
gaurank kathpalia14e2f912017-08-31 14:51:45 +05303723 struct csr_roam_session *pSession;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003724
Jeff Johnson01f2c232018-11-21 19:17:44 -08003725 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303726 if (QDF_STATUS_SUCCESS == status) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08003727 pSession = CSR_GET_SESSION(mac, sessionId);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003728
3729 if (!pSession) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07003730 sme_err("Session: %d not found", sessionId);
Jeff Johnson01f2c232018-11-21 19:17:44 -08003731 sme_release_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303732 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003733 }
Arif Hussain3316f402016-11-10 13:08:03 -08003734 pSession->dhcp_done = false;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003735
Arif Hussain0ef77082018-10-10 16:42:53 -07003736 pMsg = qdf_mem_malloc(sizeof(tAniDHCPInd));
3737 if (!pMsg) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08003738 sme_release_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303739 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003740 }
3741 pMsg->msgType = WMA_DHCP_START_IND;
3742 pMsg->msgLen = (uint16_t) sizeof(tAniDHCPInd);
3743 pMsg->device_mode = device_mode;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303744 qdf_mem_copy(pMsg->adapterMacAddr.bytes, macAddr,
Anurag Chouhan6d760662016-02-20 16:05:43 +05303745 QDF_MAC_ADDR_SIZE);
Anurag Chouhanc5548422016-02-24 18:33:27 +05303746 qdf_copy_macaddr(&pMsg->peerMacAddr,
Srinivas Girigowda296105a2015-09-24 16:31:16 -07003747 &pSession->connectedProfile.bssid);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003748
Rajeev Kumar8eaedf62017-01-21 11:03:13 -08003749 message.type = WMA_DHCP_START_IND;
3750 message.bodyptr = pMsg;
3751 message.reserved = 0;
Sreelakshmi Konamki6a065362016-05-31 16:05:01 +05303752 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
Rajeev Kumar8eaedf62017-01-21 11:03:13 -08003753 sessionId, message.type));
gaurank kathpalia36b0c582018-08-28 17:45:43 +05303754 qdf_status = scheduler_post_message(QDF_MODULE_ID_SME,
3755 QDF_MODULE_ID_WMA,
3756 QDF_MODULE_ID_WMA,
3757 &message);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303758 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303759 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003760 "%s: Post DHCP Start MSG fail", __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303761 qdf_mem_free(pMsg);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303762 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003763 }
Jeff Johnson01f2c232018-11-21 19:17:44 -08003764 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003765 }
3766 return status;
3767}
3768
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303769/*
3770 * sme_dhcp_stop_ind() -
3771 * API to signal the FW about the DHCP complete event.
3772 *
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -08003773 * mac_handle: Opaque handle to the global MAC context.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303774 * device_mode - mode(AP, SAP etc) of the device.
3775 * macAddr - MAC address of the adapter.
3776 * sessionId - session ID.
3777 * Return QDF_STATUS SUCCESS.
3778 * FAILURE or RESOURCES The API finished and failed.
3779 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08003780QDF_STATUS sme_dhcp_stop_ind(mac_handle_t mac_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003781 uint8_t device_mode,
3782 uint8_t *macAddr, uint8_t sessionId)
3783{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303784 QDF_STATUS status;
3785 QDF_STATUS qdf_status;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08003786 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Rajeev Kumar37d478b2017-04-17 16:59:28 -07003787 struct scheduler_msg message = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003788 tAniDHCPInd *pMsg;
gaurank kathpalia14e2f912017-08-31 14:51:45 +05303789 struct csr_roam_session *pSession;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003790
Jeff Johnson01f2c232018-11-21 19:17:44 -08003791 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303792 if (QDF_STATUS_SUCCESS == status) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08003793 pSession = CSR_GET_SESSION(mac, sessionId);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003794
3795 if (!pSession) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07003796 sme_err("Session: %d not found", sessionId);
Jeff Johnson01f2c232018-11-21 19:17:44 -08003797 sme_release_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303798 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003799 }
Arif Hussain3316f402016-11-10 13:08:03 -08003800 pSession->dhcp_done = true;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003801
Arif Hussain0ef77082018-10-10 16:42:53 -07003802 pMsg = qdf_mem_malloc(sizeof(tAniDHCPInd));
3803 if (!pMsg) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08003804 sme_release_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303805 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003806 }
3807
3808 pMsg->msgType = WMA_DHCP_STOP_IND;
3809 pMsg->msgLen = (uint16_t) sizeof(tAniDHCPInd);
3810 pMsg->device_mode = device_mode;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303811 qdf_mem_copy(pMsg->adapterMacAddr.bytes, macAddr,
Anurag Chouhan6d760662016-02-20 16:05:43 +05303812 QDF_MAC_ADDR_SIZE);
Anurag Chouhanc5548422016-02-24 18:33:27 +05303813 qdf_copy_macaddr(&pMsg->peerMacAddr,
Srinivas Girigowda296105a2015-09-24 16:31:16 -07003814 &pSession->connectedProfile.bssid);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003815
Rajeev Kumar8eaedf62017-01-21 11:03:13 -08003816 message.type = WMA_DHCP_STOP_IND;
3817 message.bodyptr = pMsg;
3818 message.reserved = 0;
Sreelakshmi Konamki6a065362016-05-31 16:05:01 +05303819 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
Rajeev Kumar8eaedf62017-01-21 11:03:13 -08003820 sessionId, message.type));
gaurank kathpalia36b0c582018-08-28 17:45:43 +05303821 qdf_status = scheduler_post_message(QDF_MODULE_ID_SME,
3822 QDF_MODULE_ID_WMA,
3823 QDF_MODULE_ID_WMA,
3824 &message);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303825 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303826 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003827 "%s: Post DHCP Stop MSG fail", __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303828 qdf_mem_free(pMsg);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303829 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003830 }
3831
Jeff Johnson01f2c232018-11-21 19:17:44 -08003832 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003833 }
3834 return status;
3835}
3836
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303837/*
3838 * sme_TXFailMonitorStopInd() -
3839 * API to signal the FW to start monitoring TX failures
3840 *
3841 * Return QDF_STATUS SUCCESS.
3842 * FAILURE or RESOURCES The API finished and failed.
3843 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08003844QDF_STATUS sme_tx_fail_monitor_start_stop_ind(mac_handle_t mac_handle,
3845 uint8_t tx_fail_count,
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08003846 void *txFailIndCallback)
3847{
3848 QDF_STATUS status;
3849 QDF_STATUS qdf_status;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08003850 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Rajeev Kumar37d478b2017-04-17 16:59:28 -07003851 struct scheduler_msg message = {0};
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08003852 tAniTXFailMonitorInd *pMsg;
3853
Jeff Johnson01f2c232018-11-21 19:17:44 -08003854 status = sme_acquire_global_lock(&mac->sme);
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08003855 if (QDF_STATUS_SUCCESS == status) {
Arif Hussain0ef77082018-10-10 16:42:53 -07003856 pMsg = qdf_mem_malloc(sizeof(tAniTXFailMonitorInd));
3857 if (!pMsg) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08003858 sme_release_global_lock(&mac->sme);
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08003859 return QDF_STATUS_E_NOMEM;
3860 }
3861
3862 pMsg->msgType = WMA_TX_FAIL_MONITOR_IND;
3863 pMsg->msgLen = (uint16_t) sizeof(tAniTXFailMonitorInd);
3864
3865 /* tx_fail_count = 0 should disable the Monitoring in FW */
3866 pMsg->tx_fail_count = tx_fail_count;
3867 pMsg->txFailIndCallback = txFailIndCallback;
3868
Rajeev Kumar8eaedf62017-01-21 11:03:13 -08003869 message.type = WMA_TX_FAIL_MONITOR_IND;
3870 message.bodyptr = pMsg;
3871 message.reserved = 0;
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08003872
gaurank kathpalia36b0c582018-08-28 17:45:43 +05303873 qdf_status = scheduler_post_message(QDF_MODULE_ID_SME,
3874 QDF_MODULE_ID_WMA,
3875 QDF_MODULE_ID_WMA,
3876 &message);
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08003877 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
3878 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
3879 "%s: Post TX Fail monitor Start MSG fail",
3880 __func__);
3881 qdf_mem_free(pMsg);
3882 status = QDF_STATUS_E_FAILURE;
3883 }
Jeff Johnson01f2c232018-11-21 19:17:44 -08003884 sme_release_global_lock(&mac->sme);
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08003885 }
3886 return status;
3887}
3888
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303889/*
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303890 * sme_neighbor_report_request() -
3891 * API to request neighbor report.
3892 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08003893 * mac_handle - The handle returned by mac_open.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303894 * pRrmNeighborReq - Pointer to a caller allocated object of type
3895 * tRrmNeighborReq. Caller owns the memory and is
3896 * responsible for freeing it.
3897 * Return QDF_STATUS
3898 * QDF_STATUS_E_FAILURE - failure
3899 * QDF_STATUS_SUCCESS success
3900 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08003901QDF_STATUS sme_neighbor_report_request(
3902 mac_handle_t mac_handle,
3903 uint8_t sessionId,
3904 tpRrmNeighborReq pRrmNeighborReq,
3905 tpRrmNeighborRspCallbackInfo callbackInfo)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003906{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303907 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08003908 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303909
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303910 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003911 TRACE_CODE_SME_RX_HDD_NEIGHBOR_REPORTREQ, NO_SESSION,
3912 0));
3913
Vignesh Viswanathan694e28e2018-01-18 20:53:57 +05303914 if (pRrmNeighborReq->neighbor_report_offload) {
3915 status = csr_invoke_neighbor_report_request(sessionId,
3916 pRrmNeighborReq,
3917 false);
3918 return status;
3919 }
3920
Jeff Johnson01f2c232018-11-21 19:17:44 -08003921 if (QDF_STATUS_SUCCESS == sme_acquire_global_lock(&mac->sme)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003922 status =
Jeff Johnson01f2c232018-11-21 19:17:44 -08003923 sme_rrm_neighbor_report_request(mac, sessionId,
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303924 pRrmNeighborReq, callbackInfo);
Jeff Johnson01f2c232018-11-21 19:17:44 -08003925 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003926 }
3927
3928 return status;
3929}
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003930
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003931#ifdef FEATURE_OEM_DATA_SUPPORT
Krishna Kumaar Natarajanc5e06ac2016-06-30 16:49:19 -07003932/**
3933 * sme_oem_data_req() - send oem data request to WMA
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -08003934 * @mac_handle: Opaque handle to the global MAC context
Krishna Kumaar Natarajanc5e06ac2016-06-30 16:49:19 -07003935 * @hdd_oem_req: OEM data request from HDD
3936 *
3937 * Return: QDF_STATUS
3938 */
Jeff Johnsonc7309062018-11-09 20:59:42 -08003939QDF_STATUS sme_oem_data_req(mac_handle_t mac_handle,
3940 struct oem_data_req *hdd_oem_req)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003941{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303942 QDF_STATUS status = QDF_STATUS_SUCCESS;
Krishna Kumaar Natarajanc1fa17d2016-08-03 14:19:20 -07003943 struct oem_data_req *oem_data_req;
Krishna Kumaar Natarajanc5e06ac2016-06-30 16:49:19 -07003944 void *wma_handle;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003945
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07003946 SME_ENTER();
Krishna Kumaar Natarajanc5e06ac2016-06-30 16:49:19 -07003947 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
3948 if (!wma_handle) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07003949 sme_err("wma_handle is NULL");
Krishna Kumaar Natarajanc5e06ac2016-06-30 16:49:19 -07003950 return QDF_STATUS_E_FAILURE;
3951 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003952
Krishna Kumaar Natarajanc5e06ac2016-06-30 16:49:19 -07003953 oem_data_req = qdf_mem_malloc(sizeof(*oem_data_req));
Arif Hussain0ef77082018-10-10 16:42:53 -07003954 if (!oem_data_req)
Krishna Kumaar Natarajanc5e06ac2016-06-30 16:49:19 -07003955 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003956
Krishna Kumaar Natarajanc5e06ac2016-06-30 16:49:19 -07003957 oem_data_req->data_len = hdd_oem_req->data_len;
3958 oem_data_req->data = qdf_mem_malloc(oem_data_req->data_len);
Arif Hussain0ef77082018-10-10 16:42:53 -07003959 if (!oem_data_req->data)
Krishna Kumaar Natarajanc5e06ac2016-06-30 16:49:19 -07003960 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003961
Krishna Kumaar Natarajanc5e06ac2016-06-30 16:49:19 -07003962 qdf_mem_copy(oem_data_req->data, hdd_oem_req->data,
3963 oem_data_req->data_len);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003964
Krishna Kumaar Natarajanc5e06ac2016-06-30 16:49:19 -07003965 status = wma_start_oem_data_req(wma_handle, oem_data_req);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003966
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303967 if (!QDF_IS_STATUS_SUCCESS(status))
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07003968 sme_err("Post oem data request msg fail");
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303969 else
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07003970 sme_debug("OEM request(length: %d) sent to WMA",
3971 oem_data_req->data_len);
Krishna Kumaar Natarajanc5e06ac2016-06-30 16:49:19 -07003972
3973 if (oem_data_req->data_len)
3974 qdf_mem_free(oem_data_req->data);
3975 qdf_mem_free(oem_data_req);
3976
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07003977 SME_EXIT();
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003978 return status;
3979}
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003980#endif /*FEATURE_OEM_DATA_SUPPORT */
3981
gaurank kathpalia78af1932018-10-27 20:33:10 +05303982#define STA_NSS_CHAINS_SHIFT 0
3983#define SAP_NSS_CHAINS_SHIFT 3
3984#define P2P_GO_NSS_CHAINS_SHIFT 6
3985#define P2P_CLI_CHAINS_SHIFT 9
gaurank kathpalia651abcd2018-11-12 22:41:23 +05303986#define TDLS_NSS_CHAINS_SHIFT 12
gaurank kathpalia78af1932018-10-27 20:33:10 +05303987#define IBSS_NSS_CHAINS_SHIFT 15
3988#define P2P_DEV_NSS_CHAINS_SHIFT 18
3989#define OCB_NSS_CHAINS_SHIFT 21
3990#define NAN_NSS_CHAIN_SHIFT 24
3991#define NSS_CHAIN_MASK 0x7
3992#define GET_VDEV_NSS_CHAIN(x, y) (((x) >> (y)) & NSS_CHAIN_MASK)
3993
3994static uint8_t sme_get_nss_chain_shift(enum QDF_OPMODE device_mode)
3995{
3996 switch (device_mode) {
3997 case QDF_STA_MODE:
3998 return STA_NSS_CHAINS_SHIFT;
3999 case QDF_SAP_MODE:
4000 return SAP_NSS_CHAINS_SHIFT;
4001 case QDF_P2P_GO_MODE:
4002 return P2P_GO_NSS_CHAINS_SHIFT;
4003 case QDF_P2P_CLIENT_MODE:
4004 return P2P_CLI_CHAINS_SHIFT;
4005 case QDF_IBSS_MODE:
4006 return IBSS_NSS_CHAINS_SHIFT;
4007 case QDF_P2P_DEVICE_MODE:
4008 return P2P_DEV_NSS_CHAINS_SHIFT;
4009 case QDF_OCB_MODE:
4010 return OCB_NSS_CHAINS_SHIFT;
gaurank kathpalia651abcd2018-11-12 22:41:23 +05304011 case QDF_TDLS_MODE:
4012 return TDLS_NSS_CHAINS_SHIFT;
gaurank kathpalia78af1932018-10-27 20:33:10 +05304013
4014 default:
4015 sme_err("Device mode %d invalid", device_mode);
4016 return STA_NSS_CHAINS_SHIFT;
4017 }
4018}
4019
4020static void
gaurank kathpaliacbf12122018-11-18 14:52:11 +05304021sme_check_nss_chain_ini_param(struct wlan_mlme_nss_chains *vdev_ini_cfg,
4022 uint8_t rf_chains_supported,
4023 enum nss_chains_band_info band)
4024{
4025 vdev_ini_cfg->rx_nss[band] = QDF_MIN(vdev_ini_cfg->rx_nss[band],
4026 rf_chains_supported);
4027 vdev_ini_cfg->tx_nss[band] = QDF_MIN(vdev_ini_cfg->tx_nss[band],
4028 rf_chains_supported);
4029}
4030
4031static void
gaurank kathpalia24ed0f42018-11-13 15:37:49 +05304032sme_fill_nss_chain_params(struct mac_context *mac_ctx,
gaurank kathpalia78af1932018-10-27 20:33:10 +05304033 struct wlan_mlme_nss_chains *vdev_ini_cfg,
4034 enum QDF_OPMODE device_mode,
4035 enum nss_chains_band_info band,
4036 uint8_t rf_chains_supported)
4037{
4038 uint8_t nss_chain_shift;
4039 uint8_t max_supported_nss;
4040 struct wlan_mlme_nss_chains *nss_chains_ini_cfg =
4041 &mac_ctx->mlme_cfg->nss_chains_ini_cfg;
4042
4043 nss_chain_shift = sme_get_nss_chain_shift(device_mode);
4044 max_supported_nss = mac_ctx->mlme_cfg->vht_caps.vht_cap_info.enable2x2 ?
4045 MAX_VDEV_NSS : 1;
4046
4047 /* If the fw doesn't support two chains, num rf chains can max be 1 */
4048 vdev_ini_cfg->num_rx_chains[band] =
4049 QDF_MIN(GET_VDEV_NSS_CHAIN(
4050 nss_chains_ini_cfg->num_rx_chains[band],
4051 nss_chain_shift), rf_chains_supported);
4052
4053 vdev_ini_cfg->num_tx_chains[band] =
4054 QDF_MIN(GET_VDEV_NSS_CHAIN(
4055 nss_chains_ini_cfg->num_tx_chains[band],
4056 nss_chain_shift), rf_chains_supported);
4057
4058 /* If 2x2 mode is disabled, then max rx, tx nss can be 1 */
4059 vdev_ini_cfg->rx_nss[band] =
4060 QDF_MIN(GET_VDEV_NSS_CHAIN(
4061 nss_chains_ini_cfg->rx_nss[band],
4062 nss_chain_shift), max_supported_nss);
4063
4064 vdev_ini_cfg->tx_nss[band] =
4065 QDF_MIN(GET_VDEV_NSS_CHAIN(
4066 nss_chains_ini_cfg->tx_nss[band],
4067 nss_chain_shift), max_supported_nss);
4068
4069 vdev_ini_cfg->num_tx_chains_11a =
4070 QDF_MIN(GET_VDEV_NSS_CHAIN(
4071 nss_chains_ini_cfg->num_tx_chains_11a,
4072 nss_chain_shift), rf_chains_supported);
4073
4074 /* If the fw doesn't support two chains, num rf chains can max be 1 */
4075 vdev_ini_cfg->num_tx_chains_11b =
4076 QDF_MIN(GET_VDEV_NSS_CHAIN(
4077 nss_chains_ini_cfg->num_tx_chains_11b,
4078 nss_chain_shift), rf_chains_supported);
4079
4080 vdev_ini_cfg->num_tx_chains_11g =
4081 QDF_MIN(GET_VDEV_NSS_CHAIN(
4082 nss_chains_ini_cfg->num_tx_chains_11g,
4083 nss_chain_shift), rf_chains_supported);
4084
4085 vdev_ini_cfg->disable_rx_mrc[band] =
4086 nss_chains_ini_cfg->disable_rx_mrc[band];
4087
4088 vdev_ini_cfg->disable_tx_mrc[band] =
4089 nss_chains_ini_cfg->disable_tx_mrc[band];
gaurank kathpaliacbf12122018-11-18 14:52:11 +05304090 /*
4091 * Check whether the rx/tx nss is greater than the number of rf chains
4092 * supported by FW, if so downgrade the nss to the number of chains
4093 * supported, as higher nss cannot be supported with less chains.
4094 */
4095 sme_check_nss_chain_ini_param(vdev_ini_cfg, rf_chains_supported,
4096 band);
4097
gaurank kathpalia78af1932018-10-27 20:33:10 +05304098}
4099
4100void sme_populate_nss_chain_params(mac_handle_t mac_handle,
4101 struct wlan_mlme_nss_chains *vdev_ini_cfg,
4102 enum QDF_OPMODE device_mode,
4103 uint8_t rf_chains_supported)
4104{
gaurank kathpalia24ed0f42018-11-13 15:37:49 +05304105 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
gaurank kathpalia78af1932018-10-27 20:33:10 +05304106 enum nss_chains_band_info band;
4107
gaurank kathpaliab414bce2018-11-09 18:44:46 +05304108 for (band = NSS_CHAINS_BAND_2GHZ; band < NSS_CHAINS_BAND_MAX; band++)
gaurank kathpalia78af1932018-10-27 20:33:10 +05304109 sme_fill_nss_chain_params(mac_ctx, vdev_ini_cfg,
4110 device_mode, band,
4111 rf_chains_supported);
4112}
4113
gaurank kathpaliab414bce2018-11-09 18:44:46 +05304114void
4115sme_store_nss_chains_cfg_in_vdev(struct wlan_objmgr_vdev *vdev,
4116 struct wlan_mlme_nss_chains *vdev_ini_cfg)
4117{
4118 struct wlan_mlme_nss_chains *ini_cfg;
4119 struct wlan_mlme_nss_chains *dynamic_cfg;
4120
4121 ini_cfg = mlme_get_ini_vdev_config(vdev);
4122 dynamic_cfg = mlme_get_dynamic_vdev_config(vdev);
4123
4124 if (!ini_cfg || !dynamic_cfg) {
4125 sme_err("Nss chains ini/dynamic config NULL vdev_id %d",
4126 vdev->vdev_objmgr.vdev_id);
4127 return;
4128 }
4129
4130 *ini_cfg = *vdev_ini_cfg;
4131 *dynamic_cfg = *vdev_ini_cfg;
4132}
4133
gaurank kathpalia2b32de02018-10-24 18:31:14 +05304134static void
4135sme_populate_user_config(struct wlan_mlme_nss_chains *dynamic_cfg,
4136 struct wlan_mlme_nss_chains *user_cfg,
4137 enum nss_chains_band_info band)
4138{
4139 if (!user_cfg->num_rx_chains[band])
4140 user_cfg->num_rx_chains[band] =
4141 dynamic_cfg->num_rx_chains[band];
4142
4143 if (!user_cfg->num_tx_chains[band])
4144 user_cfg->num_tx_chains[band] =
4145 dynamic_cfg->num_tx_chains[band];
4146
4147 if (!user_cfg->rx_nss[band])
4148 user_cfg->rx_nss[band] =
4149 dynamic_cfg->rx_nss[band];
4150
4151 if (!user_cfg->tx_nss[band])
4152 user_cfg->tx_nss[band] =
4153 dynamic_cfg->tx_nss[band];
4154
4155 if (!user_cfg->num_tx_chains_11a)
4156 user_cfg->num_tx_chains_11a =
4157 dynamic_cfg->num_tx_chains_11a;
4158
4159 if (!user_cfg->num_tx_chains_11b)
4160 user_cfg->num_tx_chains_11b =
4161 dynamic_cfg->num_tx_chains_11b;
4162
4163 if (!user_cfg->num_tx_chains_11g)
4164 user_cfg->num_tx_chains_11g =
4165 dynamic_cfg->num_tx_chains_11g;
4166
4167 if (!user_cfg->disable_rx_mrc[band])
4168 user_cfg->disable_rx_mrc[band] =
4169 dynamic_cfg->disable_rx_mrc[band];
4170
4171 if (!user_cfg->disable_tx_mrc[band])
4172 user_cfg->disable_tx_mrc[band] =
4173 dynamic_cfg->disable_tx_mrc[band];
4174}
4175
4176static QDF_STATUS
4177sme_validate_from_ini_config(struct wlan_mlme_nss_chains *user_cfg,
4178 struct wlan_mlme_nss_chains *ini_cfg,
4179 enum nss_chains_band_info band)
4180{
4181 if (user_cfg->num_rx_chains[band] >
4182 ini_cfg->num_rx_chains[band])
4183 return QDF_STATUS_E_FAILURE;
4184
4185 if (user_cfg->num_tx_chains[band] >
4186 ini_cfg->num_tx_chains[band])
4187 return QDF_STATUS_E_FAILURE;
4188
4189 if (user_cfg->rx_nss[band] >
4190 ini_cfg->rx_nss[band])
4191 return QDF_STATUS_E_FAILURE;
4192
4193 if (user_cfg->tx_nss[band] >
4194 ini_cfg->tx_nss[band])
4195 return QDF_STATUS_E_FAILURE;
4196
4197 if (user_cfg->num_tx_chains_11a >
4198 ini_cfg->num_tx_chains_11a)
4199 return QDF_STATUS_E_FAILURE;
4200
4201 if (user_cfg->num_tx_chains_11b >
4202 ini_cfg->num_tx_chains_11b)
4203 return QDF_STATUS_E_FAILURE;
4204
4205 if (user_cfg->num_tx_chains_11g >
4206 ini_cfg->num_tx_chains_11g)
4207 return QDF_STATUS_E_FAILURE;
4208
4209 return QDF_STATUS_SUCCESS;
4210}
4211
4212static QDF_STATUS
4213sme_validate_user_nss_chain_params(
4214 struct wlan_mlme_nss_chains *user_cfg,
4215 enum nss_chains_band_info band)
4216{
4217 /* Reject as 2x1 modes are not supported in chains yet */
4218
4219 if (user_cfg->num_tx_chains[band] >
4220 user_cfg->num_rx_chains[band])
4221 return QDF_STATUS_E_FAILURE;
4222
4223 /* Also if mode is 2x2, we cant have chains as 1x1, or 1x2, or 2x1 */
4224
4225 if (user_cfg->tx_nss[band] >
4226 user_cfg->num_tx_chains[band])
4227 user_cfg->num_tx_chains[band] =
4228 user_cfg->tx_nss[band];
4229
4230 if (user_cfg->rx_nss[band] >
4231 user_cfg->num_rx_chains[band])
4232 user_cfg->num_rx_chains[band] =
4233 user_cfg->rx_nss[band];
4234
4235 /*
4236 * It may happen that already chains are in 1x1 mode and nss too
4237 * is in 1x1 mode, but the tx 11a/b/g chains in user config comes
4238 * as 2x1, or 1x2 which cannot support respective mode, as tx chains
4239 * for respective band have max of 1x1 only, so these cannot exceed
4240 * respective band num tx chains.
4241 */
4242
4243 if (user_cfg->num_tx_chains_11a >
gaurank kathpaliab414bce2018-11-09 18:44:46 +05304244 user_cfg->num_tx_chains[NSS_CHAINS_BAND_5GHZ])
gaurank kathpalia2b32de02018-10-24 18:31:14 +05304245 user_cfg->num_tx_chains_11a =
gaurank kathpaliab414bce2018-11-09 18:44:46 +05304246 user_cfg->num_tx_chains[NSS_CHAINS_BAND_5GHZ];
gaurank kathpalia2b32de02018-10-24 18:31:14 +05304247
4248 if (user_cfg->num_tx_chains_11b >
gaurank kathpaliab414bce2018-11-09 18:44:46 +05304249 user_cfg->num_tx_chains[NSS_CHAINS_BAND_2GHZ])
gaurank kathpalia2b32de02018-10-24 18:31:14 +05304250 user_cfg->num_tx_chains_11b =
gaurank kathpaliab414bce2018-11-09 18:44:46 +05304251 user_cfg->num_tx_chains[NSS_CHAINS_BAND_2GHZ];
gaurank kathpalia2b32de02018-10-24 18:31:14 +05304252
4253 if (user_cfg->num_tx_chains_11g >
gaurank kathpaliab414bce2018-11-09 18:44:46 +05304254 user_cfg->num_tx_chains[NSS_CHAINS_BAND_2GHZ])
gaurank kathpalia2b32de02018-10-24 18:31:14 +05304255 user_cfg->num_tx_chains_11g =
gaurank kathpaliab414bce2018-11-09 18:44:46 +05304256 user_cfg->num_tx_chains[NSS_CHAINS_BAND_2GHZ];
gaurank kathpalia2b32de02018-10-24 18:31:14 +05304257
4258 return QDF_STATUS_SUCCESS;
4259}
4260
4261static QDF_STATUS
4262sme_validate_nss_chains_config(struct wlan_objmgr_vdev *vdev,
gaurank kathpaliadb87c0d2018-10-31 16:44:00 +05304263 struct wlan_mlme_nss_chains *user_cfg,
4264 struct wlan_mlme_nss_chains *dynamic_cfg)
gaurank kathpalia2b32de02018-10-24 18:31:14 +05304265{
4266 enum nss_chains_band_info band;
4267 struct wlan_mlme_nss_chains *ini_cfg;
gaurank kathpalia2b32de02018-10-24 18:31:14 +05304268 QDF_STATUS status;
4269
4270 ini_cfg = mlme_get_ini_vdev_config(vdev);
4271 if (!ini_cfg) {
4272 sme_err("nss chain ini config NULL");
4273 return QDF_STATUS_E_FAILURE;
4274 }
gaurank kathpalia2b32de02018-10-24 18:31:14 +05304275
gaurank kathpaliab414bce2018-11-09 18:44:46 +05304276 for (band = NSS_CHAINS_BAND_2GHZ; band < NSS_CHAINS_BAND_MAX; band++) {
gaurank kathpalia2b32de02018-10-24 18:31:14 +05304277 sme_populate_user_config(dynamic_cfg,
4278 user_cfg, band);
4279 status = sme_validate_from_ini_config(user_cfg,
4280 ini_cfg,
4281 band);
4282 if (QDF_IS_STATUS_ERROR(status)) {
4283 sme_err("Validation from ini config failed");
4284 return QDF_STATUS_E_FAILURE;
4285 }
4286 status = sme_validate_user_nss_chain_params(user_cfg,
4287 band);
4288 if (QDF_IS_STATUS_ERROR(status)) {
4289 sme_err("User cfg validation failed");
4290 return QDF_STATUS_E_FAILURE;
4291 }
4292 }
4293
4294 return QDF_STATUS_SUCCESS;
4295}
4296
4297QDF_STATUS
4298sme_nss_chains_update(mac_handle_t mac_handle,
4299 struct wlan_mlme_nss_chains *user_cfg,
4300 uint8_t vdev_id)
4301{
gaurank kathpalia24ed0f42018-11-13 15:37:49 +05304302 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
gaurank kathpalia2b32de02018-10-24 18:31:14 +05304303 QDF_STATUS status;
gaurank kathpaliadb87c0d2018-10-31 16:44:00 +05304304 struct wlan_mlme_nss_chains *dynamic_cfg;
gaurank kathpalia2b32de02018-10-24 18:31:14 +05304305 struct wlan_objmgr_vdev *vdev =
4306 wlan_objmgr_get_vdev_by_id_from_psoc(mac_ctx->psoc,
4307 vdev_id,
4308 WLAN_LEGACY_SME_ID);
4309 if (!vdev) {
4310 sme_err("Got NULL vdev obj, returning");
4311 return QDF_STATUS_E_FAILURE;
4312 }
gaurank kathpaliadb87c0d2018-10-31 16:44:00 +05304313
gaurank kathpalia748c7272018-10-24 22:05:15 +05304314 status = sme_acquire_global_lock(&mac_ctx->sme);
4315 if (QDF_IS_STATUS_ERROR(status))
4316 goto release_ref;
4317
gaurank kathpaliadb87c0d2018-10-31 16:44:00 +05304318 dynamic_cfg = mlme_get_dynamic_vdev_config(vdev);
4319 if (!dynamic_cfg) {
4320 sme_err("nss chain dynamic config NULL");
4321 status = QDF_STATUS_E_FAILURE;
4322 goto release_lock;
4323 }
4324
4325 status = sme_validate_nss_chains_config(vdev, user_cfg,
4326 dynamic_cfg);
gaurank kathpalia2b32de02018-10-24 18:31:14 +05304327 if (QDF_IS_STATUS_ERROR(status))
gaurank kathpalia748c7272018-10-24 22:05:15 +05304328 goto release_lock;
gaurank kathpaliadb87c0d2018-10-31 16:44:00 +05304329
4330 if (!qdf_mem_cmp(dynamic_cfg, user_cfg,
4331 sizeof(struct wlan_mlme_nss_chains))) {
4332 sme_debug("current config same as user config");
4333 status = QDF_STATUS_SUCCESS;
4334 goto release_lock;
4335 }
gaurank kathpalia748c7272018-10-24 22:05:15 +05304336 sme_debug("User params verified, sending to fw vdev id %d", vdev_id);
gaurank kathpalia2b32de02018-10-24 18:31:14 +05304337
gaurank kathpalia748c7272018-10-24 22:05:15 +05304338 status = wma_vdev_nss_chain_params_send(vdev->vdev_objmgr.vdev_id,
4339 user_cfg);
4340 if (QDF_IS_STATUS_ERROR(status)) {
4341 sme_err("params sent failed to fw vdev id %d", vdev_id);
4342 goto release_lock;
4343 }
4344
gaurank kathpaliab414bce2018-11-09 18:44:46 +05304345 *dynamic_cfg = *user_cfg;
gaurank kathpaliadb87c0d2018-10-31 16:44:00 +05304346
gaurank kathpalia748c7272018-10-24 22:05:15 +05304347release_lock:
4348 sme_release_global_lock(&mac_ctx->sme);
4349
4350release_ref:
gaurank kathpalia2b32de02018-10-24 18:31:14 +05304351 wlan_objmgr_vdev_release_ref(vdev, WLAN_LEGACY_SME_ID);
4352 return status;
4353}
4354
Jeff Johnsonc7309062018-11-09 20:59:42 -08004355QDF_STATUS sme_open_session(mac_handle_t mac_handle,
4356 struct sme_session_params *params)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004357{
Arif Hussainee677012017-01-26 17:50:13 -08004358 QDF_STATUS status = QDF_STATUS_E_INVAL;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08004359 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Arif Hussainee677012017-01-26 17:50:13 -08004360 struct cdp_pdev *pdev;
4361 ol_txrx_peer_handle peer;
4362 uint8_t peer_id;
Krishna Kumaar Natarajanb9e1d712017-06-20 17:14:37 -07004363 void *soc = cds_get_context(QDF_MODULE_ID_SOC);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004364
Abhishek Singhe4a1f882017-08-10 17:59:44 +05304365 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_DEBUG,
Rajeev Kumar7414c8c2017-04-06 15:42:52 -07004366 "%s: type=%d, session_id %d subType=%d addr:%pM",
Krunal Soni8d184fa2017-11-20 21:52:05 -08004367 __func__, params->type_of_persona,
4368 params->sme_session_id, params->subtype_of_persona,
4369 params->self_mac_addr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004370
Arif Hussainee677012017-01-26 17:50:13 -08004371 pdev = cds_get_context(QDF_MODULE_ID_TXRX);
4372
4373 if (NULL == pdev) {
4374 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
4375 "%s: Failed to get pdev handler", __func__);
4376 return status;
4377 }
4378
Krunal Soni8d184fa2017-11-20 21:52:05 -08004379 status = sme_acquire_global_lock(&mac_ctx->sme);
Dustin Brownd28772b2017-03-17 14:16:07 -07004380 if (QDF_IS_STATUS_ERROR(status))
4381 return status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004382
Krunal Soni8d184fa2017-11-20 21:52:05 -08004383 peer = cdp_peer_find_by_addr(soc, pdev, params->self_mac_addr,
4384 &peer_id);
Arif Hussainee677012017-01-26 17:50:13 -08004385 if (peer) {
4386 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
4387 "%s: Peer=%d exist with same MAC",
4388 __func__, peer_id);
4389 status = QDF_STATUS_E_INVAL;
4390 } else {
Krunal Soni8d184fa2017-11-20 21:52:05 -08004391 status = csr_roam_open_session(mac_ctx, params);
Arif Hussainee677012017-01-26 17:50:13 -08004392 }
Krunal Soni8d184fa2017-11-20 21:52:05 -08004393 sme_release_global_lock(&mac_ctx->sme);
Dustin Brownd28772b2017-03-17 14:16:07 -07004394
4395 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_RX_HDD_OPEN_SESSION,
Krunal Soni8d184fa2017-11-20 21:52:05 -08004396 params->sme_session_id, 0));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004397
4398 return status;
4399}
4400
Jeff Johnsonc7309062018-11-09 20:59:42 -08004401QDF_STATUS sme_close_session(mac_handle_t mac_handle, uint8_t session_id)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004402{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304403 QDF_STATUS status;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08004404 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004405
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05304406 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Krunal Soni8d184fa2017-11-20 21:52:05 -08004407 TRACE_CODE_SME_RX_HDD_CLOSE_SESSION, session_id, 0));
Jeff Johnson01f2c232018-11-21 19:17:44 -08004408 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304409 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08004410 status = csr_roam_close_session(mac, session_id, false);
4411 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004412 }
4413
4414 return status;
4415}
4416
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05304417/*
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05304418 * sme_change_mcc_beacon_interval() -
4419 * To update P2P-GO beaconInterval. This function should be called after
4420 * disassociating all the station is done
4421 * This is an asynchronous API.
4422 *
4423 * @sessionId: Session Identifier
4424 * Return QDF_STATUS SUCCESS
4425 * FAILURE or RESOURCES
4426 * The API finished and failed.
4427 */
Archana Ramachandran2eb7a612017-03-23 22:58:42 -07004428QDF_STATUS sme_change_mcc_beacon_interval(uint8_t sessionId)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004429{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304430 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08004431 struct mac_context *mac_ctx = sme_get_mac_context();
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004432
Krunal Soni3fa80e22018-01-09 14:16:02 -08004433 if (!mac_ctx) {
4434 sme_err("mac_ctx is NULL");
4435 return status;
4436 }
Archana Ramachandran2eb7a612017-03-23 22:58:42 -07004437 status = sme_acquire_global_lock(&mac_ctx->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304438 if (QDF_IS_STATUS_SUCCESS(status)) {
Archana Ramachandran2eb7a612017-03-23 22:58:42 -07004439 status = csr_send_chng_mcc_beacon_interval(mac_ctx,
4440 sessionId);
4441 sme_release_global_lock(&mac_ctx->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004442 }
4443 return status;
4444}
4445
4446/**
4447 * sme_set_host_offload(): API to set the host offload feature.
Jeff Johnsonb460dd72018-11-08 10:26:51 -08004448 * @mac_handle: The handle returned by mac_open.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004449 * @sessionId: Session Identifier
4450 * @request: Pointer to the offload request.
4451 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304452 * Return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004453 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08004454QDF_STATUS sme_set_host_offload(mac_handle_t mac_handle, uint8_t sessionId,
Jeff Johnsond6fda812019-02-06 21:54:23 -08004455 struct sir_host_offload_req *request)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004456{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08004457 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304458 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004459
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05304460 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004461 TRACE_CODE_SME_RX_HDD_SET_HOSTOFFLOAD, sessionId, 0));
Jeff Johnson01f2c232018-11-21 19:17:44 -08004462 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304463 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004464#ifdef WLAN_NS_OFFLOAD
4465 if (SIR_IPV6_NS_OFFLOAD == request->offloadType) {
Jeff Johnsonb460dd72018-11-08 10:26:51 -08004466 status = sme_set_ps_ns_offload(mac_handle, request,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004467 sessionId);
4468 } else
4469#endif /* WLAN_NS_OFFLOAD */
4470 {
Jeff Johnsonb460dd72018-11-08 10:26:51 -08004471 status = sme_set_ps_host_offload(mac_handle, request,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004472 sessionId);
4473 }
Jeff Johnson01f2c232018-11-21 19:17:44 -08004474 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004475 }
4476
4477 return status;
4478}
4479
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05304480/*
4481 * sme_set_keep_alive() -
4482 * API to set the Keep Alive feature.
4483 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08004484 * mac_handle - The handle returned by mac_open.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05304485 * request - Pointer to the Keep Alive request.
4486 * Return QDF_STATUS
4487 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08004488QDF_STATUS sme_set_keep_alive(mac_handle_t mac_handle, uint8_t session_id,
Jeff Johnson562ccad2019-02-06 22:10:24 -08004489 struct keep_alive_req *request)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004490{
Jeff Johnson562ccad2019-02-06 22:10:24 -08004491 struct keep_alive_req *request_buf;
Rajeev Kumar37d478b2017-04-17 16:59:28 -07004492 struct scheduler_msg msg = {0};
Jeff Johnson0a8786a2018-12-02 10:49:01 -08004493 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Jeff Johnson01f2c232018-11-21 19:17:44 -08004494 struct csr_roam_session *pSession = CSR_GET_SESSION(mac, session_id);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004495
Abhishek Singhe4a1f882017-08-10 17:59:44 +05304496 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004497 FL("WMA_SET_KEEP_ALIVE message"));
4498
4499 if (pSession == NULL) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05304500 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004501 FL("Session not Found"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304502 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004503 }
Jeff Johnson562ccad2019-02-06 22:10:24 -08004504 request_buf = qdf_mem_malloc(sizeof(*request_buf));
Arif Hussain0ef77082018-10-10 16:42:53 -07004505 if (!request_buf)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304506 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004507
Anurag Chouhanc5548422016-02-24 18:33:27 +05304508 qdf_copy_macaddr(&request->bssid, &pSession->connectedProfile.bssid);
Jeff Johnson562ccad2019-02-06 22:10:24 -08004509 qdf_mem_copy(request_buf, request, sizeof(*request_buf));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004510
Abhishek Singhe4a1f882017-08-10 17:59:44 +05304511 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004512 "buff TP %d input TP %d ", request_buf->timePeriod,
4513 request->timePeriod);
4514 request_buf->sessionId = session_id;
4515
4516 msg.type = WMA_SET_KEEP_ALIVE;
4517 msg.reserved = 0;
4518 msg.bodyptr = request_buf;
Sreelakshmi Konamki6a065362016-05-31 16:05:01 +05304519 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
4520 session_id, msg.type));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304521 if (QDF_STATUS_SUCCESS !=
gaurank kathpalia36b0c582018-08-28 17:45:43 +05304522 scheduler_post_message(QDF_MODULE_ID_SME,
4523 QDF_MODULE_ID_WMA,
4524 QDF_MODULE_ID_WMA, &msg)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05304525 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05304526 "Not able to post WMA_SET_KEEP_ALIVE message to WMA");
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304527 qdf_mem_free(request_buf);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304528 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004529 }
4530
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304531 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004532}
4533
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05304534/*
4535 * sme_get_operation_channel() -
4536 * API to get current channel on which STA is parked his function gives
4537 * channel information only of infra station or IBSS station
4538 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08004539 * mac_handle, pointer to memory location and sessionId
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05304540 * Returns QDF_STATUS_SUCCESS
4541 * QDF_STATUS_E_FAILURE
4542 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08004543QDF_STATUS sme_get_operation_channel(mac_handle_t mac_handle,
4544 uint32_t *pChannel,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004545 uint8_t sessionId)
4546{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08004547 struct mac_context *mac = MAC_CONTEXT(mac_handle);
gaurank kathpalia14e2f912017-08-31 14:51:45 +05304548 struct csr_roam_session *pSession;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004549
Jeff Johnson01f2c232018-11-21 19:17:44 -08004550 if (CSR_IS_SESSION_VALID(mac, sessionId)) {
4551 pSession = CSR_GET_SESSION(mac, sessionId);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004552
4553 if ((pSession->connectedProfile.BSSType ==
4554 eCSR_BSS_TYPE_INFRASTRUCTURE)
4555 || (pSession->connectedProfile.BSSType ==
4556 eCSR_BSS_TYPE_IBSS)
4557 || (pSession->connectedProfile.BSSType ==
4558 eCSR_BSS_TYPE_INFRA_AP)
4559 || (pSession->connectedProfile.BSSType ==
4560 eCSR_BSS_TYPE_START_IBSS)) {
4561 *pChannel = pSession->connectedProfile.operationChannel;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304562 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004563 }
4564 }
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304565 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004566} /* sme_get_operation_channel ends here */
4567
Abhishek Singh7996eb72015-12-30 17:24:02 +05304568/**
4569 * sme_register_mgmt_frame_ind_callback() - Register a callback for
4570 * management frame indication to PE.
4571 *
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -08004572 * @mac_handle: Opaque handle to the global MAC context
Abhishek Singh7996eb72015-12-30 17:24:02 +05304573 * @callback: callback pointer to be registered
4574 *
4575 * This function is used to register a callback for management
4576 * frame indication to PE.
4577 *
4578 * Return: Success if msg is posted to PE else Failure.
4579 */
Jeff Johnsonc7309062018-11-09 20:59:42 -08004580QDF_STATUS sme_register_mgmt_frame_ind_callback(mac_handle_t mac_handle,
Abhishek Singh7996eb72015-12-30 17:24:02 +05304581 sir_mgmt_frame_ind_callback callback)
4582{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08004583 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Abhishek Singh7996eb72015-12-30 17:24:02 +05304584 struct sir_sme_mgmt_frame_cb_req *msg;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304585 QDF_STATUS status = QDF_STATUS_SUCCESS;
Abhishek Singh7996eb72015-12-30 17:24:02 +05304586
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304587 if (QDF_STATUS_SUCCESS ==
Abhishek Singh7996eb72015-12-30 17:24:02 +05304588 sme_acquire_global_lock(&mac_ctx->sme)) {
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304589 msg = qdf_mem_malloc(sizeof(*msg));
Arif Hussain0ef77082018-10-10 16:42:53 -07004590 if (!msg) {
Abhishek Singh7996eb72015-12-30 17:24:02 +05304591 sme_release_global_lock(&mac_ctx->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304592 return QDF_STATUS_E_NOMEM;
Abhishek Singh7996eb72015-12-30 17:24:02 +05304593 }
Abhishek Singh7996eb72015-12-30 17:24:02 +05304594 msg->message_type = eWNI_SME_REGISTER_MGMT_FRAME_CB;
4595 msg->length = sizeof(*msg);
4596
4597 msg->callback = callback;
Rajeev Kumard138ac52017-01-30 18:38:37 -08004598 status = umac_send_mb_message_to_mac(msg);
Abhishek Singh7996eb72015-12-30 17:24:02 +05304599 sme_release_global_lock(&mac_ctx->sme);
4600 return status;
4601 }
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304602 return QDF_STATUS_E_FAILURE;
Abhishek Singh7996eb72015-12-30 17:24:02 +05304603}
4604
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05304605/*
4606 * sme_RegisterMgtFrame() -
Jeff Johnson698eacd2018-05-12 17:00:03 -07004607 * To register management frame of specified type and subtype.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05304608 *
4609 * frameType - type of the frame that needs to be passed to HDD.
4610 * matchData - data which needs to be matched before passing frame
4611 * to HDD.
4612 * matchDataLen - Length of matched data.
4613 * Return QDF_STATUS
4614 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08004615QDF_STATUS sme_register_mgmt_frame(mac_handle_t mac_handle, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004616 uint16_t frameType, uint8_t *matchData,
4617 uint16_t matchLen)
4618{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304619 QDF_STATUS status = QDF_STATUS_SUCCESS;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08004620 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004621
Jeff Johnson01f2c232018-11-21 19:17:44 -08004622 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304623 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson78f7a182019-02-01 22:45:41 -08004624 struct register_mgmt_frame *pMsg;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004625 uint16_t len;
Jeff Johnson01f2c232018-11-21 19:17:44 -08004626 struct csr_roam_session *pSession = CSR_GET_SESSION(mac,
gaurank kathpalia14e2f912017-08-31 14:51:45 +05304627 sessionId);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004628
4629 if (!CSR_IS_SESSION_ANY(sessionId) && !pSession) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07004630 sme_err("Session %d not found", sessionId);
Jeff Johnson01f2c232018-11-21 19:17:44 -08004631 sme_release_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304632 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004633 }
4634
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05304635 if (!CSR_IS_SESSION_ANY(sessionId) &&
4636 !pSession->sessionActive) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05304637 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004638 "%s Invalid Sessionid", __func__);
Jeff Johnson01f2c232018-11-21 19:17:44 -08004639 sme_release_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304640 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004641 }
4642
Jeff Johnson78f7a182019-02-01 22:45:41 -08004643 len = sizeof(*pMsg) + matchLen;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004644
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304645 pMsg = qdf_mem_malloc(len);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004646 if (NULL == pMsg)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304647 status = QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004648 else {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004649 pMsg->messageType = eWNI_SME_REGISTER_MGMT_FRAME_REQ;
4650 pMsg->length = len;
4651 pMsg->sessionId = sessionId;
4652 pMsg->registerFrame = true;
4653 pMsg->frameType = frameType;
4654 pMsg->matchLen = matchLen;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304655 qdf_mem_copy(pMsg->matchData, matchData, matchLen);
Rajeev Kumard138ac52017-01-30 18:38:37 -08004656 status = umac_send_mb_message_to_mac(pMsg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004657 }
Jeff Johnson01f2c232018-11-21 19:17:44 -08004658 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004659 }
4660 return status;
4661}
4662
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05304663/*
4664 * sme_DeregisterMgtFrame() -
Jeff Johnson698eacd2018-05-12 17:00:03 -07004665 * To De-register management frame of specified type and subtype.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05304666 *
4667 * frameType - type of the frame that needs to be passed to HDD.
4668 * matchData - data which needs to be matched before passing frame
4669 * to HDD.
4670 * matchDataLen - Length of matched data.
4671 * Return QDF_STATUS
4672 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08004673QDF_STATUS sme_deregister_mgmt_frame(mac_handle_t mac_handle, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004674 uint16_t frameType, uint8_t *matchData,
4675 uint16_t matchLen)
4676{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304677 QDF_STATUS status = QDF_STATUS_SUCCESS;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08004678 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004679
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05304680 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004681 TRACE_CODE_SME_RX_HDD_DEREGISTER_MGMTFR, sessionId,
4682 0));
Jeff Johnson01f2c232018-11-21 19:17:44 -08004683 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304684 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson78f7a182019-02-01 22:45:41 -08004685 struct register_mgmt_frame *pMsg;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004686 uint16_t len;
Jeff Johnson01f2c232018-11-21 19:17:44 -08004687 struct csr_roam_session *pSession = CSR_GET_SESSION(mac,
gaurank kathpalia14e2f912017-08-31 14:51:45 +05304688 sessionId);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004689
4690 if (!CSR_IS_SESSION_ANY(sessionId) && !pSession) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07004691 sme_err("Session %d not found", sessionId);
Jeff Johnson01f2c232018-11-21 19:17:44 -08004692 sme_release_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304693 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004694 }
4695
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05304696 if (!CSR_IS_SESSION_ANY(sessionId) &&
4697 !pSession->sessionActive) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05304698 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004699 "%s Invalid Sessionid", __func__);
Jeff Johnson01f2c232018-11-21 19:17:44 -08004700 sme_release_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304701 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004702 }
4703
Jeff Johnson78f7a182019-02-01 22:45:41 -08004704 len = sizeof(*pMsg) + matchLen;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004705
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304706 pMsg = qdf_mem_malloc(len);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004707 if (NULL == pMsg)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304708 status = QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004709 else {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004710 pMsg->messageType = eWNI_SME_REGISTER_MGMT_FRAME_REQ;
4711 pMsg->length = len;
4712 pMsg->registerFrame = false;
4713 pMsg->frameType = frameType;
4714 pMsg->matchLen = matchLen;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304715 qdf_mem_copy(pMsg->matchData, matchData, matchLen);
Rajeev Kumard138ac52017-01-30 18:38:37 -08004716 status = umac_send_mb_message_to_mac(pMsg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004717 }
Jeff Johnson01f2c232018-11-21 19:17:44 -08004718 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004719 }
4720 return status;
4721}
4722
Padma, Santhosh Kumar22c462c2018-01-16 17:56:44 +05304723/**
4724 * sme_prepare_mgmt_tx() - Prepares mgmt frame
Jeff Johnsonc7309062018-11-09 20:59:42 -08004725 * @mac_handle: The handle returned by mac_open
Padma, Santhosh Kumar22c462c2018-01-16 17:56:44 +05304726 * @session_id: session id
4727 * @buf: pointer to frame
4728 * @len: frame length
4729 *
4730 * Return: QDF_STATUS
4731 */
Jeff Johnsonc7309062018-11-09 20:59:42 -08004732static QDF_STATUS sme_prepare_mgmt_tx(mac_handle_t mac_handle,
4733 uint8_t session_id,
4734 const uint8_t *buf, uint32_t len)
Padma, Santhosh Kumar22c462c2018-01-16 17:56:44 +05304735{
4736 QDF_STATUS status = QDF_STATUS_SUCCESS;
4737 struct sir_mgmt_msg *msg;
4738 uint16_t msg_len;
4739 struct scheduler_msg sch_msg = {0};
4740
4741 sme_debug("prepares auth frame");
4742
4743 msg_len = sizeof(*msg) + len;
4744 msg = qdf_mem_malloc(msg_len);
4745 if (msg == NULL) {
4746 status = QDF_STATUS_E_NOMEM;
4747 } else {
4748 msg->type = eWNI_SME_SEND_MGMT_FRAME_TX;
4749 msg->msg_len = msg_len;
4750 msg->session_id = session_id;
4751 msg->data = (uint8_t *)msg + sizeof(*msg);
4752 qdf_mem_copy(msg->data, buf, len);
4753
4754 sch_msg.type = eWNI_SME_SEND_MGMT_FRAME_TX;
4755 sch_msg.bodyptr = msg;
gaurank kathpalia36b0c582018-08-28 17:45:43 +05304756 status = scheduler_post_message(QDF_MODULE_ID_SME,
4757 QDF_MODULE_ID_PE,
4758 QDF_MODULE_ID_PE, &sch_msg);
Padma, Santhosh Kumar22c462c2018-01-16 17:56:44 +05304759 }
4760 return status;
4761}
4762
Jeff Johnsonc7309062018-11-09 20:59:42 -08004763QDF_STATUS sme_send_mgmt_tx(mac_handle_t mac_handle, uint8_t session_id,
4764 const uint8_t *buf, uint32_t len)
Padma, Santhosh Kumar22c462c2018-01-16 17:56:44 +05304765{
4766 QDF_STATUS status = QDF_STATUS_SUCCESS;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08004767 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Padma, Santhosh Kumar22c462c2018-01-16 17:56:44 +05304768
Padma, Santhosh Kumar22c462c2018-01-16 17:56:44 +05304769 status = sme_acquire_global_lock(&mac->sme);
4770 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnsonc7309062018-11-09 20:59:42 -08004771 status = sme_prepare_mgmt_tx(mac_handle, session_id, buf, len);
Padma, Santhosh Kumar22c462c2018-01-16 17:56:44 +05304772 sme_release_global_lock(&mac->sme);
4773 }
4774
4775 return status;
4776}
4777
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004778#ifdef WLAN_FEATURE_EXTWOW_SUPPORT
Krishna Kumaar Natarajand9131902015-10-19 11:52:47 -07004779/**
4780 * sme_configure_ext_wow() - configure Extr WoW
Jeff Johnsonb460dd72018-11-08 10:26:51 -08004781 * @mac_handle - The handle returned by mac_open.
Krishna Kumaar Natarajand9131902015-10-19 11:52:47 -07004782 * @wlanExtParams - Depicts the wlan Ext params.
4783 * @callback - ext_wow callback to be registered.
4784 * @callback_context - ext_wow callback context
4785 *
4786 * SME will pass this request to lower mac to configure Extr WoW
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304787 * Return: QDF_STATUS
Krishna Kumaar Natarajand9131902015-10-19 11:52:47 -07004788 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08004789QDF_STATUS sme_configure_ext_wow(mac_handle_t mac_handle,
4790 tpSirExtWoWParams wlanExtParams,
4791 csr_readyToExtWoWCallback callback,
4792 void *callback_context)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004793{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304794 QDF_STATUS status = QDF_STATUS_SUCCESS;
4795 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08004796 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Rajeev Kumar37d478b2017-04-17 16:59:28 -07004797 struct scheduler_msg message = {0};
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304798 tpSirExtWoWParams MsgPtr = qdf_mem_malloc(sizeof(*MsgPtr));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004799
4800 if (!MsgPtr)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304801 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004802
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05304803 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004804 TRACE_CODE_SME_RX_HDD_CONFIG_EXTWOW, NO_SESSION, 0));
4805
Jeff Johnson01f2c232018-11-21 19:17:44 -08004806 mac->readyToExtWoWCallback = callback;
4807 mac->readyToExtWoWContext = callback_context;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004808
Jeff Johnson01f2c232018-11-21 19:17:44 -08004809 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304810 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004811
4812 /* serialize the req through MC thread */
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304813 qdf_mem_copy(MsgPtr, wlanExtParams, sizeof(*MsgPtr));
Rajeev Kumar8eaedf62017-01-21 11:03:13 -08004814 message.bodyptr = MsgPtr;
4815 message.type = WMA_WLAN_EXT_WOW;
gaurank kathpalia36b0c582018-08-28 17:45:43 +05304816 qdf_status = scheduler_post_message(QDF_MODULE_ID_SME,
4817 QDF_MODULE_ID_WMA,
4818 QDF_MODULE_ID_WMA,
4819 &message);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304820 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08004821 mac->readyToExtWoWCallback = NULL;
4822 mac->readyToExtWoWContext = NULL;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304823 qdf_mem_free(MsgPtr);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304824 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004825 }
Jeff Johnson01f2c232018-11-21 19:17:44 -08004826 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004827 } else {
Jeff Johnson01f2c232018-11-21 19:17:44 -08004828 mac->readyToExtWoWCallback = NULL;
4829 mac->readyToExtWoWContext = NULL;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304830 qdf_mem_free(MsgPtr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004831 }
4832
4833 return status;
4834}
4835
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05304836/*
4837 * sme_configure_app_type1_params() -
4838 * SME will pass this request to lower mac to configure Indoor WoW parameters.
4839 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08004840 * mac_handle - The handle returned by mac_open.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05304841 * wlanAppType1Params- Depicts the wlan App Type 1(Indoor) params
4842 * Return QDF_STATUS
4843 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08004844QDF_STATUS sme_configure_app_type1_params(mac_handle_t mac_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004845 tpSirAppType1Params wlanAppType1Params)
4846{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304847 QDF_STATUS status = QDF_STATUS_SUCCESS;
4848 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08004849 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Rajeev Kumar37d478b2017-04-17 16:59:28 -07004850 struct scheduler_msg message = {0};
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304851 tpSirAppType1Params MsgPtr = qdf_mem_malloc(sizeof(*MsgPtr));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004852
4853 if (!MsgPtr)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304854 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004855
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05304856 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004857 TRACE_CODE_SME_RX_HDD_CONFIG_APP_TYPE1, NO_SESSION,
4858 0));
4859
Jeff Johnson01f2c232018-11-21 19:17:44 -08004860 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304861 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004862 /* serialize the req through MC thread */
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304863 qdf_mem_copy(MsgPtr, wlanAppType1Params, sizeof(*MsgPtr));
Rajeev Kumar8eaedf62017-01-21 11:03:13 -08004864 message.bodyptr = MsgPtr;
4865 message.type = WMA_WLAN_SET_APP_TYPE1_PARAMS;
gaurank kathpalia36b0c582018-08-28 17:45:43 +05304866 qdf_status = scheduler_post_message(QDF_MODULE_ID_SME,
4867 QDF_MODULE_ID_WMA,
4868 QDF_MODULE_ID_WMA,
4869 &message);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304870 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304871 qdf_mem_free(MsgPtr);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304872 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004873 }
Jeff Johnson01f2c232018-11-21 19:17:44 -08004874 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004875 } else {
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304876 qdf_mem_free(MsgPtr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004877 }
4878
4879 return status;
4880}
4881
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05304882/*
4883 * sme_configure_app_type2_params() -
4884 * SME will pass this request to lower mac to configure Indoor WoW parameters.
4885 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08004886 * mac_handle - The handle returned by mac_open.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05304887 * wlanAppType2Params- Depicts the wlan App Type 2 (Outdoor) params
4888 * Return QDF_STATUS
4889 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08004890QDF_STATUS sme_configure_app_type2_params(mac_handle_t mac_handle,
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05304891 tpSirAppType2Params wlanAppType2Params)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004892{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304893 QDF_STATUS status = QDF_STATUS_SUCCESS;
4894 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08004895 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Rajeev Kumar37d478b2017-04-17 16:59:28 -07004896 struct scheduler_msg message = {0};
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304897 tpSirAppType2Params MsgPtr = qdf_mem_malloc(sizeof(*MsgPtr));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004898
4899 if (!MsgPtr)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304900 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004901
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05304902 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004903 TRACE_CODE_SME_RX_HDD_CONFIG_APP_TYPE2, NO_SESSION,
4904 0));
4905
Jeff Johnson01f2c232018-11-21 19:17:44 -08004906 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304907 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004908 /* serialize the req through MC thread */
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304909 qdf_mem_copy(MsgPtr, wlanAppType2Params, sizeof(*MsgPtr));
Rajeev Kumar8eaedf62017-01-21 11:03:13 -08004910 message.bodyptr = MsgPtr;
4911 message.type = WMA_WLAN_SET_APP_TYPE2_PARAMS;
gaurank kathpalia36b0c582018-08-28 17:45:43 +05304912 qdf_status = scheduler_post_message(QDF_MODULE_ID_SME,
4913 QDF_MODULE_ID_WMA,
4914 QDF_MODULE_ID_WMA,
4915 &message);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304916 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304917 qdf_mem_free(MsgPtr);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304918 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004919 }
Jeff Johnson01f2c232018-11-21 19:17:44 -08004920 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004921 } else {
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304922 qdf_mem_free(MsgPtr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004923 }
4924
4925 return status;
4926}
4927#endif
4928
Abhishek Singhb1954c62019-02-14 10:18:28 +05304929uint8_t sme_get_beaconing_concurrent_operation_channel(mac_handle_t mac_handle,
4930 uint8_t vdev_id_to_skip)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004931{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304932 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08004933 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004934 uint8_t channel = 0;
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05304935
Jeff Johnson01f2c232018-11-21 19:17:44 -08004936 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304937 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004938
Abhishek Singhb1954c62019-02-14 10:18:28 +05304939 channel = csr_get_beaconing_concurrent_channel(mac,
4940 vdev_id_to_skip);
4941 sme_info("Other Concurrent Channel: %d skipped vdev_id %d",
4942 channel, vdev_id_to_skip);
Jeff Johnson01f2c232018-11-21 19:17:44 -08004943 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004944 }
4945
4946 return channel;
4947}
4948
4949#ifdef FEATURE_WLAN_MCC_TO_SCC_SWITCH
Jeff Johnsonb460dd72018-11-08 10:26:51 -08004950uint16_t sme_check_concurrent_channel_overlap(mac_handle_t mac_handle,
Jeff Johnson1f2dabc2018-11-07 15:33:01 -08004951 uint16_t sap_ch,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004952 eCsrPhyMode sapPhyMode,
4953 uint8_t cc_switch_mode)
4954{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304955 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08004956 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004957 uint16_t channel = 0;
4958
Jeff Johnson01f2c232018-11-21 19:17:44 -08004959 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304960 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004961 channel =
Jeff Johnson01f2c232018-11-21 19:17:44 -08004962 csr_check_concurrent_channel_overlap(mac, sap_ch,
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05304963 sapPhyMode,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004964 cc_switch_mode);
Jeff Johnson01f2c232018-11-21 19:17:44 -08004965 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004966 }
4967
4968 return channel;
4969}
4970#endif
4971
Arun Khandavalli4b55da72016-07-19 19:55:01 +05304972/**
Manikandan Mohandcc21ba2016-03-15 14:31:56 -07004973 * sme_set_tsfcb() - Set callback for TSF capture
Jeff Johnsonb460dd72018-11-08 10:26:51 -08004974 * @mac_handle: Handler return by mac_open
Manikandan Mohandcc21ba2016-03-15 14:31:56 -07004975 * @cb_fn: Callback function pointer
4976 * @db_ctx: Callback data
4977 *
4978 * Return: QDF_STATUS
4979 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08004980QDF_STATUS sme_set_tsfcb(mac_handle_t mac_handle,
Manikandan Mohandcc21ba2016-03-15 14:31:56 -07004981 int (*cb_fn)(void *cb_ctx, struct stsf *ptsf), void *cb_ctx)
4982{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08004983 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Manikandan Mohandcc21ba2016-03-15 14:31:56 -07004984 QDF_STATUS status;
4985
Manikandan Mohan976e7562016-03-15 16:33:31 -07004986 status = sme_acquire_global_lock(&mac->sme);
Manikandan Mohandcc21ba2016-03-15 14:31:56 -07004987 if (QDF_IS_STATUS_SUCCESS(status)) {
Manikandan Mohan976e7562016-03-15 16:33:31 -07004988 mac->sme.get_tsf_cb = cb_fn;
4989 mac->sme.get_tsf_cxt = cb_ctx;
4990 sme_release_global_lock(&mac->sme);
Manikandan Mohandcc21ba2016-03-15 14:31:56 -07004991 }
4992 return status;
4993}
4994
Arun Khandavalli4b55da72016-07-19 19:55:01 +05304995/**
4996 * sme_reset_tsfcb() - Reset callback for TSF capture
Jeff Johnsonb460dd72018-11-08 10:26:51 -08004997 * @mac_handle: Handler return by mac_open
Arun Khandavalli4b55da72016-07-19 19:55:01 +05304998 *
4999 * This function reset the tsf capture callback to SME
5000 *
5001 * Return: QDF_STATUS
5002 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08005003QDF_STATUS sme_reset_tsfcb(mac_handle_t mac_handle)
Arun Khandavalli4b55da72016-07-19 19:55:01 +05305004{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08005005 struct mac_context *mac;
Arun Khandavalli4b55da72016-07-19 19:55:01 +05305006 QDF_STATUS status;
5007
Jeff Johnsonb460dd72018-11-08 10:26:51 -08005008 if (!mac_handle) {
Arun Khandavalli4b55da72016-07-19 19:55:01 +05305009 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Jeff Johnsonb460dd72018-11-08 10:26:51 -08005010 FL("mac_handle is not valid"));
Arun Khandavalli4b55da72016-07-19 19:55:01 +05305011 return QDF_STATUS_E_INVAL;
5012 }
Jeff Johnsona0619e42018-11-28 17:43:00 -08005013 mac = MAC_CONTEXT(mac_handle);
Arun Khandavalli4b55da72016-07-19 19:55:01 +05305014
5015 status = sme_acquire_global_lock(&mac->sme);
5016 if (QDF_IS_STATUS_SUCCESS(status)) {
5017 mac->sme.get_tsf_cb = NULL;
5018 mac->sme.get_tsf_cxt = NULL;
5019 sme_release_global_lock(&mac->sme);
5020 }
5021 return status;
5022}
5023
yuanl2746f072018-09-21 19:19:16 +08005024#if defined(WLAN_FEATURE_TSF) && !defined(WLAN_FEATURE_TSF_PLUS_NOIRQ)
Manikandan Mohan976e7562016-03-15 16:33:31 -07005025/*
yuanl2746f072018-09-21 19:19:16 +08005026 * sme_set_tsf_gpio() - set gpio pin that be toggled when capture tsf
Jeff Johnsonb460dd72018-11-08 10:26:51 -08005027 * @mac_handle: Handler return by mac_open
Manikandan Mohan976e7562016-03-15 16:33:31 -07005028 * @pinvalue: gpio pin id
5029 *
5030 * Return: QDF_STATUS
5031 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08005032QDF_STATUS sme_set_tsf_gpio(mac_handle_t mac_handle, uint32_t pinvalue)
Manikandan Mohan976e7562016-03-15 16:33:31 -07005033{
5034 QDF_STATUS status;
Rajeev Kumar8eaedf62017-01-21 11:03:13 -08005035 struct scheduler_msg tsf_msg = {0};
Jeff Johnson0a8786a2018-12-02 10:49:01 -08005036 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Manikandan Mohan976e7562016-03-15 16:33:31 -07005037
5038 status = sme_acquire_global_lock(&mac->sme);
5039 if (QDF_IS_STATUS_SUCCESS(status)) {
5040 tsf_msg.type = WMA_TSF_GPIO_PIN;
5041 tsf_msg.reserved = 0;
5042 tsf_msg.bodyval = pinvalue;
5043
gaurank kathpalia36b0c582018-08-28 17:45:43 +05305044 status = scheduler_post_message(QDF_MODULE_ID_SME,
5045 QDF_MODULE_ID_WMA,
5046 QDF_MODULE_ID_WMA, &tsf_msg);
Manikandan Mohan976e7562016-03-15 16:33:31 -07005047 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07005048 sme_err("Unable to post WMA_TSF_GPIO_PIN");
Manikandan Mohan976e7562016-03-15 16:33:31 -07005049 status = QDF_STATUS_E_FAILURE;
5050 }
5051 sme_release_global_lock(&mac->sme);
5052 }
5053 return status;
5054}
5055#endif
5056
Tushnim Bhattacharyya0c4ad2d2017-03-09 15:59:03 -08005057QDF_STATUS sme_get_cfg_valid_channels(uint8_t *aValidChannels,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005058 uint32_t *len)
5059{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305060 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08005061 struct mac_context *mac_ctx = sme_get_mac_context();
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005062
Tushnim Bhattacharyya0c4ad2d2017-03-09 15:59:03 -08005063 if (NULL == mac_ctx) {
5064 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
5065 FL("Invalid MAC context"));
5066 return QDF_STATUS_E_FAILURE;
5067 }
5068
5069 status = sme_acquire_global_lock(&mac_ctx->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305070 if (QDF_IS_STATUS_SUCCESS(status)) {
Tushnim Bhattacharyya0c4ad2d2017-03-09 15:59:03 -08005071 status = csr_get_cfg_valid_channels(mac_ctx,
5072 aValidChannels, len);
5073 sme_release_global_lock(&mac_ctx->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005074 }
5075
5076 return status;
5077}
5078
Amar Singhalf0a94ad2017-11-27 15:20:00 -08005079static uint8_t *sme_reg_hint_to_str(const enum country_src src)
5080{
5081 switch (src) {
5082 case SOURCE_CORE:
5083 return "WORLD MODE";
5084
5085 case SOURCE_DRIVER:
5086 return "BDF file";
5087
5088 case SOURCE_USERSPACE:
5089 return "user-space";
5090
5091 case SOURCE_11D:
5092 return "802.11D IEs in beacons";
5093
5094 default:
5095 return "unknown";
5096 }
5097}
5098
Jeff Johnsonb460dd72018-11-08 10:26:51 -08005099void sme_set_cc_src(mac_handle_t mac_handle, enum country_src cc_src)
Amar Singhal6edf9732016-11-20 21:43:40 -08005100{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08005101 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Amar Singhal6edf9732016-11-20 21:43:40 -08005102
5103 mac_ctx->reg_hint_src = cc_src;
Amar Singhalf0a94ad2017-11-27 15:20:00 -08005104
5105 sme_debug("Country source is %s",
5106 sme_reg_hint_to_str(cc_src));
Amar Singhal6edf9732016-11-20 21:43:40 -08005107}
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005108
5109/**
Amar Singhal7f1f3ec2015-10-13 17:14:08 -07005110 * sme_handle_generic_change_country_code() - handles country ch req
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005111 * @mac_ctx: mac global context
5112 * @msg: request msg packet
5113 *
5114 * If Supplicant country code is priority than 11d is disabled.
5115 * If 11D is enabled, we update the country code after every scan.
5116 * Hence when Supplicant country code is priority, we don't need 11D info.
5117 * Country code from Supplicant is set as current country code.
5118 *
5119 * Return: status of operation
5120 */
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05305121static QDF_STATUS
Jeff Johnson0a8786a2018-12-02 10:49:01 -08005122sme_handle_generic_change_country_code(struct mac_context *mac_ctx,
Amar Singhal7f1f3ec2015-10-13 17:14:08 -07005123 void *pMsgBuf)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005124{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305125 QDF_STATUS status = QDF_STATUS_SUCCESS;
Amar Singhal7f1f3ec2015-10-13 17:14:08 -07005126 v_REGDOMAIN_t reg_domain_id = 0;
Amar Singhalb6d0dc42016-10-19 09:45:05 -07005127 bool user_ctry_priority =
Bala Venkatesh46e29032018-11-14 18:24:55 +05305128 mac_ctx->mlme_cfg->sap_cfg.country_code_priority;
Amar Singhal7f1f3ec2015-10-13 17:14:08 -07005129 tAniGenericChangeCountryCodeReq *msg = pMsgBuf;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005130
Amar Singhal6edf9732016-11-20 21:43:40 -08005131 if (SOURCE_11D != mac_ctx->reg_hint_src) {
5132 if (SOURCE_DRIVER != mac_ctx->reg_hint_src) {
5133 if (user_ctry_priority)
Abhinav Kumard4d6eb72018-12-04 20:30:37 +05305134 mac_ctx->mlme_cfg->gen.enabled_11d = false;
Amar Singhal6edf9732016-11-20 21:43:40 -08005135 else {
Abhinav Kumard4d6eb72018-12-04 20:30:37 +05305136 if (mac_ctx->mlme_cfg->gen.enabled_11d &&
5137 mac_ctx->scan.countryCode11d[0] != 0) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005138
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07005139 sme_debug("restore 11d");
Amar Singhalb6d0dc42016-10-19 09:45:05 -07005140
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05305141 status =
5142 csr_get_regulatory_domain_for_country(
Amar Singhal6edf9732016-11-20 21:43:40 -08005143 mac_ctx,
5144 mac_ctx->scan.countryCode11d,
5145 &reg_domain_id,
5146 SOURCE_11D);
5147 return QDF_STATUS_E_FAILURE;
5148 }
Amar Singhalb6d0dc42016-10-19 09:45:05 -07005149 }
5150 }
5151 } else {
5152 /* if kernel gets invalid country code; it
5153 * resets the country code to world
5154 */
5155 if (('0' != msg->countryCode[0]) ||
5156 ('0' != msg->countryCode[1]))
5157 qdf_mem_copy(mac_ctx->scan.countryCode11d,
5158 msg->countryCode,
Wu Gaoaa155142019-01-14 15:09:26 +08005159 CFG_COUNTRY_CODE_LEN);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005160 }
Amar Singhal7f1f3ec2015-10-13 17:14:08 -07005161
Amar Singhalb6d0dc42016-10-19 09:45:05 -07005162 qdf_mem_copy(mac_ctx->scan.countryCodeCurrent,
5163 msg->countryCode,
Wu Gaoaa155142019-01-14 15:09:26 +08005164 CFG_COUNTRY_CODE_LEN);
Amar Singhal9d5b1fe2016-10-16 20:16:05 -07005165
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005166 /* get the channels based on new cc */
5167 status = csr_get_channel_and_power_list(mac_ctx);
5168
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305169 if (status != QDF_STATUS_SUCCESS) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07005170 sme_err("fail to get Channels");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005171 return status;
5172 }
Amar Singhalb6d0dc42016-10-19 09:45:05 -07005173
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005174 /* reset info based on new cc, and we are done */
5175 csr_apply_channel_power_info_wrapper(mac_ctx);
5176
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005177 csr_scan_filter_results(mac_ctx);
Amar Singhalb6d0dc42016-10-19 09:45:05 -07005178
5179 /* scans after the country is set by User hints or
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005180 * Country IE
5181 */
5182 mac_ctx->scan.curScanType = eSIR_ACTIVE_SCAN;
Amar Singhal9d5b1fe2016-10-16 20:16:05 -07005183
Amar Singhal6edf9732016-11-20 21:43:40 -08005184 mac_ctx->reg_hint_src = SOURCE_UNKNOWN;
5185
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005186 sme_disconnect_connected_sessions(mac_ctx);
Amar Singhalb6d0dc42016-10-19 09:45:05 -07005187
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305188 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005189}
5190
Jeff Johnsonc7309062018-11-09 20:59:42 -08005191QDF_STATUS sme_update_channel_list(mac_handle_t mac_handle)
Mukul Sharmaecf8e092017-12-19 22:36:31 +05305192{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08005193 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Jeff Johnson330c0bf2018-06-01 15:13:12 -07005194 QDF_STATUS status;
Mukul Sharmaecf8e092017-12-19 22:36:31 +05305195
5196 status = sme_acquire_global_lock(&mac_ctx->sme);
5197 if (QDF_IS_STATUS_SUCCESS(status)) {
5198 /* Update umac channel (enable/disable) from cds channels */
5199 status = csr_get_channel_and_power_list(mac_ctx);
5200 if (status != QDF_STATUS_SUCCESS) {
5201 sme_err("fail to get Channels");
5202 sme_release_global_lock(&mac_ctx->sme);
5203 return status;
5204 }
5205
5206 csr_apply_channel_power_info_wrapper(mac_ctx);
5207 csr_scan_filter_results(mac_ctx);
5208 sme_disconnect_connected_sessions(mac_ctx);
5209 sme_release_global_lock(&mac_ctx->sme);
5210 }
5211
5212 return status;
5213}
5214
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005215static bool
Jeff Johnson0a8786a2018-12-02 10:49:01 -08005216sme_search_in_base_ch_lst(struct mac_context *mac_ctx, uint8_t curr_ch)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005217{
5218 uint8_t i;
gaurank kathpalia14e2f912017-08-31 14:51:45 +05305219 struct csr_channel *ch_lst_info;
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05305220
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005221 ch_lst_info = &mac_ctx->scan.base_channels;
5222 for (i = 0; i < ch_lst_info->numChannels; i++) {
5223 if (ch_lst_info->channelList[i] == curr_ch)
5224 return true;
5225 }
5226
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005227 return false;
5228}
5229/**
5230 * sme_disconnect_connected_sessions() - Disconnect STA and P2P client session
5231 * if channel is not supported
5232 * @mac_ctx: mac global context
5233 *
5234 * If new country code does not support the channel on which STA/P2P client
5235 * is connetced, it sends the disconnect to the AP/P2P GO
5236 *
5237 * Return: void
5238 */
Jeff Johnson0a8786a2018-12-02 10:49:01 -08005239static void sme_disconnect_connected_sessions(struct mac_context *mac_ctx)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005240{
5241 uint8_t session_id, found = false;
5242 uint8_t curr_ch;
5243
Dustin Brownad06be62019-02-04 14:52:56 -08005244 for (session_id = 0; session_id < WLAN_MAX_VDEVS; session_id++) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005245 if (!csr_is_session_client_and_connected(mac_ctx, session_id))
5246 continue;
5247 found = false;
5248 /* Session is connected.Check the channel */
5249 curr_ch = csr_get_infra_operation_channel(mac_ctx,
5250 session_id);
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07005251 sme_debug("Current Operating channel : %d, session :%d",
5252 curr_ch, session_id);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005253 found = sme_search_in_base_ch_lst(mac_ctx, curr_ch);
5254 if (!found) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07005255 sme_debug("Disconnect Session: %d", session_id);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005256 csr_roam_disconnect(mac_ctx, session_id,
5257 eCSR_DISCONNECT_REASON_UNSPECIFIED);
5258 }
5259 }
5260}
5261
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005262#ifdef WLAN_FEATURE_PACKET_FILTERING
Jeff Johnsonb460dd72018-11-08 10:26:51 -08005263QDF_STATUS sme_8023_multicast_list(mac_handle_t mac_handle, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005264 tpSirRcvFltMcAddrList pMulticastAddrs)
5265{
5266 tpSirRcvFltMcAddrList request_buf;
Rajeev Kumar37d478b2017-04-17 16:59:28 -07005267 struct scheduler_msg msg = {0};
Jeff Johnson0a8786a2018-12-02 10:49:01 -08005268 struct mac_context *mac = MAC_CONTEXT(mac_handle);
gaurank kathpalia14e2f912017-08-31 14:51:45 +05305269 struct csr_roam_session *pSession = NULL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005270
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05305271 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
5272 "%s: ulMulticastAddrCnt: %d, multicastAddr[0]: %pK", __func__,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005273 pMulticastAddrs->ulMulticastAddrCnt,
Srinivas Girigowda98530492015-11-20 17:39:24 -08005274 pMulticastAddrs->multicastAddr[0].bytes);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005275
Ravi Joshi4f447cb2016-07-19 13:42:01 -07005276 /* Find the connected Infra / P2P_client connected session */
Jeff Johnson01f2c232018-11-21 19:17:44 -08005277 pSession = CSR_GET_SESSION(mac, sessionId);
5278 if (!CSR_IS_SESSION_VALID(mac, sessionId) ||
5279 (!csr_is_conn_state_infra(mac, sessionId) &&
5280 !csr_is_ndi_started(mac, sessionId))) {
Abhishek Singh5d8d7332017-08-10 15:15:24 +05305281 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Srinivas Girigowdaf2599dd2015-11-16 18:20:46 -08005282 "%s: Unable to find the session Id: %d", __func__,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005283 sessionId);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305284 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005285 }
5286
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305287 request_buf = qdf_mem_malloc(sizeof(tSirRcvFltMcAddrList));
Arif Hussain0ef77082018-10-10 16:42:53 -07005288 if (!request_buf)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305289 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005290
Jeff Johnson01f2c232018-11-21 19:17:44 -08005291 if (!csr_is_conn_state_connected_infra(mac, sessionId) &&
5292 !csr_is_ndi_started(mac, sessionId)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05305293 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Ravi Joshi4f447cb2016-07-19 13:42:01 -07005294 "%s: Request ignored, session %d is not connected or started",
5295 __func__, sessionId);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305296 qdf_mem_free(request_buf);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305297 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005298 }
5299
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305300 qdf_mem_copy(request_buf, pMulticastAddrs,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005301 sizeof(tSirRcvFltMcAddrList));
5302
Anurag Chouhanc5548422016-02-24 18:33:27 +05305303 qdf_copy_macaddr(&request_buf->self_macaddr, &pSession->selfMacAddr);
5304 qdf_copy_macaddr(&request_buf->bssid,
Srinivas Girigowda98530492015-11-20 17:39:24 -08005305 &pSession->connectedProfile.bssid);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005306
5307 msg.type = WMA_8023_MULTICAST_LIST_REQ;
5308 msg.reserved = 0;
5309 msg.bodyptr = request_buf;
Sreelakshmi Konamki6a065362016-05-31 16:05:01 +05305310 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
5311 sessionId, msg.type));
gaurank kathpalia36b0c582018-08-28 17:45:43 +05305312 if (QDF_STATUS_SUCCESS != scheduler_post_message(QDF_MODULE_ID_SME,
5313 QDF_MODULE_ID_WMA,
5314 QDF_MODULE_ID_WMA,
5315 &msg)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05305316 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05305317 "%s: Not able to post WMA_8023_MULTICAST_LIST message to WMA",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005318 __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305319 qdf_mem_free(request_buf);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305320 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005321 }
5322
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305323 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005324}
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005325#endif /* WLAN_FEATURE_PACKET_FILTERING */
5326
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05305327/*
5328 * sme_is_channel_valid() -
5329 * To check if the channel is valid for currently established domain
5330 * This is a synchronous API.
5331 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08005332 * mac_handle - The handle returned by mac_open.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05305333 * channel - channel to verify
5334 * Return true/false, true if channel is valid
5335 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08005336bool sme_is_channel_valid(mac_handle_t mac_handle, uint8_t channel)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005337{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305338 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005339 bool valid = false;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08005340 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005341
Jeff Johnson01f2c232018-11-21 19:17:44 -08005342 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305343 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005344
Jeff Johnson01f2c232018-11-21 19:17:44 -08005345 valid = csr_roam_is_channel_valid(mac, channel);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005346
Jeff Johnson01f2c232018-11-21 19:17:44 -08005347 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005348 }
5349
5350 return valid;
5351}
5352
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05305353/*
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05305354 * sme_get_freq_band() -
5355 * Used to get the current band settings.
5356 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08005357 * mac_handle
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05305358 * pBand pointer to hold band value
5359 * Return QDF_STATUS
5360 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08005361QDF_STATUS sme_get_freq_band(mac_handle_t mac_handle, enum band_info *pBand)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005362{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305363 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08005364 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005365
Jeff Johnson01f2c232018-11-21 19:17:44 -08005366 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305367 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08005368 *pBand = csr_get_current_band(mac);
5369 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005370 }
5371 return status;
5372}
5373
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05305374/*
5375 * sme_set_max_tx_power_per_band() -
5376 * Set the Maximum Transmit Power specific to band dynamically.
5377 * Note: this setting will not persist over reboots.
5378 *
5379 * band
5380 * power to set in dB
5381 * Return QDF_STATUS
5382 */
Varun Reddy Yeturua48bc412017-11-17 15:33:35 -08005383QDF_STATUS sme_set_max_tx_power_per_band(enum band_info band, int8_t dB)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005384{
Rajeev Kumar37d478b2017-04-17 16:59:28 -07005385 struct scheduler_msg msg = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005386 tpMaxTxPowerPerBandParams pMaxTxPowerPerBandParams = NULL;
5387
5388 pMaxTxPowerPerBandParams =
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305389 qdf_mem_malloc(sizeof(tMaxTxPowerPerBandParams));
Arif Hussain0ef77082018-10-10 16:42:53 -07005390 if (!pMaxTxPowerPerBandParams)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305391 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005392
5393 pMaxTxPowerPerBandParams->power = dB;
5394 pMaxTxPowerPerBandParams->bandInfo = band;
5395
5396 msg.type = WMA_SET_MAX_TX_POWER_PER_BAND_REQ;
5397 msg.reserved = 0;
5398 msg.bodyptr = pMaxTxPowerPerBandParams;
Sreelakshmi Konamki6a065362016-05-31 16:05:01 +05305399 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
5400 NO_SESSION, msg.type));
gaurank kathpalia36b0c582018-08-28 17:45:43 +05305401 if (QDF_STATUS_SUCCESS != scheduler_post_message(QDF_MODULE_ID_SME,
5402 QDF_MODULE_ID_WMA,
5403 QDF_MODULE_ID_WMA,
5404 &msg)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05305405 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005406 "%s:Not able to post WMA_SET_MAX_TX_POWER_PER_BAND_REQ",
5407 __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305408 qdf_mem_free(pMaxTxPowerPerBandParams);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305409 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005410 }
5411
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305412 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005413}
5414
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05305415/*
5416 * sme_set_max_tx_power() -
5417 * Set the Maximum Transmit Power dynamically. Note: this setting will
5418 * not persist over reboots.
5419 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08005420 * mac_handle
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05305421 * pBssid BSSID to set the power cap for
5422 * pBssid pSelfMacAddress self MAC Address
5423 * pBssid power to set in dB
5424 * Return QDF_STATUS
5425 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08005426QDF_STATUS sme_set_max_tx_power(mac_handle_t mac_handle,
5427 struct qdf_mac_addr pBssid,
Anurag Chouhan6d760662016-02-20 16:05:43 +05305428 struct qdf_mac_addr pSelfMacAddress, int8_t dB)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005429{
Rajeev Kumar37d478b2017-04-17 16:59:28 -07005430 struct scheduler_msg msg = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005431 tpMaxTxPowerParams pMaxTxParams = NULL;
5432
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05305433 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005434 TRACE_CODE_SME_RX_HDD_SET_MAXTXPOW, NO_SESSION, 0));
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305435 pMaxTxParams = qdf_mem_malloc(sizeof(tMaxTxPowerParams));
Arif Hussain0ef77082018-10-10 16:42:53 -07005436 if (!pMaxTxParams)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305437 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005438
Anurag Chouhanc5548422016-02-24 18:33:27 +05305439 qdf_copy_macaddr(&pMaxTxParams->bssId, &pBssid);
5440 qdf_copy_macaddr(&pMaxTxParams->selfStaMacAddr, &pSelfMacAddress);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005441 pMaxTxParams->power = dB;
5442
5443 msg.type = WMA_SET_MAX_TX_POWER_REQ;
5444 msg.reserved = 0;
5445 msg.bodyptr = pMaxTxParams;
5446
gaurank kathpalia36b0c582018-08-28 17:45:43 +05305447 if (QDF_STATUS_SUCCESS != scheduler_post_message(QDF_MODULE_ID_SME,
5448 QDF_MODULE_ID_WMA,
5449 QDF_MODULE_ID_WMA,
5450 &msg)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05305451 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005452 "%s: Not able to post WMA_SET_MAX_TX_POWER_REQ message to WMA",
5453 __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305454 qdf_mem_free(pMaxTxParams);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305455 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005456 }
5457
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305458 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005459}
5460
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05305461/*
5462 * sme_set_custom_mac_addr() -
5463 * Set the customer Mac Address.
5464 *
5465 * customMacAddr customer MAC Address
5466 * Return QDF_STATUS
5467 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305468QDF_STATUS sme_set_custom_mac_addr(tSirMacAddr customMacAddr)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005469{
Rajeev Kumar37d478b2017-04-17 16:59:28 -07005470 struct scheduler_msg msg = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005471 tSirMacAddr *pBaseMacAddr;
5472
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305473 pBaseMacAddr = qdf_mem_malloc(sizeof(tSirMacAddr));
Arif Hussain0ef77082018-10-10 16:42:53 -07005474 if (!pBaseMacAddr)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305475 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005476
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305477 qdf_mem_copy(*pBaseMacAddr, customMacAddr, sizeof(tSirMacAddr));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005478
5479 msg.type = SIR_HAL_SET_BASE_MACADDR_IND;
5480 msg.reserved = 0;
5481 msg.bodyptr = pBaseMacAddr;
5482
gaurank kathpalia36b0c582018-08-28 17:45:43 +05305483 if (QDF_STATUS_SUCCESS != scheduler_post_message(QDF_MODULE_ID_SME,
5484 QDF_MODULE_ID_WMA,
5485 QDF_MODULE_ID_WMA,
5486 &msg)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05305487 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05305488 "Not able to post SIR_HAL_SET_BASE_MACADDR_IND message to WMA");
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305489 qdf_mem_free(pBaseMacAddr);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305490 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005491 }
5492
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305493 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005494}
5495
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05305496/*
5497 * sme_set_tx_power() -
5498 * Set Transmit Power dynamically.
5499 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08005500 * mac_handle
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05305501 * sessionId Target Session ID
5502 * BSSID
5503 * dev_mode dev_mode such as station, P2PGO, SAP
5504 * dBm power to set
5505 * Return QDF_STATUS
5506 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08005507QDF_STATUS sme_set_tx_power(mac_handle_t mac_handle, uint8_t sessionId,
Anurag Chouhan6d760662016-02-20 16:05:43 +05305508 struct qdf_mac_addr pBSSId,
Jeff Johnsonc1e62782017-11-09 09:50:17 -08005509 enum QDF_OPMODE dev_mode, int dBm)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005510{
Rajeev Kumar37d478b2017-04-17 16:59:28 -07005511 struct scheduler_msg msg = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005512 tpMaxTxPowerParams pTxParams = NULL;
5513 int8_t power = (int8_t) dBm;
5514
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05305515 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005516 TRACE_CODE_SME_RX_HDD_SET_TXPOW, sessionId, 0));
5517
5518 /* make sure there is no overflow */
5519 if ((int)power != dBm) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05305520 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005521 "%s: error, invalid power = %d", __func__, dBm);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305522 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005523 }
5524
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305525 pTxParams = qdf_mem_malloc(sizeof(tMaxTxPowerParams));
Arif Hussain0ef77082018-10-10 16:42:53 -07005526 if (!pTxParams)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305527 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005528
Anurag Chouhanc5548422016-02-24 18:33:27 +05305529 qdf_copy_macaddr(&pTxParams->bssId, &pBSSId);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005530 pTxParams->power = power; /* unit is dBm */
5531 pTxParams->dev_mode = dev_mode;
5532 msg.type = WMA_SET_TX_POWER_REQ;
5533 msg.reserved = 0;
5534 msg.bodyptr = pTxParams;
5535
gaurank kathpalia36b0c582018-08-28 17:45:43 +05305536 if (QDF_STATUS_SUCCESS != scheduler_post_message(QDF_MODULE_ID_SME,
5537 QDF_MODULE_ID_WMA,
5538 QDF_MODULE_ID_WMA,
5539 &msg)) {
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305540 qdf_mem_free(pTxParams);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305541 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005542 }
5543
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305544 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005545}
5546
Jeff Johnsonc7309062018-11-09 20:59:42 -08005547QDF_STATUS sme_update_session_param(mac_handle_t mac_handle, uint8_t session_id,
5548 uint32_t param_type, uint32_t param_val)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005549{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305550 QDF_STATUS status = QDF_STATUS_SUCCESS;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08005551 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005552 uint16_t len;
5553
Selvaraj, Sridhar7231c5f2016-09-28 12:42:33 +05305554 status = sme_acquire_global_lock(&mac_ctx->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305555 if (QDF_IS_STATUS_SUCCESS(status)) {
Selvaraj, Sridhar7231c5f2016-09-28 12:42:33 +05305556 struct sir_update_session_param *msg;
gaurank kathpalia14e2f912017-08-31 14:51:45 +05305557 struct csr_roam_session *session = CSR_GET_SESSION(mac_ctx,
5558 session_id);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005559
Selvaraj, Sridhar7231c5f2016-09-28 12:42:33 +05305560 if (!session) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07005561 sme_err("Session: %d not found", session_id);
Selvaraj, Sridhar7231c5f2016-09-28 12:42:33 +05305562 sme_release_global_lock(&mac_ctx->sme);
5563 return status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005564 }
5565
Selvaraj, Sridhar5b5a0652017-05-04 11:23:07 +05305566 if (param_type == SIR_PARAM_IGNORE_ASSOC_DISALLOWED)
5567 mac_ctx->ignore_assoc_disallowed = param_val;
5568
Selvaraj, Sridhar7231c5f2016-09-28 12:42:33 +05305569 if (!session->sessionActive)
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05305570 QDF_ASSERT(0);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005571
Selvaraj, Sridhar7231c5f2016-09-28 12:42:33 +05305572 len = sizeof(*msg);
5573 msg = qdf_mem_malloc(len);
5574 if (!msg)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305575 status = QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005576 else {
Selvaraj, Sridhar7231c5f2016-09-28 12:42:33 +05305577 msg->message_type = eWNI_SME_SESSION_UPDATE_PARAM;
5578 msg->length = len;
5579 msg->session_id = session_id;
5580 msg->param_type = param_type;
5581 msg->param_val = param_val;
Rajeev Kumard138ac52017-01-30 18:38:37 -08005582 status = umac_send_mb_message_to_mac(msg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005583 }
Selvaraj, Sridhar7231c5f2016-09-28 12:42:33 +05305584 sme_release_global_lock(&mac_ctx->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005585 }
5586 return status;
5587}
5588
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05305589/*
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05305590 * sme_update_roam_scan_n_probes() -
5591 * Function to update roam scan N probes
5592 * This function is called through dynamic setConfig callback function
5593 * to update roam scan N probes
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -08005594 * mac_handle: Opaque handle to the global MAC context
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05305595 * sessionId - Session Identifier
5596 * nProbes number of probe requests to be sent out
5597 * Return Success or failure
5598 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08005599QDF_STATUS sme_update_roam_scan_n_probes(mac_handle_t mac_handle,
5600 uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005601 const uint8_t nProbes)
5602{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08005603 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305604 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005605
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05305606 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005607 TRACE_CODE_SME_RX_HDD_UPDATE_ROAM_SCAN_N_PROBES,
5608 NO_SESSION, 0));
Jeff Johnson01f2c232018-11-21 19:17:44 -08005609 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305610 if (QDF_IS_STATUS_SUCCESS(status)) {
Abhishek Singhe4a1f882017-08-10 17:59:44 +05305611 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005612 "%s: gRoamScanNProbes is changed from %d to %d",
Wu Gao51a63562018-11-08 16:29:10 +08005613 __func__, mac->mlme_cfg->lfr.roam_scan_n_probes,
5614 nProbes);
5615 mac->mlme_cfg->lfr.roam_scan_n_probes = nProbes;
Vignesh Viswanathan4e65e8e2018-05-01 12:04:16 +05305616
Wu Gao51a63562018-11-08 16:29:10 +08005617 if (mac->mlme_cfg->lfr.roam_scan_offload_enabled) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08005618 csr_roam_offload_scan(mac, sessionId,
Vignesh Viswanathan4e65e8e2018-05-01 12:04:16 +05305619 ROAM_SCAN_OFFLOAD_UPDATE_CFG,
5620 REASON_NPROBES_CHANGED);
5621 }
Jeff Johnson01f2c232018-11-21 19:17:44 -08005622 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005623 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005624 return status;
5625}
5626
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05305627/*
5628 * sme_update_roam_scan_home_away_time() -
5629 * Function to update roam scan Home away time
5630 * This function is called through dynamic setConfig callback function
5631 * to update roam scan home away time
5632 *
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -08005633 * mac_handle: Opaque handle to the global MAC context
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05305634 * sessionId - Session Identifier
5635 * nRoamScanAwayTime Scan home away time
5636 * bSendOffloadCmd If true then send offload command to firmware
5637 * If false then command is not sent to firmware
5638 * Return Success or failure
5639 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08005640QDF_STATUS sme_update_roam_scan_home_away_time(
5641 mac_handle_t mac_handle,
5642 uint8_t sessionId,
5643 const uint16_t nRoamScanHomeAwayTime,
5644 const bool bSendOffloadCmd)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005645{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08005646 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305647 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005648
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05305649 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005650 TRACE_CODE_SME_RX_HDD_UPDATE_ROAM_SCAN_HOME_AWAY_TIME,
5651 NO_SESSION, 0));
Jeff Johnson01f2c232018-11-21 19:17:44 -08005652 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305653 if (QDF_IS_STATUS_SUCCESS(status)) {
Abhishek Singhe4a1f882017-08-10 17:59:44 +05305654 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005655 "%s: gRoamScanHomeAwayTime is changed from %d to %d",
5656 __func__,
Wu Gao51a63562018-11-08 16:29:10 +08005657 mac->mlme_cfg->lfr.roam_scan_home_away_time,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005658 nRoamScanHomeAwayTime);
Wu Gao51a63562018-11-08 16:29:10 +08005659 mac->mlme_cfg->lfr.roam_scan_home_away_time =
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005660 nRoamScanHomeAwayTime;
Vignesh Viswanathan4e65e8e2018-05-01 12:04:16 +05305661
Wu Gao51a63562018-11-08 16:29:10 +08005662 if (mac->mlme_cfg->lfr.roam_scan_offload_enabled &&
5663 bSendOffloadCmd) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08005664 csr_roam_offload_scan(mac, sessionId,
Vignesh Viswanathan4e65e8e2018-05-01 12:04:16 +05305665 ROAM_SCAN_OFFLOAD_UPDATE_CFG,
5666 REASON_HOME_AWAY_TIME_CHANGED);
5667 }
Jeff Johnson01f2c232018-11-21 19:17:44 -08005668 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005669 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005670 return status;
5671}
5672
Abhishek Singh518323d2015-10-19 17:42:01 +05305673/**
5674 * sme_ext_change_channel()- function to post send ECSA
5675 * action frame to csr.
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -08005676 * @mac_handle: Opaque handle to the global MAC context
Abhishek Singh518323d2015-10-19 17:42:01 +05305677 * @channel: new channel to switch
5678 * @session_id: senssion it should be sent on.
5679 *
5680 * This function is called to post ECSA frame to csr.
5681 *
5682 * Return: success if msg is sent else return failure
5683 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08005684QDF_STATUS sme_ext_change_channel(mac_handle_t mac_handle, uint32_t channel,
Abhishek Singh518323d2015-10-19 17:42:01 +05305685 uint8_t session_id)
5686{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305687 QDF_STATUS status = QDF_STATUS_SUCCESS;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08005688 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Abhishek Singh518323d2015-10-19 17:42:01 +05305689 uint8_t channel_state;
5690
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07005691 sme_err("Set Channel: %d", channel);
Abhishek Singh518323d2015-10-19 17:42:01 +05305692 channel_state =
Kiran Kumar Lokerea3de2262017-04-12 12:15:04 -07005693 wlan_reg_get_channel_state(mac_ctx->pdev, channel);
Abhishek Singh518323d2015-10-19 17:42:01 +05305694
5695 if (CHANNEL_STATE_DISABLE == channel_state) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07005696 sme_err("Invalid channel: %d", channel);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305697 return QDF_STATUS_E_INVAL;
Abhishek Singh518323d2015-10-19 17:42:01 +05305698 }
5699
5700 status = sme_acquire_global_lock(&mac_ctx->sme);
5701
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305702 if (QDF_STATUS_SUCCESS == status) {
Abhishek Singh518323d2015-10-19 17:42:01 +05305703 /* update the channel list to the firmware */
5704 status = csr_send_ext_change_channel(mac_ctx,
5705 channel, session_id);
5706 sme_release_global_lock(&mac_ctx->sme);
5707 }
5708
5709 return status;
5710}
5711
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05305712/*
5713 * sme_get_roam_intra_band() -
5714 * get Intra band roaming
5715 *
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -08005716 * mac_handle: Opaque handle to the global MAC context
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05305717 * Return Success or failure
5718 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08005719bool sme_get_roam_intra_band(mac_handle_t mac_handle)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005720{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08005721 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05305722
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05305723 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005724 TRACE_CODE_SME_RX_HDD_GET_ROAMIBAND, NO_SESSION, 0));
Wu Gao51a63562018-11-08 16:29:10 +08005725
5726 return mac->mlme_cfg->lfr.roam_intra_band;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005727}
5728
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05305729/*
5730 * sme_get_roam_scan_n_probes() -
5731 * get N Probes
5732 *
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -08005733 * mac_handle: Opaque handle to the global MAC context
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05305734 * Return Success or failure
5735 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08005736uint8_t sme_get_roam_scan_n_probes(mac_handle_t mac_handle)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005737{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08005738 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05305739
Wu Gao51a63562018-11-08 16:29:10 +08005740 return mac->mlme_cfg->lfr.roam_scan_n_probes;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005741}
5742
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05305743/*
5744 * sme_get_roam_scan_home_away_time() -
5745 * get Roam scan home away time
5746 *
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -08005747 * mac_handle: Opaque handle to the global MAC context
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05305748 * Return Success or failure
5749 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08005750uint16_t sme_get_roam_scan_home_away_time(mac_handle_t mac_handle)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005751{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08005752 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05305753
Wu Gao51a63562018-11-08 16:29:10 +08005754 return mac->mlme_cfg->lfr.roam_scan_home_away_time;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005755}
5756
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05305757/*
5758 * sme_update_roam_rssi_diff() -
5759 * Update RoamRssiDiff
5760 * This function is called through dynamic setConfig callback function
5761 * to configure RoamRssiDiff
5762 * Usage: adb shell iwpriv wlan0 setConfig RoamRssiDiff=[0 .. 125]
5763 *
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -08005764 * mac_handle: Opaque handle to the global MAC context
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05305765 * sessionId - Session Identifier
5766 * RoamRssiDiff - minimum rssi difference between potential
5767 * candidate and current AP.
5768 * Return Success or failure
5769 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005770
Jeff Johnsonb460dd72018-11-08 10:26:51 -08005771QDF_STATUS sme_update_roam_rssi_diff(mac_handle_t mac_handle, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005772 uint8_t RoamRssiDiff)
5773{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08005774 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305775 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005776
Dustin Brownad06be62019-02-04 14:52:56 -08005777 if (sessionId >= WLAN_MAX_VDEVS) {
Naveen Rawatc36f7eb2016-11-10 20:01:03 -08005778 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
5779 FL("Invalid sme session id: %d"), sessionId);
5780 return QDF_STATUS_E_INVAL;
5781 }
5782
Jeff Johnson01f2c232018-11-21 19:17:44 -08005783 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305784 if (QDF_IS_STATUS_SUCCESS(status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05305785 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005786 "LFR runtime successfully set roam rssi diff to %d - old value is %d - roam state is %s",
5787 RoamRssiDiff,
Wu Gao51a63562018-11-08 16:29:10 +08005788 mac->mlme_cfg->lfr.roam_rssi_diff,
Jeff Johnson01f2c232018-11-21 19:17:44 -08005789 mac_trace_get_neighbour_roam_state(mac->roam.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005790 neighborRoamInfo
5791 [sessionId].
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05305792 neighborRoamState));
Wu Gao51a63562018-11-08 16:29:10 +08005793 mac->mlme_cfg->lfr.roam_rssi_diff = RoamRssiDiff;
Vignesh Viswanathan4e65e8e2018-05-01 12:04:16 +05305794
Wu Gao51a63562018-11-08 16:29:10 +08005795 if (mac->mlme_cfg->lfr.roam_scan_offload_enabled)
Jeff Johnson01f2c232018-11-21 19:17:44 -08005796 csr_roam_offload_scan(mac, sessionId,
Vignesh Viswanathan4e65e8e2018-05-01 12:04:16 +05305797 ROAM_SCAN_OFFLOAD_UPDATE_CFG,
5798 REASON_RSSI_DIFF_CHANGED);
5799
Jeff Johnson01f2c232018-11-21 19:17:44 -08005800 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005801 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005802 return status;
5803}
5804
Vignesh Viswanathanc6d1e1c2017-09-18 12:32:49 +05305805#ifdef WLAN_FEATURE_FILS_SK
Jeff Johnsonc7309062018-11-09 20:59:42 -08005806QDF_STATUS sme_update_fils_config(mac_handle_t mac_handle, uint8_t session_id,
Jeff Johnson66ee8a92018-03-17 15:24:26 -07005807 struct csr_roam_profile *src_profile)
Vignesh Viswanathanc6d1e1c2017-09-18 12:32:49 +05305808{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08005809 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Vignesh Viswanathanc6d1e1c2017-09-18 12:32:49 +05305810 QDF_STATUS status = QDF_STATUS_SUCCESS;
5811 tpCsrNeighborRoamControlInfo neighbor_roam_info =
5812 &mac->roam.neighborRoamInfo[session_id];
5813
Dustin Brownad06be62019-02-04 14:52:56 -08005814 if (session_id >= WLAN_MAX_VDEVS) {
Vignesh Viswanathanc6d1e1c2017-09-18 12:32:49 +05305815 sme_err("Invalid sme session id: %d", session_id);
5816 return QDF_STATUS_E_INVAL;
5817 }
5818
5819 if (!src_profile) {
5820 sme_err("src roam profile NULL");
5821 return QDF_STATUS_E_INVAL;
5822 }
5823
Wu Gao51a63562018-11-08 16:29:10 +08005824 if (!mac->mlme_cfg->lfr.lfr_enabled ||
Vignesh Viswanathanc6d1e1c2017-09-18 12:32:49 +05305825 (neighbor_roam_info->neighborRoamState !=
5826 eCSR_NEIGHBOR_ROAM_STATE_CONNECTED)) {
5827 sme_info("Fast roam is disabled or not connected(%d)",
5828 neighbor_roam_info->neighborRoamState);
5829 return QDF_STATUS_E_PERM;
5830 }
5831
5832 csr_update_fils_config(mac, session_id, src_profile);
Jianmin Zhubf845932018-12-17 11:52:50 +08005833 if (csr_is_roam_offload_enabled(mac)) {
Vignesh Viswanathan4e65e8e2018-05-01 12:04:16 +05305834 status = sme_acquire_global_lock(&mac->sme);
5835 if (QDF_IS_STATUS_SUCCESS(status)) {
5836 sme_debug("Updating fils config to fw");
5837 csr_roam_offload_scan(mac, session_id,
5838 ROAM_SCAN_OFFLOAD_UPDATE_CFG,
5839 REASON_FILS_PARAMS_CHANGED);
5840 sme_release_global_lock(&mac->sme);
5841 } else {
5842 sme_err("Failed to acquire SME lock");
5843 }
Vignesh Viswanathanc6d1e1c2017-09-18 12:32:49 +05305844 } else {
5845 sme_info("LFR3 not enabled");
5846 return QDF_STATUS_E_INVAL;
5847 }
5848
5849 return status;
5850}
5851
Jeff Johnsonc7309062018-11-09 20:59:42 -08005852void sme_send_hlp_ie_info(mac_handle_t mac_handle, uint8_t session_id,
Jeff Johnson66ee8a92018-03-17 15:24:26 -07005853 struct csr_roam_profile *profile, uint32_t if_addr)
Vignesh Viswanathanc6d1e1c2017-09-18 12:32:49 +05305854{
5855 int i;
5856 struct scheduler_msg msg;
5857 QDF_STATUS status;
5858 struct hlp_params *params;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08005859 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Vignesh Viswanathanc6d1e1c2017-09-18 12:32:49 +05305860 struct csr_roam_session *session = CSR_GET_SESSION(mac, session_id);
5861 tpCsrNeighborRoamControlInfo neighbor_roam_info =
5862 &mac->roam.neighborRoamInfo[session_id];
5863
5864 if (!session) {
5865 sme_err("session NULL");
5866 return;
5867 }
5868
Wu Gao51a63562018-11-08 16:29:10 +08005869 if (!mac->mlme_cfg->lfr.lfr_enabled ||
Vignesh Viswanathanc6d1e1c2017-09-18 12:32:49 +05305870 (neighbor_roam_info->neighborRoamState !=
5871 eCSR_NEIGHBOR_ROAM_STATE_CONNECTED)) {
5872 sme_debug("Fast roam is disabled or not connected(%d)",
5873 neighbor_roam_info->neighborRoamState);
5874 return;
5875 }
5876
5877 params = qdf_mem_malloc(sizeof(*params));
Arif Hussain0ef77082018-10-10 16:42:53 -07005878 if (!params)
Vignesh Viswanathanc6d1e1c2017-09-18 12:32:49 +05305879 return;
Arif Hussain0ef77082018-10-10 16:42:53 -07005880
Vignesh Viswanathanc6d1e1c2017-09-18 12:32:49 +05305881 if ((profile->hlp_ie_len +
5882 SIR_IPV4_ADDR_LEN) > FILS_MAX_HLP_DATA_LEN) {
5883 sme_err("HLP IE len exceeds %d",
5884 profile->hlp_ie_len);
5885 qdf_mem_free(params);
5886 return;
5887 }
5888
5889 params->vdev_id = session_id;
5890 params->hlp_ie_len = profile->hlp_ie_len + SIR_IPV4_ADDR_LEN;
5891
5892 for (i = 0; i < SIR_IPV4_ADDR_LEN; i++)
5893 params->hlp_ie[i] = (if_addr >> (i * 8)) & 0xFF;
5894
5895 qdf_mem_copy(params->hlp_ie + SIR_IPV4_ADDR_LEN,
5896 profile->hlp_ie, profile->hlp_ie_len);
5897
5898 msg.type = SIR_HAL_HLP_IE_INFO;
5899 msg.reserved = 0;
5900 msg.bodyptr = params;
5901 status = sme_acquire_global_lock(&mac->sme);
5902 if (status != QDF_STATUS_SUCCESS) {
5903 sme_err("sme lock acquire fails");
5904 qdf_mem_free(params);
5905 return;
5906 }
5907
5908 if (!QDF_IS_STATUS_SUCCESS
gaurank kathpalia36b0c582018-08-28 17:45:43 +05305909 (scheduler_post_message(QDF_MODULE_ID_SME,
5910 QDF_MODULE_ID_WMA,
5911 QDF_MODULE_ID_WMA, &msg))) {
Vignesh Viswanathanc6d1e1c2017-09-18 12:32:49 +05305912 sme_err("Not able to post WMA_HLP_IE_INFO message to HAL");
5913 sme_release_global_lock(&mac->sme);
5914 qdf_mem_free(params);
5915 return;
5916 }
5917
5918 sme_release_global_lock(&mac->sme);
5919}
5920
Jeff Johnson172237b2017-11-07 15:32:59 -08005921void sme_free_join_rsp_fils_params(struct csr_roam_info *roam_info)
Vignesh Viswanathanc6d1e1c2017-09-18 12:32:49 +05305922{
5923 struct fils_join_rsp_params *roam_fils_params;
5924
5925 if (!roam_info) {
5926 sme_err("FILS Roam Info NULL");
5927 return;
5928 }
5929
5930 roam_fils_params = roam_info->fils_join_rsp;
5931 if (!roam_fils_params) {
5932 sme_err("FILS Roam Param NULL");
5933 return;
5934 }
5935
5936 if (roam_fils_params->fils_pmk)
5937 qdf_mem_free(roam_fils_params->fils_pmk);
5938
5939 qdf_mem_free(roam_fils_params);
5940
5941 roam_info->fils_join_rsp = NULL;
5942}
5943
5944#else
Jeff Johnsonc7309062018-11-09 20:59:42 -08005945inline void sme_send_hlp_ie_info(mac_handle_t mac_handle, uint8_t session_id,
Jeff Johnson66ee8a92018-03-17 15:24:26 -07005946 struct csr_roam_profile *profile, uint32_t if_addr)
Vignesh Viswanathanc6d1e1c2017-09-18 12:32:49 +05305947{}
5948#endif
5949
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05305950/*
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05305951 * sme_update_wes_mode() -
5952 * Update WES Mode
5953 * This function is called through dynamic setConfig callback function
5954 * to configure isWESModeEnabled
5955 *
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -08005956 * mac_handle: Opaque handle to the global MAC context
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05305957 * isWESModeEnabled - WES mode
5958 * sessionId - Session Identifier
5959 * Return QDF_STATUS_SUCCESS - SME update isWESModeEnabled config successfully.
5960 * Other status means SME is failed to update isWESModeEnabled.
5961 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005962
Jeff Johnsonb460dd72018-11-08 10:26:51 -08005963QDF_STATUS sme_update_wes_mode(mac_handle_t mac_handle, bool isWESModeEnabled,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005964 uint8_t sessionId)
5965{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08005966 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305967 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005968
Dustin Brownad06be62019-02-04 14:52:56 -08005969 if (sessionId >= WLAN_MAX_VDEVS) {
Naveen Rawatc36f7eb2016-11-10 20:01:03 -08005970 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
5971 FL("Invalid sme session id: %d"), sessionId);
5972 return QDF_STATUS_E_INVAL;
5973 }
5974
Jeff Johnson01f2c232018-11-21 19:17:44 -08005975 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305976 if (QDF_IS_STATUS_SUCCESS(status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05305977 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005978 "LFR runtime successfully set WES Mode to %d - old value is %d - roam state is %s",
5979 isWESModeEnabled,
Wu Gao51a63562018-11-08 16:29:10 +08005980 mac->mlme_cfg->lfr.wes_mode_enabled,
Jeff Johnson01f2c232018-11-21 19:17:44 -08005981 mac_trace_get_neighbour_roam_state(mac->roam.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005982 neighborRoamInfo
5983 [sessionId].
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05305984 neighborRoamState));
Wu Gao51a63562018-11-08 16:29:10 +08005985 mac->mlme_cfg->lfr.wes_mode_enabled = isWESModeEnabled;
Jeff Johnson01f2c232018-11-21 19:17:44 -08005986 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005987 }
5988
5989 return status;
5990}
5991
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05305992/*
5993 * sme_set_roam_scan_control() -
5994 * Set roam scan control
5995 * This function is called to set roam scan control
5996 * if roam scan control is set to 0, roaming scan cache is cleared
5997 * any value other than 0 is treated as invalid value
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -08005998 * mac_handle: Opaque handle to the global MAC context
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05305999 * sessionId - Session Identifier
6000 * Return QDF_STATUS_SUCCESS - SME update config successfully.
6001 * Other status means SME failure to update
6002 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08006003QDF_STATUS sme_set_roam_scan_control(mac_handle_t mac_handle, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006004 bool roamScanControl)
6005{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08006006 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306007 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006008
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05306009 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006010 TRACE_CODE_SME_RX_HDD_SET_SCANCTRL, NO_SESSION, 0));
Naveen Rawatc36f7eb2016-11-10 20:01:03 -08006011
Dustin Brownad06be62019-02-04 14:52:56 -08006012 if (sessionId >= WLAN_MAX_VDEVS) {
Naveen Rawatc36f7eb2016-11-10 20:01:03 -08006013 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
6014 FL("Invalid sme session id: %d"), sessionId);
6015 return QDF_STATUS_E_INVAL;
6016 }
6017
Jeff Johnson01f2c232018-11-21 19:17:44 -08006018 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306019 if (QDF_IS_STATUS_SUCCESS(status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05306020 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006021 "LFR runtime successfully set roam scan control to %d - old value is %d - roam state is %s",
6022 roamScanControl,
Jeff Johnson01f2c232018-11-21 19:17:44 -08006023 mac->roam.configParam.nRoamScanControl,
6024 mac_trace_get_neighbour_roam_state(mac->roam.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006025 neighborRoamInfo
6026 [sessionId].
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306027 neighborRoamState));
Jeff Johnson01f2c232018-11-21 19:17:44 -08006028 mac->roam.configParam.nRoamScanControl = roamScanControl;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006029 if (0 == roamScanControl) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05306030 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006031 "LFR runtime successfully cleared roam scan cache");
Jeff Johnson01f2c232018-11-21 19:17:44 -08006032 csr_flush_cfg_bg_scan_roam_channel_list(mac,
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306033 sessionId);
Wu Gao51a63562018-11-08 16:29:10 +08006034 if (mac->mlme_cfg->lfr.roam_scan_offload_enabled) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08006035 csr_roam_offload_scan(mac, sessionId,
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306036 ROAM_SCAN_OFFLOAD_UPDATE_CFG,
6037 REASON_FLUSH_CHANNEL_LIST);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006038 }
6039 }
Jeff Johnson01f2c232018-11-21 19:17:44 -08006040 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006041 }
6042 return status;
6043}
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006044
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306045/*
6046 * sme_update_is_fast_roam_ini_feature_enabled() - enable/disable LFR
6047 * support at runtime
6048 * It is used at in the REG_DYNAMIC_VARIABLE macro definition of
6049 * isFastRoamIniFeatureEnabled.
6050 * This is a synchronous call
6051 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08006052 * mac_handle - The handle returned by mac_open.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306053 * sessionId - Session Identifier
6054 * Return QDF_STATUS_SUCCESS - SME update isFastRoamIniFeatureEnabled config
6055 * successfully.
6056 * Other status means SME is failed to update isFastRoamIniFeatureEnabled.
6057 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08006058QDF_STATUS sme_update_is_fast_roam_ini_feature_enabled(mac_handle_t mac_handle,
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306059 uint8_t sessionId, const bool isFastRoamIniFeatureEnabled)
6060{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08006061 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006062
Wu Gao51a63562018-11-08 16:29:10 +08006063 if (mac->mlme_cfg->lfr.lfr_enabled ==
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006064 isFastRoamIniFeatureEnabled) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05306065 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006066 "%s: FastRoam is already enabled or disabled, nothing to do (returning) old(%d) new(%d)",
6067 __func__,
Wu Gao51a63562018-11-08 16:29:10 +08006068 mac->mlme_cfg->lfr.lfr_enabled,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006069 isFastRoamIniFeatureEnabled);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306070 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006071 }
6072
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05306073 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006074 "%s: FastRoamEnabled is changed from %d to %d", __func__,
Wu Gao51a63562018-11-08 16:29:10 +08006075 mac->mlme_cfg->lfr.lfr_enabled,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006076 isFastRoamIniFeatureEnabled);
Wu Gao51a63562018-11-08 16:29:10 +08006077 mac->mlme_cfg->lfr.lfr_enabled = isFastRoamIniFeatureEnabled;
Jeff Johnson01f2c232018-11-21 19:17:44 -08006078 csr_neighbor_roam_update_fast_roaming_enabled(mac, sessionId,
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306079 isFastRoamIniFeatureEnabled);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006080
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306081 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006082}
6083
Mukul Sharma69c44cd2016-09-12 18:33:57 +05306084/**
6085 * sme_config_fast_roaming() - enable/disable LFR support at runtime
Jeff Johnsonc7309062018-11-09 20:59:42 -08006086 * @mac_handle - The handle returned by macOpen.
Mukul Sharma69c44cd2016-09-12 18:33:57 +05306087 * @session_id - Session Identifier
6088 * @is_fast_roam_enabled - flag to enable/disable roaming
6089 *
6090 * When Supplicant issues enabled/disable fast roaming on the basis
6091 * of the Bssid modification in network block (e.g. AutoJoin mode N/W block)
6092 *
6093 * Return: QDF_STATUS
6094 */
6095
Jeff Johnsonc7309062018-11-09 20:59:42 -08006096QDF_STATUS sme_config_fast_roaming(mac_handle_t mac_handle, uint8_t session_id,
Mukul Sharma69c44cd2016-09-12 18:33:57 +05306097 const bool is_fast_roam_enabled)
6098{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08006099 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
gaurank kathpalia14e2f912017-08-31 14:51:45 +05306100 struct csr_roam_session *session = CSR_GET_SESSION(mac_ctx, session_id);
Mukul Sharma69c44cd2016-09-12 18:33:57 +05306101 QDF_STATUS status;
6102
Varun Reddy Yeturue5a35d12017-10-20 11:26:57 -07006103 /*
6104 * supplicant_disabled_roaming flag is set to true in
6105 * wlan_hdd_cfg80211_connect_start when supplicant initiate connect
6106 * request with BSSID. This flag is reset when supplicant sends
6107 * vendor command to enable roaming after association.
Arif Hussaina48a9c02017-01-31 14:37:45 -08006108 *
6109 * This request from wpa_supplicant will be skipped in this function
Varun Reddy Yeturue5a35d12017-10-20 11:26:57 -07006110 * if roaming is disabled using driver command or INI and
6111 * supplicant_disabled_roaming flag remains set. So make sure to set
6112 * supplicant_disabled_roaming flag as per wpa_supplicant even if roam
6113 * request from wpa_supplicant ignored.
Arif Hussaina48a9c02017-01-31 14:37:45 -08006114 */
6115 if (session && session->pCurRoamProfile)
Varun Reddy Yeturue5a35d12017-10-20 11:26:57 -07006116 session->pCurRoamProfile->supplicant_disabled_roaming =
6117 !is_fast_roam_enabled;
Arif Hussaina48a9c02017-01-31 14:37:45 -08006118
Wu Gao51a63562018-11-08 16:29:10 +08006119 if (!mac_ctx->mlme_cfg->lfr.lfr_enabled) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07006120 sme_debug("Fast roam is disabled through ini");
Mukul Sharma69c44cd2016-09-12 18:33:57 +05306121 if (!is_fast_roam_enabled)
6122 return QDF_STATUS_SUCCESS;
6123 return QDF_STATUS_E_FAILURE;
6124 }
Sreelakshmi Konamkibda5bbf2016-09-12 18:38:10 +05306125
Mukul Sharma69c44cd2016-09-12 18:33:57 +05306126 status = csr_neighbor_roam_update_fast_roaming_enabled(mac_ctx,
6127 session_id, is_fast_roam_enabled);
6128 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07006129 sme_err("update fast roaming failed. status: %d", status);
Mukul Sharma69c44cd2016-09-12 18:33:57 +05306130 return QDF_STATUS_E_FAILURE;
6131 }
6132
6133 return QDF_STATUS_SUCCESS;
6134}
6135
Kiran Kumar Lokere7d6e4c92018-09-19 13:45:47 -07006136#ifdef FEATURE_WLAN_ESE
6137int sme_add_key_krk(mac_handle_t mac_handle, uint8_t session_id,
6138 const uint8_t *key, const int key_len)
6139{
6140 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
6141 struct csr_roam_session *session;
6142
6143 if (key_len < SIR_KRK_KEY_LEN) {
6144 sme_warn("Invalid KRK keylength [= %d]", key_len);
6145 return -EINVAL;
6146 }
6147
6148 if (!CSR_IS_SESSION_VALID(mac_ctx, session_id)) {
6149 sme_err("incorrect session/vdev ID");
6150 return -EINVAL;
6151 }
6152
6153 session = CSR_GET_SESSION(mac_ctx, session_id);
6154
6155 qdf_mem_copy(session->eseCckmInfo.krk, key, SIR_KRK_KEY_LEN);
6156 session->eseCckmInfo.reassoc_req_num = 1;
6157 session->eseCckmInfo.krk_plumbed = true;
6158
6159 return 0;
6160}
6161
6162int sme_add_key_btk(mac_handle_t mac_handle, uint8_t session_id,
6163 const uint8_t *key, const int key_len)
6164{
6165 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
6166 struct csr_roam_session *session;
6167
6168 if (key_len < SIR_BTK_KEY_LEN) {
6169 sme_warn("Invalid BTK keylength [= %d]", key_len);
6170 return -EINVAL;
6171 }
6172
6173 if (!CSR_IS_SESSION_VALID(mac_ctx, session_id)) {
6174 sme_err("incorrect session/vdev ID");
6175 return -EINVAL;
6176 }
6177
6178 session = CSR_GET_SESSION(mac_ctx, session_id);
6179
6180 qdf_mem_copy(session->eseCckmInfo.btk, key, SIR_BTK_KEY_LEN);
6181 /*
6182 * KRK and BTK are updated by upper layer back to back. Send
6183 * updated KRK and BTK together to FW here.
6184 */
6185 csr_roam_offload_scan(mac_ctx, session_id,
6186 ROAM_SCAN_OFFLOAD_UPDATE_CFG,
6187 REASON_ROAM_PSK_PMK_CHANGED);
6188
6189 return 0;
6190}
6191#endif
6192
Varun Reddy Yeturu66899fe2017-07-11 14:00:12 -07006193/**
6194 * sme_stop_roaming() - Stop roaming for a given sessionId
6195 * This is a synchronous call
6196 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08006197 * @mac_handle - The handle returned by mac_open
Varun Reddy Yeturu66899fe2017-07-11 14:00:12 -07006198 * @sessionId - Session Identifier
6199 *
6200 * Return QDF_STATUS_SUCCESS on success
6201 * Other status on failure
6202 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08006203QDF_STATUS sme_stop_roaming(mac_handle_t mac_handle, uint8_t session_id,
Jeff Johnson1f2dabc2018-11-07 15:33:01 -08006204 uint8_t reason)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006205{
Naveen Rawat5c35ae42017-04-18 15:35:07 -07006206 struct scheduler_msg wma_msg = {0};
Jeff Johnsonc09caa42018-06-07 22:58:55 -07006207 QDF_STATUS status;
Jeff Johnsone6da4b02019-02-06 22:22:04 -08006208 struct roam_offload_scan_req *req;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08006209 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Varun Reddy Yeturu66899fe2017-07-11 14:00:12 -07006210 tpCsrNeighborRoamControlInfo roam_info;
Varun Reddy Yeturue5a35d12017-10-20 11:26:57 -07006211 struct csr_roam_session *session;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006212
Varun Reddy Yeturu66899fe2017-07-11 14:00:12 -07006213 if (!CSR_IS_SESSION_VALID(mac_ctx, session_id)) {
Naveen Rawat5c35ae42017-04-18 15:35:07 -07006214 sme_err("incorrect session/vdev ID");
6215 return QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006216 }
Varun Reddy Yeturue5a35d12017-10-20 11:26:57 -07006217
6218 session = CSR_GET_SESSION(mac_ctx, session_id);
Abhishek Singh1f217ec2017-12-22 11:48:27 +05306219
Padma, Santhosh Kumar86747ec2018-05-29 18:28:29 +05306220 /*
6221 * set the driver_disabled_roaming flag to true even if roaming
6222 * is not enabled on this session so that roam start requests for
6223 * this session can be blocked until driver enables roaming
6224 */
Vignesh Viswanathan3d478032018-08-02 20:18:53 +05306225 if (reason == ecsr_driver_disabled && session->pCurRoamProfile &&
6226 session->pCurRoamProfile->csrPersona == QDF_STA_MODE) {
Padma, Santhosh Kumar86747ec2018-05-29 18:28:29 +05306227 session->pCurRoamProfile->driver_disabled_roaming = true;
6228 sme_debug("driver_disabled_roaming set for session %d",
6229 session_id);
6230 }
6231
Abhishek Singh1f217ec2017-12-22 11:48:27 +05306232 roam_info = &mac_ctx->roam.neighborRoamInfo[session_id];
6233 if (!roam_info->b_roam_scan_offload_started) {
6234 sme_debug("Roaming already disabled for session %d", session_id);
Varun Reddy Yeturue5a35d12017-10-20 11:26:57 -07006235 return QDF_STATUS_SUCCESS;
6236 }
Naveen Rawat5c35ae42017-04-18 15:35:07 -07006237 req = qdf_mem_malloc(sizeof(*req));
Arif Hussain0ef77082018-10-10 16:42:53 -07006238 if (!req)
Naveen Rawat5c35ae42017-04-18 15:35:07 -07006239 return QDF_STATUS_E_NOMEM;
Naveen Rawat5c35ae42017-04-18 15:35:07 -07006240
6241 req->Command = ROAM_SCAN_OFFLOAD_STOP;
Padma, Santhosh Kumar86747ec2018-05-29 18:28:29 +05306242 if ((reason == eCsrForcedDisassoc) || reason == ecsr_driver_disabled)
Abhishek Singh533c9da2017-05-04 10:23:34 +05306243 req->reason = REASON_ROAM_STOP_ALL;
6244 else
Varun Reddy Yeturubc1bea02018-02-01 18:12:34 -08006245 req->reason = REASON_SME_ISSUED;
Varun Reddy Yeturu66899fe2017-07-11 14:00:12 -07006246 req->sessionId = session_id;
6247 if (csr_neighbor_middle_of_roaming(mac_ctx, session_id))
Naveen Rawat5c35ae42017-04-18 15:35:07 -07006248 req->middle_of_roaming = 1;
6249 else
6250 csr_roam_reset_roam_params(mac_ctx);
6251
6252 wma_msg.type = WMA_ROAM_SCAN_OFFLOAD_REQ;
6253 wma_msg.bodyptr = req;
6254
6255 status = wma_post_ctrl_msg(mac_ctx, &wma_msg);
Jeff Johnsonc09caa42018-06-07 22:58:55 -07006256 if (QDF_STATUS_SUCCESS != status) {
Naveen Rawat5c35ae42017-04-18 15:35:07 -07006257 sme_err("WMA_ROAM_SCAN_OFFLOAD_REQ failed, session_id: %d",
Varun Reddy Yeturu66899fe2017-07-11 14:00:12 -07006258 session_id);
Naveen Rawat5c35ae42017-04-18 15:35:07 -07006259 qdf_mem_free(req);
6260 return QDF_STATUS_E_FAULT;
6261 }
Varun Reddy Yeturu66899fe2017-07-11 14:00:12 -07006262 roam_info->b_roam_scan_offload_started = false;
6263 roam_info->last_sent_cmd = ROAM_SCAN_OFFLOAD_STOP;
Naveen Rawat5c35ae42017-04-18 15:35:07 -07006264
6265 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006266}
6267
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306268/*
6269 * sme_start_roaming() - Start roaming for a given sessionId
6270 * This is a synchronous call
6271 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08006272 * mac_handle - The handle returned by mac_open
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306273 * sessionId - Session Identifier
6274 * Return QDF_STATUS_SUCCESS on success
6275 * Other status on failure
6276 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08006277QDF_STATUS sme_start_roaming(mac_handle_t mac_handle, uint8_t sessionId,
Jeff Johnson1f2dabc2018-11-07 15:33:01 -08006278 uint8_t reason)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006279{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08006280 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306281 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006282
Jeff Johnson01f2c232018-11-21 19:17:44 -08006283 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306284 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08006285 csr_roam_offload_scan(mac, sessionId, ROAM_SCAN_OFFLOAD_START,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006286 reason);
Jeff Johnson01f2c232018-11-21 19:17:44 -08006287 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006288 }
6289
6290 return status;
6291}
6292
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306293/*
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306294 * sme_set_roam_opportunistic_scan_threshold_diff() -
6295 * Update Opportunistic Scan threshold diff
6296 * This function is called through dynamic setConfig callback function
6297 * to configure nOpportunisticThresholdDiff
6298 *
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -08006299 * mac_handle: Opaque handle to the global MAC context
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306300 * sessionId - Session Identifier
6301 * nOpportunisticThresholdDiff - Opportunistic Scan threshold diff
6302 * Return QDF_STATUS_SUCCESS - SME update nOpportunisticThresholdDiff config
6303 * successfully.
6304 * else SME is failed to update nOpportunisticThresholdDiff.
6305 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08006306QDF_STATUS sme_set_roam_opportunistic_scan_threshold_diff(
6307 mac_handle_t mac_handle,
6308 uint8_t sessionId,
6309 const uint8_t nOpportunisticThresholdDiff)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006310{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08006311 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306312 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006313
Jeff Johnson01f2c232018-11-21 19:17:44 -08006314 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306315 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08006316 status = csr_neighbor_roam_update_config(mac, sessionId,
Varun Reddy Yeturuff4feb02016-04-20 12:26:11 -07006317 nOpportunisticThresholdDiff,
6318 REASON_OPPORTUNISTIC_THRESH_DIFF_CHANGED);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306319 if (QDF_IS_STATUS_SUCCESS(status)) {
Wu Gao51a63562018-11-08 16:29:10 +08006320 mac->mlme_cfg->lfr.opportunistic_scan_threshold_diff =
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006321 nOpportunisticThresholdDiff;
6322 }
Jeff Johnson01f2c232018-11-21 19:17:44 -08006323 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006324 }
6325 return status;
6326}
6327
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306328/*
6329 * sme_get_roam_opportunistic_scan_threshold_diff()
6330 * gets Opportunistic Scan threshold diff
6331 * This is a synchronous call
6332 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08006333 * mac_handle - The handle returned by mac_open
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306334 * Return uint8_t - nOpportunisticThresholdDiff
6335 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08006336uint8_t sme_get_roam_opportunistic_scan_threshold_diff(mac_handle_t mac_handle)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006337{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08006338 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306339
Wu Gao51a63562018-11-08 16:29:10 +08006340 return mac->mlme_cfg->lfr.opportunistic_scan_threshold_diff;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006341}
6342
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306343/*
6344 * sme_set_roam_rescan_rssi_diff() - Update roam rescan rssi diff
6345 * This function is called through dynamic setConfig callback function
6346 * to configure nRoamRescanRssiDiff
6347 *
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -08006348 * mac_handle: Opaque handle to the global MAC context
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306349 * sessionId - Session Identifier
6350 * nRoamRescanRssiDiff - roam rescan rssi diff
6351 * Return QDF_STATUS_SUCCESS - SME update nRoamRescanRssiDiff config
6352 * successfully.
6353 * else SME is failed to update nRoamRescanRssiDiff.
6354 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08006355QDF_STATUS sme_set_roam_rescan_rssi_diff(mac_handle_t mac_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006356 uint8_t sessionId,
6357 const uint8_t nRoamRescanRssiDiff)
6358{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08006359 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306360 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006361
Jeff Johnson01f2c232018-11-21 19:17:44 -08006362 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306363 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08006364 status = csr_neighbor_roam_update_config(mac, sessionId,
Varun Reddy Yeturuff4feb02016-04-20 12:26:11 -07006365 nRoamRescanRssiDiff,
6366 REASON_ROAM_RESCAN_RSSI_DIFF_CHANGED);
Wu Gao51a63562018-11-08 16:29:10 +08006367 if (QDF_IS_STATUS_SUCCESS(status))
6368 mac->mlme_cfg->lfr.roam_rescan_rssi_diff =
6369 nRoamRescanRssiDiff;
6370
Jeff Johnson01f2c232018-11-21 19:17:44 -08006371 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006372 }
6373 return status;
6374}
6375
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306376/*
6377 * sme_get_roam_rescan_rssi_diff()
6378 * gets roam rescan rssi diff
6379 * This is a synchronous call
6380 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08006381 * mac_handle - The handle returned by mac_open
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306382 * Return int8_t - nRoamRescanRssiDiff
6383 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08006384uint8_t sme_get_roam_rescan_rssi_diff(mac_handle_t mac_handle)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006385{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08006386 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306387
Wu Gao51a63562018-11-08 16:29:10 +08006388 return mac->mlme_cfg->lfr.roam_rescan_rssi_diff;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006389}
6390
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306391/*
6392 * sme_set_roam_bmiss_first_bcnt() -
6393 * Update Roam count for first beacon miss
6394 * This function is called through dynamic setConfig callback function
6395 * to configure nRoamBmissFirstBcnt
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -08006396 * mac_handle: Opaque handle to the global MAC context
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306397 * sessionId - Session Identifier
6398 * nRoamBmissFirstBcnt - Roam first bmiss count
6399 * Return QDF_STATUS_SUCCESS - SME update nRoamBmissFirstBcnt
6400 * successfully.
6401 * else SME is failed to update nRoamBmissFirstBcnt
6402 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08006403QDF_STATUS sme_set_roam_bmiss_first_bcnt(mac_handle_t mac_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006404 uint8_t sessionId,
6405 const uint8_t nRoamBmissFirstBcnt)
6406{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08006407 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306408 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006409
Jeff Johnson01f2c232018-11-21 19:17:44 -08006410 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306411 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08006412 status = csr_neighbor_roam_update_config(mac, sessionId,
Varun Reddy Yeturuff4feb02016-04-20 12:26:11 -07006413 nRoamBmissFirstBcnt,
6414 REASON_ROAM_BMISS_FIRST_BCNT_CHANGED);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306415 if (QDF_IS_STATUS_SUCCESS(status)) {
Wu Gao51a63562018-11-08 16:29:10 +08006416 mac->mlme_cfg->lfr.roam_bmiss_first_bcnt =
6417 nRoamBmissFirstBcnt;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006418 }
Jeff Johnson01f2c232018-11-21 19:17:44 -08006419 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006420 }
6421 return status;
6422}
6423
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306424/*
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306425 * sme_set_roam_bmiss_final_bcnt() -
6426 * Update Roam count for final beacon miss
6427 * This function is called through dynamic setConfig callback function
6428 * to configure nRoamBmissFinalBcnt
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -08006429 * mac_handle: Opaque handle to the global MAC context
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306430 * sessionId - Session Identifier
6431 * nRoamBmissFinalBcnt - Roam final bmiss count
6432 * Return QDF_STATUS_SUCCESS - SME update nRoamBmissFinalBcnt
6433 * successfully.
6434 * else SME is failed to update nRoamBmissFinalBcnt
6435 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08006436QDF_STATUS sme_set_roam_bmiss_final_bcnt(mac_handle_t mac_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006437 uint8_t sessionId,
6438 const uint8_t nRoamBmissFinalBcnt)
6439{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08006440 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306441 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006442
Jeff Johnson01f2c232018-11-21 19:17:44 -08006443 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306444 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08006445 status = csr_neighbor_roam_update_config(mac, sessionId,
Varun Reddy Yeturuff4feb02016-04-20 12:26:11 -07006446 nRoamBmissFinalBcnt,
6447 REASON_ROAM_BMISS_FINAL_BCNT_CHANGED);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306448 if (QDF_IS_STATUS_SUCCESS(status)) {
Wu Gao51a63562018-11-08 16:29:10 +08006449 mac->mlme_cfg->lfr.roam_bmiss_final_bcnt =
6450 nRoamBmissFinalBcnt;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006451 }
Jeff Johnson01f2c232018-11-21 19:17:44 -08006452 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006453 }
6454 return status;
6455}
6456
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306457/*
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306458 * sme_set_neighbor_lookup_rssi_threshold() - update neighbor lookup
6459 * rssi threshold
6460 * This is a synchronous call
6461 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08006462 * mac_handle - The handle returned by mac_open.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306463 * sessionId - Session Identifier
6464 * Return QDF_STATUS_SUCCESS - SME update config successful.
6465 * Other status means SME is failed to update
6466 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08006467QDF_STATUS sme_set_neighbor_lookup_rssi_threshold(mac_handle_t mac_handle,
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306468 uint8_t sessionId, uint8_t neighborLookupRssiThreshold)
6469{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08006470 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306471 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006472
Jeff Johnson01f2c232018-11-21 19:17:44 -08006473 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306474 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08006475 status = csr_neighbor_roam_update_config(mac,
Varun Reddy Yeturuff4feb02016-04-20 12:26:11 -07006476 sessionId, neighborLookupRssiThreshold,
6477 REASON_LOOKUP_THRESH_CHANGED);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306478 if (QDF_IS_STATUS_SUCCESS(status)) {
Wu Gao51a63562018-11-08 16:29:10 +08006479 mac->mlme_cfg->lfr.neighbor_lookup_rssi_threshold =
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006480 neighborLookupRssiThreshold;
6481 }
Jeff Johnson01f2c232018-11-21 19:17:44 -08006482 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006483 }
6484 return status;
6485}
6486
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306487/*
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306488 * sme_get_neighbor_lookup_rssi_threshold() - get neighbor lookup
6489 * rssi threshold
6490 * This is a synchronous call
6491 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08006492 * mac_handle - The handle returned by mac_open.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306493 * Return QDF_STATUS_SUCCESS - SME update config successful.
6494 * Other status means SME is failed to update
6495 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08006496uint8_t sme_get_neighbor_lookup_rssi_threshold(mac_handle_t mac_handle)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006497{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08006498 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306499
Wu Gao51a63562018-11-08 16:29:10 +08006500 return mac->mlme_cfg->lfr.neighbor_lookup_rssi_threshold;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006501}
6502
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306503/*
6504 * sme_set_neighbor_scan_refresh_period() - set neighbor scan results
6505 * refresh period
6506 * This is a synchronous call
6507 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08006508 * mac_handle - The handle returned by mac_open.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306509 * sessionId - Session Identifier
6510 * Return QDF_STATUS_SUCCESS - SME update config successful.
6511 * Other status means SME is failed to update
6512 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08006513QDF_STATUS sme_set_neighbor_scan_refresh_period(mac_handle_t mac_handle,
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306514 uint8_t sessionId, uint16_t neighborScanResultsRefreshPeriod)
6515{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08006516 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306517 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006518 tpCsrNeighborRoamControlInfo pNeighborRoamInfo = NULL;
6519
Dustin Brownad06be62019-02-04 14:52:56 -08006520 if (sessionId >= WLAN_MAX_VDEVS) {
Naveen Rawatc36f7eb2016-11-10 20:01:03 -08006521 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
6522 FL("Invalid sme session id: %d"), sessionId);
6523 return QDF_STATUS_E_INVAL;
6524 }
6525
Jeff Johnson01f2c232018-11-21 19:17:44 -08006526 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306527 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08006528 pNeighborRoamInfo = &mac->roam.neighborRoamInfo[sessionId];
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05306529 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006530 "LFR runtime successfully set roam scan refresh period to %d- old value is %d - roam state is %s",
6531 neighborScanResultsRefreshPeriod,
Wu Gao51a63562018-11-08 16:29:10 +08006532 mac->mlme_cfg->lfr.
6533 neighbor_scan_results_refresh_period,
Jeff Johnson01f2c232018-11-21 19:17:44 -08006534 mac_trace_get_neighbour_roam_state(mac->roam.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006535 neighborRoamInfo
6536 [sessionId].
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306537 neighborRoamState));
Wu Gao51a63562018-11-08 16:29:10 +08006538 mac->mlme_cfg->lfr.neighbor_scan_results_refresh_period =
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006539 neighborScanResultsRefreshPeriod;
6540 pNeighborRoamInfo->cfgParams.neighborResultsRefreshPeriod =
6541 neighborScanResultsRefreshPeriod;
6542
Wu Gao51a63562018-11-08 16:29:10 +08006543 if (mac->mlme_cfg->lfr.roam_scan_offload_enabled) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08006544 csr_roam_offload_scan(mac, sessionId,
Vignesh Viswanathan4e65e8e2018-05-01 12:04:16 +05306545 ROAM_SCAN_OFFLOAD_UPDATE_CFG,
6546 REASON_NEIGHBOR_SCAN_REFRESH_PERIOD_CHANGED);
6547 }
Jeff Johnson01f2c232018-11-21 19:17:44 -08006548 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006549 }
Vignesh Viswanathan4e65e8e2018-05-01 12:04:16 +05306550
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006551 return status;
6552}
6553
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306554/*
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306555 * sme_get_neighbor_scan_refresh_period() - get neighbor scan results
6556 * refresh period
6557 * This is a synchronous call
6558 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08006559 * \param mac_handle - The handle returned by mac_open.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306560 * \return uint16_t - Neighbor scan results refresh period value
6561 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08006562uint16_t sme_get_neighbor_scan_refresh_period(mac_handle_t mac_handle)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006563{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08006564 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306565
Wu Gao51a63562018-11-08 16:29:10 +08006566 return mac->mlme_cfg->lfr.neighbor_scan_results_refresh_period;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006567}
6568
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306569/*
6570 * sme_get_empty_scan_refresh_period() - get empty scan refresh period
6571 * This is a synchronuous call
6572 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08006573 * mac_handle - The handle returned by mac_open.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306574 * Return QDF_STATUS_SUCCESS - SME update config successful.
6575 * Other status means SME is failed to update
6576 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08006577uint16_t sme_get_empty_scan_refresh_period(mac_handle_t mac_handle)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006578{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08006579 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306580
Wu Gao51a63562018-11-08 16:29:10 +08006581 return mac->mlme_cfg->lfr.empty_scan_refresh_period;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006582}
6583
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306584/*
6585 * sme_update_empty_scan_refresh_period
6586 * Update nEmptyScanRefreshPeriod
6587 * This function is called through dynamic setConfig callback function
6588 * to configure nEmptyScanRefreshPeriod
6589 * Usage: adb shell iwpriv wlan0 setConfig
6590 * nEmptyScanRefreshPeriod=[0 .. 60]
6591 *
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -08006592 * mac_handle: Opaque handle to the global MAC context
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306593 * sessionId - Session Identifier
6594 * nEmptyScanRefreshPeriod - scan period following empty scan results.
6595 * Return Success or failure
6596 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006597
Jeff Johnsonb460dd72018-11-08 10:26:51 -08006598QDF_STATUS sme_update_empty_scan_refresh_period(mac_handle_t mac_handle,
6599 uint8_t sessionId, uint16_t
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306600 nEmptyScanRefreshPeriod)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006601{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08006602 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306603 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006604 tpCsrNeighborRoamControlInfo pNeighborRoamInfo = NULL;
6605
Dustin Brownad06be62019-02-04 14:52:56 -08006606 if (sessionId >= WLAN_MAX_VDEVS) {
Naveen Rawatc36f7eb2016-11-10 20:01:03 -08006607 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
6608 FL("Invalid sme session id: %d"), sessionId);
6609 return QDF_STATUS_E_INVAL;
6610 }
6611
Jeff Johnson01f2c232018-11-21 19:17:44 -08006612 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306613 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08006614 pNeighborRoamInfo = &mac->roam.neighborRoamInfo[sessionId];
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05306615 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006616 "LFR runtime successfully set roam scan period to %d -old value is %d - roam state is %s",
6617 nEmptyScanRefreshPeriod,
Wu Gao51a63562018-11-08 16:29:10 +08006618 mac->mlme_cfg->lfr.empty_scan_refresh_period,
Jeff Johnson01f2c232018-11-21 19:17:44 -08006619 mac_trace_get_neighbour_roam_state(mac->roam.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006620 neighborRoamInfo
6621 [sessionId].
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306622 neighborRoamState));
Wu Gao51a63562018-11-08 16:29:10 +08006623 mac->mlme_cfg->lfr.empty_scan_refresh_period =
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006624 nEmptyScanRefreshPeriod;
6625 pNeighborRoamInfo->cfgParams.emptyScanRefreshPeriod =
6626 nEmptyScanRefreshPeriod;
Vignesh Viswanathan4e65e8e2018-05-01 12:04:16 +05306627
Wu Gao51a63562018-11-08 16:29:10 +08006628 if (mac->mlme_cfg->lfr.roam_scan_offload_enabled) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08006629 csr_roam_offload_scan(mac, sessionId,
Vignesh Viswanathan4e65e8e2018-05-01 12:04:16 +05306630 ROAM_SCAN_OFFLOAD_UPDATE_CFG,
6631 REASON_EMPTY_SCAN_REF_PERIOD_CHANGED);
6632 }
Jeff Johnson01f2c232018-11-21 19:17:44 -08006633 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006634 }
Vignesh Viswanathan4e65e8e2018-05-01 12:04:16 +05306635
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006636 return status;
6637}
6638
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306639/*
6640 * sme_set_neighbor_scan_min_chan_time() -
6641 * Update nNeighborScanMinChanTime
6642 * This function is called through dynamic setConfig callback function
6643 * to configure gNeighborScanChannelMinTime
6644 * Usage: adb shell iwpriv wlan0 setConfig
6645 * gNeighborScanChannelMinTime=[0 .. 60]
6646 *
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -08006647 * mac_handle: Opaque handle to the global MAC context
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306648 * nNeighborScanMinChanTime - Channel minimum dwell time
6649 * sessionId - Session Identifier
6650 * Return Success or failure
6651 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08006652QDF_STATUS sme_set_neighbor_scan_min_chan_time(mac_handle_t mac_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006653 const uint16_t
6654 nNeighborScanMinChanTime,
6655 uint8_t sessionId)
6656{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08006657 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306658 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006659
Dustin Brownad06be62019-02-04 14:52:56 -08006660 if (sessionId >= WLAN_MAX_VDEVS) {
Naveen Rawatc36f7eb2016-11-10 20:01:03 -08006661 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
6662 FL("Invalid sme session id: %d"), sessionId);
6663 return QDF_STATUS_E_INVAL;
6664 }
6665
Jeff Johnson01f2c232018-11-21 19:17:44 -08006666 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306667 if (QDF_IS_STATUS_SUCCESS(status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05306668 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006669 "LFR runtime successfully set channel min dwell time to %d - old value is %d - roam state is %s",
6670 nNeighborScanMinChanTime,
Wu Gao51a63562018-11-08 16:29:10 +08006671 mac->mlme_cfg->lfr.neighbor_scan_min_chan_time,
Jeff Johnson01f2c232018-11-21 19:17:44 -08006672 mac_trace_get_neighbour_roam_state(mac->roam.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006673 neighborRoamInfo
6674 [sessionId].
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306675 neighborRoamState));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006676
Wu Gao51a63562018-11-08 16:29:10 +08006677 mac->mlme_cfg->lfr.neighbor_scan_min_chan_time =
6678 nNeighborScanMinChanTime;
Jeff Johnson01f2c232018-11-21 19:17:44 -08006679 mac->roam.neighborRoamInfo[sessionId].cfgParams.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006680 minChannelScanTime = nNeighborScanMinChanTime;
Jeff Johnson01f2c232018-11-21 19:17:44 -08006681 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006682 }
6683
6684 return status;
6685}
6686
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306687/*
6688 * sme_set_neighbor_scan_max_chan_time() -
6689 * Update nNeighborScanMaxChanTime
6690 * This function is called through dynamic setConfig callback function
6691 * to configure gNeighborScanChannelMaxTime
6692 * Usage: adb shell iwpriv wlan0 setConfig
6693 * gNeighborScanChannelMaxTime=[0 .. 60]
6694 *
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -08006695 * mac_handle: Opaque handle to the global MAC context
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306696 * sessionId - Session Identifier
6697 * nNeighborScanMinChanTime - Channel maximum dwell time
6698 * Return Success or failure
6699 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08006700QDF_STATUS sme_set_neighbor_scan_max_chan_time(mac_handle_t mac_handle,
6701 uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006702 const uint16_t
6703 nNeighborScanMaxChanTime)
6704{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08006705 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306706 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006707 tpCsrNeighborRoamControlInfo pNeighborRoamInfo = NULL;
6708
Dustin Brownad06be62019-02-04 14:52:56 -08006709 if (sessionId >= WLAN_MAX_VDEVS) {
Naveen Rawatc36f7eb2016-11-10 20:01:03 -08006710 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
6711 FL("Invalid sme session id: %d"), sessionId);
6712 return QDF_STATUS_E_INVAL;
6713 }
6714
Jeff Johnson01f2c232018-11-21 19:17:44 -08006715 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306716 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08006717 pNeighborRoamInfo = &mac->roam.neighborRoamInfo[sessionId];
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05306718 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006719 "LFR runtime successfully set channel max dwell time to %d - old value is %d - roam state is %s",
6720 nNeighborScanMaxChanTime,
Wu Gao51a63562018-11-08 16:29:10 +08006721 mac->mlme_cfg->lfr.neighbor_scan_max_chan_time,
Jeff Johnson01f2c232018-11-21 19:17:44 -08006722 mac_trace_get_neighbour_roam_state(mac->roam.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006723 neighborRoamInfo
6724 [sessionId].
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306725 neighborRoamState));
Wu Gao51a63562018-11-08 16:29:10 +08006726 mac->mlme_cfg->lfr.neighbor_scan_max_chan_time =
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006727 nNeighborScanMaxChanTime;
6728 pNeighborRoamInfo->cfgParams.maxChannelScanTime =
6729 nNeighborScanMaxChanTime;
Wu Gao51a63562018-11-08 16:29:10 +08006730 if (mac->mlme_cfg->lfr.roam_scan_offload_enabled) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08006731 csr_roam_offload_scan(mac, sessionId,
Vignesh Viswanathan4e65e8e2018-05-01 12:04:16 +05306732 ROAM_SCAN_OFFLOAD_UPDATE_CFG,
6733 REASON_SCAN_CH_TIME_CHANGED);
6734 }
Jeff Johnson01f2c232018-11-21 19:17:44 -08006735 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006736 }
Vignesh Viswanathan4e65e8e2018-05-01 12:04:16 +05306737
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006738 return status;
6739}
6740
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306741/*
6742 * sme_get_neighbor_scan_min_chan_time() -
6743 * get neighbor scan min channel time
6744 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08006745 * mac_handle - The handle returned by mac_open.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306746 * sessionId - Session Identifier
6747 * Return uint16_t - channel min time value
6748 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08006749uint16_t sme_get_neighbor_scan_min_chan_time(mac_handle_t mac_handle,
Jeff Johnson1f2dabc2018-11-07 15:33:01 -08006750 uint8_t sessionId)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006751{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08006752 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Naveen Rawatc36f7eb2016-11-10 20:01:03 -08006753
Dustin Brownad06be62019-02-04 14:52:56 -08006754 if (sessionId >= WLAN_MAX_VDEVS) {
Naveen Rawatc36f7eb2016-11-10 20:01:03 -08006755 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
6756 FL("Invalid sme session id: %d"), sessionId);
6757 return 0;
6758 }
6759
Jeff Johnson01f2c232018-11-21 19:17:44 -08006760 return mac->roam.neighborRoamInfo[sessionId].cfgParams.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006761 minChannelScanTime;
6762}
6763
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306764/*
6765 * sme_get_neighbor_roam_state() -
6766 * get neighbor roam state
6767 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08006768 * mac_handle - The handle returned by mac_open.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306769 * sessionId - Session Identifier
6770 * Return uint32_t - neighbor roam state
6771 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08006772uint32_t sme_get_neighbor_roam_state(mac_handle_t mac_handle, uint8_t sessionId)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006773{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08006774 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Naveen Rawatc36f7eb2016-11-10 20:01:03 -08006775
Dustin Brownad06be62019-02-04 14:52:56 -08006776 if (sessionId >= WLAN_MAX_VDEVS) {
Naveen Rawatc36f7eb2016-11-10 20:01:03 -08006777 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
6778 FL("Invalid sme session id: %d"), sessionId);
6779 return 0;
6780 }
6781
Jeff Johnson01f2c232018-11-21 19:17:44 -08006782 return mac->roam.neighborRoamInfo[sessionId].neighborRoamState;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006783}
6784
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306785/*
6786 * sme_get_current_roam_state() -
6787 * get current roam state
6788 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08006789 * mac_handle - The handle returned by mac_open.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306790 * sessionId - Session Identifier
6791 * Return uint32_t - current roam state
6792 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08006793uint32_t sme_get_current_roam_state(mac_handle_t mac_handle, uint8_t sessionId)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006794{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08006795 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306796
Jeff Johnson01f2c232018-11-21 19:17:44 -08006797 return mac->roam.curState[sessionId];
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006798}
6799
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306800/*
6801 * sme_get_current_roam_sub_state() -
6802 * \brief get neighbor roam sub state
6803 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08006804 * mac_handle - The handle returned by mac_open.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306805 * sessionId - Session Identifier
6806 * Return uint32_t - current roam sub state
6807 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08006808uint32_t sme_get_current_roam_sub_state(mac_handle_t mac_handle,
6809 uint8_t sessionId)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006810{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08006811 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306812
Jeff Johnson01f2c232018-11-21 19:17:44 -08006813 return mac->roam.curSubState[sessionId];
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006814}
6815
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306816/*
6817 * sme_get_lim_sme_state() -
6818 * get Lim Sme state
6819 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08006820 * mac_handle - The handle returned by mac_open.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306821 * Return uint32_t - Lim Sme state
6822 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08006823uint32_t sme_get_lim_sme_state(mac_handle_t mac_handle)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006824{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08006825 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306826
Jeff Johnson01f2c232018-11-21 19:17:44 -08006827 return mac->lim.gLimSmeState;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006828}
6829
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306830/*
6831 * sme_get_lim_mlm_state() -
6832 * get Lim Mlm state
6833 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08006834 * mac_handle - The handle returned by mac_open.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306835 * Return uint32_t - Lim Mlm state
6836 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08006837uint32_t sme_get_lim_mlm_state(mac_handle_t mac_handle)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006838{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08006839 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306840
Jeff Johnson01f2c232018-11-21 19:17:44 -08006841 return mac->lim.gLimMlmState;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006842}
6843
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306844/*
6845 * sme_is_lim_session_valid() -
6846 * is Lim session valid
6847 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08006848 * mac_handle - The handle returned by mac_open.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306849 * sessionId - Session Identifier
6850 * Return bool - true or false
6851 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08006852bool sme_is_lim_session_valid(mac_handle_t mac_handle, uint8_t sessionId)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006853{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08006854 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Hanumantha Reddy Pothula589fd702015-11-17 15:25:16 +05306855
Jeff Johnson01f2c232018-11-21 19:17:44 -08006856 if (sessionId > mac->lim.maxBssId)
Hanumantha Reddy Pothula589fd702015-11-17 15:25:16 +05306857 return false;
6858
Jeff Johnson01f2c232018-11-21 19:17:44 -08006859 return mac->lim.gpSession[sessionId].valid;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006860}
6861
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306862/*
6863 * sme_get_lim_sme_session_state() -
6864 * get Lim Sme session state
6865 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08006866 * mac_handle - The handle returned by mac_open.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306867 * sessionId - Session Identifier
6868 * Return uint32_t - Lim Sme session state
6869 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08006870uint32_t sme_get_lim_sme_session_state(mac_handle_t mac_handle,
6871 uint8_t sessionId)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006872{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08006873 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306874
Jeff Johnson01f2c232018-11-21 19:17:44 -08006875 return mac->lim.gpSession[sessionId].limSmeState;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006876}
6877
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306878/*
6879 * sme_get_lim_mlm_session_state() -
6880 * \brief get Lim Mlm session state
6881 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08006882 * mac_handle - The handle returned by mac_open.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306883 * sessionId - Session Identifier
6884 * Return uint32_t - Lim Mlm session state
6885 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08006886uint32_t sme_get_lim_mlm_session_state(mac_handle_t mac_handle,
6887 uint8_t sessionId)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006888{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08006889 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306890
Jeff Johnson01f2c232018-11-21 19:17:44 -08006891 return mac->lim.gpSession[sessionId].limMlmState;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006892}
6893
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306894/*
6895 * sme_get_neighbor_scan_max_chan_time() -
6896 * get neighbor scan max channel time
6897 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08006898 * mac_handle - The handle returned by mac_open.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306899 * sessionId - Session Identifier
6900 * Return uint16_t - channel max time value
6901 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08006902uint16_t sme_get_neighbor_scan_max_chan_time(mac_handle_t mac_handle,
Jeff Johnson1f2dabc2018-11-07 15:33:01 -08006903 uint8_t sessionId)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006904{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08006905 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Naveen Rawatc36f7eb2016-11-10 20:01:03 -08006906
Dustin Brownad06be62019-02-04 14:52:56 -08006907 if (sessionId >= WLAN_MAX_VDEVS) {
Naveen Rawatc36f7eb2016-11-10 20:01:03 -08006908 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
6909 FL("Invalid sme session id: %d"), sessionId);
6910 return 0;
6911 }
6912
Jeff Johnson01f2c232018-11-21 19:17:44 -08006913 return mac->roam.neighborRoamInfo[sessionId].cfgParams.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006914 maxChannelScanTime;
6915}
6916
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306917/*
6918 * sme_set_neighbor_scan_period() -
6919 * Update nNeighborScanPeriod
6920 * This function is called through dynamic setConfig callback function
6921 * to configure nNeighborScanPeriod
6922 * Usage: adb shell iwpriv wlan0 setConfig
6923 * nNeighborScanPeriod=[0 .. 1000]
6924 *
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -08006925 * mac_handle: Opaque handle to the global MAC context
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306926 * sessionId - Session Identifier
6927 * nNeighborScanPeriod - neighbor scan period
6928 * Return Success or failure
6929 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08006930QDF_STATUS sme_set_neighbor_scan_period(mac_handle_t mac_handle,
6931 uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006932 const uint16_t nNeighborScanPeriod)
6933{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08006934 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306935 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006936 tpCsrNeighborRoamControlInfo pNeighborRoamInfo = NULL;
6937
Dustin Brownad06be62019-02-04 14:52:56 -08006938 if (sessionId >= WLAN_MAX_VDEVS) {
Naveen Rawatc36f7eb2016-11-10 20:01:03 -08006939 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
6940 FL("Invalid sme session id: %d"), sessionId);
6941 return QDF_STATUS_E_INVAL;
6942 }
6943
Jeff Johnson01f2c232018-11-21 19:17:44 -08006944 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306945 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08006946 pNeighborRoamInfo = &mac->roam.neighborRoamInfo[sessionId];
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05306947 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306948 "LFR runtime successfully set neighbor scan period to %d - old value is %d - roam state is %s",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006949 nNeighborScanPeriod,
Wu Gao51a63562018-11-08 16:29:10 +08006950 mac->mlme_cfg->lfr.neighbor_scan_timer_period,
Jeff Johnson01f2c232018-11-21 19:17:44 -08006951 mac_trace_get_neighbour_roam_state(mac->roam.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006952 neighborRoamInfo
6953 [sessionId].
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306954 neighborRoamState));
Wu Gao51a63562018-11-08 16:29:10 +08006955 mac->mlme_cfg->lfr.neighbor_scan_timer_period =
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006956 nNeighborScanPeriod;
6957 pNeighborRoamInfo->cfgParams.neighborScanPeriod =
6958 nNeighborScanPeriod;
Vignesh Viswanathan4e65e8e2018-05-01 12:04:16 +05306959
Wu Gao51a63562018-11-08 16:29:10 +08006960 if (mac->mlme_cfg->lfr.roam_scan_offload_enabled) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08006961 csr_roam_offload_scan(mac, sessionId,
Vignesh Viswanathan4e65e8e2018-05-01 12:04:16 +05306962 ROAM_SCAN_OFFLOAD_UPDATE_CFG,
6963 REASON_SCAN_HOME_TIME_CHANGED);
6964 }
Jeff Johnson01f2c232018-11-21 19:17:44 -08006965 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006966 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006967
6968 return status;
6969}
6970
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306971/*
6972 * sme_get_neighbor_scan_period() -
6973 * get neighbor scan period
6974 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08006975 * mac_handle - The handle returned by mac_open.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306976 * sessionId - Session Identifier
6977 * Return uint16_t - neighbor scan period
6978 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08006979uint16_t sme_get_neighbor_scan_period(mac_handle_t mac_handle,
6980 uint8_t sessionId)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006981{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08006982 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Naveen Rawatc36f7eb2016-11-10 20:01:03 -08006983
Dustin Brownad06be62019-02-04 14:52:56 -08006984 if (sessionId >= WLAN_MAX_VDEVS) {
Naveen Rawatc36f7eb2016-11-10 20:01:03 -08006985 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
6986 FL("Invalid sme session id: %d"), sessionId);
6987 return 0;
6988 }
6989
Jeff Johnson01f2c232018-11-21 19:17:44 -08006990 return mac->roam.neighborRoamInfo[sessionId].cfgParams.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006991 neighborScanPeriod;
6992}
6993
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306994/*
6995 * sme_get_roam_rssi_diff() - get Roam rssi diff
6996 * This is a synchronous call
6997 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08006998 * mac_handle - The handle returned by mac_open.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306999 * Return uint16_t - Rssi diff value
7000 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007001uint8_t sme_get_roam_rssi_diff(mac_handle_t mac_handle)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007002{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08007003 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307004
Wu Gao51a63562018-11-08 16:29:10 +08007005 return mac->mlme_cfg->lfr.roam_rssi_diff;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007006}
7007
7008/**
7009 * sme_change_roam_scan_channel_list() - to change scan channel list
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -08007010 * @mac_handle: Opaque handle to the global MAC context
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007011 * @sessionId: sme session id
7012 * @pChannelList: Output channel list
7013 * @numChannels: Output number of channels
7014 *
7015 * This routine is called to Change roam scan channel list.
7016 * This is a synchronous call
7017 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307018 * Return: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007019 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007020QDF_STATUS sme_change_roam_scan_channel_list(mac_handle_t mac_handle,
Jeff Johnson1f2dabc2018-11-07 15:33:01 -08007021 uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007022 uint8_t *pChannelList,
7023 uint8_t numChannels)
7024{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08007025 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307026 QDF_STATUS status = QDF_STATUS_SUCCESS;
Naveen Rawatc36f7eb2016-11-10 20:01:03 -08007027 tpCsrNeighborRoamControlInfo pNeighborRoamInfo = NULL;
Wu Gao0821b0d2019-01-11 17:31:11 +08007028 uint8_t oldChannelList[CFG_VALID_CHANNEL_LIST_LEN * 2] = { 0 };
7029 uint8_t newChannelList[CFG_VALID_CHANNEL_LIST_LEN * 2] = { 0 };
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007030 uint8_t i = 0, j = 0;
7031 tCsrChannelInfo *chan_info;
7032
Dustin Brownad06be62019-02-04 14:52:56 -08007033 if (sessionId >= WLAN_MAX_VDEVS) {
Naveen Rawatc36f7eb2016-11-10 20:01:03 -08007034 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
7035 FL("Invalid sme session id: %d"), sessionId);
7036 return QDF_STATUS_E_INVAL;
7037 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007038
Jeff Johnson01f2c232018-11-21 19:17:44 -08007039 pNeighborRoamInfo = &mac->roam.neighborRoamInfo[sessionId];
7040 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307041 if (!QDF_IS_STATUS_SUCCESS(status)) {
Vignesh Viswanathan4e65e8e2018-05-01 12:04:16 +05307042 sme_err("Failed to acquire SME lock");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007043 return status;
7044 }
7045 chan_info = &pNeighborRoamInfo->cfgParams.channelInfo;
7046
7047 if (NULL != chan_info->ChannelList) {
7048 for (i = 0; i < chan_info->numOfChannels; i++) {
7049 if (j < sizeof(oldChannelList))
7050 j += snprintf(oldChannelList + j,
7051 sizeof(oldChannelList) -
7052 j, "%d",
7053 chan_info->ChannelList[i]);
7054 else
7055 break;
7056 }
7057 }
Jeff Johnson01f2c232018-11-21 19:17:44 -08007058 csr_flush_cfg_bg_scan_roam_channel_list(mac, sessionId);
7059 csr_create_bg_scan_roam_channel_list(mac, sessionId, pChannelList,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007060 numChannels);
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007061 sme_set_roam_scan_control(mac_handle, sessionId, 1);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007062 if (NULL != chan_info->ChannelList) {
7063 j = 0;
7064 for (i = 0; i < chan_info->numOfChannels; i++) {
7065 if (j < sizeof(newChannelList))
7066 j += snprintf(newChannelList + j,
7067 sizeof(newChannelList) -
7068 j, " %d",
7069 chan_info->ChannelList[i]);
7070 else
7071 break;
7072 }
7073 }
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05307074 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307075 "LFR runtime successfully set roam scan channels to %s - old value is %s - roam state is %d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007076 newChannelList, oldChannelList,
Jeff Johnson01f2c232018-11-21 19:17:44 -08007077 mac->roam.neighborRoamInfo[sessionId].neighborRoamState);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007078
Wu Gao51a63562018-11-08 16:29:10 +08007079 if (mac->mlme_cfg->lfr.roam_scan_offload_enabled)
Jeff Johnson01f2c232018-11-21 19:17:44 -08007080 csr_roam_offload_scan(mac, sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007081 ROAM_SCAN_OFFLOAD_UPDATE_CFG,
7082 REASON_CHANNEL_LIST_CHANGED);
Vignesh Viswanathan4e65e8e2018-05-01 12:04:16 +05307083
Jeff Johnson01f2c232018-11-21 19:17:44 -08007084 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007085 return status;
7086}
7087
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007088/**
7089 * sme_get_roam_scan_channel_list() - To get roam scan channel list
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -08007090 * @mac_handle: Opaque handle to the global MAC context
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007091 * @pChannelList: Output channel list
7092 * @pNumChannels: Output number of channels
7093 * @sessionId: Session Identifier
7094 *
7095 * To get roam scan channel list This is a synchronous call
7096 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307097 * Return: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007098 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007099QDF_STATUS sme_get_roam_scan_channel_list(mac_handle_t mac_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007100 uint8_t *pChannelList, uint8_t *pNumChannels,
7101 uint8_t sessionId)
7102{
7103 int i = 0;
7104 uint8_t *pOutPtr = pChannelList;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08007105 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Naveen Rawatc36f7eb2016-11-10 20:01:03 -08007106 tpCsrNeighborRoamControlInfo pNeighborRoamInfo = NULL;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307107 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007108
Dustin Brownad06be62019-02-04 14:52:56 -08007109 if (sessionId >= WLAN_MAX_VDEVS) {
Naveen Rawatc36f7eb2016-11-10 20:01:03 -08007110 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
7111 FL("Invalid sme session id: %d"), sessionId);
7112 return QDF_STATUS_E_INVAL;
7113 }
7114
Jeff Johnson01f2c232018-11-21 19:17:44 -08007115 pNeighborRoamInfo = &mac->roam.neighborRoamInfo[sessionId];
7116 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307117 if (!QDF_IS_STATUS_SUCCESS(status))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007118 return status;
7119 if (NULL == pNeighborRoamInfo->cfgParams.channelInfo.ChannelList) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05307120 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_WARN,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007121 FL("Roam Scan channel list is NOT yet initialized"));
7122 *pNumChannels = 0;
Jeff Johnson01f2c232018-11-21 19:17:44 -08007123 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007124 return status;
7125 }
7126
7127 *pNumChannels = pNeighborRoamInfo->cfgParams.channelInfo.numOfChannels;
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307128 for (i = 0; i < (*pNumChannels); i++)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007129 pOutPtr[i] =
7130 pNeighborRoamInfo->cfgParams.channelInfo.ChannelList[i];
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307131
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007132 pOutPtr[i] = '\0';
Jeff Johnson01f2c232018-11-21 19:17:44 -08007133 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007134 return status;
7135}
7136
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307137/*
7138 * sme_get_is_ese_feature_enabled() - get ESE feature enabled or not
7139 * This is a synchronuous call
7140 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007141 * mac_handle - The handle returned by mac_open.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307142 * Return true (1) - if the ESE feature is enabled
7143 * false (0) - if feature is disabled (compile or runtime)
7144 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007145bool sme_get_is_ese_feature_enabled(mac_handle_t mac_handle)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007146{
7147#ifdef FEATURE_WLAN_ESE
Jeff Johnson0a8786a2018-12-02 10:49:01 -08007148 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307149
Jeff Johnson01f2c232018-11-21 19:17:44 -08007150 return csr_roam_is_ese_ini_feature_enabled(mac);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007151#else
7152 return false;
7153#endif
7154}
7155
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307156/*
7157 * sme_get_wes_mode() - get WES Mode
7158 * This is a synchronous call
7159 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007160 * mac_handle - The handle returned by mac_open
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307161 * Return uint8_t - WES Mode Enabled(1)/Disabled(0)
7162 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007163bool sme_get_wes_mode(mac_handle_t mac_handle)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007164{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08007165 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307166
Wu Gao51a63562018-11-08 16:29:10 +08007167 return mac->mlme_cfg->lfr.wes_mode_enabled;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007168}
7169
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307170/*
7171 * sme_get_roam_scan_control() - get scan control
7172 * This is a synchronous call
7173 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007174 * mac_handle - The handle returned by mac_open.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307175 * Return bool - Enabled(1)/Disabled(0)
7176 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007177bool sme_get_roam_scan_control(mac_handle_t mac_handle)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007178{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08007179 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307180
Jeff Johnson01f2c232018-11-21 19:17:44 -08007181 return mac->roam.configParam.nRoamScanControl;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007182}
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007183
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307184/*
7185 * sme_get_is_lfr_feature_enabled() - get LFR feature enabled or not
7186 * This is a synchronuous call
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007187 * mac_handle - The handle returned by mac_open.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307188 * Return true (1) - if the feature is enabled
7189 * false (0) - if feature is disabled (compile or runtime)
7190 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007191bool sme_get_is_lfr_feature_enabled(mac_handle_t mac_handle)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007192{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08007193 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307194
Wu Gao51a63562018-11-08 16:29:10 +08007195 return mac->mlme_cfg->lfr.lfr_enabled;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007196}
7197
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307198/*
7199 * sme_get_is_ft_feature_enabled() - get FT feature enabled or not
7200 * This is a synchronuous call
7201 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007202 * mac_handle - The handle returned by mac_open.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307203 * Return true (1) - if the feature is enabled
7204 * false (0) - if feature is disabled (compile or runtime)
7205 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007206bool sme_get_is_ft_feature_enabled(mac_handle_t mac_handle)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007207{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08007208 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307209
Wu Gao51a63562018-11-08 16:29:10 +08007210 return mac->mlme_cfg->lfr.fast_transition_enabled;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007211}
7212
Krishna Kumaar Natarajand0bbb3c2017-03-13 17:04:58 -07007213/**
7214 * sme_is_feature_supported_by_fw() - check if feature is supported by FW
7215 * @feature: enum value of requested feature.
7216 *
7217 * Retrun: 1 if supported; 0 otherwise
7218 */
7219bool sme_is_feature_supported_by_fw(enum cap_bitmap feature)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007220{
Krishna Kumaar Natarajand0bbb3c2017-03-13 17:04:58 -07007221 return IS_FEATURE_SUPPORTED_BY_FW(feature);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007222}
7223
Jeff Johnsone943bca2019-02-08 22:45:17 -08007224QDF_STATUS sme_get_link_speed(mac_handle_t mac_handle,
7225 struct link_speed_info *req,
7226 void *context,
7227 sme_link_speed_cb cb)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007228{
Jeff Johnsone943bca2019-02-08 22:45:17 -08007229 QDF_STATUS status;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08007230 struct mac_context *mac;
Mukul Sharmac3886aa2017-05-04 17:53:22 +05307231 void *wma_handle;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007232
Jeff Johnsone943bca2019-02-08 22:45:17 -08007233 if (!mac_handle || !cb || !req) {
Jeff Johnsona5317a62017-01-26 08:51:25 -08007234 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
7235 FL("Invalid parameter"));
7236 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007237 }
Jeff Johnsona5317a62017-01-26 08:51:25 -08007238
Mukul Sharmac3886aa2017-05-04 17:53:22 +05307239 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
7240 if (!wma_handle) {
7241 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
7242 "wma handle is NULL");
7243 return QDF_STATUS_E_FAILURE;
7244 }
7245
Jeff Johnsona0619e42018-11-28 17:43:00 -08007246 mac = MAC_CONTEXT(mac_handle);
Jeff Johnson01f2c232018-11-21 19:17:44 -08007247 status = sme_acquire_global_lock(&mac->sme);
Jeff Johnsona5317a62017-01-26 08:51:25 -08007248 if (QDF_STATUS_SUCCESS != status) {
Srinivas Girigowda2c263352017-03-17 17:49:53 -07007249 sme_err("Failed to acquire global lock");
Jeff Johnsona5317a62017-01-26 08:51:25 -08007250 return QDF_STATUS_E_FAILURE;
7251 }
7252
Jeff Johnsone943bca2019-02-08 22:45:17 -08007253 mac->sme.link_speed_context = context;
7254 mac->sme.link_speed_cb = cb;
7255 status = wma_get_link_speed(wma_handle, req);
Jeff Johnson01f2c232018-11-21 19:17:44 -08007256 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007257 return status;
7258}
7259
Jeff Johnson0a8786a2018-12-02 10:49:01 -08007260QDF_STATUS sme_get_peer_stats(struct mac_context *mac,
Ashish Kumar Dhanotiya443d31f2017-10-13 12:41:19 +05307261 struct sir_peer_info_req req)
7262{
7263 QDF_STATUS qdf_status;
7264 struct scheduler_msg message = {0};
7265
7266 qdf_status = sme_acquire_global_lock(&mac->sme);
7267 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
7268 sme_debug("Failed to get Lock");
7269 return qdf_status;
7270 }
7271 /* serialize the req through MC thread */
7272 message.bodyptr = qdf_mem_malloc(sizeof(req));
Arif Hussain0ef77082018-10-10 16:42:53 -07007273 if (!message.bodyptr) {
Ashish Kumar Dhanotiya443d31f2017-10-13 12:41:19 +05307274 sme_release_global_lock(&mac->sme);
7275 return QDF_STATUS_E_NOMEM;
7276 }
7277 qdf_mem_copy(message.bodyptr, &req, sizeof(req));
7278 message.type = WMA_GET_PEER_INFO;
7279 message.reserved = 0;
gaurank kathpalia36b0c582018-08-28 17:45:43 +05307280 qdf_status = scheduler_post_message(QDF_MODULE_ID_SME,
7281 QDF_MODULE_ID_WMA,
7282 QDF_MODULE_ID_WMA, &message);
Ashish Kumar Dhanotiya443d31f2017-10-13 12:41:19 +05307283 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
7284 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
7285 "%s: Post get peer info msg fail", __func__);
7286 qdf_mem_free(message.bodyptr);
7287 qdf_status = QDF_STATUS_E_FAILURE;
7288 }
7289 sme_release_global_lock(&mac->sme);
7290 return qdf_status;
7291}
7292
Jeff Johnsonc7309062018-11-09 20:59:42 -08007293QDF_STATUS
7294sme_get_peer_info(mac_handle_t mac_handle,
7295 struct sir_peer_info_req req,
7296 void *context,
7297 void (*callbackfn)(struct sir_peer_info_resp *param,
7298 void *pcontext))
Will Huang558f8082017-05-31 16:22:24 +08007299{
7300
7301 QDF_STATUS status;
7302 QDF_STATUS qdf_status;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08007303 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Rajeev Kumar658e8492017-12-13 11:35:41 -08007304 struct scheduler_msg message = {0};
Will Huang558f8082017-05-31 16:22:24 +08007305
7306 status = sme_acquire_global_lock(&mac->sme);
7307 if (QDF_STATUS_SUCCESS == status) {
7308 if (NULL == callbackfn) {
7309 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
7310 "%s: Indication Call back is NULL",
7311 __func__);
7312 sme_release_global_lock(&mac->sme);
7313 return QDF_STATUS_E_FAILURE;
7314 }
7315
7316 mac->sme.pget_peer_info_ind_cb = callbackfn;
7317 mac->sme.pget_peer_info_cb_context = context;
7318
7319 /* serialize the req through MC thread */
7320 message.bodyptr = qdf_mem_malloc(sizeof(req));
Arif Hussain0ef77082018-10-10 16:42:53 -07007321 if (!message.bodyptr) {
Will Huang558f8082017-05-31 16:22:24 +08007322 sme_release_global_lock(&mac->sme);
7323 return QDF_STATUS_E_NOMEM;
7324 }
7325 qdf_mem_copy(message.bodyptr, &req, sizeof(req));
7326 message.type = WMA_GET_PEER_INFO;
Ashish Kumar Dhanotiya443d31f2017-10-13 12:41:19 +05307327 message.reserved = 0;
gaurank kathpalia36b0c582018-08-28 17:45:43 +05307328 qdf_status = scheduler_post_message(QDF_MODULE_ID_SME,
7329 QDF_MODULE_ID_WMA,
7330 QDF_MODULE_ID_WMA,
7331 &message);
Will Huang558f8082017-05-31 16:22:24 +08007332 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
7333 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
7334 "%s: Post get peer info msg fail", __func__);
7335 qdf_mem_free(message.bodyptr);
7336 status = QDF_STATUS_E_FAILURE;
7337 }
7338 sme_release_global_lock(&mac->sme);
7339 }
7340 return status;
7341}
7342
Jeff Johnsonc7309062018-11-09 20:59:42 -08007343QDF_STATUS sme_get_peer_info_ext(mac_handle_t mac_handle,
Will Huang558f8082017-05-31 16:22:24 +08007344 struct sir_peer_info_ext_req *req,
7345 void *context,
7346 void (*callbackfn)(struct sir_peer_info_ext_resp *param,
7347 void *pcontext))
7348{
7349 QDF_STATUS status;
7350 QDF_STATUS qdf_status;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08007351 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Rajeev Kumar658e8492017-12-13 11:35:41 -08007352 struct scheduler_msg message = {0};
Will Huang558f8082017-05-31 16:22:24 +08007353
7354 status = sme_acquire_global_lock(&mac->sme);
7355 if (QDF_STATUS_SUCCESS == status) {
7356 if (NULL == callbackfn) {
7357 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
7358 "%s: Indication Call back is NULL",
7359 __func__);
7360 sme_release_global_lock(&mac->sme);
7361 return QDF_STATUS_E_FAILURE;
7362 }
7363
7364 mac->sme.pget_peer_info_ext_ind_cb = callbackfn;
7365 mac->sme.pget_peer_info_ext_cb_context = context;
7366
7367 /* serialize the req through MC thread */
7368 message.bodyptr =
7369 qdf_mem_malloc(sizeof(struct sir_peer_info_ext_req));
Arif Hussain0ef77082018-10-10 16:42:53 -07007370 if (!message.bodyptr) {
Will Huang558f8082017-05-31 16:22:24 +08007371 sme_release_global_lock(&mac->sme);
7372 return QDF_STATUS_E_NOMEM;
7373 }
7374 qdf_mem_copy(message.bodyptr,
7375 req,
7376 sizeof(struct sir_peer_info_ext_req));
7377 message.type = WMA_GET_PEER_INFO_EXT;
gaurank kathpalia36b0c582018-08-28 17:45:43 +05307378 qdf_status = scheduler_post_message(QDF_MODULE_ID_SME,
7379 QDF_MODULE_ID_WMA,
7380 QDF_MODULE_ID_WMA,
7381 &message);
Will Huang558f8082017-05-31 16:22:24 +08007382 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
7383 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
7384 "%s: Post get rssi msg fail", __func__);
7385 qdf_mem_free(message.bodyptr);
7386 status = QDF_STATUS_E_FAILURE;
7387 }
7388 sme_release_global_lock(&mac->sme);
7389 }
7390 return status;
7391}
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007392
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007393/*convert the ini value to the ENUM used in csr and MAC for CB state*/
7394ePhyChanBondState sme_get_cb_phy_state_from_cb_ini_value(uint32_t cb_ini_value)
7395{
7396 return csr_convert_cb_ini_value_to_phy_cb_state(cb_ini_value);
7397}
7398
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007399void sme_set_curr_device_mode(mac_handle_t mac_handle,
Jeff Johnson5a6a0c92019-02-17 16:12:02 -08007400 enum QDF_OPMODE curr_device_mode)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007401{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08007402 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307403
Jeff Johnson5a6a0c92019-02-17 16:12:02 -08007404 mac->sme.curr_device_mode = curr_device_mode;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007405}
7406
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307407/*
7408 * sme_handoff_request() - a wrapper function to Request a handoff from CSR.
7409 * This is a synchronous call
7410 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007411 * mac_handle - The handle returned by mac_open
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307412 * sessionId - Session Identifier
7413 * pHandoffInfo - info provided by HDD with the handoff request (namely:
7414 * BSSID, channel etc.)
7415 * Return QDF_STATUS_SUCCESS - SME passed the request to CSR successfully.
7416 * Other status means SME is failed to send the request.
7417 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007418
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007419QDF_STATUS sme_handoff_request(mac_handle_t mac_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007420 uint8_t sessionId,
7421 tCsrHandoffRequest *pHandoffInfo)
7422{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08007423 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307424 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007425
Jeff Johnson01f2c232018-11-21 19:17:44 -08007426 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307427 if (QDF_IS_STATUS_SUCCESS(status)) {
Abhishek Singhe4a1f882017-08-10 17:59:44 +05307428 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007429 "%s: invoked", __func__);
Jeff Johnson01f2c232018-11-21 19:17:44 -08007430 status = csr_handoff_request(mac, sessionId, pHandoffInfo);
7431 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007432 }
7433
7434 return status;
7435}
7436
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007437/**
7438 * sme_add_periodic_tx_ptrn() - Add Periodic TX Pattern
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -08007439 * @mac_handle: Opaque handle to the global MAC context
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007440 * @addPeriodicTxPtrnParams: request message
7441 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307442 * Return: QDF_STATUS enumeration
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007443 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307444QDF_STATUS
Jeff Johnsonc7309062018-11-09 20:59:42 -08007445sme_add_periodic_tx_ptrn(mac_handle_t mac_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007446 struct sSirAddPeriodicTxPtrn *addPeriodicTxPtrnParams)
7447{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307448 QDF_STATUS status = QDF_STATUS_SUCCESS;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08007449 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007450 struct sSirAddPeriodicTxPtrn *req_msg;
Rajeev Kumar37d478b2017-04-17 16:59:28 -07007451 struct scheduler_msg msg = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007452
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07007453 SME_ENTER();
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007454
Anurag Chouhan600c3a02016-03-01 10:33:54 +05307455 req_msg = qdf_mem_malloc(sizeof(*req_msg));
Arif Hussain0ef77082018-10-10 16:42:53 -07007456 if (!req_msg)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307457 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007458
7459 *req_msg = *addPeriodicTxPtrnParams;
7460
7461 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307462 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07007463 sme_err("sme_acquire_global_lock failed!(status=%d)",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007464 status);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05307465 qdf_mem_free(req_msg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007466 return status;
7467 }
7468
7469 /* Serialize the req through MC thread */
7470 msg.bodyptr = req_msg;
7471 msg.type = WMA_ADD_PERIODIC_TX_PTRN_IND;
Sreelakshmi Konamki6a065362016-05-31 16:05:01 +05307472 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
7473 NO_SESSION, msg.type));
gaurank kathpalia36b0c582018-08-28 17:45:43 +05307474 status = scheduler_post_message(QDF_MODULE_ID_SME,
7475 QDF_MODULE_ID_WMA,
7476 QDF_MODULE_ID_WMA, &msg);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307477 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07007478 sme_err("scheduler_post_msg failed!(err=%d)",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007479 status);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05307480 qdf_mem_free(req_msg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007481 }
7482 sme_release_global_lock(&mac->sme);
7483 return status;
7484}
7485
7486/**
7487 * sme_del_periodic_tx_ptrn() - Delete Periodic TX Pattern
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -08007488 * @mac_handle: Opaque handle to the global MAC context
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007489 * @delPeriodicTxPtrnParams: request message
7490 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307491 * Return: QDF_STATUS enumeration
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007492 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307493QDF_STATUS
Jeff Johnsonc7309062018-11-09 20:59:42 -08007494sme_del_periodic_tx_ptrn(mac_handle_t mac_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007495 struct sSirDelPeriodicTxPtrn *delPeriodicTxPtrnParams)
7496{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307497 QDF_STATUS status = QDF_STATUS_SUCCESS;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08007498 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007499 struct sSirDelPeriodicTxPtrn *req_msg;
Rajeev Kumar37d478b2017-04-17 16:59:28 -07007500 struct scheduler_msg msg = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007501
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07007502 SME_ENTER();
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007503
Anurag Chouhan600c3a02016-03-01 10:33:54 +05307504 req_msg = qdf_mem_malloc(sizeof(*req_msg));
Arif Hussain0ef77082018-10-10 16:42:53 -07007505 if (!req_msg)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307506 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007507
7508 *req_msg = *delPeriodicTxPtrnParams;
7509
7510 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307511 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07007512 sme_err("sme_acquire_global_lock failed!(status=%d)",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007513 status);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05307514 qdf_mem_free(req_msg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007515 return status;
7516 }
7517
7518 /* Serialize the req through MC thread */
7519 msg.bodyptr = req_msg;
7520 msg.type = WMA_DEL_PERIODIC_TX_PTRN_IND;
Sreelakshmi Konamki6a065362016-05-31 16:05:01 +05307521 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
7522 NO_SESSION, msg.type));
gaurank kathpalia36b0c582018-08-28 17:45:43 +05307523 status = scheduler_post_message(QDF_MODULE_ID_SME,
7524 QDF_MODULE_ID_WMA,
7525 QDF_MODULE_ID_WMA, &msg);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307526 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07007527 sme_err("scheduler_post_msg failed!(err=%d)",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007528 status);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05307529 qdf_mem_free(req_msg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007530 }
7531 sme_release_global_lock(&mac->sme);
7532 return status;
7533}
7534
Rachit Kankaneee1735c2018-08-02 13:19:34 +05307535#ifdef FEATURE_WLAN_RMC
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307536/*
7537 * sme_enable_rmc() - enables RMC
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -08007538 * @mac_handle: Opaque handle to the global MAC context
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307539 * @sessionId : Session ID
7540 *
7541 * Return: QDF_STATUS
7542 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007543QDF_STATUS sme_enable_rmc(mac_handle_t mac_handle, uint32_t sessionId)
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08007544{
7545 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08007546 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Rajeev Kumar37d478b2017-04-17 16:59:28 -07007547 struct scheduler_msg message = {0};
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08007548 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
7549
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07007550 SME_ENTER();
7551
Jeff Johnson01f2c232018-11-21 19:17:44 -08007552 status = sme_acquire_global_lock(&mac->sme);
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08007553 if (QDF_IS_STATUS_SUCCESS(status)) {
Rajeev Kumar8eaedf62017-01-21 11:03:13 -08007554 message.bodyptr = NULL;
7555 message.type = WMA_RMC_ENABLE_IND;
gaurank kathpalia36b0c582018-08-28 17:45:43 +05307556 qdf_status = scheduler_post_message(QDF_MODULE_ID_SME,
7557 QDF_MODULE_ID_WMA,
7558 QDF_MODULE_ID_WMA,
7559 &message);
Madhvapathi Sriram3e6627a2018-12-19 12:54:49 +05307560 if (!QDF_IS_STATUS_SUCCESS(qdf_status))
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08007561 status = QDF_STATUS_E_FAILURE;
Madhvapathi Sriram3e6627a2018-12-19 12:54:49 +05307562
Jeff Johnson01f2c232018-11-21 19:17:44 -08007563 sme_release_global_lock(&mac->sme);
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08007564 }
7565 return status;
7566}
7567
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307568/*
7569 * sme_disable_rmc() - disables RMC
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -08007570 * @mac_handle: Opaque handle to the global MAC context
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307571 * @sessionId : Session ID
7572 *
7573 * Return: QDF_STATUS
7574 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007575QDF_STATUS sme_disable_rmc(mac_handle_t mac_handle, uint32_t sessionId)
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08007576{
7577 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08007578 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Rajeev Kumar37d478b2017-04-17 16:59:28 -07007579 struct scheduler_msg message = {0};
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08007580 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
7581
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07007582 SME_ENTER();
7583
Jeff Johnson01f2c232018-11-21 19:17:44 -08007584 status = sme_acquire_global_lock(&mac->sme);
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08007585 if (QDF_IS_STATUS_SUCCESS(status)) {
Rajeev Kumar8eaedf62017-01-21 11:03:13 -08007586 message.bodyptr = NULL;
7587 message.type = WMA_RMC_DISABLE_IND;
gaurank kathpalia36b0c582018-08-28 17:45:43 +05307588 qdf_status = scheduler_post_message(QDF_MODULE_ID_SME,
7589 QDF_MODULE_ID_WMA,
7590 QDF_MODULE_ID_WMA,
7591 &message);
Madhvapathi Sriram3e6627a2018-12-19 12:54:49 +05307592 if (!QDF_IS_STATUS_SUCCESS(qdf_status))
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08007593 status = QDF_STATUS_E_FAILURE;
Madhvapathi Sriram3e6627a2018-12-19 12:54:49 +05307594
Jeff Johnson01f2c232018-11-21 19:17:44 -08007595 sme_release_global_lock(&mac->sme);
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08007596 }
7597 return status;
7598}
7599
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307600/*
7601 * sme_send_rmc_action_period() - sends RMC action period param to target
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -08007602 * @mac_handle: Opaque handle to the global MAC context
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307603 * @sessionId : Session ID
7604 *
7605 * Return: QDF_STATUS
7606 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007607QDF_STATUS sme_send_rmc_action_period(mac_handle_t mac_handle,
7608 uint32_t sessionId)
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08007609{
7610 QDF_STATUS status = QDF_STATUS_SUCCESS;
7611 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08007612 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Rajeev Kumar37d478b2017-04-17 16:59:28 -07007613 struct scheduler_msg message = {0};
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08007614
Jeff Johnson01f2c232018-11-21 19:17:44 -08007615 status = sme_acquire_global_lock(&mac->sme);
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08007616 if (QDF_STATUS_SUCCESS == status) {
Rajeev Kumar8eaedf62017-01-21 11:03:13 -08007617 message.bodyptr = NULL;
7618 message.type = WMA_RMC_ACTION_PERIOD_IND;
gaurank kathpalia36b0c582018-08-28 17:45:43 +05307619 qdf_status = scheduler_post_message(QDF_MODULE_ID_SME,
7620 QDF_MODULE_ID_WMA,
7621 QDF_MODULE_ID_WMA,
7622 &message);
Madhvapathi Sriram3e6627a2018-12-19 12:54:49 +05307623 if (!QDF_IS_STATUS_SUCCESS(qdf_status))
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08007624 status = QDF_STATUS_E_FAILURE;
Madhvapathi Sriram3e6627a2018-12-19 12:54:49 +05307625
Jeff Johnson01f2c232018-11-21 19:17:44 -08007626 sme_release_global_lock(&mac->sme);
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08007627 }
7628
7629 return status;
7630}
Rachit Kankaneee1735c2018-08-02 13:19:34 +05307631#endif /* FEATURE_WLAN_RMC */
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08007632
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307633/*
7634 * sme_request_ibss_peer_info() - request ibss peer info
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -08007635 * @mac_handle: Opaque handle to the global MAC context
Jeff Johnson56ba88a2019-02-17 17:18:43 -08007636 * @cb_context: Pointer to user data
Jeff Johnsond6a23162019-02-17 16:46:37 -08007637 * @peer_info_cb: Peer info callback
7638 * @allPeerInfoReqd: All peer info required or not
7639 * @staIdx: sta index
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307640 *
7641 * Return: QDF_STATUS
7642 */
Jeff Johnson56ba88a2019-02-17 17:18:43 -08007643QDF_STATUS sme_request_ibss_peer_info(mac_handle_t mac_handle, void *cb_context,
Jeff Johnsond6a23162019-02-17 16:46:37 -08007644 ibss_peer_info_cb peer_info_cb,
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08007645 bool allPeerInfoReqd, uint8_t staIdx)
7646{
7647 QDF_STATUS status = QDF_STATUS_E_FAILURE;
7648 QDF_STATUS qdf_status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08007649 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Rajeev Kumar37d478b2017-04-17 16:59:28 -07007650 struct scheduler_msg message = {0};
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08007651 tSirIbssGetPeerInfoReqParams *pIbssInfoReqParams;
Jeff Johnsone7aa5cd2019-02-17 19:36:01 -08007652 struct ibss_peer_info_cb_info *cb_info;
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08007653
Jeff Johnson01f2c232018-11-21 19:17:44 -08007654 status = sme_acquire_global_lock(&mac->sme);
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08007655 if (QDF_STATUS_SUCCESS == status) {
Jeff Johnsone7aa5cd2019-02-17 19:36:01 -08007656 cb_info = &mac->sme.peer_info_cb_info;
7657 cb_info->peer_info_cb = peer_info_cb;
7658 cb_info->peer_info_cb_context = cb_context;
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08007659
7660 pIbssInfoReqParams = (tSirIbssGetPeerInfoReqParams *)
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307661 qdf_mem_malloc(sizeof(tSirIbssGetPeerInfoReqParams));
Arif Hussain0ef77082018-10-10 16:42:53 -07007662 if (!pIbssInfoReqParams) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08007663 sme_release_global_lock(&mac->sme);
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08007664 return QDF_STATUS_E_NOMEM;
7665 }
7666 pIbssInfoReqParams->allPeerInfoReqd = allPeerInfoReqd;
7667 pIbssInfoReqParams->staIdx = staIdx;
7668
Rajeev Kumar8eaedf62017-01-21 11:03:13 -08007669 message.type = WMA_GET_IBSS_PEER_INFO_REQ;
7670 message.bodyptr = pIbssInfoReqParams;
7671 message.reserved = 0;
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08007672
gaurank kathpalia36b0c582018-08-28 17:45:43 +05307673 qdf_status = scheduler_post_message(QDF_MODULE_ID_SME,
7674 QDF_MODULE_ID_WMA,
7675 QDF_MODULE_ID_WMA,
7676 &message);
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08007677 if (QDF_STATUS_SUCCESS != qdf_status) {
7678 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
7679 "%s: Post WMA_GET_IBSS_PEER_INFO_REQ MSG failed",
7680 __func__);
7681 qdf_mem_free(pIbssInfoReqParams);
7682 qdf_status = QDF_STATUS_E_FAILURE;
7683 }
Jeff Johnson01f2c232018-11-21 19:17:44 -08007684 sme_release_global_lock(&mac->sme);
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08007685 }
7686
7687 return qdf_status;
7688}
7689
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307690/*
7691 * sme_send_cesium_enable_ind() -
7692 * Used to send proprietary cesium enable indication to fw
7693 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007694 * mac_handle
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307695 * sessionId
7696 * Return QDF_STATUS
7697 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007698QDF_STATUS sme_send_cesium_enable_ind(mac_handle_t mac_handle,
7699 uint32_t sessionId)
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08007700{
7701 QDF_STATUS status = QDF_STATUS_SUCCESS;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08007702 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Rajeev Kumar37d478b2017-04-17 16:59:28 -07007703 struct scheduler_msg message = {0};
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08007704
Jeff Johnson01f2c232018-11-21 19:17:44 -08007705 status = sme_acquire_global_lock(&mac->sme);
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08007706 if (QDF_STATUS_SUCCESS == status) {
Rajeev Kumar8eaedf62017-01-21 11:03:13 -08007707 message.bodyptr = NULL;
7708 message.type = WMA_IBSS_CESIUM_ENABLE_IND;
Madhvapathi Sriram3e6627a2018-12-19 12:54:49 +05307709 status = scheduler_post_message(QDF_MODULE_ID_SME,
7710 QDF_MODULE_ID_WMA,
7711 QDF_MODULE_ID_WMA,
7712 &message);
Jeff Johnson01f2c232018-11-21 19:17:44 -08007713 sme_release_global_lock(&mac->sme);
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08007714 }
7715
7716 return status;
7717}
7718
Jeff Johnsonc7309062018-11-09 20:59:42 -08007719QDF_STATUS sme_set_wlm_latency_level(mac_handle_t mac_handle,
7720 uint16_t session_id,
Paul Zhang99fe8842017-12-08 14:43:46 +08007721 uint16_t latency_level)
7722{
7723 QDF_STATUS status;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08007724 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Paul Zhang99fe8842017-12-08 14:43:46 +08007725 struct wlm_latency_level_param params;
7726 void *wma = cds_get_context(QDF_MODULE_ID_WMA);
7727
Bala Venkatesh7cf5b662018-05-10 15:18:53 +05307728 if (!wma)
7729 return QDF_STATUS_E_FAILURE;
7730
Yeshwanth Sriram Guntuka334aa8d2018-08-20 16:49:15 +05307731 if (!mac_ctx->mlme_cfg->wlm_config.latency_enable) {
Paul Zhang99fe8842017-12-08 14:43:46 +08007732 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
7733 "%s: WLM latency level setting is disabled",
7734 __func__);
7735 return QDF_STATUS_E_FAILURE;
7736 }
Krunal Soni3fa80e22018-01-09 14:16:02 -08007737 if (!wma) {
7738 sme_err("wma is NULL");
7739 return QDF_STATUS_E_FAILURE;
7740 }
Paul Zhang99fe8842017-12-08 14:43:46 +08007741
7742 params.wlm_latency_level = latency_level;
7743 params.wlm_latency_flags =
Yeshwanth Sriram Guntuka334aa8d2018-08-20 16:49:15 +05307744 mac_ctx->mlme_cfg->wlm_config.latency_flags[latency_level];
Paul Zhang99fe8842017-12-08 14:43:46 +08007745 params.vdev_id = session_id;
7746
7747 status = wma_set_wlm_latency_level(wma, &params);
Paul Zhang99fe8842017-12-08 14:43:46 +08007748
7749 return status;
7750}
7751
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007752void sme_get_command_q_status(mac_handle_t mac_handle)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007753{
7754 tSmeCmd *pTempCmd = NULL;
7755 tListElem *pEntry;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08007756 struct mac_context *mac;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007757
Madhvapathi Sriram3e6627a2018-12-19 12:54:49 +05307758 if (!mac_handle)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007759 return;
Madhvapathi Sriram3e6627a2018-12-19 12:54:49 +05307760
7761 mac = MAC_CONTEXT(mac_handle);
7762
Jeff Johnson01f2c232018-11-21 19:17:44 -08007763 pEntry = csr_nonscan_active_ll_peek_head(mac, LL_ACCESS_LOCK);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307764 if (pEntry)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007765 pTempCmd = GET_BASE_ADDR(pEntry, tSmeCmd, Link);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307766
Kabilan Kannan33fcd682018-03-08 14:29:46 -08007767 sme_err("WLAN_BUG_RCA: Currently smeCmdActiveList has command (0x%X)",
Madhvapathi Sriram3e6627a2018-12-19 12:54:49 +05307768 (pTempCmd) ? pTempCmd->command : eSmeNoCommand);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007769 if (pTempCmd) {
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307770 if (eSmeCsrCommandMask & pTempCmd->command)
7771 /* CSR command is stuck. See what the reason code is
7772 * for that command
7773 */
Jeff Johnson01f2c232018-11-21 19:17:44 -08007774 dump_csr_command_info(mac, pTempCmd);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007775 } /* if(pTempCmd) */
7776
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07007777 sme_err("Currently smeCmdPendingList has %d commands",
Madhvapathi Sriram3e6627a2018-12-19 12:54:49 +05307778 csr_nonscan_pending_ll_count(mac));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007779
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007780}
Kiran Kumar Lokere1aa9c9a2016-10-05 18:50:59 -07007781
Agrawal Ashishb141b092016-09-02 19:59:26 +05307782#ifdef WLAN_FEATURE_DSRC
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007783/**
Naveen Rawatb4d37622015-11-13 16:15:25 -08007784 * sme_ocb_gen_timing_advert_frame() - generate TA frame and populate the buffer
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -08007785 * @mac_handle: Opaque handle to the global MAC context
Naveen Rawatb4d37622015-11-13 16:15:25 -08007786 * @self_addr: the self MAC address
7787 * @buf: the buffer that will contain the frame
7788 * @timestamp_offset: return for the offset of the timestamp field
7789 * @time_value_offset: return for the time_value field in the TA IE
7790 *
7791 * Return: the length of the buffer.
7792 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007793int sme_ocb_gen_timing_advert_frame(mac_handle_t mac_handle,
Naveen Rawatb4d37622015-11-13 16:15:25 -08007794 tSirMacAddr self_addr, uint8_t **buf,
7795 uint32_t *timestamp_offset,
7796 uint32_t *time_value_offset)
7797{
7798 int template_length;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08007799 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Naveen Rawatb4d37622015-11-13 16:15:25 -08007800
7801 template_length = sch_gen_timing_advert_frame(mac_ctx, self_addr, buf,
7802 timestamp_offset,
7803 time_value_offset);
7804 return template_length;
7805}
Agrawal Ashishb141b092016-09-02 19:59:26 +05307806#endif
Arun Khandavalli4b55da72016-07-19 19:55:01 +05307807
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007808QDF_STATUS sme_notify_modem_power_state(mac_handle_t mac_handle, uint32_t value)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007809{
Rajeev Kumar37d478b2017-04-17 16:59:28 -07007810 struct scheduler_msg msg = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007811 tpSirModemPowerStateInd request_buf;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08007812 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007813
Jeff Johnson01f2c232018-11-21 19:17:44 -08007814 if (NULL == mac)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307815 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007816
Anurag Chouhan600c3a02016-03-01 10:33:54 +05307817 request_buf = qdf_mem_malloc(sizeof(tSirModemPowerStateInd));
Arif Hussain0ef77082018-10-10 16:42:53 -07007818 if (!request_buf)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307819 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007820
7821 request_buf->param = value;
7822
7823 msg.type = WMA_MODEM_POWER_STATE_IND;
7824 msg.reserved = 0;
7825 msg.bodyptr = request_buf;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307826 if (!QDF_IS_STATUS_SUCCESS
gaurank kathpalia36b0c582018-08-28 17:45:43 +05307827 (scheduler_post_message(QDF_MODULE_ID_SME,
7828 QDF_MODULE_ID_WMA,
7829 QDF_MODULE_ID_WMA, &msg))) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05307830 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307831 "%s: Not able to post WMA_MODEM_POWER_STATE_IND message to WMA",
7832 __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05307833 qdf_mem_free(request_buf);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307834 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007835 }
7836
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307837 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007838}
7839
7840#ifdef QCA_HT_2040_COEX
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007841QDF_STATUS sme_notify_ht2040_mode(mac_handle_t mac_handle, uint16_t staId,
Anurag Chouhan6d760662016-02-20 16:05:43 +05307842 struct qdf_mac_addr macAddrSTA,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007843 uint8_t sessionId,
7844 uint8_t channel_type)
7845{
Rajeev Kumar37d478b2017-04-17 16:59:28 -07007846 struct scheduler_msg msg = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007847 tUpdateVHTOpMode *pHtOpMode = NULL;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08007848 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007849
Jeff Johnson01f2c232018-11-21 19:17:44 -08007850 if (NULL == mac)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307851 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007852
Anurag Chouhan600c3a02016-03-01 10:33:54 +05307853 pHtOpMode = qdf_mem_malloc(sizeof(tUpdateVHTOpMode));
Arif Hussain0ef77082018-10-10 16:42:53 -07007854 if (!pHtOpMode)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307855 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007856
7857 switch (channel_type) {
7858 case eHT_CHAN_HT20:
7859 pHtOpMode->opMode = eHT_CHANNEL_WIDTH_20MHZ;
7860 break;
7861
7862 case eHT_CHAN_HT40MINUS:
7863 case eHT_CHAN_HT40PLUS:
7864 pHtOpMode->opMode = eHT_CHANNEL_WIDTH_40MHZ;
7865 break;
7866
7867 default:
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05307868 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007869 "%s: Invalid OP mode", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307870 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007871 }
7872
7873 pHtOpMode->staId = staId,
Anurag Chouhan600c3a02016-03-01 10:33:54 +05307874 qdf_mem_copy(pHtOpMode->peer_mac, macAddrSTA.bytes,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007875 sizeof(tSirMacAddr));
7876 pHtOpMode->smesessionId = sessionId;
7877
7878 msg.type = WMA_UPDATE_OP_MODE;
7879 msg.reserved = 0;
7880 msg.bodyptr = pHtOpMode;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307881 if (!QDF_IS_STATUS_SUCCESS
gaurank kathpalia36b0c582018-08-28 17:45:43 +05307882 (scheduler_post_message(QDF_MODULE_ID_SME,
7883 QDF_MODULE_ID_WMA,
7884 QDF_MODULE_ID_WMA, &msg))) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05307885 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307886 "%s: Not able to post WMA_UPDATE_OP_MODE message to WMA",
7887 __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05307888 qdf_mem_free(pHtOpMode);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307889 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007890 }
7891
Abhishek Singhe4a1f882017-08-10 17:59:44 +05307892 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Jeff Johnson698eacd2018-05-12 17:00:03 -07007893 "%s: Notified FW about OP mode: %d for staId=%d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007894 __func__, pHtOpMode->opMode, staId);
7895
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307896 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007897}
7898
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307899/*
7900 * sme_set_ht2040_mode() -
7901 * To update HT Operation beacon IE.
7902 *
7903 * Return QDF_STATUS SUCCESS
7904 * FAILURE or RESOURCES
7905 * The API finished and failed.
7906 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007907QDF_STATUS sme_set_ht2040_mode(mac_handle_t mac_handle, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007908 uint8_t channel_type, bool obssEnabled)
7909{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307910 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08007911 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007912 ePhyChanBondState cbMode;
Jeff Johnson01f2c232018-11-21 19:17:44 -08007913 struct csr_roam_session *session = CSR_GET_SESSION(mac, sessionId);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007914
Jeff Johnson01f2c232018-11-21 19:17:44 -08007915 if (!CSR_IS_SESSION_VALID(mac, sessionId)) {
Abhishek Singh9d5f4582017-10-11 17:59:48 +05307916 sme_err("Session not valid for session id %d", sessionId);
7917 return QDF_STATUS_E_INVAL;
7918 }
Jeff Johnson01f2c232018-11-21 19:17:44 -08007919 session = CSR_GET_SESSION(mac, sessionId);
Abhishek Singh9d5f4582017-10-11 17:59:48 +05307920 sme_debug("Update HT operation beacon IE, channel_type=%d cur cbmode %d",
7921 channel_type, session->bssParams.cbMode);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007922
7923 switch (channel_type) {
7924 case eHT_CHAN_HT20:
Abhishek Singh9d5f4582017-10-11 17:59:48 +05307925 if (!session->bssParams.cbMode)
7926 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007927 cbMode = PHY_SINGLE_CHANNEL_CENTERED;
7928 break;
7929 case eHT_CHAN_HT40MINUS:
Abhishek Singh9d5f4582017-10-11 17:59:48 +05307930 if (session->bssParams.cbMode)
7931 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007932 cbMode = PHY_DOUBLE_CHANNEL_HIGH_PRIMARY;
7933 break;
7934 case eHT_CHAN_HT40PLUS:
Abhishek Singh9d5f4582017-10-11 17:59:48 +05307935 if (session->bssParams.cbMode)
7936 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007937 cbMode = PHY_DOUBLE_CHANNEL_LOW_PRIMARY;
7938 break;
7939 default:
Abhishek Singh9d5f4582017-10-11 17:59:48 +05307940 sme_err("Error!!! Invalid HT20/40 mode !");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307941 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007942 }
Abhishek Singh9d5f4582017-10-11 17:59:48 +05307943 session->bssParams.cbMode = cbMode;
Jeff Johnson01f2c232018-11-21 19:17:44 -08007944 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307945 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08007946 status = csr_set_ht2040_mode(mac, sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007947 cbMode, obssEnabled);
Jeff Johnson01f2c232018-11-21 19:17:44 -08007948 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007949 }
7950 return status;
7951}
7952
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007953#endif
7954
7955/*
7956 * SME API to enable/disable idle mode powersave
7957 * This should be called only if powersave offload
7958 * is enabled
7959 */
Arunk Khandavalli847969d2017-09-25 15:15:36 +05307960QDF_STATUS sme_set_idle_powersave_config(bool value)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007961{
Anurag Chouhan6d760662016-02-20 16:05:43 +05307962 void *wmaContext = cds_get_context(QDF_MODULE_ID_WMA);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007963
7964 if (NULL == wmaContext) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05307965 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007966 "%s: wmaContext is NULL", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307967 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007968 }
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05307969 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007970 " Idle Ps Set Value %d", value);
7971
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307972 if (QDF_STATUS_SUCCESS != wma_set_idle_ps_config(wmaContext, value)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05307973 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007974 " Failed to Set Idle Ps Value %d", value);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307975 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007976 }
Arunk Khandavalli847969d2017-09-25 15:15:36 +05307977
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307978 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007979}
7980
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007981int16_t sme_get_ht_config(mac_handle_t mac_handle, uint8_t session_id,
7982 uint16_t ht_capab)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007983{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08007984 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Jeff Johnson01f2c232018-11-21 19:17:44 -08007985 struct csr_roam_session *pSession = CSR_GET_SESSION(mac, session_id);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007986
7987 if (NULL == pSession) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05307988 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007989 "%s: pSession is NULL", __func__);
7990 return -EIO;
7991 }
7992 switch (ht_capab) {
7993 case WNI_CFG_HT_CAP_INFO_ADVANCE_CODING:
Jeff Johnsonbe119e62019-02-02 12:30:26 -08007994 return pSession->ht_config.ht_rx_ldpc;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007995 case WNI_CFG_HT_CAP_INFO_TX_STBC:
Jeff Johnsonbe119e62019-02-02 12:30:26 -08007996 return pSession->ht_config.ht_tx_stbc;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007997 case WNI_CFG_HT_CAP_INFO_RX_STBC:
Jeff Johnsonbe119e62019-02-02 12:30:26 -08007998 return pSession->ht_config.ht_rx_stbc;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007999 case WNI_CFG_HT_CAP_INFO_SHORT_GI_20MHZ:
Jeff Johnsonbe119e62019-02-02 12:30:26 -08008000 return pSession->ht_config.ht_sgi20;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008001 case WNI_CFG_HT_CAP_INFO_SHORT_GI_40MHZ:
Jeff Johnsonbe119e62019-02-02 12:30:26 -08008002 return pSession->ht_config.ht_sgi40;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008003 default:
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308004 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008005 "invalid ht capability");
8006 return -EIO;
8007 }
8008}
8009
Jeff Johnsonb460dd72018-11-08 10:26:51 -08008010int sme_update_ht_config(mac_handle_t mac_handle, uint8_t sessionId,
8011 uint16_t htCapab, int value)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008012{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08008013 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Jeff Johnson01f2c232018-11-21 19:17:44 -08008014 struct csr_roam_session *pSession = CSR_GET_SESSION(mac, sessionId);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008015
8016 if (NULL == pSession) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308017 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008018 "%s: pSession is NULL", __func__);
8019 return -EIO;
8020 }
8021
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308022 if (QDF_STATUS_SUCCESS != wma_set_htconfig(sessionId, htCapab, value)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308023 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008024 "Failed to set ht capability in target");
8025 return -EIO;
8026 }
8027
8028 switch (htCapab) {
8029 case WNI_CFG_HT_CAP_INFO_ADVANCE_CODING:
Jeff Johnsonbe119e62019-02-02 12:30:26 -08008030 pSession->ht_config.ht_rx_ldpc = value;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008031 break;
8032 case WNI_CFG_HT_CAP_INFO_TX_STBC:
Jeff Johnsonbe119e62019-02-02 12:30:26 -08008033 pSession->ht_config.ht_tx_stbc = value;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008034 break;
8035 case WNI_CFG_HT_CAP_INFO_RX_STBC:
Jeff Johnsonbe119e62019-02-02 12:30:26 -08008036 pSession->ht_config.ht_rx_stbc = value;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008037 break;
8038 case WNI_CFG_HT_CAP_INFO_SHORT_GI_20MHZ:
Krishna Kumaar Natarajana5c5aad2016-12-05 14:12:13 -08008039 value = value ? 1 : 0; /* HT SGI can be only 1 or 0 */
Jeff Johnsonbe119e62019-02-02 12:30:26 -08008040 pSession->ht_config.ht_sgi20 = value;
Sandeep Puligilla607f34a2016-05-25 14:37:47 -07008041 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008042 case WNI_CFG_HT_CAP_INFO_SHORT_GI_40MHZ:
Krishna Kumaar Natarajana5c5aad2016-12-05 14:12:13 -08008043 value = value ? 1 : 0; /* HT SGI can be only 1 or 0 */
Jeff Johnsonbe119e62019-02-02 12:30:26 -08008044 pSession->ht_config.ht_sgi40 = value;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008045 break;
8046 }
8047
Jeff Johnson01f2c232018-11-21 19:17:44 -08008048 csr_roam_update_config(mac, sessionId, htCapab, value);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008049 return 0;
8050}
8051
Jeff Johnsonc7309062018-11-09 20:59:42 -08008052int sme_set_addba_accept(mac_handle_t mac_handle, uint8_t session_id, int value)
Kiran Kumar Lokere08195ef2018-01-17 19:25:15 -08008053{
8054 struct sme_addba_accept *addba_accept;
8055 struct scheduler_msg msg = {0};
8056 QDF_STATUS status;
8057
8058 addba_accept = qdf_mem_malloc(sizeof(*addba_accept));
Arif Hussain0ef77082018-10-10 16:42:53 -07008059 if (!addba_accept)
Kiran Kumar Lokere08195ef2018-01-17 19:25:15 -08008060 return -EIO;
Arif Hussain0ef77082018-10-10 16:42:53 -07008061
Kiran Kumar Lokere08195ef2018-01-17 19:25:15 -08008062 addba_accept->session_id = session_id;
8063 addba_accept->addba_accept = value;
8064 qdf_mem_zero(&msg, sizeof(msg));
8065 msg.type = eWNI_SME_SET_ADDBA_ACCEPT;
8066 msg.reserved = 0;
8067 msg.bodyptr = addba_accept;
gaurank kathpalia36b0c582018-08-28 17:45:43 +05308068 status = scheduler_post_message(QDF_MODULE_ID_SME,
8069 QDF_MODULE_ID_PE,
8070 QDF_MODULE_ID_PE, &msg);
Kiran Kumar Lokere08195ef2018-01-17 19:25:15 -08008071 if (status != QDF_STATUS_SUCCESS) {
8072 sme_err("Not able to post addba reject");
8073 qdf_mem_free(addba_accept);
8074 return -EIO;
8075 }
8076 return 0;
8077}
Kiran Kumar Lokerebc87bec2018-02-27 20:06:42 -08008078
Jeff Johnsonc7309062018-11-09 20:59:42 -08008079int sme_set_ba_buff_size(mac_handle_t mac_handle, uint8_t session_id,
8080 uint16_t buff_size)
Kiran Kumar Lokerebc87bec2018-02-27 20:06:42 -08008081{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08008082 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Kiran Kumar Lokerebc87bec2018-02-27 20:06:42 -08008083 if (!buff_size) {
8084 sme_err("invalid buff size %d", buff_size);
8085 return -EINVAL;
8086 }
8087 mac_ctx->usr_cfg_ba_buff_size = buff_size;
8088 sme_debug("addba buff size is set to %d",
8089 mac_ctx->usr_cfg_ba_buff_size);
8090
8091 return 0;
8092}
8093
8094#define DEFAULT_BA_BUFF_SIZE 64
Jeff Johnsonc7309062018-11-09 20:59:42 -08008095int sme_send_addba_req(mac_handle_t mac_handle, uint8_t session_id, uint8_t tid,
8096 uint16_t buff_size)
Kiran Kumar Lokerebc87bec2018-02-27 20:06:42 -08008097{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08008098 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Kiran Kumar Lokerebc87bec2018-02-27 20:06:42 -08008099 uint16_t ba_buff = 0;
8100 QDF_STATUS status;
8101 struct scheduler_msg msg = {0};
8102 struct send_add_ba_req *send_ba_req;
8103 struct csr_roam_session *csr_session = NULL;
8104
8105 if (!csr_is_conn_state_connected_infra(mac_ctx, session_id)) {
8106 sme_err("STA not infra/connected state session_id: %d",
8107 session_id);
8108 return -EINVAL;
8109 }
8110 csr_session = CSR_GET_SESSION(mac_ctx, session_id);
8111 if (!csr_session) {
8112 sme_err("CSR session is NULL");
8113 return -EINVAL;
8114 }
8115 send_ba_req = qdf_mem_malloc(sizeof(*send_ba_req));
Arif Hussain0ef77082018-10-10 16:42:53 -07008116 if (!send_ba_req)
Kiran Kumar Lokerebc87bec2018-02-27 20:06:42 -08008117 return -EIO;
Arif Hussain0ef77082018-10-10 16:42:53 -07008118
Kiran Kumar Lokerebc87bec2018-02-27 20:06:42 -08008119 qdf_mem_copy(send_ba_req->mac_addr,
8120 csr_session->connectedProfile.bssid.bytes,
8121 QDF_MAC_ADDR_SIZE);
8122 ba_buff = buff_size;
8123 if (!buff_size) {
8124 if (mac_ctx->usr_cfg_ba_buff_size)
8125 ba_buff = mac_ctx->usr_cfg_ba_buff_size;
8126 else
8127 ba_buff = DEFAULT_BA_BUFF_SIZE;
8128 }
8129 send_ba_req->param.vdev_id = session_id;
8130 send_ba_req->param.tidno = tid;
8131 send_ba_req->param.buffersize = ba_buff;
8132 msg.type = WMA_SEND_ADDBA_REQ;
8133 msg.bodyptr = send_ba_req;
gaurank kathpalia36b0c582018-08-28 17:45:43 +05308134 status = scheduler_post_message(QDF_MODULE_ID_SME,
8135 QDF_MODULE_ID_WMA,
8136 QDF_MODULE_ID_WMA, &msg);
Kiran Kumar Lokerebc87bec2018-02-27 20:06:42 -08008137 if (QDF_STATUS_SUCCESS != status) {
Kiran Kumar Lokerebc87bec2018-02-27 20:06:42 -08008138 qdf_mem_free(send_ba_req);
8139 return -EIO;
8140 }
8141 sme_debug("ADDBA_REQ sent to FW: tid %d buff_size %d", tid, ba_buff);
8142
8143 return 0;
8144}
8145
Jeff Johnsonc7309062018-11-09 20:59:42 -08008146int sme_set_no_ack_policy(mac_handle_t mac_handle, uint8_t session_id,
8147 uint8_t val, uint8_t ac)
Kiran Kumar Lokere3324f632018-03-01 21:43:21 -08008148{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08008149 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Kiran Kumar Lokere3324f632018-03-01 21:43:21 -08008150 uint8_t i, set_val;
Arif Hussaineb8ba362018-03-07 19:15:13 -08008151 struct scheduler_msg msg = {0};
8152 QDF_STATUS status;
Kiran Kumar Lokere3324f632018-03-01 21:43:21 -08008153
8154 if (ac > MAX_NUM_AC) {
8155 sme_err("invalid ac val %d", ac);
8156 return -EINVAL;
8157 }
8158 if (val)
8159 set_val = 1;
8160 else
8161 set_val = 0;
8162 if (ac == MAX_NUM_AC) {
8163 for (i = 0; i < ac; i++)
8164 mac_ctx->no_ack_policy_cfg[i] = set_val;
8165 } else {
8166 mac_ctx->no_ack_policy_cfg[ac] = set_val;
8167 }
8168 sme_debug("no ack is set to %d for ac %d", set_val, ac);
Arif Hussaineb8ba362018-03-07 19:15:13 -08008169 qdf_mem_zero(&msg, sizeof(msg));
8170 msg.type = eWNI_SME_UPDATE_EDCA_PROFILE;
8171 msg.reserved = 0;
8172 msg.bodyval = session_id;
gaurank kathpalia36b0c582018-08-28 17:45:43 +05308173 status = scheduler_post_message(QDF_MODULE_ID_SME,
8174 QDF_MODULE_ID_PE,
8175 QDF_MODULE_ID_PE, &msg);
Arif Hussaineb8ba362018-03-07 19:15:13 -08008176 if (status != QDF_STATUS_SUCCESS) {
8177 sme_err("Not able to post update edca profile");
8178 return -EIO;
8179 }
Kiran Kumar Lokere3324f632018-03-01 21:43:21 -08008180
8181 return 0;
8182}
8183
Jeff Johnsonc7309062018-11-09 20:59:42 -08008184int sme_set_auto_rate_he_ltf(mac_handle_t mac_handle, uint8_t session_id,
8185 uint8_t cfg_val)
Kiran Kumar Lokerea006a302018-03-07 20:58:13 -08008186{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08008187 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Kiran Kumar Lokerea006a302018-03-07 20:58:13 -08008188 uint32_t set_val;
8189 uint32_t bit_mask = 0;
8190 int status;
8191
8192 if (cfg_val > QCA_WLAN_HE_LTF_4X) {
8193 sme_err("invalid HE LTF cfg %d", cfg_val);
8194 return -EINVAL;
8195 }
8196
8197 /*set the corresponding HE LTF cfg BIT*/
8198 if (cfg_val == QCA_WLAN_HE_LTF_AUTO)
8199 bit_mask = HE_LTF_ALL;
8200 else
8201 bit_mask = (1 << (cfg_val - 1));
8202
8203 set_val = mac_ctx->he_sgi_ltf_cfg_bit_mask;
8204
8205 SET_AUTO_RATE_HE_LTF_VAL(set_val, bit_mask);
8206
8207 mac_ctx->he_sgi_ltf_cfg_bit_mask = set_val;
8208 status = wma_cli_set_command(session_id,
8209 WMI_VDEV_PARAM_AUTORATE_MISC_CFG,
8210 set_val, VDEV_CMD);
8211 if (status) {
8212 sme_err("failed to set he_ltf_sgi");
8213 return status;
8214 }
8215
8216 sme_debug("HE SGI_LTF is set to 0x%08X",
8217 mac_ctx->he_sgi_ltf_cfg_bit_mask);
8218
8219 return 0;
8220}
8221
Jeff Johnsonc7309062018-11-09 20:59:42 -08008222int sme_set_auto_rate_he_sgi(mac_handle_t mac_handle, uint8_t session_id,
8223 uint8_t cfg_val)
Kiran Kumar Lokerea006a302018-03-07 20:58:13 -08008224{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08008225 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Kiran Kumar Lokerea006a302018-03-07 20:58:13 -08008226 uint32_t set_val;
8227 uint32_t sgi_bit_mask = 0;
8228 int status;
8229
8230 if ((cfg_val > AUTO_RATE_GI_3200NS) ||
8231 (cfg_val < AUTO_RATE_GI_400NS)) {
8232 sme_err("invalid auto rate GI cfg %d", cfg_val);
8233 return -EINVAL;
8234 }
8235
8236 sgi_bit_mask = (1 << cfg_val);
8237
8238 set_val = mac_ctx->he_sgi_ltf_cfg_bit_mask;
8239 SET_AUTO_RATE_SGI_VAL(set_val, sgi_bit_mask);
8240
8241 mac_ctx->he_sgi_ltf_cfg_bit_mask = set_val;
8242 status = wma_cli_set_command(session_id,
8243 WMI_VDEV_PARAM_AUTORATE_MISC_CFG,
8244 set_val, VDEV_CMD);
8245 if (status) {
8246 sme_err("failed to set he_ltf_sgi");
8247 return status;
8248 }
8249
8250 sme_debug("auto rate HE SGI_LTF is set to 0x%08X",
8251 mac_ctx->he_sgi_ltf_cfg_bit_mask);
8252
8253 return 0;
8254}
8255
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008256#define HT20_SHORT_GI_MCS7_RATE 722
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05308257/*
8258 * sme_send_rate_update_ind() -
8259 * API to Update rate
8260 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08008261 * mac_handle - The handle returned by mac_open
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05308262 * rateUpdateParams - Pointer to rate update params
8263 * Return QDF_STATUS
8264 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08008265QDF_STATUS sme_send_rate_update_ind(mac_handle_t mac_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008266 tSirRateUpdateInd *rateUpdateParams)
8267{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08008268 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308269 QDF_STATUS status;
Rajeev Kumar37d478b2017-04-17 16:59:28 -07008270 struct scheduler_msg msg = {0};
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308271 tSirRateUpdateInd *rate_upd = qdf_mem_malloc(sizeof(tSirRateUpdateInd));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008272
Arif Hussain0ef77082018-10-10 16:42:53 -07008273 if (!rate_upd)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308274 return QDF_STATUS_E_FAILURE;
Arif Hussain0ef77082018-10-10 16:42:53 -07008275
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008276 *rate_upd = *rateUpdateParams;
8277
8278 if (rate_upd->mcastDataRate24GHz == HT20_SHORT_GI_MCS7_RATE)
8279 rate_upd->mcastDataRate24GHzTxFlag =
Naveen Rawatea1564b2018-05-17 15:56:11 -07008280 TX_RATE_HT20 | TX_RATE_SGI;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008281 else if (rate_upd->reliableMcastDataRate ==
8282 HT20_SHORT_GI_MCS7_RATE)
8283 rate_upd->reliableMcastDataRateTxFlag =
Naveen Rawatea1564b2018-05-17 15:56:11 -07008284 TX_RATE_HT20 | TX_RATE_SGI;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008285
Jeff Johnson01f2c232018-11-21 19:17:44 -08008286 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308287 if (QDF_STATUS_SUCCESS == status) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008288 msg.type = WMA_RATE_UPDATE_IND;
8289 msg.bodyptr = rate_upd;
Sreelakshmi Konamki6a065362016-05-31 16:05:01 +05308290 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
8291 NO_SESSION, msg.type));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308292 if (!QDF_IS_STATUS_SUCCESS
gaurank kathpalia36b0c582018-08-28 17:45:43 +05308293 (scheduler_post_message(QDF_MODULE_ID_SME,
8294 QDF_MODULE_ID_WMA,
8295 QDF_MODULE_ID_WMA,
8296 &msg))) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308297 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Rachit Kankaneee1735c2018-08-02 13:19:34 +05308298 "%s: Not able to post WMA_RATE_UPDATE_IND to WMA!",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008299 __func__);
8300
Jeff Johnson01f2c232018-11-21 19:17:44 -08008301 sme_release_global_lock(&mac->sme);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308302 qdf_mem_free(rate_upd);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308303 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008304 }
8305
Jeff Johnson01f2c232018-11-21 19:17:44 -08008306 sme_release_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308307 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008308 }
8309
8310 return status;
8311}
8312
8313/**
Kondabattini, Ganeshe4f18e02016-09-13 13:01:22 +05308314 * sme_update_access_policy_vendor_ie() - update vendor ie and access policy.
Jeff Johnsonc7309062018-11-09 20:59:42 -08008315 * @mac_handle: Pointer to the mac context
Kondabattini, Ganeshe4f18e02016-09-13 13:01:22 +05308316 * @session_id: sme session id
8317 * @vendor_ie: vendor ie
8318 * @access_policy: vendor ie access policy
8319 *
8320 * This function updates the vendor ie and access policy to lim.
8321 *
8322 * Return: success or failure.
8323 */
Jeff Johnsonc7309062018-11-09 20:59:42 -08008324QDF_STATUS sme_update_access_policy_vendor_ie(mac_handle_t mac_handle,
8325 uint8_t session_id,
8326 uint8_t *vendor_ie,
8327 int access_policy)
Kondabattini, Ganeshe4f18e02016-09-13 13:01:22 +05308328{
8329 struct sme_update_access_policy_vendor_ie *msg;
8330 uint16_t msg_len;
8331 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Kondabattini, Ganeshe4f18e02016-09-13 13:01:22 +05308332
8333 msg_len = sizeof(*msg);
8334
8335 msg = qdf_mem_malloc(msg_len);
8336 if (!msg) {
Srinivas Girigowda09625b02018-09-10 15:28:09 -07008337 return QDF_STATUS_E_NOMEM;
Kondabattini, Ganeshe4f18e02016-09-13 13:01:22 +05308338 }
8339
Kondabattini, Ganeshe4f18e02016-09-13 13:01:22 +05308340 msg->msg_type = (uint16_t)eWNI_SME_UPDATE_ACCESS_POLICY_VENDOR_IE;
8341 msg->length = (uint16_t)msg_len;
8342
8343 qdf_mem_copy(&msg->ie[0], vendor_ie, sizeof(msg->ie));
8344
8345 msg->sme_session_id = session_id;
8346 msg->access_policy = access_policy;
8347
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07008348 sme_debug("sme_session_id: %hu, access_policy: %d", session_id,
8349 access_policy);
Kondabattini, Ganeshe4f18e02016-09-13 13:01:22 +05308350
Rajeev Kumard138ac52017-01-30 18:38:37 -08008351 status = umac_send_mb_message_to_mac(msg);
Kondabattini, Ganeshe4f18e02016-09-13 13:01:22 +05308352
8353 return status;
8354}
8355
8356/**
Agrawal, Ashish4e5fa1c2016-09-21 19:03:43 +05308357 * sme_update_sta_inactivity_timeout(): Update sta_inactivity_timeout to FW
Jeff Johnsonc7309062018-11-09 20:59:42 -08008358 * @mac_handle: Handle returned by mac_open
Agrawal, Ashish4e5fa1c2016-09-21 19:03:43 +05308359 * @session_id: Session ID on which sta_inactivity_timeout needs
8360 * to be updated to FW
8361 * @sta_inactivity_timeout: sta inactivity timeout.
8362 *
8363 * If a station does not send anything in sta_inactivity_timeout seconds, an
8364 * empty data frame is sent to it in order to verify whether it is
8365 * still in range. If this frame is not ACKed, the station will be
8366 * disassociated and then deauthenticated.
8367 *
8368 * Return: QDF_STATUS_SUCCESS or non-zero on failure.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05308369 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08008370QDF_STATUS sme_update_sta_inactivity_timeout(mac_handle_t mac_handle,
Agrawal, Ashish4e5fa1c2016-09-21 19:03:43 +05308371 struct sme_sta_inactivity_timeout *sta_inactivity_timer)
8372{
8373 struct sme_sta_inactivity_timeout *inactivity_time;
8374 void *wma_handle;
8375
8376 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
8377 inactivity_time = qdf_mem_malloc(sizeof(*inactivity_time));
Arif Hussain0ef77082018-10-10 16:42:53 -07008378 if (!inactivity_time)
Agrawal, Ashish4e5fa1c2016-09-21 19:03:43 +05308379 return QDF_STATUS_E_FAILURE;
Arif Hussain0ef77082018-10-10 16:42:53 -07008380
Abhishek Singhe4a1f882017-08-10 17:59:44 +05308381 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Agrawal, Ashish4e5fa1c2016-09-21 19:03:43 +05308382 FL("sta_inactivity_timeout: %d"),
8383 sta_inactivity_timer->sta_inactivity_timeout);
8384 inactivity_time->session_id = sta_inactivity_timer->session_id;
8385 inactivity_time->sta_inactivity_timeout =
8386 sta_inactivity_timer->sta_inactivity_timeout;
8387
8388 wma_update_sta_inactivity_timeout(wma_handle,
8389 inactivity_time);
8390 return QDF_STATUS_SUCCESS;
8391}
8392
8393/**
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008394 * sme_get_reg_info() - To get registration info
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -08008395 * @mac_handle: Opaque handle to the global MAC context
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008396 * @chanId: channel id
8397 * @regInfo1: first reg info to fill
8398 * @regInfo2: second reg info to fill
8399 *
8400 * This routine will give you reg info
8401 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308402 * Return: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008403 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08008404QDF_STATUS sme_get_reg_info(mac_handle_t mac_handle, uint8_t chanId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008405 uint32_t *regInfo1, uint32_t *regInfo2)
8406{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08008407 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308408 QDF_STATUS status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008409 uint8_t i;
8410 bool found = false;
8411
Jeff Johnson01f2c232018-11-21 19:17:44 -08008412 status = sme_acquire_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008413 *regInfo1 = 0;
8414 *regInfo2 = 0;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308415 if (!QDF_IS_STATUS_SUCCESS(status))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008416 return status;
8417
Wu Gao0821b0d2019-01-11 17:31:11 +08008418 for (i = 0; i < CFG_VALID_CHANNEL_LIST_LEN; i++) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08008419 if (mac->scan.defaultPowerTable[i].chan_num == chanId) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008420 SME_SET_CHANNEL_REG_POWER(*regInfo1,
Jeff Johnson01f2c232018-11-21 19:17:44 -08008421 mac->scan.defaultPowerTable[i].tx_power);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008422
8423 SME_SET_CHANNEL_MAX_TX_POWER(*regInfo2,
Jeff Johnson01f2c232018-11-21 19:17:44 -08008424 mac->scan.defaultPowerTable[i].tx_power);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008425 found = true;
8426 break;
8427 }
8428 }
8429 if (!found)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308430 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008431
Jeff Johnson01f2c232018-11-21 19:17:44 -08008432 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008433 return status;
8434}
8435
8436#ifdef FEATURE_WLAN_AUTO_SHUTDOWN
Jeff Johnsonb460dd72018-11-08 10:26:51 -08008437QDF_STATUS sme_set_auto_shutdown_cb(mac_handle_t mac_handle,
Jeff Johnsoneb7bbed2019-02-17 10:34:24 -08008438 void (*callback_fn)(void))
Jeff Johnsonb460dd72018-11-08 10:26:51 -08008439{
Jeff Johnsoneb7bbed2019-02-17 10:34:24 -08008440 QDF_STATUS status;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08008441 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008442
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308443 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008444 "%s: Plug in Auto shutdown event callback", __func__);
8445
Jeff Johnson01f2c232018-11-21 19:17:44 -08008446 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308447 if (QDF_STATUS_SUCCESS == status) {
Jeff Johnsoneb7bbed2019-02-17 10:34:24 -08008448 if (NULL != callback_fn)
8449 mac->sme.auto_shutdown_cb = callback_fn;
Jeff Johnson01f2c232018-11-21 19:17:44 -08008450 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008451 }
8452
8453 return status;
8454}
8455
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05308456/*
8457 * sme_set_auto_shutdown_timer() -
8458 * API to set auto shutdown timer value in FW.
8459 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08008460 * mac_handle - The handle returned by mac_open
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05308461 * timer_val - The auto shutdown timer value to be set
8462 * Return Configuration message posting status, SUCCESS or Fail
8463 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08008464QDF_STATUS sme_set_auto_shutdown_timer(mac_handle_t mac_handle,
8465 uint32_t timer_val)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008466{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308467 QDF_STATUS status = QDF_STATUS_SUCCESS;
8468 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08008469 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Jeff Johnsona9ade7d2019-02-17 10:08:17 -08008470 struct auto_shutdown_cmd *auto_sh_cmd;
Rajeev Kumar37d478b2017-04-17 16:59:28 -07008471 struct scheduler_msg message = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008472
Jeff Johnson01f2c232018-11-21 19:17:44 -08008473 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308474 if (QDF_STATUS_SUCCESS == status) {
Jeff Johnsona9ade7d2019-02-17 10:08:17 -08008475 auto_sh_cmd = qdf_mem_malloc(sizeof(*auto_sh_cmd));
Arif Hussain0ef77082018-10-10 16:42:53 -07008476 if (!auto_sh_cmd) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08008477 sme_release_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308478 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008479 }
8480
8481 auto_sh_cmd->timer_val = timer_val;
8482
8483 /* serialize the req through MC thread */
Rajeev Kumar8eaedf62017-01-21 11:03:13 -08008484 message.bodyptr = auto_sh_cmd;
8485 message.type = WMA_SET_AUTO_SHUTDOWN_TIMER_REQ;
gaurank kathpalia36b0c582018-08-28 17:45:43 +05308486 qdf_status = scheduler_post_message(QDF_MODULE_ID_SME,
8487 QDF_MODULE_ID_WMA,
8488 QDF_MODULE_ID_WMA,
8489 &message);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308490 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308491 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008492 "%s: Post Auto shutdown MSG fail", __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308493 qdf_mem_free(auto_sh_cmd);
Jeff Johnson01f2c232018-11-21 19:17:44 -08008494 sme_release_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308495 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008496 }
Abhishek Singhe4a1f882017-08-10 17:59:44 +05308497 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008498 "%s: Posted Auto shutdown MSG", __func__);
Jeff Johnson01f2c232018-11-21 19:17:44 -08008499 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008500 }
8501
8502 return status;
8503}
8504#endif
8505
Nirav Shaheb017be2018-02-15 11:20:58 +05308506#ifdef FEATURE_WLAN_CH_AVOID
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05308507/*
8508 * sme_ch_avoid_update_req() -
8509 * API to request channel avoidance update from FW.
8510 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08008511 * mac_handle - The handle returned by mac_open
Jeff Johnsonc5927de2018-05-11 09:12:53 -07008512 * update_type - The update_type parameter of this request call
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05308513 * Return Configuration message posting status, SUCCESS or Fail
8514 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08008515QDF_STATUS sme_ch_avoid_update_req(mac_handle_t mac_handle)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008516{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308517 QDF_STATUS status = QDF_STATUS_SUCCESS;
8518 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08008519 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008520 tSirChAvoidUpdateReq *cauReq;
Rajeev Kumar37d478b2017-04-17 16:59:28 -07008521 struct scheduler_msg message = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008522
Jeff Johnson01f2c232018-11-21 19:17:44 -08008523 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308524 if (QDF_STATUS_SUCCESS == status) {
Arif Hussain0ef77082018-10-10 16:42:53 -07008525 cauReq = qdf_mem_malloc(sizeof(tSirChAvoidUpdateReq));
8526 if (!cauReq) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08008527 sme_release_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308528 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008529 }
8530
8531 cauReq->reserved_param = 0;
8532
8533 /* serialize the req through MC thread */
Rajeev Kumar8eaedf62017-01-21 11:03:13 -08008534 message.bodyptr = cauReq;
8535 message.type = WMA_CH_AVOID_UPDATE_REQ;
gaurank kathpalia36b0c582018-08-28 17:45:43 +05308536 qdf_status = scheduler_post_message(QDF_MODULE_ID_SME,
8537 QDF_MODULE_ID_WMA,
8538 QDF_MODULE_ID_WMA,
8539 &message);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308540 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308541 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008542 "%s: Post Ch Avoid Update MSG fail",
8543 __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308544 qdf_mem_free(cauReq);
Jeff Johnson01f2c232018-11-21 19:17:44 -08008545 sme_release_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308546 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008547 }
Abhishek Singhe4a1f882017-08-10 17:59:44 +05308548 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008549 "%s: Posted Ch Avoid Update MSG", __func__);
Jeff Johnson01f2c232018-11-21 19:17:44 -08008550 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008551 }
8552
8553 return status;
8554}
Nirav Shaheb017be2018-02-15 11:20:58 +05308555#endif
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008556
8557/**
8558 * sme_set_miracast() - Function to set miracast value to UMAC
Jeff Johnsonc7309062018-11-09 20:59:42 -08008559 * @mac_handle: Handle returned by macOpen
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008560 * @filter_type: 0-Disabled, 1-Source, 2-sink
8561 *
8562 * This function passes down the value of miracast set by
8563 * framework to UMAC
8564 *
8565 * Return: Configuration message posting status, SUCCESS or Fail
8566 *
8567 */
Jeff Johnsonc7309062018-11-09 20:59:42 -08008568QDF_STATUS sme_set_miracast(mac_handle_t mac_handle, uint8_t filter_type)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008569{
Rajeev Kumar37d478b2017-04-17 16:59:28 -07008570 struct scheduler_msg msg = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008571 uint32_t *val;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08008572 struct mac_context *mac_ptr = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008573
Arif Hussain0ef77082018-10-10 16:42:53 -07008574 if (!mac_ptr) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308575 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008576 "%s: Invalid pointer", __func__);
Arif Hussain0ef77082018-10-10 16:42:53 -07008577 return QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008578 }
8579
Arif Hussain0ef77082018-10-10 16:42:53 -07008580 val = qdf_mem_malloc(sizeof(*val));
8581 if (!val)
8582 return QDF_STATUS_E_NOMEM;
8583
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008584 *val = filter_type;
8585
8586 msg.type = SIR_HAL_SET_MIRACAST;
8587 msg.reserved = 0;
8588 msg.bodyptr = val;
8589
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308590 if (!QDF_IS_STATUS_SUCCESS(
gaurank kathpalia36b0c582018-08-28 17:45:43 +05308591 scheduler_post_message(QDF_MODULE_ID_SME,
8592 QDF_MODULE_ID_WMA,
8593 QDF_MODULE_ID_WMA,
8594 &msg))) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308595 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008596 "%s: Not able to post WDA_SET_MAS_ENABLE_DISABLE to WMA!",
8597 __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308598 qdf_mem_free(val);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308599 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008600 }
8601
8602 mac_ptr->sme.miracast_value = filter_type;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308603 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008604}
8605
8606/**
8607 * sme_set_mas() - Function to set MAS value to UMAC
8608 * @val: 1-Enable, 0-Disable
8609 *
8610 * This function passes down the value of MAS to the UMAC. A
8611 * value of 1 will enable MAS and a value of 0 will disable MAS
8612 *
8613 * Return: Configuration message posting status, SUCCESS or Fail
8614 *
8615 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308616QDF_STATUS sme_set_mas(uint32_t val)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008617{
Rajeev Kumar37d478b2017-04-17 16:59:28 -07008618 struct scheduler_msg msg = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008619 uint32_t *ptr_val;
8620
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308621 ptr_val = qdf_mem_malloc(sizeof(*ptr_val));
Arif Hussain0ef77082018-10-10 16:42:53 -07008622 if (!ptr_val)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308623 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008624
8625 *ptr_val = val;
8626
8627 msg.type = SIR_HAL_SET_MAS;
8628 msg.reserved = 0;
8629 msg.bodyptr = ptr_val;
8630
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308631 if (!QDF_IS_STATUS_SUCCESS(
gaurank kathpalia36b0c582018-08-28 17:45:43 +05308632 scheduler_post_message(QDF_MODULE_ID_SME,
8633 QDF_MODULE_ID_WMA,
8634 QDF_MODULE_ID_WMA,
8635 &msg))) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308636 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008637 "%s: Not able to post WDA_SET_MAS_ENABLE_DISABLE to WMA!",
8638 __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308639 qdf_mem_free(ptr_val);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308640 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008641 }
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308642 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008643}
8644
Kiran Kumar Lokere999e58c2016-01-07 02:18:39 -08008645/**
8646 * sme_roam_channel_change_req() - Channel change to new target channel
Jeff Johnsonb460dd72018-11-08 10:26:51 -08008647 * @mac_handle: handle returned by mac_open
Kiran Kumar Lokere999e58c2016-01-07 02:18:39 -08008648 * @bssid: mac address of BSS
8649 * @ch_params: target channel information
8650 * @profile: CSR profile
8651 *
8652 * API to Indicate Channel change to new target channel
8653 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308654 * Return: QDF_STATUS
Kiran Kumar Lokere999e58c2016-01-07 02:18:39 -08008655 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08008656QDF_STATUS sme_roam_channel_change_req(mac_handle_t mac_handle,
Amar Singhale4f28ee2015-10-21 14:36:56 -07008657 struct qdf_mac_addr bssid,
Amar Singhal5cccafe2017-02-15 12:42:58 -08008658 struct ch_params *ch_params,
Jeff Johnson66ee8a92018-03-17 15:24:26 -07008659 struct csr_roam_profile *profile)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008660{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308661 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08008662 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008663
Jeff Johnson01f2c232018-11-21 19:17:44 -08008664 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308665 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008666
Jeff Johnson01f2c232018-11-21 19:17:44 -08008667 status = csr_roam_channel_change_req(mac, bssid, ch_params,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008668 profile);
Jeff Johnson01f2c232018-11-21 19:17:44 -08008669 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008670 }
8671 return status;
8672}
8673
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05308674/*
8675 * sme_process_channel_change_resp() -
8676 * API to Indicate Channel change response message to SAP.
8677 *
8678 * Return QDF_STATUS
8679 */
Jeff Johnson0a8786a2018-12-02 10:49:01 -08008680static QDF_STATUS sme_process_channel_change_resp(struct mac_context *mac,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008681 uint16_t msg_type, void *pMsgBuf)
8682{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308683 QDF_STATUS status = QDF_STATUS_SUCCESS;
Jeff Johnson172237b2017-11-07 15:32:59 -08008684 struct csr_roam_info proam_info = { 0 };
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008685 eCsrRoamResult roamResult;
8686 tpSwitchChannelParams pChnlParams = (tpSwitchChannelParams) pMsgBuf;
8687 uint32_t SessionId = pChnlParams->peSessionId;
8688
8689 proam_info.channelChangeRespEvent =
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308690 qdf_mem_malloc(sizeof(tSirChanChangeResponse));
Arif Hussain0ef77082018-10-10 16:42:53 -07008691 if (!proam_info.channelChangeRespEvent) {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308692 status = QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008693 return status;
8694 }
8695 if (msg_type == eWNI_SME_CHANNEL_CHANGE_RSP) {
8696 proam_info.channelChangeRespEvent->sessionId = SessionId;
8697 proam_info.channelChangeRespEvent->newChannelNumber =
8698 pChnlParams->channelNumber;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008699
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308700 if (pChnlParams->status == QDF_STATUS_SUCCESS) {
Abhishek Singhe4a1f882017-08-10 17:59:44 +05308701 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008702 "sapdfs: Received success eWNI_SME_CHANNEL_CHANGE_RSP for sessionId[%d]",
8703 SessionId);
8704 proam_info.channelChangeRespEvent->channelChangeStatus =
8705 1;
8706 roamResult = eCSR_ROAM_RESULT_CHANNEL_CHANGE_SUCCESS;
8707 } else {
Abhishek Singhe4a1f882017-08-10 17:59:44 +05308708 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008709 "sapdfs: Received failure eWNI_SME_CHANNEL_CHANGE_RSP for sessionId[%d]",
8710 SessionId);
8711 proam_info.channelChangeRespEvent->channelChangeStatus =
8712 0;
8713 roamResult = eCSR_ROAM_RESULT_CHANNEL_CHANGE_FAILURE;
8714 }
8715
Jeff Johnson01f2c232018-11-21 19:17:44 -08008716 csr_roam_call_callback(mac, SessionId, &proam_info, 0,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008717 eCSR_ROAM_SET_CHANNEL_RSP, roamResult);
8718
8719 } else {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308720 status = QDF_STATUS_E_FAILURE;
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07008721 sme_err("Invalid Channel Change Resp Message: %d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008722 status);
8723 }
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308724 qdf_mem_free(proam_info.channelChangeRespEvent);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008725
8726 return status;
8727}
8728
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05308729/*
8730 * sme_roam_start_beacon_req() -
8731 * API to Indicate LIM to start Beacon Tx after SAP CAC Wait is completed.
8732 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08008733 * mac_handle - The handle returned by mac_open
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05308734 * sessionId - session ID
8735 * dfsCacWaitStatus - CAC WAIT status flag
8736 * Return QDF_STATUS
8737 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08008738QDF_STATUS sme_roam_start_beacon_req(mac_handle_t mac_handle,
Jeff Johnson1f2dabc2018-11-07 15:33:01 -08008739 struct qdf_mac_addr bssid,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008740 uint8_t dfsCacWaitStatus)
8741{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308742 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08008743 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05308744
Jeff Johnson01f2c232018-11-21 19:17:44 -08008745 status = sme_acquire_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008746
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308747 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08008748 status = csr_roam_start_beacon_req(mac, bssid,
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05308749 dfsCacWaitStatus);
Jeff Johnson01f2c232018-11-21 19:17:44 -08008750 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008751 }
8752 return status;
8753}
8754
Abhishek Singh20a8e442018-09-12 15:50:44 +05308755#ifdef CONFIG_VDEV_SM
Jeff Johnson0a8786a2018-12-02 10:49:01 -08008756QDF_STATUS sme_csa_restart(struct mac_context *mac_ctx, uint8_t session_id)
Abhishek Singh20a8e442018-09-12 15:50:44 +05308757{
8758 QDF_STATUS status = QDF_STATUS_E_FAILURE;
8759
8760 status = sme_acquire_global_lock(&mac_ctx->sme);
8761 if (QDF_IS_STATUS_SUCCESS(status)) {
8762 status = csr_csa_restart(mac_ctx, session_id);
8763 sme_release_global_lock(&mac_ctx->sme);
8764 }
8765
8766 return status;
8767}
8768#endif
8769
Kiran Kumar Lokere999e58c2016-01-07 02:18:39 -08008770/**
8771 * sme_roam_csa_ie_request() - request CSA IE transmission from PE
Jeff Johnsonb460dd72018-11-08 10:26:51 -08008772 * @mac_handle: handle returned by mac_open
Kiran Kumar Lokere999e58c2016-01-07 02:18:39 -08008773 * @bssid: SAP bssid
8774 * @targetChannel: target channel information
8775 * @csaIeReqd: CSA IE Request
8776 * @ch_params: channel information
8777 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308778 * Return: QDF_STATUS
Kiran Kumar Lokere999e58c2016-01-07 02:18:39 -08008779 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08008780QDF_STATUS sme_roam_csa_ie_request(mac_handle_t mac_handle,
8781 struct qdf_mac_addr bssid,
8782 uint8_t targetChannel, uint8_t csaIeReqd,
8783 struct ch_params *ch_params)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008784{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308785 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08008786 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05308787
Jeff Johnson01f2c232018-11-21 19:17:44 -08008788 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308789 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08008790 status = csr_roam_send_chan_sw_ie_request(mac, bssid,
Kiran Kumar Lokere999e58c2016-01-07 02:18:39 -08008791 targetChannel, csaIeReqd, ch_params);
Jeff Johnson01f2c232018-11-21 19:17:44 -08008792 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008793 }
8794 return status;
8795}
8796
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05308797/*
8798 * sme_init_thermal_info() -
8799 * SME API to initialize the thermal mitigation parameters
8800 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08008801 * mac_handle
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05308802 * thermalParam : thermal mitigation parameters
8803 * Return QDF_STATUS
8804 */
Manikandan Mohan9045e2e2018-11-26 16:44:19 -08008805QDF_STATUS sme_init_thermal_info(mac_handle_t mac_handle)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008806{
8807 t_thermal_mgmt *pWmaParam;
Rajeev Kumar37d478b2017-04-17 16:59:28 -07008808 struct scheduler_msg msg = {0};
Jeff Johnson0a8786a2018-12-02 10:49:01 -08008809 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Manikandan Mohan9045e2e2018-11-26 16:44:19 -08008810 struct wlan_fwol_thermal_temp thermal_temp = {0};
8811 QDF_STATUS status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008812
Arif Hussain0ef77082018-10-10 16:42:53 -07008813 pWmaParam = qdf_mem_malloc(sizeof(t_thermal_mgmt));
8814 if (!pWmaParam)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308815 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008816
Manikandan Mohan9045e2e2018-11-26 16:44:19 -08008817 status = ucfg_fwol_get_thermal_temp(mac->psoc, &thermal_temp);
8818 if (QDF_IS_STATUS_ERROR(status))
8819 return qdf_status_to_os_return(status);
8820
8821 pWmaParam->thermalMgmtEnabled = thermal_temp.thermal_mitigation_enable;
8822 pWmaParam->throttlePeriod = thermal_temp.throttle_period;
Poddar, Siddarth83905022016-04-16 17:56:08 -07008823
8824 pWmaParam->throttle_duty_cycle_tbl[0] =
Manikandan Mohan9045e2e2018-11-26 16:44:19 -08008825 thermal_temp.throttle_dutycycle_level[0];
Poddar, Siddarth83905022016-04-16 17:56:08 -07008826 pWmaParam->throttle_duty_cycle_tbl[1] =
Manikandan Mohan9045e2e2018-11-26 16:44:19 -08008827 thermal_temp.throttle_dutycycle_level[1];
Poddar, Siddarth83905022016-04-16 17:56:08 -07008828 pWmaParam->throttle_duty_cycle_tbl[2] =
Manikandan Mohan9045e2e2018-11-26 16:44:19 -08008829 thermal_temp.throttle_dutycycle_level[2];
Poddar, Siddarth83905022016-04-16 17:56:08 -07008830 pWmaParam->throttle_duty_cycle_tbl[3] =
Manikandan Mohan9045e2e2018-11-26 16:44:19 -08008831 thermal_temp.throttle_dutycycle_level[3];
Poddar, Siddarth83905022016-04-16 17:56:08 -07008832
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008833 pWmaParam->thermalLevels[0].minTempThreshold =
Manikandan Mohan9045e2e2018-11-26 16:44:19 -08008834 thermal_temp.thermal_temp_min_level[0];
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008835 pWmaParam->thermalLevels[0].maxTempThreshold =
Manikandan Mohan9045e2e2018-11-26 16:44:19 -08008836 thermal_temp.thermal_temp_max_level[0];
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008837 pWmaParam->thermalLevels[1].minTempThreshold =
Manikandan Mohan9045e2e2018-11-26 16:44:19 -08008838 thermal_temp.thermal_temp_min_level[1];
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008839 pWmaParam->thermalLevels[1].maxTempThreshold =
Manikandan Mohan9045e2e2018-11-26 16:44:19 -08008840 thermal_temp.thermal_temp_max_level[1];
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008841 pWmaParam->thermalLevels[2].minTempThreshold =
Manikandan Mohan9045e2e2018-11-26 16:44:19 -08008842 thermal_temp.thermal_temp_min_level[2];
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008843 pWmaParam->thermalLevels[2].maxTempThreshold =
Manikandan Mohan9045e2e2018-11-26 16:44:19 -08008844 thermal_temp.thermal_temp_max_level[2];
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008845 pWmaParam->thermalLevels[3].minTempThreshold =
Manikandan Mohan9045e2e2018-11-26 16:44:19 -08008846 thermal_temp.thermal_temp_min_level[3];
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008847 pWmaParam->thermalLevels[3].maxTempThreshold =
Manikandan Mohan9045e2e2018-11-26 16:44:19 -08008848 thermal_temp.thermal_temp_max_level[3];
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008849
Jeff Johnson01f2c232018-11-21 19:17:44 -08008850 if (QDF_STATUS_SUCCESS == sme_acquire_global_lock(&mac->sme)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008851 msg.type = WMA_INIT_THERMAL_INFO_CMD;
8852 msg.bodyptr = pWmaParam;
8853
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308854 if (!QDF_IS_STATUS_SUCCESS
gaurank kathpalia36b0c582018-08-28 17:45:43 +05308855 (scheduler_post_message(QDF_MODULE_ID_SME,
8856 QDF_MODULE_ID_WMA,
8857 QDF_MODULE_ID_WMA,
8858 &msg))) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308859 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008860 "%s: Not able to post WMA_SET_THERMAL_INFO_CMD to WMA!",
8861 __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308862 qdf_mem_free(pWmaParam);
Jeff Johnson01f2c232018-11-21 19:17:44 -08008863 sme_release_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308864 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008865 }
Jeff Johnson01f2c232018-11-21 19:17:44 -08008866 sme_release_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308867 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008868 }
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308869 qdf_mem_free(pWmaParam);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308870 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008871}
8872
8873/**
8874 * sme_add_set_thermal_level_callback() - Plug in set thermal level callback
Jeff Johnsonc7309062018-11-09 20:59:42 -08008875 * @mac_handle: Handle returned by macOpen
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008876 * @callback: sme_set_thermal_level_callback
8877 *
8878 * Plug in set thermal level callback
8879 *
8880 * Return: none
8881 */
Jeff Johnsonc7309062018-11-09 20:59:42 -08008882void sme_add_set_thermal_level_callback(mac_handle_t mac_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008883 sme_set_thermal_level_callback callback)
8884{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08008885 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008886
Jeff Johnson01f2c232018-11-21 19:17:44 -08008887 mac->sme.set_thermal_level_cb = callback;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008888}
8889
8890/**
8891 * sme_set_thermal_level() - SME API to set the thermal mitigation level
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -08008892 * @mac_handle: Opaque handle to the global MAC context
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008893 * @level: Thermal mitigation level
8894 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308895 * Return: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008896 */
Jeff Johnsonc7309062018-11-09 20:59:42 -08008897QDF_STATUS sme_set_thermal_level(mac_handle_t mac_handle, uint8_t level)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008898{
Rajeev Kumar37d478b2017-04-17 16:59:28 -07008899 struct scheduler_msg msg = {0};
Jeff Johnson0a8786a2018-12-02 10:49:01 -08008900 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308901 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008902
Jeff Johnson01f2c232018-11-21 19:17:44 -08008903 if (QDF_STATUS_SUCCESS == sme_acquire_global_lock(&mac->sme)) {
hangtian127c9532019-01-12 13:29:07 +08008904 qdf_mem_zero(&msg, sizeof(msg));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008905 msg.type = WMA_SET_THERMAL_LEVEL;
8906 msg.bodyval = level;
8907
gaurank kathpalia36b0c582018-08-28 17:45:43 +05308908 qdf_status = scheduler_post_message(QDF_MODULE_ID_SME,
8909 QDF_MODULE_ID_WMA,
8910 QDF_MODULE_ID_WMA, &msg);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308911 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308912 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008913 "%s: Not able to post WMA_SET_THERMAL_LEVEL to WMA!",
8914 __func__);
Jeff Johnson01f2c232018-11-21 19:17:44 -08008915 sme_release_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308916 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008917 }
Jeff Johnson01f2c232018-11-21 19:17:44 -08008918 sme_release_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308919 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008920 }
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308921 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008922}
8923
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05308924/*
8925 * sme_txpower_limit() -
8926 * SME API to set txpower limits
8927 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08008928 * mac_handle
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05308929 * psmetx : power limits for 2g/5g
8930 * Return QDF_STATUS
8931 */
Jeff Johnson19ce8d02019-02-08 22:56:23 -08008932QDF_STATUS sme_txpower_limit(mac_handle_t mac_handle,
8933 struct tx_power_limit *psmetx)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008934{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308935 QDF_STATUS status = QDF_STATUS_SUCCESS;
8936 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Rajeev Kumar37d478b2017-04-17 16:59:28 -07008937 struct scheduler_msg message = {0};
Jeff Johnson0a8786a2018-12-02 10:49:01 -08008938 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Jeff Johnson19ce8d02019-02-08 22:56:23 -08008939 struct tx_power_limit *tx_power_limit;
Prashanth Bhatta75fa9a12016-01-11 18:30:08 -08008940
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308941 tx_power_limit = qdf_mem_malloc(sizeof(*tx_power_limit));
Arif Hussain0ef77082018-10-10 16:42:53 -07008942 if (!tx_power_limit)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308943 return QDF_STATUS_E_FAILURE;
Prashanth Bhatta75fa9a12016-01-11 18:30:08 -08008944
8945 *tx_power_limit = *psmetx;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008946
Jeff Johnson01f2c232018-11-21 19:17:44 -08008947 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308948 if (QDF_IS_STATUS_SUCCESS(status)) {
Rajeev Kumar8eaedf62017-01-21 11:03:13 -08008949 message.type = WMA_TX_POWER_LIMIT;
8950 message.reserved = 0;
8951 message.bodyptr = tx_power_limit;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008952
gaurank kathpalia36b0c582018-08-28 17:45:43 +05308953 qdf_status = scheduler_post_message(QDF_MODULE_ID_SME,
8954 QDF_MODULE_ID_WMA,
8955 QDF_MODULE_ID_WMA,
8956 &message);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308957 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308958 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008959 "%s: not able to post WMA_TX_POWER_LIMIT",
8960 __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308961 status = QDF_STATUS_E_FAILURE;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308962 qdf_mem_free(tx_power_limit);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008963 }
Jeff Johnson01f2c232018-11-21 19:17:44 -08008964 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008965 }
8966 return status;
8967}
8968
Jeff Johnsonb460dd72018-11-08 10:26:51 -08008969QDF_STATUS sme_update_connect_debug(mac_handle_t mac_handle, uint32_t set_value)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008970{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308971 QDF_STATUS status = QDF_STATUS_SUCCESS;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08008972 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05308973
Jeff Johnson01f2c232018-11-21 19:17:44 -08008974 mac->mlme_cfg->gen.debug_packet_log = set_value;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008975 return status;
8976}
8977
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05308978/*
8979 * sme_ap_disable_intra_bss_fwd() -
8980 * SME will send message to WMA to set Intra BSS in txrx
8981 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08008982 * mac_handle - The handle returned by mac_open
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05308983 * sessionId - session id ( vdev id)
8984 * disablefwd - bool value that indicate disable intrabss fwd disable
8985 * Return QDF_STATUS
8986 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08008987QDF_STATUS sme_ap_disable_intra_bss_fwd(mac_handle_t mac_handle,
8988 uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008989 bool disablefwd)
8990{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08008991 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308992 int status = QDF_STATUS_SUCCESS;
8993 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Rajeev Kumar37d478b2017-04-17 16:59:28 -07008994 struct scheduler_msg message = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008995 tpDisableIntraBssFwd pSapDisableIntraFwd = NULL;
8996
8997 /* Prepare the request to send to SME. */
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308998 pSapDisableIntraFwd = qdf_mem_malloc(sizeof(tDisableIntraBssFwd));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008999 if (NULL == pSapDisableIntraFwd) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07009000 sme_err("Memory Allocation Failure!!!");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309001 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009002 }
9003
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009004 pSapDisableIntraFwd->sessionId = sessionId;
9005 pSapDisableIntraFwd->disableintrabssfwd = disablefwd;
9006
Jeff Johnson01f2c232018-11-21 19:17:44 -08009007 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309008 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009009 /* serialize the req through MC thread */
Rajeev Kumar8eaedf62017-01-21 11:03:13 -08009010 message.bodyptr = pSapDisableIntraFwd;
9011 message.type = WMA_SET_SAP_INTRABSS_DIS;
gaurank kathpalia36b0c582018-08-28 17:45:43 +05309012 qdf_status = scheduler_post_message(QDF_MODULE_ID_SME,
9013 QDF_MODULE_ID_WMA,
9014 QDF_MODULE_ID_WMA,
9015 &message);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309016 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
9017 status = QDF_STATUS_E_FAILURE;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05309018 qdf_mem_free(pSapDisableIntraFwd);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009019 }
Jeff Johnson01f2c232018-11-21 19:17:44 -08009020 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009021 }
9022 return status;
9023}
9024
9025#ifdef WLAN_FEATURE_STATS_EXT
9026
Jeff Johnson45843652018-07-04 12:47:34 -07009027void sme_stats_ext_register_callback(mac_handle_t mac_handle,
9028 stats_ext_cb callback)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009029{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08009030 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009031
Jeff Johnson45843652018-07-04 12:47:34 -07009032 if (!mac) {
9033 sme_err("Invalid mac context");
Arun Khandavalli4b55da72016-07-19 19:55:01 +05309034 return;
9035 }
9036
Jeff Johnson45843652018-07-04 12:47:34 -07009037 mac->sme.stats_ext_cb = callback;
Arun Khandavalli4b55da72016-07-19 19:55:01 +05309038}
9039
Jeff Johnson45843652018-07-04 12:47:34 -07009040void sme_stats_ext_deregister_callback(mac_handle_t mac_handle)
9041{
9042 sme_stats_ext_register_callback(mac_handle, NULL);
9043}
9044
9045void sme_stats_ext2_register_callback(mac_handle_t mac_handle,
9046 stats_ext2_cb callback)
9047{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08009048 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Jeff Johnson45843652018-07-04 12:47:34 -07009049
9050 if (!mac) {
9051 sme_err("Invalid mac context");
9052 return;
9053 }
9054
9055 mac->sme.stats_ext2_cb = callback;
9056}
Arun Khandavalli4b55da72016-07-19 19:55:01 +05309057
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05309058/*
9059 * sme_stats_ext_request() -
9060 * Function called when HDD receives STATS EXT vendor command from userspace
9061 *
9062 * sessionID - vdevID for the stats ext request
9063 * input - Stats Ext Request structure ptr
9064 * Return QDF_STATUS
9065 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309066QDF_STATUS sme_stats_ext_request(uint8_t session_id, tpStatsExtRequestReq input)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009067{
Rajeev Kumar37d478b2017-04-17 16:59:28 -07009068 struct scheduler_msg msg = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009069 tpStatsExtRequest data;
9070 size_t data_len;
9071
9072 data_len = sizeof(tStatsExtRequest) + input->request_data_len;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05309073 data = qdf_mem_malloc(data_len);
Arif Hussain0ef77082018-10-10 16:42:53 -07009074 if (!data)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309075 return QDF_STATUS_E_NOMEM;
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05309076
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009077 data->vdev_id = session_id;
9078 data->request_data_len = input->request_data_len;
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05309079 if (input->request_data_len)
Anurag Chouhan600c3a02016-03-01 10:33:54 +05309080 qdf_mem_copy(data->request_data,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009081 input->request_data, input->request_data_len);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009082
9083 msg.type = WMA_STATS_EXT_REQUEST;
9084 msg.reserved = 0;
9085 msg.bodyptr = data;
9086
gaurank kathpalia36b0c582018-08-28 17:45:43 +05309087 if (QDF_STATUS_SUCCESS != scheduler_post_message(QDF_MODULE_ID_SME,
9088 QDF_MODULE_ID_WMA,
9089 QDF_MODULE_ID_WMA,
9090 &msg)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05309091 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009092 "%s: Not able to post WMA_STATS_EXT_REQUEST message to WMA",
9093 __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05309094 qdf_mem_free(data);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309095 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009096 }
9097
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309098 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009099}
9100
Jeff Johnsonfdecd512018-06-10 09:18:32 -07009101/**
9102 * sme_stats_ext_event() - eWNI_SME_STATS_EXT_EVENT processor
9103 * @mac: Global MAC context
9104 * @msg: "stats ext" message
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009105
Jeff Johnsonfdecd512018-06-10 09:18:32 -07009106 * This callback function called when SME received eWNI_SME_STATS_EXT_EVENT
9107 * response from WMA
9108 *
9109 * Return: QDF_STATUS
9110 */
Jeff Johnson0a8786a2018-12-02 10:49:01 -08009111static QDF_STATUS sme_stats_ext_event(struct mac_context *mac,
Jeff Johnson45843652018-07-04 12:47:34 -07009112 struct stats_ext_event *msg)
Jeff Johnsonfdecd512018-06-10 09:18:32 -07009113{
9114 if (!msg) {
9115 sme_err("Null msg");
9116 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009117 }
9118
Jeff Johnson45843652018-07-04 12:47:34 -07009119 if (mac->sme.stats_ext_cb)
9120 mac->sme.stats_ext_cb(mac->hdd_handle, msg);
Jeff Johnsonfdecd512018-06-10 09:18:32 -07009121
9122 return QDF_STATUS_SUCCESS;
9123}
9124
9125#else
9126
Jeff Johnson0a8786a2018-12-02 10:49:01 -08009127static QDF_STATUS sme_stats_ext_event(struct mac_context *mac,
Jeff Johnson45843652018-07-04 12:47:34 -07009128 struct stats_ext_event *msg)
Jeff Johnsonfdecd512018-06-10 09:18:32 -07009129{
9130 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009131}
9132
9133#endif
9134
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05309135/*
9136 * sme_update_dfs_scan_mode() -
9137 * Update DFS roam scan mode
9138 * This function is called through dynamic setConfig callback function
9139 * to configure allowDFSChannelRoam.
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -08009140 * mac_handle: Opaque handle to the global MAC context
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05309141 * sessionId - Session Identifier
9142 * allowDFSChannelRoam - DFS roaming scan mode 0 (disable),
9143 * 1 (passive), 2 (active)
9144 * Return QDF_STATUS_SUCCESS - SME update DFS roaming scan config
9145 * successfully.
9146 * Other status means SME failed to update DFS roaming scan config.
9147 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08009148QDF_STATUS sme_update_dfs_scan_mode(mac_handle_t mac_handle, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009149 uint8_t allowDFSChannelRoam)
9150{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08009151 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309152 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009153
Dustin Brownad06be62019-02-04 14:52:56 -08009154 if (sessionId >= WLAN_MAX_VDEVS) {
Naveen Rawatc36f7eb2016-11-10 20:01:03 -08009155 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
9156 FL("Invalid sme session id: %d"), sessionId);
9157 return QDF_STATUS_E_INVAL;
9158 }
9159
Jeff Johnson01f2c232018-11-21 19:17:44 -08009160 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309161 if (QDF_IS_STATUS_SUCCESS(status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05309162 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05309163 "LFR runtime successfully set AllowDFSChannelRoam Mode to %d - old value is %d - roam state is %s",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009164 allowDFSChannelRoam,
Wu Gao51a63562018-11-08 16:29:10 +08009165 mac->mlme_cfg->lfr.roaming_dfs_channel,
Jeff Johnson01f2c232018-11-21 19:17:44 -08009166 mac_trace_get_neighbour_roam_state(mac->roam.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009167 neighborRoamInfo
9168 [sessionId].
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05309169 neighborRoamState));
Wu Gao51a63562018-11-08 16:29:10 +08009170 mac->mlme_cfg->lfr.roaming_dfs_channel =
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009171 allowDFSChannelRoam;
Wu Gao51a63562018-11-08 16:29:10 +08009172 if (mac->mlme_cfg->lfr.roam_scan_offload_enabled) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08009173 csr_roam_offload_scan(mac, sessionId,
Vignesh Viswanathan4e65e8e2018-05-01 12:04:16 +05309174 ROAM_SCAN_OFFLOAD_UPDATE_CFG,
9175 REASON_ROAM_DFS_SCAN_MODE_CHANGED);
9176 }
Jeff Johnson01f2c232018-11-21 19:17:44 -08009177 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009178 }
Vignesh Viswanathan4e65e8e2018-05-01 12:04:16 +05309179
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009180
9181 return status;
9182}
9183
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05309184/*
9185 * sme_get_dfs_scan_mode() - get DFS roam scan mode
9186 * This is a synchronous call
9187 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08009188 * mac_handle - The handle returned by mac_open.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05309189 * Return DFS roaming scan mode 0 (disable), 1 (passive), 2 (active)
9190 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08009191uint8_t sme_get_dfs_scan_mode(mac_handle_t mac_handle)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009192{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08009193 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05309194
Wu Gao51a63562018-11-08 16:29:10 +08009195 return mac->mlme_cfg->lfr.roaming_dfs_channel;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009196}
9197
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05309198/*
9199 * sme_modify_add_ie() -
9200 * This function sends msg to updates the additional IE buffers in PE
9201 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08009202 * mac_handle - global structure
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05309203 * pModifyIE - pointer to tModifyIE structure
9204 * updateType - type of buffer
9205 * Return Success or failure
9206 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08009207QDF_STATUS sme_modify_add_ie(mac_handle_t mac_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009208 tSirModifyIE *pModifyIE, eUpdateIEsType updateType)
9209{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309210 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08009211 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05309212
Jeff Johnson01f2c232018-11-21 19:17:44 -08009213 status = sme_acquire_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009214
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309215 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08009216 status = csr_roam_modify_add_ies(mac, pModifyIE, updateType);
9217 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009218 }
9219 return status;
9220}
9221
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05309222/*
9223 * sme_update_add_ie() -
9224 * This function sends msg to updates the additional IE buffers in PE
9225 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08009226 * mac_handle - global structure
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05309227 * pUpdateIE - pointer to structure tUpdateIE
9228 * updateType - type of buffer
9229 * Return Success or failure
9230 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08009231QDF_STATUS sme_update_add_ie(mac_handle_t mac_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009232 tSirUpdateIE *pUpdateIE, eUpdateIEsType updateType)
9233{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309234 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08009235 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05309236
Jeff Johnson01f2c232018-11-21 19:17:44 -08009237 status = sme_acquire_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009238
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309239 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08009240 status = csr_roam_update_add_ies(mac, pUpdateIE, updateType);
9241 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009242 }
9243 return status;
9244}
9245
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009246/**
9247 * sme_update_dsc_pto_up_mapping()
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -08009248 * @mac_handle: Opaque handle to the global MAC context
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009249 * @dscpmapping: pointer to DSCP mapping structure
9250 * @sessionId: SME session id
9251 *
9252 * This routine is called to update dscp mapping
9253 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309254 * Return: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009255 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08009256QDF_STATUS sme_update_dsc_pto_up_mapping(mac_handle_t mac_handle,
Abhishek Singh12be60f2017-08-11 13:52:42 +05309257 enum sme_qos_wmmuptype *dscpmapping,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009258 uint8_t sessionId)
9259{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08009260 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309261 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009262 uint8_t i, j, peSessionId;
gaurank kathpalia14e2f912017-08-31 14:51:45 +05309263 struct csr_roam_session *pCsrSession = NULL;
Jeff Johnson59104482018-11-18 21:30:19 -08009264 struct pe_session *pSession = NULL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009265
Jeff Johnson01f2c232018-11-21 19:17:44 -08009266 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309267 if (!QDF_IS_STATUS_SUCCESS(status))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009268 return status;
Jeff Johnson01f2c232018-11-21 19:17:44 -08009269 pCsrSession = CSR_GET_SESSION(mac, sessionId);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009270 if (pCsrSession == NULL) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05309271 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009272 FL("Session lookup fails for CSR session"));
Jeff Johnson01f2c232018-11-21 19:17:44 -08009273 sme_release_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309274 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009275 }
Jeff Johnson01f2c232018-11-21 19:17:44 -08009276 if (!CSR_IS_SESSION_VALID(mac, sessionId)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05309277 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009278 FL("Invalid session Id %u"), sessionId);
Jeff Johnson01f2c232018-11-21 19:17:44 -08009279 sme_release_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309280 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009281 }
9282
Jeff Johnson01f2c232018-11-21 19:17:44 -08009283 pSession = pe_find_session_by_bssid(mac,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009284 pCsrSession->connectedProfile.bssid.bytes,
9285 &peSessionId);
9286
9287 if (pSession == NULL) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05309288 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009289 FL(" Session lookup fails for BSSID"));
Jeff Johnson01f2c232018-11-21 19:17:44 -08009290 sme_release_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309291 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009292 }
9293
9294 if (!pSession->QosMapSet.present) {
Srinivas Girigowda2b5d47c2017-03-29 00:28:46 -07009295 sme_debug("QOS Mapping IE not present");
Jeff Johnson01f2c232018-11-21 19:17:44 -08009296 sme_release_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309297 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009298 }
9299 for (i = 0; i < SME_QOS_WMM_UP_MAX; i++) {
9300 for (j = pSession->QosMapSet.dscp_range[i][0];
9301 j <= pSession->QosMapSet.dscp_range[i][1];
9302 j++) {
9303 if ((pSession->QosMapSet.dscp_range[i][0] == 255)
9304 && (pSession->QosMapSet.dscp_range[i][1] ==
9305 255)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05309306 QDF_TRACE(QDF_MODULE_ID_SME,
Kiran Kumar Lokere1d411bb2017-11-29 15:24:05 -08009307 QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009308 FL("User Priority %d isn't used"), i);
9309 break;
9310 } else {
9311 dscpmapping[j] = i;
9312 }
9313 }
9314 }
9315 for (i = 0; i < pSession->QosMapSet.num_dscp_exceptions; i++)
9316 if (pSession->QosMapSet.dscp_exceptions[i][0] != 255)
9317 dscpmapping[pSession->QosMapSet.dscp_exceptions[i][0]] =
9318 pSession->QosMapSet.dscp_exceptions[i][1];
9319
Jeff Johnson01f2c232018-11-21 19:17:44 -08009320 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009321 return status;
9322}
9323
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05309324/*
9325 * sme_abort_roam_scan() -
9326 * API to abort current roam scan cycle by roam scan offload module.
9327 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08009328 * mac_handle - The handle returned by mac_open.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05309329 * sessionId - Session Identifier
9330 * Return QDF_STATUS
9331 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009332
Jeff Johnsonb460dd72018-11-08 10:26:51 -08009333QDF_STATUS sme_abort_roam_scan(mac_handle_t mac_handle, uint8_t sessionId)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009334{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309335 QDF_STATUS status = QDF_STATUS_SUCCESS;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08009336 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009337
Wu Gao51a63562018-11-08 16:29:10 +08009338 if (mac->mlme_cfg->lfr.roam_scan_offload_enabled) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009339 /* acquire the lock for the sme object */
Jeff Johnson01f2c232018-11-21 19:17:44 -08009340 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309341 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08009342 csr_roam_offload_scan(mac, sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009343 ROAM_SCAN_OFFLOAD_ABORT_SCAN,
9344 REASON_ROAM_ABORT_ROAM_SCAN);
9345 /* release the lock for the sme object */
Jeff Johnson01f2c232018-11-21 19:17:44 -08009346 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009347 }
9348 }
9349
9350 return status;
9351}
9352
9353#ifdef FEATURE_WLAN_EXTSCAN
9354/**
9355 * sme_get_valid_channels_by_band() - to fetch valid channels filtered by band
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -08009356 * @mac_handle: Opaque handle to the global MAC context
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009357 * @wifiBand: RF band information
9358 * @aValidChannels: output array to store channel info
9359 * @pNumChannels: output number of channels
9360 *
9361 * SME API to fetch all valid channels filtered by band
9362 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309363 * Return: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009364 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08009365QDF_STATUS sme_get_valid_channels_by_band(mac_handle_t mac_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009366 uint8_t wifiBand,
9367 uint32_t *aValidChannels,
9368 uint8_t *pNumChannels)
9369{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309370 QDF_STATUS status = QDF_STATUS_SUCCESS;
Wu Gao0821b0d2019-01-11 17:31:11 +08009371 uint8_t chanList[CFG_VALID_CHANNEL_LIST_LEN] = { 0 };
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009372 uint8_t numChannels = 0;
9373 uint8_t i = 0;
Wu Gao0821b0d2019-01-11 17:31:11 +08009374 uint32_t totValidChannels = CFG_VALID_CHANNEL_LIST_LEN;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08009375 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009376
9377 if (!aValidChannels || !pNumChannels) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07009378 sme_err("Output channel list/NumChannels is NULL");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309379 return QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009380 }
9381
Sreelakshmi Konamki0d17c6a2017-06-08 12:58:54 +05309382 if (wifiBand >= WIFI_BAND_MAX) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07009383 sme_err("Invalid wifiBand: %d", wifiBand);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309384 return QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009385 }
9386
Tushnim Bhattacharyya0c4ad2d2017-03-09 15:59:03 -08009387 status = sme_get_cfg_valid_channels(&chanList[0],
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009388 &totValidChannels);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309389 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07009390 sme_err("Fail to get valid channel list (err=%d)", status);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009391 return status;
9392 }
9393
9394 switch (wifiBand) {
9395 case WIFI_BAND_UNSPECIFIED:
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07009396 sme_debug("Unspec Band, return all %d valid channels",
9397 totValidChannels);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009398 numChannels = totValidChannels;
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05309399 for (i = 0; i < totValidChannels; i++)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009400 aValidChannels[i] = cds_chan_to_freq(chanList[i]);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009401 break;
9402
9403 case WIFI_BAND_BG:
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07009404 sme_debug("WIFI_BAND_BG (2.4 GHz)");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009405 for (i = 0; i < totValidChannels; i++) {
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05309406 if (WLAN_REG_IS_24GHZ_CH(chanList[i]))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009407 aValidChannels[numChannels++] =
9408 cds_chan_to_freq(chanList[i]);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009409 }
9410 break;
9411
9412 case WIFI_BAND_A:
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07009413 sme_debug("WIFI_BAND_A (5 GHz without DFS)");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009414 for (i = 0; i < totValidChannels; i++) {
Kiran Kumar Lokerea3de2262017-04-12 12:15:04 -07009415 if (WLAN_REG_IS_5GHZ_CH(chanList[i]) &&
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05309416 !wlan_reg_is_dfs_ch(mac_ctx->pdev, chanList[i]))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009417 aValidChannels[numChannels++] =
9418 cds_chan_to_freq(chanList[i]);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009419 }
9420 break;
9421
9422 case WIFI_BAND_ABG:
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07009423 sme_debug("WIFI_BAND_ABG (2.4 GHz + 5 GHz; no DFS)");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009424 for (i = 0; i < totValidChannels; i++) {
Kiran Kumar Lokerea3de2262017-04-12 12:15:04 -07009425 if ((WLAN_REG_IS_24GHZ_CH(chanList[i]) ||
9426 WLAN_REG_IS_5GHZ_CH(chanList[i])) &&
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05309427 !wlan_reg_is_dfs_ch(mac_ctx->pdev, chanList[i]))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009428 aValidChannels[numChannels++] =
9429 cds_chan_to_freq(chanList[i]);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009430 }
9431 break;
9432
9433 case WIFI_BAND_A_DFS_ONLY:
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07009434 sme_debug("WIFI_BAND_A_DFS (5 GHz DFS only)");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009435 for (i = 0; i < totValidChannels; i++) {
Kiran Kumar Lokerea3de2262017-04-12 12:15:04 -07009436 if (WLAN_REG_IS_5GHZ_CH(chanList[i]) &&
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05309437 wlan_reg_is_dfs_ch(mac_ctx->pdev, chanList[i]))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009438 aValidChannels[numChannels++] =
9439 cds_chan_to_freq(chanList[i]);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009440 }
9441 break;
9442
9443 case WIFI_BAND_A_WITH_DFS:
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07009444 sme_debug("WIFI_BAND_A_WITH_DFS (5 GHz with DFS)");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009445 for (i = 0; i < totValidChannels; i++) {
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05309446 if (WLAN_REG_IS_5GHZ_CH(chanList[i]))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009447 aValidChannels[numChannels++] =
9448 cds_chan_to_freq(chanList[i]);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009449 }
9450 break;
9451
9452 case WIFI_BAND_ABG_WITH_DFS:
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07009453 sme_debug("WIFI_BAND_ABG_WITH_DFS (2.4 GHz+5 GHz with DFS)");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009454 for (i = 0; i < totValidChannels; i++) {
Kiran Kumar Lokerea3de2262017-04-12 12:15:04 -07009455 if (WLAN_REG_IS_24GHZ_CH(chanList[i]) ||
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05309456 WLAN_REG_IS_5GHZ_CH(chanList[i]))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009457 aValidChannels[numChannels++] =
9458 cds_chan_to_freq(chanList[i]);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009459 }
9460 break;
9461
9462 default:
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07009463 sme_err("Unknown wifiBand: %d", wifiBand);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309464 return QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009465 }
9466 *pNumChannels = numChannels;
9467
9468 return status;
9469}
9470
Jeff Johnsonfed9a732018-07-18 12:18:03 -07009471QDF_STATUS
9472sme_ext_scan_get_capabilities(mac_handle_t mac_handle,
9473 struct extscan_capabilities_params *params)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009474{
Jeff Johnsonfed9a732018-07-18 12:18:03 -07009475 QDF_STATUS status;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08009476 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Rajeev Kumar37d478b2017-04-17 16:59:28 -07009477 struct scheduler_msg message = {0};
Jeff Johnsonfed9a732018-07-18 12:18:03 -07009478 struct extscan_capabilities_params *bodyptr;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009479
Jeff Johnsonfed9a732018-07-18 12:18:03 -07009480 /* per contract must make a copy of the params when messaging */
9481 bodyptr = qdf_mem_malloc(sizeof(*bodyptr));
9482 if (!bodyptr)
9483 return QDF_STATUS_E_NOMEM;
9484 *bodyptr = *params;
9485
9486 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309487 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009488 /* Serialize the req through MC thread */
Jeff Johnsonfed9a732018-07-18 12:18:03 -07009489 message.bodyptr = bodyptr;
Rajeev Kumar8eaedf62017-01-21 11:03:13 -08009490 message.type = WMA_EXTSCAN_GET_CAPABILITIES_REQ;
Jeff Johnsonfed9a732018-07-18 12:18:03 -07009491 qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
9492 NO_SESSION, message.type);
9493 status = scheduler_post_message(QDF_MODULE_ID_SME,
9494 QDF_MODULE_ID_WMA,
9495 QDF_MODULE_ID_WMA,
9496 &message);
9497 sme_release_global_lock(&mac->sme);
9498 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009499
Jeff Johnsonfed9a732018-07-18 12:18:03 -07009500 if (QDF_IS_STATUS_ERROR(status)) {
9501 sme_err("failure: %d", status);
9502 qdf_mem_free(bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009503 }
9504 return status;
9505}
9506
Jeff Johnsondab58602018-07-14 15:30:24 -07009507QDF_STATUS
9508sme_ext_scan_start(mac_handle_t mac_handle,
9509 struct wifi_scan_cmd_req_params *params)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009510{
Jeff Johnsondab58602018-07-14 15:30:24 -07009511 QDF_STATUS status;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08009512 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Rajeev Kumar37d478b2017-04-17 16:59:28 -07009513 struct scheduler_msg message = {0};
Jeff Johnsondab58602018-07-14 15:30:24 -07009514 struct wifi_scan_cmd_req_params *bodyptr;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009515
Jeff Johnsondab58602018-07-14 15:30:24 -07009516 /* per contract must make a copy of the params when messaging */
9517 bodyptr = qdf_mem_malloc(sizeof(*bodyptr));
9518 if (!bodyptr)
9519 return QDF_STATUS_E_NOMEM;
9520 *bodyptr = *params;
9521
9522 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309523 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009524 /* Serialize the req through MC thread */
Jeff Johnsondab58602018-07-14 15:30:24 -07009525 message.bodyptr = bodyptr;
Rajeev Kumar8eaedf62017-01-21 11:03:13 -08009526 message.type = WMA_EXTSCAN_START_REQ;
Jeff Johnsondab58602018-07-14 15:30:24 -07009527 qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
9528 NO_SESSION, message.type);
9529 status = scheduler_post_message(QDF_MODULE_ID_SME,
9530 QDF_MODULE_ID_WMA,
9531 QDF_MODULE_ID_WMA,
9532 &message);
9533 sme_release_global_lock(&mac->sme);
9534 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009535
Jeff Johnsondab58602018-07-14 15:30:24 -07009536 if (QDF_IS_STATUS_ERROR(status)) {
9537 sme_err("failure: %d", status);
9538 qdf_mem_free(bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009539 }
9540 return status;
9541}
9542
Jeff Johnson7272ea72018-07-15 17:22:27 -07009543QDF_STATUS sme_ext_scan_stop(mac_handle_t mac_handle,
9544 struct extscan_stop_req_params *params)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009545{
Jeff Johnson7272ea72018-07-15 17:22:27 -07009546 QDF_STATUS status;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08009547 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Rajeev Kumar37d478b2017-04-17 16:59:28 -07009548 struct scheduler_msg message = {0};
Jeff Johnson7272ea72018-07-15 17:22:27 -07009549 struct extscan_stop_req_params *bodyptr;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009550
Jeff Johnson7272ea72018-07-15 17:22:27 -07009551 /* per contract must make a copy of the params when messaging */
9552 bodyptr = qdf_mem_malloc(sizeof(*bodyptr));
9553 if (!bodyptr)
9554 return QDF_STATUS_E_NOMEM;
9555 *bodyptr = *params;
9556
9557 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309558 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009559 /* Serialize the req through MC thread */
Jeff Johnson7272ea72018-07-15 17:22:27 -07009560 message.bodyptr = bodyptr;
Rajeev Kumar8eaedf62017-01-21 11:03:13 -08009561 message.type = WMA_EXTSCAN_STOP_REQ;
Jeff Johnson7272ea72018-07-15 17:22:27 -07009562 qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
9563 NO_SESSION, message.type);
9564 status = scheduler_post_message(QDF_MODULE_ID_SME,
9565 QDF_MODULE_ID_WMA,
9566 QDF_MODULE_ID_WMA,
9567 &message);
9568 sme_release_global_lock(&mac->sme);
9569 }
9570
9571 if (QDF_IS_STATUS_ERROR(status)) {
9572 sme_err("failure: %d", status);
9573 qdf_mem_free(bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009574 }
9575 return status;
9576}
9577
Jeff Johnson1148cb02018-07-13 23:14:32 -07009578QDF_STATUS
9579sme_set_bss_hotlist(mac_handle_t mac_handle,
9580 struct extscan_bssid_hotlist_set_params *params)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009581{
Jeff Johnson1148cb02018-07-13 23:14:32 -07009582 QDF_STATUS status;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08009583 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Rajeev Kumar37d478b2017-04-17 16:59:28 -07009584 struct scheduler_msg message = {0};
Jeff Johnson1148cb02018-07-13 23:14:32 -07009585 struct extscan_bssid_hotlist_set_params *bodyptr;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009586
Jeff Johnson1148cb02018-07-13 23:14:32 -07009587 /* per contract must make a copy of the params when messaging */
9588 bodyptr = qdf_mem_malloc(sizeof(*bodyptr));
Arif Hussain0ef77082018-10-10 16:42:53 -07009589 if (!bodyptr)
Jeff Johnson1148cb02018-07-13 23:14:32 -07009590 return QDF_STATUS_E_NOMEM;
Arif Hussain0ef77082018-10-10 16:42:53 -07009591
Jeff Johnson1148cb02018-07-13 23:14:32 -07009592 *bodyptr = *params;
9593
9594 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309595 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009596 /* Serialize the req through MC thread */
Jeff Johnson1148cb02018-07-13 23:14:32 -07009597 message.bodyptr = bodyptr;
Rajeev Kumar8eaedf62017-01-21 11:03:13 -08009598 message.type = WMA_EXTSCAN_SET_BSSID_HOTLIST_REQ;
Jeff Johnson1148cb02018-07-13 23:14:32 -07009599 qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
9600 NO_SESSION, message.type);
gaurank kathpalia36b0c582018-08-28 17:45:43 +05309601 status = scheduler_post_message(QDF_MODULE_ID_SME,
9602 QDF_MODULE_ID_WMA,
9603 QDF_MODULE_ID_WMA, &message);
Jeff Johnson1148cb02018-07-13 23:14:32 -07009604 sme_release_global_lock(&mac->sme);
9605 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009606
Jeff Johnson1148cb02018-07-13 23:14:32 -07009607 if (QDF_IS_STATUS_ERROR(status)) {
9608 sme_err("failure: %d", status);
9609 qdf_mem_free(bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009610 }
9611 return status;
9612}
9613
Jeff Johnson9743eb72018-07-14 10:30:04 -07009614QDF_STATUS
9615sme_reset_bss_hotlist(mac_handle_t mac_handle,
9616 struct extscan_bssid_hotlist_reset_params *params)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009617{
Jeff Johnson9743eb72018-07-14 10:30:04 -07009618 QDF_STATUS status;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08009619 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Rajeev Kumar37d478b2017-04-17 16:59:28 -07009620 struct scheduler_msg message = {0};
Jeff Johnson9743eb72018-07-14 10:30:04 -07009621 struct extscan_bssid_hotlist_reset_params *bodyptr;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009622
Jeff Johnson9743eb72018-07-14 10:30:04 -07009623 /* per contract must make a copy of the params when messaging */
9624 bodyptr = qdf_mem_malloc(sizeof(*bodyptr));
Arif Hussain0ef77082018-10-10 16:42:53 -07009625 if (!bodyptr)
Jeff Johnson9743eb72018-07-14 10:30:04 -07009626 return QDF_STATUS_E_NOMEM;
Arif Hussain0ef77082018-10-10 16:42:53 -07009627
Jeff Johnson9743eb72018-07-14 10:30:04 -07009628 *bodyptr = *params;
9629
9630 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309631 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009632 /* Serialize the req through MC thread */
Jeff Johnson9743eb72018-07-14 10:30:04 -07009633 message.bodyptr = bodyptr;
Rajeev Kumar8eaedf62017-01-21 11:03:13 -08009634 message.type = WMA_EXTSCAN_RESET_BSSID_HOTLIST_REQ;
Sreelakshmi Konamki6a065362016-05-31 16:05:01 +05309635 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
Rajeev Kumar8eaedf62017-01-21 11:03:13 -08009636 NO_SESSION, message.type));
gaurank kathpalia36b0c582018-08-28 17:45:43 +05309637 status = scheduler_post_message(QDF_MODULE_ID_SME,
9638 QDF_MODULE_ID_WMA,
9639 QDF_MODULE_ID_WMA, &message);
Jeff Johnson9743eb72018-07-14 10:30:04 -07009640 sme_release_global_lock(&mac->sme);
9641 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009642
Jeff Johnson9743eb72018-07-14 10:30:04 -07009643 if (QDF_IS_STATUS_ERROR(status)) {
9644 sme_err("failure: %d", status);
9645 qdf_mem_free(bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009646 }
9647 return status;
9648}
9649
Jeff Johnsonb43ed032018-07-16 06:59:21 -07009650QDF_STATUS
9651sme_set_significant_change(mac_handle_t mac_handle,
9652 struct extscan_set_sig_changereq_params *params)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009653{
Jeff Johnsonb43ed032018-07-16 06:59:21 -07009654 QDF_STATUS status;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08009655 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Rajeev Kumar37d478b2017-04-17 16:59:28 -07009656 struct scheduler_msg message = {0};
Jeff Johnsonb43ed032018-07-16 06:59:21 -07009657 struct extscan_set_sig_changereq_params *bodyptr;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009658
Jeff Johnsonb43ed032018-07-16 06:59:21 -07009659 /* per contract must make a copy of the params when messaging */
9660 bodyptr = qdf_mem_malloc(sizeof(*bodyptr));
Arif Hussain0ef77082018-10-10 16:42:53 -07009661 if (!bodyptr)
Jeff Johnsonb43ed032018-07-16 06:59:21 -07009662 return QDF_STATUS_E_NOMEM;
Arif Hussain0ef77082018-10-10 16:42:53 -07009663
Jeff Johnsonb43ed032018-07-16 06:59:21 -07009664 *bodyptr = *params;
9665
9666 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309667 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009668 /* Serialize the req through MC thread */
Jeff Johnsonb43ed032018-07-16 06:59:21 -07009669 message.bodyptr = bodyptr;
Rajeev Kumar8eaedf62017-01-21 11:03:13 -08009670 message.type = WMA_EXTSCAN_SET_SIGNF_CHANGE_REQ;
gaurank kathpalia36b0c582018-08-28 17:45:43 +05309671 status = scheduler_post_message(QDF_MODULE_ID_SME,
9672 QDF_MODULE_ID_WMA,
9673 QDF_MODULE_ID_WMA,
9674 &message);
Jeff Johnsonb43ed032018-07-16 06:59:21 -07009675 sme_release_global_lock(&mac->sme);
9676 }
Jeff Johnsonb43ed032018-07-16 06:59:21 -07009677 if (QDF_IS_STATUS_ERROR(status)) {
9678 sme_err("failure: %d", status);
9679 qdf_mem_free(bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009680 }
9681 return status;
9682}
9683
Jeff Johnson0c8dbc32018-07-16 22:10:48 -07009684QDF_STATUS
9685sme_reset_significant_change(mac_handle_t mac_handle,
9686 struct extscan_capabilities_reset_params *params)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009687{
Jeff Johnson0c8dbc32018-07-16 22:10:48 -07009688 QDF_STATUS status;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08009689 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Rajeev Kumar37d478b2017-04-17 16:59:28 -07009690 struct scheduler_msg message = {0};
Jeff Johnson0c8dbc32018-07-16 22:10:48 -07009691 struct extscan_capabilities_reset_params *bodyptr;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009692
Jeff Johnson0c8dbc32018-07-16 22:10:48 -07009693 /* per contract must make a copy of the params when messaging */
9694 bodyptr = qdf_mem_malloc(sizeof(*bodyptr));
Arif Hussain0ef77082018-10-10 16:42:53 -07009695 if (!bodyptr)
Jeff Johnson0c8dbc32018-07-16 22:10:48 -07009696 return QDF_STATUS_E_NOMEM;
Arif Hussain0ef77082018-10-10 16:42:53 -07009697
Jeff Johnson0c8dbc32018-07-16 22:10:48 -07009698 *bodyptr = *params;
9699
9700 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309701 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009702 /* Serialize the req through MC thread */
Jeff Johnson0c8dbc32018-07-16 22:10:48 -07009703 message.bodyptr = bodyptr;
Rajeev Kumar8eaedf62017-01-21 11:03:13 -08009704 message.type = WMA_EXTSCAN_RESET_SIGNF_CHANGE_REQ;
Sreelakshmi Konamki6a065362016-05-31 16:05:01 +05309705 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
Rajeev Kumar8eaedf62017-01-21 11:03:13 -08009706 NO_SESSION, message.type));
gaurank kathpalia36b0c582018-08-28 17:45:43 +05309707 status = scheduler_post_message(QDF_MODULE_ID_SME,
9708 QDF_MODULE_ID_WMA,
9709 QDF_MODULE_ID_WMA,
9710 &message);
Jeff Johnson0c8dbc32018-07-16 22:10:48 -07009711 sme_release_global_lock(&mac->sme);
9712 }
Jeff Johnson0c8dbc32018-07-16 22:10:48 -07009713 if (QDF_IS_STATUS_ERROR(status)) {
9714 sme_err("failure: %d", status);
9715 qdf_mem_free(bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009716 }
gaurank kathpalia36b0c582018-08-28 17:45:43 +05309717
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009718 return status;
9719}
9720
Jeff Johnson2ba60092018-07-17 08:19:37 -07009721QDF_STATUS
9722sme_get_cached_results(mac_handle_t mac_handle,
9723 struct extscan_cached_result_params *params)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009724{
Jeff Johnson2ba60092018-07-17 08:19:37 -07009725 QDF_STATUS status;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08009726 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Rajeev Kumar37d478b2017-04-17 16:59:28 -07009727 struct scheduler_msg message = {0};
Jeff Johnson2ba60092018-07-17 08:19:37 -07009728 struct extscan_cached_result_params *bodyptr;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009729
Jeff Johnson2ba60092018-07-17 08:19:37 -07009730 /* per contract must make a copy of the params when messaging */
9731 bodyptr = qdf_mem_malloc(sizeof(*bodyptr));
9732 if (!bodyptr)
9733 return QDF_STATUS_E_NOMEM;
9734 *bodyptr = *params;
9735
9736 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309737 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009738 /* Serialize the req through MC thread */
Jeff Johnson2ba60092018-07-17 08:19:37 -07009739 message.bodyptr = bodyptr;
Rajeev Kumar8eaedf62017-01-21 11:03:13 -08009740 message.type = WMA_EXTSCAN_GET_CACHED_RESULTS_REQ;
Jeff Johnson2ba60092018-07-17 08:19:37 -07009741 qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
9742 NO_SESSION, message.type);
9743 status = scheduler_post_message(QDF_MODULE_ID_SME,
9744 QDF_MODULE_ID_WMA,
9745 QDF_MODULE_ID_WMA,
9746 &message);
9747 sme_release_global_lock(&mac->sme);
9748 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009749
Jeff Johnson2ba60092018-07-17 08:19:37 -07009750 if (QDF_IS_STATUS_ERROR(status)) {
9751 sme_err("failure: %d", status);
9752 qdf_mem_free(bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009753 }
9754 return status;
9755}
9756
Jeff Johnson360135b2018-07-18 20:51:47 -07009757QDF_STATUS sme_set_epno_list(mac_handle_t mac_handle,
9758 struct wifi_enhanced_pno_params *params)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009759{
Jeff Johnson360135b2018-07-18 20:51:47 -07009760 QDF_STATUS status;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08009761 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Rajeev Kumar37d478b2017-04-17 16:59:28 -07009762 struct scheduler_msg message = {0};
Jeff Johnson360135b2018-07-18 20:51:47 -07009763 struct wifi_enhanced_pno_params *req_msg;
9764 int len;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009765
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07009766 SME_ENTER();
Jeff Johnson360135b2018-07-18 20:51:47 -07009767
9768 /* per contract must make a copy of the params when messaging */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009769 len = sizeof(*req_msg) +
Jeff Johnson360135b2018-07-18 20:51:47 -07009770 (params->num_networks * sizeof(req_msg->networks[0]));
Mukul Sharmae8c919f2016-10-02 20:35:15 +05309771
Anurag Chouhan600c3a02016-03-01 10:33:54 +05309772 req_msg = qdf_mem_malloc(len);
Arif Hussain0ef77082018-10-10 16:42:53 -07009773 if (!req_msg)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309774 return QDF_STATUS_E_NOMEM;
Jeff Johnson360135b2018-07-18 20:51:47 -07009775 qdf_mem_copy(req_msg, params, len);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009776
9777 status = sme_acquire_global_lock(&mac->sme);
Vignesh Viswanathancbb5b952017-08-02 14:32:49 +05309778 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07009779 sme_err("sme_acquire_global_lock failed!(status=%d)",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009780 status);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05309781 qdf_mem_free(req_msg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009782 return status;
9783 }
9784
9785 /* Serialize the req through MC thread */
Rajeev Kumar8eaedf62017-01-21 11:03:13 -08009786 message.bodyptr = req_msg;
9787 message.type = WMA_SET_EPNO_LIST_REQ;
gaurank kathpalia36b0c582018-08-28 17:45:43 +05309788 status = scheduler_post_message(QDF_MODULE_ID_SME,
9789 QDF_MODULE_ID_WMA,
9790 QDF_MODULE_ID_WMA, &message);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309791 if (!QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson360135b2018-07-18 20:51:47 -07009792 sme_err("scheduler_post_msg failed!(err=%d)", status);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05309793 qdf_mem_free(req_msg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009794 }
9795 sme_release_global_lock(&mac->sme);
Jeff Johnson360135b2018-07-18 20:51:47 -07009796
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009797 return status;
9798}
9799
Jeff Johnson2a7f1012018-07-19 07:21:06 -07009800QDF_STATUS sme_set_passpoint_list(mac_handle_t mac_handle,
9801 struct wifi_passpoint_req_param *params)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009802{
Jeff Johnson2a7f1012018-07-19 07:21:06 -07009803 QDF_STATUS status;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08009804 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Rajeev Kumar37d478b2017-04-17 16:59:28 -07009805 struct scheduler_msg message = {0};
Jeff Johnson2a7f1012018-07-19 07:21:06 -07009806 struct wifi_passpoint_req_param *req_msg;
9807 int len;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009808
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07009809 SME_ENTER();
Jeff Johnson2a7f1012018-07-19 07:21:06 -07009810
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009811 len = sizeof(*req_msg) +
Jeff Johnson2a7f1012018-07-19 07:21:06 -07009812 (params->num_networks * sizeof(params->networks[0]));
Anurag Chouhan600c3a02016-03-01 10:33:54 +05309813 req_msg = qdf_mem_malloc(len);
Arif Hussain0ef77082018-10-10 16:42:53 -07009814 if (!req_msg)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309815 return QDF_STATUS_E_NOMEM;
Jeff Johnson2a7f1012018-07-19 07:21:06 -07009816 qdf_mem_copy(req_msg, params, len);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009817
9818 status = sme_acquire_global_lock(&mac->sme);
Vignesh Viswanathancbb5b952017-08-02 14:32:49 +05309819 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07009820 sme_err("sme_acquire_global_lock failed!(status=%d)",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009821 status);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05309822 qdf_mem_free(req_msg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009823 return status;
9824 }
9825
9826 /* Serialize the req through MC thread */
Rajeev Kumar8eaedf62017-01-21 11:03:13 -08009827 message.bodyptr = req_msg;
9828 message.type = WMA_SET_PASSPOINT_LIST_REQ;
gaurank kathpalia36b0c582018-08-28 17:45:43 +05309829 status = scheduler_post_message(QDF_MODULE_ID_SME,
9830 QDF_MODULE_ID_WMA,
9831 QDF_MODULE_ID_WMA, &message);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309832 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07009833 sme_err("scheduler_post_msg failed!(err=%d)",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009834 status);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05309835 qdf_mem_free(req_msg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009836 }
9837 sme_release_global_lock(&mac->sme);
9838 return status;
9839}
9840
Jeff Johnson2a7f1012018-07-19 07:21:06 -07009841QDF_STATUS sme_reset_passpoint_list(mac_handle_t mac_handle,
9842 struct wifi_passpoint_req_param *params)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009843{
Jeff Johnson2a7f1012018-07-19 07:21:06 -07009844 QDF_STATUS status;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08009845 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Rajeev Kumar37d478b2017-04-17 16:59:28 -07009846 struct scheduler_msg message = {0};
Jeff Johnson2a7f1012018-07-19 07:21:06 -07009847 struct wifi_passpoint_req_param *req_msg;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009848
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07009849 SME_ENTER();
Jeff Johnson2a7f1012018-07-19 07:21:06 -07009850
Anurag Chouhan600c3a02016-03-01 10:33:54 +05309851 req_msg = qdf_mem_malloc(sizeof(*req_msg));
Arif Hussain0ef77082018-10-10 16:42:53 -07009852 if (!req_msg)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309853 return QDF_STATUS_E_NOMEM;
Jeff Johnson2a7f1012018-07-19 07:21:06 -07009854 *req_msg = *params;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009855
9856 status = sme_acquire_global_lock(&mac->sme);
Vignesh Viswanathancbb5b952017-08-02 14:32:49 +05309857 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07009858 sme_err("sme_acquire_global_lock failed!(status=%d)",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009859 status);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05309860 qdf_mem_free(req_msg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009861 return status;
9862 }
9863
9864 /* Serialize the req through MC thread */
Rajeev Kumar8eaedf62017-01-21 11:03:13 -08009865 message.bodyptr = req_msg;
9866 message.type = WMA_RESET_PASSPOINT_LIST_REQ;
gaurank kathpalia36b0c582018-08-28 17:45:43 +05309867 status = scheduler_post_message(QDF_MODULE_ID_SME,
9868 QDF_MODULE_ID_WMA,
9869 QDF_MODULE_ID_WMA, &message);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309870 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07009871 sme_err("scheduler_post_msg failed!(err=%d)",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009872 status);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05309873 qdf_mem_free(req_msg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009874 }
9875 sme_release_global_lock(&mac->sme);
9876 return status;
9877}
9878
Jeff Johnson17b12392018-07-03 22:21:15 -07009879QDF_STATUS sme_ext_scan_register_callback(mac_handle_t mac_handle,
9880 ext_scan_ind_cb ext_scan_ind_cb)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009881{
Jeff Johnson17b12392018-07-03 22:21:15 -07009882 QDF_STATUS status;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08009883 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009884
Jeff Johnson17b12392018-07-03 22:21:15 -07009885 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309886 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson17b12392018-07-03 22:21:15 -07009887 mac->sme.ext_scan_ind_cb = ext_scan_ind_cb;
9888 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009889 }
9890 return status;
9891}
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009892#endif /* FEATURE_WLAN_EXTSCAN */
9893
Wen Gong7952fbd2018-04-18 11:27:23 +08009894/**
9895 * sme_send_wisa_params(): Pass WISA mode to WMA
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -08009896 * @mac_handle: Opaque handle to the global MAC context
Wen Gong7952fbd2018-04-18 11:27:23 +08009897 * @wisa_params: pointer to WISA params struct
9898 * @sessionId: SME session id
9899 *
9900 * Pass WISA params to WMA
9901 *
9902 * Return: QDF_STATUS
9903 */
Jeff Johnsonc7309062018-11-09 20:59:42 -08009904QDF_STATUS sme_set_wisa_params(mac_handle_t mac_handle,
9905 struct sir_wisa_params *wisa_params)
Wen Gong7952fbd2018-04-18 11:27:23 +08009906{
9907 QDF_STATUS status = QDF_STATUS_SUCCESS;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08009908 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Wen Gong7952fbd2018-04-18 11:27:23 +08009909 struct scheduler_msg message = {0};
9910 struct sir_wisa_params *cds_msg_wisa_params;
9911
9912 cds_msg_wisa_params = qdf_mem_malloc(sizeof(struct sir_wisa_params));
9913 if (!cds_msg_wisa_params)
9914 return QDF_STATUS_E_NOMEM;
9915
9916 *cds_msg_wisa_params = *wisa_params;
9917 status = sme_acquire_global_lock(&mac->sme);
9918 if (QDF_IS_STATUS_SUCCESS(status)) {
9919 message.bodyptr = cds_msg_wisa_params;
9920 message.type = WMA_SET_WISA_PARAMS;
gaurank kathpalia36b0c582018-08-28 17:45:43 +05309921 status = scheduler_post_message(QDF_MODULE_ID_SME,
9922 QDF_MODULE_ID_WMA,
9923 QDF_MODULE_ID_WMA, &message);
Wen Gong7952fbd2018-04-18 11:27:23 +08009924 sme_release_global_lock(&mac->sme);
9925 }
9926 return status;
9927}
9928
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009929#ifdef WLAN_FEATURE_LINK_LAYER_STATS
9930
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05309931/*
9932 * sme_ll_stats_clear_req() -
9933 * SME API to clear Link Layer Statistics
9934 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08009935 * mac_handle
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05309936 * pclearStatsReq: Link Layer clear stats request params structure
9937 * Return QDF_STATUS
9938 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08009939QDF_STATUS sme_ll_stats_clear_req(mac_handle_t mac_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009940 tSirLLStatsClearReq *pclearStatsReq)
9941{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309942 QDF_STATUS status = QDF_STATUS_SUCCESS;
9943 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08009944 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Rajeev Kumar37d478b2017-04-17 16:59:28 -07009945 struct scheduler_msg message = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009946 tSirLLStatsClearReq *clear_stats_req;
9947
Abhishek Singhe4a1f882017-08-10 17:59:44 +05309948 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009949 "staId = %u", pclearStatsReq->staId);
Abhishek Singhe4a1f882017-08-10 17:59:44 +05309950 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009951 "statsClearReqMask = 0x%X",
9952 pclearStatsReq->statsClearReqMask);
Abhishek Singhe4a1f882017-08-10 17:59:44 +05309953 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009954 "stopReq = %u", pclearStatsReq->stopReq);
Jeff Johnsonb460dd72018-11-08 10:26:51 -08009955 if (!sme_is_session_id_valid(mac_handle, pclearStatsReq->staId)) {
Deepak Dhamdhere6adc08e2017-07-27 09:33:22 -07009956 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
9957 "%s: invalid staId %d",
9958 __func__, pclearStatsReq->staId);
9959 return QDF_STATUS_E_INVAL;
9960 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009961
Anurag Chouhan600c3a02016-03-01 10:33:54 +05309962 clear_stats_req = qdf_mem_malloc(sizeof(*clear_stats_req));
Arif Hussain0ef77082018-10-10 16:42:53 -07009963 if (!clear_stats_req)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309964 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009965
9966 *clear_stats_req = *pclearStatsReq;
9967
Jeff Johnson01f2c232018-11-21 19:17:44 -08009968 if (QDF_STATUS_SUCCESS == sme_acquire_global_lock(&mac->sme)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009969 /* Serialize the req through MC thread */
Rajeev Kumar8eaedf62017-01-21 11:03:13 -08009970 message.bodyptr = clear_stats_req;
9971 message.type = WMA_LINK_LAYER_STATS_CLEAR_REQ;
Sreelakshmi Konamki6a065362016-05-31 16:05:01 +05309972 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
Rajeev Kumar8eaedf62017-01-21 11:03:13 -08009973 NO_SESSION, message.type));
gaurank kathpalia36b0c582018-08-28 17:45:43 +05309974 qdf_status = scheduler_post_message(QDF_MODULE_ID_SME,
9975 QDF_MODULE_ID_WMA,
9976 QDF_MODULE_ID_WMA,
9977 &message);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309978 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05309979 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009980 "%s: not able to post WMA_LL_STATS_CLEAR_REQ",
9981 __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05309982 qdf_mem_free(clear_stats_req);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309983 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009984 }
Jeff Johnson01f2c232018-11-21 19:17:44 -08009985 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009986 } else {
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05309987 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
9988 "%s: sme_acquire_global_lock error", __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05309989 qdf_mem_free(clear_stats_req);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309990 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009991 }
9992
9993 return status;
9994}
9995
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05309996/*
9997 * sme_ll_stats_set_req() -
9998 * SME API to set the Link Layer Statistics
9999 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -080010000 * mac_handle
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053010001 * psetStatsReq: Link Layer set stats request params structure
10002 * Return QDF_STATUS
10003 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -080010004QDF_STATUS sme_ll_stats_set_req(mac_handle_t mac_handle, tSirLLStatsSetReq
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053010005 *psetStatsReq)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010006{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010007 QDF_STATUS status = QDF_STATUS_SUCCESS;
10008 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080010009 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Rajeev Kumar37d478b2017-04-17 16:59:28 -070010010 struct scheduler_msg message = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010011 tSirLLStatsSetReq *set_stats_req;
10012
Abhishek Singhe4a1f882017-08-10 17:59:44 +053010013 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010014 "%s: MPDU Size = %u", __func__,
10015 psetStatsReq->mpduSizeThreshold);
Abhishek Singhe4a1f882017-08-10 17:59:44 +053010016 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010017 " Aggressive Stats Collections = %u",
10018 psetStatsReq->aggressiveStatisticsGathering);
10019
Anurag Chouhan600c3a02016-03-01 10:33:54 +053010020 set_stats_req = qdf_mem_malloc(sizeof(*set_stats_req));
Arif Hussain0ef77082018-10-10 16:42:53 -070010021 if (!set_stats_req)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010022 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010023
10024 *set_stats_req = *psetStatsReq;
10025
Jeff Johnson01f2c232018-11-21 19:17:44 -080010026 if (QDF_STATUS_SUCCESS == sme_acquire_global_lock(&mac->sme)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010027 /* Serialize the req through MC thread */
Rajeev Kumar8eaedf62017-01-21 11:03:13 -080010028 message.bodyptr = set_stats_req;
10029 message.type = WMA_LINK_LAYER_STATS_SET_REQ;
Sreelakshmi Konamki6a065362016-05-31 16:05:01 +053010030 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
Rajeev Kumar8eaedf62017-01-21 11:03:13 -080010031 NO_SESSION, message.type));
gaurank kathpalia36b0c582018-08-28 17:45:43 +053010032 qdf_status = scheduler_post_message(QDF_MODULE_ID_SME,
10033 QDF_MODULE_ID_WMA,
10034 QDF_MODULE_ID_WMA,
10035 &message);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010036 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053010037 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010038 "%s: not able to post WMA_LL_STATS_SET_REQ",
10039 __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053010040 qdf_mem_free(set_stats_req);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010041 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010042 }
Jeff Johnson01f2c232018-11-21 19:17:44 -080010043 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010044 } else {
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053010045 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
10046 "%s: sme_acquire_global_lock error", __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053010047 qdf_mem_free(set_stats_req);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010048 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010049 }
10050
10051 return status;
10052}
10053
Dundi Ravitejae232cf12018-05-16 18:34:34 +053010054QDF_STATUS sme_ll_stats_get_req(mac_handle_t mac_handle,
10055 tSirLLStatsGetReq *get_stats_req,
10056 void *context)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010057{
Dundi Ravitejae232cf12018-05-16 18:34:34 +053010058 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080010059 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Rajeev Kumar37d478b2017-04-17 16:59:28 -070010060 struct scheduler_msg message = {0};
Dundi Ravitejae232cf12018-05-16 18:34:34 +053010061 tSirLLStatsGetReq *ll_stats_get_req;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010062
Dundi Ravitejae232cf12018-05-16 18:34:34 +053010063 ll_stats_get_req = qdf_mem_malloc(sizeof(*ll_stats_get_req));
Arif Hussain0ef77082018-10-10 16:42:53 -070010064 if (!ll_stats_get_req)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010065 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010066
Dundi Ravitejae232cf12018-05-16 18:34:34 +053010067 *ll_stats_get_req = *get_stats_req;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010068
Dundi Ravitejae232cf12018-05-16 18:34:34 +053010069 mac->sme.ll_stats_context = context;
10070 if (sme_acquire_global_lock(&mac->sme) == QDF_STATUS_SUCCESS) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010071 /* Serialize the req through MC thread */
Dundi Ravitejae232cf12018-05-16 18:34:34 +053010072 message.bodyptr = ll_stats_get_req;
Rajeev Kumar8eaedf62017-01-21 11:03:13 -080010073 message.type = WMA_LINK_LAYER_STATS_GET_REQ;
Dundi Ravitejae232cf12018-05-16 18:34:34 +053010074 qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
10075 NO_SESSION, message.type);
gaurank kathpalia36b0c582018-08-28 17:45:43 +053010076 status = scheduler_post_message(QDF_MODULE_ID_SME,
10077 QDF_MODULE_ID_WMA,
10078 QDF_MODULE_ID_WMA, &message);
Dundi Ravitejae232cf12018-05-16 18:34:34 +053010079 if (!QDF_IS_STATUS_SUCCESS(status)) {
10080 sme_err("Not able to post WMA_LL_STATS_GET_REQ");
10081 qdf_mem_free(ll_stats_get_req);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010082 }
Dundi Ravitejae232cf12018-05-16 18:34:34 +053010083 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010084 } else {
Dundi Ravitejae232cf12018-05-16 18:34:34 +053010085 sme_err("sme_acquire_global_lock error");
10086 qdf_mem_free(ll_stats_get_req);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010087 }
10088
10089 return status;
10090}
10091
Jeff Johnson959f3692018-07-03 17:30:40 -070010092QDF_STATUS sme_set_link_layer_stats_ind_cb(mac_handle_t mac_handle,
10093 link_layer_stats_cb callback)
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053010094{
Jeff Johnson959f3692018-07-03 17:30:40 -070010095 QDF_STATUS status;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080010096 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010097
Jeff Johnson959f3692018-07-03 17:30:40 -070010098 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010099 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson959f3692018-07-03 17:30:40 -070010100 mac->sme.link_layer_stats_cb = callback;
10101 sme_release_global_lock(&mac->sme);
10102 } else {
10103 sme_err("sme_acquire_global_lock error");
10104 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010105
10106 return status;
10107}
10108
Arun Khandavalli4b55da72016-07-19 19:55:01 +053010109/**
Zhang Qiana6e9c102016-12-22 16:47:24 +080010110 * sme_set_link_layer_ext_cb() - Register callback for link layer statistics
Jeff Johnsonc7309062018-11-09 20:59:42 -080010111 * @mac_handle: Mac global handle
Zhang Qiana6e9c102016-12-22 16:47:24 +080010112 * @ll_stats_ext_cb: HDD callback which needs to be invoked after getting
10113 * status notification from FW
10114 *
Jeff Johnsonc7309062018-11-09 20:59:42 -080010115 * Return: QDF_STATUS
Zhang Qiana6e9c102016-12-22 16:47:24 +080010116 */
Jeff Johnsonc7309062018-11-09 20:59:42 -080010117QDF_STATUS
10118sme_set_link_layer_ext_cb(mac_handle_t mac_handle,
10119 void (*ll_stats_ext_cb)(hdd_handle_t callback_ctx,
10120 tSirLLStatsResults *rsp))
Zhang Qiana6e9c102016-12-22 16:47:24 +080010121{
10122 QDF_STATUS status;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080010123 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Zhang Qiana6e9c102016-12-22 16:47:24 +080010124
10125 status = sme_acquire_global_lock(&mac->sme);
10126 if (status == QDF_STATUS_SUCCESS) {
10127 mac->sme.link_layer_stats_ext_cb = ll_stats_ext_cb;
10128 sme_release_global_lock(&mac->sme);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053010129 } else
Zhang Qiana6e9c102016-12-22 16:47:24 +080010130 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
10131 "%s: sme_qcquire_global_lock error", __func__);
Zhang Qiana6e9c102016-12-22 16:47:24 +080010132 return status;
10133}
10134
10135/**
Arun Khandavalli4b55da72016-07-19 19:55:01 +053010136 * sme_reset_link_layer_stats_ind_cb() - SME API to reset link layer stats
10137 * indication
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -080010138 * @mac_handle: Opaque handle to the global MAC context
Arun Khandavalli4b55da72016-07-19 19:55:01 +053010139 *
10140 * This function reset's the link layer stats indication
10141 *
10142 * Return: QDF_STATUS Enumeration
10143 */
10144
Jeff Johnsonb460dd72018-11-08 10:26:51 -080010145QDF_STATUS sme_reset_link_layer_stats_ind_cb(mac_handle_t mac_handle)
Arun Khandavalli4b55da72016-07-19 19:55:01 +053010146{
10147 QDF_STATUS status;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080010148 struct mac_context *pmac;
Arun Khandavalli4b55da72016-07-19 19:55:01 +053010149
Jeff Johnsonb460dd72018-11-08 10:26:51 -080010150 if (!mac_handle) {
Arun Khandavalli4b55da72016-07-19 19:55:01 +053010151 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Jeff Johnsonb460dd72018-11-08 10:26:51 -080010152 FL("mac_handle is not valid"));
Arun Khandavalli4b55da72016-07-19 19:55:01 +053010153 return QDF_STATUS_E_INVAL;
10154 }
Jeff Johnsona0619e42018-11-28 17:43:00 -080010155 pmac = MAC_CONTEXT(mac_handle);
Arun Khandavalli4b55da72016-07-19 19:55:01 +053010156
10157 status = sme_acquire_global_lock(&pmac->sme);
10158 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson959f3692018-07-03 17:30:40 -070010159 pmac->sme.link_layer_stats_cb = NULL;
Arun Khandavalli4b55da72016-07-19 19:55:01 +053010160 sme_release_global_lock(&pmac->sme);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053010161 } else
10162 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
10163 "%s: sme_acquire_global_lock error", __func__);
Arun Khandavalli4b55da72016-07-19 19:55:01 +053010164
10165 return status;
10166}
10167
Zhang Qian73c348a2017-03-13 16:15:55 +080010168/**
10169 * sme_ll_stats_set_thresh - set threshold for mac counters
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -080010170 * @mac_handle: Opaque handle to the global MAC context
Zhang Qian73c348a2017-03-13 16:15:55 +080010171 * @threshold, threshold for mac counters
10172 *
10173 * Return: QDF_STATUS Enumeration
10174 */
Jeff Johnsonc7309062018-11-09 20:59:42 -080010175QDF_STATUS sme_ll_stats_set_thresh(mac_handle_t mac_handle,
Zhang Qian73c348a2017-03-13 16:15:55 +080010176 struct sir_ll_ext_stats_threshold *threshold)
10177{
10178 QDF_STATUS status;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080010179 struct mac_context *mac;
Rajeev Kumar658e8492017-12-13 11:35:41 -080010180 struct scheduler_msg message = {0};
Zhang Qian73c348a2017-03-13 16:15:55 +080010181 struct sir_ll_ext_stats_threshold *thresh;
10182
10183 if (!threshold) {
10184 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
10185 FL("threshold is not valid"));
10186 return QDF_STATUS_E_INVAL;
10187 }
10188
Jeff Johnsonc7309062018-11-09 20:59:42 -080010189 if (!mac_handle) {
Zhang Qian73c348a2017-03-13 16:15:55 +080010190 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Jeff Johnsonc7309062018-11-09 20:59:42 -080010191 FL("mac_handle is not valid"));
Zhang Qian73c348a2017-03-13 16:15:55 +080010192 return QDF_STATUS_E_INVAL;
10193 }
Jeff Johnsona0619e42018-11-28 17:43:00 -080010194 mac = MAC_CONTEXT(mac_handle);
Zhang Qian73c348a2017-03-13 16:15:55 +080010195
10196 thresh = qdf_mem_malloc(sizeof(*thresh));
Arif Hussain0ef77082018-10-10 16:42:53 -070010197 if (!thresh)
Zhang Qian73c348a2017-03-13 16:15:55 +080010198 return QDF_STATUS_E_NOMEM;
Arif Hussain0ef77082018-10-10 16:42:53 -070010199
Zhang Qian73c348a2017-03-13 16:15:55 +080010200 *thresh = *threshold;
10201
10202 status = sme_acquire_global_lock(&mac->sme);
10203 if (QDF_IS_STATUS_SUCCESS(status)) {
10204 /* Serialize the req through MC thread */
10205 message.bodyptr = thresh;
10206 message.type = WDA_LINK_LAYER_STATS_SET_THRESHOLD;
10207 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
10208 NO_SESSION, message.type));
gaurank kathpalia36b0c582018-08-28 17:45:43 +053010209 status = scheduler_post_message(QDF_MODULE_ID_SME,
10210 QDF_MODULE_ID_WMA,
10211 QDF_MODULE_ID_WMA, &message);
Zhang Qian73c348a2017-03-13 16:15:55 +080010212 if (!QDF_IS_STATUS_SUCCESS(status)) {
10213 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
10214 "%s: not able to post WDA_LL_STATS_GET_REQ",
10215 __func__);
10216 qdf_mem_free(thresh);
10217 }
10218 sme_release_global_lock(&mac->sme);
10219 } else {
10220 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
10221 FL("sme_acquire_global_lock error"));
10222 qdf_mem_free(thresh);
10223 }
10224 return status;
10225}
Arun Khandavalli4b55da72016-07-19 19:55:01 +053010226
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010227#endif /* WLAN_FEATURE_LINK_LAYER_STATS */
10228
Sridhar Selvarajdc400d22016-10-18 17:18:03 +053010229#ifdef WLAN_POWER_DEBUGFS
10230/**
10231 * sme_power_debug_stats_req() - SME API to collect Power debug stats
10232 * @callback_fn: Pointer to the callback function for Power stats event
10233 * @power_stats_context: Pointer to context
10234 *
10235 * Return: QDF_STATUS
10236 */
Jeff Johnsonc7309062018-11-09 20:59:42 -080010237QDF_STATUS sme_power_debug_stats_req(
10238 mac_handle_t mac_handle,
10239 void (*callback_fn)(struct power_stats_response *response,
10240 void *context),
10241 void *power_stats_context)
Sridhar Selvarajdc400d22016-10-18 17:18:03 +053010242{
10243 QDF_STATUS status = QDF_STATUS_SUCCESS;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080010244 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Rajeev Kumar37d478b2017-04-17 16:59:28 -070010245 struct scheduler_msg msg = {0};
Sridhar Selvarajdc400d22016-10-18 17:18:03 +053010246
10247 status = sme_acquire_global_lock(&mac_ctx->sme);
10248 if (QDF_IS_STATUS_SUCCESS(status)) {
10249 if (!callback_fn) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070010250 sme_err("Indication callback did not registered");
Sridhar Selvarajdc400d22016-10-18 17:18:03 +053010251 sme_release_global_lock(&mac_ctx->sme);
10252 return QDF_STATUS_E_FAILURE;
10253 }
10254
10255 mac_ctx->sme.power_debug_stats_context = power_stats_context;
10256 mac_ctx->sme.power_stats_resp_callback = callback_fn;
10257 msg.bodyptr = NULL;
10258 msg.type = WMA_POWER_DEBUG_STATS_REQ;
gaurank kathpalia36b0c582018-08-28 17:45:43 +053010259 status = scheduler_post_message(QDF_MODULE_ID_SME,
10260 QDF_MODULE_ID_WMA,
10261 QDF_MODULE_ID_WMA, &msg);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053010262 if (!QDF_IS_STATUS_SUCCESS(status))
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070010263 sme_err("not able to post WDA_POWER_DEBUG_STATS_REQ");
Sridhar Selvarajdc400d22016-10-18 17:18:03 +053010264 sme_release_global_lock(&mac_ctx->sme);
10265 }
10266 return status;
10267}
10268#endif
10269
Arunk Khandavallica56d4b2018-11-29 15:46:00 +053010270#ifdef WLAN_FEATURE_BEACON_RECEPTION_STATS
10271QDF_STATUS sme_beacon_debug_stats_req(
10272 mac_handle_t mac_handle, uint32_t vdev_id,
10273 void (*callback_fn)(struct bcn_reception_stats_rsp
10274 *response, void *context),
10275 void *beacon_stats_context)
10276{
10277 QDF_STATUS status;
10278 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
10279 uint32_t *val;
10280 struct scheduler_msg msg = {0};
10281
10282 status = sme_acquire_global_lock(&mac_ctx->sme);
10283 if (QDF_IS_STATUS_SUCCESS(status)) {
10284 if (!callback_fn) {
10285 sme_err("Indication callback did not registered");
10286 sme_release_global_lock(&mac_ctx->sme);
10287 return QDF_STATUS_E_FAILURE;
10288 }
10289
Sourav Mohapatrac55bdf32018-12-13 16:16:50 +053010290 if (!mac_ctx->bcn_reception_stats &&
10291 !mac_ctx->mlme_cfg->gen.enable_beacon_reception_stats) {
10292 sme_err("Beacon Reception stats not supported");
Arunk Khandavallica56d4b2018-11-29 15:46:00 +053010293 sme_release_global_lock(&mac_ctx->sme);
10294 return QDF_STATUS_E_NOSUPPORT;
10295 }
10296
10297 val = qdf_mem_malloc(sizeof(*val));
10298 if (!val) {
10299 sme_release_global_lock(&mac_ctx->sme);
10300 return QDF_STATUS_E_NOMEM;
10301 }
10302
10303 *val = vdev_id;
10304 mac_ctx->sme.beacon_stats_context = beacon_stats_context;
10305 mac_ctx->sme.beacon_stats_resp_callback = callback_fn;
10306 msg.bodyptr = val;
10307 msg.type = WMA_BEACON_DEBUG_STATS_REQ;
10308 status = scheduler_post_message(QDF_MODULE_ID_SME,
10309 QDF_MODULE_ID_WMA,
10310 QDF_MODULE_ID_WMA, &msg);
10311 if (!QDF_IS_STATUS_SUCCESS(status)) {
10312 sme_err("not able to post WMA_BEACON_DEBUG_STATS_REQ");
10313 qdf_mem_free(val);
10314 }
10315 sme_release_global_lock(&mac_ctx->sme);
10316 }
10317 return status;
10318}
10319#endif
10320
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010321#ifdef WLAN_FEATURE_ROAM_OFFLOAD
Deepak Dhamdheref2a7d8b2016-08-19 16:17:38 -070010322/**
10323 * sme_update_roam_key_mgmt_offload_enabled() - enable/disable key mgmt offload
10324 * This is a synchronous call
Jeff Johnsond5fb2db2018-11-08 14:20:28 -080010325 * @mac_handle: The handle returned by mac_open.
Deepak Dhamdheref2a7d8b2016-08-19 16:17:38 -070010326 * @session_id: Session Identifier
10327 * @key_mgmt_offload_enabled: key mgmt enable/disable flag
Deepak Dhamdhere828f1892017-02-09 11:51:19 -080010328 * @pmkid_modes: PMKID modes of PMKSA caching and OKC
Deepak Dhamdheref2a7d8b2016-08-19 16:17:38 -070010329 * Return: QDF_STATUS_SUCCESS - SME updated config successfully.
10330 * Other status means SME is failed to update.
10331 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010332
Jeff Johnsond5fb2db2018-11-08 14:20:28 -080010333QDF_STATUS sme_update_roam_key_mgmt_offload_enabled(mac_handle_t mac_handle,
Deepak Dhamdhere828f1892017-02-09 11:51:19 -080010334 uint8_t session_id,
10335 bool key_mgmt_offload_enabled,
10336 struct pmkid_mode_bits *pmkid_modes)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010337{
Jeff Johnson0a8786a2018-12-02 10:49:01 -080010338 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010339 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010340
Deepak Dhamdheref2a7d8b2016-08-19 16:17:38 -070010341 status = sme_acquire_global_lock(&mac_ctx->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010342 if (QDF_IS_STATUS_SUCCESS(status)) {
Deepak Dhamdheref2a7d8b2016-08-19 16:17:38 -070010343 if (CSR_IS_SESSION_VALID(mac_ctx, session_id)) {
Abhishek Singhe4a1f882017-08-10 17:59:44 +053010344 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Deepak Dhamdheref2a7d8b2016-08-19 16:17:38 -070010345 "%s: LFR3: key_mgmt_offload_enabled changed to %d",
10346 __func__, key_mgmt_offload_enabled);
10347 status = csr_roam_set_key_mgmt_offload(mac_ctx,
10348 session_id,
10349 key_mgmt_offload_enabled,
Deepak Dhamdhere828f1892017-02-09 11:51:19 -080010350 pmkid_modes);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053010351 } else
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010352 status = QDF_STATUS_E_INVAL;
Deepak Dhamdheref2a7d8b2016-08-19 16:17:38 -070010353 sme_release_global_lock(&mac_ctx->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010354 }
10355
10356 return status;
10357}
Prashanth Bhattabfc25292015-11-05 11:16:21 -080010358#endif
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010359
Jeff Johnson3f3ad252019-02-17 20:44:11 -080010360/**
10361 * sme_get_temperature() - SME API to get the pdev temperature
10362 * @mac_handle: Handle to global MAC context
10363 * @cb_context: temperature callback context
10364 * @cb: callback function with response (temperature)
10365 * Return: QDF_STATUS
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053010366 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -080010367QDF_STATUS sme_get_temperature(mac_handle_t mac_handle,
Jeff Johnson3f3ad252019-02-17 20:44:11 -080010368 void *cb_context,
10369 void (*cb)(int temperature,
10370 void *context))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010371{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010372 QDF_STATUS status = QDF_STATUS_SUCCESS;
10373 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080010374 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Rajeev Kumar37d478b2017-04-17 16:59:28 -070010375 struct scheduler_msg message = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010376
Jeff Johnson01f2c232018-11-21 19:17:44 -080010377 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010378 if (QDF_STATUS_SUCCESS == status) {
Jeff Johnson3f3ad252019-02-17 20:44:11 -080010379 if ((!cb) &&
10380 (!mac->sme.temperature_cb)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053010381 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053010382 "Indication Call back did not registered");
Jeff Johnson01f2c232018-11-21 19:17:44 -080010383 sme_release_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010384 return QDF_STATUS_E_FAILURE;
Jeff Johnson3f3ad252019-02-17 20:44:11 -080010385 } else if (cb) {
10386 mac->sme.temperature_cb_context = cb_context;
10387 mac->sme.temperature_cb = cb;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010388 }
10389 /* serialize the req through MC thread */
Rajeev Kumar8eaedf62017-01-21 11:03:13 -080010390 message.bodyptr = NULL;
10391 message.type = WMA_GET_TEMPERATURE_REQ;
gaurank kathpalia36b0c582018-08-28 17:45:43 +053010392 qdf_status = scheduler_post_message(QDF_MODULE_ID_SME,
10393 QDF_MODULE_ID_WMA,
10394 QDF_MODULE_ID_WMA,
10395 &message);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010396 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053010397 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010398 FL("Post Get Temperature msg fail"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010399 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010400 }
Jeff Johnson01f2c232018-11-21 19:17:44 -080010401 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010402 }
10403 return status;
10404}
10405
Jeff Johnsonc7309062018-11-09 20:59:42 -080010406QDF_STATUS sme_set_scanning_mac_oui(mac_handle_t mac_handle,
Jeff Johnson9d45f332019-01-29 08:42:00 -080010407 struct scan_mac_oui *scan_mac_oui)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010408{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010409 QDF_STATUS status = QDF_STATUS_SUCCESS;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080010410 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Rajeev Kumar37d478b2017-04-17 16:59:28 -070010411 struct scheduler_msg message = {0};
Jeff Johnson9d45f332019-01-29 08:42:00 -080010412 struct scan_mac_oui *bodyptr;
10413
10414 /* per contract must make a copy of the params when messaging */
10415 bodyptr = qdf_mem_malloc(sizeof(*bodyptr));
10416 if (!bodyptr)
10417 return QDF_STATUS_E_NOMEM;
10418 *bodyptr = *scan_mac_oui;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010419
Jeff Johnson01f2c232018-11-21 19:17:44 -080010420 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010421 if (QDF_STATUS_SUCCESS == status) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010422 /* Serialize the req through MC thread */
Jeff Johnson9d45f332019-01-29 08:42:00 -080010423 message.bodyptr = bodyptr;
Rajeev Kumar8eaedf62017-01-21 11:03:13 -080010424 message.type = WMA_SET_SCAN_MAC_OUI_REQ;
Jeff Johnson9d45f332019-01-29 08:42:00 -080010425 status = scheduler_post_message(QDF_MODULE_ID_SME,
10426 QDF_MODULE_ID_WMA,
10427 QDF_MODULE_ID_WMA,
10428 &message);
Jeff Johnson01f2c232018-11-21 19:17:44 -080010429 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010430 }
Jeff Johnson9d45f332019-01-29 08:42:00 -080010431
10432 if (QDF_IS_STATUS_ERROR(status)) {
10433 sme_err("failure: %d", status);
10434 qdf_mem_free(bodyptr);
10435 }
10436
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010437 return status;
10438}
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010439
10440#ifdef DHCP_SERVER_OFFLOAD
Jeff Johnson8bfc29e2019-02-15 07:58:15 -080010441QDF_STATUS
10442sme_set_dhcp_srv_offload(mac_handle_t mac_handle,
10443 struct dhcp_offload_info_params *dhcp_srv_info)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010444{
Rajeev Kumar37d478b2017-04-17 16:59:28 -070010445 struct scheduler_msg message = {0};
Jeff Johnson8bfc29e2019-02-15 07:58:15 -080010446 struct dhcp_offload_info_params *payload;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010447 QDF_STATUS status = QDF_STATUS_SUCCESS;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080010448 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010449
Jeff Johnson8bfc29e2019-02-15 07:58:15 -080010450 payload = qdf_mem_malloc(sizeof(*payload));
10451 if (!payload)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010452 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010453
Jeff Johnson8bfc29e2019-02-15 07:58:15 -080010454 *payload = *dhcp_srv_info;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010455
Jeff Johnson01f2c232018-11-21 19:17:44 -080010456 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010457 if (QDF_STATUS_SUCCESS == status) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010458 /* serialize the req through MC thread */
Rajeev Kumar8eaedf62017-01-21 11:03:13 -080010459 message.type = WMA_SET_DHCP_SERVER_OFFLOAD_CMD;
Jeff Johnson8bfc29e2019-02-15 07:58:15 -080010460 message.bodyptr = payload;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010461
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010462 if (!QDF_IS_STATUS_SUCCESS
gaurank kathpalia36b0c582018-08-28 17:45:43 +053010463 (scheduler_post_message(QDF_MODULE_ID_SME,
10464 QDF_MODULE_ID_WMA,
10465 QDF_MODULE_ID_WMA,
10466 &message))) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053010467 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Varun Reddy Yeturu7b2a6572017-06-15 11:07:28 -070010468 "%s:WMA_SET_DHCP_SERVER_OFFLOAD_CMD failed",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010469 __func__);
Jeff Johnson8bfc29e2019-02-15 07:58:15 -080010470 qdf_mem_free(payload);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010471 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010472 }
Jeff Johnson01f2c232018-11-21 19:17:44 -080010473 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010474 } else {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053010475 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010476 "%s: sme_acquire_global_lock error!", __func__);
Jeff Johnson8bfc29e2019-02-15 07:58:15 -080010477 qdf_mem_free(payload);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010478 }
10479
10480 return status;
10481}
10482#endif /* DHCP_SERVER_OFFLOAD */
10483
Krunal Soniaadaa272017-10-04 16:42:55 -070010484QDF_STATUS sme_send_unit_test_cmd(uint32_t vdev_id, uint32_t module_id,
10485 uint32_t arg_count, uint32_t *arg)
10486{
10487 return wma_form_unit_test_cmd_and_send(vdev_id, module_id,
10488 arg_count, arg);
10489}
10490
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010491#ifdef WLAN_FEATURE_GPIO_LED_FLASHING
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053010492/*
10493 * sme_set_led_flashing() -
10494 * API to set the Led flashing parameters.
10495 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -080010496 * mac_handle - The handle returned by mac_open.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053010497 * x0, x1 - led flashing parameters
10498 * Return QDF_STATUS
10499 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -080010500QDF_STATUS sme_set_led_flashing(mac_handle_t mac_handle, uint8_t type,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010501 uint32_t x0, uint32_t x1)
10502{
Jeff Johnson5a6b6602017-10-04 14:44:30 -070010503 QDF_STATUS status;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080010504 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Rajeev Kumar37d478b2017-04-17 16:59:28 -070010505 struct scheduler_msg message = {0};
Jeff Johnson5a6b6602017-10-04 14:44:30 -070010506 struct flashing_req_params *ledflashing;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010507
Anurag Chouhan600c3a02016-03-01 10:33:54 +053010508 ledflashing = qdf_mem_malloc(sizeof(*ledflashing));
Arif Hussain0ef77082018-10-10 16:42:53 -070010509 if (!ledflashing)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010510 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010511
Jeff Johnson5a6b6602017-10-04 14:44:30 -070010512 ledflashing->req_id = 0;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010513 ledflashing->pattern_id = type;
10514 ledflashing->led_x0 = x0;
10515 ledflashing->led_x1 = x1;
10516
Jeff Johnson01f2c232018-11-21 19:17:44 -080010517 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010518 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010519 /* Serialize the req through MC thread */
Rajeev Kumar8eaedf62017-01-21 11:03:13 -080010520 message.bodyptr = ledflashing;
10521 message.type = WMA_LED_FLASHING_REQ;
gaurank kathpalia36b0c582018-08-28 17:45:43 +053010522 status = scheduler_post_message(QDF_MODULE_ID_SME,
10523 QDF_MODULE_ID_WMA,
10524 QDF_MODULE_ID_WMA, &message);
Jeff Johnson01f2c232018-11-21 19:17:44 -080010525 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010526 }
Jeff Johnson5a6b6602017-10-04 14:44:30 -070010527 if (!QDF_IS_STATUS_SUCCESS(status))
10528 qdf_mem_free(ledflashing);
10529
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010530 return status;
10531}
10532#endif
10533
10534/**
Min Liu5eaf7242018-03-13 17:32:15 +080010535 * sme_enable_dfS_chan_scan() - set DFS channel scan enable/disable
Jeff Johnsonb460dd72018-11-08 10:26:51 -080010536 * @mac_handle: corestack handler
Min Liu5eaf7242018-03-13 17:32:15 +080010537 * @dfs_flag: flag indicating dfs channel enable/disable
10538 * Return: QDF_STATUS
10539 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -080010540QDF_STATUS sme_enable_dfs_chan_scan(mac_handle_t mac_handle, uint8_t dfs_flag)
Min Liu5eaf7242018-03-13 17:32:15 +080010541{
10542 QDF_STATUS status = QDF_STATUS_SUCCESS;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080010543 struct mac_context *mac;
Min Liu5eaf7242018-03-13 17:32:15 +080010544
Jeff Johnsonb460dd72018-11-08 10:26:51 -080010545 if (!mac_handle) {
Jeff Johnsonc7309062018-11-09 20:59:42 -080010546 sme_err("mac_handle is NULL");
Min Liu5eaf7242018-03-13 17:32:15 +080010547 return QDF_STATUS_E_INVAL;
10548 }
10549
Jeff Johnsona0619e42018-11-28 17:43:00 -080010550 mac = MAC_CONTEXT(mac_handle);
Min Liu5eaf7242018-03-13 17:32:15 +080010551
10552 mac->scan.fEnableDFSChnlScan = dfs_flag;
10553
10554 return status;
10555}
10556
Edhar, Mahesh Kumardf2ec122015-11-16 11:33:16 +053010557#ifdef FEATURE_WLAN_MCC_TO_SCC_SWITCH
10558/**
10559 * sme_validate_sap_channel_switch() - validate target channel switch w.r.t
10560 * concurreny rules set to avoid channel interference.
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -080010561 * @mac_handle: Opaque handle to the global MAC context
Edhar, Mahesh Kumardf2ec122015-11-16 11:33:16 +053010562 * @sap_ch - channel to switch
10563 * @sap_phy_mode - phy mode of SAP
10564 * @cc_switch_mode - concurreny switch mode
10565 * @session_id - sme session id.
10566 *
10567 * Return: true if there is no channel interference else return false
10568 */
Jeff Johnsonc7309062018-11-09 20:59:42 -080010569bool sme_validate_sap_channel_switch(mac_handle_t mac_handle,
10570 uint16_t sap_ch,
10571 eCsrPhyMode sap_phy_mode,
10572 uint8_t cc_switch_mode,
10573 uint8_t session_id)
Edhar, Mahesh Kumardf2ec122015-11-16 11:33:16 +053010574{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010575 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080010576 struct mac_context *mac = MAC_CONTEXT(mac_handle);
gaurank kathpalia14e2f912017-08-31 14:51:45 +053010577 struct csr_roam_session *session = CSR_GET_SESSION(mac, session_id);
Edhar, Mahesh Kumardf2ec122015-11-16 11:33:16 +053010578 uint16_t intf_channel = 0;
10579
10580 if (!session)
10581 return false;
10582
10583 session->ch_switch_in_progress = true;
10584 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010585 if (QDF_IS_STATUS_SUCCESS(status)) {
Edhar, Mahesh Kumardf2ec122015-11-16 11:33:16 +053010586 intf_channel = csr_check_concurrent_channel_overlap(mac, sap_ch,
10587 sap_phy_mode,
10588 cc_switch_mode);
10589 sme_release_global_lock(&mac->sme);
10590 } else {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053010591 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Edhar, Mahesh Kumardf2ec122015-11-16 11:33:16 +053010592 FL("sme_acquire_global_lock error!"));
10593 session->ch_switch_in_progress = false;
10594 return false;
10595 }
10596
10597 session->ch_switch_in_progress = false;
10598 return (intf_channel == 0) ? true : false;
10599}
10600#endif
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010601
10602/**
10603 * sme_configure_stats_avg_factor() - function to config avg. stats factor
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -080010604 * @mac_handle: Opaque handle to the global MAC context
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010605 * @session_id: session ID
10606 * @stats_avg_factor: average stats factor
10607 *
10608 * This function configures the stats avg factor in firmware
10609 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010610 * Return: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010611 */
Jeff Johnsonc7309062018-11-09 20:59:42 -080010612QDF_STATUS sme_configure_stats_avg_factor(mac_handle_t mac_handle,
10613 uint8_t session_id,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010614 uint16_t stats_avg_factor)
10615{
Rajeev Kumar37d478b2017-04-17 16:59:28 -070010616 struct scheduler_msg msg = {0};
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010617 QDF_STATUS status = QDF_STATUS_SUCCESS;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080010618 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010619 struct sir_stats_avg_factor *stats_factor;
10620
Anurag Chouhan600c3a02016-03-01 10:33:54 +053010621 stats_factor = qdf_mem_malloc(sizeof(*stats_factor));
Arif Hussain0ef77082018-10-10 16:42:53 -070010622 if (!stats_factor)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010623 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010624
10625 status = sme_acquire_global_lock(&mac->sme);
10626
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010627 if (QDF_STATUS_SUCCESS == status) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010628
10629 stats_factor->vdev_id = session_id;
10630 stats_factor->stats_avg_factor = stats_avg_factor;
10631
10632 /* serialize the req through MC thread */
10633 msg.type = SIR_HAL_CONFIG_STATS_FACTOR;
10634 msg.bodyptr = stats_factor;
10635
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010636 if (!QDF_IS_STATUS_SUCCESS(
gaurank kathpalia36b0c582018-08-28 17:45:43 +053010637 scheduler_post_message(QDF_MODULE_ID_SME,
10638 QDF_MODULE_ID_WMA,
10639 QDF_MODULE_ID_WMA, &msg))) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053010640 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010641 "%s: Not able to post SIR_HAL_CONFIG_STATS_FACTOR to WMA!",
10642 __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053010643 qdf_mem_free(stats_factor);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010644 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010645 }
10646 sme_release_global_lock(&mac->sme);
10647 } else {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053010648 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010649 "%s: sme_acquire_global_lock error!",
10650 __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053010651 qdf_mem_free(stats_factor);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010652 }
10653
10654 return status;
10655}
10656
10657/**
10658 * sme_configure_guard_time() - function to configure guard time
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -080010659 * @mac_handle: Opaque handle to the global MAC context
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010660 * @session_id: session id
10661 * @guard_time: guard time
10662 *
10663 * This function configures the guard time in firmware
10664 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010665 * Return: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010666 */
Jeff Johnsonc7309062018-11-09 20:59:42 -080010667QDF_STATUS sme_configure_guard_time(mac_handle_t mac_handle, uint8_t session_id,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010668 uint32_t guard_time)
10669{
Rajeev Kumar37d478b2017-04-17 16:59:28 -070010670 struct scheduler_msg msg = {0};
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010671 QDF_STATUS status = QDF_STATUS_SUCCESS;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080010672 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010673 struct sir_guard_time_request *g_time;
10674
Anurag Chouhan600c3a02016-03-01 10:33:54 +053010675 g_time = qdf_mem_malloc(sizeof(*g_time));
Arif Hussain0ef77082018-10-10 16:42:53 -070010676 if (!g_time)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010677 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010678
10679 status = sme_acquire_global_lock(&mac->sme);
10680
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010681 if (QDF_STATUS_SUCCESS == status) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010682
10683 g_time->vdev_id = session_id;
10684 g_time->guard_time = guard_time;
10685
10686 /* serialize the req through MC thread */
10687 msg.type = SIR_HAL_CONFIG_GUARD_TIME;
10688 msg.bodyptr = g_time;
10689
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010690 if (!QDF_IS_STATUS_SUCCESS(
gaurank kathpalia36b0c582018-08-28 17:45:43 +053010691 scheduler_post_message(QDF_MODULE_ID_SME,
10692 QDF_MODULE_ID_WMA,
10693 QDF_MODULE_ID_WMA, &msg))) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053010694 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010695 "%s: Not able to post SIR_HAL_CONFIG_GUARD_TIME to WMA!",
10696 __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053010697 qdf_mem_free(g_time);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010698 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010699 }
10700 sme_release_global_lock(&mac->sme);
10701 } else {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053010702 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010703 "%s: sme_acquire_global_lock error!",
10704 __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053010705 qdf_mem_free(g_time);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010706 }
10707
10708 return status;
10709}
10710
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010711/*
10712 * sme_wifi_start_logger() - Send the start/stop logging command to WMA
10713 * to either start/stop logging
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -080010714 * @mac_handle: Opaque handle to the global MAC context
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010715 * @start_log: Structure containing the wifi start logger params
10716 *
10717 * This function sends the start/stop logging command to WMA
10718 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010719 * Return: QDF_STATUS_SUCCESS on successful posting
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010720 */
Jeff Johnsonc7309062018-11-09 20:59:42 -080010721QDF_STATUS sme_wifi_start_logger(mac_handle_t mac_handle,
10722 struct sir_wifi_start_log start_log)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010723{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010724 QDF_STATUS status = QDF_STATUS_SUCCESS;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080010725 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Rajeev Kumar37d478b2017-04-17 16:59:28 -070010726 struct scheduler_msg message = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010727 struct sir_wifi_start_log *req_msg;
10728 uint32_t len;
10729
10730 len = sizeof(*req_msg);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053010731 req_msg = qdf_mem_malloc(len);
Arif Hussain0ef77082018-10-10 16:42:53 -070010732 if (!req_msg)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010733 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010734
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010735 req_msg->verbose_level = start_log.verbose_level;
Poddar, Siddartheefe3482016-09-21 18:12:59 +053010736 req_msg->is_iwpriv_command = start_log.is_iwpriv_command;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010737 req_msg->ring_id = start_log.ring_id;
Srinivas Girigowdac34f11d2016-02-25 16:02:42 -080010738 req_msg->ini_triggered = start_log.ini_triggered;
10739 req_msg->user_triggered = start_log.user_triggered;
Poddar, Siddarth176c4362016-10-03 12:25:00 +053010740 req_msg->size = start_log.size;
Poddar, Siddarthab99a272017-04-10 12:53:26 +053010741 req_msg->is_pktlog_buff_clear = start_log.is_pktlog_buff_clear;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010742
10743 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010744 if (status != QDF_STATUS_SUCCESS) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070010745 sme_err("sme_acquire_global_lock failed(status=%d)", status);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053010746 qdf_mem_free(req_msg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010747 return status;
10748 }
10749
10750 /* Serialize the req through MC thread */
Rajeev Kumar8eaedf62017-01-21 11:03:13 -080010751 message.bodyptr = req_msg;
10752 message.type = SIR_HAL_START_STOP_LOGGING;
gaurank kathpalia36b0c582018-08-28 17:45:43 +053010753 status = scheduler_post_message(QDF_MODULE_ID_SME,
10754 QDF_MODULE_ID_WMA,
10755 QDF_MODULE_ID_WMA, &message);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010756 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070010757 sme_err("scheduler_post_msg failed!(err=%d)", status);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053010758 qdf_mem_free(req_msg);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010759 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010760 }
10761 sme_release_global_lock(&mac->sme);
10762
10763 return status;
10764}
10765
10766/**
10767 * sme_neighbor_middle_of_roaming() - Function to know if
10768 * STA is in the middle of roaming states
Jeff Johnsonc7309062018-11-09 20:59:42 -080010769 * @mac_handle: Handle returned by macOpen
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010770 * @sessionId: sessionId of the STA session
10771 *
10772 * This function is a wrapper to call
10773 * csr_neighbor_middle_of_roaming to know STA is in the
10774 * middle of roaming states
10775 *
10776 * Return: True or False
10777 *
10778 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -080010779bool sme_neighbor_middle_of_roaming(mac_handle_t mac_handle, uint8_t sessionId)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010780{
Jeff Johnson0a8786a2018-12-02 10:49:01 -080010781 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Sandeep Puligillaca631612016-11-08 11:53:52 -080010782 bool val = false;
10783
10784 if (CSR_IS_SESSION_VALID(mac_ctx, sessionId))
10785 val = csr_neighbor_middle_of_roaming(mac_ctx, sessionId);
10786 else
Rajeev Kumar9176ca42018-05-03 09:20:40 -070010787 sme_debug("Invalid Session: %d", sessionId);
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070010788
Sandeep Puligillaca631612016-11-08 11:53:52 -080010789 return val;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010790}
10791
Jeff Johnsonc7309062018-11-09 20:59:42 -080010792bool sme_is_any_session_in_middle_of_roaming(mac_handle_t mac_handle)
Padma, Santhosh Kumar86747ec2018-05-29 18:28:29 +053010793{
Jeff Johnson0a8786a2018-12-02 10:49:01 -080010794 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Padma, Santhosh Kumar86747ec2018-05-29 18:28:29 +053010795 uint8_t session_id;
10796
Dustin Brownad06be62019-02-04 14:52:56 -080010797 for (session_id = 0; session_id < WLAN_MAX_VDEVS; session_id++) {
Padma, Santhosh Kumar86747ec2018-05-29 18:28:29 +053010798 if (CSR_IS_SESSION_VALID(mac_ctx, session_id) &&
10799 csr_neighbor_middle_of_roaming(mac_ctx, session_id))
10800 return true;
10801 }
10802
10803 return false;
10804}
10805
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010806/*
10807 * sme_send_flush_logs_cmd_to_fw() - Flush FW logs
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010808 *
10809 * This function is used to send the command that will
10810 * be used to flush the logs in the firmware
10811 *
Deepak Dhamdhere0f076bd2016-06-02 11:29:21 -070010812 * Return: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010813 */
Jeff Johnson40894142018-11-17 12:05:54 -080010814QDF_STATUS sme_send_flush_logs_cmd_to_fw(void)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010815{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010816 QDF_STATUS status;
Rajeev Kumar37d478b2017-04-17 16:59:28 -070010817 struct scheduler_msg message = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010818
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010819 /* Serialize the req through MC thread */
10820 message.bodyptr = NULL;
10821 message.type = SIR_HAL_FLUSH_LOG_TO_FW;
gaurank kathpalia36b0c582018-08-28 17:45:43 +053010822 status = scheduler_post_message(QDF_MODULE_ID_SME,
10823 QDF_MODULE_ID_WMA,
10824 QDF_MODULE_ID_WMA, &message);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010825 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070010826 sme_err("scheduler_post_msg failed!(err=%d)", status);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010827 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010828 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010829 return status;
10830}
10831
Jeff Johnsona1e92612017-09-24 15:33:44 -070010832QDF_STATUS sme_enable_uapsd_for_ac(uint8_t sta_id,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010833 sme_ac_enum_type ac, uint8_t tid,
10834 uint8_t pri, uint32_t srvc_int,
10835 uint32_t sus_int,
Abhishek Singh12be60f2017-08-11 13:52:42 +053010836 enum sme_qos_wmm_dir_type dir,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010837 uint8_t psb, uint32_t sessionId,
10838 uint32_t delay_interval)
10839{
10840 void *wma_handle;
10841 t_wma_trigger_uapsd_params uapsd_params;
10842 enum uapsd_ac access_category;
10843
10844 if (!psb) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053010845 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010846 "No need to configure auto trigger:psb is 0");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010847 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010848 }
10849
Anurag Chouhan6d760662016-02-20 16:05:43 +053010850 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010851 if (!wma_handle) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053010852 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010853 "wma_handle is NULL");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010854 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010855 }
10856
10857 switch (ac) {
10858 case SME_AC_BK:
10859 access_category = UAPSD_BK;
10860 break;
10861 case SME_AC_BE:
10862 access_category = UAPSD_BE;
10863 break;
10864 case SME_AC_VI:
10865 access_category = UAPSD_VI;
10866 break;
10867 case SME_AC_VO:
10868 access_category = UAPSD_VO;
10869 break;
10870 default:
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010871 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010872 }
10873
10874 uapsd_params.wmm_ac = access_category;
10875 uapsd_params.user_priority = pri;
10876 uapsd_params.service_interval = srvc_int;
10877 uapsd_params.delay_interval = delay_interval;
10878 uapsd_params.suspend_interval = sus_int;
10879
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010880 if (QDF_STATUS_SUCCESS !=
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010881 wma_trigger_uapsd_params(wma_handle, sessionId, &uapsd_params)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053010882 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010883 "Failed to Trigger Uapsd params for sessionId %d",
10884 sessionId);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010885 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010886 }
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010887 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010888}
10889
Jeff Johnsona1e92612017-09-24 15:33:44 -070010890QDF_STATUS sme_disable_uapsd_for_ac(uint8_t sta_id,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010891 sme_ac_enum_type ac,
10892 uint32_t sessionId)
10893{
10894 void *wma_handle;
10895 enum uapsd_ac access_category;
10896
10897 switch (ac) {
10898 case SME_AC_BK:
10899 access_category = UAPSD_BK;
10900 break;
10901 case SME_AC_BE:
10902 access_category = UAPSD_BE;
10903 break;
10904 case SME_AC_VI:
10905 access_category = UAPSD_VI;
10906 break;
10907 case SME_AC_VO:
10908 access_category = UAPSD_VO;
10909 break;
10910 default:
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010911 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010912 }
10913
Anurag Chouhan6d760662016-02-20 16:05:43 +053010914 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010915 if (!wma_handle) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053010916 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010917 "wma handle is NULL");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010918 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010919 }
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010920 if (QDF_STATUS_SUCCESS !=
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010921 wma_disable_uapsd_per_ac(wma_handle, sessionId, access_category)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053010922 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010923 "Failed to disable uapsd for ac %d for sessionId %d",
10924 ac, sessionId);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010925 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010926 }
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010927 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010928}
10929
10930/**
10931 * sme_update_nss() - SME API to change the number for spatial streams
10932 * (1 or 2)
Jeff Johnsonc7309062018-11-09 20:59:42 -080010933 * @mac_handle: Handle returned by mac open
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010934 * @nss: Number of spatial streams
10935 *
10936 * This function is used to update the number of spatial streams supported.
10937 *
10938 * Return: Success upon successfully changing nss else failure
10939 *
10940 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -080010941QDF_STATUS sme_update_nss(mac_handle_t mac_handle, uint8_t nss)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010942{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010943 QDF_STATUS status;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080010944 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Vignesh Viswanathan21c58cb2018-05-24 15:53:58 +053010945 uint32_t i;
10946 struct mlme_ht_capabilities_info *ht_cap_info;
gaurank kathpalia14e2f912017-08-31 14:51:45 +053010947 struct csr_roam_session *csr_session;
Abhinav Kumard4d6eb72018-12-04 20:30:37 +053010948 struct mlme_vht_capabilities_info *vht_cap_info;
Abhinav Kumarb074f2f2018-09-15 15:32:11 +053010949
Abhinav Kumard4d6eb72018-12-04 20:30:37 +053010950 vht_cap_info = &mac_ctx->mlme_cfg->vht_caps.vht_cap_info;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010951
10952 status = sme_acquire_global_lock(&mac_ctx->sme);
10953
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010954 if (QDF_STATUS_SUCCESS == status) {
Abhinav Kumard4d6eb72018-12-04 20:30:37 +053010955 vht_cap_info->enable2x2 = (nss == 1) ? 0 : 1;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010956
10957 /* get the HT capability info*/
Vignesh Viswanathan21c58cb2018-05-24 15:53:58 +053010958 ht_cap_info = &mac_ctx->mlme_cfg->ht_caps.ht_cap_info;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010959
Dustin Brownad06be62019-02-04 14:52:56 -080010960 for (i = 0; i < WLAN_MAX_VDEVS; i++) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010961 if (CSR_IS_SESSION_VALID(mac_ctx, i)) {
10962 csr_session = &mac_ctx->roam.roamSession[i];
Jeff Johnsonbe119e62019-02-02 12:30:26 -080010963 csr_session->ht_config.ht_tx_stbc =
Vignesh Viswanathan78182502018-08-06 15:13:30 +053010964 ht_cap_info->tx_stbc;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010965 }
10966 }
10967
10968 sme_release_global_lock(&mac_ctx->sme);
10969 }
10970 return status;
10971}
10972
10973/**
Archana Ramachandran5041b252016-04-25 14:29:25 -070010974 * sme_update_user_configured_nss() - sets the nss based on user request
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -080010975 * @mac_handle: Opaque handle to the global MAC context
Archana Ramachandran5041b252016-04-25 14:29:25 -070010976 * @nss: number of streams
10977 *
10978 * Return: None
10979 */
Jeff Johnsonc7309062018-11-09 20:59:42 -080010980void sme_update_user_configured_nss(mac_handle_t mac_handle, uint8_t nss)
Archana Ramachandran5041b252016-04-25 14:29:25 -070010981{
Jeff Johnson0a8786a2018-12-02 10:49:01 -080010982 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Archana Ramachandran5041b252016-04-25 14:29:25 -070010983
10984 mac_ctx->user_configured_nss = nss;
10985}
10986
Jeff Johnsonc7309062018-11-09 20:59:42 -080010987int sme_update_tx_bfee_supp(mac_handle_t mac_handle, uint8_t session_id,
Kiran Kumar Lokere6c7f3fa2018-05-14 18:12:27 -070010988 uint8_t cfg_val)
10989{
Jeff Johnson0a8786a2018-12-02 10:49:01 -080010990 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Jeff Johnsonc18469b2018-06-11 06:48:59 -070010991
Abhinav Kumarb074f2f2018-09-15 15:32:11 +053010992 mac_ctx->mlme_cfg->vht_caps.vht_cap_info.su_bformee = cfg_val;
Kiran Kumar Lokere6c7f3fa2018-05-14 18:12:27 -070010993
Jeff Johnsonc7309062018-11-09 20:59:42 -080010994 return sme_update_he_tx_bfee_supp(mac_handle, session_id, cfg_val);
Kiran Kumar Lokere6c7f3fa2018-05-14 18:12:27 -070010995}
Kiran Kumar Lokeref3044852018-06-27 14:14:24 -070010996
Jeff Johnsonc7309062018-11-09 20:59:42 -080010997int sme_update_tx_bfee_nsts(mac_handle_t mac_handle, uint8_t session_id,
Kiran Kumar Lokeref3044852018-06-27 14:14:24 -070010998 uint8_t usr_cfg_val, uint8_t nsts_val)
10999{
Jeff Johnson0a8786a2018-12-02 10:49:01 -080011000 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Kiran Kumar Lokeref3044852018-06-27 14:14:24 -070011001 uint8_t nsts_set_val;
Abhinav Kumard4d6eb72018-12-04 20:30:37 +053011002 struct mlme_vht_capabilities_info *vht_cap_info;
Kiran Kumar Lokeref3044852018-06-27 14:14:24 -070011003
Abhinav Kumard4d6eb72018-12-04 20:30:37 +053011004 vht_cap_info = &mac_ctx->mlme_cfg->vht_caps.vht_cap_info;
Kiran Kumar Lokeref3044852018-06-27 14:14:24 -070011005 mac_ctx->usr_cfg_tx_bfee_nsts = usr_cfg_val;
11006 if (usr_cfg_val)
11007 nsts_set_val = usr_cfg_val;
11008 else
11009 nsts_set_val = nsts_val;
Dustin Brown48f27fe2018-10-09 12:47:57 -070011010
Abhinav Kumard4d6eb72018-12-04 20:30:37 +053011011 vht_cap_info->tx_bfee_ant_supp = nsts_set_val;
Kiran Kumar Lokeref3044852018-06-27 14:14:24 -070011012
Kiran Kumar Lokere86e85592018-07-18 15:34:24 -070011013 if (usr_cfg_val)
11014 sme_set_he_tx_bf_cbf_rates(session_id);
11015
Jeff Johnsonc7309062018-11-09 20:59:42 -080011016 return sme_update_he_tx_bfee_nsts(mac_handle, session_id, nsts_set_val);
Kiran Kumar Lokeref3044852018-06-27 14:14:24 -070011017}
Kiran Kumar Lokere44a29432018-01-24 16:10:30 -080011018#ifdef WLAN_FEATURE_11AX
Jinwei Chenffaa4672018-08-30 16:55:09 +080011019void sme_update_tgt_he_cap(mac_handle_t mac_handle,
11020 struct wma_tgt_cfg *cfg,
11021 tDot11fIEhe_cap *he_cap_ini)
Jinwei Chen998a1a02018-06-20 17:20:34 +080011022{
Jeff Johnson0a8786a2018-12-02 10:49:01 -080011023 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Jinwei Chen998a1a02018-06-20 17:20:34 +080011024
11025 qdf_mem_copy(&mac_ctx->he_cap_2g,
Jinwei Chenef742dc2018-06-27 12:57:50 +080011026 &cfg->he_cap_2g,
11027 sizeof(tDot11fIEhe_cap));
Jinwei Chen998a1a02018-06-20 17:20:34 +080011028
11029 qdf_mem_copy(&mac_ctx->he_cap_5g,
Jinwei Chenef742dc2018-06-27 12:57:50 +080011030 &cfg->he_cap_5g,
11031 sizeof(tDot11fIEhe_cap));
Jinwei Chenffaa4672018-08-30 16:55:09 +080011032
11033 /* modify HE Caps field according to INI setting */
11034 mac_ctx->he_cap_2g.bfee_sts_lt_80 =
11035 QDF_MIN(cfg->he_cap_2g.bfee_sts_lt_80,
11036 he_cap_ini->bfee_sts_lt_80);
11037
11038 mac_ctx->he_cap_5g.bfee_sts_lt_80 =
11039 QDF_MIN(cfg->he_cap_5g.bfee_sts_lt_80,
11040 he_cap_ini->bfee_sts_lt_80);
Jinwei Chen998a1a02018-06-20 17:20:34 +080011041}
11042
Jeff Johnsonc7309062018-11-09 20:59:42 -080011043void sme_update_he_cap_nss(mac_handle_t mac_handle, uint8_t session_id,
11044 uint8_t nss)
Kiran Kumar Lokere44a29432018-01-24 16:10:30 -080011045{
Jeff Johnson0a8786a2018-12-02 10:49:01 -080011046 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Kiran Kumar Lokere44a29432018-01-24 16:10:30 -080011047 struct csr_roam_session *csr_session;
11048 uint32_t tx_mcs_map = 0;
11049 uint32_t rx_mcs_map = 0;
Kiran Kumar Lokere8dba1892018-07-24 17:09:52 -070011050 uint32_t mcs_map = 0;
Kiran Kumar Lokere44a29432018-01-24 16:10:30 -080011051
11052 if (!nss || (nss > 2)) {
11053 sme_err("invalid Nss value %d", nss);
11054 }
11055 csr_session = CSR_GET_SESSION(mac_ctx, session_id);
Bala Venkatesh6d537092018-09-25 10:38:36 +053011056 rx_mcs_map =
11057 mac_ctx->mlme_cfg->he_caps.dot11_he_cap.rx_he_mcs_map_lt_80;
11058 tx_mcs_map =
11059 mac_ctx->mlme_cfg->he_caps.dot11_he_cap.tx_he_mcs_map_lt_80;
Kiran Kumar Lokere8dba1892018-07-24 17:09:52 -070011060 mcs_map = rx_mcs_map & 0x3;
Bala Venkatesh6d537092018-09-25 10:38:36 +053011061
Kiran Kumar Lokere44a29432018-01-24 16:10:30 -080011062 if (nss == 1) {
11063 tx_mcs_map = HE_SET_MCS_4_NSS(tx_mcs_map, HE_MCS_DISABLE, 2);
11064 rx_mcs_map = HE_SET_MCS_4_NSS(rx_mcs_map, HE_MCS_DISABLE, 2);
11065 } else {
Kiran Kumar Lokere8dba1892018-07-24 17:09:52 -070011066 tx_mcs_map = HE_SET_MCS_4_NSS(tx_mcs_map, mcs_map, 2);
11067 rx_mcs_map = HE_SET_MCS_4_NSS(rx_mcs_map, mcs_map, 2);
Kiran Kumar Lokere44a29432018-01-24 16:10:30 -080011068 }
11069 sme_info("new HE Nss MCS MAP: Rx 0x%0X, Tx: 0x%0X",
11070 rx_mcs_map, tx_mcs_map);
Bala Venkatesh6d537092018-09-25 10:38:36 +053011071 if (cfg_in_range(CFG_HE_RX_MCS_MAP_LT_80, rx_mcs_map))
11072 mac_ctx->mlme_cfg->he_caps.dot11_he_cap.rx_he_mcs_map_lt_80 =
11073 rx_mcs_map;
11074 if (cfg_in_range(CFG_HE_TX_MCS_MAP_LT_80, tx_mcs_map))
11075 mac_ctx->mlme_cfg->he_caps.dot11_he_cap.tx_he_mcs_map_lt_80 =
11076 tx_mcs_map;
Kiran Kumar Lokere44a29432018-01-24 16:10:30 -080011077 csr_update_session_he_cap(mac_ctx, csr_session);
11078
11079}
Kiran Kumar Lokere96246e52018-01-24 16:44:35 -080011080
Jeff Johnsonc7309062018-11-09 20:59:42 -080011081int sme_update_he_mcs(mac_handle_t mac_handle, uint8_t session_id,
11082 uint16_t he_mcs)
Kiran Kumar Lokere96246e52018-01-24 16:44:35 -080011083{
Jeff Johnson0a8786a2018-12-02 10:49:01 -080011084 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Kiran Kumar Lokere96246e52018-01-24 16:44:35 -080011085 struct csr_roam_session *csr_session;
11086 uint16_t mcs_val = 0;
11087 uint16_t mcs_map = HE_MCS_ALL_DISABLED;
Kiran Kumar Lokere96246e52018-01-24 16:44:35 -080011088
11089 csr_session = CSR_GET_SESSION(mac_ctx, session_id);
11090 if (!csr_session) {
11091 sme_err("No session for id %d", session_id);
11092 return -EINVAL;
11093 }
11094 if ((he_mcs & 0x3) == HE_MCS_DISABLE) {
11095 sme_err("Invalid HE MCS 0x%0x, can't disable 0-7 for 1ss",
11096 he_mcs);
11097 return -EINVAL;
11098 }
11099 mcs_val = he_mcs & 0x3;
11100 switch (he_mcs) {
11101 case HE_80_MCS0_7:
11102 case HE_80_MCS0_9:
11103 case HE_80_MCS0_11:
Abhinav Kumarb074f2f2018-09-15 15:32:11 +053011104 if (mac_ctx->mlme_cfg->vht_caps.vht_cap_info.enable2x2) {
Kiran Kumar Lokere96246e52018-01-24 16:44:35 -080011105 mcs_map = HE_SET_MCS_4_NSS(mcs_map, mcs_val, 1);
11106 mcs_map = HE_SET_MCS_4_NSS(mcs_map, mcs_val, 2);
11107 } else {
11108 mcs_map = HE_SET_MCS_4_NSS(mcs_map, mcs_val, 1);
11109 }
Bala Venkatesh6d537092018-09-25 10:38:36 +053011110 if (cfg_in_range(CFG_HE_TX_MCS_MAP_LT_80, mcs_map))
11111 mac_ctx->mlme_cfg->he_caps.dot11_he_cap.
11112 tx_he_mcs_map_lt_80 = mcs_map;
11113 if (cfg_in_range(CFG_HE_RX_MCS_MAP_LT_80, mcs_map))
11114 mac_ctx->mlme_cfg->he_caps.dot11_he_cap.
11115 rx_he_mcs_map_lt_80 = mcs_map;
Kiran Kumar Lokere96246e52018-01-24 16:44:35 -080011116 break;
11117
11118 case HE_160_MCS0_7:
11119 case HE_160_MCS0_9:
11120 case HE_160_MCS0_11:
11121 mcs_map = HE_SET_MCS_4_NSS(mcs_map, mcs_val, 1);
Bala Venkatesh6d537092018-09-25 10:38:36 +053011122 if (cfg_in_range(CFG_HE_TX_MCS_MAP_160, mcs_map))
11123 qdf_mem_copy(mac_ctx->mlme_cfg->he_caps.dot11_he_cap.
11124 tx_he_mcs_map_160, &mcs_map,
11125 sizeof(uint16_t));
11126 if (cfg_in_range(CFG_HE_RX_MCS_MAP_160, mcs_map))
11127 qdf_mem_copy(mac_ctx->mlme_cfg->he_caps.dot11_he_cap.
11128 rx_he_mcs_map_160, &mcs_map,
11129 sizeof(uint16_t));
Kiran Kumar Lokere96246e52018-01-24 16:44:35 -080011130 break;
11131
11132 case HE_80p80_MCS0_7:
11133 case HE_80p80_MCS0_9:
11134 case HE_80p80_MCS0_11:
11135 mcs_map = HE_SET_MCS_4_NSS(mcs_map, mcs_val, 1);
Bala Venkatesh6d537092018-09-25 10:38:36 +053011136 if (cfg_in_range(CFG_HE_TX_MCS_MAP_80_80, mcs_map))
11137 qdf_mem_copy(mac_ctx->mlme_cfg->he_caps.dot11_he_cap.
11138 tx_he_mcs_map_80_80, &mcs_map,
11139 sizeof(uint16_t));
11140 if (cfg_in_range(CFG_HE_RX_MCS_MAP_80_80, mcs_map))
11141 qdf_mem_copy(mac_ctx->mlme_cfg->he_caps.dot11_he_cap.
11142 rx_he_mcs_map_80_80, &mcs_map,
11143 sizeof(uint16_t));
Kiran Kumar Lokere96246e52018-01-24 16:44:35 -080011144 break;
11145
11146 default:
11147 sme_err("Invalid HE MCS 0x%0x", he_mcs);
11148 return -EINVAL;
11149 }
11150 sme_info("new HE MCS 0x%0x", mcs_map);
Kiran Kumar Lokere96246e52018-01-24 16:44:35 -080011151 csr_update_session_he_cap(mac_ctx, csr_session);
11152
11153 return 0;
11154}
Kiran Kumar Lokere13dedac2018-02-05 19:51:59 -080011155
Jeff Johnsonc7309062018-11-09 20:59:42 -080011156void sme_set_usr_cfg_mu_edca(mac_handle_t mac_handle, bool val)
Kiran Kumar Lokeref54b8552018-07-10 00:53:38 -070011157{
Jeff Johnson0a8786a2018-12-02 10:49:01 -080011158 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Kiran Kumar Lokeref54b8552018-07-10 00:53:38 -070011159
11160 mac_ctx->usr_cfg_mu_edca_params = val;
11161}
11162
Jeff Johnsonc7309062018-11-09 20:59:42 -080011163int sme_update_mu_edca_params(mac_handle_t mac_handle, uint8_t session_id)
Kiran Kumar Lokerefba20632018-07-05 16:51:27 -070011164{
11165 struct scheduler_msg msg = {0};
11166 QDF_STATUS status;
11167
11168 qdf_mem_zero(&msg, sizeof(msg));
11169 msg.type = WNI_SME_UPDATE_MU_EDCA_PARAMS;
11170 msg.reserved = 0;
11171 msg.bodyval = session_id;
gaurank kathpalia36b0c582018-08-28 17:45:43 +053011172 status = scheduler_post_message(QDF_MODULE_ID_SME,
11173 QDF_MODULE_ID_PE,
11174 QDF_MODULE_ID_PE, &msg);
Kiran Kumar Lokerefba20632018-07-05 16:51:27 -070011175 if (status != QDF_STATUS_SUCCESS) {
11176 sme_err("Not able to post update edca profile");
11177 return -EIO;
11178 }
11179
11180 return 0;
11181}
Jeff Johnsonc7309062018-11-09 20:59:42 -080011182
11183void sme_set_he_mu_edca_def_cfg(mac_handle_t mac_handle)
Kiran Kumar Lokerefba20632018-07-05 16:51:27 -070011184{
Jeff Johnson0a8786a2018-12-02 10:49:01 -080011185 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Kiran Kumar Lokerefba20632018-07-05 16:51:27 -070011186 uint8_t i;
11187
Kiran Kumar Lokere8dba1892018-07-24 17:09:52 -070011188 sme_debug("Set MU EDCA params to default");
Kiran Kumar Lokerefba20632018-07-05 16:51:27 -070011189 for (i = 0; i < MAX_NUM_AC; i++) {
11190 mac_ctx->usr_mu_edca_params[i].aci.aifsn = MU_EDCA_DEF_AIFSN;
11191 mac_ctx->usr_mu_edca_params[i].aci.aci = i;
11192 mac_ctx->usr_mu_edca_params[i].cw.max = MU_EDCA_DEF_CW_MAX;
11193 mac_ctx->usr_mu_edca_params[i].cw.min = MU_EDCA_DEF_CW_MIN;
11194 mac_ctx->usr_mu_edca_params[i].mu_edca_timer =
11195 MU_EDCA_DEF_TIMER;
11196 }
11197}
11198
Jeff Johnsonc7309062018-11-09 20:59:42 -080011199int sme_update_he_tx_bfee_supp(mac_handle_t mac_handle, uint8_t session_id,
Kiran Kumar Lokere6c7f3fa2018-05-14 18:12:27 -070011200 uint8_t cfg_val)
11201{
Jeff Johnson0a8786a2018-12-02 10:49:01 -080011202 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Bala Venkatesh6d537092018-09-25 10:38:36 +053011203 struct csr_roam_session *session;
11204
11205 session = CSR_GET_SESSION(mac_ctx, session_id);
11206
11207 if (!session) {
11208 sme_err("No session for id %d", session_id);
11209 return -EINVAL;
11210 }
11211 if (cfg_val <= 1)
11212 mac_ctx->mlme_cfg->he_caps.dot11_he_cap.su_beamformee = cfg_val;
11213 else
11214 return -EINVAL;
11215
11216 csr_update_session_he_cap(mac_ctx, session);
11217 return 0;
Kiran Kumar Lokere6c7f3fa2018-05-14 18:12:27 -070011218}
11219
Jeff Johnsonc7309062018-11-09 20:59:42 -080011220int sme_update_he_trigger_frm_mac_pad(mac_handle_t mac_handle,
11221 uint8_t session_id,
Kiran Kumar Lokeref54b8552018-07-10 00:53:38 -070011222 uint8_t cfg_val)
11223{
Jeff Johnson0a8786a2018-12-02 10:49:01 -080011224 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Bala Venkatesh6d537092018-09-25 10:38:36 +053011225 struct csr_roam_session *session;
11226
11227 session = CSR_GET_SESSION(mac_ctx, session_id);
11228
11229 if (!session) {
11230 sme_err("No session for id %d", session_id);
11231 return -EINVAL;
11232 }
11233 if (cfg_in_range(CFG_HE_TRIG_PAD, cfg_val))
11234 mac_ctx->mlme_cfg->he_caps.dot11_he_cap.trigger_frm_mac_pad =
11235 cfg_val;
11236 else
11237 return -EINVAL;
11238
11239 csr_update_session_he_cap(mac_ctx, session);
11240 return 0;
11241
Kiran Kumar Lokeref54b8552018-07-10 00:53:38 -070011242}
11243
Jeff Johnsonc7309062018-11-09 20:59:42 -080011244int sme_update_he_om_ctrl_supp(mac_handle_t mac_handle, uint8_t session_id,
Kiran Kumar Lokeref1a96f42018-08-29 18:53:47 -070011245 uint8_t cfg_val)
11246{
Bala Venkatesh2fae18a2018-11-14 12:32:45 +053011247
Jeff Johnson0a8786a2018-12-02 10:49:01 -080011248 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Bala Venkatesh2fae18a2018-11-14 12:32:45 +053011249 struct csr_roam_session *session;
11250
11251 session = CSR_GET_SESSION(mac_ctx, session_id);
11252
11253 if (!session) {
11254 sme_err("No session for id %d", session_id);
11255 return -EINVAL;
11256 }
11257 if (cfg_in_range(CFG_HE_OMI, cfg_val))
11258 mac_ctx->mlme_cfg->he_caps.dot11_he_cap.omi_a_ctrl =
11259 cfg_val;
11260 else
11261 return -EINVAL;
11262
11263 csr_update_session_he_cap(mac_ctx, session);
11264 return 0;
Kiran Kumar Lokeref1a96f42018-08-29 18:53:47 -070011265}
11266
Jeff Johnsonc7309062018-11-09 20:59:42 -080011267int sme_send_he_om_ctrl_bw_update(mac_handle_t mac_handle, uint8_t session_id,
Kiran Kumar Lokere94634152018-09-24 19:08:35 -070011268 uint8_t cfg_val)
11269{
11270 uint32_t om_ctrl_cmd[NUM_OM_CTRL_UPDATE_CFG_PARAMS] = {0};
11271 QDF_STATUS status;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080011272 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Kiran Kumar Lokere94634152018-09-24 19:08:35 -070011273 struct csr_roam_session *session = CSR_GET_SESSION(mac_ctx, session_id);
11274
11275 if (!session) {
11276 sme_err("Session does not exist, Session_id: %d", session_id);
11277 return -EINVAL;
11278 }
11279 if (!csr_is_conn_state_connected_infra(mac_ctx, session_id)) {
11280 sme_info("STA is not connected, Session_id: %d", session_id);
11281 return -EINVAL;
11282 }
11283 if (cfg_val > session->connectedProfile.vht_channel_width) {
11284 sme_info("OM ctrl BW %d is greater than connected BW %d",
11285 cfg_val, session->connectedProfile.vht_channel_width);
11286 return -EINVAL;
11287 }
11288 mac_ctx->he_om_ctrl_cfg_bw_set = true;
11289 mac_ctx->he_om_ctrl_cfg_bw = cfg_val;
11290 om_ctrl_cmd[0] = 1;
11291 qdf_mem_copy((void *)&om_ctrl_cmd[OM_CTRL_CMD_MAC_BITS31],
11292 (void *)session->connectedProfile.bssid.bytes,
11293 sizeof(uint32_t));
11294 qdf_mem_copy((void *)&om_ctrl_cmd[OM_CTRL_CMD_MAC_BITS47],
11295 (void *)&session->connectedProfile.bssid.bytes[4],
11296 sizeof(uint16_t));
11297 if (mac_ctx->he_om_ctrl_cfg_nss_set) {
11298 om_ctrl_cmd[OM_CTRL_CMD_RX_NSS] =
11299 mac_ctx->he_om_ctrl_cfg_nss - 1;
11300 om_ctrl_cmd[OM_CTRL_CMD_TX_NSS] =
11301 mac_ctx->he_om_ctrl_cfg_nss - 1;
11302 } else {
11303 om_ctrl_cmd[OM_CTRL_CMD_RX_NSS] = session->nss - 1;
11304 om_ctrl_cmd[OM_CTRL_CMD_TX_NSS] = session->nss - 1;
11305 }
11306 om_ctrl_cmd[OM_CTRL_CMD_BW] = cfg_val;
11307 om_ctrl_cmd[OM_CTRL_CMD_ULMU] = 1;
11308 status = wma_form_unit_test_cmd_and_send(session_id, 13, 7,
11309 om_ctrl_cmd);
11310 if (QDF_STATUS_SUCCESS != status) {
11311 sme_err("send_unit_test_cmd returned %d", status);
11312 return -EIO;
11313 }
11314
11315 return 0;
11316}
11317
Jeff Johnsonc7309062018-11-09 20:59:42 -080011318int sme_send_he_om_ctrl_nss_update(mac_handle_t mac_handle, uint8_t session_id,
11319 uint8_t cfg_val)
Kiran Kumar Lokere94634152018-09-24 19:08:35 -070011320{
11321 uint32_t om_ctrl_cmd[NUM_OM_CTRL_UPDATE_CFG_PARAMS] = {0};
11322 QDF_STATUS status;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080011323 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Kiran Kumar Lokere94634152018-09-24 19:08:35 -070011324 struct csr_roam_session *session = CSR_GET_SESSION(mac_ctx, session_id);
11325
11326 if (!session) {
11327 sme_err("Session does not exist, Session_id: %d", session_id);
11328 return -EINVAL;
11329 }
11330 if (!csr_is_conn_state_connected_infra(mac_ctx, session_id)) {
11331 sme_info("STA not in connected state Session_id: %d",
11332 session_id);
11333 return -EINVAL;
11334 }
11335 if (cfg_val > session->nss) {
11336 sme_info("OM ctrl Nss %d is greater than connected Nss %d",
11337 cfg_val, session->nss);
11338 return -EINVAL;
11339 }
11340 mac_ctx->he_om_ctrl_cfg_nss_set = true;
11341 mac_ctx->he_om_ctrl_cfg_nss = cfg_val;
11342 om_ctrl_cmd[0] = 1;
11343 qdf_mem_copy((void *)&om_ctrl_cmd[OM_CTRL_CMD_MAC_BITS31],
11344 (void *)session->connectedProfile.bssid.bytes,
11345 sizeof(uint32_t));
11346 qdf_mem_copy((void *)&om_ctrl_cmd[OM_CTRL_CMD_MAC_BITS47],
11347 (void *)&session->connectedProfile.bssid.bytes[4],
11348 sizeof(uint16_t));
11349
11350 if (mac_ctx->he_om_ctrl_cfg_bw_set)
11351 om_ctrl_cmd[OM_CTRL_CMD_BW] = mac_ctx->he_om_ctrl_cfg_bw;
11352 else
11353 om_ctrl_cmd[OM_CTRL_CMD_BW] =
11354 session->connectedProfile.vht_channel_width;
11355
11356 om_ctrl_cmd[OM_CTRL_CMD_RX_NSS] = cfg_val - 1;
11357 om_ctrl_cmd[OM_CTRL_CMD_TX_NSS] = cfg_val - 1;
11358 om_ctrl_cmd[OM_CTRL_CMD_ULMU] = 1;
11359 status = wma_form_unit_test_cmd_and_send(session_id, 13, 7,
11360 om_ctrl_cmd);
11361 if (QDF_STATUS_SUCCESS != status) {
11362 sme_err("send_unit_test_cmd returned %d", status);
11363 return -EIO;
11364 }
11365
11366 return 0;
11367}
11368
Jeff Johnsonc7309062018-11-09 20:59:42 -080011369void sme_reset_he_om_ctrl(mac_handle_t mac_handle)
Kiran Kumar Lokere94634152018-09-24 19:08:35 -070011370{
Jeff Johnson0a8786a2018-12-02 10:49:01 -080011371 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Kiran Kumar Lokere94634152018-09-24 19:08:35 -070011372
11373 mac_ctx->he_om_ctrl_cfg_bw_set = false;
11374 mac_ctx->he_om_ctrl_cfg_nss_set = false;
11375 mac_ctx->he_om_ctrl_cfg_bw = 0;
11376 mac_ctx->he_om_ctrl_cfg_nss = 0;
11377}
11378
Kiran Kumar Lokereee205772018-09-27 00:27:27 -070011379int sme_config_action_tx_in_tb_ppdu(mac_handle_t mac_handle, uint8_t session_id,
11380 uint8_t cfg_val)
11381{
11382 QDF_STATUS status;
11383 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
11384 struct scheduler_msg msg = {0};
11385 struct sir_cfg_action_frm_tb_ppdu *cfg_msg;
11386
11387 if (!csr_is_conn_state_connected_infra(mac_ctx, session_id)) {
11388 sme_info("STA not in connected state Session_id: %d",
11389 session_id);
11390 return -EINVAL;
11391 }
11392
11393 cfg_msg = qdf_mem_malloc(sizeof(*cfg_msg));
11394
11395 if (!cfg_msg)
11396 return -EIO;
11397
11398 cfg_msg->type = WNI_SME_CFG_ACTION_FRM_HE_TB_PPDU;
11399 cfg_msg->session_id = session_id;
11400 cfg_msg->cfg = cfg_val;
11401
11402 msg.bodyptr = cfg_msg;
11403 msg.type = WNI_SME_CFG_ACTION_FRM_HE_TB_PPDU;
11404 status = scheduler_post_message(QDF_MODULE_ID_SME, QDF_MODULE_ID_PE,
11405 QDF_MODULE_ID_PE, &msg);
11406 if (QDF_STATUS_SUCCESS != status) {
11407 sme_err("Failed to send CFG_ACTION_FRAME_IN_TB_PPDU to PE %d",
11408 status);
11409 qdf_mem_free(cfg_msg);
11410 return -EIO;
11411 }
11412
11413 return 0;
11414}
11415
Jeff Johnsonc7309062018-11-09 20:59:42 -080011416int sme_update_he_tx_bfee_nsts(mac_handle_t mac_handle, uint8_t session_id,
Kiran Kumar Lokeref3044852018-06-27 14:14:24 -070011417 uint8_t cfg_val)
11418{
Jeff Johnson0a8786a2018-12-02 10:49:01 -080011419 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Bala Venkatesh6d537092018-09-25 10:38:36 +053011420 struct csr_roam_session *session;
11421
11422 session = CSR_GET_SESSION(mac_ctx, session_id);
11423
11424 if (!session) {
11425 sme_err("No session for id %d", session_id);
11426 return -EINVAL;
11427 }
11428 if (cfg_in_range(CFG_HE_BFEE_STS_LT80, cfg_val))
11429 mac_ctx->mlme_cfg->he_caps.dot11_he_cap.bfee_sts_lt_80 =
11430 cfg_val;
11431 else
11432 return -EINVAL;
11433
11434 csr_update_session_he_cap(mac_ctx, session);
11435 return 0;
Kiran Kumar Lokeref3044852018-06-27 14:14:24 -070011436}
11437
Kiran Kumar Lokere86e85592018-07-18 15:34:24 -070011438void sme_set_he_tx_bf_cbf_rates(uint8_t session_id)
11439{
11440 uint32_t tx_bf_cbf_rates_5g[] = {91, 1, 0, 3, 2, 4, 0};
11441 uint32_t tx_bf_cbf_rates_2g[] = {91, 1, 1, 3, 1, 3, 0};
11442 QDF_STATUS status;
11443
11444 status = wma_form_unit_test_cmd_and_send(session_id, 0x48, 7,
11445 tx_bf_cbf_rates_5g);
11446 if (QDF_STATUS_SUCCESS != status)
11447 sme_err("send_unit_test_cmd returned %d", status);
11448
11449 status = wma_form_unit_test_cmd_and_send(session_id, 0x48, 7,
11450 tx_bf_cbf_rates_2g);
11451 if (QDF_STATUS_SUCCESS != status)
11452 sme_err("send_unit_test_cmd returned %d", status);
11453}
11454
Kiran Kumar Lokereefdbd0b2018-09-25 18:53:46 -070011455void sme_config_su_ppdu_queue(uint8_t session_id, bool enable)
11456{
11457 uint32_t su_ppdu_enable[] = {69, 1, 1, 1};
11458 uint32_t su_ppdu_disable[] = {69, 1, 1, 0};
11459 QDF_STATUS status;
11460
11461 if (enable) {
11462 sme_debug("Send Tx SU PPDU queue ENABLE cmd to FW");
11463 status = wma_form_unit_test_cmd_and_send(session_id, 0x48, 4,
11464 su_ppdu_enable);
11465 } else {
11466 sme_debug("Send Tx SU PPDU queue DISABLE cmd to FW");
11467 status = wma_form_unit_test_cmd_and_send(session_id, 0x48, 4,
11468 su_ppdu_disable);
11469 }
11470 if (QDF_STATUS_SUCCESS != status)
11471 sme_err("send_unit_test_cmd returned %d", status);
11472}
11473
Jeff Johnsonc7309062018-11-09 20:59:42 -080011474int sme_update_he_tx_stbc_cap(mac_handle_t mac_handle, uint8_t session_id,
11475 int value)
Kiran Kumar Lokere13dedac2018-02-05 19:51:59 -080011476{
Jeff Johnson0a8786a2018-12-02 10:49:01 -080011477 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Bala Venkatesh6d537092018-09-25 10:38:36 +053011478 struct csr_roam_session *session;
Kiran Kumar Lokere5cc2f0d2018-02-08 17:10:05 -080011479 uint32_t he_cap_val = 0;
11480
11481 he_cap_val = value ? 1 : 0;
Bala Venkatesh6d537092018-09-25 10:38:36 +053011482 session = CSR_GET_SESSION(mac_ctx, session_id);
Kiran Kumar Lokere13dedac2018-02-05 19:51:59 -080011483
Bala Venkatesh6d537092018-09-25 10:38:36 +053011484 if (!session) {
11485 sme_err("No session for id %d", session_id);
11486 return -EINVAL;
11487 }
11488 if (he_cap_val <= 1)
Kiran Kumar Lokere9cab5252019-02-04 14:38:08 -080011489 mac_ctx->mlme_cfg->he_caps.dot11_he_cap.tb_ppdu_tx_stbc_lt_80mhz
11490 = he_cap_val;
Bala Venkatesh6d537092018-09-25 10:38:36 +053011491 else
11492 return -EINVAL;
11493 if (he_cap_val <= 1)
Kiran Kumar Lokere9cab5252019-02-04 14:38:08 -080011494 mac_ctx->mlme_cfg->he_caps.dot11_he_cap.tb_ppdu_tx_stbc_gt_80mhz
11495 = he_cap_val;
Bala Venkatesh6d537092018-09-25 10:38:36 +053011496 else
11497 return -EINVAL;
11498 csr_update_session_he_cap(mac_ctx, session);
11499 return 0;
Kiran Kumar Lokere13dedac2018-02-05 19:51:59 -080011500}
11501
Jeff Johnsonc7309062018-11-09 20:59:42 -080011502int sme_update_he_rx_stbc_cap(mac_handle_t mac_handle, uint8_t session_id,
11503 int value)
Kiran Kumar Lokere13dedac2018-02-05 19:51:59 -080011504{
Jeff Johnson0a8786a2018-12-02 10:49:01 -080011505 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Bala Venkatesh6d537092018-09-25 10:38:36 +053011506 struct csr_roam_session *session;
Kiran Kumar Lokere5cc2f0d2018-02-08 17:10:05 -080011507 uint32_t he_cap_val = 0;
11508
11509 he_cap_val = value ? 1 : 0;
Bala Venkatesh6d537092018-09-25 10:38:36 +053011510 session = CSR_GET_SESSION(mac_ctx, session_id);
Kiran Kumar Lokere13dedac2018-02-05 19:51:59 -080011511
Bala Venkatesh6d537092018-09-25 10:38:36 +053011512 if (!session) {
11513 sme_err("No session for id %d", session_id);
11514 return -EINVAL;
11515 }
11516 if (he_cap_val <= 1)
11517 mac_ctx->mlme_cfg->he_caps.dot11_he_cap.rx_stbc_lt_80mhz =
11518 he_cap_val;
11519 else
11520 return -EINVAL;
11521 if (he_cap_val <= 1)
11522 mac_ctx->mlme_cfg->he_caps.dot11_he_cap.rx_stbc_gt_80mhz =
11523 he_cap_val;
11524 else
11525 return -EINVAL;
11526 csr_update_session_he_cap(mac_ctx, session);
11527 return 0;
Kiran Kumar Lokere5cc2f0d2018-02-08 17:10:05 -080011528}
11529
Jeff Johnsonc7309062018-11-09 20:59:42 -080011530int sme_update_he_frag_supp(mac_handle_t mac_handle, uint8_t session_id,
11531 uint16_t he_frag)
Kiran Kumar Lokere5cc2f0d2018-02-08 17:10:05 -080011532{
Jeff Johnson0a8786a2018-12-02 10:49:01 -080011533 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Bala Venkatesh6d537092018-09-25 10:38:36 +053011534 struct csr_roam_session *session;
11535
11536 session = CSR_GET_SESSION(mac_ctx, session_id);
11537
11538 if (!session) {
11539 sme_err("No session for id %d", session_id);
11540 return -EINVAL;
11541 }
11542 if (cfg_in_range(CFG_HE_FRAGMENTATION, he_frag))
11543 mac_ctx->mlme_cfg->he_caps.dot11_he_cap.fragmentation = he_frag;
11544 else
11545 return -EINVAL;
11546
11547 csr_update_session_he_cap(mac_ctx, session);
11548 return 0;
11549
Kiran Kumar Lokere13dedac2018-02-05 19:51:59 -080011550}
Kiran Kumar Lokeree43a4582018-05-08 19:54:03 -070011551
Jeff Johnsonc7309062018-11-09 20:59:42 -080011552int sme_update_he_ldpc_supp(mac_handle_t mac_handle, uint8_t session_id,
Kiran Kumar Lokeree43a4582018-05-08 19:54:03 -070011553 uint16_t he_ldpc)
11554{
Jeff Johnson0a8786a2018-12-02 10:49:01 -080011555 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Bala Venkatesh6d537092018-09-25 10:38:36 +053011556 struct csr_roam_session *session;
11557
11558 session = CSR_GET_SESSION(mac_ctx, session_id);
11559
11560 if (!session) {
11561 sme_err("No session for id %d", session_id);
11562 return -EINVAL;
11563 }
11564 if (he_ldpc <= 1)
11565 mac_ctx->mlme_cfg->he_caps.dot11_he_cap.ldpc_coding = he_ldpc;
11566 else
11567 return -EINVAL;
11568
11569 csr_update_session_he_cap(mac_ctx, session);
11570 return 0;
11571
Kiran Kumar Lokeree43a4582018-05-08 19:54:03 -070011572}
Kiran Kumar Lokere44a29432018-01-24 16:10:30 -080011573#endif
11574
Archana Ramachandran5041b252016-04-25 14:29:25 -070011575/**
Anurag Chouhan3920c0f2017-09-11 17:10:56 +053011576 * sme_set_nud_debug_stats_cb() - set nud debug stats callback
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -080011577 * @mac_handle: Opaque handle to the global MAC context
Anurag Chouhan3920c0f2017-09-11 17:10:56 +053011578 * @cb: callback function pointer
Dundi Raviteja3bcf3a82018-05-22 13:24:18 +053011579 * @context: callback context
Anurag Chouhan3920c0f2017-09-11 17:10:56 +053011580 *
11581 * This function stores nud debug stats callback function.
11582 *
11583 * Return: QDF_STATUS enumeration.
11584 */
Jeff Johnsonc7309062018-11-09 20:59:42 -080011585QDF_STATUS sme_set_nud_debug_stats_cb(mac_handle_t mac_handle,
Dundi Raviteja3bcf3a82018-05-22 13:24:18 +053011586 void (*cb)(void *, struct rsp_stats *, void *),
11587 void *context)
Anurag Chouhan3920c0f2017-09-11 17:10:56 +053011588{
11589 QDF_STATUS status = QDF_STATUS_SUCCESS;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080011590 struct mac_context *mac;
Anurag Chouhan3920c0f2017-09-11 17:10:56 +053011591
Jeff Johnsonc7309062018-11-09 20:59:42 -080011592 if (!mac_handle) {
Anurag Chouhan3920c0f2017-09-11 17:10:56 +053011593 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Jeff Johnsonc7309062018-11-09 20:59:42 -080011594 FL("mac_handle is not valid"));
Anurag Chouhan3920c0f2017-09-11 17:10:56 +053011595 return QDF_STATUS_E_INVAL;
11596 }
Jeff Johnsona0619e42018-11-28 17:43:00 -080011597 mac = MAC_CONTEXT(mac_handle);
Anurag Chouhan3920c0f2017-09-11 17:10:56 +053011598
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("sme_acquire_global_lock failed!(status=%d)"),
11603 status);
11604 return status;
11605 }
11606
11607 mac->sme.get_arp_stats_cb = cb;
Dundi Raviteja3bcf3a82018-05-22 13:24:18 +053011608 mac->sme.get_arp_stats_context = context;
Anurag Chouhan3920c0f2017-09-11 17:10:56 +053011609 sme_release_global_lock(&mac->sme);
11610 return status;
11611}
11612
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011613/**
11614 * sme_is_any_session_in_connected_state() - SME wrapper API to
11615 * check if any session is in connected state or not.
11616 *
Jeff Johnsonc7309062018-11-09 20:59:42 -080011617 * @mac_handle: Handle returned by mac open
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011618 *
11619 * This function is used to check if any valid sme session is in
11620 * connected state or not.
11621 *
11622 * Return: true if any session is connected, else false.
11623 *
11624 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -080011625bool sme_is_any_session_in_connected_state(mac_handle_t mac_handle)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011626{
Jeff Johnson0a8786a2018-12-02 10:49:01 -080011627 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011628 QDF_STATUS status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011629 bool ret = false;
11630
11631 status = sme_acquire_global_lock(&mac_ctx->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011632 if (QDF_STATUS_SUCCESS == status) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011633 ret = csr_is_any_session_in_connect_state(mac_ctx);
11634 sme_release_global_lock(&mac_ctx->sme);
11635 }
11636 return ret;
11637}
11638
Jeff Johnsonb7fa2562018-07-02 08:36:17 -070011639QDF_STATUS sme_set_chip_pwr_save_fail_cb(mac_handle_t mac_handle,
11640 pwr_save_fail_cb cb)
11641{
11642 QDF_STATUS status;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080011643 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Ravi Kumar Bokka05c14e52017-03-27 14:48:23 +053011644
11645 status = sme_acquire_global_lock(&mac->sme);
11646 if (status != QDF_STATUS_SUCCESS) {
11647 sme_err("sme_AcquireGlobalLock failed!(status=%d)", status);
11648 return status;
11649 }
11650 mac->sme.chip_power_save_fail_cb = cb;
11651 sme_release_global_lock(&mac->sme);
11652 return status;
11653}
11654
Qiwei Caie689a262018-07-26 15:50:22 +080011655#ifdef FEATURE_RSSI_MONITOR
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011656/**
11657 * sme_set_rssi_monitoring() - set rssi monitoring
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -080011658 * @mac_handle: Opaque handle to the global MAC context
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011659 * @input: request message
11660 *
11661 * This function constructs the vos message and fill in message type,
11662 * bodyptr with @input and posts it to WDA queue.
11663 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011664 * Return: QDF_STATUS enumeration
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011665 */
Jeff Johnsonc7309062018-11-09 20:59:42 -080011666QDF_STATUS sme_set_rssi_monitoring(mac_handle_t mac_handle,
11667 struct rssi_monitor_req *input)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011668{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011669 QDF_STATUS status = QDF_STATUS_SUCCESS;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080011670 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Rajeev Kumar37d478b2017-04-17 16:59:28 -070011671 struct scheduler_msg message = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011672 struct rssi_monitor_req *req_msg;
11673
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070011674 SME_ENTER();
Anurag Chouhan600c3a02016-03-01 10:33:54 +053011675 req_msg = qdf_mem_malloc(sizeof(*req_msg));
Arif Hussain0ef77082018-10-10 16:42:53 -070011676 if (!req_msg)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011677 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011678
11679 *req_msg = *input;
11680
11681 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011682 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070011683 sme_err("sme_acquire_global_lock failed!(status=%d)", status);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053011684 qdf_mem_free(req_msg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011685 return status;
11686 }
11687
11688 /* Serialize the req through MC thread */
Rajeev Kumar8eaedf62017-01-21 11:03:13 -080011689 message.bodyptr = req_msg;
11690 message.type = WMA_SET_RSSI_MONITOR_REQ;
gaurank kathpalia36b0c582018-08-28 17:45:43 +053011691 status = scheduler_post_message(QDF_MODULE_ID_SME,
11692 QDF_MODULE_ID_WMA,
11693 QDF_MODULE_ID_WMA, &message);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011694 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070011695 sme_err("scheduler_post_msg failed!(err=%d)", status);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053011696 qdf_mem_free(req_msg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011697 }
11698 sme_release_global_lock(&mac->sme);
11699
11700 return status;
11701}
11702
Qiwei Caie689a262018-07-26 15:50:22 +080011703QDF_STATUS sme_set_rssi_threshold_breached_cb(mac_handle_t mac_handle,
11704 rssi_threshold_breached_cb cb)
11705{
11706 QDF_STATUS status;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080011707 struct mac_context *mac;
Qiwei Caie689a262018-07-26 15:50:22 +080011708
11709 mac = MAC_CONTEXT(mac_handle);
11710 if (!mac) {
11711 sme_err("Invalid mac context");
11712 return QDF_STATUS_E_INVAL;
11713 }
11714
11715 status = sme_acquire_global_lock(&mac->sme);
11716 if (!QDF_IS_STATUS_SUCCESS(status)) {
11717 sme_err("sme_acquire_global_lock failed!(status=%d)",
11718 status);
11719 return status;
11720 }
11721
11722 mac->sme.rssi_threshold_breached_cb = cb;
11723 sme_release_global_lock(&mac->sme);
11724 return status;
11725}
11726#endif /* FEATURE_RSSI_MONITOR */
11727
11728QDF_STATUS sme_reset_rssi_threshold_breached_cb(mac_handle_t mac_handle)
11729{
11730 return sme_set_rssi_threshold_breached_cb(mac_handle, NULL);
11731}
11732
Varun Reddy Yeturu951de5d2018-09-10 21:36:22 -070011733static enum band_info sme_get_connected_roaming_vdev_band(void)
11734{
11735 enum band_info band = BAND_ALL;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080011736 struct mac_context *mac = sme_get_mac_context();
Varun Reddy Yeturu951de5d2018-09-10 21:36:22 -070011737 struct csr_roam_session *session;
11738 uint8_t session_id, channel;
11739
11740 if (!mac) {
11741 sme_debug("MAC Context is NULL");
11742 return band;
11743 }
11744 session_id = csr_get_roam_enabled_sta_sessionid(mac);
11745 if (session_id != CSR_SESSION_ID_INVALID) {
11746 session = CSR_GET_SESSION(mac, session_id);
11747 channel = session->connectedProfile.operationChannel;
11748 band = csr_get_rf_band(channel);
11749 return band;
11750 }
11751
11752 return band;
11753}
11754
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011755/*
Manishekar Chandrasekaran7009f252016-04-21 19:14:15 +053011756 * sme_pdev_set_pcl() - Send WMI_PDEV_SET_PCL_CMDID to the WMA
Jeff Johnsonc7309062018-11-09 20:59:42 -080011757 * @mac_handle: Handle returned by macOpen
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011758 * @msg: PCL channel list and length structure
11759 *
Manishekar Chandrasekaran7009f252016-04-21 19:14:15 +053011760 * Sends the command to WMA to send WMI_PDEV_SET_PCL_CMDID to FW
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011761 * Return: QDF_STATUS_SUCCESS on successful posting
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011762 */
Krunal Soni8a090df2018-05-03 15:02:54 -070011763QDF_STATUS sme_pdev_set_pcl(struct policy_mgr_pcl_list *msg)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011764{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011765 QDF_STATUS status = QDF_STATUS_SUCCESS;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080011766 struct mac_context *mac = sme_get_mac_context();
Rajeev Kumar37d478b2017-04-17 16:59:28 -070011767 struct scheduler_msg message = {0};
Varun Reddy Yeturu951de5d2018-09-10 21:36:22 -070011768 struct set_pcl_req *req_msg;
11769 uint32_t i;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011770
Krunal Soni3fa80e22018-01-09 14:16:02 -080011771 if (!mac) {
11772 sme_err("mac is NULL");
11773 return QDF_STATUS_E_FAILURE;
11774 }
Krunal Soni8a090df2018-05-03 15:02:54 -070011775
11776 if (!msg) {
11777 sme_err("msg is NULL");
11778 return QDF_STATUS_E_FAILURE;
11779 }
11780
Varun Reddy Yeturu951de5d2018-09-10 21:36:22 -070011781 req_msg = qdf_mem_malloc(sizeof(*req_msg));
Arif Hussain0ef77082018-10-10 16:42:53 -070011782 if (!req_msg)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011783 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011784
Varun Reddy Yeturu951de5d2018-09-10 21:36:22 -070011785 req_msg->band = BAND_ALL;
11786 if (CSR_IS_ROAM_INTRA_BAND_ENABLED(mac)) {
11787 req_msg->band = sme_get_connected_roaming_vdev_band();
11788 sme_debug("Connected STA band %d", req_msg->band);
11789 }
Krunal Soni8a090df2018-05-03 15:02:54 -070011790 for (i = 0; i < msg->pcl_len; i++) {
Varun Reddy Yeturu951de5d2018-09-10 21:36:22 -070011791 req_msg->chan_weights.pcl_list[i] = msg->pcl_list[i];
11792 req_msg->chan_weights.weight_list[i] = msg->weight_list[i];
Manishekar Chandrasekaran7009f252016-04-21 19:14:15 +053011793 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011794
Varun Reddy Yeturu951de5d2018-09-10 21:36:22 -070011795 req_msg->chan_weights.pcl_len = msg->pcl_len;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011796
11797 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011798 if (status != QDF_STATUS_SUCCESS) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070011799 sme_err("sme_acquire_global_lock failed!(status=%d)", status);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053011800 qdf_mem_free(req_msg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011801 return status;
11802 }
11803
11804 /* Serialize the req through MC thread */
Rajeev Kumar8eaedf62017-01-21 11:03:13 -080011805 message.bodyptr = req_msg;
11806 message.type = SIR_HAL_PDEV_SET_PCL_TO_FW;
gaurank kathpalia36b0c582018-08-28 17:45:43 +053011807 status = scheduler_post_message(QDF_MODULE_ID_SME,
11808 QDF_MODULE_ID_WMA,
11809 QDF_MODULE_ID_WMA, &message);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011810 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070011811 sme_err("scheduler_post_msg failed!(err=%d)", status);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053011812 qdf_mem_free(req_msg);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011813 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011814 }
11815 sme_release_global_lock(&mac->sme);
11816
11817 return status;
11818}
11819
11820/*
Manishekar Chandrasekarand9640342016-04-27 12:28:26 +053011821 * sme_pdev_set_hw_mode() - Send WMI_PDEV_SET_HW_MODE_CMDID to the WMA
Jeff Johnsonc7309062018-11-09 20:59:42 -080011822 * @mac_handle: Handle returned by macOpen
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011823 * @msg: HW mode structure containing hw mode and callback details
11824 *
Manishekar Chandrasekarand9640342016-04-27 12:28:26 +053011825 * Sends the command to CSR to send WMI_PDEV_SET_HW_MODE_CMDID to FW
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011826 * Return: QDF_STATUS_SUCCESS on successful posting
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011827 */
Tushnim Bhattacharyya0c4ad2d2017-03-09 15:59:03 -080011828QDF_STATUS sme_pdev_set_hw_mode(struct policy_mgr_hw_mode msg)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011829{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011830 QDF_STATUS status = QDF_STATUS_SUCCESS;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080011831 struct mac_context *mac = sme_get_mac_context();
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011832 tSmeCmd *cmd = NULL;
11833
Krunal Soni3fa80e22018-01-09 14:16:02 -080011834 if (!mac) {
11835 sme_err("mac is NULL");
11836 return QDF_STATUS_E_FAILURE;
11837 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011838 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011839 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070011840 sme_err("Failed to acquire lock");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011841 return QDF_STATUS_E_RESOURCES;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011842 }
11843
Krunal Soni78618d92017-02-14 21:46:31 -080011844 cmd = csr_get_command_buffer(mac);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011845 if (!cmd) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070011846 sme_err("Get command buffer failed");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011847 sme_release_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011848 return QDF_STATUS_E_NULL_VALUE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011849 }
11850
11851 cmd->command = e_sme_command_set_hw_mode;
Ganesh Kondabattiniae1c6a22017-05-02 18:02:11 +053011852 cmd->sessionId = msg.session_id;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011853 cmd->u.set_hw_mode_cmd.hw_mode_index = msg.hw_mode_index;
11854 cmd->u.set_hw_mode_cmd.set_hw_mode_cb = msg.set_hw_mode_cb;
Chandrasekaran, Manishekaref70c0d2015-10-20 19:54:55 +053011855 cmd->u.set_hw_mode_cmd.reason = msg.reason;
11856 cmd->u.set_hw_mode_cmd.session_id = msg.session_id;
Tushnim Bhattacharyyaeab33dd2017-11-15 15:20:02 -080011857 cmd->u.set_hw_mode_cmd.next_action = msg.next_action;
Tushnim Bhattacharyya0c4ad2d2017-03-09 15:59:03 -080011858 cmd->u.set_hw_mode_cmd.context = msg.context;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011859
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070011860 sme_debug("Queuing set hw mode to CSR, session: %d reason: %d",
Chandrasekaran, Manishekarce2172e2016-02-18 16:12:43 +053011861 cmd->u.set_hw_mode_cmd.session_id,
11862 cmd->u.set_hw_mode_cmd.reason);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011863 csr_queue_sme_command(mac, cmd, false);
11864
11865 sme_release_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011866 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011867}
11868
11869/**
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011870 * sme_nss_update_request() - Send beacon templete update to FW with new
11871 * nss value
Jeff Johnsonc7309062018-11-09 20:59:42 -080011872 * @mac_handle: Handle returned by macOpen
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011873 * @vdev_id: the session id
11874 * @new_nss: the new nss value
11875 * @cback: hdd callback
11876 * @next_action: next action to happen at policy mgr after beacon update
Liangwei Dong1ba99482018-10-19 02:57:29 -040011877 * @original_vdev_id: original request hwmode change vdev id
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011878 *
11879 * Sends the command to CSR to send to PE
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011880 * Return: QDF_STATUS_SUCCESS on successful posting
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011881 */
Tushnim Bhattacharyya0c4ad2d2017-03-09 15:59:03 -080011882QDF_STATUS sme_nss_update_request(uint32_t vdev_id,
11883 uint8_t new_nss, policy_mgr_nss_update_cback cback,
11884 uint8_t next_action, struct wlan_objmgr_psoc *psoc,
Liangwei Dong1ba99482018-10-19 02:57:29 -040011885 enum policy_mgr_conn_update_reason reason,
11886 uint32_t original_vdev_id)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011887{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011888 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080011889 struct mac_context *mac = sme_get_mac_context();
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011890 tSmeCmd *cmd = NULL;
11891
Krunal Soni3fa80e22018-01-09 14:16:02 -080011892 if (!mac) {
11893 sme_err("mac is null");
11894 return status;
11895 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011896 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011897 if (QDF_IS_STATUS_SUCCESS(status)) {
Krunal Soni78618d92017-02-14 21:46:31 -080011898 cmd = csr_get_command_buffer(mac);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011899 if (!cmd) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070011900 sme_err("Get command buffer failed");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011901 sme_release_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011902 return QDF_STATUS_E_NULL_VALUE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011903 }
11904 cmd->command = e_sme_command_nss_update;
11905 /* Sessionized modules may require this info */
11906 cmd->sessionId = vdev_id;
11907 cmd->u.nss_update_cmd.new_nss = new_nss;
11908 cmd->u.nss_update_cmd.session_id = vdev_id;
11909 cmd->u.nss_update_cmd.nss_update_cb = cback;
Tushnim Bhattacharyya0c4ad2d2017-03-09 15:59:03 -080011910 cmd->u.nss_update_cmd.context = psoc;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011911 cmd->u.nss_update_cmd.next_action = next_action;
Chandrasekaran, Manishekarce2172e2016-02-18 16:12:43 +053011912 cmd->u.nss_update_cmd.reason = reason;
Liangwei Dong1ba99482018-10-19 02:57:29 -040011913 cmd->u.nss_update_cmd.original_vdev_id = original_vdev_id;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011914
Liangwei Dong1ba99482018-10-19 02:57:29 -040011915 sme_debug("Queuing e_sme_command_nss_update to CSR:vdev (%d %d) ss %d r %d",
11916 vdev_id, original_vdev_id, new_nss, reason);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011917 csr_queue_sme_command(mac, cmd, false);
11918 sme_release_global_lock(&mac->sme);
11919 }
11920 return status;
11921}
11922
11923/**
11924 * sme_soc_set_dual_mac_config() - Set dual mac configurations
Jeff Johnsonc7309062018-11-09 20:59:42 -080011925 * @mac_handle: Handle returned by macOpen
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011926 * @msg: Structure containing the dual mac config parameters
11927 *
11928 * Queues configuration information to CSR to configure
11929 * WLAN firmware for the dual MAC features
11930 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011931 * Return: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011932 */
Tushnim Bhattacharyya0c4ad2d2017-03-09 15:59:03 -080011933QDF_STATUS sme_soc_set_dual_mac_config(struct policy_mgr_dual_mac_config msg)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011934{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011935 QDF_STATUS status = QDF_STATUS_SUCCESS;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080011936 struct mac_context *mac = sme_get_mac_context();
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011937 tSmeCmd *cmd;
11938
Krunal Soni3fa80e22018-01-09 14:16:02 -080011939 if (!mac) {
11940 sme_err("mac is null");
11941 return QDF_STATUS_E_FAILURE;
11942 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011943 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011944 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070011945 sme_err("Failed to acquire lock");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011946 return QDF_STATUS_E_RESOURCES;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011947 }
11948
Krunal Soni78618d92017-02-14 21:46:31 -080011949 cmd = csr_get_command_buffer(mac);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011950 if (!cmd) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070011951 sme_err("Get command buffer failed");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011952 sme_release_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011953 return QDF_STATUS_E_NULL_VALUE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011954 }
11955
11956 cmd->command = e_sme_command_set_dual_mac_config;
11957 cmd->u.set_dual_mac_cmd.scan_config = msg.scan_config;
11958 cmd->u.set_dual_mac_cmd.fw_mode_config = msg.fw_mode_config;
11959 cmd->u.set_dual_mac_cmd.set_dual_mac_cb = msg.set_dual_mac_cb;
11960
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070011961 sme_debug("set_dual_mac_config scan_config: %x fw_mode_config: %x",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011962 cmd->u.set_dual_mac_cmd.scan_config,
11963 cmd->u.set_dual_mac_cmd.fw_mode_config);
11964 csr_queue_sme_command(mac, cmd, false);
11965
11966 sme_release_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011967 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011968}
11969
Ravi Joshi9e891ba2015-11-09 19:03:46 -080011970#ifdef FEATURE_LFR_SUBNET_DETECTION
11971/**
11972 * sme_gateway_param_update() - to update gateway parameters with WMA
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -080011973 * @mac_handle: Opaque handle to the global MAC context
Ravi Joshi9e891ba2015-11-09 19:03:46 -080011974 * @gw_params: request parameters from HDD
11975 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011976 * Return: QDF_STATUS
Ravi Joshi9e891ba2015-11-09 19:03:46 -080011977 *
11978 * This routine will update gateway parameters to WMA
11979 */
Jeff Johnsonc7309062018-11-09 20:59:42 -080011980QDF_STATUS sme_gateway_param_update(mac_handle_t mac_handle,
11981 struct gateway_param_update_req *gw_params)
Ravi Joshi9e891ba2015-11-09 19:03:46 -080011982{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011983 QDF_STATUS qdf_status;
Rajeev Kumar37d478b2017-04-17 16:59:28 -070011984 struct scheduler_msg message = {0};
Ravi Joshi9e891ba2015-11-09 19:03:46 -080011985 struct gateway_param_update_req *request_buf;
11986
Anurag Chouhan600c3a02016-03-01 10:33:54 +053011987 request_buf = qdf_mem_malloc(sizeof(*request_buf));
Arif Hussain0ef77082018-10-10 16:42:53 -070011988 if (!request_buf)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011989 return QDF_STATUS_E_NOMEM;
Ravi Joshi9e891ba2015-11-09 19:03:46 -080011990
11991 *request_buf = *gw_params;
11992
Rajeev Kumar8eaedf62017-01-21 11:03:13 -080011993 message.type = WMA_GW_PARAM_UPDATE_REQ;
11994 message.reserved = 0;
11995 message.bodyptr = request_buf;
gaurank kathpalia36b0c582018-08-28 17:45:43 +053011996 qdf_status = scheduler_post_message(QDF_MODULE_ID_SME,
11997 QDF_MODULE_ID_WMA,
11998 QDF_MODULE_ID_WMA, &message);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011999 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053012000 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053012001 "Not able to post WMA_GW_PARAM_UPDATE_REQ message to HAL");
Anurag Chouhan600c3a02016-03-01 10:33:54 +053012002 qdf_mem_free(request_buf);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012003 return QDF_STATUS_E_FAILURE;
Ravi Joshi9e891ba2015-11-09 19:03:46 -080012004 }
12005
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012006 return QDF_STATUS_SUCCESS;
Ravi Joshi9e891ba2015-11-09 19:03:46 -080012007}
12008#endif /* FEATURE_LFR_SUBNET_DETECTION */
12009
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012010/**
Archana Ramachandrana20ef812015-11-13 16:12:13 -080012011 * sme_soc_set_antenna_mode() - set antenna mode
Jeff Johnsonc7309062018-11-09 20:59:42 -080012012 * @mac_handle: Handle returned by macOpen
Archana Ramachandrana20ef812015-11-13 16:12:13 -080012013 * @msg: Structure containing the antenna mode parameters
12014 *
12015 * Send the command to CSR to send
12016 * WMI_SOC_SET_ANTENNA_MODE_CMDID to FW
12017 *
12018 * Return: QDF_STATUS
12019 */
Jeff Johnsonc7309062018-11-09 20:59:42 -080012020QDF_STATUS sme_soc_set_antenna_mode(mac_handle_t mac_handle,
12021 struct sir_antenna_mode_param *msg)
Archana Ramachandrana20ef812015-11-13 16:12:13 -080012022{
12023 QDF_STATUS status = QDF_STATUS_SUCCESS;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080012024 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Archana Ramachandrana20ef812015-11-13 16:12:13 -080012025 tSmeCmd *cmd;
12026
12027 if (NULL == msg) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070012028 sme_err("antenna mode mesg is NULL");
Archana Ramachandrana20ef812015-11-13 16:12:13 -080012029 return QDF_STATUS_E_FAILURE;
12030 }
12031
12032 status = sme_acquire_global_lock(&mac->sme);
12033 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070012034 sme_err("Failed to acquire lock");
Archana Ramachandrana20ef812015-11-13 16:12:13 -080012035 return QDF_STATUS_E_RESOURCES;
12036 }
12037
Krunal Soni78618d92017-02-14 21:46:31 -080012038 cmd = csr_get_command_buffer(mac);
Archana Ramachandrana20ef812015-11-13 16:12:13 -080012039 if (!cmd) {
12040 sme_release_global_lock(&mac->sme);
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070012041 sme_err("Get command buffer failed");
Archana Ramachandrana20ef812015-11-13 16:12:13 -080012042 return QDF_STATUS_E_NULL_VALUE;
12043 }
12044
12045 cmd->command = e_sme_command_set_antenna_mode;
12046 cmd->u.set_antenna_mode_cmd = *msg;
12047
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070012048 sme_debug("Antenna mode rx_chains: %d tx_chains: %d",
Archana Ramachandrana20ef812015-11-13 16:12:13 -080012049 cmd->u.set_antenna_mode_cmd.num_rx_chains,
12050 cmd->u.set_antenna_mode_cmd.num_tx_chains);
12051
12052 csr_queue_sme_command(mac, cmd, false);
12053 sme_release_global_lock(&mac->sme);
12054
12055 return QDF_STATUS_SUCCESS;
12056}
12057
12058/**
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012059 * sme_set_peer_authorized() - call peer authorized callback
12060 * @peer_addr: peer mac address
12061 * @auth_cb: auth callback
12062 * @vdev_id: vdev id
12063 *
Anurag Chouhanf04e84f2016-03-03 10:12:12 +053012064 * Return: QDF Status
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012065 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012066QDF_STATUS sme_set_peer_authorized(uint8_t *peer_addr,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012067 sme_peer_authorized_fp auth_cb,
12068 uint32_t vdev_id)
12069{
12070 void *wma_handle;
12071
Anurag Chouhan6d760662016-02-20 16:05:43 +053012072 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012073 if (!wma_handle) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053012074 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012075 "wma handle is NULL");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012076 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012077 }
12078
12079 wma_set_peer_authorized_cb(wma_handle, auth_cb);
12080 return wma_set_peer_param(wma_handle, peer_addr, WMI_PEER_AUTHORIZE,
12081 1, vdev_id);
12082}
12083
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012084/**
Jeff Johnson01f2c232018-11-21 19:17:44 -080012085 * sme_setdef_dot11mode() - Updates mac with default dot11mode
Jeff Johnsonc7309062018-11-09 20:59:42 -080012086 * @mac_handle: Global MAC pointer
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012087 *
12088 * Return: NULL.
12089 */
Jeff Johnsonc7309062018-11-09 20:59:42 -080012090void sme_setdef_dot11mode(mac_handle_t mac_handle)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012091{
Jeff Johnson0a8786a2018-12-02 10:49:01 -080012092 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053012093
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012094 csr_set_default_dot11_mode(mac_ctx);
12095}
12096
12097/**
Krishna Kumaar Natarajan052c6e62015-09-28 15:32:55 -070012098 * sme_update_tgt_services() - update the target services config.
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -080012099 * @mac_handle: Opaque handle to the global MAC context.
Krishna Kumaar Natarajan052c6e62015-09-28 15:32:55 -070012100 * @cfg: wma_tgt_services parameters.
12101 *
12102 * update the target services config.
12103 *
12104 * Return: None.
12105 */
Jeff Johnsonc7309062018-11-09 20:59:42 -080012106void sme_update_tgt_services(mac_handle_t mac_handle,
12107 struct wma_tgt_services *cfg)
Krishna Kumaar Natarajan052c6e62015-09-28 15:32:55 -070012108{
Jeff Johnson0a8786a2018-12-02 10:49:01 -080012109 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Krishna Kumaar Natarajan052c6e62015-09-28 15:32:55 -070012110
Liangwei Dong0da14262018-07-03 03:30:23 -040012111 mac_ctx->obss_scan_offload = cfg->obss_scan_offload;
12112 sme_debug("obss_scan_offload: %d", mac_ctx->obss_scan_offload);
Krunal Sonie6a1cda2017-09-27 15:23:02 -070012113 mac_ctx->lteCoexAntShare = cfg->lte_coex_ant_share;
Krishna Kumaar Natarajan052c6e62015-09-28 15:32:55 -070012114 mac_ctx->beacon_offload = cfg->beacon_offload;
mukul sharma72c8b222015-09-04 17:02:01 +053012115 mac_ctx->pmf_offload = cfg->pmf_offload;
Abhishek Singhe4a1f882017-08-10 17:59:44 +053012116 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
mukul sharma72c8b222015-09-04 17:02:01 +053012117 FL("mac_ctx->pmf_offload: %d"), mac_ctx->pmf_offload);
Vignesh Viswanathan731186f2017-09-18 13:47:37 +053012118 mac_ctx->is_fils_roaming_supported =
12119 cfg->is_fils_roaming_supported;
Vignesh Viswanathan694e28e2018-01-18 20:53:57 +053012120 mac_ctx->is_11k_offload_supported =
12121 cfg->is_11k_offload_supported;
12122 sme_debug("pmf_offload: %d fils_roam support %d 11k_offload %d",
12123 mac_ctx->pmf_offload, mac_ctx->is_fils_roaming_supported,
12124 mac_ctx->is_11k_offload_supported);
Arunk Khandavallica56d4b2018-11-29 15:46:00 +053012125 mac_ctx->bcn_reception_stats = cfg->bcn_reception_stats;
Krishna Kumaar Natarajan052c6e62015-09-28 15:32:55 -070012126}
Masti, Narayanraddic4a7ab82015-11-25 15:41:10 +053012127
Chandrasekaran, Manishekar2859de42016-02-11 16:17:38 +053012128/**
12129 * sme_is_session_id_valid() - Check if the session id is valid
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -080012130 * @mac_handle: Opaque handle to the global MAC context
Chandrasekaran, Manishekar2859de42016-02-11 16:17:38 +053012131 * @session_id: Session id
12132 *
12133 * Checks if the session id is valid or not
12134 *
12135 * Return: True is the session id is valid, false otherwise
12136 */
Jeff Johnsonc7309062018-11-09 20:59:42 -080012137bool sme_is_session_id_valid(mac_handle_t mac_handle, uint32_t session_id)
Chandrasekaran, Manishekar2859de42016-02-11 16:17:38 +053012138{
Jeff Johnson0a8786a2018-12-02 10:49:01 -080012139 struct mac_context *mac;
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053012140
Jeff Johnsonc7309062018-11-09 20:59:42 -080012141 if (NULL != mac_handle) {
Jeff Johnsona0619e42018-11-28 17:43:00 -080012142 mac = MAC_CONTEXT(mac_handle);
Pragaspathi Thilagarajb11dbe42018-07-23 16:42:17 +053012143 } else {
Chandrasekaran, Manishekard3cb4772016-02-22 22:21:10 +053012144 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
12145 "%s: null mac pointer", __func__);
Chandrasekaran, Manishekar2859de42016-02-11 16:17:38 +053012146 return false;
12147 }
12148
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053012149 if (CSR_IS_SESSION_VALID(mac, session_id))
Chandrasekaran, Manishekar2859de42016-02-11 16:17:38 +053012150 return true;
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053012151
12152 return false;
Chandrasekaran, Manishekar2859de42016-02-11 16:17:38 +053012153}
12154
Masti, Narayanraddic4a7ab82015-11-25 15:41:10 +053012155#ifdef FEATURE_WLAN_TDLS
12156
12157/**
12158 * sme_get_opclass() - determine operating class
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -080012159 * @mac_handle: Opaque handle to the global MAC context
Masti, Narayanraddic4a7ab82015-11-25 15:41:10 +053012160 * @channel: channel id
12161 * @bw_offset: bandwidth offset
12162 * @opclass: pointer to operating class
12163 *
12164 * Function will determine operating class from regdm_get_opclass_from_channel
12165 *
12166 * Return: none
12167 */
Jeff Johnsonc7309062018-11-09 20:59:42 -080012168void sme_get_opclass(mac_handle_t mac_handle, uint8_t channel,
12169 uint8_t bw_offset, uint8_t *opclass)
Masti, Narayanraddic4a7ab82015-11-25 15:41:10 +053012170{
Jeff Johnson0a8786a2018-12-02 10:49:01 -080012171 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Masti, Narayanraddic4a7ab82015-11-25 15:41:10 +053012172
12173 /* redgm opclass table contains opclass for 40MHz low primary,
12174 * 40MHz high primary and 20MHz. No support for 80MHz yet. So
12175 * first we will check if bit for 40MHz is set and if so find
12176 * matching opclass either with low primary or high primary
12177 * (a channel would never be in both) and then search for opclass
12178 * matching 20MHz, else for any BW.
12179 */
12180 if (bw_offset & (1 << BW_40_OFFSET_BIT)) {
Kiran Kumar Lokerea3de2262017-04-12 12:15:04 -070012181 *opclass = wlan_reg_dmn_get_opclass_from_channel(
Masti, Narayanraddic4a7ab82015-11-25 15:41:10 +053012182 mac_ctx->scan.countryCodeCurrent,
12183 channel, BW40_LOW_PRIMARY);
12184 if (!(*opclass)) {
Kiran Kumar Lokerea3de2262017-04-12 12:15:04 -070012185 *opclass = wlan_reg_dmn_get_opclass_from_channel(
Masti, Narayanraddic4a7ab82015-11-25 15:41:10 +053012186 mac_ctx->scan.countryCodeCurrent,
12187 channel, BW40_HIGH_PRIMARY);
12188 }
12189 } else if (bw_offset & (1 << BW_20_OFFSET_BIT)) {
Kiran Kumar Lokerea3de2262017-04-12 12:15:04 -070012190 *opclass = wlan_reg_dmn_get_opclass_from_channel(
Masti, Narayanraddic4a7ab82015-11-25 15:41:10 +053012191 mac_ctx->scan.countryCodeCurrent,
12192 channel, BW20);
12193 } else {
Kiran Kumar Lokerea3de2262017-04-12 12:15:04 -070012194 *opclass = wlan_reg_dmn_get_opclass_from_channel(
Masti, Narayanraddic4a7ab82015-11-25 15:41:10 +053012195 mac_ctx->scan.countryCodeCurrent,
12196 channel, BWALL);
12197 }
12198}
12199#endif
Ryan Hsu3c8f79f2015-12-02 16:45:09 -080012200
Sandeep Puligillae0875662016-02-12 16:09:21 -080012201/**
Anurag Chouhanbf5e0e22016-09-12 12:54:09 +053012202 * sme_set_fw_test() - set fw test
12203 * @fw_test: fw test param
12204 *
12205 * Return: Return QDF_STATUS, otherwise appropriate failure code
12206 */
12207QDF_STATUS sme_set_fw_test(struct set_fwtest_params *fw_test)
12208{
12209 void *wma_handle;
12210
12211 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
12212 if (!wma_handle) {
12213 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
12214 "wma handle is NULL");
12215 return QDF_STATUS_E_FAILURE;
12216 }
12217 wma_process_fw_test_cmd(wma_handle, fw_test);
12218 return QDF_STATUS_SUCCESS;
12219}
12220
12221/**
Sandeep Puligillae0875662016-02-12 16:09:21 -080012222 * sme_ht40_stop_obss_scan() - ht40 obss stop scan
Jeff Johnsonc7309062018-11-09 20:59:42 -080012223 * @mac_handle: mac handel
Sandeep Puligillae0875662016-02-12 16:09:21 -080012224 * @vdev_id: vdev identifier
12225 *
12226 * Return: Return QDF_STATUS, otherwise appropriate failure code
12227 */
Jeff Johnsonc7309062018-11-09 20:59:42 -080012228QDF_STATUS sme_ht40_stop_obss_scan(mac_handle_t mac_handle, uint32_t vdev_id)
Sandeep Puligillae0875662016-02-12 16:09:21 -080012229{
12230 void *wma_handle;
12231
12232 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
12233 if (!wma_handle) {
12234 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
12235 "wma handle is NULL");
12236 return QDF_STATUS_E_FAILURE;
12237 }
12238 wma_ht40_stop_obss_scan(wma_handle, vdev_id);
12239 return QDF_STATUS_SUCCESS;
12240}
Archana Ramachandran20d2e232016-02-11 16:58:40 -080012241
12242/**
12243 * sme_update_mimo_power_save() - Update MIMO power save
12244 * configuration
Jeff Johnsonc7309062018-11-09 20:59:42 -080012245 * @mac_handle: The handle returned by macOpen
Archana Ramachandran20d2e232016-02-11 16:58:40 -080012246 * @is_ht_smps_enabled: enable/disable ht smps
12247 * @ht_smps_mode: smps mode disabled/static/dynamic
Archana Ramachandranfec24812016-02-16 16:31:56 -080012248 * @send_smps_action: flag to send smps force mode command
12249 * to FW
Archana Ramachandran20d2e232016-02-11 16:58:40 -080012250 *
12251 * Return: QDF_STATUS if SME update mimo power save
Jeff Johnson698eacd2018-05-12 17:00:03 -070012252 * configuration success else failure status
Archana Ramachandran20d2e232016-02-11 16:58:40 -080012253 */
Jeff Johnsonc7309062018-11-09 20:59:42 -080012254QDF_STATUS sme_update_mimo_power_save(mac_handle_t mac_handle,
Archana Ramachandran20d2e232016-02-11 16:58:40 -080012255 uint8_t is_ht_smps_enabled,
Archana Ramachandranfec24812016-02-16 16:31:56 -080012256 uint8_t ht_smps_mode,
12257 bool send_smps_action)
Archana Ramachandran20d2e232016-02-11 16:58:40 -080012258{
Jeff Johnson0a8786a2018-12-02 10:49:01 -080012259 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Archana Ramachandranfec24812016-02-16 16:31:56 -080012260
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070012261 sme_debug("SMPS enable: %d mode: %d send action: %d",
Archana Ramachandranfec24812016-02-16 16:31:56 -080012262 is_ht_smps_enabled, ht_smps_mode,
12263 send_smps_action);
Vignesh Viswanathanddc89e52018-11-02 18:43:42 +053012264 mac_ctx->mlme_cfg->ht_caps.enable_smps =
Archana Ramachandran20d2e232016-02-11 16:58:40 -080012265 is_ht_smps_enabled;
Vignesh Viswanathanddc89e52018-11-02 18:43:42 +053012266 mac_ctx->mlme_cfg->ht_caps.smps = ht_smps_mode;
Archana Ramachandranfec24812016-02-16 16:31:56 -080012267 mac_ctx->roam.configParam.send_smps_action =
12268 send_smps_action;
Archana Ramachandran20d2e232016-02-11 16:58:40 -080012269
12270 return QDF_STATUS_SUCCESS;
12271}
12272
12273/**
Gupta, Kapil4cb1d7d2016-04-16 18:16:25 -070012274 * sme_add_beacon_filter() - set the beacon filter configuration
Jeff Johnsonc7309062018-11-09 20:59:42 -080012275 * @mac_handle: The handle returned by macOpen
Gupta, Kapil4cb1d7d2016-04-16 18:16:25 -070012276 * @session_id: session id
12277 * @ie_map: bitwise array of IEs
12278 *
12279 * Return: Return QDF_STATUS, otherwise appropriate failure code
12280 */
Jeff Johnsonc7309062018-11-09 20:59:42 -080012281QDF_STATUS sme_add_beacon_filter(mac_handle_t mac_handle,
Gupta, Kapil4cb1d7d2016-04-16 18:16:25 -070012282 uint32_t session_id,
12283 uint32_t *ie_map)
12284{
Rajeev Kumar37d478b2017-04-17 16:59:28 -070012285 struct scheduler_msg message = {0};
Gupta, Kapil4cb1d7d2016-04-16 18:16:25 -070012286 QDF_STATUS qdf_status;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080012287 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Gupta, Kapil4cb1d7d2016-04-16 18:16:25 -070012288 struct beacon_filter_param *filter_param;
12289
12290 if (!CSR_IS_SESSION_VALID(mac_ctx, session_id)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070012291 sme_err("CSR session not valid: %d", session_id);
Gupta, Kapil4cb1d7d2016-04-16 18:16:25 -070012292 return QDF_STATUS_E_FAILURE;
12293 }
12294
12295 filter_param = qdf_mem_malloc(sizeof(*filter_param));
Arif Hussain0ef77082018-10-10 16:42:53 -070012296 if (!filter_param)
Gupta, Kapil4cb1d7d2016-04-16 18:16:25 -070012297 return QDF_STATUS_E_FAILURE;
Gupta, Kapil4cb1d7d2016-04-16 18:16:25 -070012298
12299 filter_param->vdev_id = session_id;
12300
12301 qdf_mem_copy(filter_param->ie_map, ie_map,
12302 BCN_FLT_MAX_ELEMS_IE_LIST * sizeof(uint32_t));
12303
12304 message.type = WMA_ADD_BCN_FILTER_CMDID;
12305 message.bodyptr = filter_param;
gaurank kathpalia36b0c582018-08-28 17:45:43 +053012306 qdf_status = scheduler_post_message(QDF_MODULE_ID_SME,
12307 QDF_MODULE_ID_WMA,
12308 QDF_MODULE_ID_WMA,
12309 &message);
Gupta, Kapil4cb1d7d2016-04-16 18:16:25 -070012310 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
12311 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
12312 "%s: Not able to post msg to WDA!",
12313 __func__);
12314
12315 qdf_mem_free(filter_param);
12316 }
12317 return qdf_status;
12318}
12319
12320/**
12321 * sme_remove_beacon_filter() - set the beacon filter configuration
Jeff Johnsonc7309062018-11-09 20:59:42 -080012322 * @mac_handle: The handle returned by macOpen
Gupta, Kapil4cb1d7d2016-04-16 18:16:25 -070012323 * @session_id: session id
12324 *
12325 * Return: Return QDF_STATUS, otherwise appropriate failure code
12326 */
Jeff Johnsonc7309062018-11-09 20:59:42 -080012327QDF_STATUS sme_remove_beacon_filter(mac_handle_t mac_handle,
12328 uint32_t session_id)
Gupta, Kapil4cb1d7d2016-04-16 18:16:25 -070012329{
Rajeev Kumar37d478b2017-04-17 16:59:28 -070012330 struct scheduler_msg message = {0};
Gupta, Kapil4cb1d7d2016-04-16 18:16:25 -070012331 QDF_STATUS qdf_status;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080012332 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Gupta, Kapil4cb1d7d2016-04-16 18:16:25 -070012333 struct beacon_filter_param *filter_param;
12334
12335 if (!CSR_IS_SESSION_VALID(mac_ctx, session_id)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070012336 sme_err("CSR session not valid: %d", session_id);
Gupta, Kapil4cb1d7d2016-04-16 18:16:25 -070012337 return QDF_STATUS_E_FAILURE;
12338 }
12339
12340 filter_param = qdf_mem_malloc(sizeof(*filter_param));
Arif Hussain0ef77082018-10-10 16:42:53 -070012341 if (!filter_param)
Gupta, Kapil4cb1d7d2016-04-16 18:16:25 -070012342 return QDF_STATUS_E_FAILURE;
Gupta, Kapil4cb1d7d2016-04-16 18:16:25 -070012343
12344 filter_param->vdev_id = session_id;
12345
12346 message.type = WMA_REMOVE_BCN_FILTER_CMDID;
12347 message.bodyptr = filter_param;
gaurank kathpalia36b0c582018-08-28 17:45:43 +053012348 qdf_status = scheduler_post_message(QDF_MODULE_ID_SME,
12349 QDF_MODULE_ID_WMA,
12350 QDF_MODULE_ID_WMA,
12351 &message);
Gupta, Kapil4cb1d7d2016-04-16 18:16:25 -070012352 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
12353 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
12354 "%s: Not able to post msg to WDA!",
12355 __func__);
12356
12357 qdf_mem_free(filter_param);
12358 }
12359 return qdf_status;
12360}
Arun Khandavalli2476ef52016-04-26 20:19:43 +053012361
Arun Khandavalli2476ef52016-04-26 20:19:43 +053012362/**
Kondabattini, Ganesh3f2d02c2016-09-13 12:23:47 +053012363 * sme_send_disassoc_req_frame - send disassoc req
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -080012364 * @mac_handle: Opaque handle to the global MAC context
Kondabattini, Ganesh3f2d02c2016-09-13 12:23:47 +053012365 * @session_id: session id
12366 * @peer_mac: peer mac address
12367 * @reason: reason for disassociation
12368 * wait_for_ack: wait for acknowledgment
12369 *
12370 * function to send disassoc request to lim
12371 *
12372 * return: none
12373 */
Jeff Johnsonc7309062018-11-09 20:59:42 -080012374void sme_send_disassoc_req_frame(mac_handle_t mac_handle, uint8_t session_id,
12375 uint8_t *peer_mac, uint16_t reason,
12376 uint8_t wait_for_ack)
Kondabattini, Ganesh3f2d02c2016-09-13 12:23:47 +053012377{
12378 struct sme_send_disassoc_frm_req *msg;
12379 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
12380 A_UINT8 *buf;
12381 A_UINT16 tmp;
12382
12383 msg = qdf_mem_malloc(sizeof(struct sme_send_disassoc_frm_req));
Arif Hussain0ef77082018-10-10 16:42:53 -070012384 if (!msg)
Kondabattini, Ganesh3f2d02c2016-09-13 12:23:47 +053012385 return;
12386
Kondabattini, Ganesh3f2d02c2016-09-13 12:23:47 +053012387 msg->msg_type = (uint16_t) eWNI_SME_SEND_DISASSOC_FRAME;
12388
12389 msg->length = (uint16_t) sizeof(struct sme_send_disassoc_frm_req);
12390
12391 buf = &msg->session_id;
12392
12393 /* session id */
12394 *buf = (A_UINT8) session_id;
12395 buf += sizeof(A_UINT8);
12396
12397 /* transaction id */
12398 *buf = 0;
12399 *(buf + 1) = 0;
12400 buf += sizeof(A_UINT16);
12401
12402 /* Set the peer MAC address before sending the message to LIM */
12403 qdf_mem_copy(buf, peer_mac, QDF_MAC_ADDR_SIZE);
12404
12405 buf += QDF_MAC_ADDR_SIZE;
12406
12407 /* reasoncode */
12408 tmp = (uint16_t) reason;
12409 qdf_mem_copy(buf, &tmp, sizeof(uint16_t));
12410 buf += sizeof(uint16_t);
12411
12412 *buf = wait_for_ack;
12413 buf += sizeof(uint8_t);
12414
Rajeev Kumard138ac52017-01-30 18:38:37 -080012415 qdf_status = umac_send_mb_message_to_mac(msg);
Kondabattini, Ganesh3f2d02c2016-09-13 12:23:47 +053012416
12417 if (qdf_status != QDF_STATUS_SUCCESS)
12418 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
12419 FL("cds_send_mb_message Failed"));
12420}
12421
Nachiket Kukade177b5b02018-05-22 20:52:17 +053012422#ifdef FEATURE_WLAN_APF
Jeff Johnsonc7309062018-11-09 20:59:42 -080012423QDF_STATUS sme_get_apf_capabilities(mac_handle_t mac_handle,
Nachiket Kukade177b5b02018-05-22 20:52:17 +053012424 apf_get_offload_cb callback,
12425 void *context)
Arun Khandavalli2476ef52016-04-26 20:19:43 +053012426{
12427 QDF_STATUS status = QDF_STATUS_SUCCESS;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080012428 struct mac_context * mac_ctx = MAC_CONTEXT(mac_handle);
Rajeev Kumar37d478b2017-04-17 16:59:28 -070012429 struct scheduler_msg cds_msg = {0};
Arun Khandavalli2476ef52016-04-26 20:19:43 +053012430
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070012431 SME_ENTER();
Arun Khandavalli2476ef52016-04-26 20:19:43 +053012432
12433 status = sme_acquire_global_lock(&mac_ctx->sme);
12434 if (QDF_STATUS_SUCCESS == status) {
12435 /* Serialize the req through MC thread */
Nachiket Kukadee547a482018-05-22 16:43:30 +053012436 mac_ctx->sme.apf_get_offload_cb = callback;
12437 mac_ctx->sme.apf_get_offload_context = context;
Arun Khandavalli2476ef52016-04-26 20:19:43 +053012438 cds_msg.bodyptr = NULL;
Nachiket Kukadee547a482018-05-22 16:43:30 +053012439 cds_msg.type = WDA_APF_GET_CAPABILITIES_REQ;
gaurank kathpalia36b0c582018-08-28 17:45:43 +053012440 status = scheduler_post_message(QDF_MODULE_ID_SME,
12441 QDF_MODULE_ID_WMA,
12442 QDF_MODULE_ID_WMA, &cds_msg);
Arun Khandavalli2476ef52016-04-26 20:19:43 +053012443 if (!QDF_IS_STATUS_SUCCESS(status)) {
12444 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Nachiket Kukadee547a482018-05-22 16:43:30 +053012445 FL("Post apf get offload msg fail"));
Arun Khandavalli2476ef52016-04-26 20:19:43 +053012446 status = QDF_STATUS_E_FAILURE;
12447 }
12448 sme_release_global_lock(&mac_ctx->sme);
Arun Khandavalli2476ef52016-04-26 20:19:43 +053012449 }
Madhvapathi Sriram3e6627a2018-12-19 12:54:49 +053012450
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070012451 SME_EXIT();
Arun Khandavalli2476ef52016-04-26 20:19:43 +053012452 return status;
12453}
12454
Jeff Johnsonc7309062018-11-09 20:59:42 -080012455QDF_STATUS sme_set_apf_instructions(mac_handle_t mac_handle,
Nachiket Kukadee547a482018-05-22 16:43:30 +053012456 struct sir_apf_set_offload *req)
Arun Khandavalli2476ef52016-04-26 20:19:43 +053012457{
Nachiket Kukade4f686582018-11-19 19:18:27 +053012458 void *wma_handle;
Arun Khandavalli2476ef52016-04-26 20:19:43 +053012459
Nachiket Kukade4f686582018-11-19 19:18:27 +053012460 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
12461 if (!wma_handle) {
Arun Khandavalli2476ef52016-04-26 20:19:43 +053012462 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Nachiket Kukade4f686582018-11-19 19:18:27 +053012463 "wma handle is NULL");
12464 return QDF_STATUS_E_FAILURE;
Arun Khandavalli2476ef52016-04-26 20:19:43 +053012465 }
Nachiket Kukade4f686582018-11-19 19:18:27 +053012466
12467 return wma_set_apf_instructions(wma_handle, req);
Arun Khandavalli2476ef52016-04-26 20:19:43 +053012468}
12469
Jeff Johnsonc7309062018-11-09 20:59:42 -080012470QDF_STATUS sme_set_apf_enable_disable(mac_handle_t mac_handle, uint8_t vdev_id,
Nachiket Kukade177b5b02018-05-22 20:52:17 +053012471 bool apf_enable)
12472{
12473 void *wma_handle;
12474
12475 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
12476 if (!wma_handle) {
12477 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
12478 "wma handle is NULL");
12479 return QDF_STATUS_E_FAILURE;
12480 }
12481
12482 return wma_send_apf_enable_cmd(wma_handle, vdev_id, apf_enable);
12483}
12484
12485QDF_STATUS
Jeff Johnsonc7309062018-11-09 20:59:42 -080012486sme_apf_write_work_memory(mac_handle_t mac_handle,
Nachiket Kukade177b5b02018-05-22 20:52:17 +053012487 struct wmi_apf_write_memory_params *write_params)
12488{
12489 void *wma_handle;
12490
12491 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
12492 if (!wma_handle) {
12493 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
12494 "wma handle is NULL");
12495 return QDF_STATUS_E_FAILURE;
12496 }
12497
12498 return wma_send_apf_write_work_memory_cmd(wma_handle, write_params);
12499}
12500
12501QDF_STATUS
Jeff Johnsonc7309062018-11-09 20:59:42 -080012502sme_apf_read_work_memory(mac_handle_t mac_handle,
Nachiket Kukade177b5b02018-05-22 20:52:17 +053012503 struct wmi_apf_read_memory_params *read_params,
12504 apf_read_mem_cb callback)
12505{
12506 QDF_STATUS status = QDF_STATUS_SUCCESS;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080012507 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Nachiket Kukade177b5b02018-05-22 20:52:17 +053012508 void *wma_handle;
12509
12510 status = sme_acquire_global_lock(&mac->sme);
12511 if (QDF_IS_STATUS_SUCCESS(status)) {
12512 mac->sme.apf_read_mem_cb = callback;
12513 sme_release_global_lock(&mac->sme);
12514 } else {
12515 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
12516 FL("sme_acquire_global_lock failed"));
12517 }
12518
12519 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
12520 if (!wma_handle) {
12521 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
12522 "wma handle is NULL");
12523 return QDF_STATUS_E_FAILURE;
12524 }
12525
12526 return wma_send_apf_read_work_memory_cmd(wma_handle, read_params);
12527}
12528#endif /* FEATURE_WLAN_APF */
12529
Arun Khandavalli2476ef52016-04-26 20:19:43 +053012530/**
Abhishek Singh1c676222016-05-09 14:20:28 +053012531 * sme_get_wni_dot11_mode() - return configured wni dot11mode
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -080012532 * @mac_handle: Opaque handle to the global MAC context
Abhishek Singh1c676222016-05-09 14:20:28 +053012533 *
12534 * Return: wni dot11 mode.
12535 */
Jeff Johnsonc7309062018-11-09 20:59:42 -080012536uint32_t sme_get_wni_dot11_mode(mac_handle_t mac_handle)
Abhishek Singh1c676222016-05-09 14:20:28 +053012537{
Jeff Johnson0a8786a2018-12-02 10:49:01 -080012538 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Abhishek Singh1c676222016-05-09 14:20:28 +053012539
12540 return csr_translate_to_wni_cfg_dot11_mode(mac_ctx,
12541 mac_ctx->roam.configParam.uCfgDot11Mode);
12542}
12543
12544/**
Manjunathappa Prakash59f861d2016-04-21 10:33:31 -070012545 * sme_create_mon_session() - post message to create PE session for monitormode
12546 * operation
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -080012547 * @mac_handle: Opaque handle to the global MAC context
Manjunathappa Prakash59f861d2016-04-21 10:33:31 -070012548 * @bssid: pointer to bssid
Rajeev Kumar Sirasanagandlae3b59912018-08-24 15:53:31 +053012549 * @vdev_id: sme session id
Manjunathappa Prakash59f861d2016-04-21 10:33:31 -070012550 *
12551 * Return: QDF_STATUS_SUCCESS on success, non-zero error code on failure.
12552 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -080012553QDF_STATUS sme_create_mon_session(mac_handle_t mac_handle, tSirMacAddr bss_id,
Rajeev Kumar Sirasanagandlae3b59912018-08-24 15:53:31 +053012554 uint8_t vdev_id)
Manjunathappa Prakash59f861d2016-04-21 10:33:31 -070012555{
12556 QDF_STATUS status = QDF_STATUS_E_FAILURE;
12557 struct sir_create_session *msg;
12558
12559 msg = qdf_mem_malloc(sizeof(*msg));
chenguo92af4bf2018-10-25 13:54:58 +080012560 if (msg) {
Manjunathappa Prakash59f861d2016-04-21 10:33:31 -070012561 msg->type = eWNI_SME_MON_INIT_SESSION;
Rajeev Kumar Sirasanagandlae3b59912018-08-24 15:53:31 +053012562 msg->vdev_id = vdev_id;
Manjunathappa Prakash59f861d2016-04-21 10:33:31 -070012563 msg->msg_len = sizeof(*msg);
12564 qdf_mem_copy(msg->bss_id.bytes, bss_id, QDF_MAC_ADDR_SIZE);
Rajeev Kumard138ac52017-01-30 18:38:37 -080012565 status = umac_send_mb_message_to_mac(msg);
Manjunathappa Prakash59f861d2016-04-21 10:33:31 -070012566 }
12567 return status;
12568}
Gupta, Kapil96c7f2f2016-04-25 19:13:41 +053012569
Jeff Johnsonb460dd72018-11-08 10:26:51 -080012570void sme_set_chan_info_callback(mac_handle_t mac_handle,
Kapil Gupta4f0c0c12017-02-07 15:21:15 +053012571 void (*callback)(struct scan_chan_info *chan_info))
12572{
Jeff Johnson0a8786a2018-12-02 10:49:01 -080012573 struct mac_context *mac;
Kapil Gupta4f0c0c12017-02-07 15:21:15 +053012574
Jeff Johnsonb460dd72018-11-08 10:26:51 -080012575 if (mac_handle == NULL) {
Kapil Gupta4f0c0c12017-02-07 15:21:15 +053012576 QDF_ASSERT(0);
12577 return;
12578 }
Jeff Johnsona0619e42018-11-28 17:43:00 -080012579 mac = MAC_CONTEXT(mac_handle);
Kapil Gupta4f0c0c12017-02-07 15:21:15 +053012580 mac->chan_info_cb = callback;
12581}
12582
Gupta, Kapil96c7f2f2016-04-25 19:13:41 +053012583/**
Naveen Rawata410c5a2016-09-19 14:22:33 -070012584 * sme_set_vdev_ies_per_band() - sends the per band IEs to vdev
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -080012585 * @mac_handle: Opaque handle to the global MAC context
Naveen Rawata410c5a2016-09-19 14:22:33 -070012586 * @vdev_id: vdev_id for which IE is targeted
12587 *
12588 * Return: None
12589 */
Jeff Johnsonc7309062018-11-09 20:59:42 -080012590void sme_set_vdev_ies_per_band(mac_handle_t mac_handle, uint8_t vdev_id)
Naveen Rawata410c5a2016-09-19 14:22:33 -070012591{
Naveen Rawata410c5a2016-09-19 14:22:33 -070012592 struct sir_set_vdev_ies_per_band *p_msg;
12593 QDF_STATUS status = QDF_STATUS_E_FAILURE;
12594
12595 p_msg = qdf_mem_malloc(sizeof(*p_msg));
Arif Hussain0ef77082018-10-10 16:42:53 -070012596 if (!p_msg)
Naveen Rawata410c5a2016-09-19 14:22:33 -070012597 return;
Naveen Rawata410c5a2016-09-19 14:22:33 -070012598
12599 p_msg->vdev_id = vdev_id;
12600 p_msg->msg_type = eWNI_SME_SET_VDEV_IES_PER_BAND;
12601 p_msg->len = sizeof(*p_msg);
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070012602 sme_debug("sending eWNI_SME_SET_VDEV_IES_PER_BAND: vdev_id: %d",
Naveen Rawata410c5a2016-09-19 14:22:33 -070012603 vdev_id);
Rajeev Kumard138ac52017-01-30 18:38:37 -080012604 status = umac_send_mb_message_to_mac(p_msg);
Naveen Rawata410c5a2016-09-19 14:22:33 -070012605 if (QDF_STATUS_SUCCESS != status)
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070012606 sme_err("Send eWNI_SME_SET_VDEV_IES_PER_BAND fail");
Naveen Rawata410c5a2016-09-19 14:22:33 -070012607}
12608
Kiran Kumar Lokere666bf852016-05-02 12:23:02 -070012609/**
12610 * sme_set_pdev_ht_vht_ies() - sends the set pdev IE req
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -080012611 * @mac_handle: Opaque handle to the global MAC context
Kiran Kumar Lokere666bf852016-05-02 12:23:02 -070012612 * @enable2x2: 1x1 or 2x2 mode.
12613 *
12614 * Sends the set pdev IE req with Nss value.
12615 *
12616 * Return: None
12617 */
Jeff Johnsonc7309062018-11-09 20:59:42 -080012618void sme_set_pdev_ht_vht_ies(mac_handle_t mac_handle, bool enable2x2)
Kiran Kumar Lokere666bf852016-05-02 12:23:02 -070012619{
Jeff Johnson0a8786a2018-12-02 10:49:01 -080012620 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Kiran Kumar Lokere666bf852016-05-02 12:23:02 -070012621 struct sir_set_ht_vht_cfg *ht_vht_cfg;
12622 QDF_STATUS status = QDF_STATUS_E_FAILURE;
12623
Kiran Kumar Lokere666bf852016-05-02 12:23:02 -070012624 if (!((mac_ctx->roam.configParam.uCfgDot11Mode ==
12625 eCSR_CFG_DOT11_MODE_AUTO) ||
12626 (mac_ctx->roam.configParam.uCfgDot11Mode ==
12627 eCSR_CFG_DOT11_MODE_11N) ||
12628 (mac_ctx->roam.configParam.uCfgDot11Mode ==
12629 eCSR_CFG_DOT11_MODE_11N_ONLY) ||
12630 (mac_ctx->roam.configParam.uCfgDot11Mode ==
12631 eCSR_CFG_DOT11_MODE_11AC) ||
12632 (mac_ctx->roam.configParam.uCfgDot11Mode ==
12633 eCSR_CFG_DOT11_MODE_11AC_ONLY)))
12634 return;
12635
12636 status = sme_acquire_global_lock(&mac_ctx->sme);
12637 if (QDF_STATUS_SUCCESS == status) {
12638 ht_vht_cfg = qdf_mem_malloc(sizeof(*ht_vht_cfg));
Arif Hussain0ef77082018-10-10 16:42:53 -070012639 if (!ht_vht_cfg) {
Kiran Kumar Lokere666bf852016-05-02 12:23:02 -070012640 sme_release_global_lock(&mac_ctx->sme);
12641 return;
12642 }
12643
12644 ht_vht_cfg->pdev_id = 0;
12645 if (enable2x2)
12646 ht_vht_cfg->nss = 2;
12647 else
12648 ht_vht_cfg->nss = 1;
12649 ht_vht_cfg->dot11mode =
12650 (uint8_t)csr_translate_to_wni_cfg_dot11_mode(mac_ctx,
12651 mac_ctx->roam.configParam.uCfgDot11Mode);
12652
12653 ht_vht_cfg->msg_type = eWNI_SME_PDEV_SET_HT_VHT_IE;
12654 ht_vht_cfg->len = sizeof(*ht_vht_cfg);
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070012655 sme_debug("SET_HT_VHT_IE with nss: %d, dot11mode: %d",
12656 ht_vht_cfg->nss,
12657 ht_vht_cfg->dot11mode);
Rajeev Kumard138ac52017-01-30 18:38:37 -080012658 status = umac_send_mb_message_to_mac(ht_vht_cfg);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053012659 if (QDF_STATUS_SUCCESS != status)
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070012660 sme_err("Send SME_PDEV_SET_HT_VHT_IE fail");
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053012661
Kiran Kumar Lokere666bf852016-05-02 12:23:02 -070012662 sme_release_global_lock(&mac_ctx->sme);
12663 }
Kiran Kumar Lokere666bf852016-05-02 12:23:02 -070012664}
12665
Jeff Johnsonc7309062018-11-09 20:59:42 -080012666void sme_update_vdev_type_nss(mac_handle_t mac_handle, uint8_t max_supp_nss,
gaurank kathpalia651abcd2018-11-12 22:41:23 +053012667 enum nss_chains_band_info band)
Kiran Kumar Lokere666bf852016-05-02 12:23:02 -070012668{
Jeff Johnson0a8786a2018-12-02 10:49:01 -080012669 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Kiran Kumar Lokere666bf852016-05-02 12:23:02 -070012670 struct vdev_type_nss *vdev_nss;
12671
gaurank kathpalia651abcd2018-11-12 22:41:23 +053012672 struct wlan_mlme_nss_chains *nss_chains_ini_cfg =
12673 &mac_ctx->mlme_cfg->nss_chains_ini_cfg;
12674
12675 if (band == NSS_CHAINS_BAND_5GHZ)
Kiran Kumar Lokere666bf852016-05-02 12:23:02 -070012676 vdev_nss = &mac_ctx->vdev_type_nss_5g;
12677 else
12678 vdev_nss = &mac_ctx->vdev_type_nss_2g;
12679
gaurank kathpalia651abcd2018-11-12 22:41:23 +053012680 vdev_nss->sta = QDF_MIN(max_supp_nss, GET_VDEV_NSS_CHAIN(
12681 nss_chains_ini_cfg->
gaurank kathpalia42911082019-01-22 17:39:49 +053012682 rx_nss[band],
gaurank kathpalia651abcd2018-11-12 22:41:23 +053012683 STA_NSS_CHAINS_SHIFT));
12684 vdev_nss->sap = QDF_MIN(max_supp_nss, GET_VDEV_NSS_CHAIN(
12685 nss_chains_ini_cfg->
gaurank kathpalia42911082019-01-22 17:39:49 +053012686 rx_nss[band],
gaurank kathpalia651abcd2018-11-12 22:41:23 +053012687 SAP_NSS_CHAINS_SHIFT));
12688 vdev_nss->p2p_go = QDF_MIN(max_supp_nss, GET_VDEV_NSS_CHAIN(
12689 nss_chains_ini_cfg->
gaurank kathpalia42911082019-01-22 17:39:49 +053012690 rx_nss[band],
gaurank kathpalia651abcd2018-11-12 22:41:23 +053012691 P2P_GO_NSS_CHAINS_SHIFT));
12692 vdev_nss->p2p_cli = QDF_MIN(max_supp_nss, GET_VDEV_NSS_CHAIN(
12693 nss_chains_ini_cfg->
gaurank kathpalia42911082019-01-22 17:39:49 +053012694 rx_nss[band],
gaurank kathpalia651abcd2018-11-12 22:41:23 +053012695 P2P_CLI_CHAINS_SHIFT));
12696 vdev_nss->p2p_dev = QDF_MIN(max_supp_nss, GET_VDEV_NSS_CHAIN(
12697 nss_chains_ini_cfg->
gaurank kathpalia42911082019-01-22 17:39:49 +053012698 rx_nss[band],
gaurank kathpalia651abcd2018-11-12 22:41:23 +053012699 P2P_DEV_NSS_CHAINS_SHIFT));
12700 vdev_nss->ibss = QDF_MIN(max_supp_nss, GET_VDEV_NSS_CHAIN(
12701 nss_chains_ini_cfg->
gaurank kathpalia42911082019-01-22 17:39:49 +053012702 rx_nss[band],
gaurank kathpalia651abcd2018-11-12 22:41:23 +053012703 IBSS_NSS_CHAINS_SHIFT));
12704 vdev_nss->tdls = QDF_MIN(max_supp_nss, GET_VDEV_NSS_CHAIN(
12705 nss_chains_ini_cfg->
gaurank kathpalia42911082019-01-22 17:39:49 +053012706 rx_nss[band],
gaurank kathpalia651abcd2018-11-12 22:41:23 +053012707 TDLS_NSS_CHAINS_SHIFT));
12708 vdev_nss->ocb = QDF_MIN(max_supp_nss, GET_VDEV_NSS_CHAIN(
12709 nss_chains_ini_cfg->
gaurank kathpalia42911082019-01-22 17:39:49 +053012710 rx_nss[band],
gaurank kathpalia651abcd2018-11-12 22:41:23 +053012711 OCB_NSS_CHAINS_SHIFT));
Nachiket Kukadecf941602018-12-12 14:32:35 +053012712 vdev_nss->nan = QDF_MIN(max_supp_nss, GET_VDEV_NSS_CHAIN(
12713 nss_chains_ini_cfg->
gaurank kathpalia42911082019-01-22 17:39:49 +053012714 rx_nss[band],
Nachiket Kukadecf941602018-12-12 14:32:35 +053012715 NAN_NSS_CHAIN_SHIFT));
Kiran Kumar Lokere666bf852016-05-02 12:23:02 -070012716
Nachiket Kukadecf941602018-12-12 14:32:35 +053012717 sme_debug("band %d NSS:sta %d sap %d cli %d go %d dev %d ibss %d tdls %d ocb %d nan %d",
12718 band, vdev_nss->sta, vdev_nss->sap, vdev_nss->p2p_cli,
12719 vdev_nss->p2p_go, vdev_nss->p2p_dev, vdev_nss->ibss,
12720 vdev_nss->tdls, vdev_nss->ocb, vdev_nss->nan);
Kiran Kumar Lokere666bf852016-05-02 12:23:02 -070012721}
Peng Xu8fdaa492016-06-22 10:20:47 -070012722
Kiran Kumar Lokeree6476b22017-10-16 23:40:32 -070012723#ifdef WLAN_FEATURE_11AX_BSS_COLOR
12724#define MAX_BSS_COLOR_VAL 63
12725#define MIN_BSS_COLOR_VAL 1
12726
Jeff Johnsonc7309062018-11-09 20:59:42 -080012727QDF_STATUS sme_set_he_bss_color(mac_handle_t mac_handle, uint8_t session_id,
12728 uint8_t bss_color)
Kiran Kumar Lokeree6476b22017-10-16 23:40:32 -070012729
12730{
12731 struct sir_set_he_bss_color *bss_color_msg;
12732 uint8_t len;
12733
Jeff Johnsonc7309062018-11-09 20:59:42 -080012734 if (!mac_handle) {
12735 sme_err("Invalid mac_handle pointer");
Kiran Kumar Lokeree6476b22017-10-16 23:40:32 -070012736 return QDF_STATUS_E_FAULT;
12737 }
12738
12739 sme_debug("Set HE bss_color %d", bss_color);
12740
12741 if (bss_color < MIN_BSS_COLOR_VAL || bss_color > MAX_BSS_COLOR_VAL) {
12742 sme_debug("Invalid HE bss_color %d", bss_color);
12743 return QDF_STATUS_E_INVAL;
12744 }
12745 len = sizeof(*bss_color_msg);
12746 bss_color_msg = qdf_mem_malloc(len);
Arif Hussain0ef77082018-10-10 16:42:53 -070012747 if (!bss_color_msg)
Kiran Kumar Lokeree6476b22017-10-16 23:40:32 -070012748 return QDF_STATUS_E_NOMEM;
Arif Hussain0ef77082018-10-10 16:42:53 -070012749
Kiran Kumar Lokeree6476b22017-10-16 23:40:32 -070012750 bss_color_msg->message_type = eWNI_SME_SET_HE_BSS_COLOR;
12751 bss_color_msg->length = len;
12752 bss_color_msg->session_id = session_id;
12753 bss_color_msg->bss_color = bss_color;
12754 return umac_send_mb_message_to_mac(bss_color_msg);
12755}
12756#endif
12757
Peng Xu8fdaa492016-06-22 10:20:47 -070012758/**
Nitesh Shahdb5ea0d2017-03-22 15:17:47 +053012759 * sme_update_hw_dbs_capable() - sets the HW DBS capability
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -080012760 * @mac_handle: Opaque handle to the global MAC context
Nitesh Shahdb5ea0d2017-03-22 15:17:47 +053012761 * @hw_dbs_capable: HW DBS capability
12762 *
12763 * Sets HW DBS capability based on INI and fw capability.
12764 *
12765 * Return: None
12766 */
Jeff Johnsonc7309062018-11-09 20:59:42 -080012767void sme_update_hw_dbs_capable(mac_handle_t mac_handle, uint8_t hw_dbs_capable)
Nitesh Shahdb5ea0d2017-03-22 15:17:47 +053012768{
Jeff Johnson0a8786a2018-12-02 10:49:01 -080012769 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053012770
Nitesh Shahdb5ea0d2017-03-22 15:17:47 +053012771 mac_ctx->hw_dbs_capable = hw_dbs_capable;
12772}
12773
Rachit Kankane026e77a2018-07-31 16:21:09 +053012774#ifdef FEATURE_P2P_LISTEN_OFFLOAD
Nitesh Shahdb5ea0d2017-03-22 15:17:47 +053012775/**
Peng Xu8fdaa492016-06-22 10:20:47 -070012776 * sme_register_p2p_lo_event() - Register for the p2p lo event
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -080012777 * @mac_handle: Opaque handle to the global MAC context
Peng Xu8fdaa492016-06-22 10:20:47 -070012778 * @context: the context of the call
12779 * @callback: the callback to hdd
12780 *
12781 * This function registers the callback function for P2P listen
12782 * offload stop event.
12783 *
12784 * Return: none
12785 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -080012786void sme_register_p2p_lo_event(mac_handle_t mac_handle, void *context,
Jeff Johnsonf7e36d62018-07-04 21:14:02 -070012787 p2p_lo_callback callback)
Peng Xu8fdaa492016-06-22 10:20:47 -070012788{
Jeff Johnson0a8786a2018-12-02 10:49:01 -080012789 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Peng Xu8fdaa492016-06-22 10:20:47 -070012790 QDF_STATUS status = QDF_STATUS_E_FAILURE;
12791
Jeff Johnson01f2c232018-11-21 19:17:44 -080012792 status = sme_acquire_global_lock(&mac->sme);
12793 mac->sme.p2p_lo_event_callback = callback;
12794 mac->sme.p2p_lo_event_context = context;
12795 sme_release_global_lock(&mac->sme);
Peng Xu8fdaa492016-06-22 10:20:47 -070012796}
Rachit Kankane026e77a2018-07-31 16:21:09 +053012797#endif
Manjeet Singhf82ed072016-07-08 11:40:00 +053012798
12799/**
12800 * sme_process_mac_pwr_dbg_cmd() - enable mac pwr debugging
Jeff Johnsonc7309062018-11-09 20:59:42 -080012801 * @mac_handle: The handle returned by macOpen
Manjeet Singhf82ed072016-07-08 11:40:00 +053012802 * @session_id: session id
12803 * @dbg_args: args for mac pwr debug command
12804 * Return: Return QDF_STATUS, otherwise appropriate failure code
12805 */
Jeff Johnsonc7309062018-11-09 20:59:42 -080012806QDF_STATUS sme_process_mac_pwr_dbg_cmd(mac_handle_t mac_handle,
12807 uint32_t session_id,
12808 struct sir_mac_pwr_dbg_cmd *dbg_args)
Manjeet Singhf82ed072016-07-08 11:40:00 +053012809{
Rajeev Kumar37d478b2017-04-17 16:59:28 -070012810 struct scheduler_msg message = {0};
Jeff Johnson0a8786a2018-12-02 10:49:01 -080012811 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Manjeet Singhf82ed072016-07-08 11:40:00 +053012812 struct sir_mac_pwr_dbg_cmd *req;
12813 int i;
12814
12815 if (!CSR_IS_SESSION_VALID(mac_ctx, session_id)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070012816 sme_err("CSR session not valid: %d", session_id);
Manjeet Singhf82ed072016-07-08 11:40:00 +053012817 return QDF_STATUS_E_FAILURE;
12818 }
12819
12820 req = qdf_mem_malloc(sizeof(*req));
Arif Hussain0ef77082018-10-10 16:42:53 -070012821 if (!req)
Manjeet Singhf82ed072016-07-08 11:40:00 +053012822 return QDF_STATUS_E_FAILURE;
Arif Hussain0ef77082018-10-10 16:42:53 -070012823
Manjeet Singhf82ed072016-07-08 11:40:00 +053012824 req->module_id = dbg_args->module_id;
12825 req->pdev_id = dbg_args->pdev_id;
12826 req->num_args = dbg_args->num_args;
12827 for (i = 0; i < req->num_args; i++)
12828 req->args[i] = dbg_args->args[i];
12829
12830 message.type = SIR_HAL_POWER_DBG_CMD;
12831 message.bodyptr = req;
12832
gaurank kathpalia36b0c582018-08-28 17:45:43 +053012833 if (!QDF_IS_STATUS_SUCCESS(scheduler_post_message(QDF_MODULE_ID_SME,
12834 QDF_MODULE_ID_WMA,
12835 QDF_MODULE_ID_WMA,
12836 &message))) {
Manjeet Singhf82ed072016-07-08 11:40:00 +053012837 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
12838 "%s: Not able to post msg to WDA!",
12839 __func__);
12840 qdf_mem_free(req);
12841 }
12842 return QDF_STATUS_SUCCESS;
12843}
Tushnim Bhattacharyyaf44a9d82016-07-05 10:52:06 -070012844/**
12845 * sme_get_vdev_type_nss() - gets the nss per vdev type
Tushnim Bhattacharyyaf44a9d82016-07-05 10:52:06 -070012846 * @dev_mode: connection type.
12847 * @nss2g: Pointer to the 2G Nss parameter.
12848 * @nss5g: Pointer to the 5G Nss parameter.
12849 *
12850 * Fills the 2G and 5G Nss values based on connection type.
12851 *
12852 * Return: None
12853 */
Jeff Johnsonc1e62782017-11-09 09:50:17 -080012854void sme_get_vdev_type_nss(enum QDF_OPMODE dev_mode,
12855 uint8_t *nss_2g, uint8_t *nss_5g)
Tushnim Bhattacharyyaf44a9d82016-07-05 10:52:06 -070012856{
Jeff Johnson0a8786a2018-12-02 10:49:01 -080012857 struct mac_context *mac_ctx = sme_get_mac_context();
Tushnim Bhattacharyya0c4ad2d2017-03-09 15:59:03 -080012858
12859 if (NULL == mac_ctx) {
12860 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
12861 FL("Invalid MAC context"));
12862 return;
12863 }
Tushnim Bhattacharyyaf44a9d82016-07-05 10:52:06 -070012864 csr_get_vdev_type_nss(mac_ctx, dev_mode, nss_2g, nss_5g);
12865}
Agrawal Ashish21ba2572016-09-03 16:40:10 +053012866
12867/**
12868 * sme_update_sta_roam_policy() - update sta roam policy for
12869 * unsafe and DFS channels.
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -080012870 * @mac_handle: Opaque handle to the global MAC context
Agrawal Ashish21ba2572016-09-03 16:40:10 +053012871 * @dfs_mode: dfs mode which tell if dfs channel needs to be
12872 * skipped or not
12873 * @skip_unsafe_channels: Param to tell if driver needs to
12874 * skip unsafe channels or not.
12875 * @param session_id: sme_session_id
Agrawal, Ashish9f84c402016-11-30 16:19:44 +053012876 * @sap_operating_band: Band on which SAP is operating
Agrawal Ashish21ba2572016-09-03 16:40:10 +053012877 *
12878 * sme_update_sta_roam_policy update sta rome policies to csr
12879 * this function will call csrUpdateChannelList as well
12880 * to include/exclude DFS channels and unsafe channels.
12881 *
12882 * Return: eHAL_STATUS_SUCCESS or non-zero on failure.
12883 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -080012884QDF_STATUS sme_update_sta_roam_policy(mac_handle_t mac_handle,
Jeff Johnsonc7309062018-11-09 20:59:42 -080012885 enum sta_roam_policy_dfs_mode dfs_mode,
12886 bool skip_unsafe_channels,
12887 uint8_t session_id,
12888 uint8_t sap_operating_band)
Agrawal Ashish21ba2572016-09-03 16:40:10 +053012889{
Jeff Johnson0a8786a2018-12-02 10:49:01 -080012890 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Agrawal Ashish21ba2572016-09-03 16:40:10 +053012891 QDF_STATUS status = QDF_STATUS_SUCCESS;
Sridhar Selvaraj48c47092017-07-31 18:18:14 +053012892 tSmeConfigParams *sme_config;
Agrawal Ashish21ba2572016-09-03 16:40:10 +053012893
12894 if (!mac_ctx) {
12895 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_FATAL,
12896 "%s: mac_ctx is null", __func__);
12897 return QDF_STATUS_E_FAILURE;
12898 }
Agrawal Ashish21ba2572016-09-03 16:40:10 +053012899
Sridhar Selvaraj48c47092017-07-31 18:18:14 +053012900 sme_config = qdf_mem_malloc(sizeof(*sme_config));
Arif Hussain0ef77082018-10-10 16:42:53 -070012901 if (!sme_config)
Sridhar Selvaraj48c47092017-07-31 18:18:14 +053012902 return QDF_STATUS_E_FAILURE;
Arif Hussain0ef77082018-10-10 16:42:53 -070012903
Sridhar Selvaraj48c47092017-07-31 18:18:14 +053012904 qdf_mem_zero(sme_config, sizeof(*sme_config));
Jeff Johnsonb460dd72018-11-08 10:26:51 -080012905 sme_get_config_param(mac_handle, sme_config);
Sridhar Selvaraj48c47092017-07-31 18:18:14 +053012906
12907 sme_config->csrConfig.sta_roam_policy_params.dfs_mode =
Agrawal Ashish21ba2572016-09-03 16:40:10 +053012908 dfs_mode;
Sridhar Selvaraj48c47092017-07-31 18:18:14 +053012909 sme_config->csrConfig.sta_roam_policy_params.skip_unsafe_channels =
Agrawal Ashish21ba2572016-09-03 16:40:10 +053012910 skip_unsafe_channels;
Sridhar Selvaraj48c47092017-07-31 18:18:14 +053012911 sme_config->csrConfig.sta_roam_policy_params.sap_operating_band =
Agrawal, Ashish9f84c402016-11-30 16:19:44 +053012912 sap_operating_band;
Agrawal Ashish21ba2572016-09-03 16:40:10 +053012913
Jeff Johnsonb460dd72018-11-08 10:26:51 -080012914 sme_update_config(mac_handle, sme_config);
Agrawal Ashish21ba2572016-09-03 16:40:10 +053012915
12916 status = csr_update_channel_list(mac_ctx);
12917 if (QDF_STATUS_SUCCESS != status) {
12918 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
12919 FL("failed to update the supported channel list"));
12920 }
Vignesh Viswanathan4e65e8e2018-05-01 12:04:16 +053012921
Wu Gao51a63562018-11-08 16:29:10 +080012922 if (mac_ctx->mlme_cfg->lfr.roam_scan_offload_enabled) {
Vignesh Viswanathan4e65e8e2018-05-01 12:04:16 +053012923 status = sme_acquire_global_lock(&mac_ctx->sme);
12924 if (QDF_IS_STATUS_SUCCESS(status)) {
12925 csr_roam_offload_scan(mac_ctx, session_id,
Agrawal Ashish21ba2572016-09-03 16:40:10 +053012926 ROAM_SCAN_OFFLOAD_UPDATE_CFG,
12927 REASON_ROAM_SCAN_STA_ROAM_POLICY_CHANGED);
Vignesh Viswanathan4e65e8e2018-05-01 12:04:16 +053012928 sme_release_global_lock(&mac_ctx->sme);
Vignesh Viswanathan4e65e8e2018-05-01 12:04:16 +053012929 }
12930 }
Sridhar Selvaraj48c47092017-07-31 18:18:14 +053012931 qdf_mem_free(sme_config);
Selvaraj, Sridharebda0f22016-08-29 16:05:23 +053012932 return status;
12933}
12934
12935/**
12936 * sme_enable_disable_chanavoidind_event - configure ca event ind
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -080012937 * @mac_handle: Opaque handle to the global MAC context
Selvaraj, Sridharebda0f22016-08-29 16:05:23 +053012938 * @set_value: enable/disable
12939 *
12940 * function to enable/disable chan avoidance indication
12941 *
12942 * Return: QDF_STATUS
12943 */
Jeff Johnsonc7309062018-11-09 20:59:42 -080012944QDF_STATUS sme_enable_disable_chanavoidind_event(mac_handle_t mac_handle,
12945 uint8_t set_value)
Selvaraj, Sridharebda0f22016-08-29 16:05:23 +053012946{
12947 QDF_STATUS status;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080012948 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Rajeev Kumar37d478b2017-04-17 16:59:28 -070012949 struct scheduler_msg msg = {0};
Selvaraj, Sridharebda0f22016-08-29 16:05:23 +053012950
Vignesh Viswanathana1f3a1a2018-10-04 13:10:46 +053012951 if (!mac_ctx->mlme_cfg->gen.optimize_ca_event) {
12952 sme_err("optimize_ca_event not enabled in ini");
12953 return QDF_STATUS_E_NOSUPPORT;
12954 }
12955
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070012956 sme_debug("set_value: %d", set_value);
Selvaraj, Sridharebda0f22016-08-29 16:05:23 +053012957 status = sme_acquire_global_lock(&mac_ctx->sme);
12958 if (QDF_STATUS_SUCCESS == status) {
Rajeev Kumar8eaedf62017-01-21 11:03:13 -080012959 qdf_mem_zero(&msg, sizeof(struct scheduler_msg));
Selvaraj, Sridharebda0f22016-08-29 16:05:23 +053012960 msg.type = WMA_SEND_FREQ_RANGE_CONTROL_IND;
12961 msg.bodyval = set_value;
gaurank kathpalia36b0c582018-08-28 17:45:43 +053012962 status = scheduler_post_message(QDF_MODULE_ID_SME,
12963 QDF_MODULE_ID_WMA,
12964 QDF_MODULE_ID_WMA, &msg);
Selvaraj, Sridharebda0f22016-08-29 16:05:23 +053012965 sme_release_global_lock(&mac_ctx->sme);
12966 return status;
12967 }
Deepak Dhamdhereb106ae52016-08-10 20:55:30 +053012968 return status;
12969}
Agrawal Ashish21ba2572016-09-03 16:40:10 +053012970
Deepak Dhamdhereb106ae52016-08-10 20:55:30 +053012971/*
12972 * sme_set_default_scan_ie() - API to send default scan IE to LIM
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -080012973 * @mac_handle: Opaque handle to the global MAC context
Deepak Dhamdhereb106ae52016-08-10 20:55:30 +053012974 * @session_id: current session ID
12975 * @ie_data: Pointer to Scan IE data
12976 * @ie_len: Length of @ie_data
12977 *
12978 * Return: QDF_STATUS
12979 */
Jeff Johnsonc7309062018-11-09 20:59:42 -080012980QDF_STATUS sme_set_default_scan_ie(mac_handle_t mac_handle, uint16_t session_id,
12981 uint8_t *ie_data, uint16_t ie_len)
Deepak Dhamdhereb106ae52016-08-10 20:55:30 +053012982{
12983 QDF_STATUS status;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080012984 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Deepak Dhamdhereb106ae52016-08-10 20:55:30 +053012985 struct hdd_default_scan_ie *set_ie_params;
12986
Rajeev Kumar5d17dd52017-12-19 16:17:42 -080012987 if (!ie_data)
12988 return QDF_STATUS_E_INVAL;
12989
Deepak Dhamdhereb106ae52016-08-10 20:55:30 +053012990 status = sme_acquire_global_lock(&mac_ctx->sme);
12991 if (QDF_IS_STATUS_SUCCESS(status)) {
12992 set_ie_params = qdf_mem_malloc(sizeof(*set_ie_params));
12993 if (!set_ie_params)
12994 status = QDF_STATUS_E_NOMEM;
12995 else {
12996 set_ie_params->message_type = eWNI_SME_DEFAULT_SCAN_IE;
12997 set_ie_params->length = sizeof(*set_ie_params);
12998 set_ie_params->session_id = session_id;
12999 set_ie_params->ie_len = ie_len;
13000 qdf_mem_copy(set_ie_params->ie_data, ie_data, ie_len);
Rajeev Kumard138ac52017-01-30 18:38:37 -080013001 status = umac_send_mb_message_to_mac(set_ie_params);
Deepak Dhamdhereb106ae52016-08-10 20:55:30 +053013002 }
13003 sme_release_global_lock(&mac_ctx->sme);
13004 }
Agrawal Ashish21ba2572016-09-03 16:40:10 +053013005 return status;
13006}
Padma, Santhosh Kumard7cc0792016-06-28 18:54:12 +053013007
Jeff Johnsonc7309062018-11-09 20:59:42 -080013008QDF_STATUS sme_get_sar_power_limits(mac_handle_t mac_handle,
Jeff Johnsonf0e54b02017-12-18 15:22:25 -080013009 wma_sar_cb callback, void *context)
13010{
13011 void *wma_handle;
13012
13013 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
13014 if (!wma_handle) {
13015 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
13016 "wma handle is NULL");
13017 return QDF_STATUS_E_FAILURE;
13018 }
13019
13020 return wma_get_sar_limit(wma_handle, callback, context);
13021}
13022
Jeff Johnsonc7309062018-11-09 20:59:42 -080013023QDF_STATUS sme_set_sar_power_limits(mac_handle_t mac_handle,
Kabilan Kannan3c0a7352016-12-02 18:49:38 -080013024 struct sar_limit_cmd_params *sar_limit_cmd)
13025{
13026 void *wma_handle;
13027
13028 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
13029 if (!wma_handle) {
13030 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
13031 "wma handle is NULL");
13032 return QDF_STATUS_E_FAILURE;
13033 }
13034
13035 return wma_set_sar_limit(wma_handle, sar_limit_cmd);
13036}
13037
Dundi Raviteja3b637092018-09-12 13:42:50 +053013038QDF_STATUS sme_send_coex_config_cmd(struct coex_config_params *coex_cfg_params)
13039{
13040 void *wma_handle;
13041
13042 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
13043 if (!wma_handle) {
13044 sme_err("wma handle is NULL");
13045 return QDF_STATUS_E_FAILURE;
13046 }
13047 return wma_send_coex_config_cmd(wma_handle, coex_cfg_params);
13048}
13049
Jeff Johnson6136fb92017-03-30 15:21:49 -070013050#ifdef WLAN_FEATURE_FIPS
Jeff Johnsonc7309062018-11-09 20:59:42 -080013051QDF_STATUS sme_fips_request(mac_handle_t mac_handle, struct fips_params *param,
Jeff Johnson6136fb92017-03-30 15:21:49 -070013052 wma_fips_cb callback, void *context)
13053{
13054 void *wma_handle;
13055
13056 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
13057 if (!wma_handle) {
13058 sme_err("wma handle is NULL");
13059 return QDF_STATUS_E_FAILURE;
13060 }
13061
13062 return wma_fips_request(wma_handle, param, callback, context);
13063}
13064#endif
13065
Jeff Johnsonb460dd72018-11-08 10:26:51 -080013066QDF_STATUS sme_set_cts2self_for_p2p_go(mac_handle_t mac_handle)
Agrawal Ashishb2d1a452016-05-05 12:23:58 +053013067{
Agrawal Ashishb2d1a452016-05-05 12:23:58 +053013068 void *wma_handle;
13069
13070 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
13071 if (!wma_handle) {
13072 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
13073 "wma_handle is NULL");
13074 return QDF_STATUS_E_FAILURE;
13075 }
Agrawal Ashishb2d1a452016-05-05 12:23:58 +053013076 if (QDF_STATUS_SUCCESS !=
13077 wma_set_cts2self_for_p2p_go(wma_handle, true)) {
13078 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
13079 "%s: Failed to set cts2self for p2p GO to firmware",
13080 __func__);
13081 return QDF_STATUS_E_FAILURE;
13082 }
13083 return QDF_STATUS_SUCCESS;
13084}
Yingying Tang95409972016-10-20 15:16:15 +080013085
Agrawal, Ashish35b251d2016-09-08 19:21:03 +053013086/**
13087 * sme_update_tx_fail_cnt_threshold() - update tx fail count Threshold
Jeff Johnsonb460dd72018-11-08 10:26:51 -080013088 * @mac_handle: Handle returned by mac_open
Agrawal, Ashish35b251d2016-09-08 19:21:03 +053013089 * @session_id: Session ID on which tx fail count needs to be updated to FW
13090 * @tx_fail_count: Count for tx fail threshold after which FW will disconnect
13091 *
13092 * This function is used to set tx fail count threshold to firmware.
13093 * firmware will issue disocnnect with peer device once this threshold is
13094 * reached.
13095 *
13096 * Return: Return QDF_STATUS, otherwise appropriate failure code
13097 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -080013098QDF_STATUS sme_update_tx_fail_cnt_threshold(mac_handle_t mac_handle,
Jeff Johnsonc7309062018-11-09 20:59:42 -080013099 uint8_t session_id,
13100 uint32_t tx_fail_count)
Agrawal, Ashish35b251d2016-09-08 19:21:03 +053013101{
Agrawal, Ashish35b251d2016-09-08 19:21:03 +053013102 QDF_STATUS status = QDF_STATUS_E_FAILURE;
13103 struct sme_tx_fail_cnt_threshold *tx_fail_cnt;
Rajeev Kumar37d478b2017-04-17 16:59:28 -070013104 struct scheduler_msg msg = {0};
Agrawal, Ashish35b251d2016-09-08 19:21:03 +053013105
13106 tx_fail_cnt = qdf_mem_malloc(sizeof(*tx_fail_cnt));
Arif Hussain0ef77082018-10-10 16:42:53 -070013107 if (!tx_fail_cnt)
Agrawal, Ashish35b251d2016-09-08 19:21:03 +053013108 return QDF_STATUS_E_FAILURE;
Arif Hussain0ef77082018-10-10 16:42:53 -070013109
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070013110 sme_debug("session_id: %d tx_fail_count: %d",
13111 session_id, tx_fail_count);
Agrawal, Ashish35b251d2016-09-08 19:21:03 +053013112 tx_fail_cnt->session_id = session_id;
13113 tx_fail_cnt->tx_fail_cnt_threshold = tx_fail_count;
13114
Rajeev Kumar8eaedf62017-01-21 11:03:13 -080013115 qdf_mem_zero(&msg, sizeof(struct scheduler_msg));
Agrawal, Ashish35b251d2016-09-08 19:21:03 +053013116 msg.type = SIR_HAL_UPDATE_TX_FAIL_CNT_TH;
13117 msg.reserved = 0;
13118 msg.bodyptr = tx_fail_cnt;
gaurank kathpalia36b0c582018-08-28 17:45:43 +053013119 status = scheduler_post_message(QDF_MODULE_ID_SME,
13120 QDF_MODULE_ID_WMA,
13121 QDF_MODULE_ID_WMA, &msg);
Agrawal, Ashish35b251d2016-09-08 19:21:03 +053013122
13123 if (!QDF_IS_STATUS_SUCCESS(status)) {
13124 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053013125 FL("Not able to post Tx fail count message to WDA"));
Agrawal, Ashish35b251d2016-09-08 19:21:03 +053013126 qdf_mem_free(tx_fail_cnt);
13127 }
Sreelakshmi Konamki58c72432016-11-09 17:06:44 +053013128 return status;
13129}
Agrawal, Ashish35b251d2016-09-08 19:21:03 +053013130
Jeff Johnsondc198ec2018-07-04 17:39:53 -070013131QDF_STATUS sme_set_lost_link_info_cb(mac_handle_t mac_handle,
13132 lost_link_info_cb cb)
Sreelakshmi Konamki58c72432016-11-09 17:06:44 +053013133{
Jeff Johnsondc198ec2018-07-04 17:39:53 -070013134 QDF_STATUS status;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080013135 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Sreelakshmi Konamki58c72432016-11-09 17:06:44 +053013136
13137 status = sme_acquire_global_lock(&mac->sme);
13138 if (QDF_IS_STATUS_SUCCESS(status)) {
13139 mac->sme.lost_link_info_cb = cb;
13140 sme_release_global_lock(&mac->sme);
Sreelakshmi Konamki58c72432016-11-09 17:06:44 +053013141 }
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053013142
Agrawal, Ashish35b251d2016-09-08 19:21:03 +053013143 return status;
13144}
Yingying Tang95409972016-10-20 15:16:15 +080013145
yeshwanth sriram guntukaa1ba9a22017-02-28 16:17:32 +053013146#ifdef FEATURE_WLAN_ESE
Jeff Johnson172237b2017-11-07 15:32:59 -080013147bool sme_roam_is_ese_assoc(struct csr_roam_info *roam_info)
yeshwanth sriram guntukaa1ba9a22017-02-28 16:17:32 +053013148{
13149 return roam_info->isESEAssoc;
13150}
Manjeet Singh2f785062017-03-08 18:14:18 +053013151#endif
yeshwanth sriram guntukaa1ba9a22017-02-28 16:17:32 +053013152
Jeff Johnsond5fb2db2018-11-08 14:20:28 -080013153bool sme_neighbor_roam_is11r_assoc(mac_handle_t mac_handle, uint8_t session_id)
yeshwanth sriram guntukaa1ba9a22017-02-28 16:17:32 +053013154{
Jeff Johnson0a8786a2018-12-02 10:49:01 -080013155 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053013156
yeshwanth sriram guntukaa1ba9a22017-02-28 16:17:32 +053013157 return csr_neighbor_roam_is11r_assoc(mac_ctx, session_id);
13158}
Yingying Tang95409972016-10-20 15:16:15 +080013159
13160#ifdef WLAN_FEATURE_WOW_PULSE
13161/**
13162 * sme_set_wow_pulse() - set wow pulse info
13163 * @wow_pulse_set_info: wow_pulse_mode structure pointer
13164 *
13165 * Return: QDF_STATUS
13166 */
13167QDF_STATUS sme_set_wow_pulse(struct wow_pulse_mode *wow_pulse_set_info)
13168{
Rajeev Kumar37d478b2017-04-17 16:59:28 -070013169 struct scheduler_msg message = {0};
Yingying Tang95409972016-10-20 15:16:15 +080013170 QDF_STATUS status;
13171 struct wow_pulse_mode *wow_pulse_set_cmd;
13172
13173 if (!wow_pulse_set_info) {
13174 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
13175 "%s: invalid wow_pulse_set_info pointer", __func__);
13176 return QDF_STATUS_E_FAILURE;
13177 }
13178
13179 wow_pulse_set_cmd = qdf_mem_malloc(sizeof(*wow_pulse_set_cmd));
Arif Hussain0ef77082018-10-10 16:42:53 -070013180 if (!wow_pulse_set_cmd)
Yingying Tang95409972016-10-20 15:16:15 +080013181 return QDF_STATUS_E_NOMEM;
Yingying Tang95409972016-10-20 15:16:15 +080013182
13183 *wow_pulse_set_cmd = *wow_pulse_set_info;
13184
13185 message.type = WMA_SET_WOW_PULSE_CMD;
13186 message.bodyptr = wow_pulse_set_cmd;
gaurank kathpalia36b0c582018-08-28 17:45:43 +053013187 status = scheduler_post_message(QDF_MODULE_ID_SME,
13188 QDF_MODULE_ID_WMA,
13189 QDF_MODULE_ID_WMA,
Yingying Tang95409972016-10-20 15:16:15 +080013190 &message);
13191 if (!QDF_IS_STATUS_SUCCESS(status)) {
13192 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
13193 "%s: Not able to post msg to WDA!",
13194 __func__);
13195 qdf_mem_free(wow_pulse_set_cmd);
13196 status = QDF_STATUS_E_FAILURE;
13197 }
13198
13199 return status;
13200}
13201#endif
Naveen Rawat664a7cb2017-01-19 17:58:14 -080013202
13203/**
13204 * sme_prepare_beacon_from_bss_descp() - prepares beacon frame by populating
13205 * different fields and IEs from bss descriptor.
13206 * @frame_buf: frame buffer to populate
13207 * @bss_descp: bss descriptor
13208 * @bssid: bssid of the beacon frame to populate
13209 * @ie_len: length of IE fields
13210 *
13211 * Return: None
13212 */
13213static void sme_prepare_beacon_from_bss_descp(uint8_t *frame_buf,
13214 tSirBssDescription *bss_descp,
13215 const tSirMacAddr bssid,
Naveen Rawat6dabf4e2017-02-08 15:55:49 -080013216 uint32_t ie_len)
Naveen Rawat664a7cb2017-01-19 17:58:14 -080013217{
13218 tDot11fBeacon1 *bcn_fixed;
13219 tpSirMacMgmtHdr mac_hdr = (tpSirMacMgmtHdr)frame_buf;
13220
13221 /* populate mac header first to indicate beacon */
13222 mac_hdr->fc.protVer = SIR_MAC_PROTOCOL_VERSION;
13223 mac_hdr->fc.type = SIR_MAC_MGMT_FRAME;
13224 mac_hdr->fc.subType = SIR_MAC_MGMT_BEACON;
13225 qdf_mem_copy((uint8_t *) mac_hdr->da,
13226 (uint8_t *) "\xFF\xFF\xFF\xFF\xFF\xFF",
13227 sizeof(struct qdf_mac_addr));
13228 qdf_mem_copy((uint8_t *) mac_hdr->sa, bssid,
13229 sizeof(struct qdf_mac_addr));
13230 qdf_mem_copy((uint8_t *) mac_hdr->bssId, bssid,
13231 sizeof(struct qdf_mac_addr));
13232
13233 /* now populate fixed params */
13234 bcn_fixed = (tDot11fBeacon1 *)(frame_buf + SIR_MAC_HDR_LEN_3A);
13235 /* populate timestamp */
13236 qdf_mem_copy(&bcn_fixed->TimeStamp.timestamp, &bss_descp->timeStamp,
13237 sizeof(bss_descp->timeStamp));
13238 /* populate beacon interval */
13239 bcn_fixed->BeaconInterval.interval = bss_descp->beaconInterval;
13240 /* populate capability */
13241 qdf_mem_copy(&bcn_fixed->Capabilities, &bss_descp->capabilityInfo,
13242 sizeof(bss_descp->capabilityInfo));
13243
13244 /* copy IEs now */
13245 qdf_mem_copy(frame_buf + SIR_MAC_HDR_LEN_3A
13246 + SIR_MAC_B_PR_SSID_OFFSET,
13247 &bss_descp->ieFields, ie_len);
13248}
13249
Jeff Johnsonc7309062018-11-09 20:59:42 -080013250QDF_STATUS sme_get_rssi_snr_by_bssid(mac_handle_t mac_handle,
13251 struct csr_roam_profile *profile,
13252 const uint8_t *bssid,
13253 int8_t *rssi, int8_t *snr)
Hanumanth Reddy Pothula90051782017-05-04 22:14:43 +053013254{
13255 tSirBssDescription *bss_descp;
13256 tCsrScanResultFilter *scan_filter;
13257 struct scan_result_list *bss_list;
13258 tScanResultHandle result_handle = NULL;
13259 QDF_STATUS status = QDF_STATUS_SUCCESS;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080013260 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Hanumanth Reddy Pothula90051782017-05-04 22:14:43 +053013261
13262 scan_filter = qdf_mem_malloc(sizeof(tCsrScanResultFilter));
Arif Hussain0ef77082018-10-10 16:42:53 -070013263 if (!scan_filter) {
Hanumanth Reddy Pothula90051782017-05-04 22:14:43 +053013264 status = QDF_STATUS_E_NOMEM;
13265 goto free_scan_flter;
13266 }
13267
13268 status = csr_roam_prepare_filter_from_profile(mac_ctx,
13269 profile, scan_filter);
13270 if (QDF_STATUS_SUCCESS != status) {
13271 sme_err("prepare_filter failed");
13272 goto free_scan_flter;
13273 }
13274
13275 /* update filter to get scan result with just target BSSID */
13276 if (NULL == scan_filter->BSSIDs.bssid) {
13277 scan_filter->BSSIDs.bssid =
13278 qdf_mem_malloc(sizeof(struct qdf_mac_addr));
Arif Hussain0ef77082018-10-10 16:42:53 -070013279 if (!scan_filter->BSSIDs.bssid) {
Hanumanth Reddy Pothula90051782017-05-04 22:14:43 +053013280 status = QDF_STATUS_E_NOMEM;
13281 goto free_scan_flter;
13282 }
13283 }
13284
13285 scan_filter->BSSIDs.numOfBSSIDs = 1;
13286 qdf_mem_copy(scan_filter->BSSIDs.bssid[0].bytes,
13287 bssid, sizeof(struct qdf_mac_addr));
13288
13289 status = csr_scan_get_result(mac_ctx, scan_filter, &result_handle);
13290 if (QDF_STATUS_SUCCESS != status) {
13291 sme_err("parse_scan_result failed");
13292 goto free_scan_flter;
13293 }
13294
13295 bss_list = (struct scan_result_list *)result_handle;
13296 bss_descp = csr_get_fst_bssdescr_ptr(bss_list);
13297 if (!bss_descp) {
13298 sme_err("unable to fetch bss descriptor");
13299 status = QDF_STATUS_E_FAULT;
13300 goto free_scan_flter;
13301 }
13302
13303 sme_debug("snr: %d, rssi: %d, raw_rssi: %d",
13304 bss_descp->sinr, bss_descp->rssi, bss_descp->rssi_raw);
13305
13306 if (rssi)
13307 *rssi = bss_descp->rssi;
13308 if (snr)
13309 *snr = bss_descp->sinr;
13310
13311free_scan_flter:
13312 /* free scan filter and exit */
13313 if (scan_filter) {
13314 csr_free_scan_filter(mac_ctx, scan_filter);
13315 qdf_mem_free(scan_filter);
13316 }
13317
13318 if (result_handle)
13319 csr_scan_result_purge(mac_ctx, result_handle);
13320
13321 return status;
13322}
13323
Jeff Johnsonc7309062018-11-09 20:59:42 -080013324QDF_STATUS sme_get_beacon_frm(mac_handle_t mac_handle,
Jeff Johnson1f2dabc2018-11-07 15:33:01 -080013325 struct csr_roam_profile *profile,
Jeff Johnson66ee8a92018-03-17 15:24:26 -070013326 const tSirMacAddr bssid,
13327 uint8_t **frame_buf, uint32_t *frame_len,
13328 int *channel)
Naveen Rawat664a7cb2017-01-19 17:58:14 -080013329{
13330 QDF_STATUS status = QDF_STATUS_SUCCESS;
Naveen Rawat56b4de82017-02-17 14:38:49 -080013331 tScanResultHandle result_handle = NULL;
Naveen Rawat664a7cb2017-01-19 17:58:14 -080013332 tCsrScanResultFilter *scan_filter;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080013333 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Naveen Rawat664a7cb2017-01-19 17:58:14 -080013334 tSirBssDescription *bss_descp;
Yeshwanth Sriram Guntuka36c09902017-09-26 11:34:26 +053013335 struct scan_result_list *bss_list;
Naveen Rawat664a7cb2017-01-19 17:58:14 -080013336 uint32_t ie_len;
13337
13338 scan_filter = qdf_mem_malloc(sizeof(tCsrScanResultFilter));
Arif Hussain0ef77082018-10-10 16:42:53 -070013339 if (!scan_filter) {
Naveen Rawat664a7cb2017-01-19 17:58:14 -080013340 status = QDF_STATUS_E_NOMEM;
13341 goto free_scan_flter;
13342 }
13343 status = csr_roam_prepare_filter_from_profile(mac_ctx,
13344 profile, scan_filter);
13345 if (QDF_IS_STATUS_ERROR(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070013346 sme_err("prepare_filter failed");
Selvaraj, Sridhar64b0a9c2017-05-11 16:50:15 +053013347 status = QDF_STATUS_E_FAULT;
Naveen Rawat664a7cb2017-01-19 17:58:14 -080013348 goto free_scan_flter;
13349 }
13350
13351 /* update filter to get scan result with just target BSSID */
13352 if (NULL == scan_filter->BSSIDs.bssid) {
13353 scan_filter->BSSIDs.bssid =
13354 qdf_mem_malloc(sizeof(struct qdf_mac_addr));
Arif Hussain0ef77082018-10-10 16:42:53 -070013355 if (!scan_filter->BSSIDs.bssid) {
Naveen Rawat664a7cb2017-01-19 17:58:14 -080013356 status = QDF_STATUS_E_NOMEM;
13357 goto free_scan_flter;
13358 }
13359 }
13360 scan_filter->BSSIDs.numOfBSSIDs = 1;
13361 qdf_mem_copy(scan_filter->BSSIDs.bssid[0].bytes,
13362 bssid, sizeof(struct qdf_mac_addr));
13363
13364 status = csr_scan_get_result(mac_ctx, scan_filter, &result_handle);
13365 if (QDF_STATUS_SUCCESS != status) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070013366 sme_err("parse_scan_result failed");
Selvaraj, Sridhar64b0a9c2017-05-11 16:50:15 +053013367 status = QDF_STATUS_E_FAULT;
Naveen Rawat664a7cb2017-01-19 17:58:14 -080013368 goto free_scan_flter;
13369 }
13370
Yeshwanth Sriram Guntuka36c09902017-09-26 11:34:26 +053013371 bss_list = (struct scan_result_list *)result_handle;
Naveen Rawat664a7cb2017-01-19 17:58:14 -080013372 bss_descp = csr_get_fst_bssdescr_ptr(bss_list);
Naveen Rawatae0aaa82017-02-17 14:41:19 -080013373 if (!bss_descp) {
Srinivas Girigowda2c263352017-03-17 17:49:53 -070013374 sme_err("unable to fetch bss descriptor");
Naveen Rawatae0aaa82017-02-17 14:41:19 -080013375 status = QDF_STATUS_E_FAULT;
13376 goto free_scan_flter;
13377 }
Naveen Rawat664a7cb2017-01-19 17:58:14 -080013378
Naveen Rawat81f058c2017-06-02 16:02:39 -070013379 /**
13380 * Length of BSS descriptor is without length of
13381 * length itself and length of pointer that holds ieFields.
13382 *
13383 * tSirBssDescription
13384 * +--------+---------------------------------+---------------+
13385 * | length | other fields | pointer to IEs|
13386 * +--------+---------------------------------+---------------+
13387 * ^
13388 * ieFields
Naveen Rawat664a7cb2017-01-19 17:58:14 -080013389 */
Naveen Rawat81f058c2017-06-02 16:02:39 -070013390 ie_len = bss_descp->length + sizeof(bss_descp->length)
13391 - (uint16_t)(offsetof(tSirBssDescription, ieFields[0]));
Selvaraj, Sridhar64b0a9c2017-05-11 16:50:15 +053013392 sme_debug("found bss_descriptor ie_len: %d channel %d",
13393 ie_len, bss_descp->channelId);
Naveen Rawat664a7cb2017-01-19 17:58:14 -080013394
13395 /* include mac header and fixed params along with IEs in frame */
13396 *frame_len = SIR_MAC_HDR_LEN_3A + SIR_MAC_B_PR_SSID_OFFSET + ie_len;
13397 *frame_buf = qdf_mem_malloc(*frame_len);
Arif Hussain0ef77082018-10-10 16:42:53 -070013398 if (!*frame_buf) {
Naveen Rawat664a7cb2017-01-19 17:58:14 -080013399 status = QDF_STATUS_E_NOMEM;
13400 goto free_scan_flter;
13401 }
13402
13403 sme_prepare_beacon_from_bss_descp(*frame_buf, bss_descp, bssid, ie_len);
13404
Selvaraj, Sridhar64b0a9c2017-05-11 16:50:15 +053013405 if (!*channel)
13406 *channel = bss_descp->channelId;
Naveen Rawat664a7cb2017-01-19 17:58:14 -080013407free_scan_flter:
13408 /* free scan filter and exit */
13409 if (scan_filter) {
13410 csr_free_scan_filter(mac_ctx, scan_filter);
13411 qdf_mem_free(scan_filter);
13412 }
Arif Hussainfdb25e22017-02-05 17:38:16 -080013413 if (result_handle)
13414 csr_scan_result_purge(mac_ctx, result_handle);
Naveen Rawat664a7cb2017-01-19 17:58:14 -080013415
Naveen Rawatae0aaa82017-02-17 14:41:19 -080013416 return status;
Naveen Rawat664a7cb2017-01-19 17:58:14 -080013417}
13418
Paul Zhangc3fc0a82018-01-09 16:38:20 +080013419#ifdef WLAN_FEATURE_ROAM_OFFLOAD
Jeff Johnsonc7309062018-11-09 20:59:42 -080013420QDF_STATUS sme_fast_reassoc(mac_handle_t mac_handle,
13421 struct csr_roam_profile *profile,
Naveen Rawat4195c5e2017-05-22 17:07:45 -070013422 const tSirMacAddr bssid, int channel,
Krunal Soni332f4af2017-06-01 14:36:17 -070013423 uint8_t vdev_id, const tSirMacAddr connected_bssid)
Naveen Rawat4195c5e2017-05-22 17:07:45 -070013424{
13425 QDF_STATUS status;
13426 struct wma_roam_invoke_cmd *fastreassoc;
13427 struct scheduler_msg msg = {0};
Jeff Johnson0a8786a2018-12-02 10:49:01 -080013428 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Abhinav Kumareab25932018-07-13 11:48:43 +053013429 struct csr_roam_session *session;
13430 struct csr_roam_profile *roam_profile;
Naveen Rawat4195c5e2017-05-22 17:07:45 -070013431
Abhinav Kumareab25932018-07-13 11:48:43 +053013432 session = CSR_GET_SESSION(mac_ctx, vdev_id);
13433 if (!session || !session->pCurRoamProfile) {
13434 sme_err("session %d not found", vdev_id);
13435 return QDF_STATUS_E_FAILURE;
13436 }
13437
13438 roam_profile = session->pCurRoamProfile;
13439 if (roam_profile->supplicant_disabled_roaming ||
13440 roam_profile->driver_disabled_roaming) {
13441 sme_debug("roaming status in Supplicant %d and in driver %d",
13442 roam_profile->supplicant_disabled_roaming,
13443 roam_profile->driver_disabled_roaming);
13444 return QDF_STATUS_E_FAILURE;
13445 }
Naveen Rawat4195c5e2017-05-22 17:07:45 -070013446 fastreassoc = qdf_mem_malloc(sizeof(*fastreassoc));
Arif Hussain0ef77082018-10-10 16:42:53 -070013447 if (!fastreassoc)
Naveen Rawat4195c5e2017-05-22 17:07:45 -070013448 return QDF_STATUS_E_NOMEM;
Arif Hussain0ef77082018-10-10 16:42:53 -070013449
Krunal Soni332f4af2017-06-01 14:36:17 -070013450 /* if both are same then set the flag */
13451 if (!qdf_mem_cmp(connected_bssid, bssid, ETH_ALEN)) {
13452 fastreassoc->is_same_bssid = true;
13453 sme_debug("bssid same, bssid[%pM]", bssid);
13454 }
Naveen Rawat4195c5e2017-05-22 17:07:45 -070013455 fastreassoc->vdev_id = vdev_id;
Naveen Rawat4195c5e2017-05-22 17:07:45 -070013456 fastreassoc->bssid[0] = bssid[0];
13457 fastreassoc->bssid[1] = bssid[1];
13458 fastreassoc->bssid[2] = bssid[2];
13459 fastreassoc->bssid[3] = bssid[3];
13460 fastreassoc->bssid[4] = bssid[4];
13461 fastreassoc->bssid[5] = bssid[5];
13462
Jeff Johnsonc7309062018-11-09 20:59:42 -080013463 status = sme_get_beacon_frm(mac_handle, profile, bssid,
Naveen Rawat4195c5e2017-05-22 17:07:45 -070013464 &fastreassoc->frame_buf,
Selvaraj, Sridhar64b0a9c2017-05-11 16:50:15 +053013465 &fastreassoc->frame_len,
13466 &channel);
Naveen Rawat4195c5e2017-05-22 17:07:45 -070013467
Selvaraj, Sridhar64b0a9c2017-05-11 16:50:15 +053013468 if (!channel) {
13469 sme_err("channel retrieval from BSS desc fails!");
13470 qdf_mem_free(fastreassoc);
13471 return QDF_STATUS_E_FAULT;
13472 }
13473
13474 fastreassoc->channel = channel;
Naveen Rawat4195c5e2017-05-22 17:07:45 -070013475 if (QDF_STATUS_SUCCESS != status) {
13476 sme_warn("sme_get_beacon_frm failed");
13477 fastreassoc->frame_buf = NULL;
13478 fastreassoc->frame_len = 0;
13479 }
13480
Padma, Santhosh Kumar5bc0c242017-11-29 15:44:27 +053013481 if (csr_is_auth_type_ese(mac_ctx->roam.roamSession[vdev_id].
13482 connectedProfile.AuthType)) {
13483 sme_debug("Beacon is not required for ESE");
13484 if (fastreassoc->frame_len) {
13485 qdf_mem_free(fastreassoc->frame_buf);
13486 fastreassoc->frame_buf = NULL;
13487 fastreassoc->frame_len = 0;
13488 }
13489 }
13490
Paul Zhang624f88d2018-11-07 15:29:45 +080013491 msg.type = eWNI_SME_ROAM_INVOKE;
Naveen Rawat4195c5e2017-05-22 17:07:45 -070013492 msg.reserved = 0;
13493 msg.bodyptr = fastreassoc;
gaurank kathpalia36b0c582018-08-28 17:45:43 +053013494 status = scheduler_post_message(QDF_MODULE_ID_SME,
Paul Zhang624f88d2018-11-07 15:29:45 +080013495 QDF_MODULE_ID_PE,
13496 QDF_MODULE_ID_PE, &msg);
Naveen Rawat4195c5e2017-05-22 17:07:45 -070013497 if (QDF_STATUS_SUCCESS != status) {
Paul Zhang624f88d2018-11-07 15:29:45 +080013498 sme_err("Not able to post ROAM_INVOKE_CMD message to PE");
Naveen Rawat4195c5e2017-05-22 17:07:45 -070013499 qdf_mem_free(fastreassoc);
13500 }
13501
13502 return status;
13503}
Paul Zhangc3fc0a82018-01-09 16:38:20 +080013504#endif
Naveen Rawat4195c5e2017-05-22 17:07:45 -070013505
Jeff Johnsonc7309062018-11-09 20:59:42 -080013506QDF_STATUS sme_set_del_pmkid_cache(mac_handle_t mac_handle, uint8_t session_id,
Vignesh Viswanathanc6d1e1c2017-09-18 12:32:49 +053013507 tPmkidCacheInfo *pmk_cache_info,
13508 bool is_add)
13509{
13510 struct wmi_unified_pmk_cache *pmk_cache;
13511 struct scheduler_msg msg;
13512
13513 pmk_cache = qdf_mem_malloc(sizeof(*pmk_cache));
Arif Hussain0ef77082018-10-10 16:42:53 -070013514 if (!pmk_cache)
Vignesh Viswanathanc6d1e1c2017-09-18 12:32:49 +053013515 return QDF_STATUS_E_NOMEM;
Vignesh Viswanathanc6d1e1c2017-09-18 12:32:49 +053013516
hangtian127c9532019-01-12 13:29:07 +080013517 qdf_mem_zero(pmk_cache, sizeof(*pmk_cache));
Vignesh Viswanathane8a26b22017-10-11 20:38:47 +053013518
Jeff Johnson622aad62018-12-07 15:05:37 -080013519 pmk_cache->vdev_id = session_id;
Vignesh Viswanathanc6d1e1c2017-09-18 12:32:49 +053013520
Vignesh Viswanathane8a26b22017-10-11 20:38:47 +053013521 if (!pmk_cache_info)
13522 goto send_flush_cmd;
13523
Vignesh Viswanathanc6d1e1c2017-09-18 12:32:49 +053013524 if (!pmk_cache_info->ssid_len) {
13525 pmk_cache->cat_flag = WMI_PMK_CACHE_CAT_FLAG_BSSID;
13526 WMI_CHAR_ARRAY_TO_MAC_ADDR(pmk_cache_info->BSSID.bytes,
13527 &pmk_cache->bssid);
13528 } else {
13529 pmk_cache->cat_flag = WMI_PMK_CACHE_CAT_FLAG_SSID_CACHE_ID;
13530 pmk_cache->ssid.length = pmk_cache_info->ssid_len;
13531 qdf_mem_copy(pmk_cache->ssid.mac_ssid,
13532 pmk_cache_info->ssid,
13533 pmk_cache->ssid.length);
13534 }
13535 pmk_cache->cache_id = (uint32_t) (pmk_cache_info->cache_id[0] << 8 |
13536 pmk_cache_info->cache_id[1]);
13537
13538 if (is_add)
13539 pmk_cache->action_flag = WMI_PMK_CACHE_ACTION_FLAG_ADD_ENTRY;
13540 else
13541 pmk_cache->action_flag = WMI_PMK_CACHE_ACTION_FLAG_DEL_ENTRY;
13542
13543 pmk_cache->pmkid_len = CSR_RSN_PMKID_SIZE;
13544 qdf_mem_copy(pmk_cache->pmkid, pmk_cache_info->PMKID,
13545 CSR_RSN_PMKID_SIZE);
13546
13547 pmk_cache->pmk_len = pmk_cache_info->pmk_len;
13548 qdf_mem_copy(pmk_cache->pmk, pmk_cache_info->pmk,
13549 pmk_cache->pmk_len);
13550
Vignesh Viswanathane8a26b22017-10-11 20:38:47 +053013551send_flush_cmd:
Vignesh Viswanathanc6d1e1c2017-09-18 12:32:49 +053013552 msg.type = SIR_HAL_SET_DEL_PMKID_CACHE;
13553 msg.reserved = 0;
13554 msg.bodyptr = pmk_cache;
13555 if (QDF_STATUS_SUCCESS !=
gaurank kathpalia36b0c582018-08-28 17:45:43 +053013556 scheduler_post_message(QDF_MODULE_ID_SME,
13557 QDF_MODULE_ID_WMA,
13558 QDF_MODULE_ID_WMA, &msg)) {
Vignesh Viswanathanc6d1e1c2017-09-18 12:32:49 +053013559 sme_err("Not able to post message to WDA");
13560 qdf_mem_free(pmk_cache);
13561 return QDF_STATUS_E_FAILURE;
13562 }
13563
13564 return QDF_STATUS_SUCCESS;
13565}
13566
Anurag Chouhan3920c0f2017-09-11 17:10:56 +053013567/* ARP DEBUG STATS */
13568
13569/**
13570 * sme_set_nud_debug_stats() - sme api to set nud debug stats
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -080013571 * @mac_handle: Opaque handle to the global MAC context
Anurag Chouhan3920c0f2017-09-11 17:10:56 +053013572 * @set_stats_param: pointer to set stats param
13573 *
13574 * Return: Return QDF_STATUS.
13575 */
Jeff Johnsonc7309062018-11-09 20:59:42 -080013576QDF_STATUS sme_set_nud_debug_stats(mac_handle_t mac_handle,
Anurag Chouhan3920c0f2017-09-11 17:10:56 +053013577 struct set_arp_stats_params
13578 *set_stats_param)
13579{
13580 struct set_arp_stats_params *arp_set_param;
13581 struct scheduler_msg msg;
13582
13583 arp_set_param = qdf_mem_malloc(sizeof(*arp_set_param));
Arif Hussain0ef77082018-10-10 16:42:53 -070013584 if (!arp_set_param)
Anurag Chouhan3920c0f2017-09-11 17:10:56 +053013585 return QDF_STATUS_E_NOMEM;
Anurag Chouhan3920c0f2017-09-11 17:10:56 +053013586
13587 qdf_mem_copy(arp_set_param, set_stats_param, sizeof(*arp_set_param));
13588
13589 msg.type = WMA_SET_ARP_STATS_REQ;
13590 msg.reserved = 0;
13591 msg.bodyptr = arp_set_param;
13592
13593 if (QDF_STATUS_SUCCESS !=
gaurank kathpalia36b0c582018-08-28 17:45:43 +053013594 scheduler_post_message(QDF_MODULE_ID_SME,
13595 QDF_MODULE_ID_WMA,
13596 QDF_MODULE_ID_WMA, &msg)) {
Anurag Chouhan3920c0f2017-09-11 17:10:56 +053013597 sme_err("Not able to post message to WDA");
13598 qdf_mem_free(arp_set_param);
13599 return QDF_STATUS_E_FAILURE;
13600 }
13601
13602 return QDF_STATUS_SUCCESS;
13603}
13604
13605/**
13606 * sme_get_nud_debug_stats() - sme api to get nud debug stats
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -080013607 * @mac_handle: Opaque handle to the global MAC context
Anurag Chouhan3920c0f2017-09-11 17:10:56 +053013608 * @get_stats_param: pointer to set stats param
13609 *
13610 * Return: Return QDF_STATUS.
13611 */
Jeff Johnsonc7309062018-11-09 20:59:42 -080013612QDF_STATUS sme_get_nud_debug_stats(mac_handle_t mac_handle,
Anurag Chouhan3920c0f2017-09-11 17:10:56 +053013613 struct get_arp_stats_params
13614 *get_stats_param)
13615{
13616 struct get_arp_stats_params *arp_get_param;
13617 struct scheduler_msg msg;
13618
13619 arp_get_param = qdf_mem_malloc(sizeof(*arp_get_param));
Arif Hussain0ef77082018-10-10 16:42:53 -070013620 if (!arp_get_param)
Anurag Chouhan3920c0f2017-09-11 17:10:56 +053013621 return QDF_STATUS_E_NOMEM;
Anurag Chouhan3920c0f2017-09-11 17:10:56 +053013622
13623 qdf_mem_copy(arp_get_param, get_stats_param, sizeof(*arp_get_param));
13624
13625 msg.type = WMA_GET_ARP_STATS_REQ;
13626 msg.reserved = 0;
13627 msg.bodyptr = arp_get_param;
13628
13629 if (QDF_STATUS_SUCCESS !=
gaurank kathpalia36b0c582018-08-28 17:45:43 +053013630 scheduler_post_message(QDF_MODULE_ID_SME,
13631 QDF_MODULE_ID_WMA,
13632 QDF_MODULE_ID_WMA, &msg)) {
Anurag Chouhan3920c0f2017-09-11 17:10:56 +053013633 sme_err("Not able to post message to WDA");
13634 qdf_mem_free(arp_get_param);
13635 return QDF_STATUS_E_FAILURE;
13636 }
13637
13638 return QDF_STATUS_SUCCESS;
13639}
13640
Krishna Kumaar Natarajanf1581df2017-02-21 13:42:08 -080013641QDF_STATUS sme_set_peer_param(uint8_t *peer_addr, uint32_t param_id,
13642 uint32_t param_value, uint32_t vdev_id)
13643{
13644 void *wma_handle;
13645
13646 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
13647 if (!wma_handle) {
Srinivas Girigowda2c263352017-03-17 17:49:53 -070013648 sme_err("wma handle is NULL");
Krishna Kumaar Natarajanf1581df2017-02-21 13:42:08 -080013649 return QDF_STATUS_E_FAILURE;
13650 }
13651
13652 return wma_set_peer_param(wma_handle, peer_addr, param_id,
13653 param_value, vdev_id);
13654}
Tushnim Bhattacharyya9e81b4c2017-02-15 17:11:14 -080013655
Jeff Johnsonb460dd72018-11-08 10:26:51 -080013656QDF_STATUS sme_register_set_connection_info_cb(mac_handle_t mac_handle,
Tushnim Bhattacharyya0c4ad2d2017-03-09 15:59:03 -080013657 bool (*set_connection_info_cb)(bool),
13658 bool (*get_connection_info_cb)(uint8_t *session_id,
13659 enum scan_reject_states *reason))
Tushnim Bhattacharyya9e81b4c2017-02-15 17:11:14 -080013660{
13661 QDF_STATUS status = QDF_STATUS_SUCCESS;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080013662 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Tushnim Bhattacharyya9e81b4c2017-02-15 17:11:14 -080013663
Jeff Johnson01f2c232018-11-21 19:17:44 -080013664 status = sme_acquire_global_lock(&mac->sme);
Tushnim Bhattacharyya9e81b4c2017-02-15 17:11:14 -080013665 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson01f2c232018-11-21 19:17:44 -080013666 mac->sme.set_connection_info_cb = set_connection_info_cb;
13667 mac->sme.get_connection_info_cb = get_connection_info_cb;
13668 sme_release_global_lock(&mac->sme);
Tushnim Bhattacharyya9e81b4c2017-02-15 17:11:14 -080013669 }
13670 return status;
13671}
Sreelakshmi Konamki88a2a412017-04-14 15:11:55 +053013672
Jeff Johnson43975142018-07-04 15:33:47 -070013673QDF_STATUS sme_rso_cmd_status_cb(mac_handle_t mac_handle,
13674 rso_cmd_status_cb cb)
Sreelakshmi Konamki88a2a412017-04-14 15:11:55 +053013675{
13676 QDF_STATUS status = QDF_STATUS_SUCCESS;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080013677 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Sreelakshmi Konamki88a2a412017-04-14 15:11:55 +053013678
13679 mac->sme.rso_cmd_status_cb = cb;
Srinivas Girigowda2c263352017-03-17 17:49:53 -070013680 sme_debug("Registered RSO command status callback");
Sreelakshmi Konamki88a2a412017-04-14 15:11:55 +053013681 return status;
13682}
Kiran Kumar Lokerea3de2262017-04-12 12:15:04 -070013683
Jeff Johnsonc7309062018-11-09 20:59:42 -080013684QDF_STATUS sme_set_dbs_scan_selection_config(mac_handle_t mac_handle,
Nitesh Shahf9a09ff2017-05-22 15:46:25 +053013685 struct wmi_dbs_scan_sel_params *params)
13686{
13687 struct scheduler_msg message = {0};
13688 QDF_STATUS status;
13689 struct wmi_dbs_scan_sel_params *dbs_scan_params;
13690 uint32_t i;
13691
13692 if (0 == params->num_clients) {
13693 sme_err("Num of clients is 0");
13694 return QDF_STATUS_E_FAILURE;
13695 }
13696
13697 dbs_scan_params = qdf_mem_malloc(sizeof(*dbs_scan_params));
Arif Hussain0ef77082018-10-10 16:42:53 -070013698 if (!dbs_scan_params)
Nitesh Shahf9a09ff2017-05-22 15:46:25 +053013699 return QDF_STATUS_E_NOMEM;
Nitesh Shahf9a09ff2017-05-22 15:46:25 +053013700
13701 dbs_scan_params->num_clients = params->num_clients;
13702 dbs_scan_params->pdev_id = params->pdev_id;
13703 for (i = 0; i < params->num_clients; i++) {
13704 dbs_scan_params->module_id[i] = params->module_id[i];
13705 dbs_scan_params->num_dbs_scans[i] = params->num_dbs_scans[i];
13706 dbs_scan_params->num_non_dbs_scans[i] =
13707 params->num_non_dbs_scans[i];
13708 }
13709 message.type = WMA_SET_DBS_SCAN_SEL_CONF_PARAMS;
13710 message.bodyptr = dbs_scan_params;
gaurank kathpalia36b0c582018-08-28 17:45:43 +053013711 status = scheduler_post_message(QDF_MODULE_ID_SME,
13712 QDF_MODULE_ID_WMA,
13713 QDF_MODULE_ID_WMA, &message);
Nitesh Shahf9a09ff2017-05-22 15:46:25 +053013714 if (!QDF_IS_STATUS_SUCCESS(status)) {
13715 sme_err("Not able to post msg to WMA!");
13716 qdf_mem_free(dbs_scan_params);
13717 }
13718
13719 return status;
13720}
13721
Jeff Johnsonc7309062018-11-09 20:59:42 -080013722QDF_STATUS sme_get_rcpi(mac_handle_t mac_handle, struct sme_rcpi_req *rcpi)
Rajeev Kumar Sirasanagandla996e5292016-11-22 21:20:33 +053013723{
13724 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080013725 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Naveen Rawatb7be1ed2017-11-16 16:52:08 -080013726 struct scheduler_msg msg = {0};
Rajeev Kumar Sirasanagandla996e5292016-11-22 21:20:33 +053013727 struct sme_rcpi_req *rcpi_req;
13728
13729 rcpi_req = qdf_mem_malloc(sizeof(*rcpi_req));
Arif Hussain0ef77082018-10-10 16:42:53 -070013730 if (!rcpi_req)
Rajeev Kumar Sirasanagandla996e5292016-11-22 21:20:33 +053013731 return QDF_STATUS_E_NOMEM;
Arif Hussain0ef77082018-10-10 16:42:53 -070013732
Rajeev Kumar Sirasanagandla996e5292016-11-22 21:20:33 +053013733 qdf_mem_copy(rcpi_req, rcpi, sizeof(*rcpi_req));
13734
Jeff Johnson01f2c232018-11-21 19:17:44 -080013735 status = sme_acquire_global_lock(&mac->sme);
Rajeev Kumar Sirasanagandla996e5292016-11-22 21:20:33 +053013736 if (QDF_IS_STATUS_SUCCESS(status)) {
13737 msg.bodyptr = rcpi_req;
13738 msg.type = WMA_GET_RCPI_REQ;
gaurank kathpalia36b0c582018-08-28 17:45:43 +053013739 status = scheduler_post_message(QDF_MODULE_ID_SME,
13740 QDF_MODULE_ID_WMA,
13741 QDF_MODULE_ID_WMA, &msg);
Jeff Johnson01f2c232018-11-21 19:17:44 -080013742 sme_release_global_lock(&mac->sme);
Rajeev Kumar Sirasanagandla996e5292016-11-22 21:20:33 +053013743 if (!QDF_IS_STATUS_SUCCESS(status)) {
13744 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
13745 FL("post get rcpi req failed"));
13746 status = QDF_STATUS_E_FAILURE;
13747 qdf_mem_free(rcpi_req);
13748 }
13749 } else {
Rajeev Kumar Sirasanagandla996e5292016-11-22 21:20:33 +053013750 qdf_mem_free(rcpi_req);
13751 }
13752
13753 return status;
13754}
13755
Jeff Johnsonc7309062018-11-09 20:59:42 -080013756void sme_store_pdev(mac_handle_t mac_handle, struct wlan_objmgr_pdev *pdev)
Kiran Kumar Lokerea3de2262017-04-12 12:15:04 -070013757{
Jeff Johnson0a8786a2018-12-02 10:49:01 -080013758 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Kiran Kumar Lokerea3de2262017-04-12 12:15:04 -070013759 void *wma_handle;
13760 QDF_STATUS status;
13761
Kiran Kumar Lokeref089a3a2017-04-20 21:39:26 -070013762 status = wlan_objmgr_pdev_try_get_ref(pdev, WLAN_LEGACY_MAC_ID);
Kiran Kumar Lokerea3de2262017-04-12 12:15:04 -070013763 if (QDF_STATUS_SUCCESS != status) {
13764 mac_ctx->pdev = NULL;
13765 return;
13766 }
13767 mac_ctx->pdev = pdev;
13768 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
13769 if (!wma_handle) {
13770 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Kiran Kumar Lokeref089a3a2017-04-20 21:39:26 -070013771 FL("wma handle is NULL"));
Kiran Kumar Lokerea3de2262017-04-12 12:15:04 -070013772 return;
13773 }
13774 wma_store_pdev(wma_handle, pdev);
Kiran Kumar Lokere4ce40482018-08-30 16:31:00 -070013775 pdev->pdev_nif.pdev_fw_caps |= SUPPORTED_CRYPTO_CAPS;
Kiran Kumar Lokerea3de2262017-04-12 12:15:04 -070013776}
13777
Jeff Johnsonc7309062018-11-09 20:59:42 -080013778QDF_STATUS sme_congestion_register_callback(mac_handle_t mac_handle,
Jeff Johnsonf6182e42018-07-03 14:46:17 -070013779 congestion_cb congestion_cb)
Padma, Santhosh Kumar16dacfb2017-03-21 19:05:40 +053013780{
13781 QDF_STATUS status;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080013782 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Padma, Santhosh Kumar16dacfb2017-03-21 19:05:40 +053013783
13784 status = sme_acquire_global_lock(&mac->sme);
13785 if (QDF_IS_STATUS_SUCCESS(status)) {
13786 mac->sme.congestion_cb = congestion_cb;
13787 sme_release_global_lock(&mac->sme);
Srinivas Girigowda2c263352017-03-17 17:49:53 -070013788 sme_debug("congestion callback set");
Padma, Santhosh Kumar16dacfb2017-03-21 19:05:40 +053013789 }
13790
13791 return status;
13792}
Sandeep Puligillaf587adf2017-04-27 19:53:21 -070013793
Jeff Johnsonda2afa42018-07-04 10:25:42 -070013794QDF_STATUS sme_register_tx_queue_cb(mac_handle_t mac_handle,
13795 tx_queue_cb tx_queue_cb)
Varun Reddy Yeturu076eaa82018-01-16 12:16:14 -080013796{
13797 QDF_STATUS status;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080013798 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Varun Reddy Yeturu076eaa82018-01-16 12:16:14 -080013799
13800 status = sme_acquire_global_lock(&mac->sme);
13801 if (QDF_IS_STATUS_SUCCESS(status)) {
13802 mac->sme.tx_queue_cb = tx_queue_cb;
13803 sme_release_global_lock(&mac->sme);
13804 sme_debug("Tx queue callback set");
Varun Reddy Yeturu076eaa82018-01-16 12:16:14 -080013805 }
13806
13807 return status;
13808}
13809
Jeff Johnsonda2afa42018-07-04 10:25:42 -070013810QDF_STATUS sme_deregister_tx_queue_cb(mac_handle_t mac_handle)
Varun Reddy Yeturu076eaa82018-01-16 12:16:14 -080013811{
Jeff Johnsonda2afa42018-07-04 10:25:42 -070013812 return sme_register_tx_queue_cb(mac_handle, NULL);
Varun Reddy Yeturu076eaa82018-01-16 12:16:14 -080013813}
13814
Varun Reddy Yeturud33033f2018-06-11 10:58:30 -070013815#ifdef WLAN_SUPPORT_TWT
Jeff Johnson3a08ff92018-07-03 19:40:44 -070013816QDF_STATUS sme_register_twt_enable_complete_cb(mac_handle_t mac_handle,
13817 twt_enable_cb twt_enable_cb)
Varun Reddy Yeturu3c9f89c2018-04-18 19:10:34 -070013818{
13819 QDF_STATUS status;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080013820 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Varun Reddy Yeturu3c9f89c2018-04-18 19:10:34 -070013821
13822 status = sme_acquire_global_lock(&mac->sme);
13823 if (QDF_IS_STATUS_SUCCESS(status)) {
13824 mac->sme.twt_enable_cb = twt_enable_cb;
13825 sme_release_global_lock(&mac->sme);
13826 sme_debug("TWT: enable callback set");
Varun Reddy Yeturu3c9f89c2018-04-18 19:10:34 -070013827 }
13828
13829 return status;
13830}
13831
Jeff Johnson3a08ff92018-07-03 19:40:44 -070013832QDF_STATUS sme_register_twt_disable_complete_cb(mac_handle_t mac_handle,
13833 twt_disable_cb twt_disable_cb)
Varun Reddy Yeturu3c9f89c2018-04-18 19:10:34 -070013834{
13835 QDF_STATUS status;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080013836 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Varun Reddy Yeturu3c9f89c2018-04-18 19:10:34 -070013837
13838 status = sme_acquire_global_lock(&mac->sme);
13839 if (QDF_IS_STATUS_SUCCESS(status)) {
13840 mac->sme.twt_disable_cb = twt_disable_cb;
13841 sme_release_global_lock(&mac->sme);
13842 sme_debug("TWT: disable callback set");
Varun Reddy Yeturu3c9f89c2018-04-18 19:10:34 -070013843 }
13844
13845 return status;
13846}
13847
Jeff Johnson3a08ff92018-07-03 19:40:44 -070013848QDF_STATUS sme_deregister_twt_enable_complete_cb(mac_handle_t mac_handle)
Varun Reddy Yeturu3c9f89c2018-04-18 19:10:34 -070013849{
Jeff Johnson3a08ff92018-07-03 19:40:44 -070013850 return sme_register_twt_enable_complete_cb(mac_handle, NULL);
Varun Reddy Yeturu3c9f89c2018-04-18 19:10:34 -070013851}
13852
Jeff Johnson3a08ff92018-07-03 19:40:44 -070013853QDF_STATUS sme_deregister_twt_disable_complete_cb(mac_handle_t mac_handle)
Varun Reddy Yeturu3c9f89c2018-04-18 19:10:34 -070013854{
Jeff Johnson3a08ff92018-07-03 19:40:44 -070013855 return sme_register_twt_disable_complete_cb(mac_handle, NULL);
Varun Reddy Yeturu3c9f89c2018-04-18 19:10:34 -070013856}
13857#endif
13858
Ashish Kumar Dhanotiyab28338c2017-07-21 20:12:34 +053013859QDF_STATUS sme_set_smps_cfg(uint32_t vdev_id, uint32_t param_id,
13860 uint32_t param_val)
13861{
13862 return wma_configure_smps_params(vdev_id, param_id, param_val);
13863}
13864
Jeff Johnsonc7309062018-11-09 20:59:42 -080013865QDF_STATUS sme_set_reorder_timeout(mac_handle_t mac_handle,
13866 struct sir_set_rx_reorder_timeout_val *req)
lifeng66831662017-05-19 16:01:35 +080013867{
13868 QDF_STATUS status;
Zhang Qian1e7649e2018-06-04 13:07:18 +080013869 tp_wma_handle wma_handle;
lifeng66831662017-05-19 16:01:35 +080013870
Zhang Qian1e7649e2018-06-04 13:07:18 +080013871 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
13872 status = wma_set_rx_reorder_timeout_val(wma_handle, req);
lifeng66831662017-05-19 16:01:35 +080013873
13874 return status;
13875}
13876
Jeff Johnsonc7309062018-11-09 20:59:42 -080013877QDF_STATUS sme_set_rx_set_blocksize(mac_handle_t mac_handle,
13878 struct sir_peer_set_rx_blocksize *req)
lifeng66831662017-05-19 16:01:35 +080013879{
13880 QDF_STATUS status;
Zhang Qian1e7649e2018-06-04 13:07:18 +080013881 tp_wma_handle wma_handle;
lifeng66831662017-05-19 16:01:35 +080013882
Zhang Qian1e7649e2018-06-04 13:07:18 +080013883 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
13884 status = wma_set_rx_blocksize(wma_handle, req);
lifeng66831662017-05-19 16:01:35 +080013885
13886 return status;
13887}
Naveen Rawat247a8682017-06-05 15:00:31 -070013888
13889int sme_cli_set_command(int vdev_id, int param_id, int sval, int vpdev)
13890{
13891 return wma_cli_set_command(vdev_id, param_id, sval, vpdev);
13892}
Vidyullatha Kanchanapallybe0ebb32017-03-23 14:36:21 +053013893
Vignesh Viswanathana851d752018-10-03 19:44:38 +053013894int sme_set_enable_mem_deep_sleep(mac_handle_t mac_handle, int vdev_id)
13895{
Jeff Johnson0a8786a2018-12-02 10:49:01 -080013896 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Vignesh Viswanathana851d752018-10-03 19:44:38 +053013897
13898 return wma_cli_set_command(vdev_id, WMI_PDEV_PARAM_HYST_EN,
13899 mac_ctx->mlme_cfg->gen.memory_deep_sleep,
13900 PDEV_CMD);
13901}
13902
13903int sme_set_cck_tx_fir_override(mac_handle_t mac_handle, int vdev_id)
13904{
Jeff Johnson0a8786a2018-12-02 10:49:01 -080013905 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Vignesh Viswanathana851d752018-10-03 19:44:38 +053013906
13907 return wma_cli_set_command(vdev_id,
13908 WMI_PDEV_PARAM_ENABLE_CCK_TXFIR_OVERRIDE,
13909 mac_ctx->mlme_cfg->gen.cck_tx_fir_override,
13910 PDEV_CMD);
13911}
13912
Jeff Johnsond0b6c7e2018-07-04 14:53:06 -070013913QDF_STATUS sme_set_bt_activity_info_cb(mac_handle_t mac_handle,
13914 bt_activity_info_cb cb)
Vidyullatha Kanchanapallybe0ebb32017-03-23 14:36:21 +053013915{
13916 QDF_STATUS status;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080013917 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Vidyullatha Kanchanapallybe0ebb32017-03-23 14:36:21 +053013918
13919 status = sme_acquire_global_lock(&mac->sme);
13920 if (QDF_IS_STATUS_SUCCESS(status)) {
13921 mac->sme.bt_activity_info_cb = cb;
13922 sme_release_global_lock(&mac->sme);
13923 sme_debug("bt activity info callback set");
Vidyullatha Kanchanapallybe0ebb32017-03-23 14:36:21 +053013924 }
13925
13926 return status;
13927}
lifengd217d192017-05-09 19:44:16 +080013928
Jeff Johnsonc7309062018-11-09 20:59:42 -080013929QDF_STATUS sme_get_chain_rssi(mac_handle_t mac_handle,
lifengd217d192017-05-09 19:44:16 +080013930 struct get_chain_rssi_req_params *input,
13931 get_chain_rssi_callback callback,
13932 void *context)
13933{
13934 QDF_STATUS status = QDF_STATUS_SUCCESS;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080013935 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Zhang Qian1e7649e2018-06-04 13:07:18 +080013936 tp_wma_handle wma_handle;
lifengd217d192017-05-09 19:44:16 +080013937
13938 SME_ENTER();
13939
13940 if (NULL == input) {
13941 sme_err("Invalid req params");
13942 return QDF_STATUS_E_INVAL;
13943 }
13944
13945 mac_ctx->sme.get_chain_rssi_cb = callback;
13946 mac_ctx->sme.get_chain_rssi_context = context;
Zhang Qian1e7649e2018-06-04 13:07:18 +080013947 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
13948 wma_get_chain_rssi(wma_handle, input);
lifengd217d192017-05-09 19:44:16 +080013949
13950 SME_EXIT();
13951 return status;
13952}
Vignesh Viswanathan66c951d2017-09-06 12:23:42 +053013953
Jeff Johnson0a8786a2018-12-02 10:49:01 -080013954QDF_STATUS sme_process_msg_callback(struct mac_context *mac,
Jeff Johnson5f9ce2d2018-06-09 21:20:45 -070013955 struct scheduler_msg *msg)
Sandeep Puligilla1426d612017-04-12 18:22:06 -070013956{
13957 QDF_STATUS status = QDF_STATUS_E_FAILURE;
13958
13959 if (msg == NULL) {
13960 sme_err("Empty message for SME Msg callback");
13961 return status;
13962 }
Jeff Johnson5f9ce2d2018-06-09 21:20:45 -070013963 status = sme_process_msg(mac, msg);
Sandeep Puligilla1426d612017-04-12 18:22:06 -070013964 return status;
13965}
13966
Jeff Johnsonc7309062018-11-09 20:59:42 -080013967void sme_display_disconnect_stats(mac_handle_t mac_handle, uint8_t session_id)
Vignesh Viswanathan66c951d2017-09-06 12:23:42 +053013968{
13969 struct csr_roam_session *session;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080013970 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Vignesh Viswanathan66c951d2017-09-06 12:23:42 +053013971
13972 if (!CSR_IS_SESSION_VALID(mac_ctx, session_id)) {
13973 sme_err("%s Invalid session id: %d", __func__, session_id);
13974 return;
13975 }
13976
13977 session = CSR_GET_SESSION(mac_ctx, session_id);
13978 if (!session) {
13979 sme_err("%s Failed to get session for id: %d",
13980 __func__, session_id);
13981 return;
13982 }
13983
Nirav Shahe6194ac2018-07-13 11:04:41 +053013984 sme_nofl_info("Total No. of Disconnections: %d",
13985 session->disconnect_stats.disconnection_cnt);
Vignesh Viswanathan66c951d2017-09-06 12:23:42 +053013986
Nirav Shahe6194ac2018-07-13 11:04:41 +053013987 sme_nofl_info("No. of Diconnects Triggered by Application: %d",
13988 session->disconnect_stats.disconnection_by_app);
Vignesh Viswanathan66c951d2017-09-06 12:23:42 +053013989
Nirav Shahe6194ac2018-07-13 11:04:41 +053013990 sme_nofl_info("No. of Disassoc Sent by Peer: %d",
13991 session->disconnect_stats.disassoc_by_peer);
Vignesh Viswanathan66c951d2017-09-06 12:23:42 +053013992
Nirav Shahe6194ac2018-07-13 11:04:41 +053013993 sme_nofl_info("No. of Deauth Sent by Peer: %d",
13994 session->disconnect_stats.deauth_by_peer);
Vignesh Viswanathan66c951d2017-09-06 12:23:42 +053013995
Nirav Shahe6194ac2018-07-13 11:04:41 +053013996 sme_nofl_info("No. of Disconnections due to Beacon Miss: %d",
13997 session->disconnect_stats.bmiss);
Vignesh Viswanathan66c951d2017-09-06 12:23:42 +053013998
Nirav Shahe6194ac2018-07-13 11:04:41 +053013999 sme_nofl_info("No. of Disconnections due to Peer Kickout: %d",
14000 session->disconnect_stats.peer_kickout);
Vignesh Viswanathan66c951d2017-09-06 12:23:42 +053014001}
Nachiket Kukadeaaf8a712017-07-27 19:15:36 +053014002
Rachit Kankanef6834c42018-08-02 18:47:50 +053014003#ifdef FEATURE_WLAN_DYNAMIC_CVM
Nachiket Kukade8983cf62017-10-12 18:14:48 +053014004 /**
14005 * sme_set_vc_mode_config() - Set voltage corner config to FW
14006 * @bitmap: Bitmap that referes to voltage corner config with
14007 * different phymode and bw configuration
14008 *
14009 * Return: QDF_STATUS
14010 */
14011QDF_STATUS sme_set_vc_mode_config(uint32_t vc_bitmap)
14012{
14013 void *wma_handle;
14014
14015 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
14016 if (!wma_handle) {
14017 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
14018 "wma_handle is NULL");
14019 return QDF_STATUS_E_FAILURE;
14020 }
14021 if (QDF_STATUS_SUCCESS !=
14022 wma_set_vc_mode_config(wma_handle, vc_bitmap)) {
14023 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
14024 "%s: Failed to set Voltage Control config to FW",
14025 __func__);
14026 return QDF_STATUS_E_FAILURE;
14027 }
14028 return QDF_STATUS_SUCCESS;
14029}
Rachit Kankanef6834c42018-08-02 18:47:50 +053014030#endif
Nachiket Kukade8983cf62017-10-12 18:14:48 +053014031
Nachiket Kukadeaaf8a712017-07-27 19:15:36 +053014032/**
14033 * sme_set_bmiss_bcnt() - set bmiss config parameters
14034 * @vdev_id: virtual device for the command
14035 * @first_cnt: bmiss first value
14036 * @final_cnt: bmiss final value
14037 *
14038 * Return: QDF_STATUS_SUCCESS or non-zero on failure
14039 */
14040QDF_STATUS sme_set_bmiss_bcnt(uint32_t vdev_id, uint32_t first_cnt,
14041 uint32_t final_cnt)
14042{
14043 return wma_config_bmiss_bcnt_params(vdev_id, first_cnt, final_cnt);
14044}
Ganesh Kondabattini479a8ae2017-10-03 16:49:24 +053014045
Jeff Johnsonc7309062018-11-09 20:59:42 -080014046QDF_STATUS sme_send_limit_off_channel_params(mac_handle_t mac_handle,
14047 uint8_t vdev_id,
14048 bool is_tos_active,
14049 uint32_t max_off_chan_time,
14050 uint32_t rest_time,
14051 bool skip_dfs_chan)
Ganesh Kondabattini479a8ae2017-10-03 16:49:24 +053014052{
14053 struct sir_limit_off_chan *cmd;
14054 struct scheduler_msg msg = {0};
14055
14056 cmd = qdf_mem_malloc(sizeof(*cmd));
Arif Hussain0ef77082018-10-10 16:42:53 -070014057 if (!cmd)
Ganesh Kondabattini479a8ae2017-10-03 16:49:24 +053014058 return QDF_STATUS_E_NOMEM;
Ganesh Kondabattini479a8ae2017-10-03 16:49:24 +053014059
14060 cmd->vdev_id = vdev_id;
14061 cmd->is_tos_active = is_tos_active;
14062 cmd->max_off_chan_time = max_off_chan_time;
14063 cmd->rest_time = rest_time;
14064 cmd->skip_dfs_chans = skip_dfs_chan;
14065
14066 msg.type = WMA_SET_LIMIT_OFF_CHAN;
14067 msg.reserved = 0;
14068 msg.bodyptr = cmd;
14069
gaurank kathpalia36b0c582018-08-28 17:45:43 +053014070 if (!QDF_IS_STATUS_SUCCESS(scheduler_post_message(QDF_MODULE_ID_SME,
14071 QDF_MODULE_ID_WMA,
14072 QDF_MODULE_ID_WMA,
14073 &msg))) {
Ganesh Kondabattini479a8ae2017-10-03 16:49:24 +053014074 sme_err("Not able to post WMA_SET_LIMIT_OFF_CHAN to WMA");
14075 qdf_mem_free(cmd);
14076 return QDF_STATUS_E_FAILURE;
14077 }
14078
14079 return QDF_STATUS_SUCCESS;
14080}
Vignesh Viswanathan9dd88d32017-11-22 14:22:03 +053014081
Jeff Johnsonc7309062018-11-09 20:59:42 -080014082uint32_t sme_unpack_rsn_ie(mac_handle_t mac_handle, uint8_t *buf,
Qiwei Caie689a262018-07-26 15:50:22 +080014083 uint8_t buf_len, tDot11fIERSN *rsn_ie,
14084 bool append_ie)
14085{
Jeff Johnson0a8786a2018-12-02 10:49:01 -080014086 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Qiwei Caie689a262018-07-26 15:50:22 +080014087
14088 return dot11f_unpack_ie_rsn(mac_ctx, buf, buf_len, rsn_ie, append_ie);
14089}
14090
14091#ifdef FEATURE_BSS_TRANSITION
Vignesh Viswanathan9dd88d32017-11-22 14:22:03 +053014092/**
14093 * sme_get_status_for_candidate() - Get bss transition status for candidate
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -080014094 * @mac_handle: Opaque handle to the global MAC context
Vignesh Viswanathan9dd88d32017-11-22 14:22:03 +053014095 * @conn_bss_desc: connected bss descriptor
14096 * @bss_desc: candidate bss descriptor
14097 * @info: candiadate bss information
14098 * @trans_reason: transition reason code
14099 * @is_bt_in_progress: bt activity indicator
14100 *
14101 * Return : true if candidate is rejected and reject reason is filled
14102 * @info->status. Otherwise returns false.
14103 */
Jeff Johnsonc7309062018-11-09 20:59:42 -080014104static bool sme_get_status_for_candidate(mac_handle_t mac_handle,
14105 tSirBssDescription *conn_bss_desc,
14106 tSirBssDescription *bss_desc,
14107 struct bss_candidate_info *info,
14108 uint8_t trans_reason,
14109 bool is_bt_in_progress)
Vignesh Viswanathan9dd88d32017-11-22 14:22:03 +053014110{
Jeff Johnson0a8786a2018-12-02 10:49:01 -080014111 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Pragaspathi Thilagarajcd6aef02018-09-11 20:30:23 +053014112 struct wlan_mlme_mbo *mbo_cfg;
14113 int8_t current_rssi_mcc_thres;
14114
14115 if (!(mac_ctx->mlme_cfg)) {
14116 pe_err("mlme cfg is NULL");
14117 return false;
14118 }
14119 mbo_cfg = &mac_ctx->mlme_cfg->mbo_cfg;
Vignesh Viswanathan9dd88d32017-11-22 14:22:03 +053014120
14121 /*
14122 * Low RSSI based rejection
14123 * If candidate rssi is less than mbo_candidate_rssi_thres and connected
14124 * bss rssi is greater than mbo_current_rssi_thres, then reject the
14125 * candidate with MBO reason code 4.
14126 */
Pragaspathi Thilagarajcd6aef02018-09-11 20:30:23 +053014127 if ((bss_desc->rssi < mbo_cfg->mbo_candidate_rssi_thres) &&
14128 (conn_bss_desc->rssi > mbo_cfg->mbo_current_rssi_thres)) {
Vignesh Viswanathan9dd88d32017-11-22 14:22:03 +053014129 sme_err("Candidate BSS "MAC_ADDRESS_STR" has LOW RSSI(%d), hence reject",
14130 MAC_ADDR_ARRAY(bss_desc->bssId), bss_desc->rssi);
14131 info->status = QCA_STATUS_REJECT_LOW_RSSI;
14132 return true;
14133 }
14134
14135 if (trans_reason == MBO_TRANSITION_REASON_LOAD_BALANCING ||
14136 trans_reason == MBO_TRANSITION_REASON_TRANSITIONING_TO_PREMIUM_AP) {
14137 /*
14138 * MCC rejection
14139 * If moving to candidate's channel will result in MCC scenario
14140 * and the rssi of connected bss is greater than
14141 * mbo_current_rssi_mss_thres, then reject the candidate with
14142 * MBO reason code 3.
14143 */
Pragaspathi Thilagarajcd6aef02018-09-11 20:30:23 +053014144 current_rssi_mcc_thres = mbo_cfg->mbo_current_rssi_mcc_thres;
14145 if ((conn_bss_desc->rssi > current_rssi_mcc_thres) &&
Jeff Johnson9d118852018-06-10 16:54:59 -070014146 csr_is_mcc_channel(mac_ctx, bss_desc->channelId)) {
Vignesh Viswanathan9dd88d32017-11-22 14:22:03 +053014147 sme_err("Candidate BSS "MAC_ADDRESS_STR" causes MCC, hence reject",
14148 MAC_ADDR_ARRAY(bss_desc->bssId));
14149 info->status =
14150 QCA_STATUS_REJECT_INSUFFICIENT_QOS_CAPACITY;
14151 return true;
14152 }
14153
14154 /*
14155 * BT coex rejection
14156 * If AP is trying to move the client from 5G to 2.4G and moving
14157 * to 2.4G will result in BT coex and candidate channel rssi is
14158 * less than mbo_candidate_rssi_btc_thres, then reject the
14159 * candidate with MBO reason code 2.
14160 */
14161 if (WLAN_REG_IS_5GHZ_CH(conn_bss_desc->channelId) &&
14162 WLAN_REG_IS_24GHZ_CH(bss_desc->channelId) &&
14163 is_bt_in_progress &&
Pragaspathi Thilagarajcd6aef02018-09-11 20:30:23 +053014164 (bss_desc->rssi < mbo_cfg->mbo_candidate_rssi_btc_thres)) {
Vignesh Viswanathan9dd88d32017-11-22 14:22:03 +053014165 sme_err("Candidate BSS "MAC_ADDRESS_STR" causes BT coex, hence reject",
14166 MAC_ADDR_ARRAY(bss_desc->bssId));
14167 info->status =
14168 QCA_STATUS_REJECT_EXCESSIVE_DELAY_EXPECTED;
14169 return true;
14170 }
14171
14172 /*
14173 * LTE coex rejection
14174 * If moving to candidate's channel can cause LTE coex, then
14175 * reject the candidate with MBO reason code 5.
14176 */
14177 if (policy_mgr_is_safe_channel(mac_ctx->psoc,
14178 conn_bss_desc->channelId) &&
14179 !(policy_mgr_is_safe_channel(mac_ctx->psoc,
14180 bss_desc->channelId))) {
14181 sme_err("High interference expected if transitioned to BSS "
14182 MAC_ADDRESS_STR" hence reject",
14183 MAC_ADDR_ARRAY(bss_desc->bssId));
14184 info->status =
14185 QCA_STATUS_REJECT_HIGH_INTERFERENCE;
14186 return true;
14187 }
14188 }
14189
14190 return false;
14191}
14192
Jeff Johnson62737252018-11-17 10:59:43 -080014193QDF_STATUS sme_get_bss_transition_status(mac_handle_t mac_handle,
14194 uint8_t transition_reason,
14195 struct qdf_mac_addr *bssid,
14196 struct bss_candidate_info *info,
14197 uint16_t n_candidates,
14198 bool is_bt_in_progress)
Vignesh Viswanathan9dd88d32017-11-22 14:22:03 +053014199{
14200 QDF_STATUS status = QDF_STATUS_SUCCESS;
14201 tSirBssDescription *bss_desc, *conn_bss_desc;
14202 tCsrScanResultInfo *res, *conn_res;
14203 uint16_t i;
14204
14205 if (!n_candidates || !info) {
14206 sme_err("No candidate info available");
14207 return QDF_STATUS_E_INVAL;
14208 }
14209
14210 conn_res = qdf_mem_malloc(sizeof(tCsrScanResultInfo));
Arif Hussain0ef77082018-10-10 16:42:53 -070014211 if (!conn_res)
Vignesh Viswanathan9dd88d32017-11-22 14:22:03 +053014212 return QDF_STATUS_E_NOMEM;
Vignesh Viswanathan9dd88d32017-11-22 14:22:03 +053014213
14214 res = qdf_mem_malloc(sizeof(tCsrScanResultInfo));
14215 if (!res) {
Vignesh Viswanathan9dd88d32017-11-22 14:22:03 +053014216 status = QDF_STATUS_E_NOMEM;
14217 goto free;
14218 }
14219
14220 /* Get the connected BSS descriptor */
Jeff Johnsonc7309062018-11-09 20:59:42 -080014221 status = sme_scan_get_result_for_bssid(mac_handle, bssid, conn_res);
Vignesh Viswanathan9dd88d32017-11-22 14:22:03 +053014222 if (!QDF_IS_STATUS_SUCCESS(status)) {
14223 sme_err("Failed to find connected BSS in scan list");
14224 goto free;
14225 }
14226 conn_bss_desc = &conn_res->BssDescriptor;
14227
14228 for (i = 0; i < n_candidates; i++) {
14229 /* Get candidate BSS descriptors */
Jeff Johnsonc7309062018-11-09 20:59:42 -080014230 status = sme_scan_get_result_for_bssid(mac_handle,
14231 &info[i].bssid,
Vignesh Viswanathan9dd88d32017-11-22 14:22:03 +053014232 res);
14233 if (!QDF_IS_STATUS_SUCCESS(status)) {
14234 sme_err("BSS "MAC_ADDRESS_STR" not present in scan list",
14235 MAC_ADDR_ARRAY(info[i].bssid.bytes));
14236 info[i].status = QCA_STATUS_REJECT_UNKNOWN;
14237 continue;
14238 }
14239
14240 bss_desc = &res->BssDescriptor;
Jeff Johnsonc7309062018-11-09 20:59:42 -080014241 if (!sme_get_status_for_candidate(mac_handle, conn_bss_desc,
14242 bss_desc, &info[i],
14243 transition_reason,
14244 is_bt_in_progress)) {
Vignesh Viswanathan9dd88d32017-11-22 14:22:03 +053014245 /*
14246 * If status is not over written, it means it is a
14247 * candidate for accept.
14248 */
14249 info[i].status = QCA_STATUS_ACCEPT;
14250 }
14251 }
14252
14253 /* success */
14254 status = QDF_STATUS_SUCCESS;
14255
14256free:
14257 /* free allocated memory */
14258 if (conn_res)
14259 qdf_mem_free(conn_res);
14260 if (res)
14261 qdf_mem_free(res);
14262
14263 return status;
14264}
Qiwei Caie689a262018-07-26 15:50:22 +080014265#endif /* FEATURE_BSS_TRANSITION */
Vignesh Viswanathan9dd88d32017-11-22 14:22:03 +053014266
Jeff Johnsonc7309062018-11-09 20:59:42 -080014267bool sme_is_conn_state_connected(mac_handle_t mac_handle, uint8_t session_id)
Vignesh Viswanathan79f7e3f2018-09-30 23:56:10 +053014268{
Jeff Johnson0a8786a2018-12-02 10:49:01 -080014269 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Vignesh Viswanathan79f7e3f2018-09-30 23:56:10 +053014270
14271 return csr_is_conn_state_connected(mac_ctx, session_id);
14272}
14273
Jeff Johnsonc7309062018-11-09 20:59:42 -080014274void sme_enable_roaming_on_connected_sta(mac_handle_t mac_handle)
Abhishek Singh1f217ec2017-12-22 11:48:27 +053014275{
14276 uint8_t session_id;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080014277 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Abhishek Singh1f217ec2017-12-22 11:48:27 +053014278 QDF_STATUS status;
14279
14280 session_id = csr_get_roam_enabled_sta_sessionid(mac_ctx);
14281 if (session_id != CSR_SESSION_ID_INVALID)
14282 return;
14283
14284 session_id = csr_get_connected_infra(mac_ctx);
14285 if (session_id == CSR_SESSION_ID_INVALID) {
14286 sme_debug("No STA in conencted state");
14287 return;
14288 }
14289
14290 sme_debug("Roaming not enabled on any STA, enable roaming on session %d",
14291 session_id);
14292 status = sme_acquire_global_lock(&mac_ctx->sme);
14293 if (QDF_IS_STATUS_SUCCESS(status)) {
14294 csr_roam_offload_scan(mac_ctx, session_id,
14295 ROAM_SCAN_OFFLOAD_START,
14296 REASON_CTX_INIT);
14297 sme_release_global_lock(&mac_ctx->sme);
14298 }
Sandeep Puligilla063a4342018-01-10 02:50:14 -080014299}
Abhishek Singh1f217ec2017-12-22 11:48:27 +053014300
Sandeep Puligilla063a4342018-01-10 02:50:14 -080014301int16_t sme_get_oper_chan_freq(struct wlan_objmgr_vdev *vdev)
14302{
14303 uint8_t vdev_id, chan;
14304 struct csr_roam_session *session;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080014305 struct mac_context *mac_ctx;
Jeff Johnsonb460dd72018-11-08 10:26:51 -080014306 mac_handle_t mac_handle;
Sandeep Puligilla063a4342018-01-10 02:50:14 -080014307 int16_t freq = 0;
14308
14309 if (vdev == NULL) {
14310 sme_err("Invalid vdev id is passed");
14311 return 0;
14312 }
14313
Jeff Johnsonb460dd72018-11-08 10:26:51 -080014314 mac_handle = cds_get_context(QDF_MODULE_ID_SME);
14315 if (!mac_handle) {
14316 sme_err("mac_handle is null");
Arif Hussaind15902c2018-03-02 00:08:29 -080014317 return 0;
14318 }
Jeff Johnsona0619e42018-11-28 17:43:00 -080014319 mac_ctx = MAC_CONTEXT(mac_handle);
Sandeep Puligilla063a4342018-01-10 02:50:14 -080014320 vdev_id = wlan_vdev_get_id(vdev);
14321 if (!CSR_IS_SESSION_VALID(mac_ctx, vdev_id)) {
14322 sme_err("Invalid vdev id is passed");
14323 return 0;
14324 }
14325
14326 session = CSR_GET_SESSION(mac_ctx, vdev_id);
14327 chan = csr_get_infra_operation_channel(mac_ctx, vdev_id);
14328 if (chan)
14329 freq = cds_chan_to_freq(chan);
14330
14331 return freq;
14332}
14333
14334enum phy_ch_width sme_get_oper_ch_width(struct wlan_objmgr_vdev *vdev)
14335{
14336 uint8_t vdev_id;
14337 struct csr_roam_session *session;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080014338 struct mac_context *mac_ctx;
Jeff Johnsonb460dd72018-11-08 10:26:51 -080014339 mac_handle_t mac_handle;
Sandeep Puligilla063a4342018-01-10 02:50:14 -080014340 enum phy_ch_width ch_width = CH_WIDTH_20MHZ;
14341
14342 if (vdev == NULL) {
14343 sme_err("Invalid vdev id is passed");
14344 return CH_WIDTH_INVALID;
14345 }
14346
Jeff Johnsonb460dd72018-11-08 10:26:51 -080014347 mac_handle = cds_get_context(QDF_MODULE_ID_SME);
14348 if (!mac_handle) {
14349 sme_err("mac_handle is null");
Arif Hussaind15902c2018-03-02 00:08:29 -080014350 return CH_WIDTH_INVALID;
14351 }
Jeff Johnsona0619e42018-11-28 17:43:00 -080014352 mac_ctx = MAC_CONTEXT(mac_handle);
Sandeep Puligilla063a4342018-01-10 02:50:14 -080014353 vdev_id = wlan_vdev_get_id(vdev);
14354 if (!CSR_IS_SESSION_VALID(mac_ctx, vdev_id)) {
14355 sme_err("Invalid vdev id is passed");
14356 return CH_WIDTH_INVALID;
14357 }
14358
14359 session = CSR_GET_SESSION(mac_ctx, vdev_id);
14360
14361 if (csr_is_conn_state_connected(mac_ctx, vdev_id))
14362 ch_width = session->connectedProfile.vht_channel_width;
14363
14364 return ch_width;
14365}
14366
14367int sme_get_sec20chan_freq_mhz(struct wlan_objmgr_vdev *vdev,
14368 uint16_t *sec20chan_freq)
14369{
14370 uint8_t vdev_id;
14371
14372 vdev_id = wlan_vdev_get_id(vdev);
14373 /* Need to extend */
14374 return 0;
Abhishek Singh1f217ec2017-12-22 11:48:27 +053014375}
14376
Padma, Santhosh Kumardd3f4852018-01-16 18:51:51 +053014377#ifdef WLAN_FEATURE_SAE
Jeff Johnsonc7309062018-11-09 20:59:42 -080014378QDF_STATUS sme_handle_sae_msg(mac_handle_t mac_handle, uint8_t session_id,
14379 uint8_t sae_status)
Padma, Santhosh Kumardd3f4852018-01-16 18:51:51 +053014380{
14381 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080014382 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Padma, Santhosh Kumardd3f4852018-01-16 18:51:51 +053014383 struct sir_sae_msg *sae_msg;
14384 struct scheduler_msg sch_msg = {0};
14385
14386 qdf_status = sme_acquire_global_lock(&mac->sme);
14387 if (QDF_IS_STATUS_SUCCESS(qdf_status)) {
14388 sae_msg = qdf_mem_malloc(sizeof(*sae_msg));
14389 if (!sae_msg) {
14390 qdf_status = QDF_STATUS_E_NOMEM;
Padma, Santhosh Kumardd3f4852018-01-16 18:51:51 +053014391 } else {
14392 sae_msg->message_type = eWNI_SME_SEND_SAE_MSG;
14393 sae_msg->length = sizeof(*sae_msg);
14394 sae_msg->session_id = session_id;
14395 sae_msg->sae_status = sae_status;
14396 sme_debug("SAE: sae_status %d session_id %d",
14397 sae_msg->sae_status,
14398 sae_msg->session_id);
14399
14400 sch_msg.type = eWNI_SME_SEND_SAE_MSG;
14401 sch_msg.bodyptr = sae_msg;
14402
14403 qdf_status =
gaurank kathpalia36b0c582018-08-28 17:45:43 +053014404 scheduler_post_message(QDF_MODULE_ID_SME,
14405 QDF_MODULE_ID_PE,
14406 QDF_MODULE_ID_PE,
Jeff Johnsonc7309062018-11-09 20:59:42 -080014407 &sch_msg);
Padma, Santhosh Kumardd3f4852018-01-16 18:51:51 +053014408 }
14409 sme_release_global_lock(&mac->sme);
14410 }
14411
14412 return qdf_status;
14413}
14414#endif
Vignesh Viswanathan0a569292018-02-14 15:34:47 +053014415
Jeff Johnsonc7309062018-11-09 20:59:42 -080014416bool sme_is_sta_key_exchange_in_progress(mac_handle_t mac_handle,
14417 uint8_t session_id)
Vignesh Viswanathan0a569292018-02-14 15:34:47 +053014418{
Jeff Johnson0a8786a2018-12-02 10:49:01 -080014419 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Vignesh Viswanathan0a569292018-02-14 15:34:47 +053014420
14421 if (!CSR_IS_SESSION_VALID(mac_ctx, session_id)) {
14422 sme_err("Invalid session id: %d", session_id);
14423 return false;
14424 }
14425
14426 return CSR_IS_WAIT_FOR_KEY(mac_ctx, session_id);
14427}
Vignesh Viswanathana2f5ce582018-05-09 20:38:39 +053014428
Jeff Johnsonc7309062018-11-09 20:59:42 -080014429bool sme_validate_channel_list(mac_handle_t mac_handle,
14430 uint8_t *chan_list,
14431 uint8_t num_channels)
Vignesh Viswanathana2f5ce582018-05-09 20:38:39 +053014432{
Jeff Johnson0a8786a2018-12-02 10:49:01 -080014433 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Vignesh Viswanathana2f5ce582018-05-09 20:38:39 +053014434 uint8_t i = 0;
14435 uint8_t j;
14436 bool found;
14437 struct csr_channel *ch_lst_info = &mac_ctx->scan.base_channels;
14438
14439 if (!chan_list || !num_channels) {
14440 sme_err("Chan list empty %pK or num_channels is 0", chan_list);
14441 return false;
14442 }
14443
14444 while (i < num_channels) {
14445 found = false;
14446 for (j = 0; j < ch_lst_info->numChannels; j++) {
14447 if (ch_lst_info->channelList[j] == chan_list[i]) {
14448 found = true;
14449 break;
14450 }
14451 }
14452
14453 if (!found) {
14454 sme_debug("Invalid channel %d", chan_list[i]);
14455 return false;
14456 }
14457
14458 i++;
14459 }
Arif Hussain0e246802018-05-01 18:13:44 -070014460
Vignesh Viswanathana2f5ce582018-05-09 20:38:39 +053014461 return true;
14462}
Arif Hussain0e246802018-05-01 18:13:44 -070014463
Jeff Johnsonc7309062018-11-09 20:59:42 -080014464void sme_set_amsdu(mac_handle_t mac_handle, bool enable)
Arif Hussain0e246802018-05-01 18:13:44 -070014465{
Jeff Johnson0a8786a2018-12-02 10:49:01 -080014466 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Arif Hussain0e246802018-05-01 18:13:44 -070014467 mac_ctx->is_usr_cfg_amsdu_enabled = enable;
14468}
Naveen Rawatfa2a1002018-05-17 16:06:37 -070014469
14470uint8_t sme_get_mcs_idx(uint16_t max_rate, uint8_t rate_flags,
Hanumanth Reddy Pothula834f9432018-05-30 14:20:32 +053014471 uint8_t *nss, uint8_t *mcs_rate_flags)
Naveen Rawatfa2a1002018-05-17 16:06:37 -070014472{
14473 return wma_get_mcs_idx(max_rate, rate_flags, nss, mcs_rate_flags);
14474}
Chaoli Zhou75b062f2018-06-11 12:36:54 +080014475
Jeff Johnsonc7309062018-11-09 20:59:42 -080014476bool sme_find_session_by_bssid(mac_handle_t mac_handle, uint8_t *bssid)
Chaoli Zhou75b062f2018-06-11 12:36:54 +080014477{
Jeff Johnson0a8786a2018-12-02 10:49:01 -080014478 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Chaoli Zhou75b062f2018-06-11 12:36:54 +080014479 bool ret;
14480
14481 ret = csr_find_session_by_bssid(mac_ctx, bssid);
14482
14483 return ret;
14484}
Rajeev Kumar Sirasanagandla4f20b672018-03-12 13:52:50 +053014485
Krunal Soni5e483782018-10-25 15:42:44 -070014486#ifdef FEATURE_WLAN_DIAG_SUPPORT_CSR
14487QDF_STATUS sme_get_sta_cxn_info(mac_handle_t mac_handle, uint32_t session_id,
14488 char *buf, uint32_t buf_sz)
14489{
14490 QDF_STATUS status;
14491 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
14492 struct tagCsrRoamConnectedProfile *conn_profile;
14493 struct csr_roam_session *session = CSR_GET_SESSION(mac_ctx, session_id);
14494
14495 status = sme_acquire_global_lock(&mac_ctx->sme);
14496 if (!QDF_IS_STATUS_SUCCESS(status))
14497 return status;
14498 if (!session || !session->pCurRoamProfile) {
14499 status = QDF_STATUS_E_FAILURE;
14500 goto end;
14501 }
14502 conn_profile = &session->connectedProfile;
14503 if (!conn_profile) {
14504 status = QDF_STATUS_E_FAILURE;
14505 goto end;
14506 }
14507 csr_get_sta_cxn_info(mac_ctx, session, conn_profile, buf, buf_sz);
14508end:
14509 sme_release_global_lock(&mac_ctx->sme);
14510
14511 return status;
14512}
14513#endif
Rajeev Kumar Sirasanagandla4f20b672018-03-12 13:52:50 +053014514QDF_STATUS
Jeff Johnsonc7309062018-11-09 20:59:42 -080014515sme_get_roam_scan_stats(mac_handle_t mac_handle,
14516 roam_scan_stats_cb cb, void *context,
Rajeev Kumar Sirasanagandla4f20b672018-03-12 13:52:50 +053014517 uint32_t vdev_id)
14518{
14519 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080014520 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Rajeev Kumar Sirasanagandla4f20b672018-03-12 13:52:50 +053014521 struct scheduler_msg msg = {0};
14522 struct sir_roam_scan_stats *req;
14523
14524 req = qdf_mem_malloc(sizeof(*req));
Arif Hussain0ef77082018-10-10 16:42:53 -070014525 if (!req)
Rajeev Kumar Sirasanagandla4f20b672018-03-12 13:52:50 +053014526 return QDF_STATUS_E_NOMEM;
Rajeev Kumar Sirasanagandla4f20b672018-03-12 13:52:50 +053014527
14528 req->vdev_id = vdev_id;
14529 req->cb = cb;
14530 req->context = context;
14531
14532 status = sme_acquire_global_lock(&mac->sme);
14533 if (QDF_IS_STATUS_SUCCESS(status)) {
14534 msg.bodyptr = req;
14535 msg.type = WMA_GET_ROAM_SCAN_STATS;
14536 msg.reserved = 0;
gaurank kathpalia36b0c582018-08-28 17:45:43 +053014537 status = scheduler_post_message(QDF_MODULE_ID_SME,
14538 QDF_MODULE_ID_WMA,
14539 QDF_MODULE_ID_WMA,
14540 &msg);
Rajeev Kumar Sirasanagandla4f20b672018-03-12 13:52:50 +053014541 sme_release_global_lock(&mac->sme);
14542 if (!QDF_IS_STATUS_SUCCESS(status)) {
14543 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
14544 FL("post roam scan stats req failed"));
14545 status = QDF_STATUS_E_FAILURE;
14546 qdf_mem_free(req);
14547 }
14548 } else {
Rajeev Kumar Sirasanagandla4f20b672018-03-12 13:52:50 +053014549 qdf_mem_free(req);
14550 }
14551
14552 return status;
14553}
Vignesh Viswanathan987f0bb2018-09-17 17:00:29 +053014554
Jeff Johnsonc7309062018-11-09 20:59:42 -080014555void sme_update_score_config(mac_handle_t mac_handle,
Vignesh Viswanathan987f0bb2018-09-17 17:00:29 +053014556 struct scoring_config *score_config)
14557{
Jeff Johnson0a8786a2018-12-02 10:49:01 -080014558 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Vignesh Viswanathan987f0bb2018-09-17 17:00:29 +053014559 struct wlan_mlme_scoring_cfg *mlme_scoring_cfg;
14560
14561 mlme_scoring_cfg = &mac_ctx->mlme_cfg->scoring;
14562
14563 score_config->weight_cfg.rssi_weightage =
14564 mlme_scoring_cfg->weight_cfg.rssi_weightage;
14565 score_config->weight_cfg.ht_caps_weightage =
14566 mlme_scoring_cfg->weight_cfg.ht_caps_weightage;
14567 score_config->weight_cfg.vht_caps_weightage =
14568 mlme_scoring_cfg->weight_cfg.vht_caps_weightage;
14569 score_config->weight_cfg.he_caps_weightage =
14570 mlme_scoring_cfg->weight_cfg.he_caps_weightage;
14571 score_config->weight_cfg.chan_width_weightage =
14572 mlme_scoring_cfg->weight_cfg.chan_width_weightage;
14573 score_config->weight_cfg.chan_band_weightage =
14574 mlme_scoring_cfg->weight_cfg.chan_band_weightage;
14575 score_config->weight_cfg.nss_weightage =
14576 mlme_scoring_cfg->weight_cfg.nss_weightage;
14577 score_config->weight_cfg.beamforming_cap_weightage =
14578 mlme_scoring_cfg->weight_cfg.beamforming_cap_weightage;
14579 score_config->weight_cfg.pcl_weightage =
14580 mlme_scoring_cfg->weight_cfg.pcl_weightage;
14581 score_config->weight_cfg.channel_congestion_weightage =
14582 mlme_scoring_cfg->weight_cfg.channel_congestion_weightage;
14583 score_config->weight_cfg.oce_wan_weightage =
14584 mlme_scoring_cfg->weight_cfg.oce_wan_weightage;
14585
14586 score_config->bandwidth_weight_per_index =
14587 mlme_scoring_cfg->bandwidth_weight_per_index;
14588 score_config->nss_weight_per_index =
14589 mlme_scoring_cfg->nss_weight_per_index;
14590 score_config->band_weight_per_index =
14591 mlme_scoring_cfg->band_weight_per_index;
14592
14593 score_config->rssi_score.best_rssi_threshold =
14594 mlme_scoring_cfg->rssi_score.best_rssi_threshold;
14595 score_config->rssi_score.good_rssi_threshold =
14596 mlme_scoring_cfg->rssi_score.good_rssi_threshold;
14597 score_config->rssi_score.bad_rssi_threshold =
14598 mlme_scoring_cfg->rssi_score.bad_rssi_threshold;
14599 score_config->rssi_score.good_rssi_pcnt =
14600 mlme_scoring_cfg->rssi_score.good_rssi_pcnt;
14601 score_config->rssi_score.bad_rssi_pcnt =
14602 mlme_scoring_cfg->rssi_score.bad_rssi_pcnt;
14603 score_config->rssi_score.good_rssi_bucket_size =
14604 mlme_scoring_cfg->rssi_score.good_rssi_bucket_size;
14605 score_config->rssi_score.bad_rssi_bucket_size =
14606 mlme_scoring_cfg->rssi_score.bad_rssi_bucket_size;
14607 score_config->rssi_score.rssi_pref_5g_rssi_thresh =
14608 mlme_scoring_cfg->rssi_score.rssi_pref_5g_rssi_thresh;
14609
14610 score_config->esp_qbss_scoring.num_slot =
14611 mlme_scoring_cfg->esp_qbss_scoring.num_slot;
14612 score_config->esp_qbss_scoring.score_pcnt3_to_0 =
14613 mlme_scoring_cfg->esp_qbss_scoring.score_pcnt3_to_0;
14614 score_config->esp_qbss_scoring.score_pcnt7_to_4 =
14615 mlme_scoring_cfg->esp_qbss_scoring.score_pcnt7_to_4;
14616 score_config->esp_qbss_scoring.score_pcnt11_to_8 =
14617 mlme_scoring_cfg->esp_qbss_scoring.score_pcnt11_to_8;
14618 score_config->esp_qbss_scoring.score_pcnt15_to_12 =
14619 mlme_scoring_cfg->esp_qbss_scoring.score_pcnt15_to_12;
14620
14621 score_config->oce_wan_scoring.num_slot =
14622 mlme_scoring_cfg->oce_wan_scoring.num_slot;
14623 score_config->oce_wan_scoring.score_pcnt3_to_0 =
14624 mlme_scoring_cfg->oce_wan_scoring.score_pcnt3_to_0;
14625 score_config->oce_wan_scoring.score_pcnt7_to_4 =
14626 mlme_scoring_cfg->oce_wan_scoring.score_pcnt7_to_4;
14627 score_config->oce_wan_scoring.score_pcnt11_to_8 =
14628 mlme_scoring_cfg->oce_wan_scoring.score_pcnt11_to_8;
14629 score_config->oce_wan_scoring.score_pcnt15_to_12 =
14630 mlme_scoring_cfg->oce_wan_scoring.score_pcnt15_to_12;
14631}
lifengfaa83cb2018-11-24 01:53:56 +080014632
14633void sme_enable_fw_module_log_level(mac_handle_t mac_handle, int vdev_id)
14634{
14635 QDF_STATUS status;
14636 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
14637 uint8_t *enable_fw_module_log_level;
14638 uint8_t enable_fw_module_log_level_num;
14639 uint8_t count = 0;
14640 uint32_t value = 0;
14641 int ret;
14642
14643 status = ucfg_fwol_get_enable_fw_module_log_level(
14644 mac_ctx->psoc, &enable_fw_module_log_level,
14645 &enable_fw_module_log_level_num);
14646 if (QDF_IS_STATUS_ERROR(status))
14647 return;
14648
14649 while (count < enable_fw_module_log_level_num) {
14650 /*
14651 * FW module log level input array looks like
14652 * below:
14653 * enable_fw_module_log_level = {<FW Module ID>,
14654 * <Log Level>,...}
14655 * For example:
14656 * enable_fw_module_log_level=
14657 * {1,0,2,1,3,2,4,3,5,4,6,5,7,6}
14658 * Above input array means :
14659 * For FW module ID 1 enable log level 0
14660 * For FW module ID 2 enable log level 1
14661 * For FW module ID 3 enable log level 2
14662 * For FW module ID 4 enable log level 3
14663 * For FW module ID 5 enable log level 4
14664 * For FW module ID 6 enable log level 5
14665 * For FW module ID 7 enable log level 6
14666 */
14667
14668 if ((enable_fw_module_log_level[count] > WLAN_MODULE_ID_MAX) ||
14669 (enable_fw_module_log_level[count + 1] > DBGLOG_LVL_MAX)) {
14670 sme_err("Module id %d or dbglog level %d input value is more than max",
14671 enable_fw_module_log_level[count],
14672 enable_fw_module_log_level[count + 1]);
wadesongeb865bb2019-01-09 19:01:06 +080014673 count += 2;
lifengfaa83cb2018-11-24 01:53:56 +080014674 continue;
14675 }
14676
14677 value = enable_fw_module_log_level[count] << 16;
14678 value |= enable_fw_module_log_level[count + 1];
14679 ret = sme_cli_set_command(vdev_id,
14680 WMI_DBGLOG_MOD_LOG_LEVEL,
14681 value, DBG_CMD);
14682 if (ret != 0)
14683 sme_err("Failed to enable FW module log level %d ret %d",
14684 value, ret);
14685
14686 count += 2;
14687 }
14688}
Visweswara Tanuku633976b2019-01-07 16:13:12 +053014689
14690#ifdef WLAN_FEATURE_MOTION_DETECTION
14691/**
14692 * sme_set_md_host_evt_cb - Register/set motion detection callback
14693 * @mac_handle: mac handle
14694 * @callback_fn: motion detection callback function pointer
14695 * @hdd_ctx: hdd context
14696 *
14697 * Return: QDF_STATUS_SUCCESS or non-zero on failure
14698 */
14699QDF_STATUS sme_set_md_host_evt_cb(
14700 mac_handle_t mac_handle,
14701 QDF_STATUS (*callback_fn)(void *ctx, struct sir_md_evt *event),
14702 void *hdd_ctx
14703)
14704{
14705 struct mac_context *mac = MAC_CONTEXT(mac_handle);
14706 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
14707
14708 qdf_status = sme_acquire_global_lock(&mac->sme);
14709 if (QDF_IS_STATUS_SUCCESS(qdf_status)) {
14710 mac->sme.md_host_evt_cb = callback_fn;
14711 mac->sme.md_ctx = hdd_ctx;
14712 sme_release_global_lock(&mac->sme);
14713 }
14714 return qdf_status;
14715}
14716
14717/**
14718 * sme_motion_det_config - Post motion detection configuration msg to scheduler
14719 * @mac_handle: mac handle
14720 * @motion_det_config: motion detection configuration
14721 *
14722 * Return: QDF_STATUS_SUCCESS or non-zero on failure
14723 */
14724QDF_STATUS sme_motion_det_config(mac_handle_t mac_handle,
14725 struct sme_motion_det_cfg *motion_det_config)
14726{
Visweswara Tanuku025f5862019-01-08 17:35:33 +053014727 struct scheduler_msg msg;
Visweswara Tanuku633976b2019-01-07 16:13:12 +053014728 struct sme_motion_det_cfg *motion_det_cfg;
14729 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
14730 struct mac_context *mac = MAC_CONTEXT(mac_handle);
14731
14732 qdf_status = sme_acquire_global_lock(&mac->sme);
14733 if (QDF_IS_STATUS_SUCCESS(qdf_status)) {
14734 motion_det_cfg =
14735 qdf_mem_malloc(sizeof(*motion_det_cfg));
14736 if (!motion_det_cfg) {
14737 sme_release_global_lock(&mac->sme);
14738 return QDF_STATUS_E_NOMEM;
14739 }
14740
14741 *motion_det_cfg = *motion_det_config;
14742
14743 qdf_mem_set(&msg, sizeof(msg), 0);
14744 msg.type = WMA_SET_MOTION_DET_CONFIG;
14745 msg.bodyptr = motion_det_cfg;
14746
14747 qdf_status = scheduler_post_message(QDF_MODULE_ID_SME,
14748 QDF_MODULE_ID_WMA,
14749 QDF_MODULE_ID_WMA,
14750 &msg);
14751 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
14752 qdf_mem_free(motion_det_cfg);
14753 qdf_status = QDF_STATUS_E_FAILURE;
14754 }
14755 sme_release_global_lock(&mac->sme);
14756 }
14757 return qdf_status;
14758}
14759
14760/**
14761 * sme_motion_det_enable - Post motion detection start/stop msg to scheduler
14762 * @mac_handle: mac handle
14763 * @motion_det_enable: motion detection start/stop
14764 *
14765 * Return: QDF_STATUS_SUCCESS or non-zero on failure
14766 */
14767QDF_STATUS sme_motion_det_enable(mac_handle_t mac_handle,
14768 struct sme_motion_det_en *motion_det_enable)
14769{
Visweswara Tanuku025f5862019-01-08 17:35:33 +053014770 struct scheduler_msg msg;
Visweswara Tanuku633976b2019-01-07 16:13:12 +053014771 struct sme_motion_det_en *motion_det_en;
14772 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
14773 struct mac_context *mac = MAC_CONTEXT(mac_handle);
14774
14775 qdf_status = sme_acquire_global_lock(&mac->sme);
14776 if (QDF_IS_STATUS_SUCCESS(qdf_status)) {
14777 motion_det_en = qdf_mem_malloc(sizeof(*motion_det_en));
14778 if (!motion_det_en) {
14779 sme_release_global_lock(&mac->sme);
14780 return QDF_STATUS_E_NOMEM;
14781 }
14782
14783 *motion_det_en = *motion_det_enable;
14784
14785 qdf_mem_set(&msg, sizeof(msg), 0);
14786 msg.type = WMA_SET_MOTION_DET_ENABLE;
14787 msg.bodyptr = motion_det_en;
14788
14789 qdf_status = scheduler_post_message(QDF_MODULE_ID_SME,
14790 QDF_MODULE_ID_WMA,
14791 QDF_MODULE_ID_WMA,
14792 &msg);
14793 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
14794 qdf_mem_free(motion_det_en);
14795 qdf_status = QDF_STATUS_E_FAILURE;
14796 }
14797 sme_release_global_lock(&mac->sme);
14798 }
14799 return qdf_status;
14800}
14801
14802/**
14803 * sme_motion_det_base_line_config - Post md baselining cfg msg to scheduler
14804 * @mac_handle: mac handle
14805 * @motion_det_base_line_config: motion detection baselining configuration
14806 *
14807 * Return: QDF_STATUS_SUCCESS or non-zero on failure
14808 */
14809QDF_STATUS sme_motion_det_base_line_config(
14810 mac_handle_t mac_handle,
14811 struct sme_motion_det_base_line_cfg *motion_det_base_line_config)
14812{
Visweswara Tanuku025f5862019-01-08 17:35:33 +053014813 struct scheduler_msg msg;
Visweswara Tanuku633976b2019-01-07 16:13:12 +053014814 struct sme_motion_det_base_line_cfg *motion_det_base_line_cfg;
14815 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
14816 struct mac_context *mac = MAC_CONTEXT(mac_handle);
14817
14818 qdf_status = sme_acquire_global_lock(&mac->sme);
14819 if (QDF_IS_STATUS_SUCCESS(qdf_status)) {
14820 motion_det_base_line_cfg =
14821 qdf_mem_malloc(sizeof(*motion_det_base_line_cfg));
14822
14823 if (!motion_det_base_line_cfg) {
14824 sme_release_global_lock(&mac->sme);
14825 return QDF_STATUS_E_NOMEM;
14826 }
14827
14828 *motion_det_base_line_cfg = *motion_det_base_line_config;
14829
Visweswara Tanuku025f5862019-01-08 17:35:33 +053014830 qdf_mem_set(&msg, sizeof(msg), 0);
Visweswara Tanuku633976b2019-01-07 16:13:12 +053014831 msg.type = WMA_SET_MOTION_DET_BASE_LINE_CONFIG;
14832 msg.bodyptr = motion_det_base_line_cfg;
14833
14834 qdf_status = scheduler_post_message(QDF_MODULE_ID_SME,
14835 QDF_MODULE_ID_WMA,
14836 QDF_MODULE_ID_WMA,
14837 &msg);
14838 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
14839 qdf_mem_free(motion_det_base_line_cfg);
14840 qdf_status = QDF_STATUS_E_FAILURE;
14841 }
14842 sme_release_global_lock(&mac->sme);
14843 }
14844 return qdf_status;
14845}
14846
14847/**
14848 * sme_motion_det_base_line_enable - Post md baselining enable msg to scheduler
14849 * @mac_handle: mac handle
14850 * @motion_det_base_line_enable: motion detection baselining start/stop
14851 *
14852 * Return: QDF_STATUS_SUCCESS or non-zero on failure
14853 */
14854QDF_STATUS sme_motion_det_base_line_enable(
14855 mac_handle_t mac_handle,
14856 struct sme_motion_det_base_line_en *motion_det_base_line_enable)
14857{
Visweswara Tanuku025f5862019-01-08 17:35:33 +053014858 struct scheduler_msg msg;
Visweswara Tanuku633976b2019-01-07 16:13:12 +053014859 struct sme_motion_det_base_line_en *motion_det_base_line_en;
14860 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
14861 struct mac_context *mac = MAC_CONTEXT(mac_handle);
14862
14863 qdf_status = sme_acquire_global_lock(&mac->sme);
14864 if (QDF_IS_STATUS_SUCCESS(qdf_status)) {
14865 motion_det_base_line_en =
14866 qdf_mem_malloc(sizeof(*motion_det_base_line_en));
14867
14868 if (!motion_det_base_line_en) {
14869 sme_release_global_lock(&mac->sme);
14870 return QDF_STATUS_E_NOMEM;
14871 }
14872
14873 *motion_det_base_line_en = *motion_det_base_line_enable;
14874
Visweswara Tanuku025f5862019-01-08 17:35:33 +053014875 qdf_mem_set(&msg, sizeof(msg), 0);
Visweswara Tanuku633976b2019-01-07 16:13:12 +053014876 msg.type = WMA_SET_MOTION_DET_BASE_LINE_ENABLE;
14877 msg.bodyptr = motion_det_base_line_en;
14878
14879 qdf_status = scheduler_post_message(QDF_MODULE_ID_SME,
14880 QDF_MODULE_ID_WMA,
14881 QDF_MODULE_ID_WMA,
14882 &msg);
14883 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
14884 qdf_mem_free(motion_det_base_line_en);
14885 qdf_status = QDF_STATUS_E_FAILURE;
14886 }
14887 sme_release_global_lock(&mac->sme);
14888 }
14889 return qdf_status;
14890}
14891#endif /* WLAN_FEATURE_MOTION_DETECTION */
Visweswara Tanuku025f5862019-01-08 17:35:33 +053014892#ifdef FW_THERMAL_THROTTLE_SUPPORT
14893/**
14894 * sme_set_thermal_throttle_cfg() - SME API to set the thermal throttle
14895 * configuration parameters
14896 * @mac_handle: Opaque handle to the global MAC context
14897 * @enable: Enable Throttle
14898 * @dc: duty cycle in msecs
14899 * @dc_off_percent: duty cycle off percentage
14900 * @prio: Disables the transmit queues in fw that have lower priority
14901 * than value defined by prio
14902 * @target_temp: Target temperature
14903 *
14904 * Return: QDF_STATUS
14905 */
14906QDF_STATUS sme_set_thermal_throttle_cfg(mac_handle_t mac_handle, bool enable,
14907 uint32_t dc, uint32_t dc_off_percent,
14908 uint32_t prio, uint32_t target_temp)
14909{
14910 struct scheduler_msg msg;
14911 struct mac_context *mac = MAC_CONTEXT(mac_handle);
14912 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
14913 struct thermal_mitigation_params *therm_cfg_params;
14914
14915 qdf_status = sme_acquire_global_lock(&mac->sme);
14916 if (QDF_STATUS_SUCCESS == qdf_status) {
14917 therm_cfg_params = qdf_mem_malloc(sizeof(*therm_cfg_params));
14918 if (!therm_cfg_params) {
14919 sme_release_global_lock(&mac->sme);
14920 return QDF_STATUS_E_NOMEM;
14921 }
14922
14923 therm_cfg_params->enable = enable;
14924 therm_cfg_params->dc = dc;
14925 therm_cfg_params->levelconf[0].dcoffpercent = dc_off_percent;
14926 therm_cfg_params->levelconf[0].priority = prio;
14927 therm_cfg_params->levelconf[0].tmplwm = target_temp;
14928
14929 qdf_mem_set(&msg, sizeof(msg), 0);
14930 msg.type = WMA_SET_THERMAL_THROTTLE_CFG;
14931 msg.reserved = 0;
14932 msg.bodyptr = therm_cfg_params;
14933
14934 qdf_status = scheduler_post_message(QDF_MODULE_ID_SME,
14935 QDF_MODULE_ID_WMA,
14936 QDF_MODULE_ID_WMA, &msg);
14937 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
14938 qdf_mem_free(therm_cfg_params);
14939 qdf_status = QDF_STATUS_E_FAILURE;
14940 }
14941 sme_release_global_lock(&mac->sme);
14942 }
14943 return qdf_status;
14944}
14945
14946/**
14947 * sme_set_thermal_mgmt() - SME API to set the thermal management params
14948 * @mac_handle: Opaque handle to the global MAC context
14949 * @lower_thresh_deg: Lower threshold value of Temperature
14950 * @higher_thresh_deg: Higher threshold value of Temperature
14951 *
14952 * Return: QDF_STATUS
14953 */
14954QDF_STATUS sme_set_thermal_mgmt(mac_handle_t mac_handle,
14955 uint16_t lower_thresh_deg,
14956 uint16_t higher_thresh_deg)
14957{
14958 struct scheduler_msg msg;
14959 struct mac_context *mac = MAC_CONTEXT(mac_handle);
14960 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
14961 t_thermal_cmd_params *therm_mgmt_cmd;
14962
14963 qdf_status = sme_acquire_global_lock(&mac->sme);
14964 if (QDF_STATUS_SUCCESS == qdf_status) {
14965 therm_mgmt_cmd = qdf_mem_malloc(sizeof(*therm_mgmt_cmd));
14966 if (!therm_mgmt_cmd) {
14967 sme_release_global_lock(&mac->sme);
14968 return QDF_STATUS_E_NOMEM;
14969 }
14970
14971 therm_mgmt_cmd->minTemp = lower_thresh_deg;
14972 therm_mgmt_cmd->maxTemp = higher_thresh_deg;
14973 therm_mgmt_cmd->thermalEnable = 1;
14974
14975 qdf_mem_set(&msg, sizeof(msg), 0);
14976 msg.type = WMA_SET_THERMAL_MGMT;
14977 msg.reserved = 0;
14978 msg.bodyptr = therm_mgmt_cmd;
14979
14980 qdf_status = scheduler_post_message(QDF_MODULE_ID_SME,
14981 QDF_MODULE_ID_WMA,
14982 QDF_MODULE_ID_WMA, &msg);
14983 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
14984 qdf_mem_free(therm_mgmt_cmd);
14985 qdf_status = QDF_STATUS_E_FAILURE;
14986 }
14987 sme_release_global_lock(&mac->sme);
14988 }
14989 return qdf_status;
14990}
14991#endif /* FW_THERMAL_THROTTLE_SUPPORT */
Abhinav Kumar338e57d2019-02-04 17:30:10 +053014992
14993QDF_STATUS sme_update_hidden_ssid_status_cb(mac_handle_t mac_handle,
14994 hidden_ssid_cb cb)
14995{
14996 QDF_STATUS status;
14997 struct mac_context *mac = MAC_CONTEXT(mac_handle);
14998
14999 status = sme_acquire_global_lock(&mac->sme);
15000 if (QDF_IS_STATUS_SUCCESS(status)) {
15001 mac->sme.hidden_ssid_cb = cb;
15002 sme_release_global_lock(&mac->sme);
15003 }
15004
15005 return status;
15006}