blob: 8613c9ff5c1672a9bde8a56554ae17478090757d [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"
Qun Zhangef655622019-02-25 10:48:10 +080036#include "wma_fw_state.h"
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053037#include "qdf_trace.h"
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080038#include "sme_trace.h"
Anurag Chouhan6d760662016-02-20 16:05:43 +053039#include "qdf_types.h"
gaurank kathpalia78af1932018-10-27 20:33:10 +053040#include "qdf_util.h"
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053041#include "qdf_trace.h"
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080042#include "cds_utils.h"
43#include "sap_api.h"
44#include "mac_trace.h"
Naveen Rawat3b6068c2016-04-14 19:01:06 -070045#include "cds_regdomain.h"
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080046#include "sme_power_save_api.h"
47#include "wma.h"
Naveen Rawatb4d37622015-11-13 16:15:25 -080048#include "sch_api.h"
Deepak Dhamdhere0f076bd2016-06-02 11:29:21 -070049#include "sme_nan_datapath.h"
Agrawal Ashish21ba2572016-09-03 16:40:10 +053050#include "csr_api.h"
Kiran Kumar Lokerea3de2262017-04-12 12:15:04 -070051#include "wlan_reg_services_api.h"
Abhishek Singh158fe252017-03-23 11:09:34 +053052#include <wlan_scan_ucfg_api.h>
Kiran Kumar Lokereb1d412e2017-04-23 17:19:43 -070053#include "wlan_reg_ucfg_api.h"
Arif Hussainee677012017-01-26 17:50:13 -080054#include "ol_txrx.h"
Naveen Rawatd2657be2017-10-10 14:31:23 -070055#include "wifi_pos_api.h"
Vignesh Viswanathan9dd88d32017-11-22 14:22:03 +053056#include "net/cfg80211.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,
Pragaspathi Thilagaraj469495b2019-05-30 00:18:31 +053068 void *msg_buf);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080069
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,
Pragaspathi Thilagaraj469495b2019-05-30 00:18:31 +053074 uint16_t msg_type, void *msg_buf);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080075
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
Qun Zhangef655622019-02-25 10:48:10 +080079static QDF_STATUS sme_fw_state_resp(struct mac_context *mac);
80
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080081/* Internal SME APIs */
Jeff Johnson50980e12019-02-17 11:38:30 -080082QDF_STATUS sme_acquire_global_lock(struct sme_context *sme)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080083{
Jeff Johnson50980e12019-02-17 11:38:30 -080084 if (!sme)
85 return QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080086
Jeff Johnson3e7a4932019-02-17 12:11:36 -080087 return qdf_mutex_acquire(&sme->sme_global_lock);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080088}
89
Jeff Johnson50980e12019-02-17 11:38:30 -080090QDF_STATUS sme_release_global_lock(struct sme_context *sme)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080091{
Jeff Johnson50980e12019-02-17 11:38:30 -080092 if (!sme)
93 return QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080094
Jeff Johnson3e7a4932019-02-17 12:11:36 -080095 return qdf_mutex_release(&sme->sme_global_lock);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080096}
97
Jeff Johnson0a8786a2018-12-02 10:49:01 -080098struct mac_context *sme_get_mac_context(void)
Archana Ramachandran2eb7a612017-03-23 22:58:42 -070099{
Jeff Johnson0a8786a2018-12-02 10:49:01 -0800100 struct mac_context *mac_ctx;
Jeff Johnsonb460dd72018-11-08 10:26:51 -0800101 mac_handle_t mac_handle;
Archana Ramachandran2eb7a612017-03-23 22:58:42 -0700102
Jeff Johnsonb460dd72018-11-08 10:26:51 -0800103 mac_handle = cds_get_context(QDF_MODULE_ID_SME);
Jeff Johnson038efe72019-03-18 13:39:31 -0700104 if (!mac_handle) {
Archana Ramachandran2eb7a612017-03-23 22:58:42 -0700105 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_FATAL,
Jeff Johnsonb460dd72018-11-08 10:26:51 -0800106 FL("invalid mac_handle"));
Archana Ramachandran2eb7a612017-03-23 22:58:42 -0700107 return NULL;
108 }
109
Jeff Johnsona0619e42018-11-28 17:43:00 -0800110 mac_ctx = MAC_CONTEXT(mac_handle);
Archana Ramachandran2eb7a612017-03-23 22:58:42 -0700111
112 return mac_ctx;
113}
114
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800115/**
116 * sme_process_set_hw_mode_resp() - Process set HW mode response
117 * @mac: Global MAC pointer
118 * @msg: HW mode response
119 *
120 * Processes the HW mode response and invokes the HDD callback
121 * to process further
122 */
Jeff Johnson0a8786a2018-12-02 10:49:01 -0800123static QDF_STATUS sme_process_set_hw_mode_resp(struct mac_context *mac, uint8_t *msg)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800124{
Krunal Sonia8270f52017-02-23 19:51:25 -0800125 tListElem *entry;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800126 tSmeCmd *command = NULL;
127 bool found;
Tushnim Bhattacharyyaeab33dd2017-11-15 15:20:02 -0800128 policy_mgr_pdev_set_hw_mode_cback callback = NULL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800129 struct sir_set_hw_mode_resp *param;
Tushnim Bhattacharyya3b99f4b2018-03-26 14:19:24 -0700130 enum policy_mgr_conn_update_reason reason;
gaurank kathpalia14e2f912017-08-31 14:51:45 +0530131 struct csr_roam_session *session;
Sandeep Puligillaa330c8c2017-03-09 18:03:21 -0800132 uint32_t session_id;
Sandeep Puligilla344d7252017-09-15 16:23:33 -0700133
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800134 param = (struct sir_set_hw_mode_resp *)msg;
135 if (!param) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -0700136 sme_err("HW mode resp param is NULL");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800137 /* Not returning. Need to check if active command list
138 * needs to be freed
139 */
140 }
141
Krunal Sonia8270f52017-02-23 19:51:25 -0800142 entry = csr_nonscan_active_ll_peek_head(mac, LL_ACCESS_LOCK);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800143 if (!entry) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -0700144 sme_err("No cmd found in active list");
Tushnim Bhattacharyya4a03db82017-11-10 17:58:28 -0800145 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800146 }
147
148 command = GET_BASE_ADDR(entry, tSmeCmd, Link);
149 if (!command) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -0700150 sme_err("Base address is NULL");
Tushnim Bhattacharyya4a03db82017-11-10 17:58:28 -0800151 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800152 }
153
154 if (e_sme_command_set_hw_mode != command->command) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -0700155 sme_err("Command mismatch!");
Tushnim Bhattacharyya4a03db82017-11-10 17:58:28 -0800156 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800157 }
158
159 callback = command->u.set_hw_mode_cmd.set_hw_mode_cb;
Chandrasekaran, Manishekaref70c0d2015-10-20 19:54:55 +0530160 reason = command->u.set_hw_mode_cmd.reason;
Sandeep Puligillaa330c8c2017-03-09 18:03:21 -0800161 session_id = command->u.set_hw_mode_cmd.session_id;
Chandrasekaran, Manishekarce2172e2016-02-18 16:12:43 +0530162
Srinivas Girigowda2da81e22017-03-16 21:22:19 -0700163 sme_debug("reason: %d session: %d",
Chandrasekaran, Manishekarce2172e2016-02-18 16:12:43 +0530164 command->u.set_hw_mode_cmd.reason,
165 command->u.set_hw_mode_cmd.session_id);
166
Chandrasekaran, Manishekar4dd215e2016-04-16 18:48:34 -0700167 if (!callback) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -0700168 sme_err("Callback does not exist");
Chandrasekaran, Manishekar4dd215e2016-04-16 18:48:34 -0700169 goto end;
170 }
171
172 if (!param) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -0700173 sme_err("Callback failed since HW mode params is NULL");
Chandrasekaran, Manishekar4dd215e2016-04-16 18:48:34 -0700174 goto end;
175 }
176
177 /* Irrespective of the reason for which the hw mode change request
178 * was issued, the policy manager connection table needs to be updated
179 * with the new vdev-mac id mapping, tx/rx spatial streams etc., if the
180 * set hw mode was successful.
181 */
182 callback(param->status,
183 param->cfgd_hw_mode_index,
184 param->num_vdev_mac_entries,
Tushnim Bhattacharyya0c4ad2d2017-03-09 15:59:03 -0800185 param->vdev_mac_map,
Tushnim Bhattacharyyaeab33dd2017-11-15 15:20:02 -0800186 command->u.set_hw_mode_cmd.next_action,
187 command->u.set_hw_mode_cmd.reason,
188 command->u.set_hw_mode_cmd.session_id,
Tushnim Bhattacharyya0c4ad2d2017-03-09 15:59:03 -0800189 command->u.set_hw_mode_cmd.context);
Krunal Soni3fa80e22018-01-09 14:16:02 -0800190 if (!CSR_IS_SESSION_VALID(mac, session_id)) {
191 sme_err("session %d is invalid", session_id);
192 goto end;
193 }
Sandeep Puligillaa330c8c2017-03-09 18:03:21 -0800194 session = CSR_GET_SESSION(mac, session_id);
Tushnim Bhattacharyya3b99f4b2018-03-26 14:19:24 -0700195 if (reason == POLICY_MGR_UPDATE_REASON_HIDDEN_STA) {
Chandrasekaran, Manishekar4dd215e2016-04-16 18:48:34 -0700196 /* In the case of hidden SSID, connection update
197 * (set hw mode) is done after the scan with reason
198 * code eCsrScanForSsid completes. The connect/failure
199 * needs to be handled after the response of set hw
200 * mode
201 */
Sandeep Puligillaa330c8c2017-03-09 18:03:21 -0800202 if (param->status == SET_HW_MODE_STATUS_OK) {
Srinivas Girigowda2c263352017-03-17 17:49:53 -0700203 sme_debug("search for ssid success");
Sandeep Puligillaa330c8c2017-03-09 18:03:21 -0800204 csr_scan_handle_search_for_ssid(mac,
205 session_id);
206 } else {
Srinivas Girigowda2c263352017-03-17 17:49:53 -0700207 sme_debug("search for ssid failure");
Sandeep Puligillaa330c8c2017-03-09 18:03:21 -0800208 csr_scan_handle_search_for_ssid_failure(mac,
209 session_id);
210 }
Deepak Dhamdhere6f7fbbe2017-02-28 13:35:52 -0800211 csr_saved_scan_cmd_free_fields(mac, session);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800212 }
Abhishek Singhbc4261f2019-03-14 13:21:57 +0530213 if (reason == POLICY_MGR_UPDATE_REASON_CHANNEL_SWITCH_STA) {
214 sme_debug(" Continue channel switch for STA");
215 csr_sta_continue_csa(mac, session_id);
216 }
Rajasekaran Kalidoss869bc4a2018-11-20 20:35:14 +0530217 if (reason == POLICY_MGR_UPDATE_REASON_LFR2_ROAM)
218 csr_continue_lfr2_connect(mac, session_id);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800219
Chandrasekaran, Manishekaref70c0d2015-10-20 19:54:55 +0530220end:
Krunal Soni72dba662017-02-15 20:13:17 -0800221 found = csr_nonscan_active_ll_remove_entry(mac, entry,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800222 LL_ACCESS_LOCK);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +0530223 if (found)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800224 /* Now put this command back on the avilable command list */
Krunal Soni78618d92017-02-14 21:46:31 -0800225 csr_release_command(mac, command);
Krunal Sonia8270f52017-02-23 19:51:25 -0800226
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530227 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800228}
229
230/**
231 * sme_process_hw_mode_trans_ind() - Process HW mode transition indication
232 * @mac: Global MAC pointer
233 * @msg: HW mode transition response
234 *
235 * Processes the HW mode transition indication and invoke the HDD callback
236 * to process further
237 */
Jeff Johnson0a8786a2018-12-02 10:49:01 -0800238static QDF_STATUS sme_process_hw_mode_trans_ind(struct mac_context *mac,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800239 uint8_t *msg)
240{
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800241 struct sir_hw_mode_trans_ind *param;
242
243 param = (struct sir_hw_mode_trans_ind *)msg;
244 if (!param) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -0700245 sme_err("HW mode trans ind param is NULL");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530246 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800247 }
248
Tushnim Bhattacharyya0c4ad2d2017-03-09 15:59:03 -0800249 policy_mgr_hw_mode_transition_cb(param->old_hw_mode_index,
Tushnim Bhattacharyya9e81b4c2017-02-15 17:11:14 -0800250 param->new_hw_mode_index,
251 param->num_vdev_mac_entries,
Tushnim Bhattacharyya0c4ad2d2017-03-09 15:59:03 -0800252 param->vdev_mac_map, mac->psoc);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800253
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530254 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800255}
256
Abhishek Singh0d0568a2018-11-22 15:01:51 +0530257void sme_purge_pdev_all_ser_cmd_list(mac_handle_t mac_handle)
258{
259 QDF_STATUS status;
Jeff Johnson0a8786a2018-12-02 10:49:01 -0800260 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Abhishek Singh0d0568a2018-11-22 15:01:51 +0530261
262 status = sme_acquire_global_lock(&mac_ctx->sme);
263 if (QDF_IS_STATUS_ERROR(status))
264 return;
265
266 csr_purge_pdev_all_ser_cmd_list(mac_ctx);
267 sme_release_global_lock(&mac_ctx->sme);
268}
269
Naveen Rawate7d86052015-11-13 12:01:43 -0800270/**
271 * free_sme_cmds() - This function frees memory allocated for SME commands
272 * @mac_ctx: Pointer to Global MAC structure
273 *
274 * This function frees memory allocated for SME commands
275 *
276 * @Return: void
277 */
Jeff Johnson0a8786a2018-12-02 10:49:01 -0800278static void free_sme_cmds(struct mac_context *mac_ctx)
Naveen Rawate7d86052015-11-13 12:01:43 -0800279{
280 uint32_t idx;
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +0530281
Jeff Johnson19353172019-02-17 12:53:46 -0800282 if (!mac_ctx->sme.sme_cmd_buf_addr)
Naveen Rawate7d86052015-11-13 12:01:43 -0800283 return;
284
Jeff Johnson2a84c532019-02-17 12:22:04 -0800285 for (idx = 0; idx < mac_ctx->sme.sme_cmd_count; idx++)
Jeff Johnson19353172019-02-17 12:53:46 -0800286 qdf_mem_free(mac_ctx->sme.sme_cmd_buf_addr[idx]);
Naveen Rawate7d86052015-11-13 12:01:43 -0800287
Jeff Johnson19353172019-02-17 12:53:46 -0800288 qdf_mem_free(mac_ctx->sme.sme_cmd_buf_addr);
289 mac_ctx->sme.sme_cmd_buf_addr = NULL;
Naveen Rawate7d86052015-11-13 12:01:43 -0800290}
291
Jeff Johnson0a8786a2018-12-02 10:49:01 -0800292static QDF_STATUS init_sme_cmd_list(struct mac_context *mac)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800293{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530294 QDF_STATUS status;
Jeff Johnson19353172019-02-17 12:53:46 -0800295 tSmeCmd *cmd;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800296 uint32_t cmd_idx;
Naveen Rawate7d86052015-11-13 12:01:43 -0800297 uint32_t sme_cmd_ptr_ary_sz;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800298
Jeff Johnson2a84c532019-02-17 12:22:04 -0800299 mac->sme.sme_cmd_count = SME_TOTAL_COMMAND;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800300
Jeff Johnsonea9f3d72019-02-17 13:27:55 -0800301 status = csr_ll_open(&mac->sme.sme_cmd_freelist);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530302 if (!QDF_IS_STATUS_SUCCESS(status))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800303 goto end;
304
Naveen Rawate7d86052015-11-13 12:01:43 -0800305 /* following pointer contains array of pointers for tSmeCmd* */
Jeff Johnson2a84c532019-02-17 12:22:04 -0800306 sme_cmd_ptr_ary_sz = sizeof(void *) * mac->sme.sme_cmd_count;
Jeff Johnson19353172019-02-17 12:53:46 -0800307 mac->sme.sme_cmd_buf_addr = qdf_mem_malloc(sme_cmd_ptr_ary_sz);
308 if (!mac->sme.sme_cmd_buf_addr) {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530309 status = QDF_STATUS_E_NOMEM;
Naveen Rawate7d86052015-11-13 12:01:43 -0800310 goto end;
311 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800312
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530313 status = QDF_STATUS_SUCCESS;
Jeff Johnson2a84c532019-02-17 12:22:04 -0800314 for (cmd_idx = 0; cmd_idx < mac->sme.sme_cmd_count; cmd_idx++) {
Naveen Rawate7d86052015-11-13 12:01:43 -0800315 /*
316 * Since total size of all commands together can be huge chunk
317 * of memory, allocate SME cmd individually. These SME CMDs are
318 * moved between pending and active queues. And these freeing of
319 * these queues just manipulates the list but does not actually
320 * frees SME CMD pointers. Hence store each SME CMD address in
Jeff Johnson19353172019-02-17 12:53:46 -0800321 * the array, sme.sme_cmd_buf_addr. This will later facilitate
Naveen Rawate7d86052015-11-13 12:01:43 -0800322 * freeing up of all SME CMDs with just a for loop.
323 */
Jeff Johnson19353172019-02-17 12:53:46 -0800324 cmd = qdf_mem_malloc(sizeof(*cmd));
325 if (!cmd) {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530326 status = QDF_STATUS_E_NOMEM;
Jeff Johnson01f2c232018-11-21 19:17:44 -0800327 free_sme_cmds(mac);
Naveen Rawate7d86052015-11-13 12:01:43 -0800328 goto end;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800329 }
Jeff Johnson19353172019-02-17 12:53:46 -0800330 mac->sme.sme_cmd_buf_addr[cmd_idx] = cmd;
Jeff Johnsonea9f3d72019-02-17 13:27:55 -0800331 csr_ll_insert_tail(&mac->sme.sme_cmd_freelist,
Jeff Johnson19353172019-02-17 12:53:46 -0800332 &cmd->Link, LL_ACCESS_LOCK);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800333 }
334
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800335end:
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530336 if (!QDF_IS_STATUS_SUCCESS(status))
Srinivas Girigowda2da81e22017-03-16 21:22:19 -0700337 sme_err("Failed to initialize sme command list: %d", status);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800338
339 return status;
340}
341
Jeff Johnson0a8786a2018-12-02 10:49:01 -0800342void sme_release_command(struct mac_context *mac_ctx, tSmeCmd *sme_cmd)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800343{
Krunal Sonia8270f52017-02-23 19:51:25 -0800344 sme_cmd->command = eSmeNoCommand;
Jeff Johnsonea9f3d72019-02-17 13:27:55 -0800345 csr_ll_insert_tail(&mac_ctx->sme.sme_cmd_freelist, &sme_cmd->Link,
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +0530346 LL_ACCESS_LOCK);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800347}
348
Jeff Johnson0a8786a2018-12-02 10:49:01 -0800349static QDF_STATUS free_sme_cmd_list(struct mac_context *mac)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800350{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530351 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800352
Jeff Johnsonea9f3d72019-02-17 13:27:55 -0800353 csr_ll_close(&mac->sme.sme_cmd_freelist);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800354
Jeff Johnson3e7a4932019-02-17 12:11:36 -0800355 status = sme_acquire_global_lock(&mac->sme);
Madhvapathi Sriram3e6627a2018-12-19 12:54:49 +0530356 if (status != QDF_STATUS_SUCCESS)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800357 goto done;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800358
Jeff Johnson01f2c232018-11-21 19:17:44 -0800359 free_sme_cmds(mac);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800360
Jeff Johnson3e7a4932019-02-17 12:11:36 -0800361 status = sme_release_global_lock(&mac->sme);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +0530362 if (status != QDF_STATUS_SUCCESS)
Srinivas Girigowda2da81e22017-03-16 21:22:19 -0700363 sme_err("Failed to release the lock status: %d", status);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800364done:
365 return status;
366}
367
Jeff Johnson0a8786a2018-12-02 10:49:01 -0800368static void dump_csr_command_info(struct mac_context *mac, tSmeCmd *pCmd)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800369{
370 switch (pCmd->command) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800371 case eSmeCommandRoam:
Srinivas Girigowda2da81e22017-03-16 21:22:19 -0700372 sme_debug("roam command reason is %d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800373 pCmd->u.roamCmd.roamReason);
374 break;
375
376 case eSmeCommandWmStatusChange:
Srinivas Girigowda2da81e22017-03-16 21:22:19 -0700377 sme_debug("WMStatusChange command type is %d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800378 pCmd->u.wmStatusChangeCmd.Type);
379 break;
380
Pragaspathi Thilagarajb37dad32018-07-01 16:48:01 +0530381 case e_sme_command_del_sta_session:
382 sme_debug("Issue del STA command for session:%d",
383 pCmd->sessionId);
384 break;
385
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800386 default:
Srinivas Girigowda2da81e22017-03-16 21:22:19 -0700387 sme_debug("default: Unhandled command %d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800388 pCmd->command);
389 break;
390 }
391}
392
Jeff Johnson0a8786a2018-12-02 10:49:01 -0800393tSmeCmd *sme_get_command_buffer(struct mac_context *mac)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800394{
395 tSmeCmd *pRetCmd = NULL, *pTempCmd = NULL;
396 tListElem *pEntry;
397 static int sme_command_queue_full;
398
Jeff Johnsonea9f3d72019-02-17 13:27:55 -0800399 pEntry = csr_ll_remove_head(&mac->sme.sme_cmd_freelist, LL_ACCESS_LOCK);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800400
Jeff Johnsonea9f3d72019-02-17 13:27:55 -0800401 /* If we can get another MS Msg buffer, then we are ok. Just
402 * link the entry onto the linked list. (We are using the
403 * linked list to keep track of the message buffers).
404 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800405 if (pEntry) {
406 pRetCmd = GET_BASE_ADDR(pEntry, tSmeCmd, Link);
407 /* reset when free list is available */
408 sme_command_queue_full = 0;
409 } else {
410 int idx = 1;
411
412 /* Cannot change pRetCmd here since it needs to return later. */
Jeff Johnson01f2c232018-11-21 19:17:44 -0800413 pEntry = csr_nonscan_active_ll_peek_head(mac, LL_ACCESS_LOCK);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +0530414 if (pEntry)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800415 pTempCmd = GET_BASE_ADDR(pEntry, tSmeCmd, Link);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +0530416
417 sme_err("Out of command buffer.... command (0x%X) stuck",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800418 (pTempCmd) ? pTempCmd->command : eSmeNoCommand);
419 if (pTempCmd) {
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +0530420 if (eSmeCsrCommandMask & pTempCmd->command)
421 /* CSR command is stuck. See what the reason
422 * code is for that command
423 */
Jeff Johnson01f2c232018-11-21 19:17:44 -0800424 dump_csr_command_info(mac, pTempCmd);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800425 } /* if(pTempCmd) */
426
427 /* dump what is in the pending queue */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800428 pEntry =
Jeff Johnson01f2c232018-11-21 19:17:44 -0800429 csr_nonscan_pending_ll_peek_head(mac,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800430 LL_ACCESS_NOLOCK);
431 while (pEntry && !sme_command_queue_full) {
432 pTempCmd = GET_BASE_ADDR(pEntry, tSmeCmd, Link);
433 /* Print only 1st five commands from pending queue. */
434 if (idx <= 5)
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +0530435 sme_err("Out of command buffer.... SME pending command #%d (0x%X)",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800436 idx, pTempCmd->command);
437 idx++;
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +0530438 if (eSmeCsrCommandMask & pTempCmd->command)
439 /* CSR command is stuck. See what the reason
440 * code is for that command
441 */
Jeff Johnson01f2c232018-11-21 19:17:44 -0800442 dump_csr_command_info(mac, pTempCmd);
443 pEntry = csr_nonscan_pending_ll_next(mac, pEntry,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800444 LL_ACCESS_NOLOCK);
445 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800446
Jeff Johnson01f2c232018-11-21 19:17:44 -0800447 if (mac->mlme_cfg->gen.fatal_event_trigger)
Abhishek Singh5ea86532016-04-27 14:10:53 +0530448 cds_flush_logs(WLAN_LOG_TYPE_FATAL,
449 WLAN_LOG_INDICATOR_HOST_DRIVER,
450 WLAN_LOG_REASON_SME_OUT_OF_CMD_BUF,
451 false,
Jeff Johnson01f2c232018-11-21 19:17:44 -0800452 mac->mlme_cfg->gen.self_recovery);
Abhishek Singh5ea86532016-04-27 14:10:53 +0530453 else
Anurag Chouhan4085ff72017-10-05 18:09:56 +0530454 cds_trigger_recovery(QDF_GET_MSG_BUFF_FAILURE);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800455 }
456
457 /* memset to zero */
458 if (pRetCmd) {
hangtian127c9532019-01-12 13:29:07 +0800459 qdf_mem_zero((uint8_t *)&pRetCmd->command,
460 sizeof(pRetCmd->command));
461 qdf_mem_zero((uint8_t *)&pRetCmd->sessionId,
462 sizeof(pRetCmd->sessionId));
463 qdf_mem_zero((uint8_t *)&pRetCmd->u, sizeof(pRetCmd->u));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800464 }
465
466 return pRetCmd;
467}
468
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800469/**
Krunal Sonia8270f52017-02-23 19:51:25 -0800470 * sme_ser_handle_active_cmd() - handle command activation callback from
471 * new serialization module
472 * @cmd: pointer to new serialization command
473 *
474 * This API is to handle command activation callback from new serialization
475 * callback
476 *
477 * Return: QDF_STATUS_SUCCESS
478 */
479static
480QDF_STATUS sme_ser_handle_active_cmd(struct wlan_serialization_command *cmd)
481{
482 tSmeCmd *sme_cmd;
Jeff Johnsonc7309062018-11-09 20:59:42 -0800483 mac_handle_t mac_handle;
Jeff Johnson0a8786a2018-12-02 10:49:01 -0800484 struct mac_context *mac_ctx;
Krunal Sonia8270f52017-02-23 19:51:25 -0800485 QDF_STATUS status = QDF_STATUS_SUCCESS;
486 bool do_continue;
487
488 if (!cmd) {
Srinivas Girigowda2c263352017-03-17 17:49:53 -0700489 sme_err("No serialization command found");
Krunal Sonia8270f52017-02-23 19:51:25 -0800490 return QDF_STATUS_E_FAILURE;
491 }
492
Jeff Johnsonc7309062018-11-09 20:59:42 -0800493 mac_handle = cds_get_context(QDF_MODULE_ID_SME);
Jeff Johnson038efe72019-03-18 13:39:31 -0700494 if (mac_handle) {
Jeff Johnsona0619e42018-11-28 17:43:00 -0800495 mac_ctx = MAC_CONTEXT(mac_handle);
Pragaspathi Thilagarajb11dbe42018-07-23 16:42:17 +0530496 } else {
Jeff Johnsonc7309062018-11-09 20:59:42 -0800497 sme_err("No mac_handle found");
Krunal Sonia8270f52017-02-23 19:51:25 -0800498 return QDF_STATUS_E_FAILURE;
499 }
500 sme_cmd = cmd->umac_cmd;
501 if (!sme_cmd) {
Srinivas Girigowda2c263352017-03-17 17:49:53 -0700502 sme_err("No SME command found");
Krunal Sonia8270f52017-02-23 19:51:25 -0800503 return QDF_STATUS_E_FAILURE;
504 }
505
506 switch (sme_cmd->command) {
507 case eSmeCommandRoam:
508 status = csr_roam_process_command(mac_ctx, sme_cmd);
509 break;
510 case eSmeCommandWmStatusChange:
511 csr_roam_process_wm_status_change_command(mac_ctx,
512 sme_cmd);
513 break;
Pragaspathi Thilagarajb37dad32018-07-01 16:48:01 +0530514 case e_sme_command_del_sta_session:
515 csr_process_del_sta_session_command(mac_ctx, sme_cmd);
516 break;
Krunal Sonia8270f52017-02-23 19:51:25 -0800517 case eSmeCommandAddTs:
518 case eSmeCommandDelTs:
519#ifndef WLAN_MDM_CODE_REDUCTION_OPT
520 do_continue = qos_process_command(mac_ctx, sme_cmd);
521 if (do_continue)
522 status = QDF_STATUS_E_FAILURE;
523#endif
524 break;
Krunal Sonia8270f52017-02-23 19:51:25 -0800525 case e_sme_command_set_hw_mode:
526 csr_process_set_hw_mode(mac_ctx, sme_cmd);
527 break;
528 case e_sme_command_nss_update:
529 csr_process_nss_update_req(mac_ctx, sme_cmd);
530 break;
531 case e_sme_command_set_dual_mac_config:
532 csr_process_set_dual_mac_config(mac_ctx, sme_cmd);
533 break;
534 case e_sme_command_set_antenna_mode:
535 csr_process_set_antenna_mode(mac_ctx, sme_cmd);
536 break;
537 default:
538 /* something is wrong */
Srinivas Girigowda2da81e22017-03-16 21:22:19 -0700539 sme_err("unknown command %d", sme_cmd->command);
Krunal Sonia8270f52017-02-23 19:51:25 -0800540 status = QDF_STATUS_E_FAILURE;
541 break;
542 }
Krunal Sonia8270f52017-02-23 19:51:25 -0800543 return status;
544}
545
Rajeev Kumar Sirasanagandla4477e7e2019-01-29 14:05:44 -0800546QDF_STATUS sme_ser_cmd_callback(struct wlan_serialization_command *cmd,
Krunal Sonia8270f52017-02-23 19:51:25 -0800547 enum wlan_serialization_cb_reason reason)
548{
Jeff Johnsonc7309062018-11-09 20:59:42 -0800549 mac_handle_t mac_handle;
Jeff Johnson0a8786a2018-12-02 10:49:01 -0800550 struct mac_context *mac_ctx;
Krunal Sonia8270f52017-02-23 19:51:25 -0800551 QDF_STATUS status = QDF_STATUS_SUCCESS;
552 tSmeCmd *sme_cmd;
553
Jeff Johnsonc7309062018-11-09 20:59:42 -0800554 mac_handle = cds_get_context(QDF_MODULE_ID_SME);
Jeff Johnson038efe72019-03-18 13:39:31 -0700555 if (mac_handle) {
Jeff Johnsona0619e42018-11-28 17:43:00 -0800556 mac_ctx = MAC_CONTEXT(mac_handle);
Pragaspathi Thilagarajb11dbe42018-07-23 16:42:17 +0530557 } else {
Jeff Johnsonc7309062018-11-09 20:59:42 -0800558 sme_err("mac_handle is null");
Krunal Sonia8270f52017-02-23 19:51:25 -0800559 return QDF_STATUS_E_FAILURE;
560 }
561 /*
562 * Do not acquire lock here as sme global lock is already acquired in
563 * caller or MC thread context
564 */
565 if (!cmd) {
Srinivas Girigowda2c263352017-03-17 17:49:53 -0700566 sme_err("serialization command is null");
Krunal Sonia8270f52017-02-23 19:51:25 -0800567 return QDF_STATUS_E_FAILURE;
568 }
569
570 switch (reason) {
571 case WLAN_SER_CB_ACTIVATE_CMD:
Srinivas Girigowda2c263352017-03-17 17:49:53 -0700572 sme_debug("WLAN_SER_CB_ACTIVATE_CMD callback");
Krunal Sonia8270f52017-02-23 19:51:25 -0800573 status = sme_ser_handle_active_cmd(cmd);
574 break;
575 case WLAN_SER_CB_CANCEL_CMD:
Srinivas Girigowda2c263352017-03-17 17:49:53 -0700576 sme_debug("WLAN_SER_CB_CANCEL_CMD callback");
Krunal Sonia8270f52017-02-23 19:51:25 -0800577 break;
578 case WLAN_SER_CB_RELEASE_MEM_CMD:
Srinivas Girigowda2c263352017-03-17 17:49:53 -0700579 sme_debug("WLAN_SER_CB_RELEASE_MEM_CMD callback");
Vignesh Viswanathan062b5162018-10-11 17:18:41 +0530580 if (cmd->vdev)
581 wlan_objmgr_vdev_release_ref(cmd->vdev,
582 WLAN_LEGACY_SME_ID);
Krunal Sonia8270f52017-02-23 19:51:25 -0800583 sme_cmd = cmd->umac_cmd;
584 csr_release_command_buffer(mac_ctx, sme_cmd);
585 break;
586 case WLAN_SER_CB_ACTIVE_CMD_TIMEOUT:
Srinivas Girigowda2c263352017-03-17 17:49:53 -0700587 sme_debug("WLAN_SER_CB_ACTIVE_CMD_TIMEOUT callback");
Krunal Sonia8270f52017-02-23 19:51:25 -0800588 break;
589 default:
Srinivas Girigowda2c263352017-03-17 17:49:53 -0700590 sme_debug("STOP: unknown reason code");
Krunal Sonia8270f52017-02-23 19:51:25 -0800591 return QDF_STATUS_E_FAILURE;
592 }
593 return status;
594}
595
Wen Gong3f003382018-05-14 14:26:37 +0800596#ifdef WLAN_FEATURE_MEMDUMP_ENABLE
Krunal Sonia8270f52017-02-23 19:51:25 -0800597/**
Padma, Santhosh Kumar9aba02f2016-08-11 16:30:25 +0530598 * sme_get_sessionid_from_activelist() - gets session id
599 * @mac: mac context
600 *
601 * This function is used to get session id from sme command
602 * active list
603 *
604 * Return: returns session id
605 */
Jeff Johnson0a8786a2018-12-02 10:49:01 -0800606static uint32_t sme_get_sessionid_from_activelist(struct mac_context *mac)
Padma, Santhosh Kumar9aba02f2016-08-11 16:30:25 +0530607{
608 tListElem *entry;
609 tSmeCmd *command;
Srinivas Girigowdad8697d42019-03-08 15:34:39 -0800610 uint32_t session_id = WLAN_UMAC_VDEV_ID_MAX;
Padma, Santhosh Kumar9aba02f2016-08-11 16:30:25 +0530611
Krunal Sonia8270f52017-02-23 19:51:25 -0800612 entry = csr_nonscan_active_ll_peek_head(mac, LL_ACCESS_LOCK);
Padma, Santhosh Kumar9aba02f2016-08-11 16:30:25 +0530613 if (entry) {
614 command = GET_BASE_ADDR(entry, tSmeCmd, Link);
615 session_id = command->sessionId;
616 }
617
618 return session_id;
619}
620
621/**
622 * sme_state_info_dump() - prints state information of sme layer
623 * @buf: buffer pointer
624 * @size: size of buffer to be filled
625 *
626 * This function is used to dump state information of sme layer
627 *
628 * Return: None
629 */
630static void sme_state_info_dump(char **buf_ptr, uint16_t *size)
631{
632 uint32_t session_id, active_session_id;
Jeff Johnsonc7309062018-11-09 20:59:42 -0800633 mac_handle_t mac_handle;
Jeff Johnson0a8786a2018-12-02 10:49:01 -0800634 struct mac_context *mac;
Padma, Santhosh Kumar9aba02f2016-08-11 16:30:25 +0530635 uint16_t len = 0;
636 char *buf = *buf_ptr;
637 eCsrConnectState connect_state;
638
Jeff Johnsonc7309062018-11-09 20:59:42 -0800639 mac_handle = cds_get_context(QDF_MODULE_ID_SME);
Jeff Johnson038efe72019-03-18 13:39:31 -0700640 if (!mac_handle) {
Padma, Santhosh Kumar9aba02f2016-08-11 16:30:25 +0530641 QDF_ASSERT(0);
642 return;
643 }
644
Jeff Johnsona0619e42018-11-28 17:43:00 -0800645 mac = MAC_CONTEXT(mac_handle);
Padma, Santhosh Kumar9aba02f2016-08-11 16:30:25 +0530646
647 active_session_id = sme_get_sessionid_from_activelist(mac);
Srinivas Girigowdad8697d42019-03-08 15:34:39 -0800648 if (active_session_id != WLAN_UMAC_VDEV_ID_MAX) {
Padma, Santhosh Kumar9aba02f2016-08-11 16:30:25 +0530649 len += qdf_scnprintf(buf + len, *size - len,
650 "\n active command sessionid %d", active_session_id);
651 }
652
Dustin Brownad06be62019-02-04 14:52:56 -0800653 for (session_id = 0; session_id < WLAN_MAX_VDEVS; session_id++) {
Padma, Santhosh Kumar9aba02f2016-08-11 16:30:25 +0530654 if (CSR_IS_SESSION_VALID(mac, session_id)) {
655 connect_state =
656 mac->roam.roamSession[session_id].connectState;
657 if ((eCSR_ASSOC_STATE_TYPE_INFRA_ASSOCIATED ==
658 connect_state)
659 || (eCSR_ASSOC_STATE_TYPE_INFRA_CONNECTED ==
660 connect_state)) {
661 len += qdf_scnprintf(buf + len, *size - len,
662 "\n NeighborRoamState: %d",
663 mac->roam.neighborRoamInfo[session_id].
664 neighborRoamState);
665 len += qdf_scnprintf(buf + len, *size - len,
666 "\n RoamState: %d", mac->roam.
667 curState[session_id]);
668 len += qdf_scnprintf(buf + len, *size - len,
669 "\n RoamSubState: %d", mac->roam.
670 curSubState[session_id]);
671 len += qdf_scnprintf(buf + len, *size - len,
672 "\n ConnectState: %d",
673 connect_state);
674 }
675 }
676 }
677
678 *size -= len;
679 *buf_ptr += len;
680}
681
682/**
683 * sme_register_debug_callback() - registration function sme layer
684 * to print sme state information
685 *
686 * Return: None
687 */
688static void sme_register_debug_callback(void)
689{
690 qdf_register_debug_callback(QDF_MODULE_ID_SME, &sme_state_info_dump);
691}
Wen Gong3f003382018-05-14 14:26:37 +0800692#else /* WLAN_FEATURE_MEMDUMP_ENABLE */
Wen Gongaa6d55d2018-04-26 16:33:21 +0800693static void sme_register_debug_callback(void)
694{
695}
Wen Gong3f003382018-05-14 14:26:37 +0800696#endif /* WLAN_FEATURE_MEMDUMP_ENABLE */
Padma, Santhosh Kumar9aba02f2016-08-11 16:30:25 +0530697
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800698/* Global APIs */
699
700/**
701 * sme_open() - Initialze all SME modules and put them at idle state
Jeff Johnsonb460dd72018-11-08 10:26:51 -0800702 * @mac_handle: The handle returned by mac_open
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800703 *
704 * The function initializes each module inside SME, PMC, CSR, etc. Upon
705 * successfully return, all modules are at idle state ready to start.
706 * smeOpen must be called before any other SME APIs can be involved.
707 * smeOpen must be called after mac_open.
708 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530709 * Return: QDF_STATUS_SUCCESS - SME is successfully initialized.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800710 * Other status means SME is failed to be initialized
711 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -0800712QDF_STATUS sme_open(mac_handle_t mac_handle)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800713{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530714 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -0800715 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800716
Jeff Johnson01f2c232018-11-21 19:17:44 -0800717 mac->sme.state = SME_STATE_STOP;
Jeff Johnson5a6a0c92019-02-17 16:12:02 -0800718 mac->sme.curr_device_mode = QDF_STA_MODE;
Anurag Chouhana37b5b72016-02-21 14:53:42 +0530719 if (!QDF_IS_STATUS_SUCCESS(qdf_mutex_create(
Jeff Johnson3e7a4932019-02-17 12:11:36 -0800720 &mac->sme.sme_global_lock))) {
Srinivas Girigowda09625b02018-09-10 15:28:09 -0700721 sme_err("Init lock failed");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530722 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800723 }
Jeff Johnson01f2c232018-11-21 19:17:44 -0800724 status = csr_open(mac);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530725 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -0700726 sme_err("csr_open failed, status: %d", status);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800727 return status;
728 }
729
Jeff Johnsonb460dd72018-11-08 10:26:51 -0800730 status = sme_ps_open(mac_handle);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530731 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -0700732 sme_err("sme_ps_open failed with status: %d", status);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800733 return status;
734 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800735
736#ifndef WLAN_MDM_CODE_REDUCTION_OPT
Jeff Johnson01f2c232018-11-21 19:17:44 -0800737 status = sme_qos_open(mac);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530738 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -0700739 sme_err("Qos open, status: %d", status);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800740 return status;
741 }
742#endif
Jeff Johnson01f2c232018-11-21 19:17:44 -0800743 status = init_sme_cmd_list(mac);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530744 if (!QDF_IS_STATUS_SUCCESS(status))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800745 return status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800746
Jeff Johnson01f2c232018-11-21 19:17:44 -0800747 status = rrm_open(mac);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530748 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -0700749 sme_err("rrm_open failed, status: %d", status);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800750 return status;
751 }
Jeff Johnson01f2c232018-11-21 19:17:44 -0800752 sme_trace_init(mac);
Padma, Santhosh Kumar9aba02f2016-08-11 16:30:25 +0530753 sme_register_debug_callback();
Krunal Soni33787902017-08-29 11:39:28 -0700754
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800755 return status;
756}
757
758/*
759 * sme_init_chan_list, triggers channel setup based on country code.
760 */
Jeff Johnsonc7309062018-11-09 20:59:42 -0800761QDF_STATUS sme_init_chan_list(mac_handle_t mac_handle, uint8_t *alpha2,
Amar Singhala297bfa2015-10-15 15:07:29 -0700762 enum country_src cc_src)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800763{
Jeff Johnson0a8786a2018-12-02 10:49:01 -0800764 struct mac_context *pmac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800765
Amar Singhala297bfa2015-10-15 15:07:29 -0700766 if ((cc_src == SOURCE_USERSPACE) &&
Bala Venkatesh46e29032018-11-14 18:24:55 +0530767 (pmac->mlme_cfg->sap_cfg.country_code_priority)) {
Abhinav Kumard4d6eb72018-12-04 20:30:37 +0530768 pmac->mlme_cfg->gen.enabled_11d = false;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800769 }
770
771 return csr_init_chan_list(pmac, alpha2);
772}
773
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +0530774/*
775 * sme_set11dinfo() - Set the 11d information about valid channels
776 * and there power using information from nvRAM
777 * This function is called only for AP.
778 *
779 * This is a synchronous call
780 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -0800781 * mac_handle - The handle returned by mac_open.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +0530782 * pSmeConfigParams - a pointer to a caller allocated object of
Jeff Johnson46b4f0e2019-03-08 10:48:35 -0800783 * struct sme_config_params.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +0530784 *
785 * Return QDF_STATUS_SUCCESS - SME update the config parameters successfully.
786 *
787 * Other status means SME is failed to update the config parameters.
788 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800789
Jeff Johnsonc7309062018-11-09 20:59:42 -0800790QDF_STATUS sme_set11dinfo(mac_handle_t mac_handle,
Jeff Johnson46b4f0e2019-03-08 10:48:35 -0800791 struct sme_config_params *pSmeConfigParams)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800792{
Jeff Johnson0a8786a2018-12-02 10:49:01 -0800793 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530794 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800795
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +0530796 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800797 TRACE_CODE_SME_RX_HDD_MSG_SET_11DINFO, NO_SESSION, 0));
Jeff Johnson038efe72019-03-18 13:39:31 -0700798 if (!pSmeConfigParams) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -0700799 sme_err("SME config params empty");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800800 return status;
801 }
802
Jeff Johnsone94ccd02019-04-02 15:02:56 -0700803 status = csr_set_channels(mac_ctx, &pSmeConfigParams->csr_config);
Srinivas Girigowda2da81e22017-03-16 21:22:19 -0700804 if (!QDF_IS_STATUS_SUCCESS(status))
805 sme_err("csr_set_channels failed with status: %d", status);
806
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800807 return status;
808}
809
Krunal Sonie3531942016-04-12 17:43:53 -0700810/**
811 * sme_update_fine_time_measurement_capab() - Update the FTM capabitlies from
812 * incoming val
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -0800813 * @mac_handle: Opaque handle to the global MAC context
Krunal Sonie3531942016-04-12 17:43:53 -0700814 * @val: New FTM capability value
815 *
816 * Return: None
817 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -0800818void sme_update_fine_time_measurement_capab(mac_handle_t mac_handle,
Jeff Johnson1f2dabc2018-11-07 15:33:01 -0800819 uint8_t session_id,
820 uint32_t val)
Krunal Sonie3531942016-04-12 17:43:53 -0700821{
Jeff Johnson0a8786a2018-12-02 10:49:01 -0800822 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Vignesh Viswanathan4e65e8e2018-05-01 12:04:16 +0530823 QDF_STATUS status;
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +0530824
Naveen Rawatd2657be2017-10-10 14:31:23 -0700825 ucfg_wifi_pos_set_ftm_cap(mac_ctx->psoc, val);
Krunal Sonie3531942016-04-12 17:43:53 -0700826
Selvaraj, Sridhar57bb4d02016-08-31 16:14:15 +0530827 if (!val) {
Krunal Sonie3531942016-04-12 17:43:53 -0700828 mac_ctx->rrm.rrmPEContext.rrmEnabledCaps.fine_time_meas_rpt = 0;
829 ((tpRRMCaps)mac_ctx->rrm.rrmSmeContext.
830 rrmConfig.rm_capability)->fine_time_meas_rpt = 0;
831 } else {
832 mac_ctx->rrm.rrmPEContext.rrmEnabledCaps.fine_time_meas_rpt = 1;
833 ((tpRRMCaps)mac_ctx->rrm.rrmSmeContext.
834 rrmConfig.rm_capability)->fine_time_meas_rpt = 1;
835 }
Selvaraj, Sridhar57bb4d02016-08-31 16:14:15 +0530836
837 /* Inform this RRM IE change to FW */
Vignesh Viswanathan4e65e8e2018-05-01 12:04:16 +0530838 status = sme_acquire_global_lock(&mac_ctx->sme);
839 if (QDF_IS_STATUS_SUCCESS(status)) {
840 csr_roam_offload_scan(mac_ctx, session_id,
Selvaraj, Sridhar57bb4d02016-08-31 16:14:15 +0530841 ROAM_SCAN_OFFLOAD_UPDATE_CFG,
842 REASON_CONNECT_IES_CHANGED);
Vignesh Viswanathan4e65e8e2018-05-01 12:04:16 +0530843 sme_release_global_lock(&mac_ctx->sme);
Vignesh Viswanathan4e65e8e2018-05-01 12:04:16 +0530844 }
Krunal Sonie3531942016-04-12 17:43:53 -0700845}
846
Manikandan Mohan06d38d82018-11-26 18:36:58 -0800847/**
848 * sme_update_neighbor_report_config() - Update CSR config for 11k params
849 * @mac_handle: Pointer to MAC context
850 * @csr_config: Pointer to CSR config data structure
851 *
852 * Return: None
853 */
Jeff Johnsondd821152019-04-02 14:50:51 -0700854static void
855sme_update_neighbor_report_config(struct mac_context *mac,
856 struct csr_config_params *csr_config)
Manikandan Mohan06d38d82018-11-26 18:36:58 -0800857{
858 struct wlan_fwol_neighbor_report_cfg fwol_neighbor_report_cfg = {0};
859 QDF_STATUS status;
860
861 status = ucfg_fwol_get_neighbor_report_cfg(mac->psoc,
862 &fwol_neighbor_report_cfg);
863 if (!QDF_IS_STATUS_SUCCESS(status))
864 sme_err("Using defaults for 11K offload params: Error: %d",
865 status);
866
867 csr_config->offload_11k_enable_bitmask =
868 fwol_neighbor_report_cfg.enable_bitmask;
869 csr_config->neighbor_report_offload.params_bitmask =
870 fwol_neighbor_report_cfg.params_bitmask;
871 csr_config->neighbor_report_offload.time_offset =
872 fwol_neighbor_report_cfg.time_offset;
873 csr_config->neighbor_report_offload.low_rssi_offset =
874 fwol_neighbor_report_cfg.low_rssi_offset;
875 csr_config->neighbor_report_offload.bmiss_count_trigger =
876 fwol_neighbor_report_cfg.bmiss_count_trigger;
877 csr_config->neighbor_report_offload.per_threshold_offset =
878 fwol_neighbor_report_cfg.per_threshold_offset;
879 csr_config->neighbor_report_offload.neighbor_report_cache_timeout =
880 fwol_neighbor_report_cfg.cache_timeout;
881 csr_config->neighbor_report_offload.max_neighbor_report_req_cap =
882 fwol_neighbor_report_cfg.max_req_cap;
883}
884
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +0530885/*
886 * sme_update_config() - Change configurations for all SME moduels
887 * The function updates some configuration for modules in SME, CSR, etc
888 * during SMEs close open sequence.
889 * Modules inside SME apply the new configuration at the next transaction.
890 * This is a synchronous call
891 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -0800892 * mac_handle - The handle returned by mac_open.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +0530893 * pSmeConfigParams - a pointer to a caller allocated object of
Jeff Johnson46b4f0e2019-03-08 10:48:35 -0800894 * struct sme_config_params.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +0530895 * Return QDF_STATUS_SUCCESS - SME update the config parameters successfully.
896 * Other status means SME is failed to update the config parameters.
897 */
Jeff Johnson46b4f0e2019-03-08 10:48:35 -0800898QDF_STATUS sme_update_config(mac_handle_t mac_handle,
899 struct sme_config_params *pSmeConfigParams)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800900{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530901 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -0800902 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800903
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +0530904 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800905 TRACE_CODE_SME_RX_HDD_MSG_UPDATE_CONFIG, NO_SESSION,
906 0));
Jeff Johnson038efe72019-03-18 13:39:31 -0700907 if (!pSmeConfigParams) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -0700908 sme_err("SME config params empty");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800909 return status;
910 }
Jeff Johnsone94ccd02019-04-02 15:02:56 -0700911 sme_update_neighbor_report_config(mac, &pSmeConfigParams->csr_config);
Jeff Johnson01f2c232018-11-21 19:17:44 -0800912 status = csr_change_default_config_param(mac, &pSmeConfigParams->
Jeff Johnsone94ccd02019-04-02 15:02:56 -0700913 csr_config);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800914
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +0530915 if (!QDF_IS_STATUS_SUCCESS(status))
Srinivas Girigowda2da81e22017-03-16 21:22:19 -0700916 sme_err("csr_change_default_config_param failed status: %d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800917 status);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800918
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +0530919 /* For SOC, CFG is set before start We don't want to apply global CFG
920 * in connect state because that may cause some side affect
921 */
Jeff Johnson01f2c232018-11-21 19:17:44 -0800922 if (csr_is_all_session_disconnected(mac))
923 csr_set_global_cfgs(mac);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800924
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800925 return status;
926}
927
928/**
929 * sme_update_roam_params() - Store/Update the roaming params
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -0800930 * @mac_handle: Opaque handle to the global MAC context
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800931 * @session_id: SME Session ID
932 * @roam_params_src: The source buffer to copy
933 * @update_param: Type of parameter to be updated
934 *
935 * Return: Return the status of the updation.
936 */
Jeff Johnsonc7309062018-11-09 20:59:42 -0800937QDF_STATUS sme_update_roam_params(mac_handle_t mac_handle,
938 uint8_t session_id,
939 struct roam_ext_params *roam_params_src,
940 int update_param)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800941{
Jeff Johnson0a8786a2018-12-02 10:49:01 -0800942 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800943 struct roam_ext_params *roam_params_dst;
Vignesh Viswanathan4e65e8e2018-05-01 12:04:16 +0530944 QDF_STATUS status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800945 uint8_t i;
946
947 roam_params_dst = &mac_ctx->roam.configParam.roam_params;
948 switch (update_param) {
949 case REASON_ROAM_EXT_SCAN_PARAMS_CHANGED:
Wu Gaoca416ff2018-09-17 11:05:07 +0800950 mac_ctx->mlme_cfg->lfr.rssi_boost_threshold_5g =
Srinivas Girigowda72f30392017-07-13 18:55:09 -0700951 roam_params_src->raise_rssi_thresh_5g;
Wu Gaoca416ff2018-09-17 11:05:07 +0800952 mac_ctx->mlme_cfg->lfr.rssi_penalize_threshold_5g =
Srinivas Girigowda72f30392017-07-13 18:55:09 -0700953 roam_params_src->drop_rssi_thresh_5g;
Wu Gaoca416ff2018-09-17 11:05:07 +0800954 mac_ctx->mlme_cfg->lfr.rssi_boost_factor_5g =
Srinivas Girigowda72f30392017-07-13 18:55:09 -0700955 roam_params_src->raise_factor_5g;
Wu Gaoca416ff2018-09-17 11:05:07 +0800956 mac_ctx->mlme_cfg->lfr.rssi_penalize_factor_5g =
Srinivas Girigowda72f30392017-07-13 18:55:09 -0700957 roam_params_src->drop_factor_5g;
Wu Gaoca416ff2018-09-17 11:05:07 +0800958 mac_ctx->mlme_cfg->lfr.max_rssi_boost_5g =
Srinivas Girigowda72f30392017-07-13 18:55:09 -0700959 roam_params_src->max_raise_rssi_5g;
Wu Gaoca416ff2018-09-17 11:05:07 +0800960 mac_ctx->mlme_cfg->lfr.max_rssi_penalize_5g =
Srinivas Girigowda72f30392017-07-13 18:55:09 -0700961 roam_params_src->max_drop_rssi_5g;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800962 roam_params_dst->alert_rssi_threshold =
Srinivas Girigowda72f30392017-07-13 18:55:09 -0700963 roam_params_src->alert_rssi_threshold;
Wu Gaoca416ff2018-09-17 11:05:07 +0800964 mac_ctx->mlme_cfg->lfr.enable_5g_band_pref = true;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800965 break;
966 case REASON_ROAM_SET_SSID_ALLOWED:
hangtian127c9532019-01-12 13:29:07 +0800967 qdf_mem_zero(&roam_params_dst->ssid_allowed_list,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800968 sizeof(tSirMacSSid) * MAX_SSID_ALLOWED_LIST);
969 roam_params_dst->num_ssid_allowed_list =
Srinivas Girigowda72f30392017-07-13 18:55:09 -0700970 roam_params_src->num_ssid_allowed_list;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800971 for (i = 0; i < roam_params_dst->num_ssid_allowed_list; i++) {
972 roam_params_dst->ssid_allowed_list[i].length =
Srinivas Girigowda72f30392017-07-13 18:55:09 -0700973 roam_params_src->ssid_allowed_list[i].length;
Anurag Chouhan600c3a02016-03-01 10:33:54 +0530974 qdf_mem_copy(roam_params_dst->ssid_allowed_list[i].ssId,
Srinivas Girigowda72f30392017-07-13 18:55:09 -0700975 roam_params_src->ssid_allowed_list[i].ssId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800976 roam_params_dst->ssid_allowed_list[i].length);
977 }
978 break;
979 case REASON_ROAM_SET_FAVORED_BSSID:
hangtian127c9532019-01-12 13:29:07 +0800980 qdf_mem_zero(&roam_params_dst->bssid_favored,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800981 sizeof(tSirMacAddr) * MAX_BSSID_FAVORED);
982 roam_params_dst->num_bssid_favored =
Srinivas Girigowda72f30392017-07-13 18:55:09 -0700983 roam_params_src->num_bssid_favored;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800984 for (i = 0; i < roam_params_dst->num_bssid_favored; i++) {
Anurag Chouhan600c3a02016-03-01 10:33:54 +0530985 qdf_mem_copy(&roam_params_dst->bssid_favored[i],
Srinivas Girigowda72f30392017-07-13 18:55:09 -0700986 &roam_params_src->bssid_favored[i],
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800987 sizeof(tSirMacAddr));
988 roam_params_dst->bssid_favored_factor[i] =
Srinivas Girigowda72f30392017-07-13 18:55:09 -0700989 roam_params_src->bssid_favored_factor[i];
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800990 }
991 break;
992 case REASON_ROAM_SET_BLACKLIST_BSSID:
hangtian127c9532019-01-12 13:29:07 +0800993 qdf_mem_zero(&roam_params_dst->bssid_avoid_list,
Anurag Chouhan6d760662016-02-20 16:05:43 +0530994 QDF_MAC_ADDR_SIZE * MAX_BSSID_AVOID_LIST);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800995 roam_params_dst->num_bssid_avoid_list =
Srinivas Girigowda72f30392017-07-13 18:55:09 -0700996 roam_params_src->num_bssid_avoid_list;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800997 for (i = 0; i < roam_params_dst->num_bssid_avoid_list; i++) {
Anurag Chouhanc5548422016-02-24 18:33:27 +0530998 qdf_copy_macaddr(&roam_params_dst->bssid_avoid_list[i],
Srinivas Girigowda72f30392017-07-13 18:55:09 -0700999 &roam_params_src->bssid_avoid_list[i]);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001000 }
1001 break;
1002 case REASON_ROAM_GOOD_RSSI_CHANGED:
1003 roam_params_dst->good_rssi_roam =
Srinivas Girigowda72f30392017-07-13 18:55:09 -07001004 roam_params_src->good_rssi_roam;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001005 break;
1006 default:
1007 break;
1008 }
Vignesh Viswanathan4e65e8e2018-05-01 12:04:16 +05301009
1010 status = sme_acquire_global_lock(&mac_ctx->sme);
1011 if (QDF_IS_STATUS_SUCCESS(status)) {
1012 csr_roam_offload_scan(mac_ctx, session_id,
1013 ROAM_SCAN_OFFLOAD_UPDATE_CFG,
1014 update_param);
1015 sme_release_global_lock(&mac_ctx->sme);
Vignesh Viswanathan4e65e8e2018-05-01 12:04:16 +05301016 }
Abhishek Singh158fe252017-03-23 11:09:34 +05301017
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001018 return 0;
1019}
1020
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001021#ifdef WLAN_FEATURE_EXTWOW_SUPPORT
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001022
Krishna Kumaar Natarajand9131902015-10-19 11:52:47 -07001023/**
1024 * sme_process_ready_to_ext_wow() - inform ready to ExtWoW indication.
Jeff Johnson9d7c99e2018-06-28 15:36:00 -07001025 * @mac: Global MAC context
1026 * @indication: ready to Ext WoW indication from lower layer
Krishna Kumaar Natarajand9131902015-10-19 11:52:47 -07001027 *
1028 * On getting ready to Ext WoW indication, this function calls callback
Jeff Johnson9d7c99e2018-06-28 15:36:00 -07001029 * registered (HDD callback) with SME to inform ready to ExtWoW indication.
Krishna Kumaar Natarajand9131902015-10-19 11:52:47 -07001030 *
1031 * Return: None
1032 */
Jeff Johnson0a8786a2018-12-02 10:49:01 -08001033static void sme_process_ready_to_ext_wow(struct mac_context *mac,
Jeff Johnson9d7c99e2018-06-28 15:36:00 -07001034 tpSirReadyToExtWoWInd indication)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001035{
Jeff Johnson9d7c99e2018-06-28 15:36:00 -07001036 if (!mac) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301037 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_FATAL,
Jeff Johnson9d7c99e2018-06-28 15:36:00 -07001038 "%s: mac is null", __func__);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001039 return;
1040 }
1041
Jeff Johnson038efe72019-03-18 13:39:31 -07001042 if (mac->readyToExtWoWCallback) {
Jeff Johnson9d7c99e2018-06-28 15:36:00 -07001043 mac->readyToExtWoWCallback(mac->readyToExtWoWContext,
1044 indication->status);
1045 mac->readyToExtWoWCallback = NULL;
1046 mac->readyToExtWoWContext = NULL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001047 }
1048
1049}
1050#endif
1051
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05301052/*
1053 * sme_hdd_ready_ind() - SME sends eWNI_SME_SYS_READY_IND to PE to inform
1054 * that the NIC is ready tio run.
1055 * The function is called by HDD at the end of initialization stage so PE/HAL
1056 * can enable the NIC to running state.
1057 * This is a synchronous call
1058 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08001059 * @mac_handle - The handle returned by mac_open.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05301060 * Return QDF_STATUS_SUCCESS - eWNI_SME_SYS_READY_IND is sent to PE
1061 * successfully.
1062 * Other status means SME failed to send the message to PE.
1063 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08001064QDF_STATUS sme_hdd_ready_ind(mac_handle_t mac_handle)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001065{
Jeff Johnson47e4b552019-02-01 23:12:25 -08001066 struct sme_ready_req *msg;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301067 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08001068 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001069
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301070 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001071 TRACE_CODE_SME_RX_HDD_MSG_HDDREADYIND, NO_SESSION, 0));
1072 do {
1073
Abhishek Singhde410b72017-05-22 15:25:39 +05301074 msg = qdf_mem_malloc(sizeof(*msg));
Arif Hussain0ef77082018-10-10 16:42:53 -07001075 if (!msg)
Abhishek Singhde410b72017-05-22 15:25:39 +05301076 return QDF_STATUS_E_NOMEM;
Arif Hussain0ef77082018-10-10 16:42:53 -07001077
Abhishek Singhde410b72017-05-22 15:25:39 +05301078 msg->messageType = eWNI_SME_SYS_READY_IND;
1079 msg->length = sizeof(*msg);
Abhishek Singhde410b72017-05-22 15:25:39 +05301080 msg->csr_roam_synch_cb = csr_roam_synch_callback;
Sandeep Puligilla1426d612017-04-12 18:22:06 -07001081 msg->sme_msg_cb = sme_process_msg_callback;
Vignesh Viswanathan3d478032018-08-02 20:18:53 +05301082 msg->stop_roaming_cb = sme_stop_roaming;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001083
Jeff Johnsonb460dd72018-11-08 10:26:51 -08001084 status = u_mac_post_ctrl_msg(mac_handle, (tSirMbMsg *)msg);
Jeff Johnsonc09caa42018-06-07 22:58:55 -07001085 if (QDF_IS_STATUS_ERROR(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07001086 sme_err("u_mac_post_ctrl_msg failed to send eWNI_SME_SYS_READY_IND");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001087 break;
1088 }
1089
Jeff Johnson01f2c232018-11-21 19:17:44 -08001090 status = csr_ready(mac);
Jeff Johnsonc09caa42018-06-07 22:58:55 -07001091 if (QDF_IS_STATUS_ERROR(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07001092 sme_err("csr_ready failed with status: %d", status);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001093 break;
1094 }
1095
Jeff Johnson01f2c232018-11-21 19:17:44 -08001096 mac->sme.state = SME_STATE_READY;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001097 } while (0);
1098
1099 return status;
1100}
1101
Abhinav Kumar4d1f9f42019-05-07 13:14:49 +05301102#ifdef WLAN_BCN_RECV_FEATURE
1103QDF_STATUS
1104sme_register_bcn_report_pe_cb(mac_handle_t mac_handle, beacon_report_cb cb)
1105{
1106 struct scheduler_msg msg = {0};
1107 QDF_STATUS status;
1108
1109 msg.type = WNI_SME_REGISTER_BCN_REPORT_SEND_CB;
1110 msg.callback = cb;
1111
1112 status = scheduler_post_message(QDF_MODULE_ID_SME,
1113 QDF_MODULE_ID_PE,
1114 QDF_MODULE_ID_PE, &msg);
1115 if (QDF_IS_STATUS_ERROR(status))
1116 sme_err("Failed to post message to LIM");
1117
1118 return status;
1119}
1120#endif
1121
Tushnim Bhattacharyyac3c375e2017-08-04 23:39:55 -07001122QDF_STATUS sme_get_valid_channels(uint8_t *chan_list, uint32_t *list_len)
1123{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08001124 struct mac_context *mac_ctx = sme_get_mac_context();
Tushnim Bhattacharyyac3c375e2017-08-04 23:39:55 -07001125
Jeff Johnson038efe72019-03-18 13:39:31 -07001126 if (!mac_ctx) {
Tushnim Bhattacharyyac3c375e2017-08-04 23:39:55 -07001127 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
1128 FL("Invalid MAC context"));
1129 return QDF_STATUS_E_FAILURE;
1130 }
1131
Wu Gaof3cbeaf2019-01-15 18:26:25 +08001132 *list_len = (uint32_t)mac_ctx->mlme_cfg->reg.valid_channel_list_num;
1133 qdf_mem_copy(chan_list, mac_ctx->mlme_cfg->reg.valid_channel_list,
1134 *list_len);
1135
1136 return QDF_STATUS_SUCCESS;
Tushnim Bhattacharyyac3c375e2017-08-04 23:39:55 -07001137}
1138
Sandeep Puligilla8e89d572018-04-02 18:07:45 -07001139#ifdef WLAN_CONV_SPECTRAL_ENABLE
Jeff Johnson0a8786a2018-12-02 10:49:01 -08001140static QDF_STATUS sme_register_spectral_cb(struct mac_context *mac_ctx)
Sandeep Puligilla8e89d572018-04-02 18:07:45 -07001141{
1142 struct spectral_legacy_cbacks spectral_cb;
1143 QDF_STATUS status;
1144
1145 spectral_cb.vdev_get_chan_freq = sme_get_oper_chan_freq;
1146 spectral_cb.vdev_get_ch_width = sme_get_oper_ch_width;
1147 spectral_cb.vdev_get_sec20chan_freq_mhz = sme_get_sec20chan_freq_mhz;
1148 status = spectral_register_legacy_cb(mac_ctx->psoc, &spectral_cb);
1149
1150 return status;
1151}
1152#else
Jeff Johnson0a8786a2018-12-02 10:49:01 -08001153static QDF_STATUS sme_register_spectral_cb(struct mac_context *mac_ctx)
Sandeep Puligilla8e89d572018-04-02 18:07:45 -07001154{
1155 return QDF_STATUS_SUCCESS;
1156}
1157#endif
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05301158/*
1159 * sme_start() - Put all SME modules at ready state.
1160 * The function starts each module in SME, PMC, CSR, etc. . Upon
1161 * successfully return, all modules are ready to run.
1162 * This is a synchronous call
1163 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08001164 * mac_handle - The handle returned by mac_open.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05301165 * Return QDF_STATUS_SUCCESS - SME is ready.
1166 * Other status means SME is failed to start
1167 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08001168QDF_STATUS sme_start(mac_handle_t mac_handle)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001169{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301170 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08001171 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Tushnim Bhattacharyya91049632017-03-17 17:31:27 -07001172 struct policy_mgr_sme_cbacks sme_cbacks;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001173
1174 do {
Jeff Johnson01f2c232018-11-21 19:17:44 -08001175 status = csr_start(mac);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301176 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07001177 sme_err("csr_start failed status: %d", status);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001178 break;
1179 }
Tushnim Bhattacharyya91049632017-03-17 17:31:27 -07001180 sme_cbacks.sme_get_nss_for_vdev = sme_get_vdev_type_nss;
Tushnim Bhattacharyyac3c375e2017-08-04 23:39:55 -07001181 sme_cbacks.sme_get_valid_channels = sme_get_valid_channels;
Tushnim Bhattacharyya91049632017-03-17 17:31:27 -07001182 sme_cbacks.sme_nss_update_request = sme_nss_update_request;
1183 sme_cbacks.sme_pdev_set_hw_mode = sme_pdev_set_hw_mode;
1184 sme_cbacks.sme_pdev_set_pcl = sme_pdev_set_pcl;
1185 sme_cbacks.sme_soc_set_dual_mac_config =
1186 sme_soc_set_dual_mac_config;
Archana Ramachandran2eb7a612017-03-23 22:58:42 -07001187 sme_cbacks.sme_change_mcc_beacon_interval =
1188 sme_change_mcc_beacon_interval;
1189 sme_cbacks.sme_get_ap_channel_from_scan =
1190 sme_get_ap_channel_from_scan;
1191 sme_cbacks.sme_scan_result_purge = sme_scan_result_purge;
Jeff Johnson01f2c232018-11-21 19:17:44 -08001192 status = policy_mgr_register_sme_cb(mac->psoc, &sme_cbacks);
Tushnim Bhattacharyya91049632017-03-17 17:31:27 -07001193 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda2c263352017-03-17 17:49:53 -07001194 sme_err("Failed to register sme cb with Policy Manager: %d",
Tushnim Bhattacharyya91049632017-03-17 17:31:27 -07001195 status);
1196 break;
1197 }
Jeff Johnson01f2c232018-11-21 19:17:44 -08001198 sme_register_spectral_cb(mac);
1199 mac->sme.state = SME_STATE_START;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001200
Sandeep Puligilla66d09c42017-09-06 17:10:27 -07001201 /* START RRM */
Jeff Johnson01f2c232018-11-21 19:17:44 -08001202 status = rrm_start(mac);
Sandeep Puligilla66d09c42017-09-06 17:10:27 -07001203 if (!QDF_IS_STATUS_SUCCESS(status)) {
1204 sme_err("Failed to start RRM");
1205 break;
1206 }
1207 } while (0);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001208 return status;
1209}
1210
Jeff Johnson0a8786a2018-12-02 10:49:01 -08001211static QDF_STATUS dfs_msg_processor(struct mac_context *mac,
Arif Hussaincd151632017-02-11 16:57:19 -08001212 struct scheduler_msg *msg)
1213{
1214 QDF_STATUS status = QDF_STATUS_SUCCESS;
Min Liu3621ede2018-11-07 18:36:00 +08001215 struct csr_roam_info *roam_info;
Arif Hussaincd151632017-02-11 16:57:19 -08001216 tSirSmeCSAIeTxCompleteRsp *csa_ie_tx_complete_rsp;
1217 uint32_t session_id = 0;
1218 eRoamCmdStatus roam_status;
1219 eCsrRoamResult roam_result;
1220
Min Liu3621ede2018-11-07 18:36:00 +08001221 roam_info = qdf_mem_malloc(sizeof(*roam_info));
1222 if (!roam_info)
1223 return QDF_STATUS_E_NOMEM;
1224
Arif Hussaincd151632017-02-11 16:57:19 -08001225 switch (msg->type) {
1226 case eWNI_SME_DFS_RADAR_FOUND:
1227 {
1228 session_id = msg->bodyval;
1229 roam_status = eCSR_ROAM_DFS_RADAR_IND;
1230 roam_result = eCSR_ROAM_RESULT_DFS_RADAR_FOUND_IND;
Abhishek Singhe4a1f882017-08-10 17:59:44 +05301231 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Arif Hussaincd151632017-02-11 16:57:19 -08001232 "sapdfs: Radar indication event occurred");
1233 break;
1234 }
1235 case eWNI_SME_DFS_CSAIE_TX_COMPLETE_IND:
1236 {
1237 csa_ie_tx_complete_rsp =
1238 (tSirSmeCSAIeTxCompleteRsp *) msg->bodyptr;
1239 if (!csa_ie_tx_complete_rsp) {
1240 sme_err("eWNI_SME_DFS_CSAIE_TX_COMPLETE_IND null msg");
Min Liu3621ede2018-11-07 18:36:00 +08001241 qdf_mem_free(roam_info);
Arif Hussaincd151632017-02-11 16:57:19 -08001242 return QDF_STATUS_E_FAILURE;
1243 }
1244 session_id = csa_ie_tx_complete_rsp->sessionId;
1245 roam_status = eCSR_ROAM_DFS_CHAN_SW_NOTIFY;
1246 roam_result = eCSR_ROAM_RESULT_DFS_CHANSW_UPDATE_SUCCESS;
Abhishek Singhe4a1f882017-08-10 17:59:44 +05301247 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Arif Hussaincd151632017-02-11 16:57:19 -08001248 "eWNI_SME_DFS_CSAIE_TX_COMPLETE_IND session=%d",
1249 session_id);
1250 break;
1251 }
1252 case eWNI_SME_DFS_CAC_COMPLETE:
1253 {
1254 session_id = msg->bodyval;
1255 roam_status = eCSR_ROAM_CAC_COMPLETE_IND;
1256 roam_result = eCSR_ROAM_RESULT_CAC_END_IND;
Abhishek Singhe4a1f882017-08-10 17:59:44 +05301257 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Arif Hussaincd151632017-02-11 16:57:19 -08001258 "sapdfs: Received eWNI_SME_DFS_CAC_COMPLETE vdevid%d",
1259 session_id);
1260 break;
1261 }
Abhishek Singh20a8e442018-09-12 15:50:44 +05301262 case eWNI_SME_CSA_RESTART_RSP:
1263 {
1264 session_id = msg->bodyval;
1265 roam_status = 0;
1266 roam_result = eCSR_ROAM_RESULT_CSA_RESTART_RSP;
1267 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
1268 "sapdfs: Received eCSR_ROAM_RESULT_DFS_CHANSW_UPDATE_REQ vdevid%d",
1269 session_id);
1270 break;
1271 }
Arif Hussaincd151632017-02-11 16:57:19 -08001272 default:
1273 {
1274 sme_err("Invalid DFS message: 0x%x", msg->type);
Min Liu3621ede2018-11-07 18:36:00 +08001275 qdf_mem_free(roam_info);
Arif Hussaincd151632017-02-11 16:57:19 -08001276 status = QDF_STATUS_E_FAILURE;
1277 return status;
1278 }
1279 }
1280
1281 /* Indicate Radar Event to SAP */
Min Liu3621ede2018-11-07 18:36:00 +08001282 csr_roam_call_callback(mac, session_id, roam_info, 0,
Arif Hussaincd151632017-02-11 16:57:19 -08001283 roam_status, roam_result);
Min Liu3621ede2018-11-07 18:36:00 +08001284 qdf_mem_free(roam_info);
Arif Hussaincd151632017-02-11 16:57:19 -08001285 return status;
1286}
1287
1288
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001289#ifdef WLAN_FEATURE_11W
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05301290/*
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001291 * Handle the unprotected management frame indication from LIM and
1292 * forward it to HDD.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05301293 */
Jeff Johnson2ef47442018-06-09 23:43:40 -07001294static QDF_STATUS
Jeff Johnson0a8786a2018-12-02 10:49:01 -08001295sme_unprotected_mgmt_frm_ind(struct mac_context *mac,
Jeff Johnson2ef47442018-06-09 23:43:40 -07001296 tpSirSmeUnprotMgmtFrameInd pSmeMgmtFrm)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001297{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301298 QDF_STATUS status = QDF_STATUS_SUCCESS;
Min Liu3621ede2018-11-07 18:36:00 +08001299 struct csr_roam_info *roam_info;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001300 uint32_t SessionId = pSmeMgmtFrm->sessionId;
1301
Min Liu3621ede2018-11-07 18:36:00 +08001302 roam_info = qdf_mem_malloc(sizeof(*roam_info));
1303 if (!roam_info)
1304 return QDF_STATUS_E_NOMEM;
1305
1306 roam_info->nFrameLength = pSmeMgmtFrm->frameLen;
1307 roam_info->pbFrames = pSmeMgmtFrm->frameBuf;
1308 roam_info->frameType = pSmeMgmtFrm->frameType;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001309
1310 /* forward the mgmt frame to HDD */
Min Liu3621ede2018-11-07 18:36:00 +08001311 csr_roam_call_callback(mac, SessionId, roam_info, 0,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001312 eCSR_ROAM_UNPROT_MGMT_FRAME_IND, 0);
1313
Min Liu3621ede2018-11-07 18:36:00 +08001314 qdf_mem_free(roam_info);
1315
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001316 return status;
1317}
1318#endif
1319
Jeff Johnsonc7309062018-11-09 20:59:42 -08001320QDF_STATUS sme_update_new_channel_event(mac_handle_t mac_handle,
1321 uint8_t session_id)
Kapil Gupta8878ad92017-02-13 11:56:04 +05301322{
1323 QDF_STATUS status = QDF_STATUS_SUCCESS;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08001324 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Jeff Johnson172237b2017-11-07 15:32:59 -08001325 struct csr_roam_info *roamInfo;
Kapil Gupta8878ad92017-02-13 11:56:04 +05301326 eRoamCmdStatus roamStatus;
1327 eCsrRoamResult roamResult;
1328
1329 roamInfo = qdf_mem_malloc(sizeof(*roamInfo));
Arif Hussain0ef77082018-10-10 16:42:53 -07001330 if (!roamInfo)
Krunal Soni3fa80e22018-01-09 14:16:02 -08001331 return QDF_STATUS_E_FAILURE;
Kapil Gupta8878ad92017-02-13 11:56:04 +05301332
Arif Hussain0ef77082018-10-10 16:42:53 -07001333 roamInfo->dfs_event.sessionId = session_id;
Kapil Gupta8878ad92017-02-13 11:56:04 +05301334 roamStatus = eCSR_ROAM_CHANNEL_COMPLETE_IND;
1335 roamResult = eCSR_ROAM_RESULT_DFS_RADAR_FOUND_IND;
Abhishek Singhe4a1f882017-08-10 17:59:44 +05301336 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Kapil Gupta8878ad92017-02-13 11:56:04 +05301337 "sapdfs: Updated new channel event");
1338
1339 /* Indicate channel Event to SAP */
1340 csr_roam_call_callback(mac, session_id, roamInfo, 0,
1341 roamStatus, roamResult);
1342
1343 qdf_mem_free(roamInfo);
1344 return status;
1345}
1346
1347
Abhishek Singh518323d2015-10-19 17:42:01 +05301348/**
1349 * sme_extended_change_channel_ind()- function to indicate ECSA
1350 * action frame is received in lim to SAP
1351 * @mac_ctx: pointer to global mac structure
1352 * @msg_buf: contain new channel and session id.
1353 *
1354 * This function is called to post ECSA action frame
1355 * receive event to SAP.
1356 *
1357 * Return: success if msg indicated to SAP else return failure
1358 */
Jeff Johnson0a8786a2018-12-02 10:49:01 -08001359static QDF_STATUS sme_extended_change_channel_ind(struct mac_context *mac_ctx,
Abhishek Singh518323d2015-10-19 17:42:01 +05301360 void *msg_buf)
1361{
1362 struct sir_sme_ext_cng_chan_ind *ext_chan_ind;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301363 QDF_STATUS status = QDF_STATUS_SUCCESS;
Abhishek Singh518323d2015-10-19 17:42:01 +05301364 uint32_t session_id = 0;
Min Liu3621ede2018-11-07 18:36:00 +08001365 struct csr_roam_info *roam_info;
Abhishek Singh518323d2015-10-19 17:42:01 +05301366 eRoamCmdStatus roam_status;
1367 eCsrRoamResult roam_result;
1368
Abhishek Singh518323d2015-10-19 17:42:01 +05301369 ext_chan_ind = msg_buf;
Jeff Johnson038efe72019-03-18 13:39:31 -07001370 if (!ext_chan_ind) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07001371 sme_err("ext_chan_ind is NULL");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301372 return QDF_STATUS_E_FAILURE;
Abhishek Singh518323d2015-10-19 17:42:01 +05301373 }
Min Liu3621ede2018-11-07 18:36:00 +08001374 roam_info = qdf_mem_malloc(sizeof(*roam_info));
1375 if (!roam_info)
1376 return QDF_STATUS_E_NOMEM;
Abhishek Singh518323d2015-10-19 17:42:01 +05301377 session_id = ext_chan_ind->session_id;
Min Liu3621ede2018-11-07 18:36:00 +08001378 roam_info->target_channel = ext_chan_ind->new_channel;
Abhishek Singh518323d2015-10-19 17:42:01 +05301379 roam_status = eCSR_ROAM_EXT_CHG_CHNL_IND;
1380 roam_result = eCSR_ROAM_EXT_CHG_CHNL_UPDATE_IND;
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07001381 sme_debug("sapdfs: Received eWNI_SME_EXT_CHANGE_CHANNEL_IND for session id [%d]",
1382 session_id);
Abhishek Singh518323d2015-10-19 17:42:01 +05301383
1384 /* Indicate Ext Channel Change event to SAP */
Min Liu3621ede2018-11-07 18:36:00 +08001385 csr_roam_call_callback(mac_ctx, session_id, roam_info, 0,
1386 roam_status, roam_result);
1387 qdf_mem_free(roam_info);
Abhishek Singh518323d2015-10-19 17:42:01 +05301388 return status;
1389}
1390
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001391#ifdef FEATURE_WLAN_ESE
1392/**
1393 * sme_update_is_ese_feature_enabled() - enable/disable ESE support at runtime
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -08001394 * @mac_handle: Opaque handle to the global MAC context
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001395 * @sessionId: session id
1396 * @isEseIniFeatureEnabled: ese ini enabled
1397 *
1398 * It is used at in the REG_DYNAMIC_VARIABLE macro definition of
1399 * isEseIniFeatureEnabled. This is a synchronous call
1400 *
1401 * Return: QDF_STATUS enumeration
1402 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08001403QDF_STATUS sme_update_is_ese_feature_enabled(mac_handle_t mac_handle,
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001404 uint8_t sessionId, const bool isEseIniFeatureEnabled)
1405{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08001406 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Vignesh Viswanathan4e65e8e2018-05-01 12:04:16 +05301407 QDF_STATUS status;
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001408
Wu Gao51a63562018-11-08 16:29:10 +08001409 if (mac->mlme_cfg->lfr.ese_enabled ==
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001410 isEseIniFeatureEnabled) {
Abhishek Singhe4a1f882017-08-10 17:59:44 +05301411 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001412 "%s: ESE Mode is already enabled or disabled, nothing to do (returning) old(%d) new(%d)",
1413 __func__,
Wu Gao51a63562018-11-08 16:29:10 +08001414 mac->mlme_cfg->lfr.ese_enabled,
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001415 isEseIniFeatureEnabled);
1416 return QDF_STATUS_SUCCESS;
1417 }
1418
Abhishek Singhe4a1f882017-08-10 17:59:44 +05301419 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001420 "%s: EseEnabled is changed from %d to %d", __func__,
Wu Gao51a63562018-11-08 16:29:10 +08001421 mac->mlme_cfg->lfr.ese_enabled,
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001422 isEseIniFeatureEnabled);
Wu Gao51a63562018-11-08 16:29:10 +08001423 mac->mlme_cfg->lfr.ese_enabled = isEseIniFeatureEnabled;
Varun Reddy Yeturuff4feb02016-04-20 12:26:11 -07001424 csr_neighbor_roam_update_fast_roaming_enabled(
Jeff Johnson01f2c232018-11-21 19:17:44 -08001425 mac, sessionId, isEseIniFeatureEnabled);
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001426
1427 if (true == isEseIniFeatureEnabled)
Wu Gao51a63562018-11-08 16:29:10 +08001428 mac->mlme_cfg->lfr.fast_transition_enabled = true;
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001429
Wu Gao51a63562018-11-08 16:29:10 +08001430 if (mac->mlme_cfg->lfr.roam_scan_offload_enabled) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08001431 status = sme_acquire_global_lock(&mac->sme);
Vignesh Viswanathan4e65e8e2018-05-01 12:04:16 +05301432 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08001433 csr_roam_offload_scan(mac, sessionId,
Vignesh Viswanathan4e65e8e2018-05-01 12:04:16 +05301434 ROAM_SCAN_OFFLOAD_UPDATE_CFG,
1435 REASON_ESE_INI_CFG_CHANGED);
Jeff Johnson01f2c232018-11-21 19:17:44 -08001436 sme_release_global_lock(&mac->sme);
Vignesh Viswanathan4e65e8e2018-05-01 12:04:16 +05301437 } else {
Vignesh Viswanathan4e65e8e2018-05-01 12:04:16 +05301438 return status;
1439 }
1440 }
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001441 return QDF_STATUS_SUCCESS;
1442}
1443
Jeff Johnson36583f02019-02-26 08:02:11 -08001444QDF_STATUS sme_set_plm_request(mac_handle_t mac_handle,
1445 struct plm_req_params *req)
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001446{
1447 QDF_STATUS status;
1448 bool ret = false;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08001449 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Wu Gao0821b0d2019-01-11 17:31:11 +08001450 uint8_t ch_list[CFG_VALID_CHANNEL_LIST_LEN] = { 0 };
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001451 uint8_t count, valid_count = 0;
Rajeev Kumar37d478b2017-04-17 16:59:28 -07001452 struct scheduler_msg msg = {0};
Jeff Johnson36583f02019-02-26 08:02:11 -08001453 struct csr_roam_session *session;
1454 struct plm_req_params *body;
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001455
Harprit Chhabadacb9f73c2019-04-04 14:24:43 -07001456 if (!req)
1457 return QDF_STATUS_E_FAILURE;
1458
Jeff Johnson01f2c232018-11-21 19:17:44 -08001459 status = sme_acquire_global_lock(&mac->sme);
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001460 if (!QDF_IS_STATUS_SUCCESS(status))
1461 return status;
1462
Jeff Johnson36583f02019-02-26 08:02:11 -08001463 session = CSR_GET_SESSION(mac, req->vdev_id);
1464 if (!session) {
1465 sme_err("session %d not found", req->vdev_id);
Jeff Johnson01f2c232018-11-21 19:17:44 -08001466 sme_release_global_lock(&mac->sme);
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001467 return QDF_STATUS_E_FAILURE;
1468 }
1469
Jeff Johnson36583f02019-02-26 08:02:11 -08001470 if (!session->sessionActive) {
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001471 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
1472 FL("Invalid Sessionid"));
Jeff Johnson01f2c232018-11-21 19:17:44 -08001473 sme_release_global_lock(&mac->sme);
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001474 return QDF_STATUS_E_FAILURE;
1475 }
1476
Jeff Johnson36583f02019-02-26 08:02:11 -08001477 /* per contract must make a copy of the params when messaging */
1478 body = qdf_mem_malloc(sizeof(*body));
Harprit Chhabadacb9f73c2019-04-04 14:24:43 -07001479
1480 if (!body) {
1481 sme_release_global_lock(&mac->sme);
Jeff Johnson36583f02019-02-26 08:02:11 -08001482 return QDF_STATUS_E_NOMEM;
Harprit Chhabadacb9f73c2019-04-04 14:24:43 -07001483 }
1484
Jeff Johnson36583f02019-02-26 08:02:11 -08001485 *body = *req;
1486
1487 if (!body->enable)
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001488 goto send_plm_start;
1489 /* validating channel numbers */
Jeff Johnson36583f02019-02-26 08:02:11 -08001490 for (count = 0; count < body->plm_num_ch; count++) {
1491 uint8_t ch = body->plm_ch_list[count];
1492
1493 ret = csr_is_supported_channel(mac, ch);
1494 if (!ret) {
1495 /* Not supported, ignore the channel */
1496 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
1497 FL("Unsupported channel %d ignored for PLM"),
1498 ch);
1499 continue;
1500 }
1501
1502 if (ch > 14) {
1503 enum channel_state state =
1504 wlan_reg_get_channel_state(mac->pdev, ch);
1505
1506 if (state == CHANNEL_STATE_DFS) {
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001507 /* DFS channel is provided, no PLM bursts can be
1508 * transmitted. Ignoring these channels.
1509 */
1510 QDF_TRACE(QDF_MODULE_ID_SME,
Abhishek Singhe4a1f882017-08-10 17:59:44 +05301511 QDF_TRACE_LEVEL_DEBUG,
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001512 FL("DFS channel %d ignored for PLM"),
Jeff Johnson36583f02019-02-26 08:02:11 -08001513 ch);
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001514 continue;
1515 }
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001516 }
Jeff Johnson36583f02019-02-26 08:02:11 -08001517 ch_list[valid_count++] = ch;
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001518 } /* End of for () */
1519
1520 /* Copying back the valid channel list to plm struct */
Jeff Johnson36583f02019-02-26 08:02:11 -08001521 qdf_mem_zero(body->plm_ch_list, body->plm_num_ch);
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001522 if (valid_count)
Jeff Johnson36583f02019-02-26 08:02:11 -08001523 qdf_mem_copy(body->plm_ch_list, ch_list, valid_count);
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001524 /* All are invalid channels, FW need to send the PLM
1525 * report with "incapable" bit set.
1526 */
Jeff Johnson36583f02019-02-26 08:02:11 -08001527 body->plm_num_ch = valid_count;
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001528
1529send_plm_start:
1530 /* PLM START */
1531 msg.type = WMA_SET_PLM_REQ;
1532 msg.reserved = 0;
Jeff Johnson36583f02019-02-26 08:02:11 -08001533 msg.bodyptr = body;
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001534
gaurank kathpalia36b0c582018-08-28 17:45:43 +05301535 if (!QDF_IS_STATUS_SUCCESS(scheduler_post_message(QDF_MODULE_ID_SME,
1536 QDF_MODULE_ID_WMA,
1537 QDF_MODULE_ID_WMA,
1538 &msg))) {
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001539 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
1540 FL("Not able to post WMA_SET_PLM_REQ to WMA"));
Jeff Johnson01f2c232018-11-21 19:17:44 -08001541 sme_release_global_lock(&mac->sme);
Jeff Johnson36583f02019-02-26 08:02:11 -08001542 qdf_mem_free(body);
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001543 return QDF_STATUS_E_FAILURE;
1544 }
1545
Jeff Johnson01f2c232018-11-21 19:17:44 -08001546 sme_release_global_lock(&mac->sme);
Jeff Johnson36583f02019-02-26 08:02:11 -08001547 return QDF_STATUS_SUCCESS;
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001548}
1549
1550/**
1551 * sme_tsm_ie_ind() - sme tsm ie indication
Jeff Johnson24e65b52018-06-10 08:45:26 -07001552 * @mac: Global mac context
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001553 * @pSmeTsmIeInd: Pointer to tsm ie indication
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001554 *
1555 * Handle the tsm ie indication from LIM and forward it to HDD.
1556 *
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001557 * Return: QDF_STATUS enumeration
1558 */
Jeff Johnson0a8786a2018-12-02 10:49:01 -08001559static QDF_STATUS sme_tsm_ie_ind(struct mac_context *mac,
Jeff Johnsone21b0eb2019-02-02 19:31:54 -08001560 struct tsm_ie_ind *pSmeTsmIeInd)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001561{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301562 QDF_STATUS status = QDF_STATUS_SUCCESS;
Min Liu3621ede2018-11-07 18:36:00 +08001563 struct csr_roam_info *roam_info;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001564 uint32_t SessionId = pSmeTsmIeInd->sessionId;
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05301565
Min Liu3621ede2018-11-07 18:36:00 +08001566 roam_info = qdf_mem_malloc(sizeof(*roam_info));
1567 if (!roam_info)
1568 return QDF_STATUS_E_NOMEM;
1569
1570 roam_info->tsm_ie.tsid = pSmeTsmIeInd->tsm_ie.tsid;
1571 roam_info->tsm_ie.state = pSmeTsmIeInd->tsm_ie.state;
1572 roam_info->tsm_ie.msmt_interval = pSmeTsmIeInd->tsm_ie.msmt_interval;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001573 /* forward the tsm ie information to HDD */
Min Liu3621ede2018-11-07 18:36:00 +08001574 csr_roam_call_callback(mac, SessionId, roam_info, 0,
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05301575 eCSR_ROAM_TSM_IE_IND, 0);
Min Liu3621ede2018-11-07 18:36:00 +08001576 qdf_mem_free(roam_info);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001577 return status;
1578}
1579
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001580/**
1581 * sme_set_cckm_ie() - set cckm ie
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -08001582 * @mac_handle: Opaque handle to the global MAC context
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001583 * @sessionId: session id
1584 * @pCckmIe: Pointer to CCKM Ie
1585 * @cckmIeLen: Length of @pCckmIe
1586 *
1587 * Function to store the CCKM IE passed from supplicant and use
1588 * it while packing reassociation request.
1589 *
1590 * Return: QDF_STATUS enumeration
1591 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08001592QDF_STATUS sme_set_cckm_ie(mac_handle_t mac_handle, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001593 uint8_t *pCckmIe, uint8_t cckmIeLen)
1594{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08001595 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301596 QDF_STATUS status = QDF_STATUS_SUCCESS;
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05301597
Jeff Johnson01f2c232018-11-21 19:17:44 -08001598 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301599 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08001600 csr_set_cckm_ie(mac, sessionId, pCckmIe, cckmIeLen);
1601 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001602 }
1603 return status;
1604}
1605
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001606/**
1607 * sme_set_ese_beacon_request() - set ese beacon request
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -08001608 * @mac_handle: Opaque handle to the global MAC context
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001609 * @sessionId: session id
Jeff Johnsonb2c3d042019-02-26 12:23:26 -08001610 * @in_req: Ese beacon report request
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001611 *
1612 * function to set ESE beacon request parameters
1613 *
1614 * Return: QDF_STATUS enumeration
1615 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08001616QDF_STATUS sme_set_ese_beacon_request(mac_handle_t mac_handle,
Jeff Johnson1f2dabc2018-11-07 15:33:01 -08001617 const uint8_t sessionId,
Jeff Johnsonb2c3d042019-02-26 12:23:26 -08001618 const tCsrEseBeaconReq *in_req)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001619{
Varun Reddy Yeturu7b2a6572017-06-15 11:07:28 -07001620 QDF_STATUS status;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08001621 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001622 tpSirBeaconReportReqInd pSmeBcnReportReq = NULL;
Jeff Johnsonb2c3d042019-02-26 12:23:26 -08001623 const tCsrEseBeaconReqParams *pBeaconReq = NULL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001624 uint8_t counter = 0;
Jeff Johnson01f2c232018-11-21 19:17:44 -08001625 struct csr_roam_session *pSession = CSR_GET_SESSION(mac, sessionId);
1626 tpRrmSMEContext pSmeRrmContext = &mac->rrm.rrmSmeContext;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001627
1628 if (pSmeRrmContext->eseBcnReqInProgress == true) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07001629 sme_err("A Beacon Report Req is already in progress");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301630 return QDF_STATUS_E_RESOURCES;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001631 }
1632
1633 /* Store the info in RRM context */
Jeff Johnsonb2c3d042019-02-26 12:23:26 -08001634 qdf_mem_copy(&pSmeRrmContext->eseBcnReqInfo, in_req,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001635 sizeof(tCsrEseBeaconReq));
1636
1637 /* Prepare the request to send to SME. */
Anurag Chouhan600c3a02016-03-01 10:33:54 +05301638 pSmeBcnReportReq = qdf_mem_malloc(sizeof(tSirBeaconReportReqInd));
Arif Hussain0ef77082018-10-10 16:42:53 -07001639 if (!pSmeBcnReportReq)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301640 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001641
1642 pSmeRrmContext->eseBcnReqInProgress = true;
1643
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07001644 sme_debug("Sending Beacon Report Req to SME");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001645
1646 pSmeBcnReportReq->messageType = eWNI_SME_BEACON_REPORT_REQ_IND;
1647 pSmeBcnReportReq->length = sizeof(tSirBeaconReportReqInd);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05301648 qdf_mem_copy(pSmeBcnReportReq->bssId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001649 pSession->connectedProfile.bssid.bytes,
1650 sizeof(tSirMacAddr));
1651 pSmeBcnReportReq->channelInfo.channelNum = 255;
Jeff Johnsonb2c3d042019-02-26 12:23:26 -08001652 pSmeBcnReportReq->channelList.numChannels = in_req->numBcnReqIe;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001653 pSmeBcnReportReq->msgSource = eRRM_MSG_SOURCE_ESE_UPLOAD;
1654
Jeff Johnsonb2c3d042019-02-26 12:23:26 -08001655 for (counter = 0; counter < in_req->numBcnReqIe; counter++) {
1656 pBeaconReq = &in_req->bcnReq[counter];
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001657 pSmeBcnReportReq->fMeasurementtype[counter] =
1658 pBeaconReq->scanMode;
1659 pSmeBcnReportReq->measurementDuration[counter] =
1660 SYS_TU_TO_MS(pBeaconReq->measurementDuration);
1661 pSmeBcnReportReq->channelList.channelNumber[counter] =
1662 pBeaconReq->channel;
1663 }
1664
Jeff Johnson01f2c232018-11-21 19:17:44 -08001665 status = sme_rrm_process_beacon_report_req_ind(mac, pSmeBcnReportReq);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001666
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301667 if (status != QDF_STATUS_SUCCESS)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001668 pSmeRrmContext->eseBcnReqInProgress = false;
1669
Hanumanth Reddy Pothula7f7a2712016-09-07 18:44:47 +05301670 qdf_mem_free(pSmeBcnReportReq);
1671
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001672 return status;
1673}
1674
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001675/**
1676 * sme_get_tsm_stats() - SME get tsm stats
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -08001677 * @mac_handle: Opaque handle to the global MAC context
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001678 * @callback: SME sends back the requested stats using the callback
1679 * @staId: The station ID for which the stats is requested for
1680 * @bssId: bssid
1681 * @pContext: user context to be passed back along with the callback
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001682 * @tid: Traffic id
1683 *
1684 * API register a callback to get TSM Stats.
1685 *
1686 * Return: QDF_STATUS enumeration
1687 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08001688QDF_STATUS sme_get_tsm_stats(mac_handle_t mac_handle,
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001689 tCsrTsmStatsCallback callback,
1690 uint8_t staId, struct qdf_mac_addr bssId,
Jeff Johnson30f84552017-09-13 14:55:25 -07001691 void *pContext, uint8_t tid)
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001692{
1693 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08001694 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001695
Jeff Johnson01f2c232018-11-21 19:17:44 -08001696 status = sme_acquire_global_lock(&mac->sme);
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001697 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08001698 status = csr_get_tsm_stats(mac, callback,
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001699 staId, bssId, pContext,
Jeff Johnson30f84552017-09-13 14:55:25 -07001700 tid);
Jeff Johnson01f2c232018-11-21 19:17:44 -08001701 sme_release_global_lock(&mac->sme);
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001702 }
1703 return status;
1704}
1705
1706/**
1707 * sme_set_ese_roam_scan_channel_list() - To set ese roam scan channel list
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -08001708 * @mac_handle: Opaque handle to the global MAC context
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001709 * @sessionId: sme session id
1710 * @pChannelList: Output channel list
1711 * @numChannels: Output number of channels
1712 *
1713 * This routine is called to set ese roam scan channel list.
1714 * This is a synchronous call
1715 *
1716 * Return: QDF_STATUS
1717 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08001718QDF_STATUS sme_set_ese_roam_scan_channel_list(mac_handle_t mac_handle,
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001719 uint8_t sessionId,
1720 uint8_t *pChannelList,
1721 uint8_t numChannels)
1722{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08001723 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001724 QDF_STATUS status = QDF_STATUS_SUCCESS;
Naveen Rawatc36f7eb2016-11-10 20:01:03 -08001725 tpCsrNeighborRoamControlInfo pNeighborRoamInfo = NULL;
1726 tpCsrChannelInfo curchnl_list_info = NULL;
Wu Gao0821b0d2019-01-11 17:31:11 +08001727 uint8_t oldChannelList[CFG_VALID_CHANNEL_LIST_LEN * 2] = { 0 };
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001728 uint8_t newChannelList[128] = { 0 };
1729 uint8_t i = 0, j = 0;
Harprit Chhabada5dff30e2019-03-12 17:56:45 -07001730 enum band_info band = -1;
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001731
Dustin Brownad06be62019-02-04 14:52:56 -08001732 if (sessionId >= WLAN_MAX_VDEVS) {
Naveen Rawatc36f7eb2016-11-10 20:01:03 -08001733 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
1734 FL("Invalid sme session id: %d"), sessionId);
1735 return QDF_STATUS_E_INVAL;
1736 }
1737
Jeff Johnson01f2c232018-11-21 19:17:44 -08001738 pNeighborRoamInfo = &mac->roam.neighborRoamInfo[sessionId];
Naveen Rawatc36f7eb2016-11-10 20:01:03 -08001739 curchnl_list_info =
1740 &pNeighborRoamInfo->roamChannelInfo.currentChannelListInfo;
1741
Jeff Johnson01f2c232018-11-21 19:17:44 -08001742 status = sme_acquire_global_lock(&mac->sme);
Madhvapathi Sriram3e6627a2018-12-19 12:54:49 +05301743 if (!QDF_IS_STATUS_SUCCESS(status))
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001744 return status;
Madhvapathi Sriram3e6627a2018-12-19 12:54:49 +05301745
Jeff Johnson038efe72019-03-18 13:39:31 -07001746 if (curchnl_list_info->ChannelList) {
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001747 for (i = 0; i < curchnl_list_info->numOfChannels; i++) {
1748 j += snprintf(oldChannelList + j,
1749 sizeof(oldChannelList) - j, "%d",
1750 curchnl_list_info->ChannelList[i]);
1751 }
1752 }
Harprit Chhabada5dff30e2019-03-12 17:56:45 -07001753 ucfg_reg_get_band(mac->pdev, &band);
Jeff Johnson01f2c232018-11-21 19:17:44 -08001754 status = csr_create_roam_scan_channel_list(mac, sessionId,
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001755 pChannelList, numChannels,
Harprit Chhabada5dff30e2019-03-12 17:56:45 -07001756 band);
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001757 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson038efe72019-03-18 13:39:31 -07001758 if (curchnl_list_info->ChannelList) {
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001759 j = 0;
1760 for (i = 0; i < curchnl_list_info->numOfChannels; i++) {
1761 j += snprintf(newChannelList + j,
1762 sizeof(newChannelList) - j, "%d",
1763 curchnl_list_info->ChannelList[i]);
1764 }
1765 }
1766 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
1767 "ESE roam scan chnl list successfully set to %s-old value is %s-roam state is %d",
1768 newChannelList, oldChannelList,
1769 pNeighborRoamInfo->neighborRoamState);
1770 }
Vignesh Viswanathan4e65e8e2018-05-01 12:04:16 +05301771
Wu Gao51a63562018-11-08 16:29:10 +08001772 if (mac->mlme_cfg->lfr.roam_scan_offload_enabled)
Jeff Johnson01f2c232018-11-21 19:17:44 -08001773 csr_roam_offload_scan(mac, sessionId,
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001774 ROAM_SCAN_OFFLOAD_UPDATE_CFG,
1775 REASON_CHANNEL_LIST_CHANGED);
Vignesh Viswanathan4e65e8e2018-05-01 12:04:16 +05301776
Jeff Johnson01f2c232018-11-21 19:17:44 -08001777 sme_release_global_lock(&mac->sme);
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001778 return status;
1779}
1780
1781#endif /* FEATURE_WLAN_ESE */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001782
Jeff Johnson49c02f92016-10-07 10:29:09 -07001783static
Jeff Johnson0a8786a2018-12-02 10:49:01 -08001784QDF_STATUS sme_ibss_peer_info_response_handler(struct mac_context *mac,
Jeff Johnson49c02f92016-10-07 10:29:09 -07001785 tpSirIbssGetPeerInfoRspParams
1786 pIbssPeerInfoParams)
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08001787{
Jeff Johnson56ba88a2019-02-17 17:18:43 -08001788 struct ibss_peer_info_cb_info *cb_info;
1789
1790 if (!mac) {
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08001791 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_FATAL,
Jeff Johnson01f2c232018-11-21 19:17:44 -08001792 "%s: mac is null", __func__);
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08001793 return QDF_STATUS_E_FAILURE;
1794 }
Jeff Johnsone7aa5cd2019-02-17 19:36:01 -08001795 cb_info = &mac->sme.peer_info_cb_info;
Jeff Johnson56ba88a2019-02-17 17:18:43 -08001796 if (!cb_info->peer_info_cb) {
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08001797 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
1798 "%s: HDD callback is null", __func__);
1799 return QDF_STATUS_E_FAILURE;
1800 }
Jeff Johnson56ba88a2019-02-17 17:18:43 -08001801 cb_info->peer_info_cb(cb_info->peer_info_cb_context,
1802 &pIbssPeerInfoParams->ibssPeerInfoRspParams);
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08001803 return QDF_STATUS_SUCCESS;
1804}
1805
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001806/**
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001807 * sme_process_dual_mac_config_resp() - Process set Dual mac config response
1808 * @mac: Global MAC pointer
1809 * @msg: Dual mac config response
1810 *
1811 * Processes the dual mac configuration response and invokes the HDD callback
1812 * to process further
1813 */
Jeff Johnson0a8786a2018-12-02 10:49:01 -08001814static QDF_STATUS sme_process_dual_mac_config_resp(struct mac_context *mac,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001815 uint8_t *msg)
1816{
1817 tListElem *entry = NULL;
1818 tSmeCmd *command = NULL;
1819 bool found;
1820 dual_mac_cb callback = NULL;
1821 struct sir_dual_mac_config_resp *param;
1822
1823 param = (struct sir_dual_mac_config_resp *)msg;
1824 if (!param) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07001825 sme_err("Dual mac config resp param is NULL");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001826 /* Not returning. Need to check if active command list
1827 * needs to be freed
1828 */
1829 }
1830
Krunal Sonia8270f52017-02-23 19:51:25 -08001831 entry = csr_nonscan_active_ll_peek_head(mac, LL_ACCESS_LOCK);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001832 if (!entry) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07001833 sme_err("No cmd found in active list");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301834 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001835 }
1836
1837 command = GET_BASE_ADDR(entry, tSmeCmd, Link);
1838 if (!command) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07001839 sme_err("Base address is NULL");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301840 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001841 }
1842
1843 if (e_sme_command_set_dual_mac_config != command->command) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07001844 sme_err("Command mismatch!");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301845 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001846 }
1847
1848 callback = command->u.set_dual_mac_cmd.set_dual_mac_cb;
1849 if (callback) {
1850 if (!param) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07001851 sme_err("Callback failed-Dual mac config is NULL");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001852 } else {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07001853 sme_debug("Calling HDD callback for Dual mac config");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001854 callback(param->status,
1855 command->u.set_dual_mac_cmd.scan_config,
1856 command->u.set_dual_mac_cmd.fw_mode_config);
1857 }
1858 } else {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07001859 sme_err("Callback does not exist");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001860 }
1861
Krunal Soni72dba662017-02-15 20:13:17 -08001862 found = csr_nonscan_active_ll_remove_entry(mac, entry, LL_ACCESS_LOCK);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001863 if (found)
1864 /* Now put this command back on the available command list */
Krunal Soni78618d92017-02-14 21:46:31 -08001865 csr_release_command(mac, command);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001866
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301867 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001868}
1869
Archana Ramachandrana20ef812015-11-13 16:12:13 -08001870/**
1871 * sme_process_antenna_mode_resp() - Process set antenna mode
1872 * response
1873 * @mac: Global MAC pointer
1874 * @msg: antenna mode response
1875 *
1876 * Processes the antenna mode response and invokes the HDD
1877 * callback to process further
1878 */
Jeff Johnson0a8786a2018-12-02 10:49:01 -08001879static QDF_STATUS sme_process_antenna_mode_resp(struct mac_context *mac,
Archana Ramachandrana20ef812015-11-13 16:12:13 -08001880 uint8_t *msg)
1881{
1882 tListElem *entry;
1883 tSmeCmd *command;
1884 bool found;
Dundi Raviteja6bb9e322018-05-16 17:04:41 +05301885 void *context = NULL;
Archana Ramachandrana20ef812015-11-13 16:12:13 -08001886 antenna_mode_cb callback;
1887 struct sir_antenna_mode_resp *param;
1888
1889 param = (struct sir_antenna_mode_resp *)msg;
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05301890 if (!param)
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07001891 sme_err("set antenna mode resp is NULL");
Archana Ramachandrana20ef812015-11-13 16:12:13 -08001892 /* Not returning. Need to check if active command list
1893 * needs to be freed
1894 */
Archana Ramachandrana20ef812015-11-13 16:12:13 -08001895
Krunal Sonia8270f52017-02-23 19:51:25 -08001896 entry = csr_nonscan_active_ll_peek_head(mac, LL_ACCESS_LOCK);
Archana Ramachandrana20ef812015-11-13 16:12:13 -08001897 if (!entry) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07001898 sme_err("No cmd found in active list");
Archana Ramachandrana20ef812015-11-13 16:12:13 -08001899 return QDF_STATUS_E_FAILURE;
1900 }
1901
1902 command = GET_BASE_ADDR(entry, tSmeCmd, Link);
1903 if (!command) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07001904 sme_err("Base address is NULL");
Archana Ramachandrana20ef812015-11-13 16:12:13 -08001905 return QDF_STATUS_E_FAILURE;
1906 }
1907
1908 if (e_sme_command_set_antenna_mode != command->command) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07001909 sme_err("Command mismatch!");
Archana Ramachandrana20ef812015-11-13 16:12:13 -08001910 return QDF_STATUS_E_FAILURE;
1911 }
1912
Dundi Raviteja6bb9e322018-05-16 17:04:41 +05301913 context = command->u.set_antenna_mode_cmd.set_antenna_mode_ctx;
1914 callback = command->u.set_antenna_mode_cmd.set_antenna_mode_resp;
Archana Ramachandrana20ef812015-11-13 16:12:13 -08001915 if (callback) {
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05301916 if (!param)
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07001917 sme_err("Set antenna mode call back is NULL");
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05301918 else
Dundi Raviteja6bb9e322018-05-16 17:04:41 +05301919 callback(param->status, context);
Archana Ramachandrana20ef812015-11-13 16:12:13 -08001920 } else {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07001921 sme_err("Callback does not exist");
Archana Ramachandrana20ef812015-11-13 16:12:13 -08001922 }
1923
Krunal Soni72dba662017-02-15 20:13:17 -08001924 found = csr_nonscan_active_ll_remove_entry(mac, entry, LL_ACCESS_LOCK);
Archana Ramachandrana20ef812015-11-13 16:12:13 -08001925 if (found)
1926 /* Now put this command back on the available command list */
Krunal Soni78618d92017-02-14 21:46:31 -08001927 csr_release_command(mac, command);
Archana Ramachandrana20ef812015-11-13 16:12:13 -08001928
Archana Ramachandrana20ef812015-11-13 16:12:13 -08001929 return QDF_STATUS_SUCCESS;
1930}
1931
Jeff Johnson0a8786a2018-12-02 10:49:01 -08001932QDF_STATUS sme_process_msg(struct mac_context *mac, struct scheduler_msg *pMsg)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001933{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301934 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Ashish Kumar Dhanotiya443d31f2017-10-13 12:41:19 +05301935 struct sir_peer_info *peer_stats;
1936 struct sir_peer_info_resp *peer_info_rsp;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001937
Jeff Johnson038efe72019-03-18 13:39:31 -07001938 if (!pMsg) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07001939 sme_err("Empty message for SME");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001940 return status;
1941 }
Jeff Johnson01f2c232018-11-21 19:17:44 -08001942 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301943 if (!QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001944 if (pMsg->bodyptr)
Anurag Chouhan600c3a02016-03-01 10:33:54 +05301945 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001946 return status;
1947 }
Jeff Johnson01f2c232018-11-21 19:17:44 -08001948 if (!SME_IS_START(mac)) {
Rajeev Kumar3887f9b2018-01-10 11:24:01 -08001949 sme_debug("message type %d in stop state ignored", pMsg->type);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001950 if (pMsg->bodyptr)
Anurag Chouhan600c3a02016-03-01 10:33:54 +05301951 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001952 goto release_lock;
1953 }
1954 switch (pMsg->type) {
1955#ifdef WLAN_FEATURE_ROAM_OFFLOAD
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001956 case eWNI_SME_HO_FAIL_IND:
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301957 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001958 FL("LFR3: Rcvd eWNI_SME_HO_FAIL_IND"));
Jeff Johnson01f2c232018-11-21 19:17:44 -08001959 csr_process_ho_fail_ind(mac, pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05301960 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001961 break;
1962#endif
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001963 case eWNI_SME_ADDTS_RSP:
1964 case eWNI_SME_DELTS_RSP:
1965 case eWNI_SME_DELTS_IND:
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001966 case eWNI_SME_FT_AGGR_QOS_RSP:
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001967 /* QoS */
1968 if (pMsg->bodyptr) {
1969#ifndef WLAN_MDM_CODE_REDUCTION_OPT
Jeff Johnson01f2c232018-11-21 19:17:44 -08001970 status = sme_qos_msg_processor(mac, pMsg->type,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001971 pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05301972 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001973#endif
1974 } else {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07001975 sme_err("Empty message for: %d", pMsg->type);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001976 }
1977 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001978 case eWNI_SME_NEIGHBOR_REPORT_IND:
1979 case eWNI_SME_BEACON_REPORT_REQ_IND:
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001980 if (pMsg->bodyptr) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08001981 status = sme_rrm_msg_processor(mac, pMsg->type,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001982 pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05301983 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001984 } else {
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05301985 sme_err("Empty message for: %d", pMsg->type);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001986 }
1987 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001988 case eWNI_SME_ADD_STA_SELF_RSP:
1989 if (pMsg->bodyptr) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08001990 status = csr_process_add_sta_session_rsp(mac,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001991 pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05301992 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001993 } else {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07001994 sme_err("Empty message for: %d", pMsg->type);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001995 }
1996 break;
1997 case eWNI_SME_DEL_STA_SELF_RSP:
1998 if (pMsg->bodyptr) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08001999 status = csr_process_del_sta_session_rsp(mac,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002000 pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302001 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002002 } else {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002003 sme_err("Empty message for: %d", pMsg->type);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002004 }
2005 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002006 case eWNI_SME_GENERIC_CHANGE_COUNTRY_CODE:
2007 if (pMsg->bodyptr) {
2008 status = sme_handle_generic_change_country_code(
Jeff Johnson01f2c232018-11-21 19:17:44 -08002009 (void *)mac, pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302010 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002011 } else {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002012 sme_err("Empty message for: %d", pMsg->type);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002013 }
2014 break;
Sandeep Puligilla8d6011b2017-11-08 00:06:18 -08002015
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002016#ifdef WLAN_FEATURE_11W
2017 case eWNI_SME_UNPROT_MGMT_FRM_IND:
2018 if (pMsg->bodyptr) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08002019 sme_unprotected_mgmt_frm_ind(mac, pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302020 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002021 } else {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002022 sme_err("Empty message for: %d", pMsg->type);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002023 }
2024 break;
2025#endif
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08002026#ifdef FEATURE_WLAN_ESE
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002027 case eWNI_SME_TSM_IE_IND:
2028 if (pMsg->bodyptr) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08002029 sme_tsm_ie_ind(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;
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08002035#endif /* FEATURE_WLAN_ESE */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002036 case eWNI_SME_ROAM_SCAN_OFFLOAD_RSP:
Jeff Johnson01f2c232018-11-21 19:17:44 -08002037 status = csr_roam_offload_scan_rsp_hdlr((void *)mac,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002038 pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302039 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002040 break;
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08002041 case eWNI_SME_IBSS_PEER_INFO_RSP:
2042 if (pMsg->bodyptr) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08002043 sme_ibss_peer_info_response_handler(mac,
Jeff Johnson49c02f92016-10-07 10:29:09 -07002044 pMsg->bodyptr);
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08002045 qdf_mem_free(pMsg->bodyptr);
2046 } else {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002047 sme_err("Empty message for: %d", pMsg->type);
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08002048 }
2049 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002050#ifdef WLAN_FEATURE_EXTWOW_SUPPORT
2051 case eWNI_SME_READY_TO_EXTWOW_IND:
2052 if (pMsg->bodyptr) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08002053 sme_process_ready_to_ext_wow(mac, pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302054 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002055 } else {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002056 sme_err("Empty message for: %d", pMsg->type);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002057 }
2058 break;
2059#endif
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002060#ifdef FEATURE_WLAN_AUTO_SHUTDOWN
2061 case eWNI_SME_AUTO_SHUTDOWN_IND:
Jeff Johnsoneb7bbed2019-02-17 10:34:24 -08002062 if (mac->sme.auto_shutdown_cb) {
Abhishek Singhe4a1f882017-08-10 17:59:44 +05302063 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002064 FL("Auto shutdown notification"));
Jeff Johnsoneb7bbed2019-02-17 10:34:24 -08002065 mac->sme.auto_shutdown_cb();
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002066 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002067 break;
2068#endif
2069 case eWNI_SME_DFS_RADAR_FOUND:
Arif Hussaincd151632017-02-11 16:57:19 -08002070 case eWNI_SME_DFS_CAC_COMPLETE:
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002071 case eWNI_SME_DFS_CSAIE_TX_COMPLETE_IND:
Abhishek Singh20a8e442018-09-12 15:50:44 +05302072 case eWNI_SME_CSA_RESTART_RSP:
Jeff Johnson01f2c232018-11-21 19:17:44 -08002073 status = dfs_msg_processor(mac, pMsg);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302074 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002075 break;
2076 case eWNI_SME_CHANNEL_CHANGE_RSP:
2077 if (pMsg->bodyptr) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08002078 status = sme_process_channel_change_resp(mac,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002079 pMsg->type,
2080 pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302081 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002082 } else {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002083 sme_err("Empty message for: %d", pMsg->type);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002084 }
2085 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002086 case eWNI_SME_STATS_EXT_EVENT:
Jeff Johnson01f2c232018-11-21 19:17:44 -08002087 status = sme_stats_ext_event(mac, pMsg->bodyptr);
Jeff Johnsonfdecd512018-06-10 09:18:32 -07002088 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002089 break;
Will Huang558f8082017-05-31 16:22:24 +08002090 case eWNI_SME_GET_PEER_INFO_IND:
Jeff Johnson01f2c232018-11-21 19:17:44 -08002091 if (mac->sme.pget_peer_info_ind_cb)
2092 mac->sme.pget_peer_info_ind_cb(pMsg->bodyptr,
2093 mac->sme.pget_peer_info_cb_context);
Ashish Kumar Dhanotiya443d31f2017-10-13 12:41:19 +05302094 if (pMsg->bodyptr) {
2095 peer_info_rsp = (struct sir_peer_info_resp *)
2096 (pMsg->bodyptr);
2097 peer_stats = (struct sir_peer_info *)
2098 (peer_info_rsp->info);
2099 if (peer_stats) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08002100 mac->peer_rssi = peer_stats[0].rssi;
2101 mac->peer_txrate = peer_stats[0].tx_rate;
2102 mac->peer_rxrate = peer_stats[0].rx_rate;
Ashish Kumar Dhanotiya443d31f2017-10-13 12:41:19 +05302103 }
2104 }
Will Huang558f8082017-05-31 16:22:24 +08002105 qdf_mem_free(pMsg->bodyptr);
2106 break;
2107 case eWNI_SME_GET_PEER_INFO_EXT_IND:
Jeff Johnson01f2c232018-11-21 19:17:44 -08002108 if (mac->sme.pget_peer_info_ext_ind_cb)
2109 mac->sme.pget_peer_info_ext_ind_cb(pMsg->bodyptr,
2110 mac->sme.pget_peer_info_ext_cb_context);
Will Huang558f8082017-05-31 16:22:24 +08002111 qdf_mem_free(pMsg->bodyptr);
2112 break;
Qun Zhangef655622019-02-25 10:48:10 +08002113 case eWNI_SME_FW_STATUS_IND:
2114 status = sme_fw_state_resp(mac);
2115 break;
Manikandan Mohandcc21ba2016-03-15 14:31:56 -07002116 case eWNI_SME_TSF_EVENT:
Jeff Johnson01f2c232018-11-21 19:17:44 -08002117 if (mac->sme.get_tsf_cb) {
2118 mac->sme.get_tsf_cb(mac->sme.get_tsf_cxt,
Manikandan Mohandcc21ba2016-03-15 14:31:56 -07002119 (struct stsf *)pMsg->bodyptr);
2120 }
2121 if (pMsg->bodyptr)
2122 qdf_mem_free(pMsg->bodyptr);
2123 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002124 case eWNI_SME_LINK_STATUS_IND:
2125 {
2126 tAniGetLinkStatus *pLinkStatus =
2127 (tAniGetLinkStatus *) pMsg->bodyptr;
2128 if (pLinkStatus) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08002129 if (mac->sme.link_status_callback)
2130 mac->sme.link_status_callback(
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002131 pLinkStatus->linkStatus,
Jeff Johnson01f2c232018-11-21 19:17:44 -08002132 mac->sme.link_status_context);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302133
Jeff Johnson01f2c232018-11-21 19:17:44 -08002134 mac->sme.link_status_callback = NULL;
2135 mac->sme.link_status_context = NULL;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302136 qdf_mem_free(pLinkStatus);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002137 }
2138 break;
2139 }
2140 case eWNI_SME_MSG_GET_TEMPERATURE_IND:
Jeff Johnson3f3ad252019-02-17 20:44:11 -08002141 if (mac->sme.temperature_cb)
2142 mac->sme.temperature_cb(pMsg->bodyval,
2143 mac->sme.temperature_cb_context);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002144 break;
2145 case eWNI_SME_SNR_IND:
2146 {
2147 tAniGetSnrReq *pSnrReq = (tAniGetSnrReq *) pMsg->bodyptr;
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302148
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002149 if (pSnrReq) {
2150 if (pSnrReq->snrCallback) {
2151 ((tCsrSnrCallback)
2152 (pSnrReq->snrCallback))
2153 (pSnrReq->snr, pSnrReq->staId,
2154 pSnrReq->pDevContext);
2155 }
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302156 qdf_mem_free(pSnrReq);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002157 }
2158 break;
2159 }
2160#ifdef FEATURE_WLAN_EXTSCAN
2161 case eWNI_SME_EXTSCAN_FULL_SCAN_RESULT_IND:
Jeff Johnson01f2c232018-11-21 19:17:44 -08002162 if (mac->sme.ext_scan_ind_cb)
2163 mac->sme.ext_scan_ind_cb(mac->hdd_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002164 eSIR_EXTSCAN_FULL_SCAN_RESULT_IND,
2165 pMsg->bodyptr);
2166 else
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002167 sme_err("callback not registered to process: %d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002168 pMsg->type);
2169
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302170 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002171 break;
2172 case eWNI_SME_EPNO_NETWORK_FOUND_IND:
Jeff Johnson01f2c232018-11-21 19:17:44 -08002173 if (mac->sme.ext_scan_ind_cb)
2174 mac->sme.ext_scan_ind_cb(mac->hdd_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002175 eSIR_EPNO_NETWORK_FOUND_IND,
2176 pMsg->bodyptr);
2177 else
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002178 sme_err("callback not registered to process: %d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002179 pMsg->type);
2180
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302181 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002182 break;
2183#endif
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002184 case eWNI_SME_SET_HW_MODE_RESP:
2185 if (pMsg->bodyptr) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08002186 status = sme_process_set_hw_mode_resp(mac,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002187 pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302188 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002189 } else {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002190 sme_err("Empty message for: %d", pMsg->type);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002191 }
2192 break;
2193 case eWNI_SME_HW_MODE_TRANS_IND:
2194 if (pMsg->bodyptr) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08002195 status = sme_process_hw_mode_trans_ind(mac,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002196 pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302197 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002198 } else {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002199 sme_err("Empty message for: %d", pMsg->type);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002200 }
2201 break;
2202 case eWNI_SME_NSS_UPDATE_RSP:
2203 if (pMsg->bodyptr) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08002204 status = sme_process_nss_update_resp(mac,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002205 pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302206 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002207 } else {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002208 sme_err("Empty message for: %d", pMsg->type);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002209 }
2210 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002211 case eWNI_SME_SET_DUAL_MAC_CFG_RESP:
2212 if (pMsg->bodyptr) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08002213 status = sme_process_dual_mac_config_resp(mac,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002214 pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302215 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002216 } else {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002217 sme_err("Empty message for: %d", pMsg->type);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002218 }
gaurank kathpaliaebe3fc82018-05-07 09:39:46 +05302219 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002220 case eWNI_SME_SET_THERMAL_LEVEL_IND:
Jeff Johnson01f2c232018-11-21 19:17:44 -08002221 if (mac->sme.set_thermal_level_cb)
2222 mac->sme.set_thermal_level_cb(mac->hdd_handle,
Jeff Johnson6aaaa992018-06-30 10:43:04 -07002223 pMsg->bodyval);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002224 break;
Abhishek Singh518323d2015-10-19 17:42:01 +05302225 case eWNI_SME_EXT_CHANGE_CHANNEL_IND:
Jeff Johnson01f2c232018-11-21 19:17:44 -08002226 status = sme_extended_change_channel_ind(mac, pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302227 qdf_mem_free(pMsg->bodyptr);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302228 break;
Archana Ramachandrana20ef812015-11-13 16:12:13 -08002229 case eWNI_SME_SET_ANTENNA_MODE_RESP:
2230 if (pMsg->bodyptr) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08002231 status = sme_process_antenna_mode_resp(mac,
Archana Ramachandrana20ef812015-11-13 16:12:13 -08002232 pMsg->bodyptr);
2233 qdf_mem_free(pMsg->bodyptr);
2234 } else {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002235 sme_err("Empty message for: %d", pMsg->type);
Archana Ramachandrana20ef812015-11-13 16:12:13 -08002236 }
2237 break;
Sreelakshmi Konamki58c72432016-11-09 17:06:44 +05302238 case eWNI_SME_LOST_LINK_INFO_IND:
Jeff Johnson01f2c232018-11-21 19:17:44 -08002239 if (mac->sme.lost_link_info_cb)
2240 mac->sme.lost_link_info_cb(mac->hdd_handle,
Sreelakshmi Konamki58c72432016-11-09 17:06:44 +05302241 (struct sir_lost_link_info *)pMsg->bodyptr);
2242 qdf_mem_free(pMsg->bodyptr);
2243 break;
Sreelakshmi Konamki88a2a412017-04-14 15:11:55 +05302244 case eWNI_SME_RSO_CMD_STATUS_IND:
Jeff Johnson01f2c232018-11-21 19:17:44 -08002245 if (mac->sme.rso_cmd_status_cb)
2246 mac->sme.rso_cmd_status_cb(mac->hdd_handle,
Jeff Johnson6aaaa992018-06-30 10:43:04 -07002247 pMsg->bodyptr);
lifeng66831662017-05-19 16:01:35 +08002248 qdf_mem_free(pMsg->bodyptr);
2249 break;
Zhang Qiana6e9c102016-12-22 16:47:24 +08002250 case eWMI_SME_LL_STATS_IND:
Jeff Johnson01f2c232018-11-21 19:17:44 -08002251 if (mac->sme.link_layer_stats_ext_cb)
2252 mac->sme.link_layer_stats_ext_cb(mac->hdd_handle,
Zhang Qiana6e9c102016-12-22 16:47:24 +08002253 pMsg->bodyptr);
Sreelakshmi Konamki88a2a412017-04-14 15:11:55 +05302254 qdf_mem_free(pMsg->bodyptr);
2255 break;
Vidyullatha Kanchanapallybe0ebb32017-03-23 14:36:21 +05302256 case eWNI_SME_BT_ACTIVITY_INFO_IND:
Jeff Johnson01f2c232018-11-21 19:17:44 -08002257 if (mac->sme.bt_activity_info_cb)
2258 mac->sme.bt_activity_info_cb(mac->hdd_handle,
Vidyullatha Kanchanapallybe0ebb32017-03-23 14:36:21 +05302259 pMsg->bodyval);
2260 break;
Abhinav Kumar338e57d2019-02-04 17:30:10 +05302261 case eWNI_SME_HIDDEN_SSID_RESTART_RSP:
2262 if (mac->sme.hidden_ssid_cb)
2263 mac->sme.hidden_ssid_cb(mac->hdd_handle, pMsg->bodyval);
2264 else
2265 sme_err("callback is NULL");
2266 break;
guangde4853c402019-05-06 15:54:04 +08002267 case eWNI_SME_ANTENNA_ISOLATION_RSP:
2268 if (pMsg->bodyptr) {
2269 if (mac->sme.get_isolation_cb)
2270 mac->sme.get_isolation_cb(
2271 (struct sir_isolation_resp *)pMsg->bodyptr,
2272 mac->sme.get_isolation_cb_context);
2273 qdf_mem_free(pMsg->bodyptr);
2274 } else {
2275 sme_err("Empty message for: %d", pMsg->type);
2276 }
2277 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002278 default:
2279
2280 if ((pMsg->type >= eWNI_SME_MSG_TYPES_BEGIN)
2281 && (pMsg->type <= eWNI_SME_MSG_TYPES_END)) {
2282 /* CSR */
2283 if (pMsg->bodyptr) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08002284 status = csr_msg_processor(mac, pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302285 qdf_mem_free(pMsg->bodyptr);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302286 } else
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002287 sme_err("Empty message for: %d", pMsg->type);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002288 } else {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002289 sme_warn("Unknown message type: %d", pMsg->type);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002290 if (pMsg->bodyptr)
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302291 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002292 }
2293 } /* switch */
2294release_lock:
Jeff Johnson01f2c232018-11-21 19:17:44 -08002295 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002296 return status;
2297}
2298
Krunal Sonid32c6bc2016-10-18 18:00:21 -07002299QDF_STATUS sme_mc_process_handler(struct scheduler_msg *msg)
2300{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08002301 struct mac_context *mac_ctx = cds_get_context(QDF_MODULE_ID_SME);
Krunal Sonid32c6bc2016-10-18 18:00:21 -07002302
Jeff Johnson038efe72019-03-18 13:39:31 -07002303 if (!mac_ctx) {
Krunal Sonid32c6bc2016-10-18 18:00:21 -07002304 QDF_ASSERT(0);
2305 return QDF_STATUS_E_FAILURE;
2306 }
2307
Jeff Johnson5f9ce2d2018-06-09 21:20:45 -07002308 return sme_process_msg(mac_ctx, msg);
Krunal Sonid32c6bc2016-10-18 18:00:21 -07002309}
Krunal Sonid32c6bc2016-10-18 18:00:21 -07002310
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002311/**
2312 * sme_process_nss_update_resp() - Process nss update response
2313 * @mac: Global MAC pointer
2314 * @msg: nss update response
2315 *
2316 * Processes the nss update response and invokes the HDD
2317 * callback to process further
2318 */
Jeff Johnson0a8786a2018-12-02 10:49:01 -08002319static QDF_STATUS sme_process_nss_update_resp(struct mac_context *mac, uint8_t *msg)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002320{
2321 tListElem *entry = NULL;
2322 tSmeCmd *command = NULL;
2323 bool found;
Tushnim Bhattacharyyaeab33dd2017-11-15 15:20:02 -08002324 policy_mgr_nss_update_cback callback = NULL;
Abhishek Singhfc740be2018-10-12 11:34:26 +05302325 struct sir_bcn_update_rsp *param;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002326
Abhishek Singhfc740be2018-10-12 11:34:26 +05302327 param = (struct sir_bcn_update_rsp *)msg;
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302328 if (!param)
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002329 sme_err("nss update resp param is NULL");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002330 /* Not returning. Need to check if active command list
2331 * needs to be freed
2332 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002333
Abhishek Singhfc740be2018-10-12 11:34:26 +05302334 if (param && param->reason != REASON_NSS_UPDATE) {
2335 sme_err("reason not NSS update");
2336 return QDF_STATUS_E_INVAL;
2337 }
Krunal Sonia8270f52017-02-23 19:51:25 -08002338 entry = csr_nonscan_active_ll_peek_head(mac, LL_ACCESS_LOCK);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002339 if (!entry) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002340 sme_err("No cmd found in active list");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302341 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002342 }
2343
2344 command = GET_BASE_ADDR(entry, tSmeCmd, Link);
2345 if (!command) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002346 sme_err("Base address is NULL");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302347 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002348 }
2349
2350 if (e_sme_command_nss_update != command->command) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002351 sme_err("Command mismatch!");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302352 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002353 }
2354
2355 callback = command->u.nss_update_cmd.nss_update_cb;
2356 if (callback) {
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302357 if (!param)
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002358 sme_err("Callback failed since nss update params is NULL");
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302359 else
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002360 callback(command->u.nss_update_cmd.context,
Abhishek Singhfc740be2018-10-12 11:34:26 +05302361 param->status,
2362 param->vdev_id,
Chandrasekaran, Manishekarce2172e2016-02-18 16:12:43 +05302363 command->u.nss_update_cmd.next_action,
Liangwei Dong1ba99482018-10-19 02:57:29 -04002364 command->u.nss_update_cmd.reason,
2365 command->u.nss_update_cmd.original_vdev_id);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002366 } else {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002367 sme_err("Callback does not exisit");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002368 }
2369
Krunal Soni72dba662017-02-15 20:13:17 -08002370 found = csr_nonscan_active_ll_remove_entry(mac, entry, LL_ACCESS_LOCK);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002371 if (found) {
2372 /* Now put this command back on the avilable command list */
Krunal Soni78618d92017-02-14 21:46:31 -08002373 csr_release_command(mac, command);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002374 }
Krunal Sonia8270f52017-02-23 19:51:25 -08002375
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302376 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002377}
2378
Jeff Johnson62cd6802018-07-20 12:38:25 -07002379QDF_STATUS sme_stop(mac_handle_t mac_handle)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002380{
Jeff Johnson62cd6802018-07-20 12:38:25 -07002381 QDF_STATUS status;
2382 QDF_STATUS ret_status = QDF_STATUS_SUCCESS;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08002383 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002384
Jeff Johnson62cd6802018-07-20 12:38:25 -07002385 status = rrm_stop(mac);
2386 if (QDF_IS_STATUS_ERROR(status)) {
2387 ret_status = status;
Sandeep Puligilla66d09c42017-09-06 17:10:27 -07002388 sme_err("rrm_stop failed with status: %d", status);
2389 }
2390
Jeff Johnson62cd6802018-07-20 12:38:25 -07002391 status = csr_stop(mac);
2392 if (QDF_IS_STATUS_ERROR(status)) {
2393 ret_status = status;
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002394 sme_err("csr_stop failed with status: %d", status);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002395 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002396
Jeff Johnson62cd6802018-07-20 12:38:25 -07002397 mac->sme.state = SME_STATE_STOP;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002398
Jeff Johnson62cd6802018-07-20 12:38:25 -07002399 return ret_status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002400}
2401
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302402/*
2403 * sme_close() - Release all SME modules and their resources.
2404 * The function release each module in SME, PMC, CSR, etc. . Upon
2405 * return, all modules are at closed state.
2406 *
2407 * No SME APIs can be involved after smeClose except smeOpen.
2408 * smeClose must be called before mac_close.
2409 * This is a synchronous call
2410 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08002411 * mac_handle - The handle returned by mac_open
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302412 * Return QDF_STATUS_SUCCESS - SME is successfully close.
2413 *
2414 * Other status means SME is failed to be closed but caller still cannot
2415 * call any other SME functions except smeOpen.
2416 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08002417QDF_STATUS sme_close(mac_handle_t mac_handle)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002418{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302419 QDF_STATUS status = QDF_STATUS_E_FAILURE;
2420 QDF_STATUS fail_status = QDF_STATUS_SUCCESS;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08002421 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002422
Jeff Johnson01f2c232018-11-21 19:17:44 -08002423 if (!mac)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302424 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002425
Jeff Johnson01f2c232018-11-21 19:17:44 -08002426 status = csr_close(mac);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302427 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002428 sme_err("csr_close failed with status: %d", status);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002429 fail_status = status;
2430 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002431#ifndef WLAN_MDM_CODE_REDUCTION_OPT
Jeff Johnson01f2c232018-11-21 19:17:44 -08002432 status = sme_qos_close(mac);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302433 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002434 sme_err("Qos close failed with status: %d", status);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002435 fail_status = status;
2436 }
2437#endif
Jeff Johnsonb460dd72018-11-08 10:26:51 -08002438 status = sme_ps_close(mac_handle);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302439 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002440 sme_err("sme_ps_close failed status: %d", status);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002441 fail_status = status;
2442 }
2443
Jeff Johnson01f2c232018-11-21 19:17:44 -08002444 status = rrm_close(mac);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302445 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002446 sme_err("RRM close failed with status: %d", status);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002447 fail_status = status;
2448 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002449
Jeff Johnson01f2c232018-11-21 19:17:44 -08002450 free_sme_cmd_list(mac);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002451
Jeff Johnson3e7a4932019-02-17 12:11:36 -08002452 status = qdf_mutex_destroy(&mac->sme.sme_global_lock);
2453 if (!QDF_IS_STATUS_SUCCESS(status))
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302454 fail_status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002455
Jeff Johnson01f2c232018-11-21 19:17:44 -08002456 mac->sme.state = SME_STATE_STOP;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002457
Jeff Johnson3e7a4932019-02-17 12:11:36 -08002458 return fail_status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002459}
2460
2461/**
Abhishek Singhc9941602016-08-09 16:06:22 +05302462 * sme_remove_bssid_from_scan_list() - wrapper to remove the bssid from
2463 * scan list
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -08002464 * @mac_handle: Opaque handle to the global MAC context.
Abhishek Singhc9941602016-08-09 16:06:22 +05302465 * @bssid: bssid to be removed
2466 *
2467 * This function remove the given bssid from scan list.
2468 *
2469 * Return: QDF status.
2470 */
Jeff Johnsonc7309062018-11-09 20:59:42 -08002471QDF_STATUS sme_remove_bssid_from_scan_list(mac_handle_t mac_handle,
2472 tSirMacAddr bssid)
Abhishek Singhc9941602016-08-09 16:06:22 +05302473{
2474 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08002475 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Abhishek Singhc9941602016-08-09 16:06:22 +05302476
2477 status = sme_acquire_global_lock(&mac_ctx->sme);
2478 if (QDF_IS_STATUS_SUCCESS(status)) {
2479 csr_remove_bssid_from_scan_list(mac_ctx, bssid);
2480 sme_release_global_lock(&mac_ctx->sme);
2481 }
2482
2483 return status;
2484}
2485
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002486
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302487/*
2488 * sme_scan_get_result
2489 * A wrapper function to request scan results from CSR.
2490 * This is a synchronous call
2491 *
2492 * pFilter - If pFilter is NULL, all cached results are returned
2493 * phResult - an object for the result.
2494 * Return QDF_STATUS
2495 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08002496QDF_STATUS sme_scan_get_result(mac_handle_t mac_handle, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002497 tCsrScanResultFilter *pFilter,
2498 tScanResultHandle *phResult)
2499{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302500 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08002501 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002502
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302503 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002504 TRACE_CODE_SME_RX_HDD_MSG_SCAN_GET_RESULTS, sessionId,
2505 0));
Jeff Johnson01f2c232018-11-21 19:17:44 -08002506 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302507 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08002508 status = csr_scan_get_result(mac, pFilter, phResult);
2509 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002510 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002511
2512 return status;
2513}
2514
Jeff Johnsonb460dd72018-11-08 10:26:51 -08002515QDF_STATUS sme_scan_get_result_for_bssid(mac_handle_t mac_handle,
Vignesh Viswanathan9dd88d32017-11-22 14:22:03 +05302516 struct qdf_mac_addr *bssid,
2517 tCsrScanResultInfo *res)
2518{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08002519 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Vignesh Viswanathan9dd88d32017-11-22 14:22:03 +05302520 QDF_STATUS status;
2521
2522 status = sme_acquire_global_lock(&mac_ctx->sme);
2523 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson1b56f6b2018-06-10 18:17:10 -07002524 status = csr_scan_get_result_for_bssid(mac_ctx, bssid, res);
Vignesh Viswanathan9dd88d32017-11-22 14:22:03 +05302525 sme_release_global_lock(&mac_ctx->sme);
2526 }
2527
2528 return status;
2529}
2530
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002531/**
Archana Ramachandran2eb7a612017-03-23 22:58:42 -07002532 * sme_get_ap_channel_from_scan() - a wrapper function to get
Srinivas Girigowda828ef232017-10-13 22:31:27 -07002533 * AP's channel id from
2534 * CSR by filtering the
2535 * result which matches
2536 * our roam profile.
Archana Ramachandran2eb7a612017-03-23 22:58:42 -07002537 * @profile: SAP profile
2538 * @ap_chnl_id: pointer to channel id of SAP. Fill the value after finding the
2539 * best ap from scan cache.
2540 *
2541 * This function is written to get AP's channel id from CSR by filtering
2542 * the result which matches our roam profile. This is a synchronous call.
2543 *
2544 * Return: QDF_STATUS.
2545 */
2546QDF_STATUS sme_get_ap_channel_from_scan(void *profile,
2547 tScanResultHandle *scan_cache,
2548 uint8_t *ap_chnl_id)
2549{
Jeff Johnson66ee8a92018-03-17 15:24:26 -07002550 return sme_get_ap_channel_from_scan_cache((struct csr_roam_profile *)
Archana Ramachandran2eb7a612017-03-23 22:58:42 -07002551 profile,
2552 scan_cache,
2553 ap_chnl_id);
2554}
2555
2556/**
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002557 * sme_get_ap_channel_from_scan_cache() - a wrapper function to get AP's
2558 * channel id from CSR by filtering the
2559 * result which matches our roam profile.
2560 * @profile: SAP adapter
2561 * @ap_chnl_id: pointer to channel id of SAP. Fill the value after finding the
2562 * best ap from scan cache.
2563 *
2564 * This function is written to get AP's channel id from CSR by filtering
2565 * the result which matches our roam profile. This is a synchronous call.
2566 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302567 * Return: QDF_STATUS.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002568 */
Archana Ramachandran2eb7a612017-03-23 22:58:42 -07002569QDF_STATUS sme_get_ap_channel_from_scan_cache(
Jeff Johnson66ee8a92018-03-17 15:24:26 -07002570 struct csr_roam_profile *profile, tScanResultHandle *scan_cache,
Archana Ramachandran2eb7a612017-03-23 22:58:42 -07002571 uint8_t *ap_chnl_id)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002572{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302573 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08002574 struct mac_context *mac_ctx = sme_get_mac_context();
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002575 tCsrScanResultFilter *scan_filter = NULL;
2576 tScanResultHandle filtered_scan_result = NULL;
Pragaspathi Thilagaraj1112c962019-05-23 23:45:38 +05302577 struct bss_description first_ap_profile;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002578
Jeff Johnson038efe72019-03-18 13:39:31 -07002579 if (!mac_ctx) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302580 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002581 FL("mac_ctx is NULL"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302582 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002583 }
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302584 scan_filter = qdf_mem_malloc(sizeof(tCsrScanResultFilter));
Arif Hussain0ef77082018-10-10 16:42:53 -07002585 if (!scan_filter)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302586 return QDF_STATUS_E_FAILURE;
Arif Hussain0ef77082018-10-10 16:42:53 -07002587
Pragaspathi Thilagaraj1112c962019-05-23 23:45:38 +05302588 qdf_mem_zero(&first_ap_profile, sizeof(struct bss_description));
Jeff Johnson038efe72019-03-18 13:39:31 -07002589 if (!profile) {
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302590 scan_filter->EncryptionType.numEntries = 1;
2591 scan_filter->EncryptionType.encryptionType[0]
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002592 = eCSR_ENCRYPT_TYPE_NONE;
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302593 } else {
2594 /* Here is the profile we need to connect to */
2595 status = csr_roam_prepare_filter_from_profile(mac_ctx,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002596 profile,
2597 scan_filter);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302598 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002599
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302600 if (QDF_STATUS_SUCCESS == status) {
2601 /* Save the WPS info */
Jeff Johnson038efe72019-03-18 13:39:31 -07002602 if (profile) {
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302603 scan_filter->bWPSAssociation =
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002604 profile->bWPSAssociation;
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302605 scan_filter->bOSENAssociation =
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002606 profile->bOSENAssociation;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002607 } else {
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302608 scan_filter->bWPSAssociation = 0;
2609 scan_filter->bOSENAssociation = 0;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002610 }
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302611 } else {
2612 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
2613 FL("Preparing the profile filter failed"));
2614 qdf_mem_free(scan_filter);
2615 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002616 }
2617 status = sme_acquire_global_lock(&mac_ctx->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302618 if (QDF_STATUS_SUCCESS == status) {
Archana Ramachandran2eb7a612017-03-23 22:58:42 -07002619 status = csr_scan_get_result(mac_ctx, scan_filter,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002620 &filtered_scan_result);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302621 if (QDF_STATUS_SUCCESS == status) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002622 csr_get_bssdescr_from_scan_handle(filtered_scan_result,
2623 &first_ap_profile);
2624 *scan_cache = filtered_scan_result;
2625 if (0 != first_ap_profile.channelId) {
2626 *ap_chnl_id = first_ap_profile.channelId;
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302627 QDF_TRACE(QDF_MODULE_ID_SME,
Abhishek Singh5d8d7332017-08-10 15:15:24 +05302628 QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002629 FL("Found best AP & its on chnl[%d]"),
2630 first_ap_profile.channelId);
2631 } else {
2632 /*
2633 * This means scan result is empty
2634 * so set the channel to zero, caller should
2635 * take of zero channel id case.
2636 */
2637 *ap_chnl_id = 0;
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302638 QDF_TRACE(QDF_MODULE_ID_SME,
2639 QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002640 FL("Scan is empty, set chnl to 0"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302641 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002642 }
2643 } else {
Sandeep Puligilla1f1e4002018-08-18 12:15:01 -07002644 sme_err("Failed to get scan get result");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302645 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002646 }
2647 csr_free_scan_filter(mac_ctx, scan_filter);
2648 sme_release_global_lock(&mac_ctx->sme);
2649 } else {
Krunal Sonif9882222016-01-22 17:16:50 -08002650 csr_free_scan_filter(mac_ctx, scan_filter);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302651 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002652 }
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302653 qdf_mem_free(scan_filter);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002654 return status;
2655}
2656
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302657/*
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302658 * sme_scan_result_get_first() -
2659 * A wrapper function to request CSR to returns the first element of
2660 * scan result.
2661 * This is a synchronous call
2662 *
2663 * hScanResult - returned from csr_scan_get_result
2664 * Return tCsrScanResultInfo * - NULL if no result
2665 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08002666tCsrScanResultInfo *sme_scan_result_get_first(mac_handle_t mac_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002667 tScanResultHandle hScanResult)
2668{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302669 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08002670 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002671 tCsrScanResultInfo *pRet = NULL;
2672
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302673 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002674 TRACE_CODE_SME_RX_HDD_MSG_SCAN_RESULT_GETFIRST,
2675 NO_SESSION, 0));
Jeff Johnson01f2c232018-11-21 19:17:44 -08002676 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302677 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08002678 pRet = csr_scan_result_get_first(mac, hScanResult);
2679 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002680 }
2681
2682 return pRet;
2683}
2684
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302685/*
2686 * sme_scan_result_get_next() -
2687 * A wrapper function to request CSR to returns the next element of
2688 * scan result. It can be called without calling csr_scan_result_get_first first
2689 * This is a synchronous call
2690 *
2691 * hScanResult - returned from csr_scan_get_result
2692 * Return Null if no result or reach the end
2693 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08002694tCsrScanResultInfo *sme_scan_result_get_next(mac_handle_t mac_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002695 tScanResultHandle hScanResult)
2696{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302697 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08002698 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002699 tCsrScanResultInfo *pRet = NULL;
2700
Jeff Johnson01f2c232018-11-21 19:17:44 -08002701 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302702 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08002703 pRet = csr_scan_result_get_next(mac, hScanResult);
2704 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002705 }
2706
2707 return pRet;
2708}
2709
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302710/*
2711 * sme_scan_result_purge() -
2712 * A wrapper function to request CSR to remove all items(tCsrScanResult)
2713 * in the list and free memory for each item
2714 * This is a synchronous call
2715 *
2716 * hScanResult - returned from csr_scan_get_result. hScanResult is
2717 * considered gone by
2718 * calling this function and even before this function reutrns.
2719 * Return QDF_STATUS
2720 */
Archana Ramachandran2eb7a612017-03-23 22:58:42 -07002721QDF_STATUS sme_scan_result_purge(tScanResultHandle hScanResult)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002722{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302723 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08002724 struct mac_context *mac_ctx = sme_get_mac_context();
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002725
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302726 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002727 TRACE_CODE_SME_RX_HDD_MSG_SCAN_RESULT_PURGE,
2728 NO_SESSION, 0));
Archana Ramachandran2eb7a612017-03-23 22:58:42 -07002729 status = sme_acquire_global_lock(&mac_ctx->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302730 if (QDF_IS_STATUS_SUCCESS(status)) {
Archana Ramachandran2eb7a612017-03-23 22:58:42 -07002731 status = csr_scan_result_purge(mac_ctx, hScanResult);
2732 sme_release_global_lock(&mac_ctx->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002733 }
2734
2735 return status;
2736}
2737
Jeff Johnsonb460dd72018-11-08 10:26:51 -08002738eCsrPhyMode sme_get_phy_mode(mac_handle_t mac_handle)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002739{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08002740 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302741
Jeff Johnson01f2c232018-11-21 19:17:44 -08002742 return mac->roam.configParam.phyMode;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002743}
2744
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302745/*
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302746 * sme_roam_connect() -
2747 * A wrapper function to request CSR to inititiate an association
2748 * This is an asynchronous call.
2749 *
2750 * sessionId - the sessionId returned by sme_open_session.
2751 * pProfile - description of the network to which to connect
2752 * hBssListIn - a list of BSS descriptor to roam to. It is returned
2753 * from csr_scan_get_result
2754 * pRoamId - to get back the request ID
2755 * Return QDF_STATUS
2756 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08002757QDF_STATUS sme_roam_connect(mac_handle_t mac_handle, uint8_t sessionId,
Jeff Johnson66ee8a92018-03-17 15:24:26 -07002758 struct csr_roam_profile *pProfile,
2759 uint32_t *pRoamId)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002760{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302761 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08002762 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002763
Jeff Johnson01f2c232018-11-21 19:17:44 -08002764 if (!mac)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302765 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002766
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302767 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002768 TRACE_CODE_SME_RX_HDD_MSG_CONNECT, sessionId, 0));
Jeff Johnson01f2c232018-11-21 19:17:44 -08002769 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302770 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08002771 if (CSR_IS_SESSION_VALID(mac, sessionId)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002772 status =
Jeff Johnson01f2c232018-11-21 19:17:44 -08002773 csr_roam_connect(mac, sessionId, pProfile,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002774 pRoamId);
2775 } else {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002776 sme_err("Invalid sessionID: %d", sessionId);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302777 status = QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002778 }
Jeff Johnson01f2c232018-11-21 19:17:44 -08002779 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002780 }
2781
2782 return status;
2783}
2784
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302785/*
2786 * sme_set_phy_mode() -
2787 * Changes the PhyMode.
2788 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08002789 * mac_handle - The handle returned by mac_open.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302790 * phyMode new phyMode which is to set
2791 * Return QDF_STATUS SUCCESS.
2792 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08002793QDF_STATUS sme_set_phy_mode(mac_handle_t mac_handle, eCsrPhyMode phyMode)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002794{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08002795 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002796
Jeff Johnson01f2c232018-11-21 19:17:44 -08002797 mac->roam.configParam.phyMode = phyMode;
2798 mac->roam.configParam.uCfgDot11Mode =
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002799 csr_get_cfg_dot11_mode_from_csr_phy_mode(NULL,
Jeff Johnson01f2c232018-11-21 19:17:44 -08002800 mac->roam.configParam.phyMode,
2801 mac->roam.configParam.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302802 ProprietaryRatesEnabled);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002803
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302804 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002805}
2806
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302807/*
2808 * sme_roam_reassoc() -
2809 * A wrapper function to request CSR to inititiate a re-association
2810 *
2811 * pProfile - can be NULL to join the currently connected AP. In that
2812 * case modProfileFields should carry the modified field(s) which could trigger
2813 * reassoc
2814 * modProfileFields - fields which are part of tCsrRoamConnectedProfile
2815 * that might need modification dynamically once STA is up & running and this
2816 * could trigger a reassoc
2817 * pRoamId - to get back the request ID
2818 * Return QDF_STATUS
2819 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08002820QDF_STATUS sme_roam_reassoc(mac_handle_t mac_handle, uint8_t sessionId,
Jeff Johnson66ee8a92018-03-17 15:24:26 -07002821 struct csr_roam_profile *pProfile,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002822 tCsrRoamModifyProfileFields modProfileFields,
2823 uint32_t *pRoamId, bool fForce)
2824{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302825 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08002826 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002827
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302828 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002829 TRACE_CODE_SME_RX_HDD_ROAM_REASSOC, sessionId, 0));
Jeff Johnson01f2c232018-11-21 19:17:44 -08002830 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302831 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08002832 if (CSR_IS_SESSION_VALID(mac, sessionId)) {
Jeff Johnson038efe72019-03-18 13:39:31 -07002833 if ((!pProfile) && (fForce == 1))
Jeff Johnson01f2c232018-11-21 19:17:44 -08002834 status = csr_reassoc(mac, sessionId,
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302835 &modProfileFields, pRoamId,
2836 fForce);
2837 else
Jeff Johnson01f2c232018-11-21 19:17:44 -08002838 status = csr_roam_reassoc(mac, sessionId,
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302839 pProfile,
2840 modProfileFields, pRoamId);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002841 } else {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302842 status = QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002843 }
Jeff Johnson01f2c232018-11-21 19:17:44 -08002844 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002845 }
2846
2847 return status;
2848}
2849
Jeff Johnsonc7309062018-11-09 20:59:42 -08002850QDF_STATUS sme_roam_disconnect(mac_handle_t mac_handle, uint8_t session_id,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002851 eCsrRoamDisconnectReason reason)
2852{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302853 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08002854 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002855
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302856 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Varun Reddy Yeturu363809c2018-06-27 14:12:52 -07002857 TRACE_CODE_SME_RX_HDD_ROAM_DISCONNECT, session_id,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002858 reason));
Varun Reddy Yeturu363809c2018-06-27 14:12:52 -07002859 status = sme_acquire_global_lock(&mac_ctx->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302860 if (QDF_IS_STATUS_SUCCESS(status)) {
Varun Reddy Yeturu363809c2018-06-27 14:12:52 -07002861 if (CSR_IS_SESSION_VALID(mac_ctx, session_id))
2862 status = csr_roam_disconnect(mac_ctx, session_id,
2863 reason);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302864 else
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302865 status = QDF_STATUS_E_INVAL;
Varun Reddy Yeturu363809c2018-06-27 14:12:52 -07002866 sme_release_global_lock(&mac_ctx->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002867 }
2868
2869 return status;
2870}
2871
Abhishek Singhca408032016-09-13 15:26:12 +05302872/* sme_dhcp_done_ind() - send dhcp done ind
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -08002873 * @mac_handle: Opaque handle to the global MAC context
Abhishek Singhca408032016-09-13 15:26:12 +05302874 * @session_id: session id
2875 *
2876 * Return: void.
2877 */
Jeff Johnsonc7309062018-11-09 20:59:42 -08002878void sme_dhcp_done_ind(mac_handle_t mac_handle, uint8_t session_id)
Abhishek Singhca408032016-09-13 15:26:12 +05302879{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08002880 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
gaurank kathpalia14e2f912017-08-31 14:51:45 +05302881 struct csr_roam_session *session;
Abhishek Singhca408032016-09-13 15:26:12 +05302882
2883 if (!mac_ctx)
2884 return;
2885
2886 session = CSR_GET_SESSION(mac_ctx, session_id);
2887 if (!session) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002888 sme_err("Session: %d not found", session_id);
Abhishek Singhca408032016-09-13 15:26:12 +05302889 return;
2890 }
2891 session->dhcp_done = true;
2892}
2893
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302894/*
2895 * sme_roam_stop_bss() -
2896 * To stop BSS for Soft AP. This is an asynchronous API.
2897 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08002898 * mac_handle - Global structure
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302899 * sessionId - sessionId of SoftAP
2900 * Return QDF_STATUS SUCCESS Roam callback will be called to indicate
2901 * actual results
2902 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08002903QDF_STATUS sme_roam_stop_bss(mac_handle_t mac_handle, uint8_t sessionId)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002904{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302905 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08002906 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002907
Jeff Johnson01f2c232018-11-21 19:17:44 -08002908 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302909 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08002910 if (CSR_IS_SESSION_VALID(mac, sessionId))
2911 status = csr_roam_issue_stop_bss_cmd(mac, sessionId,
Himanshu Agarwal75c8d792017-12-19 18:31:04 +05302912 false);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302913 else
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302914 status = QDF_STATUS_E_INVAL;
Jeff Johnson01f2c232018-11-21 19:17:44 -08002915 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002916 }
2917
2918 return status;
2919}
2920
Deepthi Gowrib3bfefd2016-09-13 15:14:34 +05302921/**
2922 * sme_roam_disconnect_sta() - disassociate a station
Jeff Johnsonb460dd72018-11-08 10:26:51 -08002923 * @mac_handle: Global structure
Deepthi Gowrib3bfefd2016-09-13 15:14:34 +05302924 * @sessionId: SessionId of SoftAP
2925 * @p_del_sta_params: Pointer to parameters of the station to disassoc
2926 *
2927 * To disassociate a station. This is an asynchronous API.
2928 *
2929 * Return: QDF_STATUS_SUCCESS on success.Roam callback will
2930 * be called to indicate actual result.
2931 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08002932QDF_STATUS sme_roam_disconnect_sta(mac_handle_t mac_handle, uint8_t sessionId,
Jeff Johnsone6bf7192017-11-07 15:16:09 -08002933 struct csr_del_sta_params *p_del_sta_params)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002934{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302935 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08002936 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002937
Jeff Johnson038efe72019-03-18 13:39:31 -07002938 if (!mac) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302939 QDF_ASSERT(0);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002940 return status;
2941 }
2942
Jeff Johnson01f2c232018-11-21 19:17:44 -08002943 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302944 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08002945 if (CSR_IS_SESSION_VALID(mac, sessionId))
2946 status = csr_roam_issue_disassociate_sta_cmd(mac,
Deepthi Gowrib3bfefd2016-09-13 15:14:34 +05302947 sessionId, p_del_sta_params);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302948 else
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302949 status = QDF_STATUS_E_INVAL;
Jeff Johnson01f2c232018-11-21 19:17:44 -08002950 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002951 }
2952
2953 return status;
2954}
2955
2956/**
2957 * sme_roam_deauth_sta() - deauthenticate a station
Jeff Johnsonb460dd72018-11-08 10:26:51 -08002958 * @mac_handle: Global structure
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002959 * @sessionId: SessionId of SoftAP
2960 * @pDelStaParams: Pointer to parameters of the station to deauthenticate
2961 *
2962 * To disassociate a station. This is an asynchronous API.
2963 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302964 * Return: QDF_STATUS_SUCCESS on success or another QDF_STATUS error
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002965 * code on error. Roam callback will be called to indicate actual
2966 * result
2967 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08002968QDF_STATUS sme_roam_deauth_sta(mac_handle_t mac_handle, uint8_t sessionId,
Jeff Johnsone6bf7192017-11-07 15:16:09 -08002969 struct csr_del_sta_params *pDelStaParams)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002970{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302971 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08002972 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002973
Jeff Johnson038efe72019-03-18 13:39:31 -07002974 if (!mac) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302975 QDF_ASSERT(0);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002976 return status;
2977 }
2978
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302979 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Sreelakshmi Konamki6744cff2015-09-07 12:10:39 +05302980 TRACE_CODE_SME_RX_HDD_MSG_DEAUTH_STA,
2981 sessionId, pDelStaParams->reason_code));
Jeff Johnson01f2c232018-11-21 19:17:44 -08002982 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302983 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08002984 if (CSR_IS_SESSION_VALID(mac, sessionId))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002985 status =
Jeff Johnson01f2c232018-11-21 19:17:44 -08002986 csr_roam_issue_deauth_sta_cmd(mac, sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002987 pDelStaParams);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302988 else
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302989 status = QDF_STATUS_E_INVAL;
Jeff Johnson01f2c232018-11-21 19:17:44 -08002990 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002991 }
2992
2993 return status;
2994}
2995
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302996/*
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302997 * sme_roam_get_connect_profile() -
2998 * A wrapper function to request CSR to return the current connect
2999 * profile. Caller must call csr_roam_free_connect_profile after it is done
3000 * and before reuse for another csr_roam_get_connect_profile call.
3001 * This is a synchronous call.
3002 *
3003 * pProfile - pointer to a caller allocated structure
3004 * tCsrRoamConnectedProfile
3005 * eturn QDF_STATUS. Failure if not connected
3006 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08003007QDF_STATUS sme_roam_get_connect_profile(mac_handle_t mac_handle,
3008 uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003009 tCsrRoamConnectedProfile *pProfile)
3010{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303011 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08003012 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003013
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303014 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003015 TRACE_CODE_SME_RX_HDD_ROAM_GET_CONNECTPROFILE,
3016 sessionId, 0));
Jeff Johnson01f2c232018-11-21 19:17:44 -08003017 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303018 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08003019 if (CSR_IS_SESSION_VALID(mac, sessionId))
3020 status = csr_roam_get_connect_profile(mac, sessionId,
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303021 pProfile);
3022 else
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303023 status = QDF_STATUS_E_INVAL;
Jeff Johnson01f2c232018-11-21 19:17:44 -08003024 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003025 }
3026
3027 return status;
3028}
3029
Naveen Rawatdf0a7e72016-01-06 18:35:53 -08003030/**
3031 * sme_roam_free_connect_profile - a wrapper function to request CSR to free and
3032 * reinitialize the profile returned previously by csr_roam_get_connect_profile.
3033 *
3034 * @profile - pointer to a caller allocated structure tCsrRoamConnectedProfile
3035 *
3036 * Return: none
3037 */
3038void sme_roam_free_connect_profile(tCsrRoamConnectedProfile *profile)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003039{
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303040 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003041 TRACE_CODE_SME_RX_HDD_ROAM_FREE_CONNECTPROFILE,
3042 NO_SESSION, 0));
Naveen Rawatdf0a7e72016-01-06 18:35:53 -08003043 csr_roam_free_connect_profile(profile);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003044}
3045
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303046/*
3047 * sme_roam_set_pmkid_cache() -
3048 * A wrapper function to request CSR to return the PMKID candidate list
3049 * This is a synchronous call.
3050
3051 * pPMKIDCache - caller allocated buffer point to an array of
3052 * tPmkidCacheInfo
3053 * numItems - a variable that has the number of tPmkidCacheInfo
3054 * allocated when retruning, this is either the number needed
3055 * or number of items put into pPMKIDCache
3056 * update_entire_cache - this bool value specifies if the entire pmkid
3057 * cache should be overwritten or should it be
3058 * updated entry by entry.
3059 * Return QDF_STATUS - when fail, it usually means the buffer allocated is not
3060 * big enough and pNumItems has the number of
3061 * tPmkidCacheInfo.
3062 * \Note: pNumItems is a number of tPmkidCacheInfo,
3063 * not sizeof(tPmkidCacheInfo) * something
3064 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08003065QDF_STATUS sme_roam_set_pmkid_cache(mac_handle_t mac_handle, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003066 tPmkidCacheInfo *pPMKIDCache,
3067 uint32_t numItems, bool update_entire_cache)
3068{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303069 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08003070 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003071
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303072 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003073 TRACE_CODE_SME_RX_HDD_ROAM_SET_PMKIDCACHE, sessionId,
3074 numItems));
Jeff Johnson01f2c232018-11-21 19:17:44 -08003075 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303076 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08003077 if (CSR_IS_SESSION_VALID(mac, sessionId))
3078 status = csr_roam_set_pmkid_cache(mac, sessionId,
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303079 pPMKIDCache,
3080 numItems, update_entire_cache);
3081 else
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303082 status = QDF_STATUS_E_INVAL;
Jeff Johnson01f2c232018-11-21 19:17:44 -08003083 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003084 }
3085
3086 return status;
3087}
3088
Jeff Johnsonb460dd72018-11-08 10:26:51 -08003089QDF_STATUS sme_roam_del_pmkid_from_cache(mac_handle_t mac_handle,
3090 uint8_t sessionId,
Sridhar Selvarajc3684c72017-08-21 14:32:47 +05303091 tPmkidCacheInfo *pmksa,
3092 bool flush_cache)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003093{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303094 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08003095 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Sreelakshmi Konamki6744cff2015-09-07 12:10:39 +05303096
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303097 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Sreelakshmi Konamki6744cff2015-09-07 12:10:39 +05303098 TRACE_CODE_SME_RX_HDD_ROAM_DEL_PMKIDCACHE,
3099 sessionId, flush_cache));
Jeff Johnson01f2c232018-11-21 19:17:44 -08003100 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303101 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08003102 if (CSR_IS_SESSION_VALID(mac, sessionId))
3103 status = csr_roam_del_pmkid_from_cache(mac, sessionId,
Sridhar Selvarajc3684c72017-08-21 14:32:47 +05303104 pmksa, flush_cache);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303105 else
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303106 status = QDF_STATUS_E_INVAL;
Jeff Johnson01f2c232018-11-21 19:17:44 -08003107 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003108 }
3109 return status;
3110}
3111
Abhinav Kumar7830d9c2018-06-27 17:57:48 +05303112#ifdef WLAN_FEATURE_ROAM_OFFLOAD
Jeff Johnsonc7309062018-11-09 20:59:42 -08003113void sme_get_pmk_info(mac_handle_t mac_handle, uint8_t session_id,
3114 tPmkidCacheInfo *pmk_cache)
gaurank kathpalia99d06c12018-05-16 16:28:35 +05303115{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08003116 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
gaurank kathpalia99d06c12018-05-16 16:28:35 +05303117 QDF_STATUS status = sme_acquire_global_lock(&mac_ctx->sme);
3118
3119 if (QDF_IS_STATUS_SUCCESS(status)) {
3120 if (CSR_IS_SESSION_VALID(mac_ctx, session_id))
3121 csr_get_pmk_info(mac_ctx, session_id, pmk_cache);
3122 sme_release_global_lock(&mac_ctx->sme);
3123 }
3124}
Abhinav Kumar7830d9c2018-06-27 17:57:48 +05303125#endif
3126
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003127#ifdef WLAN_FEATURE_ROAM_OFFLOAD
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303128/*
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003129 * \fn sme_roam_set_psk_pmk
3130 * \brief a wrapper function to request CSR to save PSK/PMK
3131 * This is a synchronous call.
Jeff Johnsonb460dd72018-11-08 10:26:51 -08003132 * \param mac_handle - Global structure
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003133 * \param sessionId - SME sessionId
3134 * \param pPSK_PMK - pointer to an array of Psk[]/Pmk
3135 * \param pmk_len - Length could be only 16 bytes in case if LEAP
3136 * connections. Need to pass this information to
3137 * firmware.
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303138 * \return QDF_STATUS -status whether PSK/PMK is set or not
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003139 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08003140QDF_STATUS sme_roam_set_psk_pmk(mac_handle_t mac_handle, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003141 uint8_t *pPSK_PMK, size_t pmk_len)
3142{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303143 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08003144 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303145
Jeff Johnson01f2c232018-11-21 19:17:44 -08003146 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303147 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08003148 if (CSR_IS_SESSION_VALID(mac, sessionId))
3149 status = csr_roam_set_psk_pmk(mac, sessionId, pPSK_PMK,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003150 pmk_len);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303151 else
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303152 status = QDF_STATUS_E_INVAL;
Jeff Johnson01f2c232018-11-21 19:17:44 -08003153 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003154 }
3155 return status;
3156}
3157#endif
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003158
Jeff Johnsonc7309062018-11-09 20:59:42 -08003159QDF_STATUS sme_roam_get_wpa_rsn_req_ie(mac_handle_t mac_handle,
3160 uint8_t session_id,
Jeff Johnson0a078b52018-06-01 16:15:54 -07003161 uint32_t *len, uint8_t *buf)
3162{
3163 QDF_STATUS status;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08003164 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Jeff Johnson0a078b52018-06-01 16:15:54 -07003165
3166 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303167 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson0a078b52018-06-01 16:15:54 -07003168 if (CSR_IS_SESSION_VALID(mac, session_id))
3169 status = csr_roam_get_wpa_rsn_req_ie(mac, session_id,
3170 len, buf);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303171 else
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303172 status = QDF_STATUS_E_INVAL;
Jeff Johnson0a078b52018-06-01 16:15:54 -07003173 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003174 }
3175
3176 return status;
3177}
3178
Jeff Johnsonc7309062018-11-09 20:59:42 -08003179QDF_STATUS sme_roam_get_wpa_rsn_rsp_ie(mac_handle_t mac_handle,
3180 uint8_t session_id,
Jeff Johnson0a078b52018-06-01 16:15:54 -07003181 uint32_t *len, uint8_t *buf)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003182{
Jeff Johnson0a078b52018-06-01 16:15:54 -07003183 QDF_STATUS status;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08003184 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003185
Jeff Johnson0a078b52018-06-01 16:15:54 -07003186 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303187 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson0a078b52018-06-01 16:15:54 -07003188 if (CSR_IS_SESSION_VALID(mac, session_id))
3189 status = csr_roam_get_wpa_rsn_rsp_ie(mac, session_id,
3190 len, buf);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303191 else
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303192 status = QDF_STATUS_E_INVAL;
Jeff Johnson0a078b52018-06-01 16:15:54 -07003193 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003194 }
3195
3196 return status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003197}
3198
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303199/*
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303200 * sme_get_config_param() -
3201 * A wrapper function that HDD calls to get the global settings
3202 * currently maintained by CSR.
3203 * This is a synchronous call.
3204 *
3205 * pParam - caller allocated memory
3206 * Return QDF_STATUS
3207 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08003208QDF_STATUS sme_get_config_param(mac_handle_t mac_handle,
Jeff Johnson46b4f0e2019-03-08 10:48:35 -08003209 struct sme_config_params *pParam)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003210{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303211 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08003212 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003213
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303214 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003215 TRACE_CODE_SME_RX_HDD_GET_CONFIGPARAM, NO_SESSION, 0));
Jeff Johnson01f2c232018-11-21 19:17:44 -08003216 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303217 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnsone94ccd02019-04-02 15:02:56 -07003218 status = csr_get_config_param(mac, &pParam->csr_config);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303219 if (status != QDF_STATUS_SUCCESS) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07003220 sme_err("csr_get_config_param failed");
Jeff Johnson01f2c232018-11-21 19:17:44 -08003221 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003222 return status;
3223 }
Jeff Johnson01f2c232018-11-21 19:17:44 -08003224 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003225 }
3226
3227 return status;
3228}
3229
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303230/*
3231 * sme_get_modify_profile_fields() -
3232 * HDD or SME - QOS calls this function to get the current values of
3233 * connected profile fields, changing which can cause reassoc.
3234 * This function must be called after CFG is downloaded and STA is in connected
3235 * state. Also, make sure to call this function to get the current profile
3236 * fields before calling the reassoc. So that pModifyProfileFields will have
3237 * all the latest values plus the one(s) has been updated as part of reassoc
3238 * request.
3239 *
3240 * pModifyProfileFields - pointer to the connected profile fields
3241 * changing which can cause reassoc
3242 * Return QDF_STATUS
3243 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08003244QDF_STATUS sme_get_modify_profile_fields(mac_handle_t mac_handle,
3245 uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003246 tCsrRoamModifyProfileFields *
3247 pModifyProfileFields)
3248{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303249 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08003250 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003251
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303252 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003253 TRACE_CODE_SME_RX_HDD_GET_MODPROFFIELDS, sessionId,
3254 0));
Jeff Johnson01f2c232018-11-21 19:17:44 -08003255 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303256 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08003257 if (CSR_IS_SESSION_VALID(mac, sessionId))
3258 status = csr_get_modify_profile_fields(mac, sessionId,
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303259 pModifyProfileFields);
3260 else
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303261 status = QDF_STATUS_E_INVAL;
Jeff Johnson01f2c232018-11-21 19:17:44 -08003262 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003263 }
3264
3265 return status;
3266}
3267
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003268#ifdef FEATURE_OEM_DATA_SUPPORT
3269/**
3270 * sme_register_oem_data_rsp_callback() - Register a routine of
3271 * type send_oem_data_rsp_msg
Jeff Johnsonb460dd72018-11-08 10:26:51 -08003272 * @mac_handle: Handle returned by mac_open.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003273 * @callback: Callback to send response
3274 * to oem application.
3275 *
3276 * sme_oem_data_rsp_callback is used to register sme_send_oem_data_rsp_msg
3277 * callback function.
3278 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303279 * Return: QDF_STATUS.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003280 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08003281QDF_STATUS sme_register_oem_data_rsp_callback(mac_handle_t mac_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003282 sme_send_oem_data_rsp_msg callback)
3283{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303284 QDF_STATUS status = QDF_STATUS_SUCCESS;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08003285 struct mac_context *pmac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003286
Krishna Kumaar Natarajanbbbf2ef2016-08-03 14:06:26 -07003287 pmac->sme.oem_data_rsp_callback = callback;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003288
3289 return status;
3290
3291}
Arun Khandavalli4b55da72016-07-19 19:55:01 +05303292
3293/**
3294 * sme_deregister_oem_data_rsp_callback() - De-register OEM datarsp callback
Jeff Johnsonb460dd72018-11-08 10:26:51 -08003295 * @mac_handle: Handler return by mac_open
Arun Khandavalli4b55da72016-07-19 19:55:01 +05303296 * This function De-registers the OEM data response callback to SME
3297 *
3298 * Return: None
3299 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08003300void sme_deregister_oem_data_rsp_callback(mac_handle_t mac_handle)
Arun Khandavalli4b55da72016-07-19 19:55:01 +05303301{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08003302 struct mac_context *pmac;
Arun Khandavalli4b55da72016-07-19 19:55:01 +05303303
Jeff Johnsonb460dd72018-11-08 10:26:51 -08003304 if (!mac_handle) {
Arun Khandavalli4b55da72016-07-19 19:55:01 +05303305 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Jeff Johnsonb460dd72018-11-08 10:26:51 -08003306 FL("mac_handle is not valid"));
Arun Khandavalli4b55da72016-07-19 19:55:01 +05303307 return;
3308 }
Jeff Johnsona0619e42018-11-28 17:43:00 -08003309 pmac = MAC_CONTEXT(mac_handle);
Arun Khandavalli4b55da72016-07-19 19:55:01 +05303310
Krishna Kumaar Natarajanbbbf2ef2016-08-03 14:06:26 -07003311 pmac->sme.oem_data_rsp_callback = NULL;
Arun Khandavalli4b55da72016-07-19 19:55:01 +05303312}
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003313
3314/**
Krishna Kumaar Natarajan53ca2902015-12-04 14:01:46 -08003315 * sme_oem_update_capability() - update UMAC's oem related capability.
Jeff Johnsonc7309062018-11-09 20:59:42 -08003316 * @mac_handle: Handle returned by mac_open
Krishna Kumaar Natarajan53ca2902015-12-04 14:01:46 -08003317 * @oem_cap: pointer to oem_capability
3318 *
3319 * This function updates OEM capability to UMAC. Currently RTT
3320 * related capabilities are updated. More capabilities can be
3321 * added in future.
3322 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303323 * Return: QDF_STATUS
Krishna Kumaar Natarajan53ca2902015-12-04 14:01:46 -08003324 */
Jeff Johnsonc7309062018-11-09 20:59:42 -08003325QDF_STATUS sme_oem_update_capability(mac_handle_t mac_handle,
Krishna Kumaar Natarajan53ca2902015-12-04 14:01:46 -08003326 struct sme_oem_capability *cap)
3327{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303328 QDF_STATUS status = QDF_STATUS_SUCCESS;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08003329 struct mac_context *pmac = MAC_CONTEXT(mac_handle);
Krishna Kumaar Natarajan53ca2902015-12-04 14:01:46 -08003330 uint8_t *bytes;
3331
3332 bytes = pmac->rrm.rrmSmeContext.rrmConfig.rm_capability;
3333
3334 if (cap->ftm_rr)
3335 bytes[4] |= RM_CAP_FTM_RANGE_REPORT;
3336 if (cap->lci_capability)
3337 bytes[4] |= RM_CAP_CIVIC_LOC_MEASUREMENT;
3338
3339 return status;
3340}
3341
3342/**
3343 * sme_oem_get_capability() - get oem capability
Jeff Johnsonc7309062018-11-09 20:59:42 -08003344 * @mac_handle: Handle returned by mac_open
Krishna Kumaar Natarajan53ca2902015-12-04 14:01:46 -08003345 * @oem_cap: pointer to oem_capability
3346 *
3347 * This function is used to get the OEM capability from UMAC.
3348 * Currently RTT related capabilities are received. More
3349 * capabilities can be added in future.
3350 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303351 * Return: QDF_STATUS
Krishna Kumaar Natarajan53ca2902015-12-04 14:01:46 -08003352 */
Jeff Johnsonc7309062018-11-09 20:59:42 -08003353QDF_STATUS sme_oem_get_capability(mac_handle_t mac_handle,
Krishna Kumaar Natarajan53ca2902015-12-04 14:01:46 -08003354 struct sme_oem_capability *cap)
3355{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303356 QDF_STATUS status = QDF_STATUS_SUCCESS;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08003357 struct mac_context *pmac = MAC_CONTEXT(mac_handle);
Krishna Kumaar Natarajan53ca2902015-12-04 14:01:46 -08003358 uint8_t *bytes;
3359
3360 bytes = pmac->rrm.rrmSmeContext.rrmConfig.rm_capability;
3361
3362 cap->ftm_rr = bytes[4] & RM_CAP_FTM_RANGE_REPORT;
3363 cap->lci_capability = bytes[4] & RM_CAP_CIVIC_LOC_MEASUREMENT;
3364
3365 return status;
3366}
Naveen Rawat910726a2017-03-06 11:42:51 -08003367#endif
Krishna Kumaar Natarajan53ca2902015-12-04 14:01:46 -08003368
3369/**
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003370 * sme_roam_set_key() - To set encryption key.
Jeff Johnsonc7309062018-11-09 20:59:42 -08003371 * @mac_handle: mac_handle global context
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003372 * @session_id: session id
3373 * @set_key: pointer to a caller allocated object of tCsrSetContextInfo
3374 * @ptr_roam_id: Upon success return, this is the id caller can use to
3375 * identify the request in roamcallback
3376 *
3377 * This function should be called only when connected. This is an asynchronous
3378 * API.
3379 *
3380 * Return: Status of operation
3381 */
Jeff Johnsonc7309062018-11-09 20:59:42 -08003382QDF_STATUS sme_roam_set_key(mac_handle_t mac_handle, uint8_t session_id,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003383 tCsrRoamSetKey *set_key, uint32_t *ptr_roam_id)
3384{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303385 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08003386 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003387 uint32_t roam_id;
gaurank kathpalia14e2f912017-08-31 14:51:45 +05303388 struct csr_roam_session *session = NULL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003389 struct ps_global_info *ps_global_info = &mac_ctx->sme.ps_global_info;
3390
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303391 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_RX_HDD_SET_KEY,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003392 session_id, 0));
3393 if (set_key->keyLength > CSR_MAX_KEY_LEN) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07003394 sme_err("Invalid key length: %d", set_key->keyLength);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303395 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003396 }
3397 /*Once Setkey is done, we can go in BMPS */
3398 if (set_key->keyLength)
3399 ps_global_info->remain_in_power_active_till_dhcp = false;
3400
3401 status = sme_acquire_global_lock(&mac_ctx->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303402 if (!QDF_IS_STATUS_SUCCESS(status))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003403 return status;
3404
3405 roam_id = GET_NEXT_ROAM_ID(&mac_ctx->roam);
3406 if (ptr_roam_id)
3407 *ptr_roam_id = roam_id;
3408
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07003409 sme_debug("keyLength: %d", set_key->keyLength);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003410
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07003411 sme_debug("Session_id: %d roam_id: %d", session_id, roam_id);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003412 session = CSR_GET_SESSION(mac_ctx, session_id);
3413 if (!session) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07003414 sme_err("session %d not found", session_id);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003415 sme_release_global_lock(&mac_ctx->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303416 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003417 }
3418 if (CSR_IS_INFRA_AP(&session->connectedProfile)
3419 && set_key->keyDirection == eSIR_TX_DEFAULT) {
3420 if ((eCSR_ENCRYPT_TYPE_WEP40 == set_key->encType)
3421 || (eCSR_ENCRYPT_TYPE_WEP40_STATICKEY ==
3422 set_key->encType)) {
3423 session->pCurRoamProfile->negotiatedUCEncryptionType =
3424 eCSR_ENCRYPT_TYPE_WEP40_STATICKEY;
3425 }
3426 if ((eCSR_ENCRYPT_TYPE_WEP104 == set_key->encType)
3427 || (eCSR_ENCRYPT_TYPE_WEP104_STATICKEY ==
3428 set_key->encType)) {
3429 session->pCurRoamProfile->negotiatedUCEncryptionType =
3430 eCSR_ENCRYPT_TYPE_WEP104_STATICKEY;
3431 }
3432 }
3433 status = csr_roam_set_key(mac_ctx, session_id, set_key, roam_id);
3434 sme_release_global_lock(&mac_ctx->sme);
3435 return status;
3436}
3437
Masti, Narayanraddiab712a72016-08-04 11:59:11 +05303438/**
3439 * sme_roam_set_default_key_index - To set default wep key idx
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -08003440 * @mac_handle: Opaque handle to the global MAC context
Masti, Narayanraddiab712a72016-08-04 11:59:11 +05303441 * @session_id: session id
3442 * @default_idx: default wep key index
3443 *
3444 * This function prepares a message and post to WMA to set wep default
3445 * key index
3446 *
3447 * Return: Success:QDF_STATUS_SUCCESS Failure: Error value
3448 */
Jeff Johnsonc7309062018-11-09 20:59:42 -08003449QDF_STATUS sme_roam_set_default_key_index(mac_handle_t mac_handle,
3450 uint8_t session_id,
Masti, Narayanraddiab712a72016-08-04 11:59:11 +05303451 uint8_t default_idx)
3452{
Rajeev Kumar37d478b2017-04-17 16:59:28 -07003453 struct scheduler_msg msg = {0};
Masti, Narayanraddiab712a72016-08-04 11:59:11 +05303454 struct wep_update_default_key_idx *update_key;
3455
3456 update_key = qdf_mem_malloc(sizeof(*update_key));
Arif Hussain0ef77082018-10-10 16:42:53 -07003457 if (!update_key)
Masti, Narayanraddiab712a72016-08-04 11:59:11 +05303458 return QDF_STATUS_E_NOMEM;
Masti, Narayanraddiab712a72016-08-04 11:59:11 +05303459
3460 update_key->session_id = session_id;
3461 update_key->default_idx = default_idx;
3462
3463 msg.type = WMA_UPDATE_WEP_DEFAULT_KEY;
3464 msg.reserved = 0;
3465 msg.bodyptr = (void *)update_key;
3466
3467 if (QDF_STATUS_SUCCESS !=
gaurank kathpalia36b0c582018-08-28 17:45:43 +05303468 scheduler_post_message(QDF_MODULE_ID_SME,
3469 QDF_MODULE_ID_WMA,
3470 QDF_MODULE_ID_WMA, &msg)) {
Masti, Narayanraddiab712a72016-08-04 11:59:11 +05303471 qdf_mem_free(update_key);
3472 return QDF_STATUS_E_FAILURE;
3473 }
3474
3475 return QDF_STATUS_SUCCESS;
3476}
3477
3478
Jeff Johnson8bd23352017-09-26 11:39:24 -07003479/**
3480 * sme_get_rssi() - API to retrieve current RSSI
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -08003481 * @mac_handle: Opaque handle to the global MAC context
Jeff Johnson8bd23352017-09-26 11:39:24 -07003482 * @callback: SME sends back the requested stats using the callback
3483 * @staId: The station ID for which the RSSI is requested for
3484 * @bssid: The bssid of the connected session
3485 * @lastRSSI: RSSI value at time of request. In case fw cannot provide
3486 * RSSI, do not hold up but return this value.
3487 * @pContext: user context to be passed back along with the callback
3488 *
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303489 * A wrapper function that client calls to register a callback to get RSSI
3490 *
Jeff Johnson8bd23352017-09-26 11:39:24 -07003491 * Return: QDF_STATUS
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303492 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08003493QDF_STATUS sme_get_rssi(mac_handle_t mac_handle,
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303494 tCsrRssiCallback callback, uint8_t staId,
3495 struct qdf_mac_addr bssId, int8_t lastRSSI,
Jeff Johnson8bd23352017-09-26 11:39:24 -07003496 void *pContext)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003497{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303498 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08003499 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003500
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303501 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003502 TRACE_CODE_SME_RX_HDD_GET_RSSI, NO_SESSION, 0));
Jeff Johnson01f2c232018-11-21 19:17:44 -08003503 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303504 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08003505 status = csr_get_rssi(mac, callback,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003506 staId, bssId, lastRSSI,
Jeff Johnson8bd23352017-09-26 11:39:24 -07003507 pContext);
Jeff Johnson01f2c232018-11-21 19:17:44 -08003508 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003509 }
3510 return status;
3511}
3512
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303513/*
3514 * sme_get_snr() -
3515 * A wrapper function that client calls to register a callback to get SNR
3516 *
3517 * callback - SME sends back the requested stats using the callback
3518 * staId - The station ID for which the stats is requested for
3519 * pContext - user context to be passed back along with the callback
3520 * p_cds_context - cds context
3521 * \return QDF_STATUS
3522 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08003523QDF_STATUS sme_get_snr(mac_handle_t mac_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003524 tCsrSnrCallback callback,
Anurag Chouhan6d760662016-02-20 16:05:43 +05303525 uint8_t staId, struct qdf_mac_addr bssId, void *pContext)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003526{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303527 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08003528 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003529
Jeff Johnson01f2c232018-11-21 19:17:44 -08003530 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303531 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08003532 status = csr_get_snr(mac, callback, staId, bssId, pContext);
3533 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003534 }
3535 return status;
3536}
3537
Naveen Rawatfa2a1002018-05-17 16:06:37 -07003538#ifndef QCA_SUPPORT_CP_STATS
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303539/*
3540 * sme_get_statistics() -
3541 * A wrapper function that client calls to register a callback to get
3542 * different PHY level statistics from CSR.
3543 *
3544 * requesterId - different client requesting for statistics,
3545 * HDD, UMA/GAN etc
3546 * statsMask - The different category/categories of stats requester
3547 * is looking for
3548 * callback - SME sends back the requested stats using the callback
3549 * periodicity - If requester needs periodic update in millisec, 0 means
3550 * it's an one time request
3551 * cache - If requester is happy with cached stats
3552 * staId - The station ID for which the stats is requested for
3553 * pContext - user context to be passed back along with the callback
3554 * sessionId - sme session interface
3555 * Return QDF_STATUS
3556 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08003557QDF_STATUS sme_get_statistics(mac_handle_t mac_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003558 eCsrStatsRequesterType requesterId,
3559 uint32_t statsMask, tCsrStatsCallback callback,
Naveen Rawatd0ca4412017-06-16 14:19:19 -07003560 uint8_t staId, void *pContext, uint8_t sessionId)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003561{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303562 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08003563 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003564
Jeff Johnson01f2c232018-11-21 19:17:44 -08003565 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303566 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08003567 status = csr_get_statistics(mac, requesterId, statsMask,
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303568 callback, staId, pContext,
3569 sessionId);
Jeff Johnson01f2c232018-11-21 19:17:44 -08003570 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003571 }
3572
3573 return status;
3574
3575}
Naveen Rawatfa2a1002018-05-17 16:06:37 -07003576#endif
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003577
Jeff Johnsonca7a7162018-07-07 12:56:54 -07003578QDF_STATUS sme_get_link_status(mac_handle_t mac_handle,
3579 csr_link_status_callback callback,
3580 void *context, uint8_t session_id)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003581{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303582 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08003583 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Jeff Johnsonca7a7162018-07-07 12:56:54 -07003584 tAniGetLinkStatus *msg;
Rajeev Kumar37d478b2017-04-17 16:59:28 -07003585 struct scheduler_msg message = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003586
Jeff Johnsonca7a7162018-07-07 12:56:54 -07003587 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303588 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnsonca7a7162018-07-07 12:56:54 -07003589 msg = qdf_mem_malloc(sizeof(*msg));
3590 if (!msg) {
Jeff Johnsonca7a7162018-07-07 12:56:54 -07003591 sme_release_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303592 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003593 }
3594
Jeff Johnsonca7a7162018-07-07 12:56:54 -07003595 msg->msgType = WMA_LINK_STATUS_GET_REQ;
3596 msg->msgLen = sizeof(*msg);
3597 msg->sessionId = session_id;
3598 mac->sme.link_status_context = context;
3599 mac->sme.link_status_callback = callback;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003600
Rajeev Kumar8eaedf62017-01-21 11:03:13 -08003601 message.type = WMA_LINK_STATUS_GET_REQ;
Jeff Johnsonca7a7162018-07-07 12:56:54 -07003602 message.bodyptr = msg;
Rajeev Kumar8eaedf62017-01-21 11:03:13 -08003603 message.reserved = 0;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003604
gaurank kathpalia36b0c582018-08-28 17:45:43 +05303605 status = scheduler_post_message(QDF_MODULE_ID_SME,
3606 QDF_MODULE_ID_WMA,
3607 QDF_MODULE_ID_WMA, &message);
Jeff Johnsonca7a7162018-07-07 12:56:54 -07003608 if (QDF_IS_STATUS_ERROR(status)) {
3609 sme_err("post msg failed, %d", status);
3610 qdf_mem_free(msg);
3611 mac->sme.link_status_context = NULL;
3612 mac->sme.link_status_callback = NULL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003613 }
3614
Jeff Johnsonca7a7162018-07-07 12:56:54 -07003615 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003616 }
3617
3618 return status;
3619}
3620
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303621/*
3622 * sme_get_country_code() -
3623 * To return the current country code. If no country code is applied,
3624 * default country code is used to fill the buffer.
3625 * If 11d supported is turned off, an error is return and the last
3626 * applied/default country code is used.
3627 * This is a synchronous API.
3628 *
3629 * pBuf - pointer to a caller allocated buffer for returned country code.
3630 * pbLen For input, this parameter indicates how big is the buffer.
3631 * Upon return, this parameter has the number of bytes for
3632 * country. If pBuf doesn't have enough space, this function
3633 * returns fail status and this parameter contains the number
3634 * that is needed.
3635 *
3636 * Return QDF_STATUS SUCCESS.
3637 *
3638 * FAILURE or RESOURCES The API finished and failed.
3639 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08003640QDF_STATUS sme_get_country_code(mac_handle_t mac_handle, uint8_t *pBuf,
Jeff Johnson1f2dabc2018-11-07 15:33:01 -08003641 uint8_t *pbLen)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003642{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08003643 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003644
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303645 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003646 TRACE_CODE_SME_RX_HDD_GET_CNTRYCODE, NO_SESSION, 0));
3647
Jeff Johnson01f2c232018-11-21 19:17:44 -08003648 return csr_get_country_code(mac, pBuf, pbLen);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003649}
3650
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303651/*
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303652 * sme_generic_change_country_code() -
3653 * Change Country code from upperlayer during WLAN driver operation.
3654 * This is a synchronous API.
3655 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08003656 * mac_handle - The handle returned by mac_open.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303657 * pCountry New Country Code String
3658 * reg_domain regulatory domain
3659 * Return QDF_STATUS SUCCESS.
3660 * FAILURE or RESOURCES The API finished and failed.
3661 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08003662QDF_STATUS sme_generic_change_country_code(mac_handle_t mac_handle,
Amar Singhal7f1f3ec2015-10-13 17:14:08 -07003663 uint8_t *pCountry)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003664{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303665 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08003666 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Rajeev Kumar37d478b2017-04-17 16:59:28 -07003667 struct scheduler_msg msg = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003668 tAniGenericChangeCountryCodeReq *pMsg;
3669
Jeff Johnson038efe72019-03-18 13:39:31 -07003670 if (!mac) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303671 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_FATAL,
Jeff Johnson01f2c232018-11-21 19:17:44 -08003672 "%s: mac is null", __func__);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003673 return status;
3674 }
3675
Jeff Johnson01f2c232018-11-21 19:17:44 -08003676 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303677 if (QDF_IS_STATUS_SUCCESS(status)) {
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303678 pMsg = qdf_mem_malloc(sizeof(tAniGenericChangeCountryCodeReq));
Arif Hussain0ef77082018-10-10 16:42:53 -07003679 if (!pMsg) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08003680 sme_release_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303681 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003682 }
3683
3684 pMsg->msgType = eWNI_SME_GENERIC_CHANGE_COUNTRY_CODE;
3685 pMsg->msgLen =
3686 (uint16_t) sizeof(tAniGenericChangeCountryCodeReq);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303687 qdf_mem_copy(pMsg->countryCode, pCountry, 2);
Amar Singhal7f1f3ec2015-10-13 17:14:08 -07003688 pMsg->countryCode[2] = ' ';
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003689
3690 msg.type = eWNI_SME_GENERIC_CHANGE_COUNTRY_CODE;
3691 msg.bodyptr = pMsg;
3692 msg.reserved = 0;
3693
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303694 if (QDF_STATUS_SUCCESS !=
gaurank kathpalia36b0c582018-08-28 17:45:43 +05303695 scheduler_post_message(QDF_MODULE_ID_SME,
3696 QDF_MODULE_ID_SME,
3697 QDF_MODULE_ID_SME, &msg)) {
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303698 qdf_mem_free(pMsg);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303699 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003700 }
Jeff Johnson01f2c232018-11-21 19:17:44 -08003701 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003702 }
3703
3704 return status;
3705}
3706
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303707/*
3708 * sme_dhcp_start_ind() -
3709 * API to signal the FW about the DHCP Start event.
3710 *
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -08003711 * mac_handle: Opaque handle to the global MAC context.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303712 * device_mode - mode(AP,SAP etc) of the device.
3713 * macAddr - MAC address of the adapter.
3714 * sessionId - session ID.
3715 * Return QDF_STATUS SUCCESS.
3716 * FAILURE or RESOURCES The API finished and failed.
3717 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08003718QDF_STATUS sme_dhcp_start_ind(mac_handle_t mac_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003719 uint8_t device_mode,
3720 uint8_t *macAddr, uint8_t sessionId)
3721{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303722 QDF_STATUS status;
3723 QDF_STATUS qdf_status;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08003724 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Rajeev Kumar37d478b2017-04-17 16:59:28 -07003725 struct scheduler_msg message = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003726 tAniDHCPInd *pMsg;
gaurank kathpalia14e2f912017-08-31 14:51:45 +05303727 struct csr_roam_session *pSession;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003728
Jeff Johnson01f2c232018-11-21 19:17:44 -08003729 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303730 if (QDF_STATUS_SUCCESS == status) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08003731 pSession = CSR_GET_SESSION(mac, sessionId);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003732
3733 if (!pSession) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07003734 sme_err("Session: %d not found", sessionId);
Jeff Johnson01f2c232018-11-21 19:17:44 -08003735 sme_release_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303736 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003737 }
Arif Hussain3316f402016-11-10 13:08:03 -08003738 pSession->dhcp_done = false;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003739
Arif Hussain0ef77082018-10-10 16:42:53 -07003740 pMsg = qdf_mem_malloc(sizeof(tAniDHCPInd));
3741 if (!pMsg) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08003742 sme_release_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303743 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003744 }
3745 pMsg->msgType = WMA_DHCP_START_IND;
3746 pMsg->msgLen = (uint16_t) sizeof(tAniDHCPInd);
3747 pMsg->device_mode = device_mode;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303748 qdf_mem_copy(pMsg->adapterMacAddr.bytes, macAddr,
Anurag Chouhan6d760662016-02-20 16:05:43 +05303749 QDF_MAC_ADDR_SIZE);
Anurag Chouhanc5548422016-02-24 18:33:27 +05303750 qdf_copy_macaddr(&pMsg->peerMacAddr,
Srinivas Girigowda296105a2015-09-24 16:31:16 -07003751 &pSession->connectedProfile.bssid);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003752
Rajeev Kumar8eaedf62017-01-21 11:03:13 -08003753 message.type = WMA_DHCP_START_IND;
3754 message.bodyptr = pMsg;
3755 message.reserved = 0;
Sreelakshmi Konamki6a065362016-05-31 16:05:01 +05303756 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
Rajeev Kumar8eaedf62017-01-21 11:03:13 -08003757 sessionId, message.type));
gaurank kathpalia36b0c582018-08-28 17:45:43 +05303758 qdf_status = scheduler_post_message(QDF_MODULE_ID_SME,
3759 QDF_MODULE_ID_WMA,
3760 QDF_MODULE_ID_WMA,
3761 &message);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303762 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303763 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003764 "%s: Post DHCP Start MSG fail", __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303765 qdf_mem_free(pMsg);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303766 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003767 }
Jeff Johnson01f2c232018-11-21 19:17:44 -08003768 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003769 }
3770 return status;
3771}
3772
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303773/*
3774 * sme_dhcp_stop_ind() -
3775 * API to signal the FW about the DHCP complete event.
3776 *
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -08003777 * mac_handle: Opaque handle to the global MAC context.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303778 * device_mode - mode(AP, SAP etc) of the device.
3779 * macAddr - MAC address of the adapter.
3780 * sessionId - session ID.
3781 * Return QDF_STATUS SUCCESS.
3782 * FAILURE or RESOURCES The API finished and failed.
3783 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08003784QDF_STATUS sme_dhcp_stop_ind(mac_handle_t mac_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003785 uint8_t device_mode,
3786 uint8_t *macAddr, uint8_t sessionId)
3787{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303788 QDF_STATUS status;
3789 QDF_STATUS qdf_status;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08003790 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Rajeev Kumar37d478b2017-04-17 16:59:28 -07003791 struct scheduler_msg message = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003792 tAniDHCPInd *pMsg;
gaurank kathpalia14e2f912017-08-31 14:51:45 +05303793 struct csr_roam_session *pSession;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003794
Jeff Johnson01f2c232018-11-21 19:17:44 -08003795 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303796 if (QDF_STATUS_SUCCESS == status) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08003797 pSession = CSR_GET_SESSION(mac, sessionId);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003798
3799 if (!pSession) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07003800 sme_err("Session: %d not found", sessionId);
Jeff Johnson01f2c232018-11-21 19:17:44 -08003801 sme_release_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303802 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003803 }
Arif Hussain3316f402016-11-10 13:08:03 -08003804 pSession->dhcp_done = true;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003805
Arif Hussain0ef77082018-10-10 16:42:53 -07003806 pMsg = qdf_mem_malloc(sizeof(tAniDHCPInd));
3807 if (!pMsg) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08003808 sme_release_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303809 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003810 }
3811
3812 pMsg->msgType = WMA_DHCP_STOP_IND;
3813 pMsg->msgLen = (uint16_t) sizeof(tAniDHCPInd);
3814 pMsg->device_mode = device_mode;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303815 qdf_mem_copy(pMsg->adapterMacAddr.bytes, macAddr,
Anurag Chouhan6d760662016-02-20 16:05:43 +05303816 QDF_MAC_ADDR_SIZE);
Anurag Chouhanc5548422016-02-24 18:33:27 +05303817 qdf_copy_macaddr(&pMsg->peerMacAddr,
Srinivas Girigowda296105a2015-09-24 16:31:16 -07003818 &pSession->connectedProfile.bssid);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003819
Rajeev Kumar8eaedf62017-01-21 11:03:13 -08003820 message.type = WMA_DHCP_STOP_IND;
3821 message.bodyptr = pMsg;
3822 message.reserved = 0;
Sreelakshmi Konamki6a065362016-05-31 16:05:01 +05303823 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
Rajeev Kumar8eaedf62017-01-21 11:03:13 -08003824 sessionId, message.type));
gaurank kathpalia36b0c582018-08-28 17:45:43 +05303825 qdf_status = scheduler_post_message(QDF_MODULE_ID_SME,
3826 QDF_MODULE_ID_WMA,
3827 QDF_MODULE_ID_WMA,
3828 &message);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303829 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303830 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003831 "%s: Post DHCP Stop MSG fail", __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303832 qdf_mem_free(pMsg);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303833 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003834 }
3835
Jeff Johnson01f2c232018-11-21 19:17:44 -08003836 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003837 }
3838 return status;
3839}
3840
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303841/*
3842 * sme_TXFailMonitorStopInd() -
3843 * API to signal the FW to start monitoring TX failures
3844 *
3845 * Return QDF_STATUS SUCCESS.
3846 * FAILURE or RESOURCES The API finished and failed.
3847 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08003848QDF_STATUS sme_tx_fail_monitor_start_stop_ind(mac_handle_t mac_handle,
3849 uint8_t tx_fail_count,
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08003850 void *txFailIndCallback)
3851{
3852 QDF_STATUS status;
3853 QDF_STATUS qdf_status;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08003854 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Rajeev Kumar37d478b2017-04-17 16:59:28 -07003855 struct scheduler_msg message = {0};
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08003856 tAniTXFailMonitorInd *pMsg;
3857
Jeff Johnson01f2c232018-11-21 19:17:44 -08003858 status = sme_acquire_global_lock(&mac->sme);
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08003859 if (QDF_STATUS_SUCCESS == status) {
Arif Hussain0ef77082018-10-10 16:42:53 -07003860 pMsg = qdf_mem_malloc(sizeof(tAniTXFailMonitorInd));
3861 if (!pMsg) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08003862 sme_release_global_lock(&mac->sme);
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08003863 return QDF_STATUS_E_NOMEM;
3864 }
3865
3866 pMsg->msgType = WMA_TX_FAIL_MONITOR_IND;
3867 pMsg->msgLen = (uint16_t) sizeof(tAniTXFailMonitorInd);
3868
3869 /* tx_fail_count = 0 should disable the Monitoring in FW */
3870 pMsg->tx_fail_count = tx_fail_count;
3871 pMsg->txFailIndCallback = txFailIndCallback;
3872
Rajeev Kumar8eaedf62017-01-21 11:03:13 -08003873 message.type = WMA_TX_FAIL_MONITOR_IND;
3874 message.bodyptr = pMsg;
3875 message.reserved = 0;
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08003876
gaurank kathpalia36b0c582018-08-28 17:45:43 +05303877 qdf_status = scheduler_post_message(QDF_MODULE_ID_SME,
3878 QDF_MODULE_ID_WMA,
3879 QDF_MODULE_ID_WMA,
3880 &message);
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08003881 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
3882 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
3883 "%s: Post TX Fail monitor Start MSG fail",
3884 __func__);
3885 qdf_mem_free(pMsg);
3886 status = QDF_STATUS_E_FAILURE;
3887 }
Jeff Johnson01f2c232018-11-21 19:17:44 -08003888 sme_release_global_lock(&mac->sme);
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08003889 }
3890 return status;
3891}
3892
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303893/*
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303894 * sme_neighbor_report_request() -
3895 * API to request neighbor report.
3896 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08003897 * mac_handle - The handle returned by mac_open.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303898 * pRrmNeighborReq - Pointer to a caller allocated object of type
3899 * tRrmNeighborReq. Caller owns the memory and is
3900 * responsible for freeing it.
3901 * Return QDF_STATUS
3902 * QDF_STATUS_E_FAILURE - failure
3903 * QDF_STATUS_SUCCESS success
3904 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08003905QDF_STATUS sme_neighbor_report_request(
3906 mac_handle_t mac_handle,
3907 uint8_t sessionId,
3908 tpRrmNeighborReq pRrmNeighborReq,
3909 tpRrmNeighborRspCallbackInfo callbackInfo)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003910{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303911 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08003912 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303913
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303914 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003915 TRACE_CODE_SME_RX_HDD_NEIGHBOR_REPORTREQ, NO_SESSION,
3916 0));
3917
Vignesh Viswanathan694e28e2018-01-18 20:53:57 +05303918 if (pRrmNeighborReq->neighbor_report_offload) {
3919 status = csr_invoke_neighbor_report_request(sessionId,
3920 pRrmNeighborReq,
3921 false);
3922 return status;
3923 }
3924
Jeff Johnson01f2c232018-11-21 19:17:44 -08003925 if (QDF_STATUS_SUCCESS == sme_acquire_global_lock(&mac->sme)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003926 status =
Jeff Johnson01f2c232018-11-21 19:17:44 -08003927 sme_rrm_neighbor_report_request(mac, sessionId,
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303928 pRrmNeighborReq, callbackInfo);
Jeff Johnson01f2c232018-11-21 19:17:44 -08003929 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003930 }
3931
3932 return status;
3933}
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003934
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003935#ifdef FEATURE_OEM_DATA_SUPPORT
Krishna Kumaar Natarajanc5e06ac2016-06-30 16:49:19 -07003936/**
3937 * sme_oem_data_req() - send oem data request to WMA
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -08003938 * @mac_handle: Opaque handle to the global MAC context
Krishna Kumaar Natarajanc5e06ac2016-06-30 16:49:19 -07003939 * @hdd_oem_req: OEM data request from HDD
3940 *
3941 * Return: QDF_STATUS
3942 */
Jeff Johnsonc7309062018-11-09 20:59:42 -08003943QDF_STATUS sme_oem_data_req(mac_handle_t mac_handle,
3944 struct oem_data_req *hdd_oem_req)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003945{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303946 QDF_STATUS status = QDF_STATUS_SUCCESS;
Krishna Kumaar Natarajanc1fa17d2016-08-03 14:19:20 -07003947 struct oem_data_req *oem_data_req;
Krishna Kumaar Natarajanc5e06ac2016-06-30 16:49:19 -07003948 void *wma_handle;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003949
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07003950 SME_ENTER();
Krishna Kumaar Natarajanc5e06ac2016-06-30 16:49:19 -07003951 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
3952 if (!wma_handle) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07003953 sme_err("wma_handle is NULL");
Krishna Kumaar Natarajanc5e06ac2016-06-30 16:49:19 -07003954 return QDF_STATUS_E_FAILURE;
3955 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003956
Krishna Kumaar Natarajanc5e06ac2016-06-30 16:49:19 -07003957 oem_data_req = qdf_mem_malloc(sizeof(*oem_data_req));
Arif Hussain0ef77082018-10-10 16:42:53 -07003958 if (!oem_data_req)
Krishna Kumaar Natarajanc5e06ac2016-06-30 16:49:19 -07003959 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003960
Krishna Kumaar Natarajanc5e06ac2016-06-30 16:49:19 -07003961 oem_data_req->data_len = hdd_oem_req->data_len;
3962 oem_data_req->data = qdf_mem_malloc(oem_data_req->data_len);
Abhinav Kumar009f69f2019-06-05 21:43:31 +05303963 if (!oem_data_req->data) {
3964 qdf_mem_free(oem_data_req);
Krishna Kumaar Natarajanc5e06ac2016-06-30 16:49:19 -07003965 return QDF_STATUS_E_NOMEM;
Abhinav Kumar009f69f2019-06-05 21:43:31 +05303966 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003967
Krishna Kumaar Natarajanc5e06ac2016-06-30 16:49:19 -07003968 qdf_mem_copy(oem_data_req->data, hdd_oem_req->data,
3969 oem_data_req->data_len);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003970
Krishna Kumaar Natarajanc5e06ac2016-06-30 16:49:19 -07003971 status = wma_start_oem_data_req(wma_handle, oem_data_req);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003972
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303973 if (!QDF_IS_STATUS_SUCCESS(status))
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07003974 sme_err("Post oem data request msg fail");
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303975 else
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07003976 sme_debug("OEM request(length: %d) sent to WMA",
3977 oem_data_req->data_len);
Krishna Kumaar Natarajanc5e06ac2016-06-30 16:49:19 -07003978
3979 if (oem_data_req->data_len)
3980 qdf_mem_free(oem_data_req->data);
3981 qdf_mem_free(oem_data_req);
3982
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07003983 SME_EXIT();
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003984 return status;
3985}
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003986#endif /*FEATURE_OEM_DATA_SUPPORT */
3987
gaurank kathpalia78af1932018-10-27 20:33:10 +05303988#define STA_NSS_CHAINS_SHIFT 0
3989#define SAP_NSS_CHAINS_SHIFT 3
3990#define P2P_GO_NSS_CHAINS_SHIFT 6
3991#define P2P_CLI_CHAINS_SHIFT 9
gaurank kathpalia651abcd2018-11-12 22:41:23 +05303992#define TDLS_NSS_CHAINS_SHIFT 12
gaurank kathpalia78af1932018-10-27 20:33:10 +05303993#define IBSS_NSS_CHAINS_SHIFT 15
3994#define P2P_DEV_NSS_CHAINS_SHIFT 18
3995#define OCB_NSS_CHAINS_SHIFT 21
3996#define NAN_NSS_CHAIN_SHIFT 24
3997#define NSS_CHAIN_MASK 0x7
3998#define GET_VDEV_NSS_CHAIN(x, y) (((x) >> (y)) & NSS_CHAIN_MASK)
3999
4000static uint8_t sme_get_nss_chain_shift(enum QDF_OPMODE device_mode)
4001{
4002 switch (device_mode) {
4003 case QDF_STA_MODE:
4004 return STA_NSS_CHAINS_SHIFT;
4005 case QDF_SAP_MODE:
4006 return SAP_NSS_CHAINS_SHIFT;
4007 case QDF_P2P_GO_MODE:
4008 return P2P_GO_NSS_CHAINS_SHIFT;
4009 case QDF_P2P_CLIENT_MODE:
4010 return P2P_CLI_CHAINS_SHIFT;
4011 case QDF_IBSS_MODE:
4012 return IBSS_NSS_CHAINS_SHIFT;
4013 case QDF_P2P_DEVICE_MODE:
4014 return P2P_DEV_NSS_CHAINS_SHIFT;
4015 case QDF_OCB_MODE:
4016 return OCB_NSS_CHAINS_SHIFT;
gaurank kathpalia651abcd2018-11-12 22:41:23 +05304017 case QDF_TDLS_MODE:
4018 return TDLS_NSS_CHAINS_SHIFT;
gaurank kathpalia78af1932018-10-27 20:33:10 +05304019
4020 default:
4021 sme_err("Device mode %d invalid", device_mode);
4022 return STA_NSS_CHAINS_SHIFT;
4023 }
4024}
4025
4026static void
gaurank kathpaliacbf12122018-11-18 14:52:11 +05304027sme_check_nss_chain_ini_param(struct wlan_mlme_nss_chains *vdev_ini_cfg,
4028 uint8_t rf_chains_supported,
4029 enum nss_chains_band_info band)
4030{
4031 vdev_ini_cfg->rx_nss[band] = QDF_MIN(vdev_ini_cfg->rx_nss[band],
4032 rf_chains_supported);
4033 vdev_ini_cfg->tx_nss[band] = QDF_MIN(vdev_ini_cfg->tx_nss[band],
4034 rf_chains_supported);
4035}
4036
4037static void
gaurank kathpalia24ed0f42018-11-13 15:37:49 +05304038sme_fill_nss_chain_params(struct mac_context *mac_ctx,
gaurank kathpalia78af1932018-10-27 20:33:10 +05304039 struct wlan_mlme_nss_chains *vdev_ini_cfg,
4040 enum QDF_OPMODE device_mode,
4041 enum nss_chains_band_info band,
4042 uint8_t rf_chains_supported)
4043{
4044 uint8_t nss_chain_shift;
4045 uint8_t max_supported_nss;
4046 struct wlan_mlme_nss_chains *nss_chains_ini_cfg =
4047 &mac_ctx->mlme_cfg->nss_chains_ini_cfg;
4048
4049 nss_chain_shift = sme_get_nss_chain_shift(device_mode);
4050 max_supported_nss = mac_ctx->mlme_cfg->vht_caps.vht_cap_info.enable2x2 ?
4051 MAX_VDEV_NSS : 1;
4052
Nachiket Kukaded4d40bc2019-01-21 17:54:12 +05304053 /*
4054 * If target supports Antenna sharing, set NSS to 1 for 2.4GHz band for
4055 * NDI vdev.
4056 */
4057 if (device_mode == QDF_NDI_MODE && mac_ctx->lteCoexAntShare &&
4058 band == NSS_CHAINS_BAND_2GHZ)
4059 max_supported_nss = NSS_1x1_MODE;
4060
gaurank kathpalia78af1932018-10-27 20:33:10 +05304061 /* If the fw doesn't support two chains, num rf chains can max be 1 */
4062 vdev_ini_cfg->num_rx_chains[band] =
4063 QDF_MIN(GET_VDEV_NSS_CHAIN(
4064 nss_chains_ini_cfg->num_rx_chains[band],
4065 nss_chain_shift), rf_chains_supported);
4066
4067 vdev_ini_cfg->num_tx_chains[band] =
4068 QDF_MIN(GET_VDEV_NSS_CHAIN(
4069 nss_chains_ini_cfg->num_tx_chains[band],
4070 nss_chain_shift), rf_chains_supported);
4071
4072 /* If 2x2 mode is disabled, then max rx, tx nss can be 1 */
4073 vdev_ini_cfg->rx_nss[band] =
4074 QDF_MIN(GET_VDEV_NSS_CHAIN(
4075 nss_chains_ini_cfg->rx_nss[band],
4076 nss_chain_shift), max_supported_nss);
4077
4078 vdev_ini_cfg->tx_nss[band] =
4079 QDF_MIN(GET_VDEV_NSS_CHAIN(
4080 nss_chains_ini_cfg->tx_nss[band],
4081 nss_chain_shift), max_supported_nss);
4082
4083 vdev_ini_cfg->num_tx_chains_11a =
4084 QDF_MIN(GET_VDEV_NSS_CHAIN(
4085 nss_chains_ini_cfg->num_tx_chains_11a,
4086 nss_chain_shift), rf_chains_supported);
4087
4088 /* If the fw doesn't support two chains, num rf chains can max be 1 */
4089 vdev_ini_cfg->num_tx_chains_11b =
4090 QDF_MIN(GET_VDEV_NSS_CHAIN(
4091 nss_chains_ini_cfg->num_tx_chains_11b,
4092 nss_chain_shift), rf_chains_supported);
4093
4094 vdev_ini_cfg->num_tx_chains_11g =
4095 QDF_MIN(GET_VDEV_NSS_CHAIN(
4096 nss_chains_ini_cfg->num_tx_chains_11g,
4097 nss_chain_shift), rf_chains_supported);
4098
4099 vdev_ini_cfg->disable_rx_mrc[band] =
4100 nss_chains_ini_cfg->disable_rx_mrc[band];
4101
4102 vdev_ini_cfg->disable_tx_mrc[band] =
4103 nss_chains_ini_cfg->disable_tx_mrc[band];
gaurank kathpaliacbf12122018-11-18 14:52:11 +05304104 /*
4105 * Check whether the rx/tx nss is greater than the number of rf chains
4106 * supported by FW, if so downgrade the nss to the number of chains
4107 * supported, as higher nss cannot be supported with less chains.
4108 */
4109 sme_check_nss_chain_ini_param(vdev_ini_cfg, rf_chains_supported,
4110 band);
4111
gaurank kathpalia78af1932018-10-27 20:33:10 +05304112}
4113
4114void sme_populate_nss_chain_params(mac_handle_t mac_handle,
4115 struct wlan_mlme_nss_chains *vdev_ini_cfg,
4116 enum QDF_OPMODE device_mode,
4117 uint8_t rf_chains_supported)
4118{
gaurank kathpalia24ed0f42018-11-13 15:37:49 +05304119 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
gaurank kathpalia78af1932018-10-27 20:33:10 +05304120 enum nss_chains_band_info band;
4121
gaurank kathpaliab414bce2018-11-09 18:44:46 +05304122 for (band = NSS_CHAINS_BAND_2GHZ; band < NSS_CHAINS_BAND_MAX; band++)
gaurank kathpalia78af1932018-10-27 20:33:10 +05304123 sme_fill_nss_chain_params(mac_ctx, vdev_ini_cfg,
4124 device_mode, band,
4125 rf_chains_supported);
4126}
4127
gaurank kathpaliab414bce2018-11-09 18:44:46 +05304128void
4129sme_store_nss_chains_cfg_in_vdev(struct wlan_objmgr_vdev *vdev,
4130 struct wlan_mlme_nss_chains *vdev_ini_cfg)
4131{
4132 struct wlan_mlme_nss_chains *ini_cfg;
4133 struct wlan_mlme_nss_chains *dynamic_cfg;
4134
4135 ini_cfg = mlme_get_ini_vdev_config(vdev);
4136 dynamic_cfg = mlme_get_dynamic_vdev_config(vdev);
4137
4138 if (!ini_cfg || !dynamic_cfg) {
4139 sme_err("Nss chains ini/dynamic config NULL vdev_id %d",
4140 vdev->vdev_objmgr.vdev_id);
4141 return;
4142 }
4143
4144 *ini_cfg = *vdev_ini_cfg;
4145 *dynamic_cfg = *vdev_ini_cfg;
4146}
4147
gaurank kathpalia2b32de02018-10-24 18:31:14 +05304148static void
4149sme_populate_user_config(struct wlan_mlme_nss_chains *dynamic_cfg,
4150 struct wlan_mlme_nss_chains *user_cfg,
4151 enum nss_chains_band_info band)
4152{
4153 if (!user_cfg->num_rx_chains[band])
4154 user_cfg->num_rx_chains[band] =
4155 dynamic_cfg->num_rx_chains[band];
4156
4157 if (!user_cfg->num_tx_chains[band])
4158 user_cfg->num_tx_chains[band] =
4159 dynamic_cfg->num_tx_chains[band];
4160
4161 if (!user_cfg->rx_nss[band])
4162 user_cfg->rx_nss[band] =
4163 dynamic_cfg->rx_nss[band];
4164
4165 if (!user_cfg->tx_nss[band])
4166 user_cfg->tx_nss[band] =
4167 dynamic_cfg->tx_nss[band];
4168
4169 if (!user_cfg->num_tx_chains_11a)
4170 user_cfg->num_tx_chains_11a =
4171 dynamic_cfg->num_tx_chains_11a;
4172
4173 if (!user_cfg->num_tx_chains_11b)
4174 user_cfg->num_tx_chains_11b =
4175 dynamic_cfg->num_tx_chains_11b;
4176
4177 if (!user_cfg->num_tx_chains_11g)
4178 user_cfg->num_tx_chains_11g =
4179 dynamic_cfg->num_tx_chains_11g;
4180
4181 if (!user_cfg->disable_rx_mrc[band])
4182 user_cfg->disable_rx_mrc[band] =
4183 dynamic_cfg->disable_rx_mrc[band];
4184
4185 if (!user_cfg->disable_tx_mrc[band])
4186 user_cfg->disable_tx_mrc[band] =
4187 dynamic_cfg->disable_tx_mrc[band];
4188}
4189
4190static QDF_STATUS
4191sme_validate_from_ini_config(struct wlan_mlme_nss_chains *user_cfg,
4192 struct wlan_mlme_nss_chains *ini_cfg,
4193 enum nss_chains_band_info band)
4194{
4195 if (user_cfg->num_rx_chains[band] >
4196 ini_cfg->num_rx_chains[band])
4197 return QDF_STATUS_E_FAILURE;
4198
4199 if (user_cfg->num_tx_chains[band] >
4200 ini_cfg->num_tx_chains[band])
4201 return QDF_STATUS_E_FAILURE;
4202
4203 if (user_cfg->rx_nss[band] >
4204 ini_cfg->rx_nss[band])
4205 return QDF_STATUS_E_FAILURE;
4206
4207 if (user_cfg->tx_nss[band] >
4208 ini_cfg->tx_nss[band])
4209 return QDF_STATUS_E_FAILURE;
4210
4211 if (user_cfg->num_tx_chains_11a >
4212 ini_cfg->num_tx_chains_11a)
4213 return QDF_STATUS_E_FAILURE;
4214
4215 if (user_cfg->num_tx_chains_11b >
4216 ini_cfg->num_tx_chains_11b)
4217 return QDF_STATUS_E_FAILURE;
4218
4219 if (user_cfg->num_tx_chains_11g >
4220 ini_cfg->num_tx_chains_11g)
4221 return QDF_STATUS_E_FAILURE;
4222
4223 return QDF_STATUS_SUCCESS;
4224}
4225
4226static QDF_STATUS
4227sme_validate_user_nss_chain_params(
4228 struct wlan_mlme_nss_chains *user_cfg,
4229 enum nss_chains_band_info band)
4230{
4231 /* Reject as 2x1 modes are not supported in chains yet */
4232
4233 if (user_cfg->num_tx_chains[band] >
4234 user_cfg->num_rx_chains[band])
4235 return QDF_STATUS_E_FAILURE;
4236
4237 /* Also if mode is 2x2, we cant have chains as 1x1, or 1x2, or 2x1 */
4238
4239 if (user_cfg->tx_nss[band] >
4240 user_cfg->num_tx_chains[band])
4241 user_cfg->num_tx_chains[band] =
4242 user_cfg->tx_nss[band];
4243
4244 if (user_cfg->rx_nss[band] >
4245 user_cfg->num_rx_chains[band])
4246 user_cfg->num_rx_chains[band] =
4247 user_cfg->rx_nss[band];
4248
4249 /*
4250 * It may happen that already chains are in 1x1 mode and nss too
4251 * is in 1x1 mode, but the tx 11a/b/g chains in user config comes
4252 * as 2x1, or 1x2 which cannot support respective mode, as tx chains
4253 * for respective band have max of 1x1 only, so these cannot exceed
4254 * respective band num tx chains.
4255 */
4256
4257 if (user_cfg->num_tx_chains_11a >
gaurank kathpaliab414bce2018-11-09 18:44:46 +05304258 user_cfg->num_tx_chains[NSS_CHAINS_BAND_5GHZ])
gaurank kathpalia2b32de02018-10-24 18:31:14 +05304259 user_cfg->num_tx_chains_11a =
gaurank kathpaliab414bce2018-11-09 18:44:46 +05304260 user_cfg->num_tx_chains[NSS_CHAINS_BAND_5GHZ];
gaurank kathpalia2b32de02018-10-24 18:31:14 +05304261
4262 if (user_cfg->num_tx_chains_11b >
gaurank kathpaliab414bce2018-11-09 18:44:46 +05304263 user_cfg->num_tx_chains[NSS_CHAINS_BAND_2GHZ])
gaurank kathpalia2b32de02018-10-24 18:31:14 +05304264 user_cfg->num_tx_chains_11b =
gaurank kathpaliab414bce2018-11-09 18:44:46 +05304265 user_cfg->num_tx_chains[NSS_CHAINS_BAND_2GHZ];
gaurank kathpalia2b32de02018-10-24 18:31:14 +05304266
4267 if (user_cfg->num_tx_chains_11g >
gaurank kathpaliab414bce2018-11-09 18:44:46 +05304268 user_cfg->num_tx_chains[NSS_CHAINS_BAND_2GHZ])
gaurank kathpalia2b32de02018-10-24 18:31:14 +05304269 user_cfg->num_tx_chains_11g =
gaurank kathpaliab414bce2018-11-09 18:44:46 +05304270 user_cfg->num_tx_chains[NSS_CHAINS_BAND_2GHZ];
gaurank kathpalia2b32de02018-10-24 18:31:14 +05304271
4272 return QDF_STATUS_SUCCESS;
4273}
4274
4275static QDF_STATUS
4276sme_validate_nss_chains_config(struct wlan_objmgr_vdev *vdev,
gaurank kathpaliadb87c0d2018-10-31 16:44:00 +05304277 struct wlan_mlme_nss_chains *user_cfg,
4278 struct wlan_mlme_nss_chains *dynamic_cfg)
gaurank kathpalia2b32de02018-10-24 18:31:14 +05304279{
4280 enum nss_chains_band_info band;
4281 struct wlan_mlme_nss_chains *ini_cfg;
gaurank kathpalia2b32de02018-10-24 18:31:14 +05304282 QDF_STATUS status;
4283
4284 ini_cfg = mlme_get_ini_vdev_config(vdev);
4285 if (!ini_cfg) {
4286 sme_err("nss chain ini config NULL");
4287 return QDF_STATUS_E_FAILURE;
4288 }
gaurank kathpalia2b32de02018-10-24 18:31:14 +05304289
gaurank kathpaliab414bce2018-11-09 18:44:46 +05304290 for (band = NSS_CHAINS_BAND_2GHZ; band < NSS_CHAINS_BAND_MAX; band++) {
gaurank kathpalia2b32de02018-10-24 18:31:14 +05304291 sme_populate_user_config(dynamic_cfg,
4292 user_cfg, band);
4293 status = sme_validate_from_ini_config(user_cfg,
4294 ini_cfg,
4295 band);
4296 if (QDF_IS_STATUS_ERROR(status)) {
4297 sme_err("Validation from ini config failed");
4298 return QDF_STATUS_E_FAILURE;
4299 }
4300 status = sme_validate_user_nss_chain_params(user_cfg,
4301 band);
4302 if (QDF_IS_STATUS_ERROR(status)) {
4303 sme_err("User cfg validation failed");
4304 return QDF_STATUS_E_FAILURE;
4305 }
4306 }
4307
4308 return QDF_STATUS_SUCCESS;
4309}
4310
gaurank kathpaliafa7ad0a2019-03-12 19:17:56 +05304311static bool
4312sme_is_nss_update_allowed(struct wlan_mlme_chain_cfg chain_cfg,
4313 uint8_t rx_nss, uint8_t tx_nss,
4314 enum nss_chains_band_info band)
4315{
4316 switch (band) {
4317 case NSS_CHAINS_BAND_2GHZ:
4318 if (rx_nss > chain_cfg.max_rx_chains_2g)
4319 return false;
4320 if (tx_nss > chain_cfg.max_tx_chains_2g)
4321 return false;
4322 break;
4323 case NSS_CHAINS_BAND_5GHZ:
4324 if (rx_nss > chain_cfg.max_rx_chains_5g)
4325 return false;
4326 if (tx_nss > chain_cfg.max_tx_chains_5g)
4327 return false;
4328 break;
4329 default:
4330 sme_err("Unknown Band nss change not allowed");
4331 return false;
4332 }
4333 return true;
4334}
4335
4336static void sme_modify_chains_in_mlme_cfg(mac_handle_t mac_handle,
4337 uint8_t rx_chains,
4338 uint8_t tx_chains,
4339 enum QDF_OPMODE vdev_op_mode,
4340 enum nss_chains_band_info band)
gaurank kathpalia6c4b50c2019-02-28 14:07:48 +05304341{
4342 uint8_t nss_shift;
4343 uint32_t nss_mask = 0x7;
4344 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
4345
4346 nss_shift = sme_get_nss_chain_shift(vdev_op_mode);
4347
gaurank kathpaliafa7ad0a2019-03-12 19:17:56 +05304348 mac_ctx->mlme_cfg->nss_chains_ini_cfg.num_rx_chains[band] &=
4349 ~(nss_mask << nss_shift);
4350 mac_ctx->mlme_cfg->nss_chains_ini_cfg.num_rx_chains[band] |=
4351 (rx_chains << nss_shift);
4352 mac_ctx->mlme_cfg->nss_chains_ini_cfg.num_tx_chains[band] &=
4353 ~(nss_mask << nss_shift);
4354 mac_ctx->mlme_cfg->nss_chains_ini_cfg.num_tx_chains[band] |=
4355 (tx_chains << nss_shift);
4356 sme_debug("rx chains %d tx chains %d changed for vdev mode %d for band %d",
4357 rx_chains, tx_chains, vdev_op_mode, band);
4358}
4359
4360static void
4361sme_modify_nss_in_mlme_cfg(mac_handle_t mac_handle,
4362 uint8_t rx_nss, uint8_t tx_nss,
4363 enum QDF_OPMODE vdev_op_mode,
4364 enum nss_chains_band_info band)
4365{
4366 uint8_t nss_shift;
4367 uint32_t nss_mask = 0x7;
4368 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
4369
4370 if (!sme_is_nss_update_allowed(mac_ctx->fw_chain_cfg, rx_nss, tx_nss,
4371 band)) {
4372 sme_debug("Nss modification failed, fw doesn't support this nss %d",
4373 rx_nss);
4374 return;
4375 }
4376
4377 nss_shift = sme_get_nss_chain_shift(vdev_op_mode);
4378
gaurank kathpalia6c4b50c2019-02-28 14:07:48 +05304379 mac_ctx->mlme_cfg->nss_chains_ini_cfg.rx_nss[band] &=
4380 ~(nss_mask << nss_shift);
4381 mac_ctx->mlme_cfg->nss_chains_ini_cfg.rx_nss[band] |=
4382 (rx_nss << nss_shift);
4383 mac_ctx->mlme_cfg->nss_chains_ini_cfg.tx_nss[band] &=
4384 ~(nss_mask << nss_shift);
4385 mac_ctx->mlme_cfg->nss_chains_ini_cfg.tx_nss[band] |=
4386 (tx_nss << nss_shift);
4387 sme_debug("rx nss %d tx nss %d changed for vdev mode %d for band %d",
4388 rx_nss, tx_nss, vdev_op_mode, band);
4389}
4390
4391void
gaurank kathpaliafa7ad0a2019-03-12 19:17:56 +05304392sme_modify_nss_chains_tgt_cfg(mac_handle_t mac_handle,
4393 enum QDF_OPMODE vdev_op_mode,
4394 enum nss_chains_band_info band)
4395{
4396 uint8_t ini_rx_nss;
4397 uint8_t ini_tx_nss;
4398 uint8_t max_supported_rx_nss = MAX_VDEV_NSS;
4399 uint8_t max_supported_tx_nss = MAX_VDEV_NSS;
4400 uint8_t ini_rx_chains;
4401 uint8_t ini_tx_chains;
4402 uint8_t max_supported_rx_chains = MAX_VDEV_CHAINS;
4403 uint8_t max_supported_tx_chains = MAX_VDEV_CHAINS;
4404
4405 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
4406 struct wlan_mlme_nss_chains *nss_chains_ini_cfg =
4407 &mac_ctx->mlme_cfg->nss_chains_ini_cfg;
4408 uint8_t nss_shift = sme_get_nss_chain_shift(vdev_op_mode);
4409 struct wlan_mlme_chain_cfg chain_cfg = mac_ctx->fw_chain_cfg;
4410
4411 ini_rx_nss = GET_VDEV_NSS_CHAIN(nss_chains_ini_cfg->rx_nss[band],
4412 nss_shift);
4413 ini_tx_nss = GET_VDEV_NSS_CHAIN(nss_chains_ini_cfg->tx_nss[band],
4414 nss_shift);
4415
4416 if (band == NSS_CHAINS_BAND_2GHZ) {
4417 max_supported_rx_nss = chain_cfg.max_rx_chains_2g;
4418 max_supported_tx_nss = chain_cfg.max_tx_chains_2g;
4419 } else if (band == NSS_CHAINS_BAND_5GHZ) {
4420 max_supported_rx_nss = chain_cfg.max_rx_chains_5g;
4421 max_supported_tx_nss = chain_cfg.max_tx_chains_5g;
4422 }
4423
4424 max_supported_rx_nss = QDF_MIN(ini_rx_nss, max_supported_rx_nss);
gaurank kathpalia23afef12019-04-04 12:39:59 +05304425 if (!max_supported_rx_nss)
4426 return;
4427
gaurank kathpaliafa7ad0a2019-03-12 19:17:56 +05304428 max_supported_tx_nss = QDF_MIN(ini_tx_nss, max_supported_tx_nss);
gaurank kathpalia23afef12019-04-04 12:39:59 +05304429 if (!max_supported_tx_nss)
4430 return;
gaurank kathpaliafa7ad0a2019-03-12 19:17:56 +05304431
4432 ini_rx_chains = GET_VDEV_NSS_CHAIN(nss_chains_ini_cfg->
4433 num_rx_chains[band],
4434 nss_shift);
4435 ini_tx_chains = GET_VDEV_NSS_CHAIN(nss_chains_ini_cfg->
4436 num_tx_chains[band],
4437 nss_shift);
4438
4439 if (band == NSS_CHAINS_BAND_2GHZ) {
4440 max_supported_rx_chains = chain_cfg.max_rx_chains_2g;
4441 max_supported_tx_chains = chain_cfg.max_tx_chains_2g;
4442 } else if (band == NSS_CHAINS_BAND_5GHZ) {
4443 max_supported_rx_chains = chain_cfg.max_rx_chains_5g;
4444 max_supported_tx_chains = chain_cfg.max_tx_chains_5g;
4445 }
4446
4447 max_supported_rx_chains = QDF_MIN(ini_rx_chains,
4448 max_supported_rx_chains);
gaurank kathpalia23afef12019-04-04 12:39:59 +05304449 if (!max_supported_rx_chains)
4450 return;
4451
gaurank kathpaliafa7ad0a2019-03-12 19:17:56 +05304452 max_supported_tx_chains = QDF_MIN(ini_tx_chains,
4453 max_supported_tx_chains);
gaurank kathpalia23afef12019-04-04 12:39:59 +05304454 if (!max_supported_tx_chains)
4455 return;
gaurank kathpaliafa7ad0a2019-03-12 19:17:56 +05304456
4457 sme_modify_chains_in_mlme_cfg(mac_handle, max_supported_rx_chains,
4458 max_supported_tx_chains, vdev_op_mode,
4459 band);
4460 sme_modify_nss_in_mlme_cfg(mac_handle, max_supported_rx_nss,
4461 max_supported_tx_nss, vdev_op_mode, band);
4462}
4463
4464void
4465sme_update_nss_in_mlme_cfg(mac_handle_t mac_handle,
4466 uint8_t rx_nss, uint8_t tx_nss,
4467 enum QDF_OPMODE vdev_op_mode,
4468 enum nss_chains_band_info band)
gaurank kathpalia6c4b50c2019-02-28 14:07:48 +05304469{
4470 /*
4471 * If device mode is P2P-DEVICE, then we want P2P to come in that
4472 * particular nss, then we should change the nss of P@P-CLI, and GO
4473 * and we are unaware that for what will be the device mode after
4474 * negotiation yet.
4475 */
4476
4477 if (vdev_op_mode == QDF_P2P_DEVICE_MODE ||
4478 vdev_op_mode == QDF_P2P_CLIENT_MODE ||
4479 vdev_op_mode == QDF_P2P_GO_MODE) {
gaurank kathpaliafa7ad0a2019-03-12 19:17:56 +05304480 sme_modify_nss_in_mlme_cfg(mac_handle, rx_nss, tx_nss,
4481 QDF_P2P_CLIENT_MODE, band);
4482 sme_modify_nss_in_mlme_cfg(mac_handle, rx_nss, tx_nss,
4483 QDF_P2P_GO_MODE, band);
4484 sme_modify_nss_in_mlme_cfg(mac_handle, rx_nss, tx_nss,
4485 QDF_P2P_DEVICE_MODE, band);
gaurank kathpalia6c4b50c2019-02-28 14:07:48 +05304486 } else
gaurank kathpaliafa7ad0a2019-03-12 19:17:56 +05304487 sme_modify_nss_in_mlme_cfg(mac_handle, rx_nss, tx_nss,
4488 vdev_op_mode, band);
gaurank kathpalia6c4b50c2019-02-28 14:07:48 +05304489}
4490
gaurank kathpalia2b32de02018-10-24 18:31:14 +05304491QDF_STATUS
4492sme_nss_chains_update(mac_handle_t mac_handle,
4493 struct wlan_mlme_nss_chains *user_cfg,
4494 uint8_t vdev_id)
4495{
gaurank kathpalia24ed0f42018-11-13 15:37:49 +05304496 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
gaurank kathpalia2b32de02018-10-24 18:31:14 +05304497 QDF_STATUS status;
gaurank kathpaliadb87c0d2018-10-31 16:44:00 +05304498 struct wlan_mlme_nss_chains *dynamic_cfg;
gaurank kathpalia2b32de02018-10-24 18:31:14 +05304499 struct wlan_objmgr_vdev *vdev =
4500 wlan_objmgr_get_vdev_by_id_from_psoc(mac_ctx->psoc,
4501 vdev_id,
4502 WLAN_LEGACY_SME_ID);
4503 if (!vdev) {
4504 sme_err("Got NULL vdev obj, returning");
4505 return QDF_STATUS_E_FAILURE;
4506 }
gaurank kathpaliadb87c0d2018-10-31 16:44:00 +05304507
gaurank kathpalia748c7272018-10-24 22:05:15 +05304508 status = sme_acquire_global_lock(&mac_ctx->sme);
4509 if (QDF_IS_STATUS_ERROR(status))
4510 goto release_ref;
4511
gaurank kathpaliadb87c0d2018-10-31 16:44:00 +05304512 dynamic_cfg = mlme_get_dynamic_vdev_config(vdev);
4513 if (!dynamic_cfg) {
4514 sme_err("nss chain dynamic config NULL");
4515 status = QDF_STATUS_E_FAILURE;
4516 goto release_lock;
4517 }
4518
4519 status = sme_validate_nss_chains_config(vdev, user_cfg,
4520 dynamic_cfg);
gaurank kathpalia2b32de02018-10-24 18:31:14 +05304521 if (QDF_IS_STATUS_ERROR(status))
gaurank kathpalia748c7272018-10-24 22:05:15 +05304522 goto release_lock;
gaurank kathpaliadb87c0d2018-10-31 16:44:00 +05304523
4524 if (!qdf_mem_cmp(dynamic_cfg, user_cfg,
4525 sizeof(struct wlan_mlme_nss_chains))) {
4526 sme_debug("current config same as user config");
4527 status = QDF_STATUS_SUCCESS;
4528 goto release_lock;
4529 }
gaurank kathpalia748c7272018-10-24 22:05:15 +05304530 sme_debug("User params verified, sending to fw vdev id %d", vdev_id);
gaurank kathpalia2b32de02018-10-24 18:31:14 +05304531
gaurank kathpalia748c7272018-10-24 22:05:15 +05304532 status = wma_vdev_nss_chain_params_send(vdev->vdev_objmgr.vdev_id,
4533 user_cfg);
4534 if (QDF_IS_STATUS_ERROR(status)) {
4535 sme_err("params sent failed to fw vdev id %d", vdev_id);
4536 goto release_lock;
4537 }
4538
gaurank kathpaliab414bce2018-11-09 18:44:46 +05304539 *dynamic_cfg = *user_cfg;
gaurank kathpaliadb87c0d2018-10-31 16:44:00 +05304540
gaurank kathpalia748c7272018-10-24 22:05:15 +05304541release_lock:
4542 sme_release_global_lock(&mac_ctx->sme);
4543
4544release_ref:
gaurank kathpalia2b32de02018-10-24 18:31:14 +05304545 wlan_objmgr_vdev_release_ref(vdev, WLAN_LEGACY_SME_ID);
4546 return status;
4547}
4548
Jeff Johnsonc7309062018-11-09 20:59:42 -08004549QDF_STATUS sme_open_session(mac_handle_t mac_handle,
4550 struct sme_session_params *params)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004551{
Arif Hussainee677012017-01-26 17:50:13 -08004552 QDF_STATUS status = QDF_STATUS_E_INVAL;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08004553 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Arif Hussainee677012017-01-26 17:50:13 -08004554 struct cdp_pdev *pdev;
4555 ol_txrx_peer_handle peer;
4556 uint8_t peer_id;
Krishna Kumaar Natarajanb9e1d712017-06-20 17:14:37 -07004557 void *soc = cds_get_context(QDF_MODULE_ID_SOC);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004558
Abhishek Singhe4a1f882017-08-10 17:59:44 +05304559 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_DEBUG,
Rajeev Kumar7414c8c2017-04-06 15:42:52 -07004560 "%s: type=%d, session_id %d subType=%d addr:%pM",
Krunal Soni8d184fa2017-11-20 21:52:05 -08004561 __func__, params->type_of_persona,
4562 params->sme_session_id, params->subtype_of_persona,
4563 params->self_mac_addr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004564
Arif Hussainee677012017-01-26 17:50:13 -08004565 pdev = cds_get_context(QDF_MODULE_ID_TXRX);
4566
Jeff Johnson038efe72019-03-18 13:39:31 -07004567 if (!pdev) {
Arif Hussainee677012017-01-26 17:50:13 -08004568 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
4569 "%s: Failed to get pdev handler", __func__);
4570 return status;
4571 }
4572
Krunal Soni8d184fa2017-11-20 21:52:05 -08004573 status = sme_acquire_global_lock(&mac_ctx->sme);
Dustin Brownd28772b2017-03-17 14:16:07 -07004574 if (QDF_IS_STATUS_ERROR(status))
4575 return status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004576
Krunal Soni8d184fa2017-11-20 21:52:05 -08004577 peer = cdp_peer_find_by_addr(soc, pdev, params->self_mac_addr,
4578 &peer_id);
Arif Hussainee677012017-01-26 17:50:13 -08004579 if (peer) {
4580 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
4581 "%s: Peer=%d exist with same MAC",
4582 __func__, peer_id);
4583 status = QDF_STATUS_E_INVAL;
4584 } else {
Krunal Soni8d184fa2017-11-20 21:52:05 -08004585 status = csr_roam_open_session(mac_ctx, params);
Arif Hussainee677012017-01-26 17:50:13 -08004586 }
Krunal Soni8d184fa2017-11-20 21:52:05 -08004587 sme_release_global_lock(&mac_ctx->sme);
Dustin Brownd28772b2017-03-17 14:16:07 -07004588
4589 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_RX_HDD_OPEN_SESSION,
Krunal Soni8d184fa2017-11-20 21:52:05 -08004590 params->sme_session_id, 0));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004591
4592 return status;
4593}
4594
Jeff Johnsonc7309062018-11-09 20:59:42 -08004595QDF_STATUS sme_close_session(mac_handle_t mac_handle, uint8_t session_id)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004596{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304597 QDF_STATUS status;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08004598 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004599
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05304600 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Krunal Soni8d184fa2017-11-20 21:52:05 -08004601 TRACE_CODE_SME_RX_HDD_CLOSE_SESSION, session_id, 0));
Jeff Johnson01f2c232018-11-21 19:17:44 -08004602 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304603 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08004604 status = csr_roam_close_session(mac, session_id, false);
4605 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004606 }
4607
4608 return status;
4609}
4610
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05304611/*
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05304612 * sme_change_mcc_beacon_interval() -
4613 * To update P2P-GO beaconInterval. This function should be called after
4614 * disassociating all the station is done
4615 * This is an asynchronous API.
4616 *
4617 * @sessionId: Session Identifier
4618 * Return QDF_STATUS SUCCESS
4619 * FAILURE or RESOURCES
4620 * The API finished and failed.
4621 */
Archana Ramachandran2eb7a612017-03-23 22:58:42 -07004622QDF_STATUS sme_change_mcc_beacon_interval(uint8_t sessionId)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004623{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304624 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08004625 struct mac_context *mac_ctx = sme_get_mac_context();
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004626
Krunal Soni3fa80e22018-01-09 14:16:02 -08004627 if (!mac_ctx) {
4628 sme_err("mac_ctx is NULL");
4629 return status;
4630 }
Archana Ramachandran2eb7a612017-03-23 22:58:42 -07004631 status = sme_acquire_global_lock(&mac_ctx->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304632 if (QDF_IS_STATUS_SUCCESS(status)) {
Archana Ramachandran2eb7a612017-03-23 22:58:42 -07004633 status = csr_send_chng_mcc_beacon_interval(mac_ctx,
4634 sessionId);
4635 sme_release_global_lock(&mac_ctx->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004636 }
4637 return status;
4638}
4639
4640/**
4641 * sme_set_host_offload(): API to set the host offload feature.
Jeff Johnsonb460dd72018-11-08 10:26:51 -08004642 * @mac_handle: The handle returned by mac_open.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004643 * @sessionId: Session Identifier
4644 * @request: Pointer to the offload request.
4645 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304646 * Return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004647 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08004648QDF_STATUS sme_set_host_offload(mac_handle_t mac_handle, uint8_t sessionId,
Jeff Johnsond6fda812019-02-06 21:54:23 -08004649 struct sir_host_offload_req *request)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004650{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08004651 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304652 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004653
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05304654 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004655 TRACE_CODE_SME_RX_HDD_SET_HOSTOFFLOAD, sessionId, 0));
Jeff Johnson01f2c232018-11-21 19:17:44 -08004656 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304657 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004658#ifdef WLAN_NS_OFFLOAD
4659 if (SIR_IPV6_NS_OFFLOAD == request->offloadType) {
Jeff Johnsonb460dd72018-11-08 10:26:51 -08004660 status = sme_set_ps_ns_offload(mac_handle, request,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004661 sessionId);
4662 } else
4663#endif /* WLAN_NS_OFFLOAD */
4664 {
Jeff Johnsonb460dd72018-11-08 10:26:51 -08004665 status = sme_set_ps_host_offload(mac_handle, request,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004666 sessionId);
4667 }
Jeff Johnson01f2c232018-11-21 19:17:44 -08004668 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004669 }
4670
4671 return status;
4672}
4673
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05304674/*
4675 * sme_set_keep_alive() -
4676 * API to set the Keep Alive feature.
4677 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08004678 * mac_handle - The handle returned by mac_open.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05304679 * request - Pointer to the Keep Alive request.
4680 * Return QDF_STATUS
4681 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08004682QDF_STATUS sme_set_keep_alive(mac_handle_t mac_handle, uint8_t session_id,
Jeff Johnson562ccad2019-02-06 22:10:24 -08004683 struct keep_alive_req *request)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004684{
Jeff Johnson562ccad2019-02-06 22:10:24 -08004685 struct keep_alive_req *request_buf;
Rajeev Kumar37d478b2017-04-17 16:59:28 -07004686 struct scheduler_msg msg = {0};
Jeff Johnson0a8786a2018-12-02 10:49:01 -08004687 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Jeff Johnson01f2c232018-11-21 19:17:44 -08004688 struct csr_roam_session *pSession = CSR_GET_SESSION(mac, session_id);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004689
Abhishek Singhe4a1f882017-08-10 17:59:44 +05304690 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004691 FL("WMA_SET_KEEP_ALIVE message"));
4692
Jeff Johnson038efe72019-03-18 13:39:31 -07004693 if (!pSession) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05304694 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004695 FL("Session not Found"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304696 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004697 }
Jeff Johnson562ccad2019-02-06 22:10:24 -08004698 request_buf = qdf_mem_malloc(sizeof(*request_buf));
Arif Hussain0ef77082018-10-10 16:42:53 -07004699 if (!request_buf)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304700 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004701
Anurag Chouhanc5548422016-02-24 18:33:27 +05304702 qdf_copy_macaddr(&request->bssid, &pSession->connectedProfile.bssid);
Jeff Johnson562ccad2019-02-06 22:10:24 -08004703 qdf_mem_copy(request_buf, request, sizeof(*request_buf));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004704
Abhishek Singhe4a1f882017-08-10 17:59:44 +05304705 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004706 "buff TP %d input TP %d ", request_buf->timePeriod,
4707 request->timePeriod);
4708 request_buf->sessionId = session_id;
4709
4710 msg.type = WMA_SET_KEEP_ALIVE;
4711 msg.reserved = 0;
4712 msg.bodyptr = request_buf;
Sreelakshmi Konamki6a065362016-05-31 16:05:01 +05304713 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
4714 session_id, msg.type));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304715 if (QDF_STATUS_SUCCESS !=
gaurank kathpalia36b0c582018-08-28 17:45:43 +05304716 scheduler_post_message(QDF_MODULE_ID_SME,
4717 QDF_MODULE_ID_WMA,
4718 QDF_MODULE_ID_WMA, &msg)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05304719 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05304720 "Not able to post WMA_SET_KEEP_ALIVE message to WMA");
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304721 qdf_mem_free(request_buf);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304722 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004723 }
4724
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304725 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004726}
4727
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05304728/*
4729 * sme_get_operation_channel() -
4730 * API to get current channel on which STA is parked his function gives
4731 * channel information only of infra station or IBSS station
4732 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08004733 * mac_handle, pointer to memory location and sessionId
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05304734 * Returns QDF_STATUS_SUCCESS
4735 * QDF_STATUS_E_FAILURE
4736 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08004737QDF_STATUS sme_get_operation_channel(mac_handle_t mac_handle,
4738 uint32_t *pChannel,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004739 uint8_t sessionId)
4740{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08004741 struct mac_context *mac = MAC_CONTEXT(mac_handle);
gaurank kathpalia14e2f912017-08-31 14:51:45 +05304742 struct csr_roam_session *pSession;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004743
Jeff Johnson01f2c232018-11-21 19:17:44 -08004744 if (CSR_IS_SESSION_VALID(mac, sessionId)) {
4745 pSession = CSR_GET_SESSION(mac, sessionId);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004746
4747 if ((pSession->connectedProfile.BSSType ==
4748 eCSR_BSS_TYPE_INFRASTRUCTURE)
4749 || (pSession->connectedProfile.BSSType ==
4750 eCSR_BSS_TYPE_IBSS)
4751 || (pSession->connectedProfile.BSSType ==
4752 eCSR_BSS_TYPE_INFRA_AP)
4753 || (pSession->connectedProfile.BSSType ==
4754 eCSR_BSS_TYPE_START_IBSS)) {
4755 *pChannel = pSession->connectedProfile.operationChannel;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304756 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004757 }
4758 }
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304759 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004760} /* sme_get_operation_channel ends here */
4761
Abhishek Singh7996eb72015-12-30 17:24:02 +05304762/**
4763 * sme_register_mgmt_frame_ind_callback() - Register a callback for
4764 * management frame indication to PE.
4765 *
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -08004766 * @mac_handle: Opaque handle to the global MAC context
Abhishek Singh7996eb72015-12-30 17:24:02 +05304767 * @callback: callback pointer to be registered
4768 *
4769 * This function is used to register a callback for management
4770 * frame indication to PE.
4771 *
4772 * Return: Success if msg is posted to PE else Failure.
4773 */
Jeff Johnsonc7309062018-11-09 20:59:42 -08004774QDF_STATUS sme_register_mgmt_frame_ind_callback(mac_handle_t mac_handle,
Abhishek Singh7996eb72015-12-30 17:24:02 +05304775 sir_mgmt_frame_ind_callback callback)
4776{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08004777 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Abhishek Singh7996eb72015-12-30 17:24:02 +05304778 struct sir_sme_mgmt_frame_cb_req *msg;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304779 QDF_STATUS status = QDF_STATUS_SUCCESS;
Abhishek Singh7996eb72015-12-30 17:24:02 +05304780
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304781 if (QDF_STATUS_SUCCESS ==
Abhishek Singh7996eb72015-12-30 17:24:02 +05304782 sme_acquire_global_lock(&mac_ctx->sme)) {
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304783 msg = qdf_mem_malloc(sizeof(*msg));
Arif Hussain0ef77082018-10-10 16:42:53 -07004784 if (!msg) {
Abhishek Singh7996eb72015-12-30 17:24:02 +05304785 sme_release_global_lock(&mac_ctx->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304786 return QDF_STATUS_E_NOMEM;
Abhishek Singh7996eb72015-12-30 17:24:02 +05304787 }
Abhishek Singh7996eb72015-12-30 17:24:02 +05304788 msg->message_type = eWNI_SME_REGISTER_MGMT_FRAME_CB;
4789 msg->length = sizeof(*msg);
4790
4791 msg->callback = callback;
Rajeev Kumard138ac52017-01-30 18:38:37 -08004792 status = umac_send_mb_message_to_mac(msg);
Abhishek Singh7996eb72015-12-30 17:24:02 +05304793 sme_release_global_lock(&mac_ctx->sme);
4794 return status;
4795 }
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304796 return QDF_STATUS_E_FAILURE;
Abhishek Singh7996eb72015-12-30 17:24:02 +05304797}
4798
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05304799/*
4800 * sme_RegisterMgtFrame() -
Jeff Johnson698eacd2018-05-12 17:00:03 -07004801 * To register management frame of specified type and subtype.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05304802 *
4803 * frameType - type of the frame that needs to be passed to HDD.
4804 * matchData - data which needs to be matched before passing frame
4805 * to HDD.
4806 * matchDataLen - Length of matched data.
4807 * Return QDF_STATUS
4808 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08004809QDF_STATUS sme_register_mgmt_frame(mac_handle_t mac_handle, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004810 uint16_t frameType, uint8_t *matchData,
4811 uint16_t matchLen)
4812{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304813 QDF_STATUS status = QDF_STATUS_SUCCESS;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08004814 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004815
Jeff Johnson01f2c232018-11-21 19:17:44 -08004816 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304817 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson78f7a182019-02-01 22:45:41 -08004818 struct register_mgmt_frame *pMsg;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004819 uint16_t len;
Jeff Johnson01f2c232018-11-21 19:17:44 -08004820 struct csr_roam_session *pSession = CSR_GET_SESSION(mac,
gaurank kathpalia14e2f912017-08-31 14:51:45 +05304821 sessionId);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004822
4823 if (!CSR_IS_SESSION_ANY(sessionId) && !pSession) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07004824 sme_err("Session %d not found", sessionId);
Jeff Johnson01f2c232018-11-21 19:17:44 -08004825 sme_release_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304826 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004827 }
4828
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05304829 if (!CSR_IS_SESSION_ANY(sessionId) &&
4830 !pSession->sessionActive) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05304831 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004832 "%s Invalid Sessionid", __func__);
Jeff Johnson01f2c232018-11-21 19:17:44 -08004833 sme_release_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304834 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004835 }
4836
Jeff Johnson78f7a182019-02-01 22:45:41 -08004837 len = sizeof(*pMsg) + matchLen;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004838
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304839 pMsg = qdf_mem_malloc(len);
Jeff Johnson038efe72019-03-18 13:39:31 -07004840 if (!pMsg)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304841 status = QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004842 else {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004843 pMsg->messageType = eWNI_SME_REGISTER_MGMT_FRAME_REQ;
4844 pMsg->length = len;
4845 pMsg->sessionId = sessionId;
4846 pMsg->registerFrame = true;
4847 pMsg->frameType = frameType;
4848 pMsg->matchLen = matchLen;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304849 qdf_mem_copy(pMsg->matchData, matchData, matchLen);
Rajeev Kumard138ac52017-01-30 18:38:37 -08004850 status = umac_send_mb_message_to_mac(pMsg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004851 }
Jeff Johnson01f2c232018-11-21 19:17:44 -08004852 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004853 }
4854 return status;
4855}
4856
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05304857/*
4858 * sme_DeregisterMgtFrame() -
Jeff Johnson698eacd2018-05-12 17:00:03 -07004859 * To De-register management frame of specified type and subtype.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05304860 *
4861 * frameType - type of the frame that needs to be passed to HDD.
4862 * matchData - data which needs to be matched before passing frame
4863 * to HDD.
4864 * matchDataLen - Length of matched data.
4865 * Return QDF_STATUS
4866 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08004867QDF_STATUS sme_deregister_mgmt_frame(mac_handle_t mac_handle, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004868 uint16_t frameType, uint8_t *matchData,
4869 uint16_t matchLen)
4870{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304871 QDF_STATUS status = QDF_STATUS_SUCCESS;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08004872 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004873
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05304874 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004875 TRACE_CODE_SME_RX_HDD_DEREGISTER_MGMTFR, sessionId,
4876 0));
Jeff Johnson01f2c232018-11-21 19:17:44 -08004877 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304878 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson78f7a182019-02-01 22:45:41 -08004879 struct register_mgmt_frame *pMsg;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004880 uint16_t len;
Jeff Johnson01f2c232018-11-21 19:17:44 -08004881 struct csr_roam_session *pSession = CSR_GET_SESSION(mac,
gaurank kathpalia14e2f912017-08-31 14:51:45 +05304882 sessionId);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004883
4884 if (!CSR_IS_SESSION_ANY(sessionId) && !pSession) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07004885 sme_err("Session %d not found", sessionId);
Jeff Johnson01f2c232018-11-21 19:17:44 -08004886 sme_release_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304887 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004888 }
4889
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05304890 if (!CSR_IS_SESSION_ANY(sessionId) &&
4891 !pSession->sessionActive) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05304892 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004893 "%s Invalid Sessionid", __func__);
Jeff Johnson01f2c232018-11-21 19:17:44 -08004894 sme_release_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304895 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004896 }
4897
Jeff Johnson78f7a182019-02-01 22:45:41 -08004898 len = sizeof(*pMsg) + matchLen;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004899
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304900 pMsg = qdf_mem_malloc(len);
Jeff Johnson038efe72019-03-18 13:39:31 -07004901 if (!pMsg)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304902 status = QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004903 else {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004904 pMsg->messageType = eWNI_SME_REGISTER_MGMT_FRAME_REQ;
4905 pMsg->length = len;
4906 pMsg->registerFrame = false;
4907 pMsg->frameType = frameType;
4908 pMsg->matchLen = matchLen;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304909 qdf_mem_copy(pMsg->matchData, matchData, matchLen);
Rajeev Kumard138ac52017-01-30 18:38:37 -08004910 status = umac_send_mb_message_to_mac(pMsg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004911 }
Jeff Johnson01f2c232018-11-21 19:17:44 -08004912 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004913 }
4914 return status;
4915}
4916
Padma, Santhosh Kumar22c462c2018-01-16 17:56:44 +05304917/**
4918 * sme_prepare_mgmt_tx() - Prepares mgmt frame
Jeff Johnsonc7309062018-11-09 20:59:42 -08004919 * @mac_handle: The handle returned by mac_open
Padma, Santhosh Kumar22c462c2018-01-16 17:56:44 +05304920 * @session_id: session id
4921 * @buf: pointer to frame
4922 * @len: frame length
4923 *
4924 * Return: QDF_STATUS
4925 */
Jeff Johnsonc7309062018-11-09 20:59:42 -08004926static QDF_STATUS sme_prepare_mgmt_tx(mac_handle_t mac_handle,
4927 uint8_t session_id,
4928 const uint8_t *buf, uint32_t len)
Padma, Santhosh Kumar22c462c2018-01-16 17:56:44 +05304929{
4930 QDF_STATUS status = QDF_STATUS_SUCCESS;
4931 struct sir_mgmt_msg *msg;
4932 uint16_t msg_len;
4933 struct scheduler_msg sch_msg = {0};
4934
4935 sme_debug("prepares auth frame");
4936
4937 msg_len = sizeof(*msg) + len;
4938 msg = qdf_mem_malloc(msg_len);
Jeff Johnson038efe72019-03-18 13:39:31 -07004939 if (!msg) {
Padma, Santhosh Kumar22c462c2018-01-16 17:56:44 +05304940 status = QDF_STATUS_E_NOMEM;
4941 } else {
4942 msg->type = eWNI_SME_SEND_MGMT_FRAME_TX;
4943 msg->msg_len = msg_len;
4944 msg->session_id = session_id;
4945 msg->data = (uint8_t *)msg + sizeof(*msg);
4946 qdf_mem_copy(msg->data, buf, len);
4947
4948 sch_msg.type = eWNI_SME_SEND_MGMT_FRAME_TX;
4949 sch_msg.bodyptr = msg;
gaurank kathpalia36b0c582018-08-28 17:45:43 +05304950 status = scheduler_post_message(QDF_MODULE_ID_SME,
4951 QDF_MODULE_ID_PE,
4952 QDF_MODULE_ID_PE, &sch_msg);
Padma, Santhosh Kumar22c462c2018-01-16 17:56:44 +05304953 }
4954 return status;
4955}
4956
Jeff Johnsonc7309062018-11-09 20:59:42 -08004957QDF_STATUS sme_send_mgmt_tx(mac_handle_t mac_handle, uint8_t session_id,
4958 const uint8_t *buf, uint32_t len)
Padma, Santhosh Kumar22c462c2018-01-16 17:56:44 +05304959{
4960 QDF_STATUS status = QDF_STATUS_SUCCESS;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08004961 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Padma, Santhosh Kumar22c462c2018-01-16 17:56:44 +05304962
Padma, Santhosh Kumar22c462c2018-01-16 17:56:44 +05304963 status = sme_acquire_global_lock(&mac->sme);
4964 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnsonc7309062018-11-09 20:59:42 -08004965 status = sme_prepare_mgmt_tx(mac_handle, session_id, buf, len);
Padma, Santhosh Kumar22c462c2018-01-16 17:56:44 +05304966 sme_release_global_lock(&mac->sme);
4967 }
4968
4969 return status;
4970}
4971
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004972#ifdef WLAN_FEATURE_EXTWOW_SUPPORT
Krishna Kumaar Natarajand9131902015-10-19 11:52:47 -07004973/**
4974 * sme_configure_ext_wow() - configure Extr WoW
Jeff Johnsonb460dd72018-11-08 10:26:51 -08004975 * @mac_handle - The handle returned by mac_open.
Krishna Kumaar Natarajand9131902015-10-19 11:52:47 -07004976 * @wlanExtParams - Depicts the wlan Ext params.
4977 * @callback - ext_wow callback to be registered.
4978 * @callback_context - ext_wow callback context
4979 *
4980 * SME will pass this request to lower mac to configure Extr WoW
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304981 * Return: QDF_STATUS
Krishna Kumaar Natarajand9131902015-10-19 11:52:47 -07004982 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08004983QDF_STATUS sme_configure_ext_wow(mac_handle_t mac_handle,
4984 tpSirExtWoWParams wlanExtParams,
4985 csr_readyToExtWoWCallback callback,
4986 void *callback_context)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004987{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304988 QDF_STATUS status = QDF_STATUS_SUCCESS;
4989 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08004990 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Rajeev Kumar37d478b2017-04-17 16:59:28 -07004991 struct scheduler_msg message = {0};
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304992 tpSirExtWoWParams MsgPtr = qdf_mem_malloc(sizeof(*MsgPtr));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004993
4994 if (!MsgPtr)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304995 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004996
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05304997 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004998 TRACE_CODE_SME_RX_HDD_CONFIG_EXTWOW, NO_SESSION, 0));
4999
Jeff Johnson01f2c232018-11-21 19:17:44 -08005000 mac->readyToExtWoWCallback = callback;
5001 mac->readyToExtWoWContext = callback_context;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005002
Jeff Johnson01f2c232018-11-21 19:17:44 -08005003 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305004 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005005
5006 /* serialize the req through MC thread */
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305007 qdf_mem_copy(MsgPtr, wlanExtParams, sizeof(*MsgPtr));
Rajeev Kumar8eaedf62017-01-21 11:03:13 -08005008 message.bodyptr = MsgPtr;
5009 message.type = WMA_WLAN_EXT_WOW;
gaurank kathpalia36b0c582018-08-28 17:45:43 +05305010 qdf_status = scheduler_post_message(QDF_MODULE_ID_SME,
5011 QDF_MODULE_ID_WMA,
5012 QDF_MODULE_ID_WMA,
5013 &message);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305014 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08005015 mac->readyToExtWoWCallback = NULL;
5016 mac->readyToExtWoWContext = NULL;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305017 qdf_mem_free(MsgPtr);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305018 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005019 }
Jeff Johnson01f2c232018-11-21 19:17:44 -08005020 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005021 } else {
Jeff Johnson01f2c232018-11-21 19:17:44 -08005022 mac->readyToExtWoWCallback = NULL;
5023 mac->readyToExtWoWContext = NULL;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305024 qdf_mem_free(MsgPtr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005025 }
5026
5027 return status;
5028}
5029
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05305030/*
5031 * sme_configure_app_type1_params() -
5032 * SME will pass this request to lower mac to configure Indoor WoW parameters.
5033 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08005034 * mac_handle - The handle returned by mac_open.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05305035 * wlanAppType1Params- Depicts the wlan App Type 1(Indoor) params
5036 * Return QDF_STATUS
5037 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08005038QDF_STATUS sme_configure_app_type1_params(mac_handle_t mac_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005039 tpSirAppType1Params wlanAppType1Params)
5040{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305041 QDF_STATUS status = QDF_STATUS_SUCCESS;
5042 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08005043 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Rajeev Kumar37d478b2017-04-17 16:59:28 -07005044 struct scheduler_msg message = {0};
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305045 tpSirAppType1Params MsgPtr = qdf_mem_malloc(sizeof(*MsgPtr));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005046
5047 if (!MsgPtr)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305048 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005049
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05305050 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005051 TRACE_CODE_SME_RX_HDD_CONFIG_APP_TYPE1, NO_SESSION,
5052 0));
5053
Jeff Johnson01f2c232018-11-21 19:17:44 -08005054 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305055 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005056 /* serialize the req through MC thread */
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305057 qdf_mem_copy(MsgPtr, wlanAppType1Params, sizeof(*MsgPtr));
Rajeev Kumar8eaedf62017-01-21 11:03:13 -08005058 message.bodyptr = MsgPtr;
5059 message.type = WMA_WLAN_SET_APP_TYPE1_PARAMS;
gaurank kathpalia36b0c582018-08-28 17:45:43 +05305060 qdf_status = scheduler_post_message(QDF_MODULE_ID_SME,
5061 QDF_MODULE_ID_WMA,
5062 QDF_MODULE_ID_WMA,
5063 &message);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305064 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305065 qdf_mem_free(MsgPtr);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305066 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005067 }
Jeff Johnson01f2c232018-11-21 19:17:44 -08005068 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005069 } else {
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305070 qdf_mem_free(MsgPtr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005071 }
5072
5073 return status;
5074}
5075
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05305076/*
5077 * sme_configure_app_type2_params() -
5078 * SME will pass this request to lower mac to configure Indoor WoW parameters.
5079 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08005080 * mac_handle - The handle returned by mac_open.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05305081 * wlanAppType2Params- Depicts the wlan App Type 2 (Outdoor) params
5082 * Return QDF_STATUS
5083 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08005084QDF_STATUS sme_configure_app_type2_params(mac_handle_t mac_handle,
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05305085 tpSirAppType2Params wlanAppType2Params)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005086{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305087 QDF_STATUS status = QDF_STATUS_SUCCESS;
5088 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08005089 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Rajeev Kumar37d478b2017-04-17 16:59:28 -07005090 struct scheduler_msg message = {0};
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305091 tpSirAppType2Params MsgPtr = qdf_mem_malloc(sizeof(*MsgPtr));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005092
5093 if (!MsgPtr)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305094 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005095
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05305096 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005097 TRACE_CODE_SME_RX_HDD_CONFIG_APP_TYPE2, NO_SESSION,
5098 0));
5099
Jeff Johnson01f2c232018-11-21 19:17:44 -08005100 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305101 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005102 /* serialize the req through MC thread */
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305103 qdf_mem_copy(MsgPtr, wlanAppType2Params, sizeof(*MsgPtr));
Rajeev Kumar8eaedf62017-01-21 11:03:13 -08005104 message.bodyptr = MsgPtr;
5105 message.type = WMA_WLAN_SET_APP_TYPE2_PARAMS;
gaurank kathpalia36b0c582018-08-28 17:45:43 +05305106 qdf_status = scheduler_post_message(QDF_MODULE_ID_SME,
5107 QDF_MODULE_ID_WMA,
5108 QDF_MODULE_ID_WMA,
5109 &message);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305110 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305111 qdf_mem_free(MsgPtr);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305112 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005113 }
Jeff Johnson01f2c232018-11-21 19:17:44 -08005114 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005115 } else {
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305116 qdf_mem_free(MsgPtr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005117 }
5118
5119 return status;
5120}
5121#endif
5122
Abhishek Singhb1954c62019-02-14 10:18:28 +05305123uint8_t sme_get_beaconing_concurrent_operation_channel(mac_handle_t mac_handle,
5124 uint8_t vdev_id_to_skip)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005125{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305126 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08005127 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005128 uint8_t channel = 0;
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05305129
Jeff Johnson01f2c232018-11-21 19:17:44 -08005130 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305131 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005132
Abhishek Singhb1954c62019-02-14 10:18:28 +05305133 channel = csr_get_beaconing_concurrent_channel(mac,
5134 vdev_id_to_skip);
5135 sme_info("Other Concurrent Channel: %d skipped vdev_id %d",
5136 channel, vdev_id_to_skip);
Jeff Johnson01f2c232018-11-21 19:17:44 -08005137 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005138 }
5139
5140 return channel;
5141}
5142
5143#ifdef FEATURE_WLAN_MCC_TO_SCC_SWITCH
Jeff Johnsonb460dd72018-11-08 10:26:51 -08005144uint16_t sme_check_concurrent_channel_overlap(mac_handle_t mac_handle,
Jeff Johnson1f2dabc2018-11-07 15:33:01 -08005145 uint16_t sap_ch,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005146 eCsrPhyMode sapPhyMode,
5147 uint8_t cc_switch_mode)
5148{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305149 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08005150 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005151 uint16_t channel = 0;
5152
Jeff Johnson01f2c232018-11-21 19:17:44 -08005153 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305154 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005155 channel =
Jeff Johnson01f2c232018-11-21 19:17:44 -08005156 csr_check_concurrent_channel_overlap(mac, sap_ch,
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05305157 sapPhyMode,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005158 cc_switch_mode);
Jeff Johnson01f2c232018-11-21 19:17:44 -08005159 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005160 }
5161
5162 return channel;
5163}
5164#endif
5165
Arun Khandavalli4b55da72016-07-19 19:55:01 +05305166/**
Manikandan Mohandcc21ba2016-03-15 14:31:56 -07005167 * sme_set_tsfcb() - Set callback for TSF capture
Jeff Johnsonb460dd72018-11-08 10:26:51 -08005168 * @mac_handle: Handler return by mac_open
Manikandan Mohandcc21ba2016-03-15 14:31:56 -07005169 * @cb_fn: Callback function pointer
5170 * @db_ctx: Callback data
5171 *
5172 * Return: QDF_STATUS
5173 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08005174QDF_STATUS sme_set_tsfcb(mac_handle_t mac_handle,
Manikandan Mohandcc21ba2016-03-15 14:31:56 -07005175 int (*cb_fn)(void *cb_ctx, struct stsf *ptsf), void *cb_ctx)
5176{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08005177 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Manikandan Mohandcc21ba2016-03-15 14:31:56 -07005178 QDF_STATUS status;
5179
Manikandan Mohan976e7562016-03-15 16:33:31 -07005180 status = sme_acquire_global_lock(&mac->sme);
Manikandan Mohandcc21ba2016-03-15 14:31:56 -07005181 if (QDF_IS_STATUS_SUCCESS(status)) {
Manikandan Mohan976e7562016-03-15 16:33:31 -07005182 mac->sme.get_tsf_cb = cb_fn;
5183 mac->sme.get_tsf_cxt = cb_ctx;
5184 sme_release_global_lock(&mac->sme);
Manikandan Mohandcc21ba2016-03-15 14:31:56 -07005185 }
5186 return status;
5187}
5188
Arun Khandavalli4b55da72016-07-19 19:55:01 +05305189/**
5190 * sme_reset_tsfcb() - Reset callback for TSF capture
Jeff Johnsonb460dd72018-11-08 10:26:51 -08005191 * @mac_handle: Handler return by mac_open
Arun Khandavalli4b55da72016-07-19 19:55:01 +05305192 *
5193 * This function reset the tsf capture callback to SME
5194 *
5195 * Return: QDF_STATUS
5196 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08005197QDF_STATUS sme_reset_tsfcb(mac_handle_t mac_handle)
Arun Khandavalli4b55da72016-07-19 19:55:01 +05305198{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08005199 struct mac_context *mac;
Arun Khandavalli4b55da72016-07-19 19:55:01 +05305200 QDF_STATUS status;
5201
Jeff Johnsonb460dd72018-11-08 10:26:51 -08005202 if (!mac_handle) {
Arun Khandavalli4b55da72016-07-19 19:55:01 +05305203 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Jeff Johnsonb460dd72018-11-08 10:26:51 -08005204 FL("mac_handle is not valid"));
Arun Khandavalli4b55da72016-07-19 19:55:01 +05305205 return QDF_STATUS_E_INVAL;
5206 }
Jeff Johnsona0619e42018-11-28 17:43:00 -08005207 mac = MAC_CONTEXT(mac_handle);
Arun Khandavalli4b55da72016-07-19 19:55:01 +05305208
5209 status = sme_acquire_global_lock(&mac->sme);
5210 if (QDF_IS_STATUS_SUCCESS(status)) {
5211 mac->sme.get_tsf_cb = NULL;
5212 mac->sme.get_tsf_cxt = NULL;
5213 sme_release_global_lock(&mac->sme);
5214 }
5215 return status;
5216}
5217
yuanl2746f072018-09-21 19:19:16 +08005218#if defined(WLAN_FEATURE_TSF) && !defined(WLAN_FEATURE_TSF_PLUS_NOIRQ)
Manikandan Mohan976e7562016-03-15 16:33:31 -07005219/*
yuanl2746f072018-09-21 19:19:16 +08005220 * sme_set_tsf_gpio() - set gpio pin that be toggled when capture tsf
Jeff Johnsonb460dd72018-11-08 10:26:51 -08005221 * @mac_handle: Handler return by mac_open
Manikandan Mohan976e7562016-03-15 16:33:31 -07005222 * @pinvalue: gpio pin id
5223 *
5224 * Return: QDF_STATUS
5225 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08005226QDF_STATUS sme_set_tsf_gpio(mac_handle_t mac_handle, uint32_t pinvalue)
Manikandan Mohan976e7562016-03-15 16:33:31 -07005227{
5228 QDF_STATUS status;
Rajeev Kumar8eaedf62017-01-21 11:03:13 -08005229 struct scheduler_msg tsf_msg = {0};
Jeff Johnson0a8786a2018-12-02 10:49:01 -08005230 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Manikandan Mohan976e7562016-03-15 16:33:31 -07005231
5232 status = sme_acquire_global_lock(&mac->sme);
5233 if (QDF_IS_STATUS_SUCCESS(status)) {
5234 tsf_msg.type = WMA_TSF_GPIO_PIN;
5235 tsf_msg.reserved = 0;
5236 tsf_msg.bodyval = pinvalue;
5237
gaurank kathpalia36b0c582018-08-28 17:45:43 +05305238 status = scheduler_post_message(QDF_MODULE_ID_SME,
5239 QDF_MODULE_ID_WMA,
5240 QDF_MODULE_ID_WMA, &tsf_msg);
Manikandan Mohan976e7562016-03-15 16:33:31 -07005241 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07005242 sme_err("Unable to post WMA_TSF_GPIO_PIN");
Manikandan Mohan976e7562016-03-15 16:33:31 -07005243 status = QDF_STATUS_E_FAILURE;
5244 }
5245 sme_release_global_lock(&mac->sme);
5246 }
5247 return status;
5248}
5249#endif
5250
Tushnim Bhattacharyya0c4ad2d2017-03-09 15:59:03 -08005251QDF_STATUS sme_get_cfg_valid_channels(uint8_t *aValidChannels,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005252 uint32_t *len)
5253{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305254 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08005255 struct mac_context *mac_ctx = sme_get_mac_context();
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005256
Jeff Johnson038efe72019-03-18 13:39:31 -07005257 if (!mac_ctx) {
Tushnim Bhattacharyya0c4ad2d2017-03-09 15:59:03 -08005258 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
5259 FL("Invalid MAC context"));
5260 return QDF_STATUS_E_FAILURE;
5261 }
5262
5263 status = sme_acquire_global_lock(&mac_ctx->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305264 if (QDF_IS_STATUS_SUCCESS(status)) {
Tushnim Bhattacharyya0c4ad2d2017-03-09 15:59:03 -08005265 status = csr_get_cfg_valid_channels(mac_ctx,
5266 aValidChannels, len);
5267 sme_release_global_lock(&mac_ctx->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005268 }
5269
5270 return status;
5271}
5272
Amar Singhalf0a94ad2017-11-27 15:20:00 -08005273static uint8_t *sme_reg_hint_to_str(const enum country_src src)
5274{
5275 switch (src) {
5276 case SOURCE_CORE:
5277 return "WORLD MODE";
5278
5279 case SOURCE_DRIVER:
5280 return "BDF file";
5281
5282 case SOURCE_USERSPACE:
5283 return "user-space";
5284
5285 case SOURCE_11D:
5286 return "802.11D IEs in beacons";
5287
5288 default:
5289 return "unknown";
5290 }
5291}
5292
Jeff Johnsonb460dd72018-11-08 10:26:51 -08005293void sme_set_cc_src(mac_handle_t mac_handle, enum country_src cc_src)
Amar Singhal6edf9732016-11-20 21:43:40 -08005294{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08005295 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Amar Singhal6edf9732016-11-20 21:43:40 -08005296
5297 mac_ctx->reg_hint_src = cc_src;
Amar Singhalf0a94ad2017-11-27 15:20:00 -08005298
5299 sme_debug("Country source is %s",
5300 sme_reg_hint_to_str(cc_src));
Amar Singhal6edf9732016-11-20 21:43:40 -08005301}
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005302
5303/**
Amar Singhal7f1f3ec2015-10-13 17:14:08 -07005304 * sme_handle_generic_change_country_code() - handles country ch req
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005305 * @mac_ctx: mac global context
5306 * @msg: request msg packet
5307 *
5308 * If Supplicant country code is priority than 11d is disabled.
5309 * If 11D is enabled, we update the country code after every scan.
5310 * Hence when Supplicant country code is priority, we don't need 11D info.
5311 * Country code from Supplicant is set as current country code.
5312 *
5313 * Return: status of operation
5314 */
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05305315static QDF_STATUS
Jeff Johnson0a8786a2018-12-02 10:49:01 -08005316sme_handle_generic_change_country_code(struct mac_context *mac_ctx,
Pragaspathi Thilagaraj469495b2019-05-30 00:18:31 +05305317 void *msg_buf)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005318{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305319 QDF_STATUS status = QDF_STATUS_SUCCESS;
Amar Singhal7f1f3ec2015-10-13 17:14:08 -07005320 v_REGDOMAIN_t reg_domain_id = 0;
Amar Singhalb6d0dc42016-10-19 09:45:05 -07005321 bool user_ctry_priority =
Bala Venkatesh46e29032018-11-14 18:24:55 +05305322 mac_ctx->mlme_cfg->sap_cfg.country_code_priority;
Pragaspathi Thilagaraj469495b2019-05-30 00:18:31 +05305323 tAniGenericChangeCountryCodeReq *msg = msg_buf;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005324
Amar Singhal6edf9732016-11-20 21:43:40 -08005325 if (SOURCE_11D != mac_ctx->reg_hint_src) {
5326 if (SOURCE_DRIVER != mac_ctx->reg_hint_src) {
5327 if (user_ctry_priority)
Abhinav Kumard4d6eb72018-12-04 20:30:37 +05305328 mac_ctx->mlme_cfg->gen.enabled_11d = false;
Amar Singhal6edf9732016-11-20 21:43:40 -08005329 else {
Abhinav Kumard4d6eb72018-12-04 20:30:37 +05305330 if (mac_ctx->mlme_cfg->gen.enabled_11d &&
5331 mac_ctx->scan.countryCode11d[0] != 0) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005332
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07005333 sme_debug("restore 11d");
Amar Singhalb6d0dc42016-10-19 09:45:05 -07005334
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05305335 status =
5336 csr_get_regulatory_domain_for_country(
Amar Singhal6edf9732016-11-20 21:43:40 -08005337 mac_ctx,
5338 mac_ctx->scan.countryCode11d,
5339 &reg_domain_id,
5340 SOURCE_11D);
5341 return QDF_STATUS_E_FAILURE;
5342 }
Amar Singhalb6d0dc42016-10-19 09:45:05 -07005343 }
5344 }
5345 } else {
5346 /* if kernel gets invalid country code; it
5347 * resets the country code to world
5348 */
5349 if (('0' != msg->countryCode[0]) ||
5350 ('0' != msg->countryCode[1]))
5351 qdf_mem_copy(mac_ctx->scan.countryCode11d,
5352 msg->countryCode,
Wu Gaoaa155142019-01-14 15:09:26 +08005353 CFG_COUNTRY_CODE_LEN);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005354 }
Amar Singhal7f1f3ec2015-10-13 17:14:08 -07005355
Amar Singhalb6d0dc42016-10-19 09:45:05 -07005356 qdf_mem_copy(mac_ctx->scan.countryCodeCurrent,
5357 msg->countryCode,
Wu Gaoaa155142019-01-14 15:09:26 +08005358 CFG_COUNTRY_CODE_LEN);
Amar Singhal9d5b1fe2016-10-16 20:16:05 -07005359
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005360 /* get the channels based on new cc */
5361 status = csr_get_channel_and_power_list(mac_ctx);
5362
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305363 if (status != QDF_STATUS_SUCCESS) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07005364 sme_err("fail to get Channels");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005365 return status;
5366 }
Amar Singhalb6d0dc42016-10-19 09:45:05 -07005367
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005368 /* reset info based on new cc, and we are done */
5369 csr_apply_channel_power_info_wrapper(mac_ctx);
5370
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005371 csr_scan_filter_results(mac_ctx);
Amar Singhalb6d0dc42016-10-19 09:45:05 -07005372
5373 /* scans after the country is set by User hints or
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005374 * Country IE
5375 */
5376 mac_ctx->scan.curScanType = eSIR_ACTIVE_SCAN;
Amar Singhal9d5b1fe2016-10-16 20:16:05 -07005377
Amar Singhal6edf9732016-11-20 21:43:40 -08005378 mac_ctx->reg_hint_src = SOURCE_UNKNOWN;
5379
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005380 sme_disconnect_connected_sessions(mac_ctx);
Amar Singhalb6d0dc42016-10-19 09:45:05 -07005381
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305382 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005383}
5384
Jeff Johnsonc7309062018-11-09 20:59:42 -08005385QDF_STATUS sme_update_channel_list(mac_handle_t mac_handle)
Mukul Sharmaecf8e092017-12-19 22:36:31 +05305386{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08005387 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Jeff Johnson330c0bf2018-06-01 15:13:12 -07005388 QDF_STATUS status;
Mukul Sharmaecf8e092017-12-19 22:36:31 +05305389
5390 status = sme_acquire_global_lock(&mac_ctx->sme);
5391 if (QDF_IS_STATUS_SUCCESS(status)) {
5392 /* Update umac channel (enable/disable) from cds channels */
5393 status = csr_get_channel_and_power_list(mac_ctx);
5394 if (status != QDF_STATUS_SUCCESS) {
5395 sme_err("fail to get Channels");
5396 sme_release_global_lock(&mac_ctx->sme);
5397 return status;
5398 }
5399
5400 csr_apply_channel_power_info_wrapper(mac_ctx);
5401 csr_scan_filter_results(mac_ctx);
5402 sme_disconnect_connected_sessions(mac_ctx);
5403 sme_release_global_lock(&mac_ctx->sme);
5404 }
5405
5406 return status;
5407}
5408
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005409static bool
Jeff Johnson0a8786a2018-12-02 10:49:01 -08005410sme_search_in_base_ch_lst(struct mac_context *mac_ctx, uint8_t curr_ch)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005411{
5412 uint8_t i;
gaurank kathpalia14e2f912017-08-31 14:51:45 +05305413 struct csr_channel *ch_lst_info;
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05305414
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005415 ch_lst_info = &mac_ctx->scan.base_channels;
5416 for (i = 0; i < ch_lst_info->numChannels; i++) {
5417 if (ch_lst_info->channelList[i] == curr_ch)
5418 return true;
5419 }
5420
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005421 return false;
5422}
5423/**
5424 * sme_disconnect_connected_sessions() - Disconnect STA and P2P client session
5425 * if channel is not supported
5426 * @mac_ctx: mac global context
5427 *
5428 * If new country code does not support the channel on which STA/P2P client
5429 * is connetced, it sends the disconnect to the AP/P2P GO
5430 *
5431 * Return: void
5432 */
Jeff Johnson0a8786a2018-12-02 10:49:01 -08005433static void sme_disconnect_connected_sessions(struct mac_context *mac_ctx)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005434{
5435 uint8_t session_id, found = false;
5436 uint8_t curr_ch;
5437
Dustin Brownad06be62019-02-04 14:52:56 -08005438 for (session_id = 0; session_id < WLAN_MAX_VDEVS; session_id++) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005439 if (!csr_is_session_client_and_connected(mac_ctx, session_id))
5440 continue;
5441 found = false;
5442 /* Session is connected.Check the channel */
5443 curr_ch = csr_get_infra_operation_channel(mac_ctx,
5444 session_id);
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07005445 sme_debug("Current Operating channel : %d, session :%d",
5446 curr_ch, session_id);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005447 found = sme_search_in_base_ch_lst(mac_ctx, curr_ch);
5448 if (!found) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07005449 sme_debug("Disconnect Session: %d", session_id);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005450 csr_roam_disconnect(mac_ctx, session_id,
5451 eCSR_DISCONNECT_REASON_UNSPECIFIED);
5452 }
5453 }
5454}
5455
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005456#ifdef WLAN_FEATURE_PACKET_FILTERING
Jeff Johnsonb460dd72018-11-08 10:26:51 -08005457QDF_STATUS sme_8023_multicast_list(mac_handle_t mac_handle, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005458 tpSirRcvFltMcAddrList pMulticastAddrs)
5459{
5460 tpSirRcvFltMcAddrList request_buf;
Rajeev Kumar37d478b2017-04-17 16:59:28 -07005461 struct scheduler_msg msg = {0};
Jeff Johnson0a8786a2018-12-02 10:49:01 -08005462 struct mac_context *mac = MAC_CONTEXT(mac_handle);
gaurank kathpalia14e2f912017-08-31 14:51:45 +05305463 struct csr_roam_session *pSession = NULL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005464
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05305465 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
5466 "%s: ulMulticastAddrCnt: %d, multicastAddr[0]: %pK", __func__,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005467 pMulticastAddrs->ulMulticastAddrCnt,
Srinivas Girigowda98530492015-11-20 17:39:24 -08005468 pMulticastAddrs->multicastAddr[0].bytes);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005469
Ravi Joshi4f447cb2016-07-19 13:42:01 -07005470 /* Find the connected Infra / P2P_client connected session */
Jeff Johnson01f2c232018-11-21 19:17:44 -08005471 pSession = CSR_GET_SESSION(mac, sessionId);
5472 if (!CSR_IS_SESSION_VALID(mac, sessionId) ||
5473 (!csr_is_conn_state_infra(mac, sessionId) &&
5474 !csr_is_ndi_started(mac, sessionId))) {
Abhishek Singh5d8d7332017-08-10 15:15:24 +05305475 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Srinivas Girigowdaf2599dd2015-11-16 18:20:46 -08005476 "%s: Unable to find the session Id: %d", __func__,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005477 sessionId);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305478 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005479 }
5480
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305481 request_buf = qdf_mem_malloc(sizeof(tSirRcvFltMcAddrList));
Arif Hussain0ef77082018-10-10 16:42:53 -07005482 if (!request_buf)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305483 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005484
Jeff Johnson01f2c232018-11-21 19:17:44 -08005485 if (!csr_is_conn_state_connected_infra(mac, sessionId) &&
5486 !csr_is_ndi_started(mac, sessionId)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05305487 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Ravi Joshi4f447cb2016-07-19 13:42:01 -07005488 "%s: Request ignored, session %d is not connected or started",
5489 __func__, sessionId);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305490 qdf_mem_free(request_buf);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305491 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005492 }
5493
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305494 qdf_mem_copy(request_buf, pMulticastAddrs,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005495 sizeof(tSirRcvFltMcAddrList));
5496
Anurag Chouhanc5548422016-02-24 18:33:27 +05305497 qdf_copy_macaddr(&request_buf->self_macaddr, &pSession->selfMacAddr);
5498 qdf_copy_macaddr(&request_buf->bssid,
Srinivas Girigowda98530492015-11-20 17:39:24 -08005499 &pSession->connectedProfile.bssid);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005500
5501 msg.type = WMA_8023_MULTICAST_LIST_REQ;
5502 msg.reserved = 0;
5503 msg.bodyptr = request_buf;
Sreelakshmi Konamki6a065362016-05-31 16:05:01 +05305504 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
5505 sessionId, msg.type));
gaurank kathpalia36b0c582018-08-28 17:45:43 +05305506 if (QDF_STATUS_SUCCESS != scheduler_post_message(QDF_MODULE_ID_SME,
5507 QDF_MODULE_ID_WMA,
5508 QDF_MODULE_ID_WMA,
5509 &msg)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05305510 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05305511 "%s: Not able to post WMA_8023_MULTICAST_LIST message to WMA",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005512 __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305513 qdf_mem_free(request_buf);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305514 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005515 }
5516
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305517 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005518}
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005519#endif /* WLAN_FEATURE_PACKET_FILTERING */
5520
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05305521/*
5522 * sme_is_channel_valid() -
5523 * To check if the channel is valid for currently established domain
5524 * This is a synchronous API.
5525 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08005526 * mac_handle - The handle returned by mac_open.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05305527 * channel - channel to verify
5528 * Return true/false, true if channel is valid
5529 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08005530bool sme_is_channel_valid(mac_handle_t mac_handle, uint8_t channel)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005531{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305532 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005533 bool valid = false;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08005534 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005535
Jeff Johnson01f2c232018-11-21 19:17:44 -08005536 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305537 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005538
Jeff Johnson01f2c232018-11-21 19:17:44 -08005539 valid = csr_roam_is_channel_valid(mac, channel);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005540
Jeff Johnson01f2c232018-11-21 19:17:44 -08005541 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005542 }
5543
5544 return valid;
5545}
5546
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05305547/*
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05305548 * sme_set_max_tx_power_per_band() -
5549 * Set the Maximum Transmit Power specific to band dynamically.
5550 * Note: this setting will not persist over reboots.
5551 *
5552 * band
5553 * power to set in dB
5554 * Return QDF_STATUS
5555 */
Varun Reddy Yeturua48bc412017-11-17 15:33:35 -08005556QDF_STATUS sme_set_max_tx_power_per_band(enum band_info band, int8_t dB)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005557{
Rajeev Kumar37d478b2017-04-17 16:59:28 -07005558 struct scheduler_msg msg = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005559 tpMaxTxPowerPerBandParams pMaxTxPowerPerBandParams = NULL;
5560
5561 pMaxTxPowerPerBandParams =
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305562 qdf_mem_malloc(sizeof(tMaxTxPowerPerBandParams));
Arif Hussain0ef77082018-10-10 16:42:53 -07005563 if (!pMaxTxPowerPerBandParams)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305564 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005565
5566 pMaxTxPowerPerBandParams->power = dB;
5567 pMaxTxPowerPerBandParams->bandInfo = band;
5568
5569 msg.type = WMA_SET_MAX_TX_POWER_PER_BAND_REQ;
5570 msg.reserved = 0;
5571 msg.bodyptr = pMaxTxPowerPerBandParams;
Sreelakshmi Konamki6a065362016-05-31 16:05:01 +05305572 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
5573 NO_SESSION, msg.type));
gaurank kathpalia36b0c582018-08-28 17:45:43 +05305574 if (QDF_STATUS_SUCCESS != scheduler_post_message(QDF_MODULE_ID_SME,
5575 QDF_MODULE_ID_WMA,
5576 QDF_MODULE_ID_WMA,
5577 &msg)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05305578 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005579 "%s:Not able to post WMA_SET_MAX_TX_POWER_PER_BAND_REQ",
5580 __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305581 qdf_mem_free(pMaxTxPowerPerBandParams);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305582 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005583 }
5584
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305585 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005586}
5587
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05305588/*
5589 * sme_set_max_tx_power() -
5590 * Set the Maximum Transmit Power dynamically. Note: this setting will
5591 * not persist over reboots.
5592 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08005593 * mac_handle
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05305594 * pBssid BSSID to set the power cap for
5595 * pBssid pSelfMacAddress self MAC Address
5596 * pBssid power to set in dB
5597 * Return QDF_STATUS
5598 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08005599QDF_STATUS sme_set_max_tx_power(mac_handle_t mac_handle,
5600 struct qdf_mac_addr pBssid,
Anurag Chouhan6d760662016-02-20 16:05:43 +05305601 struct qdf_mac_addr pSelfMacAddress, int8_t dB)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005602{
Rajeev Kumar37d478b2017-04-17 16:59:28 -07005603 struct scheduler_msg msg = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005604 tpMaxTxPowerParams pMaxTxParams = NULL;
5605
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_SET_MAXTXPOW, NO_SESSION, 0));
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305608 pMaxTxParams = qdf_mem_malloc(sizeof(tMaxTxPowerParams));
Arif Hussain0ef77082018-10-10 16:42:53 -07005609 if (!pMaxTxParams)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305610 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005611
Anurag Chouhanc5548422016-02-24 18:33:27 +05305612 qdf_copy_macaddr(&pMaxTxParams->bssId, &pBssid);
5613 qdf_copy_macaddr(&pMaxTxParams->selfStaMacAddr, &pSelfMacAddress);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005614 pMaxTxParams->power = dB;
5615
5616 msg.type = WMA_SET_MAX_TX_POWER_REQ;
5617 msg.reserved = 0;
5618 msg.bodyptr = pMaxTxParams;
5619
gaurank kathpalia36b0c582018-08-28 17:45:43 +05305620 if (QDF_STATUS_SUCCESS != scheduler_post_message(QDF_MODULE_ID_SME,
5621 QDF_MODULE_ID_WMA,
5622 QDF_MODULE_ID_WMA,
5623 &msg)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05305624 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005625 "%s: Not able to post WMA_SET_MAX_TX_POWER_REQ message to WMA",
5626 __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305627 qdf_mem_free(pMaxTxParams);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305628 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005629 }
5630
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305631 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005632}
5633
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05305634/*
5635 * sme_set_custom_mac_addr() -
5636 * Set the customer Mac Address.
5637 *
5638 * customMacAddr customer MAC Address
5639 * Return QDF_STATUS
5640 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305641QDF_STATUS sme_set_custom_mac_addr(tSirMacAddr customMacAddr)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005642{
Rajeev Kumar37d478b2017-04-17 16:59:28 -07005643 struct scheduler_msg msg = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005644 tSirMacAddr *pBaseMacAddr;
5645
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305646 pBaseMacAddr = qdf_mem_malloc(sizeof(tSirMacAddr));
Arif Hussain0ef77082018-10-10 16:42:53 -07005647 if (!pBaseMacAddr)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305648 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005649
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305650 qdf_mem_copy(*pBaseMacAddr, customMacAddr, sizeof(tSirMacAddr));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005651
5652 msg.type = SIR_HAL_SET_BASE_MACADDR_IND;
5653 msg.reserved = 0;
5654 msg.bodyptr = pBaseMacAddr;
5655
gaurank kathpalia36b0c582018-08-28 17:45:43 +05305656 if (QDF_STATUS_SUCCESS != scheduler_post_message(QDF_MODULE_ID_SME,
5657 QDF_MODULE_ID_WMA,
5658 QDF_MODULE_ID_WMA,
5659 &msg)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05305660 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05305661 "Not able to post SIR_HAL_SET_BASE_MACADDR_IND message to WMA");
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305662 qdf_mem_free(pBaseMacAddr);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305663 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005664 }
5665
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305666 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005667}
5668
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05305669/*
5670 * sme_set_tx_power() -
5671 * Set Transmit Power dynamically.
5672 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08005673 * mac_handle
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05305674 * sessionId Target Session ID
5675 * BSSID
5676 * dev_mode dev_mode such as station, P2PGO, SAP
5677 * dBm power to set
5678 * Return QDF_STATUS
5679 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08005680QDF_STATUS sme_set_tx_power(mac_handle_t mac_handle, uint8_t sessionId,
Anurag Chouhan6d760662016-02-20 16:05:43 +05305681 struct qdf_mac_addr pBSSId,
Jeff Johnsonc1e62782017-11-09 09:50:17 -08005682 enum QDF_OPMODE dev_mode, int dBm)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005683{
Rajeev Kumar37d478b2017-04-17 16:59:28 -07005684 struct scheduler_msg msg = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005685 tpMaxTxPowerParams pTxParams = NULL;
5686 int8_t power = (int8_t) dBm;
5687
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05305688 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005689 TRACE_CODE_SME_RX_HDD_SET_TXPOW, sessionId, 0));
5690
5691 /* make sure there is no overflow */
5692 if ((int)power != dBm) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05305693 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005694 "%s: error, invalid power = %d", __func__, dBm);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305695 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005696 }
5697
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305698 pTxParams = qdf_mem_malloc(sizeof(tMaxTxPowerParams));
Arif Hussain0ef77082018-10-10 16:42:53 -07005699 if (!pTxParams)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305700 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005701
Anurag Chouhanc5548422016-02-24 18:33:27 +05305702 qdf_copy_macaddr(&pTxParams->bssId, &pBSSId);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005703 pTxParams->power = power; /* unit is dBm */
5704 pTxParams->dev_mode = dev_mode;
5705 msg.type = WMA_SET_TX_POWER_REQ;
5706 msg.reserved = 0;
5707 msg.bodyptr = pTxParams;
5708
gaurank kathpalia36b0c582018-08-28 17:45:43 +05305709 if (QDF_STATUS_SUCCESS != scheduler_post_message(QDF_MODULE_ID_SME,
5710 QDF_MODULE_ID_WMA,
5711 QDF_MODULE_ID_WMA,
5712 &msg)) {
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305713 qdf_mem_free(pTxParams);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305714 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005715 }
5716
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305717 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005718}
5719
Jeff Johnsonc7309062018-11-09 20:59:42 -08005720QDF_STATUS sme_update_session_param(mac_handle_t mac_handle, uint8_t session_id,
5721 uint32_t param_type, uint32_t param_val)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005722{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305723 QDF_STATUS status = QDF_STATUS_SUCCESS;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08005724 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005725 uint16_t len;
5726
Selvaraj, Sridhar7231c5f2016-09-28 12:42:33 +05305727 status = sme_acquire_global_lock(&mac_ctx->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305728 if (QDF_IS_STATUS_SUCCESS(status)) {
Selvaraj, Sridhar7231c5f2016-09-28 12:42:33 +05305729 struct sir_update_session_param *msg;
gaurank kathpalia14e2f912017-08-31 14:51:45 +05305730 struct csr_roam_session *session = CSR_GET_SESSION(mac_ctx,
5731 session_id);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005732
Selvaraj, Sridhar7231c5f2016-09-28 12:42:33 +05305733 if (!session) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07005734 sme_err("Session: %d not found", session_id);
Selvaraj, Sridhar7231c5f2016-09-28 12:42:33 +05305735 sme_release_global_lock(&mac_ctx->sme);
5736 return status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005737 }
5738
Selvaraj, Sridhar5b5a0652017-05-04 11:23:07 +05305739 if (param_type == SIR_PARAM_IGNORE_ASSOC_DISALLOWED)
5740 mac_ctx->ignore_assoc_disallowed = param_val;
5741
Selvaraj, Sridhar7231c5f2016-09-28 12:42:33 +05305742 if (!session->sessionActive)
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05305743 QDF_ASSERT(0);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005744
Selvaraj, Sridhar7231c5f2016-09-28 12:42:33 +05305745 len = sizeof(*msg);
5746 msg = qdf_mem_malloc(len);
5747 if (!msg)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305748 status = QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005749 else {
Selvaraj, Sridhar7231c5f2016-09-28 12:42:33 +05305750 msg->message_type = eWNI_SME_SESSION_UPDATE_PARAM;
5751 msg->length = len;
5752 msg->session_id = session_id;
5753 msg->param_type = param_type;
5754 msg->param_val = param_val;
Rajeev Kumard138ac52017-01-30 18:38:37 -08005755 status = umac_send_mb_message_to_mac(msg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005756 }
Selvaraj, Sridhar7231c5f2016-09-28 12:42:33 +05305757 sme_release_global_lock(&mac_ctx->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005758 }
5759 return status;
5760}
5761
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05305762/*
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05305763 * sme_update_roam_scan_n_probes() -
5764 * Function to update roam scan N probes
5765 * This function is called through dynamic setConfig callback function
5766 * to update roam scan N probes
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -08005767 * mac_handle: Opaque handle to the global MAC context
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05305768 * sessionId - Session Identifier
5769 * nProbes number of probe requests to be sent out
5770 * Return Success or failure
5771 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08005772QDF_STATUS sme_update_roam_scan_n_probes(mac_handle_t mac_handle,
5773 uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005774 const uint8_t nProbes)
5775{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08005776 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305777 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005778
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05305779 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005780 TRACE_CODE_SME_RX_HDD_UPDATE_ROAM_SCAN_N_PROBES,
5781 NO_SESSION, 0));
Jeff Johnson01f2c232018-11-21 19:17:44 -08005782 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305783 if (QDF_IS_STATUS_SUCCESS(status)) {
Abhishek Singhe4a1f882017-08-10 17:59:44 +05305784 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005785 "%s: gRoamScanNProbes is changed from %d to %d",
Wu Gao51a63562018-11-08 16:29:10 +08005786 __func__, mac->mlme_cfg->lfr.roam_scan_n_probes,
5787 nProbes);
5788 mac->mlme_cfg->lfr.roam_scan_n_probes = nProbes;
Vignesh Viswanathan4e65e8e2018-05-01 12:04:16 +05305789
Wu Gao51a63562018-11-08 16:29:10 +08005790 if (mac->mlme_cfg->lfr.roam_scan_offload_enabled) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08005791 csr_roam_offload_scan(mac, sessionId,
Vignesh Viswanathan4e65e8e2018-05-01 12:04:16 +05305792 ROAM_SCAN_OFFLOAD_UPDATE_CFG,
5793 REASON_NPROBES_CHANGED);
5794 }
Jeff Johnson01f2c232018-11-21 19:17:44 -08005795 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005796 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005797 return status;
5798}
5799
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05305800/*
5801 * sme_update_roam_scan_home_away_time() -
5802 * Function to update roam scan Home away time
5803 * This function is called through dynamic setConfig callback function
5804 * to update roam scan home away time
5805 *
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -08005806 * mac_handle: Opaque handle to the global MAC context
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05305807 * sessionId - Session Identifier
5808 * nRoamScanAwayTime Scan home away time
5809 * bSendOffloadCmd If true then send offload command to firmware
5810 * If false then command is not sent to firmware
5811 * Return Success or failure
5812 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08005813QDF_STATUS sme_update_roam_scan_home_away_time(
5814 mac_handle_t mac_handle,
5815 uint8_t sessionId,
5816 const uint16_t nRoamScanHomeAwayTime,
5817 const bool bSendOffloadCmd)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005818{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08005819 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305820 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005821
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05305822 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005823 TRACE_CODE_SME_RX_HDD_UPDATE_ROAM_SCAN_HOME_AWAY_TIME,
5824 NO_SESSION, 0));
Jeff Johnson01f2c232018-11-21 19:17:44 -08005825 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305826 if (QDF_IS_STATUS_SUCCESS(status)) {
Abhishek Singhe4a1f882017-08-10 17:59:44 +05305827 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005828 "%s: gRoamScanHomeAwayTime is changed from %d to %d",
5829 __func__,
Wu Gao51a63562018-11-08 16:29:10 +08005830 mac->mlme_cfg->lfr.roam_scan_home_away_time,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005831 nRoamScanHomeAwayTime);
Wu Gao51a63562018-11-08 16:29:10 +08005832 mac->mlme_cfg->lfr.roam_scan_home_away_time =
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005833 nRoamScanHomeAwayTime;
Vignesh Viswanathan4e65e8e2018-05-01 12:04:16 +05305834
Wu Gao51a63562018-11-08 16:29:10 +08005835 if (mac->mlme_cfg->lfr.roam_scan_offload_enabled &&
5836 bSendOffloadCmd) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08005837 csr_roam_offload_scan(mac, sessionId,
Vignesh Viswanathan4e65e8e2018-05-01 12:04:16 +05305838 ROAM_SCAN_OFFLOAD_UPDATE_CFG,
5839 REASON_HOME_AWAY_TIME_CHANGED);
5840 }
Jeff Johnson01f2c232018-11-21 19:17:44 -08005841 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005842 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005843 return status;
5844}
5845
Abhishek Singh518323d2015-10-19 17:42:01 +05305846/**
5847 * sme_ext_change_channel()- function to post send ECSA
5848 * action frame to csr.
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -08005849 * @mac_handle: Opaque handle to the global MAC context
Abhishek Singh518323d2015-10-19 17:42:01 +05305850 * @channel: new channel to switch
5851 * @session_id: senssion it should be sent on.
5852 *
5853 * This function is called to post ECSA frame to csr.
5854 *
5855 * Return: success if msg is sent else return failure
5856 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08005857QDF_STATUS sme_ext_change_channel(mac_handle_t mac_handle, uint32_t channel,
Abhishek Singh518323d2015-10-19 17:42:01 +05305858 uint8_t session_id)
5859{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305860 QDF_STATUS status = QDF_STATUS_SUCCESS;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08005861 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Abhishek Singh518323d2015-10-19 17:42:01 +05305862 uint8_t channel_state;
5863
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07005864 sme_err("Set Channel: %d", channel);
Abhishek Singh518323d2015-10-19 17:42:01 +05305865 channel_state =
Kiran Kumar Lokerea3de2262017-04-12 12:15:04 -07005866 wlan_reg_get_channel_state(mac_ctx->pdev, channel);
Abhishek Singh518323d2015-10-19 17:42:01 +05305867
5868 if (CHANNEL_STATE_DISABLE == channel_state) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07005869 sme_err("Invalid channel: %d", channel);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305870 return QDF_STATUS_E_INVAL;
Abhishek Singh518323d2015-10-19 17:42:01 +05305871 }
5872
5873 status = sme_acquire_global_lock(&mac_ctx->sme);
5874
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305875 if (QDF_STATUS_SUCCESS == status) {
Abhishek Singh518323d2015-10-19 17:42:01 +05305876 /* update the channel list to the firmware */
5877 status = csr_send_ext_change_channel(mac_ctx,
5878 channel, session_id);
5879 sme_release_global_lock(&mac_ctx->sme);
5880 }
5881
5882 return status;
5883}
5884
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05305885/*
5886 * sme_get_roam_intra_band() -
5887 * get Intra band roaming
5888 *
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -08005889 * mac_handle: Opaque handle to the global MAC context
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05305890 * Return Success or failure
5891 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08005892bool sme_get_roam_intra_band(mac_handle_t mac_handle)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005893{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08005894 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05305895
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05305896 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005897 TRACE_CODE_SME_RX_HDD_GET_ROAMIBAND, NO_SESSION, 0));
Wu Gao51a63562018-11-08 16:29:10 +08005898
5899 return mac->mlme_cfg->lfr.roam_intra_band;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005900}
5901
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05305902/*
5903 * sme_get_roam_scan_n_probes() -
5904 * get N Probes
5905 *
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -08005906 * mac_handle: Opaque handle to the global MAC context
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05305907 * Return Success or failure
5908 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08005909uint8_t sme_get_roam_scan_n_probes(mac_handle_t mac_handle)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005910{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08005911 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05305912
Wu Gao51a63562018-11-08 16:29:10 +08005913 return mac->mlme_cfg->lfr.roam_scan_n_probes;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005914}
5915
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05305916/*
5917 * sme_get_roam_scan_home_away_time() -
5918 * get Roam scan home away time
5919 *
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -08005920 * mac_handle: Opaque handle to the global MAC context
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05305921 * Return Success or failure
5922 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08005923uint16_t sme_get_roam_scan_home_away_time(mac_handle_t mac_handle)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005924{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08005925 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05305926
Wu Gao51a63562018-11-08 16:29:10 +08005927 return mac->mlme_cfg->lfr.roam_scan_home_away_time;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005928}
5929
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05305930/*
5931 * sme_update_roam_rssi_diff() -
5932 * Update RoamRssiDiff
5933 * This function is called through dynamic setConfig callback function
5934 * to configure RoamRssiDiff
5935 * Usage: adb shell iwpriv wlan0 setConfig RoamRssiDiff=[0 .. 125]
5936 *
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -08005937 * mac_handle: Opaque handle to the global MAC context
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05305938 * sessionId - Session Identifier
5939 * RoamRssiDiff - minimum rssi difference between potential
5940 * candidate and current AP.
5941 * Return Success or failure
5942 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005943
Jeff Johnsonb460dd72018-11-08 10:26:51 -08005944QDF_STATUS sme_update_roam_rssi_diff(mac_handle_t mac_handle, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005945 uint8_t RoamRssiDiff)
5946{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08005947 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305948 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005949
Dustin Brownad06be62019-02-04 14:52:56 -08005950 if (sessionId >= WLAN_MAX_VDEVS) {
Naveen Rawatc36f7eb2016-11-10 20:01:03 -08005951 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
5952 FL("Invalid sme session id: %d"), sessionId);
5953 return QDF_STATUS_E_INVAL;
5954 }
5955
Jeff Johnson01f2c232018-11-21 19:17:44 -08005956 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305957 if (QDF_IS_STATUS_SUCCESS(status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05305958 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005959 "LFR runtime successfully set roam rssi diff to %d - old value is %d - roam state is %s",
5960 RoamRssiDiff,
Wu Gao51a63562018-11-08 16:29:10 +08005961 mac->mlme_cfg->lfr.roam_rssi_diff,
Jeff Johnson01f2c232018-11-21 19:17:44 -08005962 mac_trace_get_neighbour_roam_state(mac->roam.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005963 neighborRoamInfo
5964 [sessionId].
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05305965 neighborRoamState));
Wu Gao51a63562018-11-08 16:29:10 +08005966 mac->mlme_cfg->lfr.roam_rssi_diff = RoamRssiDiff;
Vignesh Viswanathan4e65e8e2018-05-01 12:04:16 +05305967
Wu Gao51a63562018-11-08 16:29:10 +08005968 if (mac->mlme_cfg->lfr.roam_scan_offload_enabled)
Jeff Johnson01f2c232018-11-21 19:17:44 -08005969 csr_roam_offload_scan(mac, sessionId,
Vignesh Viswanathan4e65e8e2018-05-01 12:04:16 +05305970 ROAM_SCAN_OFFLOAD_UPDATE_CFG,
5971 REASON_RSSI_DIFF_CHANGED);
5972
Jeff Johnson01f2c232018-11-21 19:17:44 -08005973 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005974 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005975 return status;
5976}
5977
Pragaspathi Thilagaraj6695ba92019-04-04 17:59:47 +05305978void sme_update_session_assoc_ie(mac_handle_t mac_handle,
5979 uint8_t vdev_id,
5980 struct csr_roam_profile *src_profile)
5981{
5982 struct mac_context *mac = MAC_CONTEXT(mac_handle);
5983 struct csr_roam_session *session = CSR_GET_SESSION(mac, vdev_id);
5984
5985 if (!session) {
5986 sme_err("Session: %d not found", vdev_id);
5987 return;
5988 }
5989
5990 qdf_mem_free(session->pAddIEAssoc);
5991 session->pAddIEAssoc = NULL;
5992 session->nAddIEAssocLength = 0;
5993
5994 if (!src_profile->nAddIEAssocLength) {
5995 sme_debug("Assoc IE len 0");
5996 return;
5997 }
5998
5999 session->pAddIEAssoc = qdf_mem_malloc(src_profile->nAddIEAssocLength);
6000 if (!session->pAddIEAssoc)
6001 return;
6002
6003 session->nAddIEAssocLength = src_profile->nAddIEAssocLength;
6004 qdf_mem_copy(session->pAddIEAssoc, src_profile->pAddIEAssoc,
6005 src_profile->nAddIEAssocLength);
6006}
6007
6008QDF_STATUS sme_send_rso_connect_params(mac_handle_t mac_handle,
6009 uint8_t vdev_id,
6010 struct csr_roam_profile *src_profile)
Vignesh Viswanathanc6d1e1c2017-09-18 12:32:49 +05306011{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08006012 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Vignesh Viswanathanc6d1e1c2017-09-18 12:32:49 +05306013 QDF_STATUS status = QDF_STATUS_SUCCESS;
6014 tpCsrNeighborRoamControlInfo neighbor_roam_info =
Pragaspathi Thilagaraj6695ba92019-04-04 17:59:47 +05306015 &mac->roam.neighborRoamInfo[vdev_id];
Vignesh Viswanathanc6d1e1c2017-09-18 12:32:49 +05306016
Pragaspathi Thilagaraj6695ba92019-04-04 17:59:47 +05306017 if (vdev_id >= WLAN_MAX_VDEVS) {
6018 sme_err("Invalid sme vdev id: %d", vdev_id);
Vignesh Viswanathanc6d1e1c2017-09-18 12:32:49 +05306019 return QDF_STATUS_E_INVAL;
6020 }
6021
6022 if (!src_profile) {
6023 sme_err("src roam profile NULL");
6024 return QDF_STATUS_E_INVAL;
6025 }
6026
Wu Gao51a63562018-11-08 16:29:10 +08006027 if (!mac->mlme_cfg->lfr.lfr_enabled ||
Vignesh Viswanathanc6d1e1c2017-09-18 12:32:49 +05306028 (neighbor_roam_info->neighborRoamState !=
6029 eCSR_NEIGHBOR_ROAM_STATE_CONNECTED)) {
6030 sme_info("Fast roam is disabled or not connected(%d)",
Pragaspathi Thilagaraj6695ba92019-04-04 17:59:47 +05306031 neighbor_roam_info->neighborRoamState);
Vignesh Viswanathanc6d1e1c2017-09-18 12:32:49 +05306032 return QDF_STATUS_E_PERM;
6033 }
6034
Jianmin Zhubf845932018-12-17 11:52:50 +08006035 if (csr_is_roam_offload_enabled(mac)) {
Vignesh Viswanathan4e65e8e2018-05-01 12:04:16 +05306036 status = sme_acquire_global_lock(&mac->sme);
6037 if (QDF_IS_STATUS_SUCCESS(status)) {
6038 sme_debug("Updating fils config to fw");
Pragaspathi Thilagaraj6695ba92019-04-04 17:59:47 +05306039 csr_roam_offload_scan(mac, vdev_id,
Vignesh Viswanathan4e65e8e2018-05-01 12:04:16 +05306040 ROAM_SCAN_OFFLOAD_UPDATE_CFG,
6041 REASON_FILS_PARAMS_CHANGED);
6042 sme_release_global_lock(&mac->sme);
6043 } else {
6044 sme_err("Failed to acquire SME lock");
6045 }
Vignesh Viswanathanc6d1e1c2017-09-18 12:32:49 +05306046 } else {
6047 sme_info("LFR3 not enabled");
6048 return QDF_STATUS_E_INVAL;
6049 }
6050
6051 return status;
6052}
6053
Pragaspathi Thilagaraj6695ba92019-04-04 17:59:47 +05306054#ifdef WLAN_FEATURE_FILS_SK
6055QDF_STATUS sme_update_fils_config(mac_handle_t mac_handle, uint8_t vdev_id,
6056 struct csr_roam_profile *src_profile)
6057{
6058 QDF_STATUS status = QDF_STATUS_SUCCESS;
6059 struct mac_context *mac = MAC_CONTEXT(mac_handle);
6060
6061 csr_update_fils_config(mac, vdev_id, src_profile);
6062
6063 return status;
6064}
6065
6066void sme_send_hlp_ie_info(mac_handle_t mac_handle, uint8_t vdev_id,
Jeff Johnson66ee8a92018-03-17 15:24:26 -07006067 struct csr_roam_profile *profile, uint32_t if_addr)
Vignesh Viswanathanc6d1e1c2017-09-18 12:32:49 +05306068{
6069 int i;
6070 struct scheduler_msg msg;
6071 QDF_STATUS status;
6072 struct hlp_params *params;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08006073 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Pragaspathi Thilagaraj6695ba92019-04-04 17:59:47 +05306074 struct csr_roam_session *session = CSR_GET_SESSION(mac, vdev_id);
Vignesh Viswanathanc6d1e1c2017-09-18 12:32:49 +05306075 tpCsrNeighborRoamControlInfo neighbor_roam_info =
Pragaspathi Thilagaraj6695ba92019-04-04 17:59:47 +05306076 &mac->roam.neighborRoamInfo[vdev_id];
Vignesh Viswanathanc6d1e1c2017-09-18 12:32:49 +05306077
6078 if (!session) {
6079 sme_err("session NULL");
6080 return;
6081 }
6082
Wu Gao51a63562018-11-08 16:29:10 +08006083 if (!mac->mlme_cfg->lfr.lfr_enabled ||
Vignesh Viswanathanc6d1e1c2017-09-18 12:32:49 +05306084 (neighbor_roam_info->neighborRoamState !=
6085 eCSR_NEIGHBOR_ROAM_STATE_CONNECTED)) {
6086 sme_debug("Fast roam is disabled or not connected(%d)",
6087 neighbor_roam_info->neighborRoamState);
6088 return;
6089 }
6090
6091 params = qdf_mem_malloc(sizeof(*params));
Arif Hussain0ef77082018-10-10 16:42:53 -07006092 if (!params)
Vignesh Viswanathanc6d1e1c2017-09-18 12:32:49 +05306093 return;
Arif Hussain0ef77082018-10-10 16:42:53 -07006094
Vignesh Viswanathanc6d1e1c2017-09-18 12:32:49 +05306095 if ((profile->hlp_ie_len +
Srinivas Girigowdad1e45b82019-04-15 15:08:28 -07006096 QDF_IPV4_ADDR_SIZE) > FILS_MAX_HLP_DATA_LEN) {
Vignesh Viswanathanc6d1e1c2017-09-18 12:32:49 +05306097 sme_err("HLP IE len exceeds %d",
6098 profile->hlp_ie_len);
6099 qdf_mem_free(params);
6100 return;
6101 }
6102
Pragaspathi Thilagaraj6695ba92019-04-04 17:59:47 +05306103 params->vdev_id = vdev_id;
Srinivas Girigowdad1e45b82019-04-15 15:08:28 -07006104 params->hlp_ie_len = profile->hlp_ie_len + QDF_IPV4_ADDR_SIZE;
Vignesh Viswanathanc6d1e1c2017-09-18 12:32:49 +05306105
Srinivas Girigowdad1e45b82019-04-15 15:08:28 -07006106 for (i = 0; i < QDF_IPV4_ADDR_SIZE; i++)
Vignesh Viswanathanc6d1e1c2017-09-18 12:32:49 +05306107 params->hlp_ie[i] = (if_addr >> (i * 8)) & 0xFF;
6108
Srinivas Girigowdad1e45b82019-04-15 15:08:28 -07006109 qdf_mem_copy(params->hlp_ie + QDF_IPV4_ADDR_SIZE,
Vignesh Viswanathanc6d1e1c2017-09-18 12:32:49 +05306110 profile->hlp_ie, profile->hlp_ie_len);
6111
6112 msg.type = SIR_HAL_HLP_IE_INFO;
6113 msg.reserved = 0;
6114 msg.bodyptr = params;
6115 status = sme_acquire_global_lock(&mac->sme);
6116 if (status != QDF_STATUS_SUCCESS) {
6117 sme_err("sme lock acquire fails");
6118 qdf_mem_free(params);
6119 return;
6120 }
6121
6122 if (!QDF_IS_STATUS_SUCCESS
gaurank kathpalia36b0c582018-08-28 17:45:43 +05306123 (scheduler_post_message(QDF_MODULE_ID_SME,
6124 QDF_MODULE_ID_WMA,
6125 QDF_MODULE_ID_WMA, &msg))) {
Vignesh Viswanathanc6d1e1c2017-09-18 12:32:49 +05306126 sme_err("Not able to post WMA_HLP_IE_INFO message to HAL");
6127 sme_release_global_lock(&mac->sme);
6128 qdf_mem_free(params);
6129 return;
6130 }
6131
6132 sme_release_global_lock(&mac->sme);
6133}
6134
Jeff Johnson172237b2017-11-07 15:32:59 -08006135void sme_free_join_rsp_fils_params(struct csr_roam_info *roam_info)
Vignesh Viswanathanc6d1e1c2017-09-18 12:32:49 +05306136{
6137 struct fils_join_rsp_params *roam_fils_params;
6138
6139 if (!roam_info) {
6140 sme_err("FILS Roam Info NULL");
6141 return;
6142 }
6143
6144 roam_fils_params = roam_info->fils_join_rsp;
6145 if (!roam_fils_params) {
6146 sme_err("FILS Roam Param NULL");
6147 return;
6148 }
6149
6150 if (roam_fils_params->fils_pmk)
6151 qdf_mem_free(roam_fils_params->fils_pmk);
6152
6153 qdf_mem_free(roam_fils_params);
6154
6155 roam_info->fils_join_rsp = NULL;
6156}
6157
6158#else
Pragaspathi Thilagaraj6695ba92019-04-04 17:59:47 +05306159inline void sme_send_hlp_ie_info(mac_handle_t mac_handle, uint8_t vdev_id,
Jeff Johnson66ee8a92018-03-17 15:24:26 -07006160 struct csr_roam_profile *profile, uint32_t if_addr)
Vignesh Viswanathanc6d1e1c2017-09-18 12:32:49 +05306161{}
6162#endif
6163
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306164/*
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306165 * sme_update_wes_mode() -
6166 * Update WES Mode
6167 * This function is called through dynamic setConfig callback function
6168 * to configure isWESModeEnabled
6169 *
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -08006170 * mac_handle: Opaque handle to the global MAC context
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306171 * isWESModeEnabled - WES mode
6172 * sessionId - Session Identifier
6173 * Return QDF_STATUS_SUCCESS - SME update isWESModeEnabled config successfully.
6174 * Other status means SME is failed to update isWESModeEnabled.
6175 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006176
Jeff Johnsonb460dd72018-11-08 10:26:51 -08006177QDF_STATUS sme_update_wes_mode(mac_handle_t mac_handle, bool isWESModeEnabled,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006178 uint8_t sessionId)
6179{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08006180 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306181 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006182
Dustin Brownad06be62019-02-04 14:52:56 -08006183 if (sessionId >= WLAN_MAX_VDEVS) {
Naveen Rawatc36f7eb2016-11-10 20:01:03 -08006184 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
6185 FL("Invalid sme session id: %d"), sessionId);
6186 return QDF_STATUS_E_INVAL;
6187 }
6188
Jeff Johnson01f2c232018-11-21 19:17:44 -08006189 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306190 if (QDF_IS_STATUS_SUCCESS(status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05306191 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006192 "LFR runtime successfully set WES Mode to %d - old value is %d - roam state is %s",
6193 isWESModeEnabled,
Wu Gao51a63562018-11-08 16:29:10 +08006194 mac->mlme_cfg->lfr.wes_mode_enabled,
Jeff Johnson01f2c232018-11-21 19:17:44 -08006195 mac_trace_get_neighbour_roam_state(mac->roam.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006196 neighborRoamInfo
6197 [sessionId].
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306198 neighborRoamState));
Wu Gao51a63562018-11-08 16:29:10 +08006199 mac->mlme_cfg->lfr.wes_mode_enabled = isWESModeEnabled;
Jeff Johnson01f2c232018-11-21 19:17:44 -08006200 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006201 }
6202
6203 return status;
6204}
6205
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306206/*
6207 * sme_set_roam_scan_control() -
6208 * Set roam scan control
6209 * This function is called to set roam scan control
6210 * if roam scan control is set to 0, roaming scan cache is cleared
6211 * any value other than 0 is treated as invalid value
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -08006212 * mac_handle: Opaque handle to the global MAC context
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306213 * sessionId - Session Identifier
6214 * Return QDF_STATUS_SUCCESS - SME update config successfully.
6215 * Other status means SME failure to update
6216 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08006217QDF_STATUS sme_set_roam_scan_control(mac_handle_t mac_handle, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006218 bool roamScanControl)
6219{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08006220 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306221 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006222
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05306223 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006224 TRACE_CODE_SME_RX_HDD_SET_SCANCTRL, NO_SESSION, 0));
Naveen Rawatc36f7eb2016-11-10 20:01:03 -08006225
Dustin Brownad06be62019-02-04 14:52:56 -08006226 if (sessionId >= WLAN_MAX_VDEVS) {
Naveen Rawatc36f7eb2016-11-10 20:01:03 -08006227 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
6228 FL("Invalid sme session id: %d"), sessionId);
6229 return QDF_STATUS_E_INVAL;
6230 }
6231
Jeff Johnson01f2c232018-11-21 19:17:44 -08006232 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306233 if (QDF_IS_STATUS_SUCCESS(status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05306234 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006235 "LFR runtime successfully set roam scan control to %d - old value is %d - roam state is %s",
6236 roamScanControl,
Jeff Johnson01f2c232018-11-21 19:17:44 -08006237 mac->roam.configParam.nRoamScanControl,
6238 mac_trace_get_neighbour_roam_state(mac->roam.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006239 neighborRoamInfo
6240 [sessionId].
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306241 neighborRoamState));
Jeff Johnson01f2c232018-11-21 19:17:44 -08006242 mac->roam.configParam.nRoamScanControl = roamScanControl;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006243 if (0 == roamScanControl) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05306244 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006245 "LFR runtime successfully cleared roam scan cache");
Jeff Johnson01f2c232018-11-21 19:17:44 -08006246 csr_flush_cfg_bg_scan_roam_channel_list(mac,
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306247 sessionId);
Wu Gao51a63562018-11-08 16:29:10 +08006248 if (mac->mlme_cfg->lfr.roam_scan_offload_enabled) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08006249 csr_roam_offload_scan(mac, sessionId,
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306250 ROAM_SCAN_OFFLOAD_UPDATE_CFG,
6251 REASON_FLUSH_CHANNEL_LIST);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006252 }
6253 }
Jeff Johnson01f2c232018-11-21 19:17:44 -08006254 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006255 }
6256 return status;
6257}
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006258
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306259/*
6260 * sme_update_is_fast_roam_ini_feature_enabled() - enable/disable LFR
6261 * support at runtime
6262 * It is used at in the REG_DYNAMIC_VARIABLE macro definition of
6263 * isFastRoamIniFeatureEnabled.
6264 * This is a synchronous call
6265 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08006266 * mac_handle - The handle returned by mac_open.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306267 * sessionId - Session Identifier
6268 * Return QDF_STATUS_SUCCESS - SME update isFastRoamIniFeatureEnabled config
6269 * successfully.
6270 * Other status means SME is failed to update isFastRoamIniFeatureEnabled.
6271 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08006272QDF_STATUS sme_update_is_fast_roam_ini_feature_enabled(mac_handle_t mac_handle,
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306273 uint8_t sessionId, const bool isFastRoamIniFeatureEnabled)
6274{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08006275 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006276
Wu Gao51a63562018-11-08 16:29:10 +08006277 if (mac->mlme_cfg->lfr.lfr_enabled ==
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006278 isFastRoamIniFeatureEnabled) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05306279 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006280 "%s: FastRoam is already enabled or disabled, nothing to do (returning) old(%d) new(%d)",
6281 __func__,
Wu Gao51a63562018-11-08 16:29:10 +08006282 mac->mlme_cfg->lfr.lfr_enabled,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006283 isFastRoamIniFeatureEnabled);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306284 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006285 }
6286
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05306287 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006288 "%s: FastRoamEnabled is changed from %d to %d", __func__,
Wu Gao51a63562018-11-08 16:29:10 +08006289 mac->mlme_cfg->lfr.lfr_enabled,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006290 isFastRoamIniFeatureEnabled);
Wu Gao51a63562018-11-08 16:29:10 +08006291 mac->mlme_cfg->lfr.lfr_enabled = isFastRoamIniFeatureEnabled;
Jeff Johnson01f2c232018-11-21 19:17:44 -08006292 csr_neighbor_roam_update_fast_roaming_enabled(mac, sessionId,
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306293 isFastRoamIniFeatureEnabled);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006294
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306295 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006296}
6297
Mukul Sharma69c44cd2016-09-12 18:33:57 +05306298/**
6299 * sme_config_fast_roaming() - enable/disable LFR support at runtime
Jeff Johnsonc7309062018-11-09 20:59:42 -08006300 * @mac_handle - The handle returned by macOpen.
Mukul Sharma69c44cd2016-09-12 18:33:57 +05306301 * @session_id - Session Identifier
6302 * @is_fast_roam_enabled - flag to enable/disable roaming
6303 *
6304 * When Supplicant issues enabled/disable fast roaming on the basis
6305 * of the Bssid modification in network block (e.g. AutoJoin mode N/W block)
6306 *
6307 * Return: QDF_STATUS
6308 */
6309
Jeff Johnsonc7309062018-11-09 20:59:42 -08006310QDF_STATUS sme_config_fast_roaming(mac_handle_t mac_handle, uint8_t session_id,
Mukul Sharma69c44cd2016-09-12 18:33:57 +05306311 const bool is_fast_roam_enabled)
6312{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08006313 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
gaurank kathpalia14e2f912017-08-31 14:51:45 +05306314 struct csr_roam_session *session = CSR_GET_SESSION(mac_ctx, session_id);
Mukul Sharma69c44cd2016-09-12 18:33:57 +05306315 QDF_STATUS status;
6316
Varun Reddy Yeturue5a35d12017-10-20 11:26:57 -07006317 /*
6318 * supplicant_disabled_roaming flag is set to true in
6319 * wlan_hdd_cfg80211_connect_start when supplicant initiate connect
6320 * request with BSSID. This flag is reset when supplicant sends
6321 * vendor command to enable roaming after association.
Arif Hussaina48a9c02017-01-31 14:37:45 -08006322 *
6323 * This request from wpa_supplicant will be skipped in this function
Varun Reddy Yeturue5a35d12017-10-20 11:26:57 -07006324 * if roaming is disabled using driver command or INI and
6325 * supplicant_disabled_roaming flag remains set. So make sure to set
6326 * supplicant_disabled_roaming flag as per wpa_supplicant even if roam
6327 * request from wpa_supplicant ignored.
Arif Hussaina48a9c02017-01-31 14:37:45 -08006328 */
6329 if (session && session->pCurRoamProfile)
Varun Reddy Yeturue5a35d12017-10-20 11:26:57 -07006330 session->pCurRoamProfile->supplicant_disabled_roaming =
6331 !is_fast_roam_enabled;
Arif Hussaina48a9c02017-01-31 14:37:45 -08006332
Wu Gao51a63562018-11-08 16:29:10 +08006333 if (!mac_ctx->mlme_cfg->lfr.lfr_enabled) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07006334 sme_debug("Fast roam is disabled through ini");
Mukul Sharma69c44cd2016-09-12 18:33:57 +05306335 if (!is_fast_roam_enabled)
6336 return QDF_STATUS_SUCCESS;
6337 return QDF_STATUS_E_FAILURE;
6338 }
Sreelakshmi Konamkibda5bbf2016-09-12 18:38:10 +05306339
Mukul Sharma69c44cd2016-09-12 18:33:57 +05306340 status = csr_neighbor_roam_update_fast_roaming_enabled(mac_ctx,
6341 session_id, is_fast_roam_enabled);
6342 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07006343 sme_err("update fast roaming failed. status: %d", status);
Mukul Sharma69c44cd2016-09-12 18:33:57 +05306344 return QDF_STATUS_E_FAILURE;
6345 }
6346
6347 return QDF_STATUS_SUCCESS;
6348}
6349
Kiran Kumar Lokere7d6e4c92018-09-19 13:45:47 -07006350#ifdef FEATURE_WLAN_ESE
6351int sme_add_key_krk(mac_handle_t mac_handle, uint8_t session_id,
6352 const uint8_t *key, const int key_len)
6353{
6354 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
6355 struct csr_roam_session *session;
6356
6357 if (key_len < SIR_KRK_KEY_LEN) {
6358 sme_warn("Invalid KRK keylength [= %d]", key_len);
6359 return -EINVAL;
6360 }
6361
6362 if (!CSR_IS_SESSION_VALID(mac_ctx, session_id)) {
6363 sme_err("incorrect session/vdev ID");
6364 return -EINVAL;
6365 }
6366
6367 session = CSR_GET_SESSION(mac_ctx, session_id);
6368
6369 qdf_mem_copy(session->eseCckmInfo.krk, key, SIR_KRK_KEY_LEN);
6370 session->eseCckmInfo.reassoc_req_num = 1;
6371 session->eseCckmInfo.krk_plumbed = true;
6372
6373 return 0;
6374}
Pragaspathi Thilagaraj974c27e2019-03-02 22:26:05 +05306375#endif
Kiran Kumar Lokere7d6e4c92018-09-19 13:45:47 -07006376
Pragaspathi Thilagaraj974c27e2019-03-02 22:26:05 +05306377#if defined(FEATURE_WLAN_ESE) && defined(WLAN_FEATURE_ROAM_OFFLOAD)
Kiran Kumar Lokere7d6e4c92018-09-19 13:45:47 -07006378int sme_add_key_btk(mac_handle_t mac_handle, uint8_t session_id,
6379 const uint8_t *key, const int key_len)
6380{
6381 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
6382 struct csr_roam_session *session;
6383
6384 if (key_len < SIR_BTK_KEY_LEN) {
6385 sme_warn("Invalid BTK keylength [= %d]", key_len);
6386 return -EINVAL;
6387 }
6388
6389 if (!CSR_IS_SESSION_VALID(mac_ctx, session_id)) {
6390 sme_err("incorrect session/vdev ID");
6391 return -EINVAL;
6392 }
6393
6394 session = CSR_GET_SESSION(mac_ctx, session_id);
6395
6396 qdf_mem_copy(session->eseCckmInfo.btk, key, SIR_BTK_KEY_LEN);
6397 /*
6398 * KRK and BTK are updated by upper layer back to back. Send
6399 * updated KRK and BTK together to FW here.
6400 */
6401 csr_roam_offload_scan(mac_ctx, session_id,
6402 ROAM_SCAN_OFFLOAD_UPDATE_CFG,
6403 REASON_ROAM_PSK_PMK_CHANGED);
6404
6405 return 0;
6406}
6407#endif
6408
Varun Reddy Yeturu66899fe2017-07-11 14:00:12 -07006409/**
6410 * sme_stop_roaming() - Stop roaming for a given sessionId
6411 * This is a synchronous call
6412 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08006413 * @mac_handle - The handle returned by mac_open
Varun Reddy Yeturu66899fe2017-07-11 14:00:12 -07006414 * @sessionId - Session Identifier
6415 *
6416 * Return QDF_STATUS_SUCCESS on success
6417 * Other status on failure
6418 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08006419QDF_STATUS sme_stop_roaming(mac_handle_t mac_handle, uint8_t session_id,
Jeff Johnson1f2dabc2018-11-07 15:33:01 -08006420 uint8_t reason)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006421{
Naveen Rawat5c35ae42017-04-18 15:35:07 -07006422 struct scheduler_msg wma_msg = {0};
Jeff Johnsonc09caa42018-06-07 22:58:55 -07006423 QDF_STATUS status;
Jeff Johnsone6da4b02019-02-06 22:22:04 -08006424 struct roam_offload_scan_req *req;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08006425 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Varun Reddy Yeturu66899fe2017-07-11 14:00:12 -07006426 tpCsrNeighborRoamControlInfo roam_info;
Varun Reddy Yeturue5a35d12017-10-20 11:26:57 -07006427 struct csr_roam_session *session;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006428
Varun Reddy Yeturu66899fe2017-07-11 14:00:12 -07006429 if (!CSR_IS_SESSION_VALID(mac_ctx, session_id)) {
Naveen Rawat5c35ae42017-04-18 15:35:07 -07006430 sme_err("incorrect session/vdev ID");
6431 return QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006432 }
Varun Reddy Yeturue5a35d12017-10-20 11:26:57 -07006433
6434 session = CSR_GET_SESSION(mac_ctx, session_id);
Abhishek Singh1f217ec2017-12-22 11:48:27 +05306435
Padma, Santhosh Kumar86747ec2018-05-29 18:28:29 +05306436 /*
6437 * set the driver_disabled_roaming flag to true even if roaming
6438 * is not enabled on this session so that roam start requests for
6439 * this session can be blocked until driver enables roaming
6440 */
Vignesh Viswanathan3d478032018-08-02 20:18:53 +05306441 if (reason == ecsr_driver_disabled && session->pCurRoamProfile &&
6442 session->pCurRoamProfile->csrPersona == QDF_STA_MODE) {
Padma, Santhosh Kumar86747ec2018-05-29 18:28:29 +05306443 session->pCurRoamProfile->driver_disabled_roaming = true;
6444 sme_debug("driver_disabled_roaming set for session %d",
6445 session_id);
6446 }
6447
Abhishek Singh1f217ec2017-12-22 11:48:27 +05306448 roam_info = &mac_ctx->roam.neighborRoamInfo[session_id];
6449 if (!roam_info->b_roam_scan_offload_started) {
6450 sme_debug("Roaming already disabled for session %d", session_id);
Varun Reddy Yeturue5a35d12017-10-20 11:26:57 -07006451 return QDF_STATUS_SUCCESS;
6452 }
Naveen Rawat5c35ae42017-04-18 15:35:07 -07006453 req = qdf_mem_malloc(sizeof(*req));
Arif Hussain0ef77082018-10-10 16:42:53 -07006454 if (!req)
Naveen Rawat5c35ae42017-04-18 15:35:07 -07006455 return QDF_STATUS_E_NOMEM;
Naveen Rawat5c35ae42017-04-18 15:35:07 -07006456
6457 req->Command = ROAM_SCAN_OFFLOAD_STOP;
Padma, Santhosh Kumar86747ec2018-05-29 18:28:29 +05306458 if ((reason == eCsrForcedDisassoc) || reason == ecsr_driver_disabled)
Abhishek Singh533c9da2017-05-04 10:23:34 +05306459 req->reason = REASON_ROAM_STOP_ALL;
6460 else
Varun Reddy Yeturubc1bea02018-02-01 18:12:34 -08006461 req->reason = REASON_SME_ISSUED;
Varun Reddy Yeturu66899fe2017-07-11 14:00:12 -07006462 req->sessionId = session_id;
6463 if (csr_neighbor_middle_of_roaming(mac_ctx, session_id))
Naveen Rawat5c35ae42017-04-18 15:35:07 -07006464 req->middle_of_roaming = 1;
6465 else
6466 csr_roam_reset_roam_params(mac_ctx);
6467
Abhinav Kumar925a3332019-05-27 15:34:22 +05306468 /* Disable offload_11k_params for current vdev */
Abhinav Kumarc4a6c302019-05-13 20:26:44 +05306469 req->offload_11k_params.offload_11k_bitmask = 0;
Abhinav Kumar925a3332019-05-27 15:34:22 +05306470 req->offload_11k_params.vdev_id = session_id;
Abhinav Kumarc4a6c302019-05-13 20:26:44 +05306471
Naveen Rawat5c35ae42017-04-18 15:35:07 -07006472 wma_msg.type = WMA_ROAM_SCAN_OFFLOAD_REQ;
6473 wma_msg.bodyptr = req;
6474
6475 status = wma_post_ctrl_msg(mac_ctx, &wma_msg);
Jeff Johnsonc09caa42018-06-07 22:58:55 -07006476 if (QDF_STATUS_SUCCESS != status) {
Naveen Rawat5c35ae42017-04-18 15:35:07 -07006477 sme_err("WMA_ROAM_SCAN_OFFLOAD_REQ failed, session_id: %d",
Varun Reddy Yeturu66899fe2017-07-11 14:00:12 -07006478 session_id);
gaurank kathpalia6d25c972019-03-07 20:25:28 +05306479 qdf_mem_zero(req, sizeof(*req));
Naveen Rawat5c35ae42017-04-18 15:35:07 -07006480 qdf_mem_free(req);
6481 return QDF_STATUS_E_FAULT;
6482 }
Varun Reddy Yeturu66899fe2017-07-11 14:00:12 -07006483 roam_info->b_roam_scan_offload_started = false;
6484 roam_info->last_sent_cmd = ROAM_SCAN_OFFLOAD_STOP;
Naveen Rawat5c35ae42017-04-18 15:35:07 -07006485
6486 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006487}
6488
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306489/*
6490 * sme_start_roaming() - Start roaming for a given sessionId
6491 * This is a synchronous call
6492 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08006493 * mac_handle - The handle returned by mac_open
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306494 * sessionId - Session Identifier
6495 * Return QDF_STATUS_SUCCESS on success
6496 * Other status on failure
6497 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08006498QDF_STATUS sme_start_roaming(mac_handle_t mac_handle, uint8_t sessionId,
Jeff Johnson1f2dabc2018-11-07 15:33:01 -08006499 uint8_t reason)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006500{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08006501 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306502 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006503
Jeff Johnson01f2c232018-11-21 19:17:44 -08006504 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306505 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08006506 csr_roam_offload_scan(mac, sessionId, ROAM_SCAN_OFFLOAD_START,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006507 reason);
Jeff Johnson01f2c232018-11-21 19:17:44 -08006508 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006509 }
6510
6511 return status;
6512}
6513
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306514/*
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306515 * sme_set_roam_opportunistic_scan_threshold_diff() -
6516 * Update Opportunistic Scan threshold diff
6517 * This function is called through dynamic setConfig callback function
6518 * to configure nOpportunisticThresholdDiff
6519 *
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -08006520 * mac_handle: Opaque handle to the global MAC context
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306521 * sessionId - Session Identifier
6522 * nOpportunisticThresholdDiff - Opportunistic Scan threshold diff
6523 * Return QDF_STATUS_SUCCESS - SME update nOpportunisticThresholdDiff config
6524 * successfully.
6525 * else SME is failed to update nOpportunisticThresholdDiff.
6526 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08006527QDF_STATUS sme_set_roam_opportunistic_scan_threshold_diff(
6528 mac_handle_t mac_handle,
6529 uint8_t sessionId,
6530 const uint8_t nOpportunisticThresholdDiff)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006531{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08006532 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306533 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006534
Jeff Johnson01f2c232018-11-21 19:17:44 -08006535 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306536 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08006537 status = csr_neighbor_roam_update_config(mac, sessionId,
Varun Reddy Yeturuff4feb02016-04-20 12:26:11 -07006538 nOpportunisticThresholdDiff,
6539 REASON_OPPORTUNISTIC_THRESH_DIFF_CHANGED);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306540 if (QDF_IS_STATUS_SUCCESS(status)) {
Wu Gao51a63562018-11-08 16:29:10 +08006541 mac->mlme_cfg->lfr.opportunistic_scan_threshold_diff =
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006542 nOpportunisticThresholdDiff;
6543 }
Jeff Johnson01f2c232018-11-21 19:17:44 -08006544 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006545 }
6546 return status;
6547}
6548
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306549/*
6550 * sme_get_roam_opportunistic_scan_threshold_diff()
6551 * gets Opportunistic Scan threshold diff
6552 * This is a synchronous call
6553 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08006554 * mac_handle - The handle returned by mac_open
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306555 * Return uint8_t - nOpportunisticThresholdDiff
6556 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08006557uint8_t sme_get_roam_opportunistic_scan_threshold_diff(mac_handle_t mac_handle)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006558{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08006559 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306560
Wu Gao51a63562018-11-08 16:29:10 +08006561 return mac->mlme_cfg->lfr.opportunistic_scan_threshold_diff;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006562}
6563
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306564/*
6565 * sme_set_roam_rescan_rssi_diff() - Update roam rescan rssi diff
6566 * This function is called through dynamic setConfig callback function
6567 * to configure nRoamRescanRssiDiff
6568 *
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -08006569 * mac_handle: Opaque handle to the global MAC context
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306570 * sessionId - Session Identifier
6571 * nRoamRescanRssiDiff - roam rescan rssi diff
6572 * Return QDF_STATUS_SUCCESS - SME update nRoamRescanRssiDiff config
6573 * successfully.
6574 * else SME is failed to update nRoamRescanRssiDiff.
6575 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08006576QDF_STATUS sme_set_roam_rescan_rssi_diff(mac_handle_t mac_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006577 uint8_t sessionId,
6578 const uint8_t nRoamRescanRssiDiff)
6579{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08006580 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306581 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006582
Jeff Johnson01f2c232018-11-21 19:17:44 -08006583 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306584 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08006585 status = csr_neighbor_roam_update_config(mac, sessionId,
Varun Reddy Yeturuff4feb02016-04-20 12:26:11 -07006586 nRoamRescanRssiDiff,
6587 REASON_ROAM_RESCAN_RSSI_DIFF_CHANGED);
Wu Gao51a63562018-11-08 16:29:10 +08006588 if (QDF_IS_STATUS_SUCCESS(status))
6589 mac->mlme_cfg->lfr.roam_rescan_rssi_diff =
6590 nRoamRescanRssiDiff;
6591
Jeff Johnson01f2c232018-11-21 19:17:44 -08006592 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006593 }
6594 return status;
6595}
6596
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306597/*
6598 * sme_get_roam_rescan_rssi_diff()
6599 * gets roam rescan rssi diff
6600 * This is a synchronous call
6601 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08006602 * mac_handle - The handle returned by mac_open
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306603 * Return int8_t - nRoamRescanRssiDiff
6604 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08006605uint8_t sme_get_roam_rescan_rssi_diff(mac_handle_t mac_handle)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006606{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08006607 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306608
Wu Gao51a63562018-11-08 16:29:10 +08006609 return mac->mlme_cfg->lfr.roam_rescan_rssi_diff;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006610}
6611
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306612/*
6613 * sme_set_roam_bmiss_first_bcnt() -
6614 * Update Roam count for first beacon miss
6615 * This function is called through dynamic setConfig callback function
6616 * to configure nRoamBmissFirstBcnt
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -08006617 * mac_handle: Opaque handle to the global MAC context
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306618 * sessionId - Session Identifier
6619 * nRoamBmissFirstBcnt - Roam first bmiss count
6620 * Return QDF_STATUS_SUCCESS - SME update nRoamBmissFirstBcnt
6621 * successfully.
6622 * else SME is failed to update nRoamBmissFirstBcnt
6623 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08006624QDF_STATUS sme_set_roam_bmiss_first_bcnt(mac_handle_t mac_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006625 uint8_t sessionId,
6626 const uint8_t nRoamBmissFirstBcnt)
6627{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08006628 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306629 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006630
Jeff Johnson01f2c232018-11-21 19:17:44 -08006631 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306632 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08006633 status = csr_neighbor_roam_update_config(mac, sessionId,
Varun Reddy Yeturuff4feb02016-04-20 12:26:11 -07006634 nRoamBmissFirstBcnt,
6635 REASON_ROAM_BMISS_FIRST_BCNT_CHANGED);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306636 if (QDF_IS_STATUS_SUCCESS(status)) {
Wu Gao51a63562018-11-08 16:29:10 +08006637 mac->mlme_cfg->lfr.roam_bmiss_first_bcnt =
6638 nRoamBmissFirstBcnt;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006639 }
Jeff Johnson01f2c232018-11-21 19:17:44 -08006640 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006641 }
6642 return status;
6643}
6644
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306645/*
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306646 * sme_set_roam_bmiss_final_bcnt() -
6647 * Update Roam count for final beacon miss
6648 * This function is called through dynamic setConfig callback function
6649 * to configure nRoamBmissFinalBcnt
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -08006650 * mac_handle: Opaque handle to the global MAC context
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306651 * sessionId - Session Identifier
6652 * nRoamBmissFinalBcnt - Roam final bmiss count
6653 * Return QDF_STATUS_SUCCESS - SME update nRoamBmissFinalBcnt
6654 * successfully.
6655 * else SME is failed to update nRoamBmissFinalBcnt
6656 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08006657QDF_STATUS sme_set_roam_bmiss_final_bcnt(mac_handle_t mac_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006658 uint8_t sessionId,
6659 const uint8_t nRoamBmissFinalBcnt)
6660{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08006661 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306662 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006663
Jeff Johnson01f2c232018-11-21 19:17:44 -08006664 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306665 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08006666 status = csr_neighbor_roam_update_config(mac, sessionId,
Varun Reddy Yeturuff4feb02016-04-20 12:26:11 -07006667 nRoamBmissFinalBcnt,
6668 REASON_ROAM_BMISS_FINAL_BCNT_CHANGED);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306669 if (QDF_IS_STATUS_SUCCESS(status)) {
Wu Gao51a63562018-11-08 16:29:10 +08006670 mac->mlme_cfg->lfr.roam_bmiss_final_bcnt =
6671 nRoamBmissFinalBcnt;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006672 }
Jeff Johnson01f2c232018-11-21 19:17:44 -08006673 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006674 }
6675 return status;
6676}
6677
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306678/*
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306679 * sme_set_neighbor_lookup_rssi_threshold() - update neighbor lookup
6680 * rssi threshold
6681 * This is a synchronous call
6682 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08006683 * mac_handle - The handle returned by mac_open.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306684 * sessionId - Session Identifier
6685 * Return QDF_STATUS_SUCCESS - SME update config successful.
6686 * Other status means SME is failed to update
6687 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08006688QDF_STATUS sme_set_neighbor_lookup_rssi_threshold(mac_handle_t mac_handle,
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306689 uint8_t sessionId, uint8_t neighborLookupRssiThreshold)
6690{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08006691 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306692 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006693
Jeff Johnson01f2c232018-11-21 19:17:44 -08006694 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306695 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08006696 status = csr_neighbor_roam_update_config(mac,
Varun Reddy Yeturuff4feb02016-04-20 12:26:11 -07006697 sessionId, neighborLookupRssiThreshold,
6698 REASON_LOOKUP_THRESH_CHANGED);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306699 if (QDF_IS_STATUS_SUCCESS(status)) {
Wu Gao51a63562018-11-08 16:29:10 +08006700 mac->mlme_cfg->lfr.neighbor_lookup_rssi_threshold =
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006701 neighborLookupRssiThreshold;
6702 }
Jeff Johnson01f2c232018-11-21 19:17:44 -08006703 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006704 }
6705 return status;
6706}
6707
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306708/*
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306709 * sme_get_neighbor_lookup_rssi_threshold() - get neighbor lookup
6710 * rssi threshold
6711 * This is a synchronous call
6712 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08006713 * mac_handle - The handle returned by mac_open.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306714 * Return QDF_STATUS_SUCCESS - SME update config successful.
6715 * Other status means SME is failed to update
6716 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08006717uint8_t sme_get_neighbor_lookup_rssi_threshold(mac_handle_t mac_handle)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006718{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08006719 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306720
Wu Gao51a63562018-11-08 16:29:10 +08006721 return mac->mlme_cfg->lfr.neighbor_lookup_rssi_threshold;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006722}
6723
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306724/*
6725 * sme_set_neighbor_scan_refresh_period() - set neighbor scan results
6726 * refresh period
6727 * This is a synchronous call
6728 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08006729 * mac_handle - The handle returned by mac_open.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306730 * sessionId - Session Identifier
6731 * Return QDF_STATUS_SUCCESS - SME update config successful.
6732 * Other status means SME is failed to update
6733 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08006734QDF_STATUS sme_set_neighbor_scan_refresh_period(mac_handle_t mac_handle,
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306735 uint8_t sessionId, uint16_t neighborScanResultsRefreshPeriod)
6736{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08006737 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306738 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006739 tpCsrNeighborRoamControlInfo pNeighborRoamInfo = NULL;
6740
Dustin Brownad06be62019-02-04 14:52:56 -08006741 if (sessionId >= WLAN_MAX_VDEVS) {
Naveen Rawatc36f7eb2016-11-10 20:01:03 -08006742 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
6743 FL("Invalid sme session id: %d"), sessionId);
6744 return QDF_STATUS_E_INVAL;
6745 }
6746
Jeff Johnson01f2c232018-11-21 19:17:44 -08006747 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306748 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08006749 pNeighborRoamInfo = &mac->roam.neighborRoamInfo[sessionId];
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05306750 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006751 "LFR runtime successfully set roam scan refresh period to %d- old value is %d - roam state is %s",
6752 neighborScanResultsRefreshPeriod,
Wu Gao51a63562018-11-08 16:29:10 +08006753 mac->mlme_cfg->lfr.
6754 neighbor_scan_results_refresh_period,
Jeff Johnson01f2c232018-11-21 19:17:44 -08006755 mac_trace_get_neighbour_roam_state(mac->roam.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006756 neighborRoamInfo
6757 [sessionId].
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306758 neighborRoamState));
Wu Gao51a63562018-11-08 16:29:10 +08006759 mac->mlme_cfg->lfr.neighbor_scan_results_refresh_period =
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006760 neighborScanResultsRefreshPeriod;
6761 pNeighborRoamInfo->cfgParams.neighborResultsRefreshPeriod =
6762 neighborScanResultsRefreshPeriod;
6763
Wu Gao51a63562018-11-08 16:29:10 +08006764 if (mac->mlme_cfg->lfr.roam_scan_offload_enabled) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08006765 csr_roam_offload_scan(mac, sessionId,
Vignesh Viswanathan4e65e8e2018-05-01 12:04:16 +05306766 ROAM_SCAN_OFFLOAD_UPDATE_CFG,
6767 REASON_NEIGHBOR_SCAN_REFRESH_PERIOD_CHANGED);
6768 }
Jeff Johnson01f2c232018-11-21 19:17:44 -08006769 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006770 }
Vignesh Viswanathan4e65e8e2018-05-01 12:04:16 +05306771
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006772 return status;
6773}
6774
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306775/*
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306776 * sme_get_neighbor_scan_refresh_period() - get neighbor scan results
6777 * refresh period
6778 * This is a synchronous call
6779 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08006780 * \param mac_handle - The handle returned by mac_open.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306781 * \return uint16_t - Neighbor scan results refresh period value
6782 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08006783uint16_t sme_get_neighbor_scan_refresh_period(mac_handle_t mac_handle)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006784{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08006785 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306786
Wu Gao51a63562018-11-08 16:29:10 +08006787 return mac->mlme_cfg->lfr.neighbor_scan_results_refresh_period;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006788}
6789
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306790/*
6791 * sme_get_empty_scan_refresh_period() - get empty scan refresh period
6792 * This is a synchronuous call
6793 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08006794 * mac_handle - The handle returned by mac_open.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306795 * Return QDF_STATUS_SUCCESS - SME update config successful.
6796 * Other status means SME is failed to update
6797 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08006798uint16_t sme_get_empty_scan_refresh_period(mac_handle_t mac_handle)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006799{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08006800 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306801
Wu Gao51a63562018-11-08 16:29:10 +08006802 return mac->mlme_cfg->lfr.empty_scan_refresh_period;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006803}
6804
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306805/*
6806 * sme_update_empty_scan_refresh_period
Jeff Johnson96259452019-02-26 20:38:17 -08006807 * Update empty_scan_refresh_period
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306808 * This function is called through dynamic setConfig callback function
Jeff Johnson96259452019-02-26 20:38:17 -08006809 * to configure empty_scan_refresh_period
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306810 * Usage: adb shell iwpriv wlan0 setConfig
Jeff Johnson96259452019-02-26 20:38:17 -08006811 * empty_scan_refresh_period=[0 .. 60]
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306812 *
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -08006813 * mac_handle: Opaque handle to the global MAC context
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306814 * sessionId - Session Identifier
Jeff Johnson96259452019-02-26 20:38:17 -08006815 * empty_scan_refresh_period - scan period following empty scan results.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306816 * Return Success or failure
6817 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006818
Jeff Johnsonb460dd72018-11-08 10:26:51 -08006819QDF_STATUS sme_update_empty_scan_refresh_period(mac_handle_t mac_handle,
6820 uint8_t sessionId, uint16_t
Jeff Johnson96259452019-02-26 20:38:17 -08006821 empty_scan_refresh_period)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006822{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08006823 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306824 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006825 tpCsrNeighborRoamControlInfo pNeighborRoamInfo = NULL;
6826
Dustin Brownad06be62019-02-04 14:52:56 -08006827 if (sessionId >= WLAN_MAX_VDEVS) {
Naveen Rawatc36f7eb2016-11-10 20:01:03 -08006828 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
6829 FL("Invalid sme session id: %d"), sessionId);
6830 return QDF_STATUS_E_INVAL;
6831 }
6832
Jeff Johnson01f2c232018-11-21 19:17:44 -08006833 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306834 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08006835 pNeighborRoamInfo = &mac->roam.neighborRoamInfo[sessionId];
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05306836 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006837 "LFR runtime successfully set roam scan period to %d -old value is %d - roam state is %s",
Jeff Johnson96259452019-02-26 20:38:17 -08006838 empty_scan_refresh_period,
Wu Gao51a63562018-11-08 16:29:10 +08006839 mac->mlme_cfg->lfr.empty_scan_refresh_period,
Jeff Johnson01f2c232018-11-21 19:17:44 -08006840 mac_trace_get_neighbour_roam_state(mac->roam.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006841 neighborRoamInfo
6842 [sessionId].
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306843 neighborRoamState));
Wu Gao51a63562018-11-08 16:29:10 +08006844 mac->mlme_cfg->lfr.empty_scan_refresh_period =
Jeff Johnson96259452019-02-26 20:38:17 -08006845 empty_scan_refresh_period;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006846 pNeighborRoamInfo->cfgParams.emptyScanRefreshPeriod =
Jeff Johnson96259452019-02-26 20:38:17 -08006847 empty_scan_refresh_period;
Vignesh Viswanathan4e65e8e2018-05-01 12:04:16 +05306848
Wu Gao51a63562018-11-08 16:29:10 +08006849 if (mac->mlme_cfg->lfr.roam_scan_offload_enabled) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08006850 csr_roam_offload_scan(mac, sessionId,
Vignesh Viswanathan4e65e8e2018-05-01 12:04:16 +05306851 ROAM_SCAN_OFFLOAD_UPDATE_CFG,
6852 REASON_EMPTY_SCAN_REF_PERIOD_CHANGED);
6853 }
Jeff Johnson01f2c232018-11-21 19:17:44 -08006854 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006855 }
Vignesh Viswanathan4e65e8e2018-05-01 12:04:16 +05306856
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006857 return status;
6858}
6859
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306860/*
6861 * sme_set_neighbor_scan_min_chan_time() -
6862 * Update nNeighborScanMinChanTime
6863 * This function is called through dynamic setConfig callback function
6864 * to configure gNeighborScanChannelMinTime
6865 * Usage: adb shell iwpriv wlan0 setConfig
6866 * gNeighborScanChannelMinTime=[0 .. 60]
6867 *
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -08006868 * mac_handle: Opaque handle to the global MAC context
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306869 * nNeighborScanMinChanTime - Channel minimum dwell time
6870 * sessionId - Session Identifier
6871 * Return Success or failure
6872 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08006873QDF_STATUS sme_set_neighbor_scan_min_chan_time(mac_handle_t mac_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006874 const uint16_t
6875 nNeighborScanMinChanTime,
6876 uint8_t sessionId)
6877{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08006878 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306879 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006880
Dustin Brownad06be62019-02-04 14:52:56 -08006881 if (sessionId >= WLAN_MAX_VDEVS) {
Naveen Rawatc36f7eb2016-11-10 20:01:03 -08006882 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
6883 FL("Invalid sme session id: %d"), sessionId);
6884 return QDF_STATUS_E_INVAL;
6885 }
6886
Jeff Johnson01f2c232018-11-21 19:17:44 -08006887 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306888 if (QDF_IS_STATUS_SUCCESS(status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05306889 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006890 "LFR runtime successfully set channel min dwell time to %d - old value is %d - roam state is %s",
6891 nNeighborScanMinChanTime,
Wu Gao51a63562018-11-08 16:29:10 +08006892 mac->mlme_cfg->lfr.neighbor_scan_min_chan_time,
Jeff Johnson01f2c232018-11-21 19:17:44 -08006893 mac_trace_get_neighbour_roam_state(mac->roam.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006894 neighborRoamInfo
6895 [sessionId].
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306896 neighborRoamState));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006897
Wu Gao51a63562018-11-08 16:29:10 +08006898 mac->mlme_cfg->lfr.neighbor_scan_min_chan_time =
6899 nNeighborScanMinChanTime;
Jeff Johnson01f2c232018-11-21 19:17:44 -08006900 mac->roam.neighborRoamInfo[sessionId].cfgParams.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006901 minChannelScanTime = nNeighborScanMinChanTime;
Jeff Johnson01f2c232018-11-21 19:17:44 -08006902 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006903 }
6904
6905 return status;
6906}
6907
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306908/*
6909 * sme_set_neighbor_scan_max_chan_time() -
6910 * Update nNeighborScanMaxChanTime
6911 * This function is called through dynamic setConfig callback function
6912 * to configure gNeighborScanChannelMaxTime
6913 * Usage: adb shell iwpriv wlan0 setConfig
6914 * gNeighborScanChannelMaxTime=[0 .. 60]
6915 *
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -08006916 * mac_handle: Opaque handle to the global MAC context
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306917 * sessionId - Session Identifier
6918 * nNeighborScanMinChanTime - Channel maximum dwell time
6919 * Return Success or failure
6920 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08006921QDF_STATUS sme_set_neighbor_scan_max_chan_time(mac_handle_t mac_handle,
6922 uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006923 const uint16_t
6924 nNeighborScanMaxChanTime)
6925{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08006926 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306927 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006928 tpCsrNeighborRoamControlInfo pNeighborRoamInfo = NULL;
6929
Dustin Brownad06be62019-02-04 14:52:56 -08006930 if (sessionId >= WLAN_MAX_VDEVS) {
Naveen Rawatc36f7eb2016-11-10 20:01:03 -08006931 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
6932 FL("Invalid sme session id: %d"), sessionId);
6933 return QDF_STATUS_E_INVAL;
6934 }
6935
Jeff Johnson01f2c232018-11-21 19:17:44 -08006936 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306937 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08006938 pNeighborRoamInfo = &mac->roam.neighborRoamInfo[sessionId];
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05306939 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006940 "LFR runtime successfully set channel max dwell time to %d - old value is %d - roam state is %s",
6941 nNeighborScanMaxChanTime,
Wu Gao51a63562018-11-08 16:29:10 +08006942 mac->mlme_cfg->lfr.neighbor_scan_max_chan_time,
Jeff Johnson01f2c232018-11-21 19:17:44 -08006943 mac_trace_get_neighbour_roam_state(mac->roam.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006944 neighborRoamInfo
6945 [sessionId].
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306946 neighborRoamState));
Wu Gao51a63562018-11-08 16:29:10 +08006947 mac->mlme_cfg->lfr.neighbor_scan_max_chan_time =
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006948 nNeighborScanMaxChanTime;
6949 pNeighborRoamInfo->cfgParams.maxChannelScanTime =
6950 nNeighborScanMaxChanTime;
Wu Gao51a63562018-11-08 16:29:10 +08006951 if (mac->mlme_cfg->lfr.roam_scan_offload_enabled) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08006952 csr_roam_offload_scan(mac, sessionId,
Vignesh Viswanathan4e65e8e2018-05-01 12:04:16 +05306953 ROAM_SCAN_OFFLOAD_UPDATE_CFG,
6954 REASON_SCAN_CH_TIME_CHANGED);
6955 }
Jeff Johnson01f2c232018-11-21 19:17:44 -08006956 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006957 }
Vignesh Viswanathan4e65e8e2018-05-01 12:04:16 +05306958
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006959 return status;
6960}
6961
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306962/*
6963 * sme_get_neighbor_scan_min_chan_time() -
6964 * get neighbor scan min channel time
6965 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08006966 * mac_handle - The handle returned by mac_open.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306967 * sessionId - Session Identifier
6968 * Return uint16_t - channel min time value
6969 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08006970uint16_t sme_get_neighbor_scan_min_chan_time(mac_handle_t mac_handle,
Jeff Johnson1f2dabc2018-11-07 15:33:01 -08006971 uint8_t sessionId)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006972{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08006973 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Naveen Rawatc36f7eb2016-11-10 20:01:03 -08006974
Dustin Brownad06be62019-02-04 14:52:56 -08006975 if (sessionId >= WLAN_MAX_VDEVS) {
Naveen Rawatc36f7eb2016-11-10 20:01:03 -08006976 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
6977 FL("Invalid sme session id: %d"), sessionId);
6978 return 0;
6979 }
6980
Jeff Johnson01f2c232018-11-21 19:17:44 -08006981 return mac->roam.neighborRoamInfo[sessionId].cfgParams.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006982 minChannelScanTime;
6983}
6984
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306985/*
6986 * sme_get_neighbor_roam_state() -
6987 * get neighbor roam state
6988 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08006989 * mac_handle - The handle returned by mac_open.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306990 * sessionId - Session Identifier
6991 * Return uint32_t - neighbor roam state
6992 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08006993uint32_t sme_get_neighbor_roam_state(mac_handle_t mac_handle, uint8_t sessionId)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006994{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08006995 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Naveen Rawatc36f7eb2016-11-10 20:01:03 -08006996
Dustin Brownad06be62019-02-04 14:52:56 -08006997 if (sessionId >= WLAN_MAX_VDEVS) {
Naveen Rawatc36f7eb2016-11-10 20:01:03 -08006998 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
6999 FL("Invalid sme session id: %d"), sessionId);
7000 return 0;
7001 }
7002
Jeff Johnson01f2c232018-11-21 19:17:44 -08007003 return mac->roam.neighborRoamInfo[sessionId].neighborRoamState;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007004}
7005
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307006/*
7007 * sme_get_current_roam_state() -
7008 * get current roam state
7009 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007010 * mac_handle - The handle returned by mac_open.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307011 * sessionId - Session Identifier
7012 * Return uint32_t - current roam state
7013 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007014uint32_t sme_get_current_roam_state(mac_handle_t mac_handle, uint8_t sessionId)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007015{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08007016 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307017
Jeff Johnson01f2c232018-11-21 19:17:44 -08007018 return mac->roam.curState[sessionId];
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007019}
7020
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307021/*
7022 * sme_get_current_roam_sub_state() -
7023 * \brief get neighbor roam sub state
7024 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007025 * mac_handle - The handle returned by mac_open.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307026 * sessionId - Session Identifier
7027 * Return uint32_t - current roam sub state
7028 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007029uint32_t sme_get_current_roam_sub_state(mac_handle_t mac_handle,
7030 uint8_t sessionId)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007031{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08007032 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307033
Jeff Johnson01f2c232018-11-21 19:17:44 -08007034 return mac->roam.curSubState[sessionId];
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007035}
7036
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307037/*
7038 * sme_get_lim_sme_state() -
7039 * get Lim Sme state
7040 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007041 * mac_handle - The handle returned by mac_open.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307042 * Return uint32_t - Lim Sme state
7043 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007044uint32_t sme_get_lim_sme_state(mac_handle_t mac_handle)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007045{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08007046 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307047
Jeff Johnson01f2c232018-11-21 19:17:44 -08007048 return mac->lim.gLimSmeState;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007049}
7050
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307051/*
7052 * sme_get_lim_mlm_state() -
7053 * get Lim Mlm state
7054 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007055 * mac_handle - The handle returned by mac_open.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307056 * Return uint32_t - Lim Mlm state
7057 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007058uint32_t sme_get_lim_mlm_state(mac_handle_t mac_handle)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007059{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08007060 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307061
Jeff Johnson01f2c232018-11-21 19:17:44 -08007062 return mac->lim.gLimMlmState;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007063}
7064
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307065/*
7066 * sme_is_lim_session_valid() -
7067 * is Lim session valid
7068 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007069 * mac_handle - The handle returned by mac_open.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307070 * sessionId - Session Identifier
7071 * Return bool - true or false
7072 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007073bool sme_is_lim_session_valid(mac_handle_t mac_handle, uint8_t sessionId)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007074{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08007075 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Hanumantha Reddy Pothula589fd702015-11-17 15:25:16 +05307076
Jeff Johnson01f2c232018-11-21 19:17:44 -08007077 if (sessionId > mac->lim.maxBssId)
Hanumantha Reddy Pothula589fd702015-11-17 15:25:16 +05307078 return false;
7079
Jeff Johnson01f2c232018-11-21 19:17:44 -08007080 return mac->lim.gpSession[sessionId].valid;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007081}
7082
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307083/*
7084 * sme_get_lim_sme_session_state() -
7085 * get Lim Sme session state
7086 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007087 * mac_handle - The handle returned by mac_open.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307088 * sessionId - Session Identifier
7089 * Return uint32_t - Lim Sme session state
7090 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007091uint32_t sme_get_lim_sme_session_state(mac_handle_t mac_handle,
7092 uint8_t sessionId)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007093{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08007094 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307095
Jeff Johnson01f2c232018-11-21 19:17:44 -08007096 return mac->lim.gpSession[sessionId].limSmeState;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007097}
7098
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307099/*
7100 * sme_get_lim_mlm_session_state() -
7101 * \brief get Lim Mlm session state
7102 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007103 * mac_handle - The handle returned by mac_open.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307104 * sessionId - Session Identifier
7105 * Return uint32_t - Lim Mlm session state
7106 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007107uint32_t sme_get_lim_mlm_session_state(mac_handle_t mac_handle,
7108 uint8_t sessionId)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007109{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08007110 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307111
Jeff Johnson01f2c232018-11-21 19:17:44 -08007112 return mac->lim.gpSession[sessionId].limMlmState;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007113}
7114
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307115/*
7116 * sme_get_neighbor_scan_max_chan_time() -
7117 * get neighbor scan max channel time
7118 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007119 * mac_handle - The handle returned by mac_open.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307120 * sessionId - Session Identifier
7121 * Return uint16_t - channel max time value
7122 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007123uint16_t sme_get_neighbor_scan_max_chan_time(mac_handle_t mac_handle,
Jeff Johnson1f2dabc2018-11-07 15:33:01 -08007124 uint8_t sessionId)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007125{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08007126 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Naveen Rawatc36f7eb2016-11-10 20:01:03 -08007127
Dustin Brownad06be62019-02-04 14:52:56 -08007128 if (sessionId >= WLAN_MAX_VDEVS) {
Naveen Rawatc36f7eb2016-11-10 20:01:03 -08007129 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
7130 FL("Invalid sme session id: %d"), sessionId);
7131 return 0;
7132 }
7133
Jeff Johnson01f2c232018-11-21 19:17:44 -08007134 return mac->roam.neighborRoamInfo[sessionId].cfgParams.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007135 maxChannelScanTime;
7136}
7137
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307138/*
7139 * sme_set_neighbor_scan_period() -
7140 * Update nNeighborScanPeriod
7141 * This function is called through dynamic setConfig callback function
7142 * to configure nNeighborScanPeriod
7143 * Usage: adb shell iwpriv wlan0 setConfig
7144 * nNeighborScanPeriod=[0 .. 1000]
7145 *
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -08007146 * mac_handle: Opaque handle to the global MAC context
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307147 * sessionId - Session Identifier
7148 * nNeighborScanPeriod - neighbor scan period
7149 * Return Success or failure
7150 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007151QDF_STATUS sme_set_neighbor_scan_period(mac_handle_t mac_handle,
7152 uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007153 const uint16_t nNeighborScanPeriod)
7154{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08007155 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307156 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007157 tpCsrNeighborRoamControlInfo pNeighborRoamInfo = NULL;
7158
Dustin Brownad06be62019-02-04 14:52:56 -08007159 if (sessionId >= WLAN_MAX_VDEVS) {
Naveen Rawatc36f7eb2016-11-10 20:01:03 -08007160 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
7161 FL("Invalid sme session id: %d"), sessionId);
7162 return QDF_STATUS_E_INVAL;
7163 }
7164
Jeff Johnson01f2c232018-11-21 19:17:44 -08007165 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307166 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08007167 pNeighborRoamInfo = &mac->roam.neighborRoamInfo[sessionId];
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05307168 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307169 "LFR runtime successfully set neighbor scan period to %d - old value is %d - roam state is %s",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007170 nNeighborScanPeriod,
Wu Gao51a63562018-11-08 16:29:10 +08007171 mac->mlme_cfg->lfr.neighbor_scan_timer_period,
Jeff Johnson01f2c232018-11-21 19:17:44 -08007172 mac_trace_get_neighbour_roam_state(mac->roam.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007173 neighborRoamInfo
7174 [sessionId].
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307175 neighborRoamState));
Wu Gao51a63562018-11-08 16:29:10 +08007176 mac->mlme_cfg->lfr.neighbor_scan_timer_period =
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007177 nNeighborScanPeriod;
7178 pNeighborRoamInfo->cfgParams.neighborScanPeriod =
7179 nNeighborScanPeriod;
Vignesh Viswanathan4e65e8e2018-05-01 12:04:16 +05307180
Wu Gao51a63562018-11-08 16:29:10 +08007181 if (mac->mlme_cfg->lfr.roam_scan_offload_enabled) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08007182 csr_roam_offload_scan(mac, sessionId,
Vignesh Viswanathan4e65e8e2018-05-01 12:04:16 +05307183 ROAM_SCAN_OFFLOAD_UPDATE_CFG,
7184 REASON_SCAN_HOME_TIME_CHANGED);
7185 }
Jeff Johnson01f2c232018-11-21 19:17:44 -08007186 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007187 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007188
7189 return status;
7190}
7191
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307192/*
7193 * sme_get_neighbor_scan_period() -
7194 * get neighbor scan period
7195 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007196 * mac_handle - The handle returned by mac_open.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307197 * sessionId - Session Identifier
7198 * Return uint16_t - neighbor scan period
7199 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007200uint16_t sme_get_neighbor_scan_period(mac_handle_t mac_handle,
7201 uint8_t sessionId)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007202{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08007203 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Naveen Rawatc36f7eb2016-11-10 20:01:03 -08007204
Dustin Brownad06be62019-02-04 14:52:56 -08007205 if (sessionId >= WLAN_MAX_VDEVS) {
Naveen Rawatc36f7eb2016-11-10 20:01:03 -08007206 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
7207 FL("Invalid sme session id: %d"), sessionId);
7208 return 0;
7209 }
7210
Jeff Johnson01f2c232018-11-21 19:17:44 -08007211 return mac->roam.neighborRoamInfo[sessionId].cfgParams.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007212 neighborScanPeriod;
7213}
7214
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307215/*
7216 * sme_get_roam_rssi_diff() - get Roam rssi diff
7217 * This is a synchronous call
7218 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007219 * mac_handle - The handle returned by mac_open.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307220 * Return uint16_t - Rssi diff value
7221 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007222uint8_t sme_get_roam_rssi_diff(mac_handle_t mac_handle)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007223{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08007224 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307225
Wu Gao51a63562018-11-08 16:29:10 +08007226 return mac->mlme_cfg->lfr.roam_rssi_diff;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007227}
7228
7229/**
7230 * sme_change_roam_scan_channel_list() - to change scan channel list
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -08007231 * @mac_handle: Opaque handle to the global MAC context
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007232 * @sessionId: sme session id
7233 * @pChannelList: Output channel list
7234 * @numChannels: Output number of channels
7235 *
7236 * This routine is called to Change roam scan channel list.
7237 * This is a synchronous call
7238 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307239 * Return: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007240 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007241QDF_STATUS sme_change_roam_scan_channel_list(mac_handle_t mac_handle,
Jeff Johnson1f2dabc2018-11-07 15:33:01 -08007242 uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007243 uint8_t *pChannelList,
7244 uint8_t numChannels)
7245{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08007246 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307247 QDF_STATUS status = QDF_STATUS_SUCCESS;
Naveen Rawatc36f7eb2016-11-10 20:01:03 -08007248 tpCsrNeighborRoamControlInfo pNeighborRoamInfo = NULL;
Wu Gao0821b0d2019-01-11 17:31:11 +08007249 uint8_t oldChannelList[CFG_VALID_CHANNEL_LIST_LEN * 2] = { 0 };
7250 uint8_t newChannelList[CFG_VALID_CHANNEL_LIST_LEN * 2] = { 0 };
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007251 uint8_t i = 0, j = 0;
7252 tCsrChannelInfo *chan_info;
7253
Dustin Brownad06be62019-02-04 14:52:56 -08007254 if (sessionId >= WLAN_MAX_VDEVS) {
Naveen Rawatc36f7eb2016-11-10 20:01:03 -08007255 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
7256 FL("Invalid sme session id: %d"), sessionId);
7257 return QDF_STATUS_E_INVAL;
7258 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007259
Jeff Johnson01f2c232018-11-21 19:17:44 -08007260 pNeighborRoamInfo = &mac->roam.neighborRoamInfo[sessionId];
7261 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307262 if (!QDF_IS_STATUS_SUCCESS(status)) {
Vignesh Viswanathan4e65e8e2018-05-01 12:04:16 +05307263 sme_err("Failed to acquire SME lock");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007264 return status;
7265 }
7266 chan_info = &pNeighborRoamInfo->cfgParams.channelInfo;
7267
Jeff Johnson038efe72019-03-18 13:39:31 -07007268 if (chan_info->ChannelList) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007269 for (i = 0; i < chan_info->numOfChannels; i++) {
7270 if (j < sizeof(oldChannelList))
7271 j += snprintf(oldChannelList + j,
7272 sizeof(oldChannelList) -
7273 j, "%d",
7274 chan_info->ChannelList[i]);
7275 else
7276 break;
7277 }
7278 }
Jeff Johnson01f2c232018-11-21 19:17:44 -08007279 csr_flush_cfg_bg_scan_roam_channel_list(mac, sessionId);
7280 csr_create_bg_scan_roam_channel_list(mac, sessionId, pChannelList,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007281 numChannels);
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007282 sme_set_roam_scan_control(mac_handle, sessionId, 1);
Jeff Johnson038efe72019-03-18 13:39:31 -07007283 if (chan_info->ChannelList) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007284 j = 0;
7285 for (i = 0; i < chan_info->numOfChannels; i++) {
7286 if (j < sizeof(newChannelList))
7287 j += snprintf(newChannelList + j,
7288 sizeof(newChannelList) -
7289 j, " %d",
7290 chan_info->ChannelList[i]);
7291 else
7292 break;
7293 }
7294 }
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05307295 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307296 "LFR runtime successfully set roam scan channels to %s - old value is %s - roam state is %d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007297 newChannelList, oldChannelList,
Jeff Johnson01f2c232018-11-21 19:17:44 -08007298 mac->roam.neighborRoamInfo[sessionId].neighborRoamState);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007299
Wu Gao51a63562018-11-08 16:29:10 +08007300 if (mac->mlme_cfg->lfr.roam_scan_offload_enabled)
Jeff Johnson01f2c232018-11-21 19:17:44 -08007301 csr_roam_offload_scan(mac, sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007302 ROAM_SCAN_OFFLOAD_UPDATE_CFG,
7303 REASON_CHANNEL_LIST_CHANGED);
Vignesh Viswanathan4e65e8e2018-05-01 12:04:16 +05307304
Jeff Johnson01f2c232018-11-21 19:17:44 -08007305 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007306 return status;
7307}
7308
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007309/**
7310 * sme_get_roam_scan_channel_list() - To get roam scan channel list
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -08007311 * @mac_handle: Opaque handle to the global MAC context
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007312 * @pChannelList: Output channel list
7313 * @pNumChannels: Output number of channels
7314 * @sessionId: Session Identifier
7315 *
7316 * To get roam scan channel list This is a synchronous call
7317 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307318 * Return: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007319 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007320QDF_STATUS sme_get_roam_scan_channel_list(mac_handle_t mac_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007321 uint8_t *pChannelList, uint8_t *pNumChannels,
7322 uint8_t sessionId)
7323{
7324 int i = 0;
7325 uint8_t *pOutPtr = pChannelList;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08007326 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Naveen Rawatc36f7eb2016-11-10 20:01:03 -08007327 tpCsrNeighborRoamControlInfo pNeighborRoamInfo = NULL;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307328 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007329
Dustin Brownad06be62019-02-04 14:52:56 -08007330 if (sessionId >= WLAN_MAX_VDEVS) {
Naveen Rawatc36f7eb2016-11-10 20:01:03 -08007331 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
7332 FL("Invalid sme session id: %d"), sessionId);
7333 return QDF_STATUS_E_INVAL;
7334 }
7335
Jeff Johnson01f2c232018-11-21 19:17:44 -08007336 pNeighborRoamInfo = &mac->roam.neighborRoamInfo[sessionId];
7337 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307338 if (!QDF_IS_STATUS_SUCCESS(status))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007339 return status;
Jeff Johnson038efe72019-03-18 13:39:31 -07007340 if (!pNeighborRoamInfo->cfgParams.channelInfo.ChannelList) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05307341 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_WARN,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007342 FL("Roam Scan channel list is NOT yet initialized"));
7343 *pNumChannels = 0;
Jeff Johnson01f2c232018-11-21 19:17:44 -08007344 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007345 return status;
7346 }
7347
7348 *pNumChannels = pNeighborRoamInfo->cfgParams.channelInfo.numOfChannels;
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307349 for (i = 0; i < (*pNumChannels); i++)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007350 pOutPtr[i] =
7351 pNeighborRoamInfo->cfgParams.channelInfo.ChannelList[i];
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307352
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007353 pOutPtr[i] = '\0';
Jeff Johnson01f2c232018-11-21 19:17:44 -08007354 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007355 return status;
7356}
7357
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307358/*
7359 * sme_get_is_ese_feature_enabled() - get ESE feature enabled or not
7360 * This is a synchronuous call
7361 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007362 * mac_handle - The handle returned by mac_open.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307363 * Return true (1) - if the ESE feature is enabled
7364 * false (0) - if feature is disabled (compile or runtime)
7365 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007366bool sme_get_is_ese_feature_enabled(mac_handle_t mac_handle)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007367{
7368#ifdef FEATURE_WLAN_ESE
Jeff Johnson0a8786a2018-12-02 10:49:01 -08007369 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307370
Jeff Johnson01f2c232018-11-21 19:17:44 -08007371 return csr_roam_is_ese_ini_feature_enabled(mac);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007372#else
7373 return false;
7374#endif
7375}
7376
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307377/*
7378 * sme_get_wes_mode() - get WES Mode
7379 * This is a synchronous call
7380 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007381 * mac_handle - The handle returned by mac_open
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307382 * Return uint8_t - WES Mode Enabled(1)/Disabled(0)
7383 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007384bool sme_get_wes_mode(mac_handle_t mac_handle)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007385{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08007386 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307387
Wu Gao51a63562018-11-08 16:29:10 +08007388 return mac->mlme_cfg->lfr.wes_mode_enabled;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007389}
7390
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307391/*
7392 * sme_get_roam_scan_control() - get scan control
7393 * This is a synchronous call
7394 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007395 * mac_handle - The handle returned by mac_open.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307396 * Return bool - Enabled(1)/Disabled(0)
7397 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007398bool sme_get_roam_scan_control(mac_handle_t mac_handle)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007399{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08007400 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307401
Jeff Johnson01f2c232018-11-21 19:17:44 -08007402 return mac->roam.configParam.nRoamScanControl;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007403}
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007404
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307405/*
7406 * sme_get_is_lfr_feature_enabled() - get LFR feature enabled or not
7407 * This is a synchronuous call
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007408 * mac_handle - The handle returned by mac_open.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307409 * Return true (1) - if the feature is enabled
7410 * false (0) - if feature is disabled (compile or runtime)
7411 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007412bool sme_get_is_lfr_feature_enabled(mac_handle_t mac_handle)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007413{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08007414 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307415
Wu Gao51a63562018-11-08 16:29:10 +08007416 return mac->mlme_cfg->lfr.lfr_enabled;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007417}
7418
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307419/*
7420 * sme_get_is_ft_feature_enabled() - get FT feature enabled or not
7421 * This is a synchronuous call
7422 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007423 * mac_handle - The handle returned by mac_open.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307424 * Return true (1) - if the feature is enabled
7425 * false (0) - if feature is disabled (compile or runtime)
7426 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007427bool sme_get_is_ft_feature_enabled(mac_handle_t mac_handle)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007428{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08007429 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307430
Wu Gao51a63562018-11-08 16:29:10 +08007431 return mac->mlme_cfg->lfr.fast_transition_enabled;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007432}
7433
Krishna Kumaar Natarajand0bbb3c2017-03-13 17:04:58 -07007434/**
7435 * sme_is_feature_supported_by_fw() - check if feature is supported by FW
7436 * @feature: enum value of requested feature.
7437 *
7438 * Retrun: 1 if supported; 0 otherwise
7439 */
7440bool sme_is_feature_supported_by_fw(enum cap_bitmap feature)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007441{
Krishna Kumaar Natarajand0bbb3c2017-03-13 17:04:58 -07007442 return IS_FEATURE_SUPPORTED_BY_FW(feature);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007443}
7444
Jeff Johnsone943bca2019-02-08 22:45:17 -08007445QDF_STATUS sme_get_link_speed(mac_handle_t mac_handle,
7446 struct link_speed_info *req,
7447 void *context,
7448 sme_link_speed_cb cb)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007449{
Jeff Johnsone943bca2019-02-08 22:45:17 -08007450 QDF_STATUS status;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08007451 struct mac_context *mac;
Mukul Sharmac3886aa2017-05-04 17:53:22 +05307452 void *wma_handle;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007453
Jeff Johnsone943bca2019-02-08 22:45:17 -08007454 if (!mac_handle || !cb || !req) {
Jeff Johnsona5317a62017-01-26 08:51:25 -08007455 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
7456 FL("Invalid parameter"));
7457 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007458 }
Jeff Johnsona5317a62017-01-26 08:51:25 -08007459
Mukul Sharmac3886aa2017-05-04 17:53:22 +05307460 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
7461 if (!wma_handle) {
7462 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
7463 "wma handle is NULL");
7464 return QDF_STATUS_E_FAILURE;
7465 }
7466
Jeff Johnsona0619e42018-11-28 17:43:00 -08007467 mac = MAC_CONTEXT(mac_handle);
Jeff Johnson01f2c232018-11-21 19:17:44 -08007468 status = sme_acquire_global_lock(&mac->sme);
Jeff Johnsona5317a62017-01-26 08:51:25 -08007469 if (QDF_STATUS_SUCCESS != status) {
Srinivas Girigowda2c263352017-03-17 17:49:53 -07007470 sme_err("Failed to acquire global lock");
Jeff Johnsona5317a62017-01-26 08:51:25 -08007471 return QDF_STATUS_E_FAILURE;
7472 }
7473
Jeff Johnsone943bca2019-02-08 22:45:17 -08007474 mac->sme.link_speed_context = context;
7475 mac->sme.link_speed_cb = cb;
7476 status = wma_get_link_speed(wma_handle, req);
Jeff Johnson01f2c232018-11-21 19:17:44 -08007477 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007478 return status;
7479}
7480
Jeff Johnsonc7309062018-11-09 20:59:42 -08007481QDF_STATUS
7482sme_get_peer_info(mac_handle_t mac_handle,
7483 struct sir_peer_info_req req,
7484 void *context,
7485 void (*callbackfn)(struct sir_peer_info_resp *param,
7486 void *pcontext))
Will Huang558f8082017-05-31 16:22:24 +08007487{
7488
7489 QDF_STATUS status;
7490 QDF_STATUS qdf_status;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08007491 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Rajeev Kumar658e8492017-12-13 11:35:41 -08007492 struct scheduler_msg message = {0};
Will Huang558f8082017-05-31 16:22:24 +08007493
7494 status = sme_acquire_global_lock(&mac->sme);
7495 if (QDF_STATUS_SUCCESS == status) {
Jeff Johnson038efe72019-03-18 13:39:31 -07007496 if (!callbackfn) {
Will Huang558f8082017-05-31 16:22:24 +08007497 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
7498 "%s: Indication Call back is NULL",
7499 __func__);
7500 sme_release_global_lock(&mac->sme);
7501 return QDF_STATUS_E_FAILURE;
7502 }
7503
7504 mac->sme.pget_peer_info_ind_cb = callbackfn;
7505 mac->sme.pget_peer_info_cb_context = context;
7506
7507 /* serialize the req through MC thread */
7508 message.bodyptr = qdf_mem_malloc(sizeof(req));
Arif Hussain0ef77082018-10-10 16:42:53 -07007509 if (!message.bodyptr) {
Will Huang558f8082017-05-31 16:22:24 +08007510 sme_release_global_lock(&mac->sme);
7511 return QDF_STATUS_E_NOMEM;
7512 }
7513 qdf_mem_copy(message.bodyptr, &req, sizeof(req));
7514 message.type = WMA_GET_PEER_INFO;
Ashish Kumar Dhanotiya443d31f2017-10-13 12:41:19 +05307515 message.reserved = 0;
gaurank kathpalia36b0c582018-08-28 17:45:43 +05307516 qdf_status = scheduler_post_message(QDF_MODULE_ID_SME,
7517 QDF_MODULE_ID_WMA,
7518 QDF_MODULE_ID_WMA,
7519 &message);
Will Huang558f8082017-05-31 16:22:24 +08007520 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
7521 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
7522 "%s: Post get peer info msg fail", __func__);
7523 qdf_mem_free(message.bodyptr);
7524 status = QDF_STATUS_E_FAILURE;
7525 }
7526 sme_release_global_lock(&mac->sme);
7527 }
7528 return status;
7529}
7530
Jeff Johnsonc7309062018-11-09 20:59:42 -08007531QDF_STATUS sme_get_peer_info_ext(mac_handle_t mac_handle,
Will Huang558f8082017-05-31 16:22:24 +08007532 struct sir_peer_info_ext_req *req,
7533 void *context,
7534 void (*callbackfn)(struct sir_peer_info_ext_resp *param,
7535 void *pcontext))
7536{
7537 QDF_STATUS status;
7538 QDF_STATUS qdf_status;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08007539 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Rajeev Kumar658e8492017-12-13 11:35:41 -08007540 struct scheduler_msg message = {0};
Will Huang558f8082017-05-31 16:22:24 +08007541
7542 status = sme_acquire_global_lock(&mac->sme);
7543 if (QDF_STATUS_SUCCESS == status) {
Jeff Johnson038efe72019-03-18 13:39:31 -07007544 if (!callbackfn) {
Will Huang558f8082017-05-31 16:22:24 +08007545 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
7546 "%s: Indication Call back is NULL",
7547 __func__);
7548 sme_release_global_lock(&mac->sme);
7549 return QDF_STATUS_E_FAILURE;
7550 }
7551
7552 mac->sme.pget_peer_info_ext_ind_cb = callbackfn;
7553 mac->sme.pget_peer_info_ext_cb_context = context;
7554
7555 /* serialize the req through MC thread */
7556 message.bodyptr =
7557 qdf_mem_malloc(sizeof(struct sir_peer_info_ext_req));
Arif Hussain0ef77082018-10-10 16:42:53 -07007558 if (!message.bodyptr) {
Will Huang558f8082017-05-31 16:22:24 +08007559 sme_release_global_lock(&mac->sme);
7560 return QDF_STATUS_E_NOMEM;
7561 }
7562 qdf_mem_copy(message.bodyptr,
7563 req,
7564 sizeof(struct sir_peer_info_ext_req));
7565 message.type = WMA_GET_PEER_INFO_EXT;
gaurank kathpalia36b0c582018-08-28 17:45:43 +05307566 qdf_status = scheduler_post_message(QDF_MODULE_ID_SME,
7567 QDF_MODULE_ID_WMA,
7568 QDF_MODULE_ID_WMA,
7569 &message);
Will Huang558f8082017-05-31 16:22:24 +08007570 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
7571 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
7572 "%s: Post get rssi msg fail", __func__);
7573 qdf_mem_free(message.bodyptr);
7574 status = QDF_STATUS_E_FAILURE;
7575 }
7576 sme_release_global_lock(&mac->sme);
7577 }
7578 return status;
7579}
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007580
guangde4853c402019-05-06 15:54:04 +08007581QDF_STATUS sme_get_isolation(mac_handle_t mac_handle, void *context,
7582 sme_get_isolation_cb callbackfn)
7583{
7584 QDF_STATUS status;
7585 struct mac_context *mac = MAC_CONTEXT(mac_handle);
7586 struct scheduler_msg message = {0};
7587
7588 if (!callbackfn) {
7589 sme_err("Indication Call back is NULL");
7590 return QDF_STATUS_E_FAILURE;
7591 }
7592 status = sme_acquire_global_lock(&mac->sme);
7593 if (QDF_IS_STATUS_ERROR(status))
7594 return status;
7595 mac->sme.get_isolation_cb = callbackfn;
7596 mac->sme.get_isolation_cb_context = context;
7597 message.bodyptr = NULL;
7598 message.type = WMA_GET_ISOLATION;
7599 status = scheduler_post_message(QDF_MODULE_ID_SME,
7600 QDF_MODULE_ID_WMA,
7601 QDF_MODULE_ID_WMA,
7602 &message);
7603 if (!QDF_IS_STATUS_SUCCESS(status)) {
7604 sme_err("failed to post WMA_GET_ISOLATION");
7605 status = QDF_STATUS_E_FAILURE;
7606 }
7607 sme_release_global_lock(&mac->sme);
7608 return status;
7609}
7610
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007611/*convert the ini value to the ENUM used in csr and MAC for CB state*/
7612ePhyChanBondState sme_get_cb_phy_state_from_cb_ini_value(uint32_t cb_ini_value)
7613{
7614 return csr_convert_cb_ini_value_to_phy_cb_state(cb_ini_value);
7615}
7616
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007617void sme_set_curr_device_mode(mac_handle_t mac_handle,
Jeff Johnson5a6a0c92019-02-17 16:12:02 -08007618 enum QDF_OPMODE curr_device_mode)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007619{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08007620 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307621
Jeff Johnson5a6a0c92019-02-17 16:12:02 -08007622 mac->sme.curr_device_mode = curr_device_mode;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007623}
7624
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307625/*
7626 * sme_handoff_request() - a wrapper function to Request a handoff from CSR.
7627 * This is a synchronous call
7628 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007629 * mac_handle - The handle returned by mac_open
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307630 * sessionId - Session Identifier
7631 * pHandoffInfo - info provided by HDD with the handoff request (namely:
7632 * BSSID, channel etc.)
7633 * Return QDF_STATUS_SUCCESS - SME passed the request to CSR successfully.
7634 * Other status means SME is failed to send the request.
7635 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007636
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007637QDF_STATUS sme_handoff_request(mac_handle_t mac_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007638 uint8_t sessionId,
7639 tCsrHandoffRequest *pHandoffInfo)
7640{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08007641 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307642 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007643
Jeff Johnson01f2c232018-11-21 19:17:44 -08007644 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307645 if (QDF_IS_STATUS_SUCCESS(status)) {
Abhishek Singhe4a1f882017-08-10 17:59:44 +05307646 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007647 "%s: invoked", __func__);
Jeff Johnson01f2c232018-11-21 19:17:44 -08007648 status = csr_handoff_request(mac, sessionId, pHandoffInfo);
7649 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007650 }
7651
7652 return status;
7653}
7654
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007655/**
7656 * sme_add_periodic_tx_ptrn() - Add Periodic TX Pattern
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -08007657 * @mac_handle: Opaque handle to the global MAC context
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007658 * @addPeriodicTxPtrnParams: request message
7659 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307660 * Return: QDF_STATUS enumeration
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007661 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307662QDF_STATUS
Jeff Johnsonc7309062018-11-09 20:59:42 -08007663sme_add_periodic_tx_ptrn(mac_handle_t mac_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007664 struct sSirAddPeriodicTxPtrn *addPeriodicTxPtrnParams)
7665{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307666 QDF_STATUS status = QDF_STATUS_SUCCESS;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08007667 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007668 struct sSirAddPeriodicTxPtrn *req_msg;
Rajeev Kumar37d478b2017-04-17 16:59:28 -07007669 struct scheduler_msg msg = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007670
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07007671 SME_ENTER();
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007672
Anurag Chouhan600c3a02016-03-01 10:33:54 +05307673 req_msg = qdf_mem_malloc(sizeof(*req_msg));
Arif Hussain0ef77082018-10-10 16:42:53 -07007674 if (!req_msg)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307675 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007676
7677 *req_msg = *addPeriodicTxPtrnParams;
7678
7679 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307680 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07007681 sme_err("sme_acquire_global_lock failed!(status=%d)",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007682 status);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05307683 qdf_mem_free(req_msg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007684 return status;
7685 }
7686
7687 /* Serialize the req through MC thread */
7688 msg.bodyptr = req_msg;
7689 msg.type = WMA_ADD_PERIODIC_TX_PTRN_IND;
Sreelakshmi Konamki6a065362016-05-31 16:05:01 +05307690 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
7691 NO_SESSION, msg.type));
gaurank kathpalia36b0c582018-08-28 17:45:43 +05307692 status = scheduler_post_message(QDF_MODULE_ID_SME,
7693 QDF_MODULE_ID_WMA,
7694 QDF_MODULE_ID_WMA, &msg);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307695 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07007696 sme_err("scheduler_post_msg failed!(err=%d)",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007697 status);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05307698 qdf_mem_free(req_msg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007699 }
7700 sme_release_global_lock(&mac->sme);
7701 return status;
7702}
7703
7704/**
7705 * sme_del_periodic_tx_ptrn() - Delete Periodic TX Pattern
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -08007706 * @mac_handle: Opaque handle to the global MAC context
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007707 * @delPeriodicTxPtrnParams: request message
7708 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307709 * Return: QDF_STATUS enumeration
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007710 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307711QDF_STATUS
Jeff Johnsonc7309062018-11-09 20:59:42 -08007712sme_del_periodic_tx_ptrn(mac_handle_t mac_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007713 struct sSirDelPeriodicTxPtrn *delPeriodicTxPtrnParams)
7714{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307715 QDF_STATUS status = QDF_STATUS_SUCCESS;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08007716 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007717 struct sSirDelPeriodicTxPtrn *req_msg;
Rajeev Kumar37d478b2017-04-17 16:59:28 -07007718 struct scheduler_msg msg = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007719
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07007720 SME_ENTER();
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007721
Anurag Chouhan600c3a02016-03-01 10:33:54 +05307722 req_msg = qdf_mem_malloc(sizeof(*req_msg));
Arif Hussain0ef77082018-10-10 16:42:53 -07007723 if (!req_msg)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307724 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007725
7726 *req_msg = *delPeriodicTxPtrnParams;
7727
7728 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307729 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07007730 sme_err("sme_acquire_global_lock failed!(status=%d)",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007731 status);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05307732 qdf_mem_free(req_msg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007733 return status;
7734 }
7735
7736 /* Serialize the req through MC thread */
7737 msg.bodyptr = req_msg;
7738 msg.type = WMA_DEL_PERIODIC_TX_PTRN_IND;
Sreelakshmi Konamki6a065362016-05-31 16:05:01 +05307739 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
7740 NO_SESSION, msg.type));
gaurank kathpalia36b0c582018-08-28 17:45:43 +05307741 status = scheduler_post_message(QDF_MODULE_ID_SME,
7742 QDF_MODULE_ID_WMA,
7743 QDF_MODULE_ID_WMA, &msg);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307744 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07007745 sme_err("scheduler_post_msg failed!(err=%d)",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007746 status);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05307747 qdf_mem_free(req_msg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007748 }
7749 sme_release_global_lock(&mac->sme);
7750 return status;
7751}
7752
Rachit Kankaneee1735c2018-08-02 13:19:34 +05307753#ifdef FEATURE_WLAN_RMC
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307754/*
7755 * sme_enable_rmc() - enables RMC
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -08007756 * @mac_handle: Opaque handle to the global MAC context
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307757 * @sessionId : Session ID
7758 *
7759 * Return: QDF_STATUS
7760 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007761QDF_STATUS sme_enable_rmc(mac_handle_t mac_handle, uint32_t sessionId)
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08007762{
7763 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08007764 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Rajeev Kumar37d478b2017-04-17 16:59:28 -07007765 struct scheduler_msg message = {0};
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08007766 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
7767
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07007768 SME_ENTER();
7769
Jeff Johnson01f2c232018-11-21 19:17:44 -08007770 status = sme_acquire_global_lock(&mac->sme);
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08007771 if (QDF_IS_STATUS_SUCCESS(status)) {
Rajeev Kumar8eaedf62017-01-21 11:03:13 -08007772 message.bodyptr = NULL;
7773 message.type = WMA_RMC_ENABLE_IND;
gaurank kathpalia36b0c582018-08-28 17:45:43 +05307774 qdf_status = scheduler_post_message(QDF_MODULE_ID_SME,
7775 QDF_MODULE_ID_WMA,
7776 QDF_MODULE_ID_WMA,
7777 &message);
Madhvapathi Sriram3e6627a2018-12-19 12:54:49 +05307778 if (!QDF_IS_STATUS_SUCCESS(qdf_status))
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08007779 status = QDF_STATUS_E_FAILURE;
Madhvapathi Sriram3e6627a2018-12-19 12:54:49 +05307780
Jeff Johnson01f2c232018-11-21 19:17:44 -08007781 sme_release_global_lock(&mac->sme);
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08007782 }
7783 return status;
7784}
7785
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307786/*
7787 * sme_disable_rmc() - disables RMC
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -08007788 * @mac_handle: Opaque handle to the global MAC context
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307789 * @sessionId : Session ID
7790 *
7791 * Return: QDF_STATUS
7792 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007793QDF_STATUS sme_disable_rmc(mac_handle_t mac_handle, uint32_t sessionId)
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08007794{
7795 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08007796 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Rajeev Kumar37d478b2017-04-17 16:59:28 -07007797 struct scheduler_msg message = {0};
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08007798 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
7799
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07007800 SME_ENTER();
7801
Jeff Johnson01f2c232018-11-21 19:17:44 -08007802 status = sme_acquire_global_lock(&mac->sme);
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08007803 if (QDF_IS_STATUS_SUCCESS(status)) {
Rajeev Kumar8eaedf62017-01-21 11:03:13 -08007804 message.bodyptr = NULL;
7805 message.type = WMA_RMC_DISABLE_IND;
gaurank kathpalia36b0c582018-08-28 17:45:43 +05307806 qdf_status = scheduler_post_message(QDF_MODULE_ID_SME,
7807 QDF_MODULE_ID_WMA,
7808 QDF_MODULE_ID_WMA,
7809 &message);
Madhvapathi Sriram3e6627a2018-12-19 12:54:49 +05307810 if (!QDF_IS_STATUS_SUCCESS(qdf_status))
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08007811 status = QDF_STATUS_E_FAILURE;
Madhvapathi Sriram3e6627a2018-12-19 12:54:49 +05307812
Jeff Johnson01f2c232018-11-21 19:17:44 -08007813 sme_release_global_lock(&mac->sme);
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08007814 }
7815 return status;
7816}
7817
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307818/*
7819 * sme_send_rmc_action_period() - sends RMC action period param to target
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -08007820 * @mac_handle: Opaque handle to the global MAC context
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307821 * @sessionId : Session ID
7822 *
7823 * Return: QDF_STATUS
7824 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007825QDF_STATUS sme_send_rmc_action_period(mac_handle_t mac_handle,
7826 uint32_t sessionId)
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08007827{
7828 QDF_STATUS status = QDF_STATUS_SUCCESS;
7829 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08007830 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Rajeev Kumar37d478b2017-04-17 16:59:28 -07007831 struct scheduler_msg message = {0};
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08007832
Jeff Johnson01f2c232018-11-21 19:17:44 -08007833 status = sme_acquire_global_lock(&mac->sme);
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08007834 if (QDF_STATUS_SUCCESS == status) {
Rajeev Kumar8eaedf62017-01-21 11:03:13 -08007835 message.bodyptr = NULL;
7836 message.type = WMA_RMC_ACTION_PERIOD_IND;
gaurank kathpalia36b0c582018-08-28 17:45:43 +05307837 qdf_status = scheduler_post_message(QDF_MODULE_ID_SME,
7838 QDF_MODULE_ID_WMA,
7839 QDF_MODULE_ID_WMA,
7840 &message);
Madhvapathi Sriram3e6627a2018-12-19 12:54:49 +05307841 if (!QDF_IS_STATUS_SUCCESS(qdf_status))
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08007842 status = QDF_STATUS_E_FAILURE;
Madhvapathi Sriram3e6627a2018-12-19 12:54:49 +05307843
Jeff Johnson01f2c232018-11-21 19:17:44 -08007844 sme_release_global_lock(&mac->sme);
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08007845 }
7846
7847 return status;
7848}
Rachit Kankaneee1735c2018-08-02 13:19:34 +05307849#endif /* FEATURE_WLAN_RMC */
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08007850
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307851/*
7852 * sme_request_ibss_peer_info() - request ibss peer info
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -08007853 * @mac_handle: Opaque handle to the global MAC context
Jeff Johnson56ba88a2019-02-17 17:18:43 -08007854 * @cb_context: Pointer to user data
Jeff Johnsond6a23162019-02-17 16:46:37 -08007855 * @peer_info_cb: Peer info callback
7856 * @allPeerInfoReqd: All peer info required or not
7857 * @staIdx: sta index
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307858 *
7859 * Return: QDF_STATUS
7860 */
Jeff Johnson56ba88a2019-02-17 17:18:43 -08007861QDF_STATUS sme_request_ibss_peer_info(mac_handle_t mac_handle, void *cb_context,
Jeff Johnsond6a23162019-02-17 16:46:37 -08007862 ibss_peer_info_cb peer_info_cb,
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08007863 bool allPeerInfoReqd, uint8_t staIdx)
7864{
7865 QDF_STATUS status = QDF_STATUS_E_FAILURE;
7866 QDF_STATUS qdf_status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08007867 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Rajeev Kumar37d478b2017-04-17 16:59:28 -07007868 struct scheduler_msg message = {0};
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08007869 tSirIbssGetPeerInfoReqParams *pIbssInfoReqParams;
Jeff Johnsone7aa5cd2019-02-17 19:36:01 -08007870 struct ibss_peer_info_cb_info *cb_info;
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08007871
Jeff Johnson01f2c232018-11-21 19:17:44 -08007872 status = sme_acquire_global_lock(&mac->sme);
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08007873 if (QDF_STATUS_SUCCESS == status) {
Jeff Johnsone7aa5cd2019-02-17 19:36:01 -08007874 cb_info = &mac->sme.peer_info_cb_info;
7875 cb_info->peer_info_cb = peer_info_cb;
7876 cb_info->peer_info_cb_context = cb_context;
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08007877
7878 pIbssInfoReqParams = (tSirIbssGetPeerInfoReqParams *)
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307879 qdf_mem_malloc(sizeof(tSirIbssGetPeerInfoReqParams));
Arif Hussain0ef77082018-10-10 16:42:53 -07007880 if (!pIbssInfoReqParams) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08007881 sme_release_global_lock(&mac->sme);
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08007882 return QDF_STATUS_E_NOMEM;
7883 }
7884 pIbssInfoReqParams->allPeerInfoReqd = allPeerInfoReqd;
7885 pIbssInfoReqParams->staIdx = staIdx;
7886
Rajeev Kumar8eaedf62017-01-21 11:03:13 -08007887 message.type = WMA_GET_IBSS_PEER_INFO_REQ;
7888 message.bodyptr = pIbssInfoReqParams;
7889 message.reserved = 0;
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08007890
gaurank kathpalia36b0c582018-08-28 17:45:43 +05307891 qdf_status = scheduler_post_message(QDF_MODULE_ID_SME,
7892 QDF_MODULE_ID_WMA,
7893 QDF_MODULE_ID_WMA,
7894 &message);
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08007895 if (QDF_STATUS_SUCCESS != qdf_status) {
7896 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
7897 "%s: Post WMA_GET_IBSS_PEER_INFO_REQ MSG failed",
7898 __func__);
7899 qdf_mem_free(pIbssInfoReqParams);
7900 qdf_status = QDF_STATUS_E_FAILURE;
7901 }
Jeff Johnson01f2c232018-11-21 19:17:44 -08007902 sme_release_global_lock(&mac->sme);
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08007903 }
7904
7905 return qdf_status;
7906}
7907
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307908/*
7909 * sme_send_cesium_enable_ind() -
7910 * Used to send proprietary cesium enable indication to fw
7911 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007912 * mac_handle
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307913 * sessionId
7914 * Return QDF_STATUS
7915 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007916QDF_STATUS sme_send_cesium_enable_ind(mac_handle_t mac_handle,
7917 uint32_t sessionId)
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08007918{
7919 QDF_STATUS status = QDF_STATUS_SUCCESS;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08007920 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Rajeev Kumar37d478b2017-04-17 16:59:28 -07007921 struct scheduler_msg message = {0};
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08007922
Jeff Johnson01f2c232018-11-21 19:17:44 -08007923 status = sme_acquire_global_lock(&mac->sme);
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08007924 if (QDF_STATUS_SUCCESS == status) {
Rajeev Kumar8eaedf62017-01-21 11:03:13 -08007925 message.bodyptr = NULL;
7926 message.type = WMA_IBSS_CESIUM_ENABLE_IND;
Madhvapathi Sriram3e6627a2018-12-19 12:54:49 +05307927 status = scheduler_post_message(QDF_MODULE_ID_SME,
7928 QDF_MODULE_ID_WMA,
7929 QDF_MODULE_ID_WMA,
7930 &message);
Jeff Johnson01f2c232018-11-21 19:17:44 -08007931 sme_release_global_lock(&mac->sme);
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08007932 }
7933
7934 return status;
7935}
7936
Jeff Johnsonc7309062018-11-09 20:59:42 -08007937QDF_STATUS sme_set_wlm_latency_level(mac_handle_t mac_handle,
7938 uint16_t session_id,
Paul Zhang99fe8842017-12-08 14:43:46 +08007939 uint16_t latency_level)
7940{
7941 QDF_STATUS status;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08007942 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Paul Zhang99fe8842017-12-08 14:43:46 +08007943 struct wlm_latency_level_param params;
7944 void *wma = cds_get_context(QDF_MODULE_ID_WMA);
7945
Bala Venkatesh7cf5b662018-05-10 15:18:53 +05307946 if (!wma)
7947 return QDF_STATUS_E_FAILURE;
7948
Yeshwanth Sriram Guntuka334aa8d2018-08-20 16:49:15 +05307949 if (!mac_ctx->mlme_cfg->wlm_config.latency_enable) {
Paul Zhang99fe8842017-12-08 14:43:46 +08007950 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
7951 "%s: WLM latency level setting is disabled",
7952 __func__);
7953 return QDF_STATUS_E_FAILURE;
7954 }
Krunal Soni3fa80e22018-01-09 14:16:02 -08007955 if (!wma) {
7956 sme_err("wma is NULL");
7957 return QDF_STATUS_E_FAILURE;
7958 }
Paul Zhang99fe8842017-12-08 14:43:46 +08007959
7960 params.wlm_latency_level = latency_level;
7961 params.wlm_latency_flags =
Yeshwanth Sriram Guntuka334aa8d2018-08-20 16:49:15 +05307962 mac_ctx->mlme_cfg->wlm_config.latency_flags[latency_level];
Paul Zhang99fe8842017-12-08 14:43:46 +08007963 params.vdev_id = session_id;
7964
7965 status = wma_set_wlm_latency_level(wma, &params);
Paul Zhang99fe8842017-12-08 14:43:46 +08007966
7967 return status;
7968}
7969
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007970void sme_get_command_q_status(mac_handle_t mac_handle)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007971{
7972 tSmeCmd *pTempCmd = NULL;
7973 tListElem *pEntry;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08007974 struct mac_context *mac;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007975
Madhvapathi Sriram3e6627a2018-12-19 12:54:49 +05307976 if (!mac_handle)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007977 return;
Madhvapathi Sriram3e6627a2018-12-19 12:54:49 +05307978
7979 mac = MAC_CONTEXT(mac_handle);
7980
Jeff Johnson01f2c232018-11-21 19:17:44 -08007981 pEntry = csr_nonscan_active_ll_peek_head(mac, LL_ACCESS_LOCK);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307982 if (pEntry)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007983 pTempCmd = GET_BASE_ADDR(pEntry, tSmeCmd, Link);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307984
Kabilan Kannan33fcd682018-03-08 14:29:46 -08007985 sme_err("WLAN_BUG_RCA: Currently smeCmdActiveList has command (0x%X)",
Madhvapathi Sriram3e6627a2018-12-19 12:54:49 +05307986 (pTempCmd) ? pTempCmd->command : eSmeNoCommand);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007987 if (pTempCmd) {
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307988 if (eSmeCsrCommandMask & pTempCmd->command)
7989 /* CSR command is stuck. See what the reason code is
7990 * for that command
7991 */
Jeff Johnson01f2c232018-11-21 19:17:44 -08007992 dump_csr_command_info(mac, pTempCmd);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007993 } /* if(pTempCmd) */
7994
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07007995 sme_err("Currently smeCmdPendingList has %d commands",
Madhvapathi Sriram3e6627a2018-12-19 12:54:49 +05307996 csr_nonscan_pending_ll_count(mac));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007997
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007998}
Kiran Kumar Lokere1aa9c9a2016-10-05 18:50:59 -07007999
Agrawal Ashishb141b092016-09-02 19:59:26 +05308000#ifdef WLAN_FEATURE_DSRC
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008001/**
Naveen Rawatb4d37622015-11-13 16:15:25 -08008002 * sme_ocb_gen_timing_advert_frame() - generate TA frame and populate the buffer
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -08008003 * @mac_handle: Opaque handle to the global MAC context
Naveen Rawatb4d37622015-11-13 16:15:25 -08008004 * @self_addr: the self MAC address
8005 * @buf: the buffer that will contain the frame
8006 * @timestamp_offset: return for the offset of the timestamp field
8007 * @time_value_offset: return for the time_value field in the TA IE
8008 *
8009 * Return: the length of the buffer.
8010 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08008011int sme_ocb_gen_timing_advert_frame(mac_handle_t mac_handle,
Naveen Rawatb4d37622015-11-13 16:15:25 -08008012 tSirMacAddr self_addr, uint8_t **buf,
8013 uint32_t *timestamp_offset,
8014 uint32_t *time_value_offset)
8015{
8016 int template_length;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08008017 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Naveen Rawatb4d37622015-11-13 16:15:25 -08008018
8019 template_length = sch_gen_timing_advert_frame(mac_ctx, self_addr, buf,
8020 timestamp_offset,
8021 time_value_offset);
8022 return template_length;
8023}
Agrawal Ashishb141b092016-09-02 19:59:26 +05308024#endif
Arun Khandavalli4b55da72016-07-19 19:55:01 +05308025
Jeff Johnsonb460dd72018-11-08 10:26:51 -08008026QDF_STATUS sme_notify_modem_power_state(mac_handle_t mac_handle, uint32_t value)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008027{
Rajeev Kumar37d478b2017-04-17 16:59:28 -07008028 struct scheduler_msg msg = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008029 tpSirModemPowerStateInd request_buf;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08008030 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008031
Jeff Johnson038efe72019-03-18 13:39:31 -07008032 if (!mac)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308033 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008034
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308035 request_buf = qdf_mem_malloc(sizeof(tSirModemPowerStateInd));
Arif Hussain0ef77082018-10-10 16:42:53 -07008036 if (!request_buf)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308037 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008038
8039 request_buf->param = value;
8040
8041 msg.type = WMA_MODEM_POWER_STATE_IND;
8042 msg.reserved = 0;
8043 msg.bodyptr = request_buf;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308044 if (!QDF_IS_STATUS_SUCCESS
gaurank kathpalia36b0c582018-08-28 17:45:43 +05308045 (scheduler_post_message(QDF_MODULE_ID_SME,
8046 QDF_MODULE_ID_WMA,
8047 QDF_MODULE_ID_WMA, &msg))) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308048 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05308049 "%s: Not able to post WMA_MODEM_POWER_STATE_IND message to WMA",
8050 __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308051 qdf_mem_free(request_buf);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308052 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008053 }
8054
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308055 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008056}
8057
8058#ifdef QCA_HT_2040_COEX
Jeff Johnsonb460dd72018-11-08 10:26:51 -08008059QDF_STATUS sme_notify_ht2040_mode(mac_handle_t mac_handle, uint16_t staId,
Anurag Chouhan6d760662016-02-20 16:05:43 +05308060 struct qdf_mac_addr macAddrSTA,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008061 uint8_t sessionId,
8062 uint8_t channel_type)
8063{
Rajeev Kumar37d478b2017-04-17 16:59:28 -07008064 struct scheduler_msg msg = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008065 tUpdateVHTOpMode *pHtOpMode = NULL;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08008066 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008067
Jeff Johnson038efe72019-03-18 13:39:31 -07008068 if (!mac)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308069 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008070
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308071 pHtOpMode = qdf_mem_malloc(sizeof(tUpdateVHTOpMode));
Arif Hussain0ef77082018-10-10 16:42:53 -07008072 if (!pHtOpMode)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308073 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008074
8075 switch (channel_type) {
8076 case eHT_CHAN_HT20:
8077 pHtOpMode->opMode = eHT_CHANNEL_WIDTH_20MHZ;
8078 break;
8079
8080 case eHT_CHAN_HT40MINUS:
8081 case eHT_CHAN_HT40PLUS:
8082 pHtOpMode->opMode = eHT_CHANNEL_WIDTH_40MHZ;
8083 break;
8084
8085 default:
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308086 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008087 "%s: Invalid OP mode", __func__);
Abhinav Kumar009f69f2019-06-05 21:43:31 +05308088 qdf_mem_free(pHtOpMode);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308089 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008090 }
8091
8092 pHtOpMode->staId = staId,
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308093 qdf_mem_copy(pHtOpMode->peer_mac, macAddrSTA.bytes,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008094 sizeof(tSirMacAddr));
8095 pHtOpMode->smesessionId = sessionId;
8096
8097 msg.type = WMA_UPDATE_OP_MODE;
8098 msg.reserved = 0;
8099 msg.bodyptr = pHtOpMode;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308100 if (!QDF_IS_STATUS_SUCCESS
gaurank kathpalia36b0c582018-08-28 17:45:43 +05308101 (scheduler_post_message(QDF_MODULE_ID_SME,
8102 QDF_MODULE_ID_WMA,
8103 QDF_MODULE_ID_WMA, &msg))) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308104 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05308105 "%s: Not able to post WMA_UPDATE_OP_MODE message to WMA",
8106 __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308107 qdf_mem_free(pHtOpMode);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308108 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008109 }
8110
Abhishek Singhe4a1f882017-08-10 17:59:44 +05308111 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Jeff Johnson698eacd2018-05-12 17:00:03 -07008112 "%s: Notified FW about OP mode: %d for staId=%d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008113 __func__, pHtOpMode->opMode, staId);
8114
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308115 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008116}
8117
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05308118/*
8119 * sme_set_ht2040_mode() -
8120 * To update HT Operation beacon IE.
8121 *
8122 * Return QDF_STATUS SUCCESS
8123 * FAILURE or RESOURCES
8124 * The API finished and failed.
8125 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08008126QDF_STATUS sme_set_ht2040_mode(mac_handle_t mac_handle, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008127 uint8_t channel_type, bool obssEnabled)
8128{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308129 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08008130 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008131 ePhyChanBondState cbMode;
Jeff Johnson01f2c232018-11-21 19:17:44 -08008132 struct csr_roam_session *session = CSR_GET_SESSION(mac, sessionId);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008133
Jeff Johnson01f2c232018-11-21 19:17:44 -08008134 if (!CSR_IS_SESSION_VALID(mac, sessionId)) {
Abhishek Singh9d5f4582017-10-11 17:59:48 +05308135 sme_err("Session not valid for session id %d", sessionId);
8136 return QDF_STATUS_E_INVAL;
8137 }
Jeff Johnson01f2c232018-11-21 19:17:44 -08008138 session = CSR_GET_SESSION(mac, sessionId);
Abhishek Singh9d5f4582017-10-11 17:59:48 +05308139 sme_debug("Update HT operation beacon IE, channel_type=%d cur cbmode %d",
8140 channel_type, session->bssParams.cbMode);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008141
8142 switch (channel_type) {
8143 case eHT_CHAN_HT20:
Abhishek Singh9d5f4582017-10-11 17:59:48 +05308144 if (!session->bssParams.cbMode)
8145 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008146 cbMode = PHY_SINGLE_CHANNEL_CENTERED;
8147 break;
8148 case eHT_CHAN_HT40MINUS:
Abhishek Singh9d5f4582017-10-11 17:59:48 +05308149 if (session->bssParams.cbMode)
8150 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008151 cbMode = PHY_DOUBLE_CHANNEL_HIGH_PRIMARY;
8152 break;
8153 case eHT_CHAN_HT40PLUS:
Abhishek Singh9d5f4582017-10-11 17:59:48 +05308154 if (session->bssParams.cbMode)
8155 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008156 cbMode = PHY_DOUBLE_CHANNEL_LOW_PRIMARY;
8157 break;
8158 default:
Abhishek Singh9d5f4582017-10-11 17:59:48 +05308159 sme_err("Error!!! Invalid HT20/40 mode !");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308160 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008161 }
Abhishek Singh9d5f4582017-10-11 17:59:48 +05308162 session->bssParams.cbMode = cbMode;
Jeff Johnson01f2c232018-11-21 19:17:44 -08008163 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308164 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08008165 status = csr_set_ht2040_mode(mac, sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008166 cbMode, obssEnabled);
Jeff Johnson01f2c232018-11-21 19:17:44 -08008167 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008168 }
8169 return status;
8170}
8171
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008172#endif
8173
8174/*
8175 * SME API to enable/disable idle mode powersave
8176 * This should be called only if powersave offload
8177 * is enabled
8178 */
Arunk Khandavalli847969d2017-09-25 15:15:36 +05308179QDF_STATUS sme_set_idle_powersave_config(bool value)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008180{
Anurag Chouhan6d760662016-02-20 16:05:43 +05308181 void *wmaContext = cds_get_context(QDF_MODULE_ID_WMA);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008182
Jeff Johnson038efe72019-03-18 13:39:31 -07008183 if (!wmaContext) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308184 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008185 "%s: wmaContext is NULL", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308186 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008187 }
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308188 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008189 " Idle Ps Set Value %d", value);
8190
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308191 if (QDF_STATUS_SUCCESS != wma_set_idle_ps_config(wmaContext, value)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308192 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008193 " Failed to Set Idle Ps Value %d", value);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308194 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008195 }
Arunk Khandavalli847969d2017-09-25 15:15:36 +05308196
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308197 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008198}
8199
Jeff Johnsonb460dd72018-11-08 10:26:51 -08008200int16_t sme_get_ht_config(mac_handle_t mac_handle, uint8_t session_id,
8201 uint16_t ht_capab)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008202{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08008203 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Jeff Johnson01f2c232018-11-21 19:17:44 -08008204 struct csr_roam_session *pSession = CSR_GET_SESSION(mac, session_id);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008205
Jeff Johnson038efe72019-03-18 13:39:31 -07008206 if (!pSession) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308207 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008208 "%s: pSession is NULL", __func__);
8209 return -EIO;
8210 }
8211 switch (ht_capab) {
8212 case WNI_CFG_HT_CAP_INFO_ADVANCE_CODING:
Jeff Johnsonbe119e62019-02-02 12:30:26 -08008213 return pSession->ht_config.ht_rx_ldpc;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008214 case WNI_CFG_HT_CAP_INFO_TX_STBC:
Jeff Johnsonbe119e62019-02-02 12:30:26 -08008215 return pSession->ht_config.ht_tx_stbc;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008216 case WNI_CFG_HT_CAP_INFO_RX_STBC:
Jeff Johnsonbe119e62019-02-02 12:30:26 -08008217 return pSession->ht_config.ht_rx_stbc;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008218 case WNI_CFG_HT_CAP_INFO_SHORT_GI_20MHZ:
Jeff Johnsonbe119e62019-02-02 12:30:26 -08008219 return pSession->ht_config.ht_sgi20;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008220 case WNI_CFG_HT_CAP_INFO_SHORT_GI_40MHZ:
Jeff Johnsonbe119e62019-02-02 12:30:26 -08008221 return pSession->ht_config.ht_sgi40;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008222 default:
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308223 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008224 "invalid ht capability");
8225 return -EIO;
8226 }
8227}
8228
Jeff Johnsonb460dd72018-11-08 10:26:51 -08008229int sme_update_ht_config(mac_handle_t mac_handle, uint8_t sessionId,
8230 uint16_t htCapab, int value)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008231{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08008232 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Jeff Johnson01f2c232018-11-21 19:17:44 -08008233 struct csr_roam_session *pSession = CSR_GET_SESSION(mac, sessionId);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008234
Jeff Johnson038efe72019-03-18 13:39:31 -07008235 if (!pSession) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308236 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008237 "%s: pSession is NULL", __func__);
8238 return -EIO;
8239 }
8240
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308241 if (QDF_STATUS_SUCCESS != wma_set_htconfig(sessionId, htCapab, value)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308242 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008243 "Failed to set ht capability in target");
8244 return -EIO;
8245 }
8246
8247 switch (htCapab) {
8248 case WNI_CFG_HT_CAP_INFO_ADVANCE_CODING:
Jeff Johnsonbe119e62019-02-02 12:30:26 -08008249 pSession->ht_config.ht_rx_ldpc = value;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008250 break;
8251 case WNI_CFG_HT_CAP_INFO_TX_STBC:
Jeff Johnsonbe119e62019-02-02 12:30:26 -08008252 pSession->ht_config.ht_tx_stbc = value;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008253 break;
8254 case WNI_CFG_HT_CAP_INFO_RX_STBC:
Jeff Johnsonbe119e62019-02-02 12:30:26 -08008255 pSession->ht_config.ht_rx_stbc = value;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008256 break;
8257 case WNI_CFG_HT_CAP_INFO_SHORT_GI_20MHZ:
Krishna Kumaar Natarajana5c5aad2016-12-05 14:12:13 -08008258 value = value ? 1 : 0; /* HT SGI can be only 1 or 0 */
Jeff Johnsonbe119e62019-02-02 12:30:26 -08008259 pSession->ht_config.ht_sgi20 = value;
Sandeep Puligilla607f34a2016-05-25 14:37:47 -07008260 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008261 case WNI_CFG_HT_CAP_INFO_SHORT_GI_40MHZ:
Krishna Kumaar Natarajana5c5aad2016-12-05 14:12:13 -08008262 value = value ? 1 : 0; /* HT SGI can be only 1 or 0 */
Jeff Johnsonbe119e62019-02-02 12:30:26 -08008263 pSession->ht_config.ht_sgi40 = value;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008264 break;
8265 }
8266
Jeff Johnson01f2c232018-11-21 19:17:44 -08008267 csr_roam_update_config(mac, sessionId, htCapab, value);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008268 return 0;
8269}
8270
Jeff Johnsonc7309062018-11-09 20:59:42 -08008271int sme_set_addba_accept(mac_handle_t mac_handle, uint8_t session_id, int value)
Kiran Kumar Lokere08195ef2018-01-17 19:25:15 -08008272{
8273 struct sme_addba_accept *addba_accept;
8274 struct scheduler_msg msg = {0};
8275 QDF_STATUS status;
8276
8277 addba_accept = qdf_mem_malloc(sizeof(*addba_accept));
Arif Hussain0ef77082018-10-10 16:42:53 -07008278 if (!addba_accept)
Kiran Kumar Lokere08195ef2018-01-17 19:25:15 -08008279 return -EIO;
Arif Hussain0ef77082018-10-10 16:42:53 -07008280
Kiran Kumar Lokere08195ef2018-01-17 19:25:15 -08008281 addba_accept->session_id = session_id;
8282 addba_accept->addba_accept = value;
8283 qdf_mem_zero(&msg, sizeof(msg));
8284 msg.type = eWNI_SME_SET_ADDBA_ACCEPT;
8285 msg.reserved = 0;
8286 msg.bodyptr = addba_accept;
gaurank kathpalia36b0c582018-08-28 17:45:43 +05308287 status = scheduler_post_message(QDF_MODULE_ID_SME,
8288 QDF_MODULE_ID_PE,
8289 QDF_MODULE_ID_PE, &msg);
Kiran Kumar Lokere08195ef2018-01-17 19:25:15 -08008290 if (status != QDF_STATUS_SUCCESS) {
8291 sme_err("Not able to post addba reject");
8292 qdf_mem_free(addba_accept);
8293 return -EIO;
8294 }
8295 return 0;
8296}
Kiran Kumar Lokerebc87bec2018-02-27 20:06:42 -08008297
Jeff Johnsonc7309062018-11-09 20:59:42 -08008298int sme_set_ba_buff_size(mac_handle_t mac_handle, uint8_t session_id,
8299 uint16_t buff_size)
Kiran Kumar Lokerebc87bec2018-02-27 20:06:42 -08008300{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08008301 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Kiran Kumar Lokerebc87bec2018-02-27 20:06:42 -08008302 if (!buff_size) {
8303 sme_err("invalid buff size %d", buff_size);
8304 return -EINVAL;
8305 }
8306 mac_ctx->usr_cfg_ba_buff_size = buff_size;
8307 sme_debug("addba buff size is set to %d",
8308 mac_ctx->usr_cfg_ba_buff_size);
8309
8310 return 0;
8311}
8312
8313#define DEFAULT_BA_BUFF_SIZE 64
Jeff Johnsonc7309062018-11-09 20:59:42 -08008314int sme_send_addba_req(mac_handle_t mac_handle, uint8_t session_id, uint8_t tid,
8315 uint16_t buff_size)
Kiran Kumar Lokerebc87bec2018-02-27 20:06:42 -08008316{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08008317 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Kiran Kumar Lokerebc87bec2018-02-27 20:06:42 -08008318 uint16_t ba_buff = 0;
8319 QDF_STATUS status;
8320 struct scheduler_msg msg = {0};
8321 struct send_add_ba_req *send_ba_req;
8322 struct csr_roam_session *csr_session = NULL;
8323
8324 if (!csr_is_conn_state_connected_infra(mac_ctx, session_id)) {
8325 sme_err("STA not infra/connected state session_id: %d",
8326 session_id);
8327 return -EINVAL;
8328 }
8329 csr_session = CSR_GET_SESSION(mac_ctx, session_id);
8330 if (!csr_session) {
8331 sme_err("CSR session is NULL");
8332 return -EINVAL;
8333 }
8334 send_ba_req = qdf_mem_malloc(sizeof(*send_ba_req));
Arif Hussain0ef77082018-10-10 16:42:53 -07008335 if (!send_ba_req)
Kiran Kumar Lokerebc87bec2018-02-27 20:06:42 -08008336 return -EIO;
Arif Hussain0ef77082018-10-10 16:42:53 -07008337
Kiran Kumar Lokerebc87bec2018-02-27 20:06:42 -08008338 qdf_mem_copy(send_ba_req->mac_addr,
8339 csr_session->connectedProfile.bssid.bytes,
8340 QDF_MAC_ADDR_SIZE);
8341 ba_buff = buff_size;
8342 if (!buff_size) {
8343 if (mac_ctx->usr_cfg_ba_buff_size)
8344 ba_buff = mac_ctx->usr_cfg_ba_buff_size;
8345 else
8346 ba_buff = DEFAULT_BA_BUFF_SIZE;
8347 }
8348 send_ba_req->param.vdev_id = session_id;
8349 send_ba_req->param.tidno = tid;
8350 send_ba_req->param.buffersize = ba_buff;
8351 msg.type = WMA_SEND_ADDBA_REQ;
8352 msg.bodyptr = send_ba_req;
gaurank kathpalia36b0c582018-08-28 17:45:43 +05308353 status = scheduler_post_message(QDF_MODULE_ID_SME,
8354 QDF_MODULE_ID_WMA,
8355 QDF_MODULE_ID_WMA, &msg);
Kiran Kumar Lokerebc87bec2018-02-27 20:06:42 -08008356 if (QDF_STATUS_SUCCESS != status) {
Kiran Kumar Lokerebc87bec2018-02-27 20:06:42 -08008357 qdf_mem_free(send_ba_req);
8358 return -EIO;
8359 }
8360 sme_debug("ADDBA_REQ sent to FW: tid %d buff_size %d", tid, ba_buff);
8361
8362 return 0;
8363}
8364
Jeff Johnsonc7309062018-11-09 20:59:42 -08008365int sme_set_no_ack_policy(mac_handle_t mac_handle, uint8_t session_id,
8366 uint8_t val, uint8_t ac)
Kiran Kumar Lokere3324f632018-03-01 21:43:21 -08008367{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08008368 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Kiran Kumar Lokere3324f632018-03-01 21:43:21 -08008369 uint8_t i, set_val;
Arif Hussaineb8ba362018-03-07 19:15:13 -08008370 struct scheduler_msg msg = {0};
8371 QDF_STATUS status;
Kiran Kumar Lokere3324f632018-03-01 21:43:21 -08008372
Srinivas Girigowda5b86fbd2019-03-21 14:54:14 -07008373 if (ac > QCA_WLAN_AC_ALL) {
Kiran Kumar Lokere3324f632018-03-01 21:43:21 -08008374 sme_err("invalid ac val %d", ac);
8375 return -EINVAL;
8376 }
8377 if (val)
8378 set_val = 1;
8379 else
8380 set_val = 0;
Srinivas Girigowda5b86fbd2019-03-21 14:54:14 -07008381 if (ac == QCA_WLAN_AC_ALL) {
Kiran Kumar Lokere3324f632018-03-01 21:43:21 -08008382 for (i = 0; i < ac; i++)
8383 mac_ctx->no_ack_policy_cfg[i] = set_val;
8384 } else {
8385 mac_ctx->no_ack_policy_cfg[ac] = set_val;
8386 }
8387 sme_debug("no ack is set to %d for ac %d", set_val, ac);
Arif Hussaineb8ba362018-03-07 19:15:13 -08008388 qdf_mem_zero(&msg, sizeof(msg));
8389 msg.type = eWNI_SME_UPDATE_EDCA_PROFILE;
8390 msg.reserved = 0;
8391 msg.bodyval = session_id;
gaurank kathpalia36b0c582018-08-28 17:45:43 +05308392 status = scheduler_post_message(QDF_MODULE_ID_SME,
8393 QDF_MODULE_ID_PE,
8394 QDF_MODULE_ID_PE, &msg);
Arif Hussaineb8ba362018-03-07 19:15:13 -08008395 if (status != QDF_STATUS_SUCCESS) {
8396 sme_err("Not able to post update edca profile");
8397 return -EIO;
8398 }
Kiran Kumar Lokere3324f632018-03-01 21:43:21 -08008399
8400 return 0;
8401}
8402
Jeff Johnsonc7309062018-11-09 20:59:42 -08008403int sme_set_auto_rate_he_ltf(mac_handle_t mac_handle, uint8_t session_id,
8404 uint8_t cfg_val)
Kiran Kumar Lokerea006a302018-03-07 20:58:13 -08008405{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08008406 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Kiran Kumar Lokerea006a302018-03-07 20:58:13 -08008407 uint32_t set_val;
8408 uint32_t bit_mask = 0;
8409 int status;
8410
8411 if (cfg_val > QCA_WLAN_HE_LTF_4X) {
8412 sme_err("invalid HE LTF cfg %d", cfg_val);
8413 return -EINVAL;
8414 }
8415
8416 /*set the corresponding HE LTF cfg BIT*/
8417 if (cfg_val == QCA_WLAN_HE_LTF_AUTO)
8418 bit_mask = HE_LTF_ALL;
8419 else
8420 bit_mask = (1 << (cfg_val - 1));
8421
8422 set_val = mac_ctx->he_sgi_ltf_cfg_bit_mask;
8423
8424 SET_AUTO_RATE_HE_LTF_VAL(set_val, bit_mask);
8425
8426 mac_ctx->he_sgi_ltf_cfg_bit_mask = set_val;
8427 status = wma_cli_set_command(session_id,
8428 WMI_VDEV_PARAM_AUTORATE_MISC_CFG,
8429 set_val, VDEV_CMD);
8430 if (status) {
8431 sme_err("failed to set he_ltf_sgi");
8432 return status;
8433 }
8434
8435 sme_debug("HE SGI_LTF is set to 0x%08X",
8436 mac_ctx->he_sgi_ltf_cfg_bit_mask);
8437
8438 return 0;
8439}
8440
Jeff Johnsonc7309062018-11-09 20:59:42 -08008441int sme_set_auto_rate_he_sgi(mac_handle_t mac_handle, uint8_t session_id,
8442 uint8_t cfg_val)
Kiran Kumar Lokerea006a302018-03-07 20:58:13 -08008443{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08008444 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Kiran Kumar Lokerea006a302018-03-07 20:58:13 -08008445 uint32_t set_val;
8446 uint32_t sgi_bit_mask = 0;
8447 int status;
8448
8449 if ((cfg_val > AUTO_RATE_GI_3200NS) ||
8450 (cfg_val < AUTO_RATE_GI_400NS)) {
8451 sme_err("invalid auto rate GI cfg %d", cfg_val);
8452 return -EINVAL;
8453 }
8454
8455 sgi_bit_mask = (1 << cfg_val);
8456
8457 set_val = mac_ctx->he_sgi_ltf_cfg_bit_mask;
8458 SET_AUTO_RATE_SGI_VAL(set_val, sgi_bit_mask);
8459
8460 mac_ctx->he_sgi_ltf_cfg_bit_mask = set_val;
8461 status = wma_cli_set_command(session_id,
8462 WMI_VDEV_PARAM_AUTORATE_MISC_CFG,
8463 set_val, VDEV_CMD);
8464 if (status) {
8465 sme_err("failed to set he_ltf_sgi");
8466 return status;
8467 }
8468
8469 sme_debug("auto rate HE SGI_LTF is set to 0x%08X",
8470 mac_ctx->he_sgi_ltf_cfg_bit_mask);
8471
8472 return 0;
8473}
8474
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008475#define HT20_SHORT_GI_MCS7_RATE 722
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05308476/*
8477 * sme_send_rate_update_ind() -
8478 * API to Update rate
8479 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08008480 * mac_handle - The handle returned by mac_open
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05308481 * rateUpdateParams - Pointer to rate update params
8482 * Return QDF_STATUS
8483 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08008484QDF_STATUS sme_send_rate_update_ind(mac_handle_t mac_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008485 tSirRateUpdateInd *rateUpdateParams)
8486{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08008487 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308488 QDF_STATUS status;
Rajeev Kumar37d478b2017-04-17 16:59:28 -07008489 struct scheduler_msg msg = {0};
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308490 tSirRateUpdateInd *rate_upd = qdf_mem_malloc(sizeof(tSirRateUpdateInd));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008491
Arif Hussain0ef77082018-10-10 16:42:53 -07008492 if (!rate_upd)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308493 return QDF_STATUS_E_FAILURE;
Arif Hussain0ef77082018-10-10 16:42:53 -07008494
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008495 *rate_upd = *rateUpdateParams;
8496
8497 if (rate_upd->mcastDataRate24GHz == HT20_SHORT_GI_MCS7_RATE)
8498 rate_upd->mcastDataRate24GHzTxFlag =
Naveen Rawatea1564b2018-05-17 15:56:11 -07008499 TX_RATE_HT20 | TX_RATE_SGI;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008500 else if (rate_upd->reliableMcastDataRate ==
8501 HT20_SHORT_GI_MCS7_RATE)
8502 rate_upd->reliableMcastDataRateTxFlag =
Naveen Rawatea1564b2018-05-17 15:56:11 -07008503 TX_RATE_HT20 | TX_RATE_SGI;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008504
Jeff Johnson01f2c232018-11-21 19:17:44 -08008505 status = sme_acquire_global_lock(&mac->sme);
Abhinav Kumar009f69f2019-06-05 21:43:31 +05308506 if (QDF_IS_STATUS_ERROR(status)) {
8507 qdf_mem_free(rate_upd);
8508 return status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008509 }
8510
Abhinav Kumar009f69f2019-06-05 21:43:31 +05308511 msg.type = WMA_RATE_UPDATE_IND;
8512 msg.bodyptr = rate_upd;
8513 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
8514 NO_SESSION, msg.type));
8515
8516 status = scheduler_post_message(QDF_MODULE_ID_SME, QDF_MODULE_ID_WMA,
8517 QDF_MODULE_ID_WMA, &msg);
8518 if (QDF_IS_STATUS_ERROR(status)) {
8519 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
8520 "%s: Not able to post WMA_RATE_UPDATE_IND to WMA!",
8521 __func__);
8522 qdf_mem_free(rate_upd);
8523 status = QDF_STATUS_E_FAILURE;
8524 }
8525
8526 sme_release_global_lock(&mac->sme);
8527
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008528 return status;
8529}
8530
8531/**
Kondabattini, Ganeshe4f18e02016-09-13 13:01:22 +05308532 * sme_update_access_policy_vendor_ie() - update vendor ie and access policy.
Jeff Johnsonc7309062018-11-09 20:59:42 -08008533 * @mac_handle: Pointer to the mac context
Kondabattini, Ganeshe4f18e02016-09-13 13:01:22 +05308534 * @session_id: sme session id
8535 * @vendor_ie: vendor ie
8536 * @access_policy: vendor ie access policy
8537 *
8538 * This function updates the vendor ie and access policy to lim.
8539 *
8540 * Return: success or failure.
8541 */
Jeff Johnsonc7309062018-11-09 20:59:42 -08008542QDF_STATUS sme_update_access_policy_vendor_ie(mac_handle_t mac_handle,
8543 uint8_t session_id,
8544 uint8_t *vendor_ie,
8545 int access_policy)
Kondabattini, Ganeshe4f18e02016-09-13 13:01:22 +05308546{
8547 struct sme_update_access_policy_vendor_ie *msg;
8548 uint16_t msg_len;
8549 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Kondabattini, Ganeshe4f18e02016-09-13 13:01:22 +05308550
8551 msg_len = sizeof(*msg);
8552
8553 msg = qdf_mem_malloc(msg_len);
8554 if (!msg) {
Srinivas Girigowda09625b02018-09-10 15:28:09 -07008555 return QDF_STATUS_E_NOMEM;
Kondabattini, Ganeshe4f18e02016-09-13 13:01:22 +05308556 }
8557
Kondabattini, Ganeshe4f18e02016-09-13 13:01:22 +05308558 msg->msg_type = (uint16_t)eWNI_SME_UPDATE_ACCESS_POLICY_VENDOR_IE;
8559 msg->length = (uint16_t)msg_len;
8560
8561 qdf_mem_copy(&msg->ie[0], vendor_ie, sizeof(msg->ie));
8562
8563 msg->sme_session_id = session_id;
8564 msg->access_policy = access_policy;
8565
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07008566 sme_debug("sme_session_id: %hu, access_policy: %d", session_id,
8567 access_policy);
Kondabattini, Ganeshe4f18e02016-09-13 13:01:22 +05308568
Rajeev Kumard138ac52017-01-30 18:38:37 -08008569 status = umac_send_mb_message_to_mac(msg);
Kondabattini, Ganeshe4f18e02016-09-13 13:01:22 +05308570
8571 return status;
8572}
8573
8574/**
Agrawal, Ashish4e5fa1c2016-09-21 19:03:43 +05308575 * sme_update_sta_inactivity_timeout(): Update sta_inactivity_timeout to FW
Jeff Johnsonc7309062018-11-09 20:59:42 -08008576 * @mac_handle: Handle returned by mac_open
Agrawal, Ashish4e5fa1c2016-09-21 19:03:43 +05308577 * @session_id: Session ID on which sta_inactivity_timeout needs
8578 * to be updated to FW
8579 * @sta_inactivity_timeout: sta inactivity timeout.
8580 *
8581 * If a station does not send anything in sta_inactivity_timeout seconds, an
8582 * empty data frame is sent to it in order to verify whether it is
8583 * still in range. If this frame is not ACKed, the station will be
8584 * disassociated and then deauthenticated.
8585 *
8586 * Return: QDF_STATUS_SUCCESS or non-zero on failure.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05308587 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08008588QDF_STATUS sme_update_sta_inactivity_timeout(mac_handle_t mac_handle,
Agrawal, Ashish4e5fa1c2016-09-21 19:03:43 +05308589 struct sme_sta_inactivity_timeout *sta_inactivity_timer)
8590{
8591 struct sme_sta_inactivity_timeout *inactivity_time;
8592 void *wma_handle;
8593
8594 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
8595 inactivity_time = qdf_mem_malloc(sizeof(*inactivity_time));
Arif Hussain0ef77082018-10-10 16:42:53 -07008596 if (!inactivity_time)
Agrawal, Ashish4e5fa1c2016-09-21 19:03:43 +05308597 return QDF_STATUS_E_FAILURE;
Arif Hussain0ef77082018-10-10 16:42:53 -07008598
Abhishek Singhe4a1f882017-08-10 17:59:44 +05308599 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Agrawal, Ashish4e5fa1c2016-09-21 19:03:43 +05308600 FL("sta_inactivity_timeout: %d"),
8601 sta_inactivity_timer->sta_inactivity_timeout);
8602 inactivity_time->session_id = sta_inactivity_timer->session_id;
8603 inactivity_time->sta_inactivity_timeout =
8604 sta_inactivity_timer->sta_inactivity_timeout;
8605
gaurank kathpalia45685492019-06-06 15:38:32 +05308606 wma_update_sta_inactivity_timeout(wma_handle, inactivity_time);
8607 qdf_mem_free(inactivity_time);
Agrawal, Ashish4e5fa1c2016-09-21 19:03:43 +05308608 return QDF_STATUS_SUCCESS;
8609}
8610
8611/**
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008612 * sme_get_reg_info() - To get registration info
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -08008613 * @mac_handle: Opaque handle to the global MAC context
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008614 * @chanId: channel id
8615 * @regInfo1: first reg info to fill
8616 * @regInfo2: second reg info to fill
8617 *
8618 * This routine will give you reg info
8619 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308620 * Return: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008621 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08008622QDF_STATUS sme_get_reg_info(mac_handle_t mac_handle, uint8_t chanId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008623 uint32_t *regInfo1, uint32_t *regInfo2)
8624{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08008625 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308626 QDF_STATUS status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008627 uint8_t i;
8628 bool found = false;
8629
Jeff Johnson01f2c232018-11-21 19:17:44 -08008630 status = sme_acquire_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008631 *regInfo1 = 0;
8632 *regInfo2 = 0;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308633 if (!QDF_IS_STATUS_SUCCESS(status))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008634 return status;
8635
Wu Gao0821b0d2019-01-11 17:31:11 +08008636 for (i = 0; i < CFG_VALID_CHANNEL_LIST_LEN; i++) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08008637 if (mac->scan.defaultPowerTable[i].chan_num == chanId) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008638 SME_SET_CHANNEL_REG_POWER(*regInfo1,
Jeff Johnson01f2c232018-11-21 19:17:44 -08008639 mac->scan.defaultPowerTable[i].tx_power);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008640
8641 SME_SET_CHANNEL_MAX_TX_POWER(*regInfo2,
Jeff Johnson01f2c232018-11-21 19:17:44 -08008642 mac->scan.defaultPowerTable[i].tx_power);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008643 found = true;
8644 break;
8645 }
8646 }
8647 if (!found)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308648 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008649
Jeff Johnson01f2c232018-11-21 19:17:44 -08008650 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008651 return status;
8652}
8653
8654#ifdef FEATURE_WLAN_AUTO_SHUTDOWN
Jeff Johnsonb460dd72018-11-08 10:26:51 -08008655QDF_STATUS sme_set_auto_shutdown_cb(mac_handle_t mac_handle,
Jeff Johnsoneb7bbed2019-02-17 10:34:24 -08008656 void (*callback_fn)(void))
Jeff Johnsonb460dd72018-11-08 10:26:51 -08008657{
Jeff Johnsoneb7bbed2019-02-17 10:34:24 -08008658 QDF_STATUS status;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08008659 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008660
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308661 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008662 "%s: Plug in Auto shutdown event callback", __func__);
8663
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_STATUS_SUCCESS == status) {
Jeff Johnson038efe72019-03-18 13:39:31 -07008666 if (callback_fn)
Jeff Johnsoneb7bbed2019-02-17 10:34:24 -08008667 mac->sme.auto_shutdown_cb = callback_fn;
Jeff Johnson01f2c232018-11-21 19:17:44 -08008668 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008669 }
8670
8671 return status;
8672}
8673
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05308674/*
8675 * sme_set_auto_shutdown_timer() -
8676 * API to set auto shutdown timer value in FW.
8677 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08008678 * mac_handle - The handle returned by mac_open
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05308679 * timer_val - The auto shutdown timer value to be set
8680 * Return Configuration message posting status, SUCCESS or Fail
8681 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08008682QDF_STATUS sme_set_auto_shutdown_timer(mac_handle_t mac_handle,
8683 uint32_t timer_val)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008684{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308685 QDF_STATUS status = QDF_STATUS_SUCCESS;
8686 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08008687 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Jeff Johnsona9ade7d2019-02-17 10:08:17 -08008688 struct auto_shutdown_cmd *auto_sh_cmd;
Rajeev Kumar37d478b2017-04-17 16:59:28 -07008689 struct scheduler_msg message = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008690
Jeff Johnson01f2c232018-11-21 19:17:44 -08008691 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308692 if (QDF_STATUS_SUCCESS == status) {
Jeff Johnsona9ade7d2019-02-17 10:08:17 -08008693 auto_sh_cmd = qdf_mem_malloc(sizeof(*auto_sh_cmd));
Arif Hussain0ef77082018-10-10 16:42:53 -07008694 if (!auto_sh_cmd) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08008695 sme_release_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308696 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008697 }
8698
8699 auto_sh_cmd->timer_val = timer_val;
8700
8701 /* serialize the req through MC thread */
Rajeev Kumar8eaedf62017-01-21 11:03:13 -08008702 message.bodyptr = auto_sh_cmd;
8703 message.type = WMA_SET_AUTO_SHUTDOWN_TIMER_REQ;
gaurank kathpalia36b0c582018-08-28 17:45:43 +05308704 qdf_status = scheduler_post_message(QDF_MODULE_ID_SME,
8705 QDF_MODULE_ID_WMA,
8706 QDF_MODULE_ID_WMA,
8707 &message);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308708 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308709 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008710 "%s: Post Auto shutdown MSG fail", __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308711 qdf_mem_free(auto_sh_cmd);
Jeff Johnson01f2c232018-11-21 19:17:44 -08008712 sme_release_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308713 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008714 }
Abhishek Singhe4a1f882017-08-10 17:59:44 +05308715 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008716 "%s: Posted Auto shutdown MSG", __func__);
Jeff Johnson01f2c232018-11-21 19:17:44 -08008717 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008718 }
8719
8720 return status;
8721}
8722#endif
8723
Nirav Shaheb017be2018-02-15 11:20:58 +05308724#ifdef FEATURE_WLAN_CH_AVOID
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05308725/*
8726 * sme_ch_avoid_update_req() -
8727 * API to request channel avoidance update from FW.
8728 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08008729 * mac_handle - The handle returned by mac_open
Jeff Johnsonc5927de2018-05-11 09:12:53 -07008730 * update_type - The update_type parameter of this request call
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05308731 * Return Configuration message posting status, SUCCESS or Fail
8732 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08008733QDF_STATUS sme_ch_avoid_update_req(mac_handle_t mac_handle)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008734{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308735 QDF_STATUS status = QDF_STATUS_SUCCESS;
8736 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08008737 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008738 tSirChAvoidUpdateReq *cauReq;
Rajeev Kumar37d478b2017-04-17 16:59:28 -07008739 struct scheduler_msg message = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008740
Jeff Johnson01f2c232018-11-21 19:17:44 -08008741 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308742 if (QDF_STATUS_SUCCESS == status) {
Arif Hussain0ef77082018-10-10 16:42:53 -07008743 cauReq = qdf_mem_malloc(sizeof(tSirChAvoidUpdateReq));
8744 if (!cauReq) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08008745 sme_release_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308746 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008747 }
8748
8749 cauReq->reserved_param = 0;
8750
8751 /* serialize the req through MC thread */
Rajeev Kumar8eaedf62017-01-21 11:03:13 -08008752 message.bodyptr = cauReq;
8753 message.type = WMA_CH_AVOID_UPDATE_REQ;
gaurank kathpalia36b0c582018-08-28 17:45:43 +05308754 qdf_status = scheduler_post_message(QDF_MODULE_ID_SME,
8755 QDF_MODULE_ID_WMA,
8756 QDF_MODULE_ID_WMA,
8757 &message);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308758 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308759 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008760 "%s: Post Ch Avoid Update MSG fail",
8761 __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308762 qdf_mem_free(cauReq);
Jeff Johnson01f2c232018-11-21 19:17:44 -08008763 sme_release_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308764 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008765 }
Abhishek Singhe4a1f882017-08-10 17:59:44 +05308766 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008767 "%s: Posted Ch Avoid Update MSG", __func__);
Jeff Johnson01f2c232018-11-21 19:17:44 -08008768 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008769 }
8770
8771 return status;
8772}
Nirav Shaheb017be2018-02-15 11:20:58 +05308773#endif
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008774
8775/**
8776 * sme_set_miracast() - Function to set miracast value to UMAC
Jeff Johnsonc7309062018-11-09 20:59:42 -08008777 * @mac_handle: Handle returned by macOpen
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008778 * @filter_type: 0-Disabled, 1-Source, 2-sink
8779 *
8780 * This function passes down the value of miracast set by
8781 * framework to UMAC
8782 *
8783 * Return: Configuration message posting status, SUCCESS or Fail
8784 *
8785 */
Jeff Johnsonc7309062018-11-09 20:59:42 -08008786QDF_STATUS sme_set_miracast(mac_handle_t mac_handle, uint8_t filter_type)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008787{
Rajeev Kumar37d478b2017-04-17 16:59:28 -07008788 struct scheduler_msg msg = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008789 uint32_t *val;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08008790 struct mac_context *mac_ptr = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008791
Arif Hussain0ef77082018-10-10 16:42:53 -07008792 if (!mac_ptr) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308793 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008794 "%s: Invalid pointer", __func__);
Arif Hussain0ef77082018-10-10 16:42:53 -07008795 return QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008796 }
8797
Arif Hussain0ef77082018-10-10 16:42:53 -07008798 val = qdf_mem_malloc(sizeof(*val));
8799 if (!val)
8800 return QDF_STATUS_E_NOMEM;
8801
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008802 *val = filter_type;
8803
8804 msg.type = SIR_HAL_SET_MIRACAST;
8805 msg.reserved = 0;
8806 msg.bodyptr = val;
8807
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308808 if (!QDF_IS_STATUS_SUCCESS(
gaurank kathpalia36b0c582018-08-28 17:45:43 +05308809 scheduler_post_message(QDF_MODULE_ID_SME,
8810 QDF_MODULE_ID_WMA,
8811 QDF_MODULE_ID_WMA,
8812 &msg))) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308813 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008814 "%s: Not able to post WDA_SET_MAS_ENABLE_DISABLE to WMA!",
8815 __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308816 qdf_mem_free(val);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308817 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008818 }
8819
8820 mac_ptr->sme.miracast_value = filter_type;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308821 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008822}
8823
8824/**
8825 * sme_set_mas() - Function to set MAS value to UMAC
8826 * @val: 1-Enable, 0-Disable
8827 *
8828 * This function passes down the value of MAS to the UMAC. A
8829 * value of 1 will enable MAS and a value of 0 will disable MAS
8830 *
8831 * Return: Configuration message posting status, SUCCESS or Fail
8832 *
8833 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308834QDF_STATUS sme_set_mas(uint32_t val)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008835{
Rajeev Kumar37d478b2017-04-17 16:59:28 -07008836 struct scheduler_msg msg = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008837 uint32_t *ptr_val;
8838
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308839 ptr_val = qdf_mem_malloc(sizeof(*ptr_val));
Arif Hussain0ef77082018-10-10 16:42:53 -07008840 if (!ptr_val)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308841 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008842
8843 *ptr_val = val;
8844
8845 msg.type = SIR_HAL_SET_MAS;
8846 msg.reserved = 0;
8847 msg.bodyptr = ptr_val;
8848
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308849 if (!QDF_IS_STATUS_SUCCESS(
gaurank kathpalia36b0c582018-08-28 17:45:43 +05308850 scheduler_post_message(QDF_MODULE_ID_SME,
8851 QDF_MODULE_ID_WMA,
8852 QDF_MODULE_ID_WMA,
8853 &msg))) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308854 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008855 "%s: Not able to post WDA_SET_MAS_ENABLE_DISABLE to WMA!",
8856 __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308857 qdf_mem_free(ptr_val);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308858 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008859 }
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308860 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008861}
8862
Kiran Kumar Lokere999e58c2016-01-07 02:18:39 -08008863/**
8864 * sme_roam_channel_change_req() - Channel change to new target channel
Jeff Johnsonb460dd72018-11-08 10:26:51 -08008865 * @mac_handle: handle returned by mac_open
Kiran Kumar Lokere999e58c2016-01-07 02:18:39 -08008866 * @bssid: mac address of BSS
8867 * @ch_params: target channel information
8868 * @profile: CSR profile
8869 *
8870 * API to Indicate Channel change to new target channel
8871 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308872 * Return: QDF_STATUS
Kiran Kumar Lokere999e58c2016-01-07 02:18:39 -08008873 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08008874QDF_STATUS sme_roam_channel_change_req(mac_handle_t mac_handle,
Amar Singhale4f28ee2015-10-21 14:36:56 -07008875 struct qdf_mac_addr bssid,
Amar Singhal5cccafe2017-02-15 12:42:58 -08008876 struct ch_params *ch_params,
Jeff Johnson66ee8a92018-03-17 15:24:26 -07008877 struct csr_roam_profile *profile)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008878{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308879 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08008880 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008881
Jeff Johnson01f2c232018-11-21 19:17:44 -08008882 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308883 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008884
Jeff Johnson01f2c232018-11-21 19:17:44 -08008885 status = csr_roam_channel_change_req(mac, bssid, ch_params,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008886 profile);
Jeff Johnson01f2c232018-11-21 19:17:44 -08008887 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008888 }
8889 return status;
8890}
8891
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05308892/*
8893 * sme_process_channel_change_resp() -
8894 * API to Indicate Channel change response message to SAP.
8895 *
8896 * Return QDF_STATUS
8897 */
Jeff Johnson0a8786a2018-12-02 10:49:01 -08008898static QDF_STATUS sme_process_channel_change_resp(struct mac_context *mac,
Pragaspathi Thilagaraj469495b2019-05-30 00:18:31 +05308899 uint16_t msg_type, void *msg_buf)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008900{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308901 QDF_STATUS status = QDF_STATUS_SUCCESS;
Min Liu3621ede2018-11-07 18:36:00 +08008902 struct csr_roam_info *roam_info;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008903 eCsrRoamResult roamResult;
Pragaspathi Thilagaraj469495b2019-05-30 00:18:31 +05308904 tpSwitchChannelParams pChnlParams = (tpSwitchChannelParams) msg_buf;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008905 uint32_t SessionId = pChnlParams->peSessionId;
8906
Min Liu3621ede2018-11-07 18:36:00 +08008907 roam_info = qdf_mem_malloc(sizeof(*roam_info));
8908 if (!roam_info)
8909 return QDF_STATUS_E_NOMEM;
8910
8911 roam_info->channelChangeRespEvent =
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308912 qdf_mem_malloc(sizeof(tSirChanChangeResponse));
Min Liu3621ede2018-11-07 18:36:00 +08008913 if (!roam_info->channelChangeRespEvent) {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308914 status = QDF_STATUS_E_NOMEM;
Min Liu3621ede2018-11-07 18:36:00 +08008915 qdf_mem_free(roam_info);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008916 return status;
8917 }
8918 if (msg_type == eWNI_SME_CHANNEL_CHANGE_RSP) {
Min Liu3621ede2018-11-07 18:36:00 +08008919 roam_info->channelChangeRespEvent->sessionId = SessionId;
8920 roam_info->channelChangeRespEvent->newChannelNumber =
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008921 pChnlParams->channelNumber;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008922
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308923 if (pChnlParams->status == QDF_STATUS_SUCCESS) {
Abhishek Singhe4a1f882017-08-10 17:59:44 +05308924 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008925 "sapdfs: Received success eWNI_SME_CHANNEL_CHANGE_RSP for sessionId[%d]",
8926 SessionId);
Min Liu3621ede2018-11-07 18:36:00 +08008927 roam_info->channelChangeRespEvent->channelChangeStatus =
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008928 1;
8929 roamResult = eCSR_ROAM_RESULT_CHANNEL_CHANGE_SUCCESS;
8930 } else {
Abhishek Singhe4a1f882017-08-10 17:59:44 +05308931 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008932 "sapdfs: Received failure eWNI_SME_CHANNEL_CHANGE_RSP for sessionId[%d]",
8933 SessionId);
Min Liu3621ede2018-11-07 18:36:00 +08008934 roam_info->channelChangeRespEvent->channelChangeStatus =
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008935 0;
8936 roamResult = eCSR_ROAM_RESULT_CHANNEL_CHANGE_FAILURE;
8937 }
8938
Min Liu3621ede2018-11-07 18:36:00 +08008939 csr_roam_call_callback(mac, SessionId, roam_info, 0,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008940 eCSR_ROAM_SET_CHANNEL_RSP, roamResult);
8941
8942 } else {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308943 status = QDF_STATUS_E_FAILURE;
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07008944 sme_err("Invalid Channel Change Resp Message: %d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008945 status);
8946 }
Min Liu3621ede2018-11-07 18:36:00 +08008947 qdf_mem_free(roam_info->channelChangeRespEvent);
8948 qdf_mem_free(roam_info);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008949
8950 return status;
8951}
8952
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05308953/*
8954 * sme_roam_start_beacon_req() -
8955 * API to Indicate LIM to start Beacon Tx after SAP CAC Wait is completed.
8956 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08008957 * mac_handle - The handle returned by mac_open
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05308958 * sessionId - session ID
8959 * dfsCacWaitStatus - CAC WAIT status flag
8960 * Return QDF_STATUS
8961 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08008962QDF_STATUS sme_roam_start_beacon_req(mac_handle_t mac_handle,
Jeff Johnson1f2dabc2018-11-07 15:33:01 -08008963 struct qdf_mac_addr bssid,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008964 uint8_t dfsCacWaitStatus)
8965{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308966 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08008967 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05308968
Jeff Johnson01f2c232018-11-21 19:17:44 -08008969 status = sme_acquire_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008970
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308971 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08008972 status = csr_roam_start_beacon_req(mac, bssid,
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05308973 dfsCacWaitStatus);
Jeff Johnson01f2c232018-11-21 19:17:44 -08008974 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008975 }
8976 return status;
8977}
8978
Jeff Johnson0a8786a2018-12-02 10:49:01 -08008979QDF_STATUS sme_csa_restart(struct mac_context *mac_ctx, uint8_t session_id)
Abhishek Singh20a8e442018-09-12 15:50:44 +05308980{
8981 QDF_STATUS status = QDF_STATUS_E_FAILURE;
8982
8983 status = sme_acquire_global_lock(&mac_ctx->sme);
8984 if (QDF_IS_STATUS_SUCCESS(status)) {
8985 status = csr_csa_restart(mac_ctx, session_id);
8986 sme_release_global_lock(&mac_ctx->sme);
8987 }
8988
8989 return status;
8990}
Abhishek Singh20a8e442018-09-12 15:50:44 +05308991
Kiran Kumar Lokere999e58c2016-01-07 02:18:39 -08008992/**
8993 * sme_roam_csa_ie_request() - request CSA IE transmission from PE
Jeff Johnsonb460dd72018-11-08 10:26:51 -08008994 * @mac_handle: handle returned by mac_open
Kiran Kumar Lokere999e58c2016-01-07 02:18:39 -08008995 * @bssid: SAP bssid
8996 * @targetChannel: target channel information
8997 * @csaIeReqd: CSA IE Request
8998 * @ch_params: channel information
8999 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309000 * Return: QDF_STATUS
Kiran Kumar Lokere999e58c2016-01-07 02:18:39 -08009001 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08009002QDF_STATUS sme_roam_csa_ie_request(mac_handle_t mac_handle,
9003 struct qdf_mac_addr bssid,
9004 uint8_t targetChannel, uint8_t csaIeReqd,
9005 struct ch_params *ch_params)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009006{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309007 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08009008 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05309009
Jeff Johnson01f2c232018-11-21 19:17:44 -08009010 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309011 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08009012 status = csr_roam_send_chan_sw_ie_request(mac, bssid,
Kiran Kumar Lokere999e58c2016-01-07 02:18:39 -08009013 targetChannel, csaIeReqd, ch_params);
Jeff Johnson01f2c232018-11-21 19:17:44 -08009014 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009015 }
9016 return status;
9017}
9018
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05309019/*
9020 * sme_init_thermal_info() -
9021 * SME API to initialize the thermal mitigation parameters
9022 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08009023 * mac_handle
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05309024 * thermalParam : thermal mitigation parameters
9025 * Return QDF_STATUS
9026 */
Manikandan Mohan9045e2e2018-11-26 16:44:19 -08009027QDF_STATUS sme_init_thermal_info(mac_handle_t mac_handle)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009028{
9029 t_thermal_mgmt *pWmaParam;
Rajeev Kumar37d478b2017-04-17 16:59:28 -07009030 struct scheduler_msg msg = {0};
Jeff Johnson0a8786a2018-12-02 10:49:01 -08009031 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Manikandan Mohan9045e2e2018-11-26 16:44:19 -08009032 struct wlan_fwol_thermal_temp thermal_temp = {0};
9033 QDF_STATUS status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009034
Arif Hussain0ef77082018-10-10 16:42:53 -07009035 pWmaParam = qdf_mem_malloc(sizeof(t_thermal_mgmt));
9036 if (!pWmaParam)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309037 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009038
Manikandan Mohan9045e2e2018-11-26 16:44:19 -08009039 status = ucfg_fwol_get_thermal_temp(mac->psoc, &thermal_temp);
9040 if (QDF_IS_STATUS_ERROR(status))
9041 return qdf_status_to_os_return(status);
9042
9043 pWmaParam->thermalMgmtEnabled = thermal_temp.thermal_mitigation_enable;
9044 pWmaParam->throttlePeriod = thermal_temp.throttle_period;
Poddar, Siddarth83905022016-04-16 17:56:08 -07009045
9046 pWmaParam->throttle_duty_cycle_tbl[0] =
Manikandan Mohan9045e2e2018-11-26 16:44:19 -08009047 thermal_temp.throttle_dutycycle_level[0];
Poddar, Siddarth83905022016-04-16 17:56:08 -07009048 pWmaParam->throttle_duty_cycle_tbl[1] =
Manikandan Mohan9045e2e2018-11-26 16:44:19 -08009049 thermal_temp.throttle_dutycycle_level[1];
Poddar, Siddarth83905022016-04-16 17:56:08 -07009050 pWmaParam->throttle_duty_cycle_tbl[2] =
Manikandan Mohan9045e2e2018-11-26 16:44:19 -08009051 thermal_temp.throttle_dutycycle_level[2];
Poddar, Siddarth83905022016-04-16 17:56:08 -07009052 pWmaParam->throttle_duty_cycle_tbl[3] =
Manikandan Mohan9045e2e2018-11-26 16:44:19 -08009053 thermal_temp.throttle_dutycycle_level[3];
Poddar, Siddarth83905022016-04-16 17:56:08 -07009054
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009055 pWmaParam->thermalLevels[0].minTempThreshold =
Manikandan Mohan9045e2e2018-11-26 16:44:19 -08009056 thermal_temp.thermal_temp_min_level[0];
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009057 pWmaParam->thermalLevels[0].maxTempThreshold =
Manikandan Mohan9045e2e2018-11-26 16:44:19 -08009058 thermal_temp.thermal_temp_max_level[0];
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009059 pWmaParam->thermalLevels[1].minTempThreshold =
Manikandan Mohan9045e2e2018-11-26 16:44:19 -08009060 thermal_temp.thermal_temp_min_level[1];
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009061 pWmaParam->thermalLevels[1].maxTempThreshold =
Manikandan Mohan9045e2e2018-11-26 16:44:19 -08009062 thermal_temp.thermal_temp_max_level[1];
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009063 pWmaParam->thermalLevels[2].minTempThreshold =
Manikandan Mohan9045e2e2018-11-26 16:44:19 -08009064 thermal_temp.thermal_temp_min_level[2];
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009065 pWmaParam->thermalLevels[2].maxTempThreshold =
Manikandan Mohan9045e2e2018-11-26 16:44:19 -08009066 thermal_temp.thermal_temp_max_level[2];
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009067 pWmaParam->thermalLevels[3].minTempThreshold =
Manikandan Mohan9045e2e2018-11-26 16:44:19 -08009068 thermal_temp.thermal_temp_min_level[3];
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009069 pWmaParam->thermalLevels[3].maxTempThreshold =
Manikandan Mohan9045e2e2018-11-26 16:44:19 -08009070 thermal_temp.thermal_temp_max_level[3];
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009071
Jeff Johnson01f2c232018-11-21 19:17:44 -08009072 if (QDF_STATUS_SUCCESS == sme_acquire_global_lock(&mac->sme)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009073 msg.type = WMA_INIT_THERMAL_INFO_CMD;
9074 msg.bodyptr = pWmaParam;
9075
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309076 if (!QDF_IS_STATUS_SUCCESS
gaurank kathpalia36b0c582018-08-28 17:45:43 +05309077 (scheduler_post_message(QDF_MODULE_ID_SME,
9078 QDF_MODULE_ID_WMA,
9079 QDF_MODULE_ID_WMA,
9080 &msg))) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05309081 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009082 "%s: Not able to post WMA_SET_THERMAL_INFO_CMD to WMA!",
9083 __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05309084 qdf_mem_free(pWmaParam);
Jeff Johnson01f2c232018-11-21 19:17:44 -08009085 sme_release_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309086 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009087 }
Jeff Johnson01f2c232018-11-21 19:17:44 -08009088 sme_release_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309089 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009090 }
Anurag Chouhan600c3a02016-03-01 10:33:54 +05309091 qdf_mem_free(pWmaParam);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309092 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009093}
9094
9095/**
9096 * sme_add_set_thermal_level_callback() - Plug in set thermal level callback
Jeff Johnsonc7309062018-11-09 20:59:42 -08009097 * @mac_handle: Handle returned by macOpen
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009098 * @callback: sme_set_thermal_level_callback
9099 *
9100 * Plug in set thermal level callback
9101 *
9102 * Return: none
9103 */
Jeff Johnsonc7309062018-11-09 20:59:42 -08009104void sme_add_set_thermal_level_callback(mac_handle_t mac_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009105 sme_set_thermal_level_callback callback)
9106{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08009107 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009108
Jeff Johnson01f2c232018-11-21 19:17:44 -08009109 mac->sme.set_thermal_level_cb = callback;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009110}
9111
9112/**
9113 * sme_set_thermal_level() - SME API to set the thermal mitigation level
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -08009114 * @mac_handle: Opaque handle to the global MAC context
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009115 * @level: Thermal mitigation level
9116 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309117 * Return: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009118 */
Jeff Johnsonc7309062018-11-09 20:59:42 -08009119QDF_STATUS sme_set_thermal_level(mac_handle_t mac_handle, uint8_t level)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009120{
Rajeev Kumar37d478b2017-04-17 16:59:28 -07009121 struct scheduler_msg msg = {0};
Jeff Johnson0a8786a2018-12-02 10:49:01 -08009122 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309123 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009124
Jeff Johnson01f2c232018-11-21 19:17:44 -08009125 if (QDF_STATUS_SUCCESS == sme_acquire_global_lock(&mac->sme)) {
hangtian127c9532019-01-12 13:29:07 +08009126 qdf_mem_zero(&msg, sizeof(msg));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009127 msg.type = WMA_SET_THERMAL_LEVEL;
9128 msg.bodyval = level;
9129
gaurank kathpalia36b0c582018-08-28 17:45:43 +05309130 qdf_status = scheduler_post_message(QDF_MODULE_ID_SME,
9131 QDF_MODULE_ID_WMA,
9132 QDF_MODULE_ID_WMA, &msg);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309133 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05309134 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009135 "%s: Not able to post WMA_SET_THERMAL_LEVEL to WMA!",
9136 __func__);
Jeff Johnson01f2c232018-11-21 19:17:44 -08009137 sme_release_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309138 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009139 }
Jeff Johnson01f2c232018-11-21 19:17:44 -08009140 sme_release_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309141 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009142 }
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309143 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009144}
9145
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05309146/*
9147 * sme_txpower_limit() -
9148 * SME API to set txpower limits
9149 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08009150 * mac_handle
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05309151 * psmetx : power limits for 2g/5g
9152 * Return QDF_STATUS
9153 */
Jeff Johnson19ce8d02019-02-08 22:56:23 -08009154QDF_STATUS sme_txpower_limit(mac_handle_t mac_handle,
9155 struct tx_power_limit *psmetx)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009156{
Abhinav Kumar009f69f2019-06-05 21:43:31 +05309157 QDF_STATUS status;
Rajeev Kumar37d478b2017-04-17 16:59:28 -07009158 struct scheduler_msg message = {0};
Jeff Johnson0a8786a2018-12-02 10:49:01 -08009159 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Jeff Johnson19ce8d02019-02-08 22:56:23 -08009160 struct tx_power_limit *tx_power_limit;
Prashanth Bhatta75fa9a12016-01-11 18:30:08 -08009161
Anurag Chouhan600c3a02016-03-01 10:33:54 +05309162 tx_power_limit = qdf_mem_malloc(sizeof(*tx_power_limit));
Arif Hussain0ef77082018-10-10 16:42:53 -07009163 if (!tx_power_limit)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309164 return QDF_STATUS_E_FAILURE;
Prashanth Bhatta75fa9a12016-01-11 18:30:08 -08009165
9166 *tx_power_limit = *psmetx;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009167
Jeff Johnson01f2c232018-11-21 19:17:44 -08009168 status = sme_acquire_global_lock(&mac->sme);
Abhinav Kumar009f69f2019-06-05 21:43:31 +05309169 if (QDF_IS_STATUS_ERROR(status)) {
9170 qdf_mem_free(tx_power_limit);
9171 return status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009172 }
Abhinav Kumar009f69f2019-06-05 21:43:31 +05309173
9174 message.type = WMA_TX_POWER_LIMIT;
9175 message.bodyptr = tx_power_limit;
9176 status = scheduler_post_message(QDF_MODULE_ID_SME, QDF_MODULE_ID_WMA,
9177 QDF_MODULE_ID_WMA, &message);
9178 if (QDF_IS_STATUS_ERROR(status)) {
9179 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
9180 "%s: not able to post WMA_TX_POWER_LIMIT",
9181 __func__);
9182 status = QDF_STATUS_E_FAILURE;
9183 qdf_mem_free(tx_power_limit);
9184 }
9185
9186 sme_release_global_lock(&mac->sme);
9187
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009188 return status;
9189}
9190
Jeff Johnsonb460dd72018-11-08 10:26:51 -08009191QDF_STATUS sme_update_connect_debug(mac_handle_t mac_handle, uint32_t set_value)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009192{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309193 QDF_STATUS status = QDF_STATUS_SUCCESS;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08009194 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05309195
Jeff Johnson01f2c232018-11-21 19:17:44 -08009196 mac->mlme_cfg->gen.debug_packet_log = set_value;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009197 return status;
9198}
9199
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05309200/*
9201 * sme_ap_disable_intra_bss_fwd() -
9202 * SME will send message to WMA to set Intra BSS in txrx
9203 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08009204 * mac_handle - The handle returned by mac_open
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05309205 * sessionId - session id ( vdev id)
9206 * disablefwd - bool value that indicate disable intrabss fwd disable
9207 * Return QDF_STATUS
9208 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08009209QDF_STATUS sme_ap_disable_intra_bss_fwd(mac_handle_t mac_handle,
9210 uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009211 bool disablefwd)
9212{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08009213 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309214 int status = QDF_STATUS_SUCCESS;
9215 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Rajeev Kumar37d478b2017-04-17 16:59:28 -07009216 struct scheduler_msg message = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009217 tpDisableIntraBssFwd pSapDisableIntraFwd = NULL;
9218
9219 /* Prepare the request to send to SME. */
Anurag Chouhan600c3a02016-03-01 10:33:54 +05309220 pSapDisableIntraFwd = qdf_mem_malloc(sizeof(tDisableIntraBssFwd));
Jeff Johnson038efe72019-03-18 13:39:31 -07009221 if (!pSapDisableIntraFwd) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07009222 sme_err("Memory Allocation Failure!!!");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309223 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009224 }
9225
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009226 pSapDisableIntraFwd->sessionId = sessionId;
9227 pSapDisableIntraFwd->disableintrabssfwd = disablefwd;
9228
Jeff Johnson01f2c232018-11-21 19:17:44 -08009229 status = sme_acquire_global_lock(&mac->sme);
gaurank kathpalia45685492019-06-06 15:38:32 +05309230
9231 if (QDF_IS_STATUS_ERROR(status)) {
9232 qdf_mem_free(pSapDisableIntraFwd);
9233 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009234 }
gaurank kathpalia45685492019-06-06 15:38:32 +05309235 /* serialize the req through MC thread */
9236 message.bodyptr = pSapDisableIntraFwd;
9237 message.type = WMA_SET_SAP_INTRABSS_DIS;
9238 qdf_status = scheduler_post_message(QDF_MODULE_ID_SME,
9239 QDF_MODULE_ID_WMA,
9240 QDF_MODULE_ID_WMA,
9241 &message);
9242 if (QDF_IS_STATUS_ERROR(status)) {
9243 status = QDF_STATUS_E_FAILURE;
9244 qdf_mem_free(pSapDisableIntraFwd);
9245 }
9246 sme_release_global_lock(&mac->sme);
9247
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009248 return status;
9249}
9250
9251#ifdef WLAN_FEATURE_STATS_EXT
9252
Jeff Johnson45843652018-07-04 12:47:34 -07009253void sme_stats_ext_register_callback(mac_handle_t mac_handle,
9254 stats_ext_cb callback)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009255{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08009256 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009257
Jeff Johnson45843652018-07-04 12:47:34 -07009258 if (!mac) {
9259 sme_err("Invalid mac context");
Arun Khandavalli4b55da72016-07-19 19:55:01 +05309260 return;
9261 }
9262
Jeff Johnson45843652018-07-04 12:47:34 -07009263 mac->sme.stats_ext_cb = callback;
Arun Khandavalli4b55da72016-07-19 19:55:01 +05309264}
9265
Jeff Johnson45843652018-07-04 12:47:34 -07009266void sme_stats_ext_deregister_callback(mac_handle_t mac_handle)
9267{
9268 sme_stats_ext_register_callback(mac_handle, NULL);
9269}
9270
9271void sme_stats_ext2_register_callback(mac_handle_t mac_handle,
9272 stats_ext2_cb callback)
9273{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08009274 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Jeff Johnson45843652018-07-04 12:47:34 -07009275
9276 if (!mac) {
9277 sme_err("Invalid mac context");
9278 return;
9279 }
9280
9281 mac->sme.stats_ext2_cb = callback;
9282}
Arun Khandavalli4b55da72016-07-19 19:55:01 +05309283
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05309284/*
9285 * sme_stats_ext_request() -
9286 * Function called when HDD receives STATS EXT vendor command from userspace
9287 *
9288 * sessionID - vdevID for the stats ext request
9289 * input - Stats Ext Request structure ptr
9290 * Return QDF_STATUS
9291 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309292QDF_STATUS sme_stats_ext_request(uint8_t session_id, tpStatsExtRequestReq input)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009293{
Rajeev Kumar37d478b2017-04-17 16:59:28 -07009294 struct scheduler_msg msg = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009295 tpStatsExtRequest data;
9296 size_t data_len;
9297
9298 data_len = sizeof(tStatsExtRequest) + input->request_data_len;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05309299 data = qdf_mem_malloc(data_len);
Arif Hussain0ef77082018-10-10 16:42:53 -07009300 if (!data)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309301 return QDF_STATUS_E_NOMEM;
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05309302
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009303 data->vdev_id = session_id;
9304 data->request_data_len = input->request_data_len;
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05309305 if (input->request_data_len)
Anurag Chouhan600c3a02016-03-01 10:33:54 +05309306 qdf_mem_copy(data->request_data,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009307 input->request_data, input->request_data_len);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009308
9309 msg.type = WMA_STATS_EXT_REQUEST;
9310 msg.reserved = 0;
9311 msg.bodyptr = data;
9312
gaurank kathpalia36b0c582018-08-28 17:45:43 +05309313 if (QDF_STATUS_SUCCESS != scheduler_post_message(QDF_MODULE_ID_SME,
9314 QDF_MODULE_ID_WMA,
9315 QDF_MODULE_ID_WMA,
9316 &msg)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05309317 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009318 "%s: Not able to post WMA_STATS_EXT_REQUEST message to WMA",
9319 __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05309320 qdf_mem_free(data);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309321 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009322 }
9323
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309324 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009325}
9326
Jeff Johnsonfdecd512018-06-10 09:18:32 -07009327/**
9328 * sme_stats_ext_event() - eWNI_SME_STATS_EXT_EVENT processor
9329 * @mac: Global MAC context
9330 * @msg: "stats ext" message
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009331
Jeff Johnsonfdecd512018-06-10 09:18:32 -07009332 * This callback function called when SME received eWNI_SME_STATS_EXT_EVENT
9333 * response from WMA
9334 *
9335 * Return: QDF_STATUS
9336 */
Jeff Johnson0a8786a2018-12-02 10:49:01 -08009337static QDF_STATUS sme_stats_ext_event(struct mac_context *mac,
Jeff Johnson45843652018-07-04 12:47:34 -07009338 struct stats_ext_event *msg)
Jeff Johnsonfdecd512018-06-10 09:18:32 -07009339{
9340 if (!msg) {
9341 sme_err("Null msg");
9342 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009343 }
9344
Jeff Johnson45843652018-07-04 12:47:34 -07009345 if (mac->sme.stats_ext_cb)
9346 mac->sme.stats_ext_cb(mac->hdd_handle, msg);
Jeff Johnsonfdecd512018-06-10 09:18:32 -07009347
9348 return QDF_STATUS_SUCCESS;
9349}
9350
9351#else
9352
Jeff Johnson0a8786a2018-12-02 10:49:01 -08009353static QDF_STATUS sme_stats_ext_event(struct mac_context *mac,
Jeff Johnson45843652018-07-04 12:47:34 -07009354 struct stats_ext_event *msg)
Jeff Johnsonfdecd512018-06-10 09:18:32 -07009355{
9356 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009357}
9358
9359#endif
9360
Qun Zhangef655622019-02-25 10:48:10 +08009361#ifdef FEATURE_FW_STATE
9362QDF_STATUS sme_get_fw_state(mac_handle_t mac_handle,
9363 fw_state_callback callback,
9364 void *context)
9365{
9366 QDF_STATUS status;
9367 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
9368 tp_wma_handle wma_handle;
9369
9370 SME_ENTER();
9371
9372 mac_ctx->sme.fw_state_cb = callback;
9373 mac_ctx->sme.fw_state_context = context;
9374 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
9375 status = wma_get_fw_state(wma_handle);
9376
9377 SME_EXIT();
9378 return status;
9379}
9380
9381/**
9382 * sme_fw_state_resp() - eWNI_SME_FW_STATUS_IND processor
9383 * @mac: Global MAC context
9384
9385 * This callback function called when SME received eWNI_SME_FW_STATUS_IND
9386 * response from WMA
9387 *
9388 * Return: QDF_STATUS
9389 */
9390static QDF_STATUS sme_fw_state_resp(struct mac_context *mac)
9391{
9392 if (mac->sme.fw_state_cb)
9393 mac->sme.fw_state_cb(mac->sme.fw_state_context);
9394 mac->sme.fw_state_cb = NULL;
9395 mac->sme.fw_state_context = NULL;
9396
9397 return QDF_STATUS_SUCCESS;
9398}
9399
9400#else /* FEATURE_FW_STATE */
9401static QDF_STATUS sme_fw_state_resp(struct mac_context *mac)
9402{
9403 return QDF_STATUS_SUCCESS;
9404}
9405
9406#endif /* FEATURE_FW_STATE */
9407
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05309408/*
9409 * sme_update_dfs_scan_mode() -
9410 * Update DFS roam scan mode
9411 * This function is called through dynamic setConfig callback function
9412 * to configure allowDFSChannelRoam.
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -08009413 * mac_handle: Opaque handle to the global MAC context
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05309414 * sessionId - Session Identifier
9415 * allowDFSChannelRoam - DFS roaming scan mode 0 (disable),
9416 * 1 (passive), 2 (active)
9417 * Return QDF_STATUS_SUCCESS - SME update DFS roaming scan config
9418 * successfully.
9419 * Other status means SME failed to update DFS roaming scan config.
9420 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08009421QDF_STATUS sme_update_dfs_scan_mode(mac_handle_t mac_handle, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009422 uint8_t allowDFSChannelRoam)
9423{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08009424 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309425 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009426
Dustin Brownad06be62019-02-04 14:52:56 -08009427 if (sessionId >= WLAN_MAX_VDEVS) {
Naveen Rawatc36f7eb2016-11-10 20:01:03 -08009428 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
9429 FL("Invalid sme session id: %d"), sessionId);
9430 return QDF_STATUS_E_INVAL;
9431 }
9432
Jeff Johnson01f2c232018-11-21 19:17:44 -08009433 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309434 if (QDF_IS_STATUS_SUCCESS(status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05309435 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05309436 "LFR runtime successfully set AllowDFSChannelRoam Mode to %d - old value is %d - roam state is %s",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009437 allowDFSChannelRoam,
Wu Gao51a63562018-11-08 16:29:10 +08009438 mac->mlme_cfg->lfr.roaming_dfs_channel,
Jeff Johnson01f2c232018-11-21 19:17:44 -08009439 mac_trace_get_neighbour_roam_state(mac->roam.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009440 neighborRoamInfo
9441 [sessionId].
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05309442 neighborRoamState));
Wu Gao51a63562018-11-08 16:29:10 +08009443 mac->mlme_cfg->lfr.roaming_dfs_channel =
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009444 allowDFSChannelRoam;
Wu Gao51a63562018-11-08 16:29:10 +08009445 if (mac->mlme_cfg->lfr.roam_scan_offload_enabled) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08009446 csr_roam_offload_scan(mac, sessionId,
Vignesh Viswanathan4e65e8e2018-05-01 12:04:16 +05309447 ROAM_SCAN_OFFLOAD_UPDATE_CFG,
9448 REASON_ROAM_DFS_SCAN_MODE_CHANGED);
9449 }
Jeff Johnson01f2c232018-11-21 19:17:44 -08009450 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009451 }
Vignesh Viswanathan4e65e8e2018-05-01 12:04:16 +05309452
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009453
9454 return status;
9455}
9456
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05309457/*
9458 * sme_get_dfs_scan_mode() - get DFS roam scan mode
9459 * This is a synchronous call
9460 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08009461 * mac_handle - The handle returned by mac_open.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05309462 * Return DFS roaming scan mode 0 (disable), 1 (passive), 2 (active)
9463 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08009464uint8_t sme_get_dfs_scan_mode(mac_handle_t mac_handle)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009465{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08009466 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05309467
Wu Gao51a63562018-11-08 16:29:10 +08009468 return mac->mlme_cfg->lfr.roaming_dfs_channel;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009469}
9470
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05309471/*
9472 * sme_modify_add_ie() -
9473 * This function sends msg to updates the additional IE buffers in PE
9474 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08009475 * mac_handle - global structure
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05309476 * pModifyIE - pointer to tModifyIE structure
9477 * updateType - type of buffer
9478 * Return Success or failure
9479 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08009480QDF_STATUS sme_modify_add_ie(mac_handle_t mac_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009481 tSirModifyIE *pModifyIE, eUpdateIEsType updateType)
9482{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309483 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08009484 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05309485
Jeff Johnson01f2c232018-11-21 19:17:44 -08009486 status = sme_acquire_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009487
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309488 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08009489 status = csr_roam_modify_add_ies(mac, pModifyIE, updateType);
9490 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009491 }
9492 return status;
9493}
9494
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05309495/*
9496 * sme_update_add_ie() -
9497 * This function sends msg to updates the additional IE buffers in PE
9498 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08009499 * mac_handle - global structure
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05309500 * pUpdateIE - pointer to structure tUpdateIE
9501 * updateType - type of buffer
9502 * Return Success or failure
9503 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08009504QDF_STATUS sme_update_add_ie(mac_handle_t mac_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009505 tSirUpdateIE *pUpdateIE, eUpdateIEsType updateType)
9506{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309507 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08009508 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05309509
Jeff Johnson01f2c232018-11-21 19:17:44 -08009510 status = sme_acquire_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009511
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309512 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08009513 status = csr_roam_update_add_ies(mac, pUpdateIE, updateType);
9514 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009515 }
9516 return status;
9517}
9518
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009519/**
9520 * sme_update_dsc_pto_up_mapping()
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -08009521 * @mac_handle: Opaque handle to the global MAC context
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009522 * @dscpmapping: pointer to DSCP mapping structure
9523 * @sessionId: SME session id
9524 *
9525 * This routine is called to update dscp mapping
9526 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309527 * Return: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009528 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08009529QDF_STATUS sme_update_dsc_pto_up_mapping(mac_handle_t mac_handle,
Abhishek Singh12be60f2017-08-11 13:52:42 +05309530 enum sme_qos_wmmuptype *dscpmapping,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009531 uint8_t sessionId)
9532{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08009533 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309534 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009535 uint8_t i, j, peSessionId;
gaurank kathpalia14e2f912017-08-31 14:51:45 +05309536 struct csr_roam_session *pCsrSession = NULL;
Jeff Johnson59104482018-11-18 21:30:19 -08009537 struct pe_session *pSession = NULL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009538
Jeff Johnson01f2c232018-11-21 19:17:44 -08009539 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309540 if (!QDF_IS_STATUS_SUCCESS(status))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009541 return status;
Jeff Johnson01f2c232018-11-21 19:17:44 -08009542 pCsrSession = CSR_GET_SESSION(mac, sessionId);
Jeff Johnson038efe72019-03-18 13:39:31 -07009543 if (!pCsrSession) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05309544 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009545 FL("Session lookup fails for CSR session"));
Jeff Johnson01f2c232018-11-21 19:17:44 -08009546 sme_release_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309547 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009548 }
Jeff Johnson01f2c232018-11-21 19:17:44 -08009549 if (!CSR_IS_SESSION_VALID(mac, sessionId)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05309550 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009551 FL("Invalid session Id %u"), sessionId);
Jeff Johnson01f2c232018-11-21 19:17:44 -08009552 sme_release_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309553 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009554 }
9555
Jeff Johnson01f2c232018-11-21 19:17:44 -08009556 pSession = pe_find_session_by_bssid(mac,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009557 pCsrSession->connectedProfile.bssid.bytes,
9558 &peSessionId);
9559
Jeff Johnson038efe72019-03-18 13:39:31 -07009560 if (!pSession) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05309561 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009562 FL(" Session lookup fails for BSSID"));
Jeff Johnson01f2c232018-11-21 19:17:44 -08009563 sme_release_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309564 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009565 }
9566
9567 if (!pSession->QosMapSet.present) {
Srinivas Girigowda2b5d47c2017-03-29 00:28:46 -07009568 sme_debug("QOS Mapping IE not present");
Jeff Johnson01f2c232018-11-21 19:17:44 -08009569 sme_release_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309570 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009571 }
9572 for (i = 0; i < SME_QOS_WMM_UP_MAX; i++) {
9573 for (j = pSession->QosMapSet.dscp_range[i][0];
9574 j <= pSession->QosMapSet.dscp_range[i][1];
9575 j++) {
9576 if ((pSession->QosMapSet.dscp_range[i][0] == 255)
9577 && (pSession->QosMapSet.dscp_range[i][1] ==
9578 255)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05309579 QDF_TRACE(QDF_MODULE_ID_SME,
Kiran Kumar Lokere1d411bb2017-11-29 15:24:05 -08009580 QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009581 FL("User Priority %d isn't used"), i);
9582 break;
9583 } else {
9584 dscpmapping[j] = i;
9585 }
9586 }
9587 }
9588 for (i = 0; i < pSession->QosMapSet.num_dscp_exceptions; i++)
9589 if (pSession->QosMapSet.dscp_exceptions[i][0] != 255)
9590 dscpmapping[pSession->QosMapSet.dscp_exceptions[i][0]] =
9591 pSession->QosMapSet.dscp_exceptions[i][1];
9592
Jeff Johnson01f2c232018-11-21 19:17:44 -08009593 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009594 return status;
9595}
9596
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05309597/*
9598 * sme_abort_roam_scan() -
9599 * API to abort current roam scan cycle by roam scan offload module.
9600 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08009601 * mac_handle - The handle returned by mac_open.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05309602 * sessionId - Session Identifier
9603 * Return QDF_STATUS
9604 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009605
Jeff Johnsonb460dd72018-11-08 10:26:51 -08009606QDF_STATUS sme_abort_roam_scan(mac_handle_t mac_handle, uint8_t sessionId)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009607{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309608 QDF_STATUS status = QDF_STATUS_SUCCESS;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08009609 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009610
Wu Gao51a63562018-11-08 16:29:10 +08009611 if (mac->mlme_cfg->lfr.roam_scan_offload_enabled) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009612 /* acquire the lock for the sme object */
Jeff Johnson01f2c232018-11-21 19:17:44 -08009613 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309614 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08009615 csr_roam_offload_scan(mac, sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009616 ROAM_SCAN_OFFLOAD_ABORT_SCAN,
9617 REASON_ROAM_ABORT_ROAM_SCAN);
9618 /* release the lock for the sme object */
Jeff Johnson01f2c232018-11-21 19:17:44 -08009619 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009620 }
9621 }
9622
9623 return status;
9624}
9625
9626#ifdef FEATURE_WLAN_EXTSCAN
9627/**
9628 * sme_get_valid_channels_by_band() - to fetch valid channels filtered by band
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -08009629 * @mac_handle: Opaque handle to the global MAC context
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009630 * @wifiBand: RF band information
9631 * @aValidChannels: output array to store channel info
9632 * @pNumChannels: output number of channels
9633 *
9634 * SME API to fetch all valid channels filtered by band
9635 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309636 * Return: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009637 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08009638QDF_STATUS sme_get_valid_channels_by_band(mac_handle_t mac_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009639 uint8_t wifiBand,
9640 uint32_t *aValidChannels,
9641 uint8_t *pNumChannels)
9642{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309643 QDF_STATUS status = QDF_STATUS_SUCCESS;
Wu Gao0821b0d2019-01-11 17:31:11 +08009644 uint8_t chanList[CFG_VALID_CHANNEL_LIST_LEN] = { 0 };
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009645 uint8_t numChannels = 0;
9646 uint8_t i = 0;
Wu Gao0821b0d2019-01-11 17:31:11 +08009647 uint32_t totValidChannels = CFG_VALID_CHANNEL_LIST_LEN;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08009648 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009649
9650 if (!aValidChannels || !pNumChannels) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07009651 sme_err("Output channel list/NumChannels is NULL");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309652 return QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009653 }
9654
Sreelakshmi Konamki0d17c6a2017-06-08 12:58:54 +05309655 if (wifiBand >= WIFI_BAND_MAX) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07009656 sme_err("Invalid wifiBand: %d", wifiBand);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309657 return QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009658 }
9659
Tushnim Bhattacharyya0c4ad2d2017-03-09 15:59:03 -08009660 status = sme_get_cfg_valid_channels(&chanList[0],
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009661 &totValidChannels);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309662 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07009663 sme_err("Fail to get valid channel list (err=%d)", status);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009664 return status;
9665 }
9666
9667 switch (wifiBand) {
9668 case WIFI_BAND_UNSPECIFIED:
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07009669 sme_debug("Unspec Band, return all %d valid channels",
9670 totValidChannels);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009671 numChannels = totValidChannels;
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05309672 for (i = 0; i < totValidChannels; i++)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009673 aValidChannels[i] = cds_chan_to_freq(chanList[i]);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009674 break;
9675
9676 case WIFI_BAND_BG:
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07009677 sme_debug("WIFI_BAND_BG (2.4 GHz)");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009678 for (i = 0; i < totValidChannels; i++) {
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05309679 if (WLAN_REG_IS_24GHZ_CH(chanList[i]))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009680 aValidChannels[numChannels++] =
9681 cds_chan_to_freq(chanList[i]);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009682 }
9683 break;
9684
9685 case WIFI_BAND_A:
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07009686 sme_debug("WIFI_BAND_A (5 GHz without DFS)");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009687 for (i = 0; i < totValidChannels; i++) {
Kiran Kumar Lokerea3de2262017-04-12 12:15:04 -07009688 if (WLAN_REG_IS_5GHZ_CH(chanList[i]) &&
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05309689 !wlan_reg_is_dfs_ch(mac_ctx->pdev, chanList[i]))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009690 aValidChannels[numChannels++] =
9691 cds_chan_to_freq(chanList[i]);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009692 }
9693 break;
9694
9695 case WIFI_BAND_ABG:
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07009696 sme_debug("WIFI_BAND_ABG (2.4 GHz + 5 GHz; no DFS)");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009697 for (i = 0; i < totValidChannels; i++) {
Kiran Kumar Lokerea3de2262017-04-12 12:15:04 -07009698 if ((WLAN_REG_IS_24GHZ_CH(chanList[i]) ||
9699 WLAN_REG_IS_5GHZ_CH(chanList[i])) &&
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05309700 !wlan_reg_is_dfs_ch(mac_ctx->pdev, chanList[i]))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009701 aValidChannels[numChannels++] =
9702 cds_chan_to_freq(chanList[i]);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009703 }
9704 break;
9705
9706 case WIFI_BAND_A_DFS_ONLY:
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07009707 sme_debug("WIFI_BAND_A_DFS (5 GHz DFS only)");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009708 for (i = 0; i < totValidChannels; i++) {
Kiran Kumar Lokerea3de2262017-04-12 12:15:04 -07009709 if (WLAN_REG_IS_5GHZ_CH(chanList[i]) &&
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05309710 wlan_reg_is_dfs_ch(mac_ctx->pdev, chanList[i]))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009711 aValidChannels[numChannels++] =
9712 cds_chan_to_freq(chanList[i]);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009713 }
9714 break;
9715
9716 case WIFI_BAND_A_WITH_DFS:
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07009717 sme_debug("WIFI_BAND_A_WITH_DFS (5 GHz with DFS)");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009718 for (i = 0; i < totValidChannels; i++) {
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05309719 if (WLAN_REG_IS_5GHZ_CH(chanList[i]))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009720 aValidChannels[numChannels++] =
9721 cds_chan_to_freq(chanList[i]);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009722 }
9723 break;
9724
9725 case WIFI_BAND_ABG_WITH_DFS:
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07009726 sme_debug("WIFI_BAND_ABG_WITH_DFS (2.4 GHz+5 GHz with DFS)");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009727 for (i = 0; i < totValidChannels; i++) {
Kiran Kumar Lokerea3de2262017-04-12 12:15:04 -07009728 if (WLAN_REG_IS_24GHZ_CH(chanList[i]) ||
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05309729 WLAN_REG_IS_5GHZ_CH(chanList[i]))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009730 aValidChannels[numChannels++] =
9731 cds_chan_to_freq(chanList[i]);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009732 }
9733 break;
9734
9735 default:
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07009736 sme_err("Unknown wifiBand: %d", wifiBand);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309737 return QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009738 }
9739 *pNumChannels = numChannels;
9740
9741 return status;
9742}
9743
Jeff Johnsonfed9a732018-07-18 12:18:03 -07009744QDF_STATUS
9745sme_ext_scan_get_capabilities(mac_handle_t mac_handle,
9746 struct extscan_capabilities_params *params)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009747{
Jeff Johnsonfed9a732018-07-18 12:18:03 -07009748 QDF_STATUS status;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08009749 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Rajeev Kumar37d478b2017-04-17 16:59:28 -07009750 struct scheduler_msg message = {0};
Jeff Johnsonfed9a732018-07-18 12:18:03 -07009751 struct extscan_capabilities_params *bodyptr;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009752
Jeff Johnsonfed9a732018-07-18 12:18:03 -07009753 /* per contract must make a copy of the params when messaging */
9754 bodyptr = qdf_mem_malloc(sizeof(*bodyptr));
9755 if (!bodyptr)
9756 return QDF_STATUS_E_NOMEM;
9757 *bodyptr = *params;
9758
9759 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309760 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009761 /* Serialize the req through MC thread */
Jeff Johnsonfed9a732018-07-18 12:18:03 -07009762 message.bodyptr = bodyptr;
Rajeev Kumar8eaedf62017-01-21 11:03:13 -08009763 message.type = WMA_EXTSCAN_GET_CAPABILITIES_REQ;
Jeff Johnsonfed9a732018-07-18 12:18:03 -07009764 qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
9765 NO_SESSION, message.type);
9766 status = scheduler_post_message(QDF_MODULE_ID_SME,
9767 QDF_MODULE_ID_WMA,
9768 QDF_MODULE_ID_WMA,
9769 &message);
9770 sme_release_global_lock(&mac->sme);
9771 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009772
Jeff Johnsonfed9a732018-07-18 12:18:03 -07009773 if (QDF_IS_STATUS_ERROR(status)) {
9774 sme_err("failure: %d", status);
9775 qdf_mem_free(bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009776 }
9777 return status;
9778}
9779
Jeff Johnsondab58602018-07-14 15:30:24 -07009780QDF_STATUS
9781sme_ext_scan_start(mac_handle_t mac_handle,
9782 struct wifi_scan_cmd_req_params *params)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009783{
Jeff Johnsondab58602018-07-14 15:30:24 -07009784 QDF_STATUS status;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08009785 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Rajeev Kumar37d478b2017-04-17 16:59:28 -07009786 struct scheduler_msg message = {0};
Jeff Johnsondab58602018-07-14 15:30:24 -07009787 struct wifi_scan_cmd_req_params *bodyptr;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009788
Jeff Johnsondab58602018-07-14 15:30:24 -07009789 /* per contract must make a copy of the params when messaging */
9790 bodyptr = qdf_mem_malloc(sizeof(*bodyptr));
9791 if (!bodyptr)
9792 return QDF_STATUS_E_NOMEM;
9793 *bodyptr = *params;
9794
9795 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309796 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009797 /* Serialize the req through MC thread */
Jeff Johnsondab58602018-07-14 15:30:24 -07009798 message.bodyptr = bodyptr;
Rajeev Kumar8eaedf62017-01-21 11:03:13 -08009799 message.type = WMA_EXTSCAN_START_REQ;
Jeff Johnsondab58602018-07-14 15:30:24 -07009800 qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
9801 NO_SESSION, message.type);
9802 status = scheduler_post_message(QDF_MODULE_ID_SME,
9803 QDF_MODULE_ID_WMA,
9804 QDF_MODULE_ID_WMA,
9805 &message);
9806 sme_release_global_lock(&mac->sme);
9807 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009808
Jeff Johnsondab58602018-07-14 15:30:24 -07009809 if (QDF_IS_STATUS_ERROR(status)) {
9810 sme_err("failure: %d", status);
9811 qdf_mem_free(bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009812 }
9813 return status;
9814}
9815
Jeff Johnson7272ea72018-07-15 17:22:27 -07009816QDF_STATUS sme_ext_scan_stop(mac_handle_t mac_handle,
9817 struct extscan_stop_req_params *params)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009818{
Jeff Johnson7272ea72018-07-15 17:22:27 -07009819 QDF_STATUS status;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08009820 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Rajeev Kumar37d478b2017-04-17 16:59:28 -07009821 struct scheduler_msg message = {0};
Jeff Johnson7272ea72018-07-15 17:22:27 -07009822 struct extscan_stop_req_params *bodyptr;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009823
Jeff Johnson7272ea72018-07-15 17:22:27 -07009824 /* per contract must make a copy of the params when messaging */
9825 bodyptr = qdf_mem_malloc(sizeof(*bodyptr));
9826 if (!bodyptr)
9827 return QDF_STATUS_E_NOMEM;
9828 *bodyptr = *params;
9829
9830 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309831 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009832 /* Serialize the req through MC thread */
Jeff Johnson7272ea72018-07-15 17:22:27 -07009833 message.bodyptr = bodyptr;
Rajeev Kumar8eaedf62017-01-21 11:03:13 -08009834 message.type = WMA_EXTSCAN_STOP_REQ;
Jeff Johnson7272ea72018-07-15 17:22:27 -07009835 qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
9836 NO_SESSION, message.type);
9837 status = scheduler_post_message(QDF_MODULE_ID_SME,
9838 QDF_MODULE_ID_WMA,
9839 QDF_MODULE_ID_WMA,
9840 &message);
9841 sme_release_global_lock(&mac->sme);
9842 }
9843
9844 if (QDF_IS_STATUS_ERROR(status)) {
9845 sme_err("failure: %d", status);
9846 qdf_mem_free(bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009847 }
9848 return status;
9849}
9850
Jeff Johnson1148cb02018-07-13 23:14:32 -07009851QDF_STATUS
9852sme_set_bss_hotlist(mac_handle_t mac_handle,
9853 struct extscan_bssid_hotlist_set_params *params)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009854{
Jeff Johnson1148cb02018-07-13 23:14:32 -07009855 QDF_STATUS status;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08009856 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Rajeev Kumar37d478b2017-04-17 16:59:28 -07009857 struct scheduler_msg message = {0};
Jeff Johnson1148cb02018-07-13 23:14:32 -07009858 struct extscan_bssid_hotlist_set_params *bodyptr;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009859
Jeff Johnson1148cb02018-07-13 23:14:32 -07009860 /* per contract must make a copy of the params when messaging */
9861 bodyptr = qdf_mem_malloc(sizeof(*bodyptr));
Arif Hussain0ef77082018-10-10 16:42:53 -07009862 if (!bodyptr)
Jeff Johnson1148cb02018-07-13 23:14:32 -07009863 return QDF_STATUS_E_NOMEM;
Arif Hussain0ef77082018-10-10 16:42:53 -07009864
Jeff Johnson1148cb02018-07-13 23:14:32 -07009865 *bodyptr = *params;
9866
9867 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309868 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009869 /* Serialize the req through MC thread */
Jeff Johnson1148cb02018-07-13 23:14:32 -07009870 message.bodyptr = bodyptr;
Rajeev Kumar8eaedf62017-01-21 11:03:13 -08009871 message.type = WMA_EXTSCAN_SET_BSSID_HOTLIST_REQ;
Jeff Johnson1148cb02018-07-13 23:14:32 -07009872 qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
9873 NO_SESSION, message.type);
gaurank kathpalia36b0c582018-08-28 17:45:43 +05309874 status = scheduler_post_message(QDF_MODULE_ID_SME,
9875 QDF_MODULE_ID_WMA,
9876 QDF_MODULE_ID_WMA, &message);
Jeff Johnson1148cb02018-07-13 23:14:32 -07009877 sme_release_global_lock(&mac->sme);
9878 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009879
Jeff Johnson1148cb02018-07-13 23:14:32 -07009880 if (QDF_IS_STATUS_ERROR(status)) {
9881 sme_err("failure: %d", status);
9882 qdf_mem_free(bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009883 }
9884 return status;
9885}
9886
Jeff Johnson9743eb72018-07-14 10:30:04 -07009887QDF_STATUS
9888sme_reset_bss_hotlist(mac_handle_t mac_handle,
9889 struct extscan_bssid_hotlist_reset_params *params)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009890{
Jeff Johnson9743eb72018-07-14 10:30:04 -07009891 QDF_STATUS status;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08009892 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Rajeev Kumar37d478b2017-04-17 16:59:28 -07009893 struct scheduler_msg message = {0};
Jeff Johnson9743eb72018-07-14 10:30:04 -07009894 struct extscan_bssid_hotlist_reset_params *bodyptr;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009895
Jeff Johnson9743eb72018-07-14 10:30:04 -07009896 /* per contract must make a copy of the params when messaging */
9897 bodyptr = qdf_mem_malloc(sizeof(*bodyptr));
Arif Hussain0ef77082018-10-10 16:42:53 -07009898 if (!bodyptr)
Jeff Johnson9743eb72018-07-14 10:30:04 -07009899 return QDF_STATUS_E_NOMEM;
Arif Hussain0ef77082018-10-10 16:42:53 -07009900
Jeff Johnson9743eb72018-07-14 10:30:04 -07009901 *bodyptr = *params;
9902
9903 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309904 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009905 /* Serialize the req through MC thread */
Jeff Johnson9743eb72018-07-14 10:30:04 -07009906 message.bodyptr = bodyptr;
Rajeev Kumar8eaedf62017-01-21 11:03:13 -08009907 message.type = WMA_EXTSCAN_RESET_BSSID_HOTLIST_REQ;
Sreelakshmi Konamki6a065362016-05-31 16:05:01 +05309908 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
Rajeev Kumar8eaedf62017-01-21 11:03:13 -08009909 NO_SESSION, message.type));
gaurank kathpalia36b0c582018-08-28 17:45:43 +05309910 status = scheduler_post_message(QDF_MODULE_ID_SME,
9911 QDF_MODULE_ID_WMA,
9912 QDF_MODULE_ID_WMA, &message);
Jeff Johnson9743eb72018-07-14 10:30:04 -07009913 sme_release_global_lock(&mac->sme);
9914 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009915
Jeff Johnson9743eb72018-07-14 10:30:04 -07009916 if (QDF_IS_STATUS_ERROR(status)) {
9917 sme_err("failure: %d", status);
9918 qdf_mem_free(bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009919 }
9920 return status;
9921}
9922
Jeff Johnsonb43ed032018-07-16 06:59:21 -07009923QDF_STATUS
9924sme_set_significant_change(mac_handle_t mac_handle,
9925 struct extscan_set_sig_changereq_params *params)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009926{
Jeff Johnsonb43ed032018-07-16 06:59:21 -07009927 QDF_STATUS status;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08009928 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Rajeev Kumar37d478b2017-04-17 16:59:28 -07009929 struct scheduler_msg message = {0};
Jeff Johnsonb43ed032018-07-16 06:59:21 -07009930 struct extscan_set_sig_changereq_params *bodyptr;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009931
Jeff Johnsonb43ed032018-07-16 06:59:21 -07009932 /* per contract must make a copy of the params when messaging */
9933 bodyptr = qdf_mem_malloc(sizeof(*bodyptr));
Arif Hussain0ef77082018-10-10 16:42:53 -07009934 if (!bodyptr)
Jeff Johnsonb43ed032018-07-16 06:59:21 -07009935 return QDF_STATUS_E_NOMEM;
Arif Hussain0ef77082018-10-10 16:42:53 -07009936
Jeff Johnsonb43ed032018-07-16 06:59:21 -07009937 *bodyptr = *params;
9938
9939 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309940 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009941 /* Serialize the req through MC thread */
Jeff Johnsonb43ed032018-07-16 06:59:21 -07009942 message.bodyptr = bodyptr;
Rajeev Kumar8eaedf62017-01-21 11:03:13 -08009943 message.type = WMA_EXTSCAN_SET_SIGNF_CHANGE_REQ;
gaurank kathpalia36b0c582018-08-28 17:45:43 +05309944 status = scheduler_post_message(QDF_MODULE_ID_SME,
9945 QDF_MODULE_ID_WMA,
9946 QDF_MODULE_ID_WMA,
9947 &message);
Jeff Johnsonb43ed032018-07-16 06:59:21 -07009948 sme_release_global_lock(&mac->sme);
9949 }
Jeff Johnsonb43ed032018-07-16 06:59:21 -07009950 if (QDF_IS_STATUS_ERROR(status)) {
9951 sme_err("failure: %d", status);
9952 qdf_mem_free(bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009953 }
9954 return status;
9955}
9956
Jeff Johnson0c8dbc32018-07-16 22:10:48 -07009957QDF_STATUS
9958sme_reset_significant_change(mac_handle_t mac_handle,
9959 struct extscan_capabilities_reset_params *params)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009960{
Jeff Johnson0c8dbc32018-07-16 22:10:48 -07009961 QDF_STATUS status;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08009962 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Rajeev Kumar37d478b2017-04-17 16:59:28 -07009963 struct scheduler_msg message = {0};
Jeff Johnson0c8dbc32018-07-16 22:10:48 -07009964 struct extscan_capabilities_reset_params *bodyptr;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009965
Jeff Johnson0c8dbc32018-07-16 22:10:48 -07009966 /* per contract must make a copy of the params when messaging */
9967 bodyptr = qdf_mem_malloc(sizeof(*bodyptr));
Arif Hussain0ef77082018-10-10 16:42:53 -07009968 if (!bodyptr)
Jeff Johnson0c8dbc32018-07-16 22:10:48 -07009969 return QDF_STATUS_E_NOMEM;
Arif Hussain0ef77082018-10-10 16:42:53 -07009970
Jeff Johnson0c8dbc32018-07-16 22:10:48 -07009971 *bodyptr = *params;
9972
9973 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309974 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009975 /* Serialize the req through MC thread */
Jeff Johnson0c8dbc32018-07-16 22:10:48 -07009976 message.bodyptr = bodyptr;
Rajeev Kumar8eaedf62017-01-21 11:03:13 -08009977 message.type = WMA_EXTSCAN_RESET_SIGNF_CHANGE_REQ;
Sreelakshmi Konamki6a065362016-05-31 16:05:01 +05309978 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
Rajeev Kumar8eaedf62017-01-21 11:03:13 -08009979 NO_SESSION, message.type));
gaurank kathpalia36b0c582018-08-28 17:45:43 +05309980 status = scheduler_post_message(QDF_MODULE_ID_SME,
9981 QDF_MODULE_ID_WMA,
9982 QDF_MODULE_ID_WMA,
9983 &message);
Jeff Johnson0c8dbc32018-07-16 22:10:48 -07009984 sme_release_global_lock(&mac->sme);
9985 }
Jeff Johnson0c8dbc32018-07-16 22:10:48 -07009986 if (QDF_IS_STATUS_ERROR(status)) {
9987 sme_err("failure: %d", status);
9988 qdf_mem_free(bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009989 }
gaurank kathpalia36b0c582018-08-28 17:45:43 +05309990
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009991 return status;
9992}
9993
Jeff Johnson2ba60092018-07-17 08:19:37 -07009994QDF_STATUS
9995sme_get_cached_results(mac_handle_t mac_handle,
9996 struct extscan_cached_result_params *params)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009997{
Jeff Johnson2ba60092018-07-17 08:19:37 -07009998 QDF_STATUS status;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08009999 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Rajeev Kumar37d478b2017-04-17 16:59:28 -070010000 struct scheduler_msg message = {0};
Jeff Johnson2ba60092018-07-17 08:19:37 -070010001 struct extscan_cached_result_params *bodyptr;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010002
Jeff Johnson2ba60092018-07-17 08:19:37 -070010003 /* per contract must make a copy of the params when messaging */
10004 bodyptr = qdf_mem_malloc(sizeof(*bodyptr));
10005 if (!bodyptr)
10006 return QDF_STATUS_E_NOMEM;
10007 *bodyptr = *params;
10008
10009 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010010 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010011 /* Serialize the req through MC thread */
Jeff Johnson2ba60092018-07-17 08:19:37 -070010012 message.bodyptr = bodyptr;
Rajeev Kumar8eaedf62017-01-21 11:03:13 -080010013 message.type = WMA_EXTSCAN_GET_CACHED_RESULTS_REQ;
Jeff Johnson2ba60092018-07-17 08:19:37 -070010014 qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
10015 NO_SESSION, message.type);
10016 status = scheduler_post_message(QDF_MODULE_ID_SME,
10017 QDF_MODULE_ID_WMA,
10018 QDF_MODULE_ID_WMA,
10019 &message);
10020 sme_release_global_lock(&mac->sme);
10021 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010022
Jeff Johnson2ba60092018-07-17 08:19:37 -070010023 if (QDF_IS_STATUS_ERROR(status)) {
10024 sme_err("failure: %d", status);
10025 qdf_mem_free(bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010026 }
10027 return status;
10028}
10029
Jeff Johnson360135b2018-07-18 20:51:47 -070010030QDF_STATUS sme_set_epno_list(mac_handle_t mac_handle,
10031 struct wifi_enhanced_pno_params *params)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010032{
Jeff Johnson360135b2018-07-18 20:51:47 -070010033 QDF_STATUS status;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080010034 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Rajeev Kumar37d478b2017-04-17 16:59:28 -070010035 struct scheduler_msg message = {0};
Jeff Johnson360135b2018-07-18 20:51:47 -070010036 struct wifi_enhanced_pno_params *req_msg;
10037 int len;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010038
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070010039 SME_ENTER();
Jeff Johnson360135b2018-07-18 20:51:47 -070010040
10041 /* per contract must make a copy of the params when messaging */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010042 len = sizeof(*req_msg) +
Jeff Johnson360135b2018-07-18 20:51:47 -070010043 (params->num_networks * sizeof(req_msg->networks[0]));
Mukul Sharmae8c919f2016-10-02 20:35:15 +053010044
Anurag Chouhan600c3a02016-03-01 10:33:54 +053010045 req_msg = qdf_mem_malloc(len);
Arif Hussain0ef77082018-10-10 16:42:53 -070010046 if (!req_msg)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010047 return QDF_STATUS_E_NOMEM;
Jeff Johnson360135b2018-07-18 20:51:47 -070010048 qdf_mem_copy(req_msg, params, len);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010049
10050 status = sme_acquire_global_lock(&mac->sme);
Vignesh Viswanathancbb5b952017-08-02 14:32:49 +053010051 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070010052 sme_err("sme_acquire_global_lock failed!(status=%d)",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010053 status);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053010054 qdf_mem_free(req_msg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010055 return status;
10056 }
10057
10058 /* Serialize the req through MC thread */
Rajeev Kumar8eaedf62017-01-21 11:03:13 -080010059 message.bodyptr = req_msg;
10060 message.type = WMA_SET_EPNO_LIST_REQ;
gaurank kathpalia36b0c582018-08-28 17:45:43 +053010061 status = scheduler_post_message(QDF_MODULE_ID_SME,
10062 QDF_MODULE_ID_WMA,
10063 QDF_MODULE_ID_WMA, &message);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010064 if (!QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson360135b2018-07-18 20:51:47 -070010065 sme_err("scheduler_post_msg failed!(err=%d)", status);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053010066 qdf_mem_free(req_msg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010067 }
10068 sme_release_global_lock(&mac->sme);
Jeff Johnson360135b2018-07-18 20:51:47 -070010069
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010070 return status;
10071}
10072
Jeff Johnson2a7f1012018-07-19 07:21:06 -070010073QDF_STATUS sme_set_passpoint_list(mac_handle_t mac_handle,
10074 struct wifi_passpoint_req_param *params)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010075{
Jeff Johnson2a7f1012018-07-19 07:21:06 -070010076 QDF_STATUS status;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080010077 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Rajeev Kumar37d478b2017-04-17 16:59:28 -070010078 struct scheduler_msg message = {0};
Jeff Johnson2a7f1012018-07-19 07:21:06 -070010079 struct wifi_passpoint_req_param *req_msg;
10080 int len;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010081
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070010082 SME_ENTER();
Jeff Johnson2a7f1012018-07-19 07:21:06 -070010083
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010084 len = sizeof(*req_msg) +
Jeff Johnson2a7f1012018-07-19 07:21:06 -070010085 (params->num_networks * sizeof(params->networks[0]));
Anurag Chouhan600c3a02016-03-01 10:33:54 +053010086 req_msg = qdf_mem_malloc(len);
Arif Hussain0ef77082018-10-10 16:42:53 -070010087 if (!req_msg)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010088 return QDF_STATUS_E_NOMEM;
Jeff Johnson2a7f1012018-07-19 07:21:06 -070010089 qdf_mem_copy(req_msg, params, len);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010090
10091 status = sme_acquire_global_lock(&mac->sme);
Vignesh Viswanathancbb5b952017-08-02 14:32:49 +053010092 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070010093 sme_err("sme_acquire_global_lock failed!(status=%d)",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010094 status);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053010095 qdf_mem_free(req_msg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010096 return status;
10097 }
10098
10099 /* Serialize the req through MC thread */
Rajeev Kumar8eaedf62017-01-21 11:03:13 -080010100 message.bodyptr = req_msg;
10101 message.type = WMA_SET_PASSPOINT_LIST_REQ;
gaurank kathpalia36b0c582018-08-28 17:45:43 +053010102 status = scheduler_post_message(QDF_MODULE_ID_SME,
10103 QDF_MODULE_ID_WMA,
10104 QDF_MODULE_ID_WMA, &message);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010105 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070010106 sme_err("scheduler_post_msg failed!(err=%d)",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010107 status);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053010108 qdf_mem_free(req_msg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010109 }
10110 sme_release_global_lock(&mac->sme);
10111 return status;
10112}
10113
Jeff Johnson2a7f1012018-07-19 07:21:06 -070010114QDF_STATUS sme_reset_passpoint_list(mac_handle_t mac_handle,
10115 struct wifi_passpoint_req_param *params)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010116{
Jeff Johnson2a7f1012018-07-19 07:21:06 -070010117 QDF_STATUS status;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080010118 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Rajeev Kumar37d478b2017-04-17 16:59:28 -070010119 struct scheduler_msg message = {0};
Jeff Johnson2a7f1012018-07-19 07:21:06 -070010120 struct wifi_passpoint_req_param *req_msg;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010121
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070010122 SME_ENTER();
Jeff Johnson2a7f1012018-07-19 07:21:06 -070010123
Anurag Chouhan600c3a02016-03-01 10:33:54 +053010124 req_msg = qdf_mem_malloc(sizeof(*req_msg));
Arif Hussain0ef77082018-10-10 16:42:53 -070010125 if (!req_msg)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010126 return QDF_STATUS_E_NOMEM;
Jeff Johnson2a7f1012018-07-19 07:21:06 -070010127 *req_msg = *params;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010128
10129 status = sme_acquire_global_lock(&mac->sme);
Vignesh Viswanathancbb5b952017-08-02 14:32:49 +053010130 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070010131 sme_err("sme_acquire_global_lock failed!(status=%d)",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010132 status);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053010133 qdf_mem_free(req_msg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010134 return status;
10135 }
10136
10137 /* Serialize the req through MC thread */
Rajeev Kumar8eaedf62017-01-21 11:03:13 -080010138 message.bodyptr = req_msg;
10139 message.type = WMA_RESET_PASSPOINT_LIST_REQ;
gaurank kathpalia36b0c582018-08-28 17:45:43 +053010140 status = scheduler_post_message(QDF_MODULE_ID_SME,
10141 QDF_MODULE_ID_WMA,
10142 QDF_MODULE_ID_WMA, &message);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010143 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070010144 sme_err("scheduler_post_msg failed!(err=%d)",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010145 status);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053010146 qdf_mem_free(req_msg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010147 }
10148 sme_release_global_lock(&mac->sme);
10149 return status;
10150}
10151
Jeff Johnson17b12392018-07-03 22:21:15 -070010152QDF_STATUS sme_ext_scan_register_callback(mac_handle_t mac_handle,
10153 ext_scan_ind_cb ext_scan_ind_cb)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010154{
Jeff Johnson17b12392018-07-03 22:21:15 -070010155 QDF_STATUS status;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080010156 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010157
Jeff Johnson17b12392018-07-03 22:21:15 -070010158 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010159 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson17b12392018-07-03 22:21:15 -070010160 mac->sme.ext_scan_ind_cb = ext_scan_ind_cb;
10161 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010162 }
10163 return status;
10164}
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010165#endif /* FEATURE_WLAN_EXTSCAN */
10166
Wen Gong7952fbd2018-04-18 11:27:23 +080010167/**
10168 * sme_send_wisa_params(): Pass WISA mode to WMA
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -080010169 * @mac_handle: Opaque handle to the global MAC context
Wen Gong7952fbd2018-04-18 11:27:23 +080010170 * @wisa_params: pointer to WISA params struct
10171 * @sessionId: SME session id
10172 *
10173 * Pass WISA params to WMA
10174 *
10175 * Return: QDF_STATUS
10176 */
Jeff Johnsonc7309062018-11-09 20:59:42 -080010177QDF_STATUS sme_set_wisa_params(mac_handle_t mac_handle,
10178 struct sir_wisa_params *wisa_params)
Wen Gong7952fbd2018-04-18 11:27:23 +080010179{
10180 QDF_STATUS status = QDF_STATUS_SUCCESS;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080010181 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Wen Gong7952fbd2018-04-18 11:27:23 +080010182 struct scheduler_msg message = {0};
10183 struct sir_wisa_params *cds_msg_wisa_params;
10184
10185 cds_msg_wisa_params = qdf_mem_malloc(sizeof(struct sir_wisa_params));
10186 if (!cds_msg_wisa_params)
10187 return QDF_STATUS_E_NOMEM;
10188
10189 *cds_msg_wisa_params = *wisa_params;
10190 status = sme_acquire_global_lock(&mac->sme);
gaurank kathpalia45685492019-06-06 15:38:32 +053010191
10192 if (QDF_IS_STATUS_ERROR(status)) {
10193 qdf_mem_free(cds_msg_wisa_params);
10194 return QDF_STATUS_E_FAILURE;
Wen Gong7952fbd2018-04-18 11:27:23 +080010195 }
gaurank kathpalia45685492019-06-06 15:38:32 +053010196 message.bodyptr = cds_msg_wisa_params;
10197 message.type = WMA_SET_WISA_PARAMS;
10198 status = scheduler_post_message(QDF_MODULE_ID_SME,
10199 QDF_MODULE_ID_WMA,
10200 QDF_MODULE_ID_WMA, &message);
10201 if (QDF_IS_STATUS_ERROR(status))
10202 qdf_mem_free(cds_msg_wisa_params);
10203 sme_release_global_lock(&mac->sme);
Wen Gong7952fbd2018-04-18 11:27:23 +080010204 return status;
10205}
10206
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010207#ifdef WLAN_FEATURE_LINK_LAYER_STATS
10208
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053010209/*
10210 * sme_ll_stats_clear_req() -
10211 * SME API to clear Link Layer Statistics
10212 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -080010213 * mac_handle
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053010214 * pclearStatsReq: Link Layer clear stats request params structure
10215 * Return QDF_STATUS
10216 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -080010217QDF_STATUS sme_ll_stats_clear_req(mac_handle_t mac_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010218 tSirLLStatsClearReq *pclearStatsReq)
10219{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010220 QDF_STATUS status = QDF_STATUS_SUCCESS;
10221 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080010222 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Rajeev Kumar37d478b2017-04-17 16:59:28 -070010223 struct scheduler_msg message = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010224 tSirLLStatsClearReq *clear_stats_req;
10225
Abhishek Singhe4a1f882017-08-10 17:59:44 +053010226 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010227 "staId = %u", pclearStatsReq->staId);
Abhishek Singhe4a1f882017-08-10 17:59:44 +053010228 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010229 "statsClearReqMask = 0x%X",
10230 pclearStatsReq->statsClearReqMask);
Abhishek Singhe4a1f882017-08-10 17:59:44 +053010231 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010232 "stopReq = %u", pclearStatsReq->stopReq);
Jeff Johnsonb460dd72018-11-08 10:26:51 -080010233 if (!sme_is_session_id_valid(mac_handle, pclearStatsReq->staId)) {
Deepak Dhamdhere6adc08e2017-07-27 09:33:22 -070010234 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
10235 "%s: invalid staId %d",
10236 __func__, pclearStatsReq->staId);
10237 return QDF_STATUS_E_INVAL;
10238 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010239
Anurag Chouhan600c3a02016-03-01 10:33:54 +053010240 clear_stats_req = qdf_mem_malloc(sizeof(*clear_stats_req));
Arif Hussain0ef77082018-10-10 16:42:53 -070010241 if (!clear_stats_req)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010242 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010243
10244 *clear_stats_req = *pclearStatsReq;
10245
Jeff Johnson01f2c232018-11-21 19:17:44 -080010246 if (QDF_STATUS_SUCCESS == sme_acquire_global_lock(&mac->sme)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010247 /* Serialize the req through MC thread */
Rajeev Kumar8eaedf62017-01-21 11:03:13 -080010248 message.bodyptr = clear_stats_req;
10249 message.type = WMA_LINK_LAYER_STATS_CLEAR_REQ;
Sreelakshmi Konamki6a065362016-05-31 16:05:01 +053010250 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
Rajeev Kumar8eaedf62017-01-21 11:03:13 -080010251 NO_SESSION, message.type));
gaurank kathpalia36b0c582018-08-28 17:45:43 +053010252 qdf_status = scheduler_post_message(QDF_MODULE_ID_SME,
10253 QDF_MODULE_ID_WMA,
10254 QDF_MODULE_ID_WMA,
10255 &message);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010256 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053010257 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010258 "%s: not able to post WMA_LL_STATS_CLEAR_REQ",
10259 __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053010260 qdf_mem_free(clear_stats_req);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010261 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010262 }
Jeff Johnson01f2c232018-11-21 19:17:44 -080010263 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010264 } else {
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053010265 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
10266 "%s: sme_acquire_global_lock error", __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053010267 qdf_mem_free(clear_stats_req);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010268 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010269 }
10270
10271 return status;
10272}
10273
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053010274/*
10275 * sme_ll_stats_set_req() -
10276 * SME API to set the Link Layer Statistics
10277 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -080010278 * mac_handle
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053010279 * psetStatsReq: Link Layer set stats request params structure
10280 * Return QDF_STATUS
10281 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -080010282QDF_STATUS sme_ll_stats_set_req(mac_handle_t mac_handle, tSirLLStatsSetReq
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053010283 *psetStatsReq)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010284{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010285 QDF_STATUS status = QDF_STATUS_SUCCESS;
10286 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080010287 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Rajeev Kumar37d478b2017-04-17 16:59:28 -070010288 struct scheduler_msg message = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010289 tSirLLStatsSetReq *set_stats_req;
10290
Abhishek Singhe4a1f882017-08-10 17:59:44 +053010291 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010292 "%s: MPDU Size = %u", __func__,
10293 psetStatsReq->mpduSizeThreshold);
Abhishek Singhe4a1f882017-08-10 17:59:44 +053010294 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010295 " Aggressive Stats Collections = %u",
10296 psetStatsReq->aggressiveStatisticsGathering);
10297
Anurag Chouhan600c3a02016-03-01 10:33:54 +053010298 set_stats_req = qdf_mem_malloc(sizeof(*set_stats_req));
Arif Hussain0ef77082018-10-10 16:42:53 -070010299 if (!set_stats_req)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010300 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010301
10302 *set_stats_req = *psetStatsReq;
10303
Jeff Johnson01f2c232018-11-21 19:17:44 -080010304 if (QDF_STATUS_SUCCESS == sme_acquire_global_lock(&mac->sme)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010305 /* Serialize the req through MC thread */
Rajeev Kumar8eaedf62017-01-21 11:03:13 -080010306 message.bodyptr = set_stats_req;
10307 message.type = WMA_LINK_LAYER_STATS_SET_REQ;
Sreelakshmi Konamki6a065362016-05-31 16:05:01 +053010308 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
Rajeev Kumar8eaedf62017-01-21 11:03:13 -080010309 NO_SESSION, message.type));
gaurank kathpalia36b0c582018-08-28 17:45:43 +053010310 qdf_status = scheduler_post_message(QDF_MODULE_ID_SME,
10311 QDF_MODULE_ID_WMA,
10312 QDF_MODULE_ID_WMA,
10313 &message);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010314 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053010315 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010316 "%s: not able to post WMA_LL_STATS_SET_REQ",
10317 __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053010318 qdf_mem_free(set_stats_req);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010319 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010320 }
Jeff Johnson01f2c232018-11-21 19:17:44 -080010321 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010322 } else {
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053010323 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
10324 "%s: sme_acquire_global_lock error", __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053010325 qdf_mem_free(set_stats_req);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010326 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010327 }
10328
10329 return status;
10330}
10331
Dundi Ravitejae232cf12018-05-16 18:34:34 +053010332QDF_STATUS sme_ll_stats_get_req(mac_handle_t mac_handle,
10333 tSirLLStatsGetReq *get_stats_req,
10334 void *context)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010335{
Dundi Ravitejae232cf12018-05-16 18:34:34 +053010336 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080010337 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Rajeev Kumar37d478b2017-04-17 16:59:28 -070010338 struct scheduler_msg message = {0};
Dundi Ravitejae232cf12018-05-16 18:34:34 +053010339 tSirLLStatsGetReq *ll_stats_get_req;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010340
Dundi Ravitejae232cf12018-05-16 18:34:34 +053010341 ll_stats_get_req = qdf_mem_malloc(sizeof(*ll_stats_get_req));
Arif Hussain0ef77082018-10-10 16:42:53 -070010342 if (!ll_stats_get_req)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010343 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010344
Dundi Ravitejae232cf12018-05-16 18:34:34 +053010345 *ll_stats_get_req = *get_stats_req;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010346
Dundi Ravitejae232cf12018-05-16 18:34:34 +053010347 mac->sme.ll_stats_context = context;
10348 if (sme_acquire_global_lock(&mac->sme) == QDF_STATUS_SUCCESS) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010349 /* Serialize the req through MC thread */
Dundi Ravitejae232cf12018-05-16 18:34:34 +053010350 message.bodyptr = ll_stats_get_req;
Rajeev Kumar8eaedf62017-01-21 11:03:13 -080010351 message.type = WMA_LINK_LAYER_STATS_GET_REQ;
Dundi Ravitejae232cf12018-05-16 18:34:34 +053010352 qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
10353 NO_SESSION, message.type);
gaurank kathpalia36b0c582018-08-28 17:45:43 +053010354 status = scheduler_post_message(QDF_MODULE_ID_SME,
10355 QDF_MODULE_ID_WMA,
10356 QDF_MODULE_ID_WMA, &message);
Dundi Ravitejae232cf12018-05-16 18:34:34 +053010357 if (!QDF_IS_STATUS_SUCCESS(status)) {
10358 sme_err("Not able to post WMA_LL_STATS_GET_REQ");
10359 qdf_mem_free(ll_stats_get_req);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010360 }
Dundi Ravitejae232cf12018-05-16 18:34:34 +053010361 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010362 } else {
Dundi Ravitejae232cf12018-05-16 18:34:34 +053010363 sme_err("sme_acquire_global_lock error");
10364 qdf_mem_free(ll_stats_get_req);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010365 }
10366
10367 return status;
10368}
10369
Jeff Johnson959f3692018-07-03 17:30:40 -070010370QDF_STATUS sme_set_link_layer_stats_ind_cb(mac_handle_t mac_handle,
10371 link_layer_stats_cb callback)
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053010372{
Jeff Johnson959f3692018-07-03 17:30:40 -070010373 QDF_STATUS status;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080010374 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010375
Jeff Johnson959f3692018-07-03 17:30:40 -070010376 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010377 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson959f3692018-07-03 17:30:40 -070010378 mac->sme.link_layer_stats_cb = callback;
10379 sme_release_global_lock(&mac->sme);
10380 } else {
10381 sme_err("sme_acquire_global_lock error");
10382 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010383
10384 return status;
10385}
10386
Arun Khandavalli4b55da72016-07-19 19:55:01 +053010387/**
Zhang Qiana6e9c102016-12-22 16:47:24 +080010388 * sme_set_link_layer_ext_cb() - Register callback for link layer statistics
Jeff Johnsonc7309062018-11-09 20:59:42 -080010389 * @mac_handle: Mac global handle
Zhang Qiana6e9c102016-12-22 16:47:24 +080010390 * @ll_stats_ext_cb: HDD callback which needs to be invoked after getting
10391 * status notification from FW
10392 *
Jeff Johnsonc7309062018-11-09 20:59:42 -080010393 * Return: QDF_STATUS
Zhang Qiana6e9c102016-12-22 16:47:24 +080010394 */
Jeff Johnsonc7309062018-11-09 20:59:42 -080010395QDF_STATUS
10396sme_set_link_layer_ext_cb(mac_handle_t mac_handle,
10397 void (*ll_stats_ext_cb)(hdd_handle_t callback_ctx,
10398 tSirLLStatsResults *rsp))
Zhang Qiana6e9c102016-12-22 16:47:24 +080010399{
10400 QDF_STATUS status;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080010401 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Zhang Qiana6e9c102016-12-22 16:47:24 +080010402
10403 status = sme_acquire_global_lock(&mac->sme);
10404 if (status == QDF_STATUS_SUCCESS) {
10405 mac->sme.link_layer_stats_ext_cb = ll_stats_ext_cb;
10406 sme_release_global_lock(&mac->sme);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053010407 } else
Zhang Qiana6e9c102016-12-22 16:47:24 +080010408 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
10409 "%s: sme_qcquire_global_lock error", __func__);
Zhang Qiana6e9c102016-12-22 16:47:24 +080010410 return status;
10411}
10412
10413/**
Arun Khandavalli4b55da72016-07-19 19:55:01 +053010414 * sme_reset_link_layer_stats_ind_cb() - SME API to reset link layer stats
10415 * indication
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -080010416 * @mac_handle: Opaque handle to the global MAC context
Arun Khandavalli4b55da72016-07-19 19:55:01 +053010417 *
10418 * This function reset's the link layer stats indication
10419 *
10420 * Return: QDF_STATUS Enumeration
10421 */
10422
Jeff Johnsonb460dd72018-11-08 10:26:51 -080010423QDF_STATUS sme_reset_link_layer_stats_ind_cb(mac_handle_t mac_handle)
Arun Khandavalli4b55da72016-07-19 19:55:01 +053010424{
10425 QDF_STATUS status;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080010426 struct mac_context *pmac;
Arun Khandavalli4b55da72016-07-19 19:55:01 +053010427
Jeff Johnsonb460dd72018-11-08 10:26:51 -080010428 if (!mac_handle) {
Arun Khandavalli4b55da72016-07-19 19:55:01 +053010429 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Jeff Johnsonb460dd72018-11-08 10:26:51 -080010430 FL("mac_handle is not valid"));
Arun Khandavalli4b55da72016-07-19 19:55:01 +053010431 return QDF_STATUS_E_INVAL;
10432 }
Jeff Johnsona0619e42018-11-28 17:43:00 -080010433 pmac = MAC_CONTEXT(mac_handle);
Arun Khandavalli4b55da72016-07-19 19:55:01 +053010434
10435 status = sme_acquire_global_lock(&pmac->sme);
10436 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson959f3692018-07-03 17:30:40 -070010437 pmac->sme.link_layer_stats_cb = NULL;
Arun Khandavalli4b55da72016-07-19 19:55:01 +053010438 sme_release_global_lock(&pmac->sme);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053010439 } else
10440 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
10441 "%s: sme_acquire_global_lock error", __func__);
Arun Khandavalli4b55da72016-07-19 19:55:01 +053010442
10443 return status;
10444}
10445
Zhang Qian73c348a2017-03-13 16:15:55 +080010446/**
10447 * sme_ll_stats_set_thresh - set threshold for mac counters
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -080010448 * @mac_handle: Opaque handle to the global MAC context
Zhang Qian73c348a2017-03-13 16:15:55 +080010449 * @threshold, threshold for mac counters
10450 *
10451 * Return: QDF_STATUS Enumeration
10452 */
Jeff Johnsonc7309062018-11-09 20:59:42 -080010453QDF_STATUS sme_ll_stats_set_thresh(mac_handle_t mac_handle,
Zhang Qian73c348a2017-03-13 16:15:55 +080010454 struct sir_ll_ext_stats_threshold *threshold)
10455{
10456 QDF_STATUS status;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080010457 struct mac_context *mac;
Rajeev Kumar658e8492017-12-13 11:35:41 -080010458 struct scheduler_msg message = {0};
Zhang Qian73c348a2017-03-13 16:15:55 +080010459 struct sir_ll_ext_stats_threshold *thresh;
10460
10461 if (!threshold) {
10462 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
10463 FL("threshold is not valid"));
10464 return QDF_STATUS_E_INVAL;
10465 }
10466
Jeff Johnsonc7309062018-11-09 20:59:42 -080010467 if (!mac_handle) {
Zhang Qian73c348a2017-03-13 16:15:55 +080010468 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Jeff Johnsonc7309062018-11-09 20:59:42 -080010469 FL("mac_handle is not valid"));
Zhang Qian73c348a2017-03-13 16:15:55 +080010470 return QDF_STATUS_E_INVAL;
10471 }
Jeff Johnsona0619e42018-11-28 17:43:00 -080010472 mac = MAC_CONTEXT(mac_handle);
Zhang Qian73c348a2017-03-13 16:15:55 +080010473
10474 thresh = qdf_mem_malloc(sizeof(*thresh));
Arif Hussain0ef77082018-10-10 16:42:53 -070010475 if (!thresh)
Zhang Qian73c348a2017-03-13 16:15:55 +080010476 return QDF_STATUS_E_NOMEM;
Arif Hussain0ef77082018-10-10 16:42:53 -070010477
Zhang Qian73c348a2017-03-13 16:15:55 +080010478 *thresh = *threshold;
10479
10480 status = sme_acquire_global_lock(&mac->sme);
10481 if (QDF_IS_STATUS_SUCCESS(status)) {
10482 /* Serialize the req through MC thread */
10483 message.bodyptr = thresh;
10484 message.type = WDA_LINK_LAYER_STATS_SET_THRESHOLD;
10485 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
10486 NO_SESSION, message.type));
gaurank kathpalia36b0c582018-08-28 17:45:43 +053010487 status = scheduler_post_message(QDF_MODULE_ID_SME,
10488 QDF_MODULE_ID_WMA,
10489 QDF_MODULE_ID_WMA, &message);
Zhang Qian73c348a2017-03-13 16:15:55 +080010490 if (!QDF_IS_STATUS_SUCCESS(status)) {
10491 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
10492 "%s: not able to post WDA_LL_STATS_GET_REQ",
10493 __func__);
10494 qdf_mem_free(thresh);
10495 }
10496 sme_release_global_lock(&mac->sme);
10497 } else {
10498 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
10499 FL("sme_acquire_global_lock error"));
10500 qdf_mem_free(thresh);
10501 }
10502 return status;
10503}
Arun Khandavalli4b55da72016-07-19 19:55:01 +053010504
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010505#endif /* WLAN_FEATURE_LINK_LAYER_STATS */
10506
Sridhar Selvarajdc400d22016-10-18 17:18:03 +053010507#ifdef WLAN_POWER_DEBUGFS
10508/**
10509 * sme_power_debug_stats_req() - SME API to collect Power debug stats
10510 * @callback_fn: Pointer to the callback function for Power stats event
10511 * @power_stats_context: Pointer to context
10512 *
10513 * Return: QDF_STATUS
10514 */
Jeff Johnsonc7309062018-11-09 20:59:42 -080010515QDF_STATUS sme_power_debug_stats_req(
10516 mac_handle_t mac_handle,
10517 void (*callback_fn)(struct power_stats_response *response,
10518 void *context),
10519 void *power_stats_context)
Sridhar Selvarajdc400d22016-10-18 17:18:03 +053010520{
10521 QDF_STATUS status = QDF_STATUS_SUCCESS;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080010522 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Rajeev Kumar37d478b2017-04-17 16:59:28 -070010523 struct scheduler_msg msg = {0};
Sridhar Selvarajdc400d22016-10-18 17:18:03 +053010524
10525 status = sme_acquire_global_lock(&mac_ctx->sme);
10526 if (QDF_IS_STATUS_SUCCESS(status)) {
10527 if (!callback_fn) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070010528 sme_err("Indication callback did not registered");
Sridhar Selvarajdc400d22016-10-18 17:18:03 +053010529 sme_release_global_lock(&mac_ctx->sme);
10530 return QDF_STATUS_E_FAILURE;
10531 }
10532
10533 mac_ctx->sme.power_debug_stats_context = power_stats_context;
10534 mac_ctx->sme.power_stats_resp_callback = callback_fn;
10535 msg.bodyptr = NULL;
10536 msg.type = WMA_POWER_DEBUG_STATS_REQ;
gaurank kathpalia36b0c582018-08-28 17:45:43 +053010537 status = scheduler_post_message(QDF_MODULE_ID_SME,
10538 QDF_MODULE_ID_WMA,
10539 QDF_MODULE_ID_WMA, &msg);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053010540 if (!QDF_IS_STATUS_SUCCESS(status))
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070010541 sme_err("not able to post WDA_POWER_DEBUG_STATS_REQ");
Sridhar Selvarajdc400d22016-10-18 17:18:03 +053010542 sme_release_global_lock(&mac_ctx->sme);
10543 }
10544 return status;
10545}
10546#endif
10547
Arunk Khandavallica56d4b2018-11-29 15:46:00 +053010548#ifdef WLAN_FEATURE_BEACON_RECEPTION_STATS
10549QDF_STATUS sme_beacon_debug_stats_req(
10550 mac_handle_t mac_handle, uint32_t vdev_id,
10551 void (*callback_fn)(struct bcn_reception_stats_rsp
10552 *response, void *context),
10553 void *beacon_stats_context)
10554{
10555 QDF_STATUS status;
10556 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
10557 uint32_t *val;
10558 struct scheduler_msg msg = {0};
10559
10560 status = sme_acquire_global_lock(&mac_ctx->sme);
10561 if (QDF_IS_STATUS_SUCCESS(status)) {
10562 if (!callback_fn) {
10563 sme_err("Indication callback did not registered");
10564 sme_release_global_lock(&mac_ctx->sme);
10565 return QDF_STATUS_E_FAILURE;
10566 }
10567
Sourav Mohapatrac55bdf32018-12-13 16:16:50 +053010568 if (!mac_ctx->bcn_reception_stats &&
10569 !mac_ctx->mlme_cfg->gen.enable_beacon_reception_stats) {
10570 sme_err("Beacon Reception stats not supported");
Arunk Khandavallica56d4b2018-11-29 15:46:00 +053010571 sme_release_global_lock(&mac_ctx->sme);
10572 return QDF_STATUS_E_NOSUPPORT;
10573 }
10574
10575 val = qdf_mem_malloc(sizeof(*val));
10576 if (!val) {
10577 sme_release_global_lock(&mac_ctx->sme);
10578 return QDF_STATUS_E_NOMEM;
10579 }
10580
10581 *val = vdev_id;
10582 mac_ctx->sme.beacon_stats_context = beacon_stats_context;
10583 mac_ctx->sme.beacon_stats_resp_callback = callback_fn;
10584 msg.bodyptr = val;
10585 msg.type = WMA_BEACON_DEBUG_STATS_REQ;
10586 status = scheduler_post_message(QDF_MODULE_ID_SME,
10587 QDF_MODULE_ID_WMA,
10588 QDF_MODULE_ID_WMA, &msg);
10589 if (!QDF_IS_STATUS_SUCCESS(status)) {
10590 sme_err("not able to post WMA_BEACON_DEBUG_STATS_REQ");
10591 qdf_mem_free(val);
10592 }
10593 sme_release_global_lock(&mac_ctx->sme);
10594 }
10595 return status;
10596}
10597#endif
10598
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010599#ifdef WLAN_FEATURE_ROAM_OFFLOAD
Deepak Dhamdheref2a7d8b2016-08-19 16:17:38 -070010600/**
10601 * sme_update_roam_key_mgmt_offload_enabled() - enable/disable key mgmt offload
10602 * This is a synchronous call
Jeff Johnsond5fb2db2018-11-08 14:20:28 -080010603 * @mac_handle: The handle returned by mac_open.
Deepak Dhamdheref2a7d8b2016-08-19 16:17:38 -070010604 * @session_id: Session Identifier
10605 * @key_mgmt_offload_enabled: key mgmt enable/disable flag
Deepak Dhamdhere828f1892017-02-09 11:51:19 -080010606 * @pmkid_modes: PMKID modes of PMKSA caching and OKC
Deepak Dhamdheref2a7d8b2016-08-19 16:17:38 -070010607 * Return: QDF_STATUS_SUCCESS - SME updated config successfully.
10608 * Other status means SME is failed to update.
10609 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010610
Jeff Johnsond5fb2db2018-11-08 14:20:28 -080010611QDF_STATUS sme_update_roam_key_mgmt_offload_enabled(mac_handle_t mac_handle,
Deepak Dhamdhere828f1892017-02-09 11:51:19 -080010612 uint8_t session_id,
10613 bool key_mgmt_offload_enabled,
10614 struct pmkid_mode_bits *pmkid_modes)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010615{
Jeff Johnson0a8786a2018-12-02 10:49:01 -080010616 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010617 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010618
Deepak Dhamdheref2a7d8b2016-08-19 16:17:38 -070010619 status = sme_acquire_global_lock(&mac_ctx->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010620 if (QDF_IS_STATUS_SUCCESS(status)) {
Deepak Dhamdheref2a7d8b2016-08-19 16:17:38 -070010621 if (CSR_IS_SESSION_VALID(mac_ctx, session_id)) {
Abhishek Singhe4a1f882017-08-10 17:59:44 +053010622 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Deepak Dhamdheref2a7d8b2016-08-19 16:17:38 -070010623 "%s: LFR3: key_mgmt_offload_enabled changed to %d",
10624 __func__, key_mgmt_offload_enabled);
10625 status = csr_roam_set_key_mgmt_offload(mac_ctx,
10626 session_id,
10627 key_mgmt_offload_enabled,
Deepak Dhamdhere828f1892017-02-09 11:51:19 -080010628 pmkid_modes);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053010629 } else
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010630 status = QDF_STATUS_E_INVAL;
Deepak Dhamdheref2a7d8b2016-08-19 16:17:38 -070010631 sme_release_global_lock(&mac_ctx->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010632 }
10633
10634 return status;
10635}
Prashanth Bhattabfc25292015-11-05 11:16:21 -080010636#endif
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010637
Jeff Johnson3f3ad252019-02-17 20:44:11 -080010638/**
10639 * sme_get_temperature() - SME API to get the pdev temperature
10640 * @mac_handle: Handle to global MAC context
10641 * @cb_context: temperature callback context
10642 * @cb: callback function with response (temperature)
10643 * Return: QDF_STATUS
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053010644 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -080010645QDF_STATUS sme_get_temperature(mac_handle_t mac_handle,
Jeff Johnson3f3ad252019-02-17 20:44:11 -080010646 void *cb_context,
10647 void (*cb)(int temperature,
10648 void *context))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010649{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010650 QDF_STATUS status = QDF_STATUS_SUCCESS;
10651 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080010652 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Rajeev Kumar37d478b2017-04-17 16:59:28 -070010653 struct scheduler_msg message = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010654
Jeff Johnson01f2c232018-11-21 19:17:44 -080010655 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010656 if (QDF_STATUS_SUCCESS == status) {
Jeff Johnson3f3ad252019-02-17 20:44:11 -080010657 if ((!cb) &&
10658 (!mac->sme.temperature_cb)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053010659 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053010660 "Indication Call back did not registered");
Jeff Johnson01f2c232018-11-21 19:17:44 -080010661 sme_release_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010662 return QDF_STATUS_E_FAILURE;
Jeff Johnson3f3ad252019-02-17 20:44:11 -080010663 } else if (cb) {
10664 mac->sme.temperature_cb_context = cb_context;
10665 mac->sme.temperature_cb = cb;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010666 }
10667 /* serialize the req through MC thread */
Rajeev Kumar8eaedf62017-01-21 11:03:13 -080010668 message.bodyptr = NULL;
10669 message.type = WMA_GET_TEMPERATURE_REQ;
gaurank kathpalia36b0c582018-08-28 17:45:43 +053010670 qdf_status = scheduler_post_message(QDF_MODULE_ID_SME,
10671 QDF_MODULE_ID_WMA,
10672 QDF_MODULE_ID_WMA,
10673 &message);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010674 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053010675 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010676 FL("Post Get Temperature msg fail"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010677 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010678 }
Jeff Johnson01f2c232018-11-21 19:17:44 -080010679 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010680 }
10681 return status;
10682}
10683
Jeff Johnsonc7309062018-11-09 20:59:42 -080010684QDF_STATUS sme_set_scanning_mac_oui(mac_handle_t mac_handle,
Jeff Johnson9d45f332019-01-29 08:42:00 -080010685 struct scan_mac_oui *scan_mac_oui)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010686{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010687 QDF_STATUS status = QDF_STATUS_SUCCESS;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080010688 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Rajeev Kumar37d478b2017-04-17 16:59:28 -070010689 struct scheduler_msg message = {0};
Jeff Johnson9d45f332019-01-29 08:42:00 -080010690 struct scan_mac_oui *bodyptr;
10691
10692 /* per contract must make a copy of the params when messaging */
10693 bodyptr = qdf_mem_malloc(sizeof(*bodyptr));
10694 if (!bodyptr)
10695 return QDF_STATUS_E_NOMEM;
10696 *bodyptr = *scan_mac_oui;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010697
Jeff Johnson01f2c232018-11-21 19:17:44 -080010698 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010699 if (QDF_STATUS_SUCCESS == status) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010700 /* Serialize the req through MC thread */
Jeff Johnson9d45f332019-01-29 08:42:00 -080010701 message.bodyptr = bodyptr;
Rajeev Kumar8eaedf62017-01-21 11:03:13 -080010702 message.type = WMA_SET_SCAN_MAC_OUI_REQ;
Jeff Johnson9d45f332019-01-29 08:42:00 -080010703 status = scheduler_post_message(QDF_MODULE_ID_SME,
10704 QDF_MODULE_ID_WMA,
10705 QDF_MODULE_ID_WMA,
10706 &message);
Jeff Johnson01f2c232018-11-21 19:17:44 -080010707 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010708 }
Jeff Johnson9d45f332019-01-29 08:42:00 -080010709
10710 if (QDF_IS_STATUS_ERROR(status)) {
10711 sme_err("failure: %d", status);
10712 qdf_mem_free(bodyptr);
10713 }
10714
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010715 return status;
10716}
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010717
10718#ifdef DHCP_SERVER_OFFLOAD
Jeff Johnson8bfc29e2019-02-15 07:58:15 -080010719QDF_STATUS
10720sme_set_dhcp_srv_offload(mac_handle_t mac_handle,
10721 struct dhcp_offload_info_params *dhcp_srv_info)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010722{
Rajeev Kumar37d478b2017-04-17 16:59:28 -070010723 struct scheduler_msg message = {0};
Jeff Johnson8bfc29e2019-02-15 07:58:15 -080010724 struct dhcp_offload_info_params *payload;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010725 QDF_STATUS status = QDF_STATUS_SUCCESS;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080010726 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010727
Jeff Johnson8bfc29e2019-02-15 07:58:15 -080010728 payload = qdf_mem_malloc(sizeof(*payload));
10729 if (!payload)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010730 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010731
Jeff Johnson8bfc29e2019-02-15 07:58:15 -080010732 *payload = *dhcp_srv_info;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010733
Jeff Johnson01f2c232018-11-21 19:17:44 -080010734 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010735 if (QDF_STATUS_SUCCESS == status) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010736 /* serialize the req through MC thread */
Rajeev Kumar8eaedf62017-01-21 11:03:13 -080010737 message.type = WMA_SET_DHCP_SERVER_OFFLOAD_CMD;
Jeff Johnson8bfc29e2019-02-15 07:58:15 -080010738 message.bodyptr = payload;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010739
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010740 if (!QDF_IS_STATUS_SUCCESS
gaurank kathpalia36b0c582018-08-28 17:45:43 +053010741 (scheduler_post_message(QDF_MODULE_ID_SME,
10742 QDF_MODULE_ID_WMA,
10743 QDF_MODULE_ID_WMA,
10744 &message))) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053010745 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Varun Reddy Yeturu7b2a6572017-06-15 11:07:28 -070010746 "%s:WMA_SET_DHCP_SERVER_OFFLOAD_CMD failed",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010747 __func__);
Jeff Johnson8bfc29e2019-02-15 07:58:15 -080010748 qdf_mem_free(payload);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010749 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010750 }
Jeff Johnson01f2c232018-11-21 19:17:44 -080010751 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010752 } else {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053010753 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010754 "%s: sme_acquire_global_lock error!", __func__);
Jeff Johnson8bfc29e2019-02-15 07:58:15 -080010755 qdf_mem_free(payload);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010756 }
10757
10758 return status;
10759}
10760#endif /* DHCP_SERVER_OFFLOAD */
10761
Krunal Soniaadaa272017-10-04 16:42:55 -070010762QDF_STATUS sme_send_unit_test_cmd(uint32_t vdev_id, uint32_t module_id,
10763 uint32_t arg_count, uint32_t *arg)
10764{
10765 return wma_form_unit_test_cmd_and_send(vdev_id, module_id,
10766 arg_count, arg);
10767}
10768
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010769#ifdef WLAN_FEATURE_GPIO_LED_FLASHING
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053010770/*
10771 * sme_set_led_flashing() -
10772 * API to set the Led flashing parameters.
10773 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -080010774 * mac_handle - The handle returned by mac_open.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053010775 * x0, x1 - led flashing parameters
10776 * Return QDF_STATUS
10777 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -080010778QDF_STATUS sme_set_led_flashing(mac_handle_t mac_handle, uint8_t type,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010779 uint32_t x0, uint32_t x1)
10780{
Jeff Johnson5a6b6602017-10-04 14:44:30 -070010781 QDF_STATUS status;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080010782 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Rajeev Kumar37d478b2017-04-17 16:59:28 -070010783 struct scheduler_msg message = {0};
Jeff Johnson5a6b6602017-10-04 14:44:30 -070010784 struct flashing_req_params *ledflashing;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010785
Anurag Chouhan600c3a02016-03-01 10:33:54 +053010786 ledflashing = qdf_mem_malloc(sizeof(*ledflashing));
Arif Hussain0ef77082018-10-10 16:42:53 -070010787 if (!ledflashing)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010788 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010789
Jeff Johnson5a6b6602017-10-04 14:44:30 -070010790 ledflashing->req_id = 0;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010791 ledflashing->pattern_id = type;
10792 ledflashing->led_x0 = x0;
10793 ledflashing->led_x1 = x1;
10794
Jeff Johnson01f2c232018-11-21 19:17:44 -080010795 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010796 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010797 /* Serialize the req through MC thread */
Rajeev Kumar8eaedf62017-01-21 11:03:13 -080010798 message.bodyptr = ledflashing;
10799 message.type = WMA_LED_FLASHING_REQ;
gaurank kathpalia36b0c582018-08-28 17:45:43 +053010800 status = scheduler_post_message(QDF_MODULE_ID_SME,
10801 QDF_MODULE_ID_WMA,
10802 QDF_MODULE_ID_WMA, &message);
Jeff Johnson01f2c232018-11-21 19:17:44 -080010803 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010804 }
Jeff Johnson5a6b6602017-10-04 14:44:30 -070010805 if (!QDF_IS_STATUS_SUCCESS(status))
10806 qdf_mem_free(ledflashing);
10807
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010808 return status;
10809}
10810#endif
10811
10812/**
Min Liu5eaf7242018-03-13 17:32:15 +080010813 * sme_enable_dfS_chan_scan() - set DFS channel scan enable/disable
Jeff Johnsonb460dd72018-11-08 10:26:51 -080010814 * @mac_handle: corestack handler
Min Liu5eaf7242018-03-13 17:32:15 +080010815 * @dfs_flag: flag indicating dfs channel enable/disable
10816 * Return: QDF_STATUS
10817 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -080010818QDF_STATUS sme_enable_dfs_chan_scan(mac_handle_t mac_handle, uint8_t dfs_flag)
Min Liu5eaf7242018-03-13 17:32:15 +080010819{
10820 QDF_STATUS status = QDF_STATUS_SUCCESS;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080010821 struct mac_context *mac;
Min Liu5eaf7242018-03-13 17:32:15 +080010822
Jeff Johnsonb460dd72018-11-08 10:26:51 -080010823 if (!mac_handle) {
Jeff Johnsonc7309062018-11-09 20:59:42 -080010824 sme_err("mac_handle is NULL");
Min Liu5eaf7242018-03-13 17:32:15 +080010825 return QDF_STATUS_E_INVAL;
10826 }
10827
Jeff Johnsona0619e42018-11-28 17:43:00 -080010828 mac = MAC_CONTEXT(mac_handle);
Min Liu5eaf7242018-03-13 17:32:15 +080010829
10830 mac->scan.fEnableDFSChnlScan = dfs_flag;
10831
10832 return status;
10833}
10834
Edhar, Mahesh Kumardf2ec122015-11-16 11:33:16 +053010835#ifdef FEATURE_WLAN_MCC_TO_SCC_SWITCH
10836/**
10837 * sme_validate_sap_channel_switch() - validate target channel switch w.r.t
10838 * concurreny rules set to avoid channel interference.
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -080010839 * @mac_handle: Opaque handle to the global MAC context
Edhar, Mahesh Kumardf2ec122015-11-16 11:33:16 +053010840 * @sap_ch - channel to switch
10841 * @sap_phy_mode - phy mode of SAP
10842 * @cc_switch_mode - concurreny switch mode
10843 * @session_id - sme session id.
10844 *
10845 * Return: true if there is no channel interference else return false
10846 */
Jeff Johnsonc7309062018-11-09 20:59:42 -080010847bool sme_validate_sap_channel_switch(mac_handle_t mac_handle,
10848 uint16_t sap_ch,
10849 eCsrPhyMode sap_phy_mode,
10850 uint8_t cc_switch_mode,
10851 uint8_t session_id)
Edhar, Mahesh Kumardf2ec122015-11-16 11:33:16 +053010852{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010853 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080010854 struct mac_context *mac = MAC_CONTEXT(mac_handle);
gaurank kathpalia14e2f912017-08-31 14:51:45 +053010855 struct csr_roam_session *session = CSR_GET_SESSION(mac, session_id);
Edhar, Mahesh Kumardf2ec122015-11-16 11:33:16 +053010856 uint16_t intf_channel = 0;
10857
10858 if (!session)
10859 return false;
10860
10861 session->ch_switch_in_progress = true;
10862 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010863 if (QDF_IS_STATUS_SUCCESS(status)) {
Edhar, Mahesh Kumardf2ec122015-11-16 11:33:16 +053010864 intf_channel = csr_check_concurrent_channel_overlap(mac, sap_ch,
10865 sap_phy_mode,
10866 cc_switch_mode);
10867 sme_release_global_lock(&mac->sme);
10868 } else {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053010869 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Edhar, Mahesh Kumardf2ec122015-11-16 11:33:16 +053010870 FL("sme_acquire_global_lock error!"));
10871 session->ch_switch_in_progress = false;
10872 return false;
10873 }
10874
10875 session->ch_switch_in_progress = false;
10876 return (intf_channel == 0) ? true : false;
10877}
10878#endif
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010879
10880/**
10881 * sme_configure_stats_avg_factor() - function to config avg. stats factor
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -080010882 * @mac_handle: Opaque handle to the global MAC context
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010883 * @session_id: session ID
10884 * @stats_avg_factor: average stats factor
10885 *
10886 * This function configures the stats avg factor in firmware
10887 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010888 * Return: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010889 */
Jeff Johnsonc7309062018-11-09 20:59:42 -080010890QDF_STATUS sme_configure_stats_avg_factor(mac_handle_t mac_handle,
10891 uint8_t session_id,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010892 uint16_t stats_avg_factor)
10893{
Rajeev Kumar37d478b2017-04-17 16:59:28 -070010894 struct scheduler_msg msg = {0};
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010895 QDF_STATUS status = QDF_STATUS_SUCCESS;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080010896 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010897 struct sir_stats_avg_factor *stats_factor;
10898
Anurag Chouhan600c3a02016-03-01 10:33:54 +053010899 stats_factor = qdf_mem_malloc(sizeof(*stats_factor));
Arif Hussain0ef77082018-10-10 16:42:53 -070010900 if (!stats_factor)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010901 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010902
10903 status = sme_acquire_global_lock(&mac->sme);
10904
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010905 if (QDF_STATUS_SUCCESS == status) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010906
10907 stats_factor->vdev_id = session_id;
10908 stats_factor->stats_avg_factor = stats_avg_factor;
10909
10910 /* serialize the req through MC thread */
10911 msg.type = SIR_HAL_CONFIG_STATS_FACTOR;
10912 msg.bodyptr = stats_factor;
10913
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010914 if (!QDF_IS_STATUS_SUCCESS(
gaurank kathpalia36b0c582018-08-28 17:45:43 +053010915 scheduler_post_message(QDF_MODULE_ID_SME,
10916 QDF_MODULE_ID_WMA,
10917 QDF_MODULE_ID_WMA, &msg))) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053010918 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010919 "%s: Not able to post SIR_HAL_CONFIG_STATS_FACTOR to WMA!",
10920 __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053010921 qdf_mem_free(stats_factor);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010922 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010923 }
10924 sme_release_global_lock(&mac->sme);
10925 } else {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053010926 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010927 "%s: sme_acquire_global_lock error!",
10928 __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053010929 qdf_mem_free(stats_factor);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010930 }
10931
10932 return status;
10933}
10934
10935/**
10936 * sme_configure_guard_time() - function to configure guard time
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -080010937 * @mac_handle: Opaque handle to the global MAC context
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010938 * @session_id: session id
10939 * @guard_time: guard time
10940 *
10941 * This function configures the guard time in firmware
10942 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010943 * Return: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010944 */
Jeff Johnsonc7309062018-11-09 20:59:42 -080010945QDF_STATUS sme_configure_guard_time(mac_handle_t mac_handle, uint8_t session_id,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010946 uint32_t guard_time)
10947{
Rajeev Kumar37d478b2017-04-17 16:59:28 -070010948 struct scheduler_msg msg = {0};
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010949 QDF_STATUS status = QDF_STATUS_SUCCESS;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080010950 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010951 struct sir_guard_time_request *g_time;
10952
Anurag Chouhan600c3a02016-03-01 10:33:54 +053010953 g_time = qdf_mem_malloc(sizeof(*g_time));
Arif Hussain0ef77082018-10-10 16:42:53 -070010954 if (!g_time)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010955 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010956
10957 status = sme_acquire_global_lock(&mac->sme);
10958
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010959 if (QDF_STATUS_SUCCESS == status) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010960
10961 g_time->vdev_id = session_id;
10962 g_time->guard_time = guard_time;
10963
10964 /* serialize the req through MC thread */
10965 msg.type = SIR_HAL_CONFIG_GUARD_TIME;
10966 msg.bodyptr = g_time;
10967
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010968 if (!QDF_IS_STATUS_SUCCESS(
gaurank kathpalia36b0c582018-08-28 17:45:43 +053010969 scheduler_post_message(QDF_MODULE_ID_SME,
10970 QDF_MODULE_ID_WMA,
10971 QDF_MODULE_ID_WMA, &msg))) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053010972 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010973 "%s: Not able to post SIR_HAL_CONFIG_GUARD_TIME to WMA!",
10974 __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053010975 qdf_mem_free(g_time);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010976 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010977 }
10978 sme_release_global_lock(&mac->sme);
10979 } else {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053010980 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010981 "%s: sme_acquire_global_lock error!",
10982 __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053010983 qdf_mem_free(g_time);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010984 }
10985
10986 return status;
10987}
10988
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010989/*
10990 * sme_wifi_start_logger() - Send the start/stop logging command to WMA
10991 * to either start/stop logging
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -080010992 * @mac_handle: Opaque handle to the global MAC context
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010993 * @start_log: Structure containing the wifi start logger params
10994 *
10995 * This function sends the start/stop logging command to WMA
10996 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010997 * Return: QDF_STATUS_SUCCESS on successful posting
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010998 */
Jeff Johnsonc7309062018-11-09 20:59:42 -080010999QDF_STATUS sme_wifi_start_logger(mac_handle_t mac_handle,
11000 struct sir_wifi_start_log start_log)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011001{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011002 QDF_STATUS status = QDF_STATUS_SUCCESS;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080011003 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Rajeev Kumar37d478b2017-04-17 16:59:28 -070011004 struct scheduler_msg message = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011005 struct sir_wifi_start_log *req_msg;
11006 uint32_t len;
11007
11008 len = sizeof(*req_msg);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053011009 req_msg = qdf_mem_malloc(len);
Arif Hussain0ef77082018-10-10 16:42:53 -070011010 if (!req_msg)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011011 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011012
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011013 req_msg->verbose_level = start_log.verbose_level;
Poddar, Siddartheefe3482016-09-21 18:12:59 +053011014 req_msg->is_iwpriv_command = start_log.is_iwpriv_command;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011015 req_msg->ring_id = start_log.ring_id;
Srinivas Girigowdac34f11d2016-02-25 16:02:42 -080011016 req_msg->ini_triggered = start_log.ini_triggered;
11017 req_msg->user_triggered = start_log.user_triggered;
Poddar, Siddarth176c4362016-10-03 12:25:00 +053011018 req_msg->size = start_log.size;
Poddar, Siddarthab99a272017-04-10 12:53:26 +053011019 req_msg->is_pktlog_buff_clear = start_log.is_pktlog_buff_clear;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011020
11021 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011022 if (status != QDF_STATUS_SUCCESS) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070011023 sme_err("sme_acquire_global_lock failed(status=%d)", status);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053011024 qdf_mem_free(req_msg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011025 return status;
11026 }
11027
11028 /* Serialize the req through MC thread */
Rajeev Kumar8eaedf62017-01-21 11:03:13 -080011029 message.bodyptr = req_msg;
11030 message.type = SIR_HAL_START_STOP_LOGGING;
gaurank kathpalia36b0c582018-08-28 17:45:43 +053011031 status = scheduler_post_message(QDF_MODULE_ID_SME,
11032 QDF_MODULE_ID_WMA,
11033 QDF_MODULE_ID_WMA, &message);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011034 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070011035 sme_err("scheduler_post_msg failed!(err=%d)", status);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053011036 qdf_mem_free(req_msg);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011037 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011038 }
11039 sme_release_global_lock(&mac->sme);
11040
11041 return status;
11042}
11043
11044/**
11045 * sme_neighbor_middle_of_roaming() - Function to know if
11046 * STA is in the middle of roaming states
Jeff Johnsonc7309062018-11-09 20:59:42 -080011047 * @mac_handle: Handle returned by macOpen
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011048 * @sessionId: sessionId of the STA session
11049 *
11050 * This function is a wrapper to call
11051 * csr_neighbor_middle_of_roaming to know STA is in the
11052 * middle of roaming states
11053 *
11054 * Return: True or False
11055 *
11056 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -080011057bool sme_neighbor_middle_of_roaming(mac_handle_t mac_handle, uint8_t sessionId)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011058{
Jeff Johnson0a8786a2018-12-02 10:49:01 -080011059 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Sandeep Puligillaca631612016-11-08 11:53:52 -080011060 bool val = false;
11061
11062 if (CSR_IS_SESSION_VALID(mac_ctx, sessionId))
11063 val = csr_neighbor_middle_of_roaming(mac_ctx, sessionId);
11064 else
Rajeev Kumar9176ca42018-05-03 09:20:40 -070011065 sme_debug("Invalid Session: %d", sessionId);
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070011066
Sandeep Puligillaca631612016-11-08 11:53:52 -080011067 return val;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011068}
11069
Jeff Johnsonc7309062018-11-09 20:59:42 -080011070bool sme_is_any_session_in_middle_of_roaming(mac_handle_t mac_handle)
Padma, Santhosh Kumar86747ec2018-05-29 18:28:29 +053011071{
Jeff Johnson0a8786a2018-12-02 10:49:01 -080011072 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Padma, Santhosh Kumar86747ec2018-05-29 18:28:29 +053011073 uint8_t session_id;
11074
Dustin Brownad06be62019-02-04 14:52:56 -080011075 for (session_id = 0; session_id < WLAN_MAX_VDEVS; session_id++) {
Padma, Santhosh Kumar86747ec2018-05-29 18:28:29 +053011076 if (CSR_IS_SESSION_VALID(mac_ctx, session_id) &&
11077 csr_neighbor_middle_of_roaming(mac_ctx, session_id))
11078 return true;
11079 }
11080
11081 return false;
11082}
11083
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011084/*
11085 * sme_send_flush_logs_cmd_to_fw() - Flush FW logs
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011086 *
11087 * This function is used to send the command that will
11088 * be used to flush the logs in the firmware
11089 *
Deepak Dhamdhere0f076bd2016-06-02 11:29:21 -070011090 * Return: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011091 */
Jeff Johnson40894142018-11-17 12:05:54 -080011092QDF_STATUS sme_send_flush_logs_cmd_to_fw(void)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011093{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011094 QDF_STATUS status;
Rajeev Kumar37d478b2017-04-17 16:59:28 -070011095 struct scheduler_msg message = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011096
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011097 /* Serialize the req through MC thread */
11098 message.bodyptr = NULL;
11099 message.type = SIR_HAL_FLUSH_LOG_TO_FW;
gaurank kathpalia36b0c582018-08-28 17:45:43 +053011100 status = scheduler_post_message(QDF_MODULE_ID_SME,
11101 QDF_MODULE_ID_WMA,
11102 QDF_MODULE_ID_WMA, &message);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011103 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070011104 sme_err("scheduler_post_msg failed!(err=%d)", status);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011105 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011106 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011107 return status;
11108}
11109
Jeff Johnsona1e92612017-09-24 15:33:44 -070011110QDF_STATUS sme_enable_uapsd_for_ac(uint8_t sta_id,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011111 sme_ac_enum_type ac, uint8_t tid,
11112 uint8_t pri, uint32_t srvc_int,
11113 uint32_t sus_int,
Abhishek Singh12be60f2017-08-11 13:52:42 +053011114 enum sme_qos_wmm_dir_type dir,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011115 uint8_t psb, uint32_t sessionId,
11116 uint32_t delay_interval)
11117{
11118 void *wma_handle;
11119 t_wma_trigger_uapsd_params uapsd_params;
11120 enum uapsd_ac access_category;
11121
11122 if (!psb) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053011123 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011124 "No need to configure auto trigger:psb is 0");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011125 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011126 }
11127
Anurag Chouhan6d760662016-02-20 16:05:43 +053011128 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011129 if (!wma_handle) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053011130 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011131 "wma_handle is NULL");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011132 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011133 }
11134
11135 switch (ac) {
11136 case SME_AC_BK:
11137 access_category = UAPSD_BK;
11138 break;
11139 case SME_AC_BE:
11140 access_category = UAPSD_BE;
11141 break;
11142 case SME_AC_VI:
11143 access_category = UAPSD_VI;
11144 break;
11145 case SME_AC_VO:
11146 access_category = UAPSD_VO;
11147 break;
11148 default:
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011149 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011150 }
11151
11152 uapsd_params.wmm_ac = access_category;
11153 uapsd_params.user_priority = pri;
11154 uapsd_params.service_interval = srvc_int;
11155 uapsd_params.delay_interval = delay_interval;
11156 uapsd_params.suspend_interval = sus_int;
11157
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011158 if (QDF_STATUS_SUCCESS !=
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011159 wma_trigger_uapsd_params(wma_handle, sessionId, &uapsd_params)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053011160 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011161 "Failed to Trigger Uapsd params for sessionId %d",
11162 sessionId);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011163 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011164 }
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011165 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011166}
11167
Jeff Johnsona1e92612017-09-24 15:33:44 -070011168QDF_STATUS sme_disable_uapsd_for_ac(uint8_t sta_id,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011169 sme_ac_enum_type ac,
11170 uint32_t sessionId)
11171{
11172 void *wma_handle;
11173 enum uapsd_ac access_category;
11174
11175 switch (ac) {
11176 case SME_AC_BK:
11177 access_category = UAPSD_BK;
11178 break;
11179 case SME_AC_BE:
11180 access_category = UAPSD_BE;
11181 break;
11182 case SME_AC_VI:
11183 access_category = UAPSD_VI;
11184 break;
11185 case SME_AC_VO:
11186 access_category = UAPSD_VO;
11187 break;
11188 default:
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011189 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011190 }
11191
Anurag Chouhan6d760662016-02-20 16:05:43 +053011192 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011193 if (!wma_handle) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053011194 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011195 "wma handle is NULL");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011196 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011197 }
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011198 if (QDF_STATUS_SUCCESS !=
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011199 wma_disable_uapsd_per_ac(wma_handle, sessionId, access_category)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053011200 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011201 "Failed to disable uapsd for ac %d for sessionId %d",
11202 ac, sessionId);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011203 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011204 }
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011205 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011206}
11207
11208/**
11209 * sme_update_nss() - SME API to change the number for spatial streams
11210 * (1 or 2)
Jeff Johnsonc7309062018-11-09 20:59:42 -080011211 * @mac_handle: Handle returned by mac open
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011212 * @nss: Number of spatial streams
11213 *
11214 * This function is used to update the number of spatial streams supported.
11215 *
11216 * Return: Success upon successfully changing nss else failure
11217 *
11218 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -080011219QDF_STATUS sme_update_nss(mac_handle_t mac_handle, uint8_t nss)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011220{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011221 QDF_STATUS status;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080011222 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Vignesh Viswanathan21c58cb2018-05-24 15:53:58 +053011223 uint32_t i;
11224 struct mlme_ht_capabilities_info *ht_cap_info;
gaurank kathpalia14e2f912017-08-31 14:51:45 +053011225 struct csr_roam_session *csr_session;
Abhinav Kumard4d6eb72018-12-04 20:30:37 +053011226 struct mlme_vht_capabilities_info *vht_cap_info;
Abhinav Kumarb074f2f2018-09-15 15:32:11 +053011227
Abhinav Kumard4d6eb72018-12-04 20:30:37 +053011228 vht_cap_info = &mac_ctx->mlme_cfg->vht_caps.vht_cap_info;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011229
11230 status = sme_acquire_global_lock(&mac_ctx->sme);
11231
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011232 if (QDF_STATUS_SUCCESS == status) {
Abhinav Kumard4d6eb72018-12-04 20:30:37 +053011233 vht_cap_info->enable2x2 = (nss == 1) ? 0 : 1;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011234
11235 /* get the HT capability info*/
Vignesh Viswanathan21c58cb2018-05-24 15:53:58 +053011236 ht_cap_info = &mac_ctx->mlme_cfg->ht_caps.ht_cap_info;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011237
Dustin Brownad06be62019-02-04 14:52:56 -080011238 for (i = 0; i < WLAN_MAX_VDEVS; i++) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011239 if (CSR_IS_SESSION_VALID(mac_ctx, i)) {
11240 csr_session = &mac_ctx->roam.roamSession[i];
Jeff Johnsonbe119e62019-02-02 12:30:26 -080011241 csr_session->ht_config.ht_tx_stbc =
Vignesh Viswanathan78182502018-08-06 15:13:30 +053011242 ht_cap_info->tx_stbc;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011243 }
11244 }
11245
11246 sme_release_global_lock(&mac_ctx->sme);
11247 }
11248 return status;
11249}
11250
11251/**
Archana Ramachandran5041b252016-04-25 14:29:25 -070011252 * sme_update_user_configured_nss() - sets the nss based on user request
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -080011253 * @mac_handle: Opaque handle to the global MAC context
Archana Ramachandran5041b252016-04-25 14:29:25 -070011254 * @nss: number of streams
11255 *
11256 * Return: None
11257 */
Jeff Johnsonc7309062018-11-09 20:59:42 -080011258void sme_update_user_configured_nss(mac_handle_t mac_handle, uint8_t nss)
Archana Ramachandran5041b252016-04-25 14:29:25 -070011259{
Jeff Johnson0a8786a2018-12-02 10:49:01 -080011260 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Archana Ramachandran5041b252016-04-25 14:29:25 -070011261
11262 mac_ctx->user_configured_nss = nss;
11263}
11264
Jeff Johnsonc7309062018-11-09 20:59:42 -080011265int sme_update_tx_bfee_supp(mac_handle_t mac_handle, uint8_t session_id,
Kiran Kumar Lokere6c7f3fa2018-05-14 18:12:27 -070011266 uint8_t cfg_val)
11267{
Jeff Johnson0a8786a2018-12-02 10:49:01 -080011268 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Jeff Johnsonc18469b2018-06-11 06:48:59 -070011269
Abhinav Kumarb074f2f2018-09-15 15:32:11 +053011270 mac_ctx->mlme_cfg->vht_caps.vht_cap_info.su_bformee = cfg_val;
Kiran Kumar Lokere6c7f3fa2018-05-14 18:12:27 -070011271
Jeff Johnsonc7309062018-11-09 20:59:42 -080011272 return sme_update_he_tx_bfee_supp(mac_handle, session_id, cfg_val);
Kiran Kumar Lokere6c7f3fa2018-05-14 18:12:27 -070011273}
Kiran Kumar Lokeref3044852018-06-27 14:14:24 -070011274
Jeff Johnsonc7309062018-11-09 20:59:42 -080011275int sme_update_tx_bfee_nsts(mac_handle_t mac_handle, uint8_t session_id,
Kiran Kumar Lokeref3044852018-06-27 14:14:24 -070011276 uint8_t usr_cfg_val, uint8_t nsts_val)
11277{
Jeff Johnson0a8786a2018-12-02 10:49:01 -080011278 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Kiran Kumar Lokeref3044852018-06-27 14:14:24 -070011279 uint8_t nsts_set_val;
Abhinav Kumard4d6eb72018-12-04 20:30:37 +053011280 struct mlme_vht_capabilities_info *vht_cap_info;
Kiran Kumar Lokeref3044852018-06-27 14:14:24 -070011281
Abhinav Kumard4d6eb72018-12-04 20:30:37 +053011282 vht_cap_info = &mac_ctx->mlme_cfg->vht_caps.vht_cap_info;
Kiran Kumar Lokeref3044852018-06-27 14:14:24 -070011283 mac_ctx->usr_cfg_tx_bfee_nsts = usr_cfg_val;
11284 if (usr_cfg_val)
11285 nsts_set_val = usr_cfg_val;
11286 else
11287 nsts_set_val = nsts_val;
Dustin Brown48f27fe2018-10-09 12:47:57 -070011288
Abhinav Kumard4d6eb72018-12-04 20:30:37 +053011289 vht_cap_info->tx_bfee_ant_supp = nsts_set_val;
Kiran Kumar Lokeref3044852018-06-27 14:14:24 -070011290
Kiran Kumar Lokere86e85592018-07-18 15:34:24 -070011291 if (usr_cfg_val)
11292 sme_set_he_tx_bf_cbf_rates(session_id);
11293
Jeff Johnsonc7309062018-11-09 20:59:42 -080011294 return sme_update_he_tx_bfee_nsts(mac_handle, session_id, nsts_set_val);
Kiran Kumar Lokeref3044852018-06-27 14:14:24 -070011295}
Kiran Kumar Lokere44a29432018-01-24 16:10:30 -080011296#ifdef WLAN_FEATURE_11AX
Jinwei Chenffaa4672018-08-30 16:55:09 +080011297void sme_update_tgt_he_cap(mac_handle_t mac_handle,
11298 struct wma_tgt_cfg *cfg,
11299 tDot11fIEhe_cap *he_cap_ini)
Jinwei Chen998a1a02018-06-20 17:20:34 +080011300{
Jeff Johnson0a8786a2018-12-02 10:49:01 -080011301 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Jinwei Chen998a1a02018-06-20 17:20:34 +080011302
11303 qdf_mem_copy(&mac_ctx->he_cap_2g,
Jinwei Chenef742dc2018-06-27 12:57:50 +080011304 &cfg->he_cap_2g,
11305 sizeof(tDot11fIEhe_cap));
Jinwei Chen998a1a02018-06-20 17:20:34 +080011306
11307 qdf_mem_copy(&mac_ctx->he_cap_5g,
Jinwei Chenef742dc2018-06-27 12:57:50 +080011308 &cfg->he_cap_5g,
11309 sizeof(tDot11fIEhe_cap));
Jinwei Chenffaa4672018-08-30 16:55:09 +080011310
11311 /* modify HE Caps field according to INI setting */
11312 mac_ctx->he_cap_2g.bfee_sts_lt_80 =
11313 QDF_MIN(cfg->he_cap_2g.bfee_sts_lt_80,
11314 he_cap_ini->bfee_sts_lt_80);
11315
11316 mac_ctx->he_cap_5g.bfee_sts_lt_80 =
11317 QDF_MIN(cfg->he_cap_5g.bfee_sts_lt_80,
11318 he_cap_ini->bfee_sts_lt_80);
Jinwei Chen998a1a02018-06-20 17:20:34 +080011319}
11320
Jeff Johnsonc7309062018-11-09 20:59:42 -080011321void sme_update_he_cap_nss(mac_handle_t mac_handle, uint8_t session_id,
11322 uint8_t nss)
Kiran Kumar Lokere44a29432018-01-24 16:10:30 -080011323{
Jeff Johnson0a8786a2018-12-02 10:49:01 -080011324 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Kiran Kumar Lokere44a29432018-01-24 16:10:30 -080011325 struct csr_roam_session *csr_session;
11326 uint32_t tx_mcs_map = 0;
11327 uint32_t rx_mcs_map = 0;
Kiran Kumar Lokere8dba1892018-07-24 17:09:52 -070011328 uint32_t mcs_map = 0;
Kiran Kumar Lokere44a29432018-01-24 16:10:30 -080011329
11330 if (!nss || (nss > 2)) {
11331 sme_err("invalid Nss value %d", nss);
11332 }
11333 csr_session = CSR_GET_SESSION(mac_ctx, session_id);
Kiran Kumar Lokere1ba55bf2019-06-03 14:18:40 -070011334 if (!csr_session) {
11335 sme_err("No session for id %d", session_id);
11336 return;
11337 }
Bala Venkatesh6d537092018-09-25 10:38:36 +053011338 rx_mcs_map =
11339 mac_ctx->mlme_cfg->he_caps.dot11_he_cap.rx_he_mcs_map_lt_80;
11340 tx_mcs_map =
11341 mac_ctx->mlme_cfg->he_caps.dot11_he_cap.tx_he_mcs_map_lt_80;
Kiran Kumar Lokere8dba1892018-07-24 17:09:52 -070011342 mcs_map = rx_mcs_map & 0x3;
Bala Venkatesh6d537092018-09-25 10:38:36 +053011343
Kiran Kumar Lokere44a29432018-01-24 16:10:30 -080011344 if (nss == 1) {
11345 tx_mcs_map = HE_SET_MCS_4_NSS(tx_mcs_map, HE_MCS_DISABLE, 2);
11346 rx_mcs_map = HE_SET_MCS_4_NSS(rx_mcs_map, HE_MCS_DISABLE, 2);
11347 } else {
Kiran Kumar Lokere8dba1892018-07-24 17:09:52 -070011348 tx_mcs_map = HE_SET_MCS_4_NSS(tx_mcs_map, mcs_map, 2);
11349 rx_mcs_map = HE_SET_MCS_4_NSS(rx_mcs_map, mcs_map, 2);
Kiran Kumar Lokere44a29432018-01-24 16:10:30 -080011350 }
11351 sme_info("new HE Nss MCS MAP: Rx 0x%0X, Tx: 0x%0X",
11352 rx_mcs_map, tx_mcs_map);
Bala Venkatesh6d537092018-09-25 10:38:36 +053011353 if (cfg_in_range(CFG_HE_RX_MCS_MAP_LT_80, rx_mcs_map))
11354 mac_ctx->mlme_cfg->he_caps.dot11_he_cap.rx_he_mcs_map_lt_80 =
11355 rx_mcs_map;
11356 if (cfg_in_range(CFG_HE_TX_MCS_MAP_LT_80, tx_mcs_map))
11357 mac_ctx->mlme_cfg->he_caps.dot11_he_cap.tx_he_mcs_map_lt_80 =
11358 tx_mcs_map;
Kiran Kumar Lokere44a29432018-01-24 16:10:30 -080011359 csr_update_session_he_cap(mac_ctx, csr_session);
11360
11361}
Kiran Kumar Lokere96246e52018-01-24 16:44:35 -080011362
Jeff Johnsonc7309062018-11-09 20:59:42 -080011363int sme_update_he_mcs(mac_handle_t mac_handle, uint8_t session_id,
11364 uint16_t he_mcs)
Kiran Kumar Lokere96246e52018-01-24 16:44:35 -080011365{
Jeff Johnson0a8786a2018-12-02 10:49:01 -080011366 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Kiran Kumar Lokere96246e52018-01-24 16:44:35 -080011367 struct csr_roam_session *csr_session;
11368 uint16_t mcs_val = 0;
11369 uint16_t mcs_map = HE_MCS_ALL_DISABLED;
Kiran Kumar Lokere96246e52018-01-24 16:44:35 -080011370
11371 csr_session = CSR_GET_SESSION(mac_ctx, session_id);
11372 if (!csr_session) {
11373 sme_err("No session for id %d", session_id);
11374 return -EINVAL;
11375 }
11376 if ((he_mcs & 0x3) == HE_MCS_DISABLE) {
11377 sme_err("Invalid HE MCS 0x%0x, can't disable 0-7 for 1ss",
11378 he_mcs);
11379 return -EINVAL;
11380 }
11381 mcs_val = he_mcs & 0x3;
11382 switch (he_mcs) {
11383 case HE_80_MCS0_7:
11384 case HE_80_MCS0_9:
11385 case HE_80_MCS0_11:
Abhinav Kumarb074f2f2018-09-15 15:32:11 +053011386 if (mac_ctx->mlme_cfg->vht_caps.vht_cap_info.enable2x2) {
Kiran Kumar Lokere96246e52018-01-24 16:44:35 -080011387 mcs_map = HE_SET_MCS_4_NSS(mcs_map, mcs_val, 1);
11388 mcs_map = HE_SET_MCS_4_NSS(mcs_map, mcs_val, 2);
11389 } else {
11390 mcs_map = HE_SET_MCS_4_NSS(mcs_map, mcs_val, 1);
11391 }
Bala Venkatesh6d537092018-09-25 10:38:36 +053011392 if (cfg_in_range(CFG_HE_TX_MCS_MAP_LT_80, mcs_map))
11393 mac_ctx->mlme_cfg->he_caps.dot11_he_cap.
11394 tx_he_mcs_map_lt_80 = mcs_map;
11395 if (cfg_in_range(CFG_HE_RX_MCS_MAP_LT_80, mcs_map))
11396 mac_ctx->mlme_cfg->he_caps.dot11_he_cap.
11397 rx_he_mcs_map_lt_80 = mcs_map;
Kiran Kumar Lokere96246e52018-01-24 16:44:35 -080011398 break;
11399
11400 case HE_160_MCS0_7:
11401 case HE_160_MCS0_9:
11402 case HE_160_MCS0_11:
11403 mcs_map = HE_SET_MCS_4_NSS(mcs_map, mcs_val, 1);
Bala Venkatesh6d537092018-09-25 10:38:36 +053011404 if (cfg_in_range(CFG_HE_TX_MCS_MAP_160, mcs_map))
11405 qdf_mem_copy(mac_ctx->mlme_cfg->he_caps.dot11_he_cap.
11406 tx_he_mcs_map_160, &mcs_map,
11407 sizeof(uint16_t));
11408 if (cfg_in_range(CFG_HE_RX_MCS_MAP_160, mcs_map))
11409 qdf_mem_copy(mac_ctx->mlme_cfg->he_caps.dot11_he_cap.
11410 rx_he_mcs_map_160, &mcs_map,
11411 sizeof(uint16_t));
Kiran Kumar Lokere96246e52018-01-24 16:44:35 -080011412 break;
11413
11414 case HE_80p80_MCS0_7:
11415 case HE_80p80_MCS0_9:
11416 case HE_80p80_MCS0_11:
11417 mcs_map = HE_SET_MCS_4_NSS(mcs_map, mcs_val, 1);
Bala Venkatesh6d537092018-09-25 10:38:36 +053011418 if (cfg_in_range(CFG_HE_TX_MCS_MAP_80_80, mcs_map))
11419 qdf_mem_copy(mac_ctx->mlme_cfg->he_caps.dot11_he_cap.
11420 tx_he_mcs_map_80_80, &mcs_map,
11421 sizeof(uint16_t));
11422 if (cfg_in_range(CFG_HE_RX_MCS_MAP_80_80, mcs_map))
11423 qdf_mem_copy(mac_ctx->mlme_cfg->he_caps.dot11_he_cap.
11424 rx_he_mcs_map_80_80, &mcs_map,
11425 sizeof(uint16_t));
Kiran Kumar Lokere96246e52018-01-24 16:44:35 -080011426 break;
11427
11428 default:
11429 sme_err("Invalid HE MCS 0x%0x", he_mcs);
11430 return -EINVAL;
11431 }
11432 sme_info("new HE MCS 0x%0x", mcs_map);
Kiran Kumar Lokere96246e52018-01-24 16:44:35 -080011433 csr_update_session_he_cap(mac_ctx, csr_session);
11434
11435 return 0;
11436}
Kiran Kumar Lokere13dedac2018-02-05 19:51:59 -080011437
Jeff Johnsonc7309062018-11-09 20:59:42 -080011438void sme_set_usr_cfg_mu_edca(mac_handle_t mac_handle, bool val)
Kiran Kumar Lokeref54b8552018-07-10 00:53:38 -070011439{
Jeff Johnson0a8786a2018-12-02 10:49:01 -080011440 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Kiran Kumar Lokeref54b8552018-07-10 00:53:38 -070011441
11442 mac_ctx->usr_cfg_mu_edca_params = val;
11443}
11444
Jeff Johnsonc7309062018-11-09 20:59:42 -080011445int sme_update_mu_edca_params(mac_handle_t mac_handle, uint8_t session_id)
Kiran Kumar Lokerefba20632018-07-05 16:51:27 -070011446{
11447 struct scheduler_msg msg = {0};
11448 QDF_STATUS status;
11449
11450 qdf_mem_zero(&msg, sizeof(msg));
11451 msg.type = WNI_SME_UPDATE_MU_EDCA_PARAMS;
11452 msg.reserved = 0;
11453 msg.bodyval = session_id;
gaurank kathpalia36b0c582018-08-28 17:45:43 +053011454 status = scheduler_post_message(QDF_MODULE_ID_SME,
11455 QDF_MODULE_ID_PE,
11456 QDF_MODULE_ID_PE, &msg);
Kiran Kumar Lokerefba20632018-07-05 16:51:27 -070011457 if (status != QDF_STATUS_SUCCESS) {
11458 sme_err("Not able to post update edca profile");
11459 return -EIO;
11460 }
11461
11462 return 0;
11463}
Jeff Johnsonc7309062018-11-09 20:59:42 -080011464
11465void sme_set_he_mu_edca_def_cfg(mac_handle_t mac_handle)
Kiran Kumar Lokerefba20632018-07-05 16:51:27 -070011466{
Jeff Johnson0a8786a2018-12-02 10:49:01 -080011467 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Kiran Kumar Lokerefba20632018-07-05 16:51:27 -070011468 uint8_t i;
11469
Kiran Kumar Lokere8dba1892018-07-24 17:09:52 -070011470 sme_debug("Set MU EDCA params to default");
Srinivas Girigowda5b86fbd2019-03-21 14:54:14 -070011471 for (i = 0; i < QCA_WLAN_AC_ALL; i++) {
Kiran Kumar Lokerefba20632018-07-05 16:51:27 -070011472 mac_ctx->usr_mu_edca_params[i].aci.aifsn = MU_EDCA_DEF_AIFSN;
11473 mac_ctx->usr_mu_edca_params[i].aci.aci = i;
11474 mac_ctx->usr_mu_edca_params[i].cw.max = MU_EDCA_DEF_CW_MAX;
11475 mac_ctx->usr_mu_edca_params[i].cw.min = MU_EDCA_DEF_CW_MIN;
11476 mac_ctx->usr_mu_edca_params[i].mu_edca_timer =
11477 MU_EDCA_DEF_TIMER;
11478 }
11479}
11480
Jeff Johnsonc7309062018-11-09 20:59:42 -080011481int sme_update_he_tx_bfee_supp(mac_handle_t mac_handle, uint8_t session_id,
Kiran Kumar Lokere6c7f3fa2018-05-14 18:12:27 -070011482 uint8_t cfg_val)
11483{
Jeff Johnson0a8786a2018-12-02 10:49:01 -080011484 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Bala Venkatesh6d537092018-09-25 10:38:36 +053011485 struct csr_roam_session *session;
11486
11487 session = CSR_GET_SESSION(mac_ctx, session_id);
11488
11489 if (!session) {
11490 sme_err("No session for id %d", session_id);
11491 return -EINVAL;
11492 }
11493 if (cfg_val <= 1)
11494 mac_ctx->mlme_cfg->he_caps.dot11_he_cap.su_beamformee = cfg_val;
11495 else
11496 return -EINVAL;
11497
11498 csr_update_session_he_cap(mac_ctx, session);
11499 return 0;
Kiran Kumar Lokere6c7f3fa2018-05-14 18:12:27 -070011500}
11501
Jeff Johnsonc7309062018-11-09 20:59:42 -080011502int sme_update_he_trigger_frm_mac_pad(mac_handle_t mac_handle,
11503 uint8_t session_id,
Kiran Kumar Lokeref54b8552018-07-10 00:53:38 -070011504 uint8_t cfg_val)
11505{
Jeff Johnson0a8786a2018-12-02 10:49:01 -080011506 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Bala Venkatesh6d537092018-09-25 10:38:36 +053011507 struct csr_roam_session *session;
11508
11509 session = CSR_GET_SESSION(mac_ctx, session_id);
11510
11511 if (!session) {
11512 sme_err("No session for id %d", session_id);
11513 return -EINVAL;
11514 }
11515 if (cfg_in_range(CFG_HE_TRIG_PAD, cfg_val))
11516 mac_ctx->mlme_cfg->he_caps.dot11_he_cap.trigger_frm_mac_pad =
11517 cfg_val;
11518 else
11519 return -EINVAL;
11520
11521 csr_update_session_he_cap(mac_ctx, session);
11522 return 0;
11523
Kiran Kumar Lokeref54b8552018-07-10 00:53:38 -070011524}
11525
Jeff Johnsonc7309062018-11-09 20:59:42 -080011526int sme_update_he_om_ctrl_supp(mac_handle_t mac_handle, uint8_t session_id,
Kiran Kumar Lokeref1a96f42018-08-29 18:53:47 -070011527 uint8_t cfg_val)
11528{
Bala Venkatesh2fae18a2018-11-14 12:32:45 +053011529
Jeff Johnson0a8786a2018-12-02 10:49:01 -080011530 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Bala Venkatesh2fae18a2018-11-14 12:32:45 +053011531 struct csr_roam_session *session;
11532
11533 session = CSR_GET_SESSION(mac_ctx, session_id);
11534
11535 if (!session) {
11536 sme_err("No session for id %d", session_id);
11537 return -EINVAL;
11538 }
Harprit Chhabada89780bf2019-03-06 14:01:38 -080011539 mac_ctx->mlme_cfg->he_caps.dot11_he_cap.omi_a_ctrl = cfg_val;
Bala Venkatesh2fae18a2018-11-14 12:32:45 +053011540
11541 csr_update_session_he_cap(mac_ctx, session);
11542 return 0;
Kiran Kumar Lokeref1a96f42018-08-29 18:53:47 -070011543}
11544
Kiran Kumar Lokereacd107d2019-01-09 15:02:11 -080011545int sme_update_he_htc_he_supp(mac_handle_t mac_handle, uint8_t session_id,
11546 bool cfg_val)
Kiran Kumar Lokere94634152018-09-24 19:08:35 -070011547{
Kiran Kumar Lokereacd107d2019-01-09 15:02:11 -080011548
Jeff Johnson0a8786a2018-12-02 10:49:01 -080011549 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Kiran Kumar Lokereacd107d2019-01-09 15:02:11 -080011550 struct csr_roam_session *session;
11551
11552 session = CSR_GET_SESSION(mac_ctx, session_id);
Kiran Kumar Lokere94634152018-09-24 19:08:35 -070011553
11554 if (!session) {
Kiran Kumar Lokereacd107d2019-01-09 15:02:11 -080011555 sme_err("No session for id %d", session_id);
Kiran Kumar Lokere94634152018-09-24 19:08:35 -070011556 return -EINVAL;
11557 }
Kiran Kumar Lokereacd107d2019-01-09 15:02:11 -080011558
11559 mac_ctx->mlme_cfg->he_caps.dot11_he_cap.htc_he = cfg_val;
11560 csr_update_session_he_cap(mac_ctx, session);
11561
11562 return 0;
11563}
11564
11565static QDF_STATUS
11566sme_validate_session_for_cap_update(struct mac_context *mac_ctx,
11567 uint8_t session_id,
11568 struct csr_roam_session *session)
11569{
11570 if (!session) {
11571 sme_err("Session does not exist, Session_id: %d", session_id);
11572 return QDF_STATUS_E_INVAL;
11573 }
Kiran Kumar Lokere94634152018-09-24 19:08:35 -070011574 if (!csr_is_conn_state_connected_infra(mac_ctx, session_id)) {
11575 sme_info("STA is not connected, Session_id: %d", session_id);
Kiran Kumar Lokereacd107d2019-01-09 15:02:11 -080011576 return QDF_STATUS_E_INVAL;
11577 }
11578
11579 return QDF_STATUS_SUCCESS;
11580}
11581
11582int sme_send_he_om_ctrl_update(mac_handle_t mac_handle, uint8_t session_id)
11583{
11584 QDF_STATUS status = QDF_STATUS_SUCCESS;
11585 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
11586 struct omi_ctrl_tx omi_data = {0};
11587 void *wma_handle;
11588 struct csr_roam_session *session = CSR_GET_SESSION(mac_ctx, session_id);
11589 uint32_t param_val = 0;
11590
11591 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
11592 if (!wma_handle) {
11593 sme_err("wma handle is NULL");
11594 return -EIO;
11595 }
11596
11597 status = sme_validate_session_for_cap_update(mac_ctx, session_id,
11598 session);
11599 if (QDF_IS_STATUS_ERROR(status))
Kiran Kumar Lokere94634152018-09-24 19:08:35 -070011600 return -EINVAL;
Kiran Kumar Lokereacd107d2019-01-09 15:02:11 -080011601
11602 omi_data.a_ctrl_id = A_CTRL_ID_OMI;
11603
11604 if (mac_ctx->he_om_ctrl_cfg_nss_set)
11605 omi_data.rx_nss = mac_ctx->he_om_ctrl_cfg_nss;
11606 else
11607 omi_data.rx_nss = session->nss - 1;
11608
11609 if (mac_ctx->he_om_ctrl_cfg_tx_nsts_set)
11610 omi_data.tx_nsts = mac_ctx->he_om_ctrl_cfg_tx_nsts;
11611 else
11612 omi_data.tx_nsts = session->nss - 1;
11613
11614 if (mac_ctx->he_om_ctrl_cfg_bw_set)
11615 omi_data.ch_bw = mac_ctx->he_om_ctrl_cfg_bw;
11616 else
11617 omi_data.ch_bw = session->connectedProfile.vht_channel_width;
11618
11619 omi_data.ul_mu_dis = mac_ctx->he_om_ctrl_cfg_ul_mu_dis;
Kiran Kumar Lokere49e3aff2019-02-06 17:00:48 -080011620 omi_data.ul_mu_data_dis = mac_ctx->he_om_ctrl_ul_mu_data_dis;
Kiran Kumar Lokereacd107d2019-01-09 15:02:11 -080011621 omi_data.omi_in_vht = 0x1;
11622 omi_data.omi_in_he = 0x1;
11623
11624 sme_info("OMI: BW %d TxNSTS %d RxNSS %d ULMU %d, OMI_VHT %d, OMI_HE %d",
11625 omi_data.ch_bw, omi_data.tx_nsts, omi_data.rx_nss,
11626 omi_data.ul_mu_dis, omi_data.omi_in_vht, omi_data.omi_in_he);
11627 qdf_mem_copy(&param_val, &omi_data, sizeof(omi_data));
Srinivas Girigowdacb7b8b82019-04-10 14:27:47 -070011628 sme_debug("param val %08X, bssid:"QDF_MAC_ADDR_STR, param_val,
Srinivas Girigowda34fbba02019-04-08 12:07:44 -070011629 QDF_MAC_ADDR_ARRAY(session->connectedProfile.bssid.bytes));
Kiran Kumar Lokereacd107d2019-01-09 15:02:11 -080011630 status = wma_set_peer_param(wma_handle,
11631 session->connectedProfile.bssid.bytes,
11632 WMI_PEER_PARAM_XMIT_OMI,
11633 param_val, session_id);
Kiran Kumar Lokere94634152018-09-24 19:08:35 -070011634 if (QDF_STATUS_SUCCESS != status) {
Kiran Kumar Lokereacd107d2019-01-09 15:02:11 -080011635 sme_err("set_peer_param_cmd returned %d", status);
Kiran Kumar Lokere94634152018-09-24 19:08:35 -070011636 return -EIO;
11637 }
11638
11639 return 0;
11640}
11641
Kiran Kumar Lokereacd107d2019-01-09 15:02:11 -080011642int sme_set_he_om_ctrl_param(mac_handle_t mac_handle, uint8_t session_id,
11643 enum qca_wlan_vendor_attr_he_omi_tx param,
11644 uint8_t cfg_val)
Kiran Kumar Lokere94634152018-09-24 19:08:35 -070011645{
Kiran Kumar Lokere94634152018-09-24 19:08:35 -070011646 QDF_STATUS status;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080011647 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Kiran Kumar Lokere94634152018-09-24 19:08:35 -070011648 struct csr_roam_session *session = CSR_GET_SESSION(mac_ctx, session_id);
11649
Kiran Kumar Lokereacd107d2019-01-09 15:02:11 -080011650 status = sme_validate_session_for_cap_update(mac_ctx, session_id,
11651 session);
11652 if (QDF_IS_STATUS_ERROR(status))
Kiran Kumar Lokere94634152018-09-24 19:08:35 -070011653 return -EINVAL;
Kiran Kumar Lokere94634152018-09-24 19:08:35 -070011654
Kiran Kumar Lokereacd107d2019-01-09 15:02:11 -080011655 switch(param) {
11656 case QCA_WLAN_VENDOR_ATTR_HE_OMI_ULMU_DISABLE:
11657 sme_debug("Set OM ctrl UL MU dis to %d", cfg_val);
11658 mac_ctx->he_om_ctrl_cfg_ul_mu_dis = cfg_val;
11659 break;
11660 case QCA_WLAN_VENDOR_ATTR_HE_OMI_RX_NSS:
11661 if ((cfg_val + 1) > session->nss) {
11662 sme_debug("OMI Nss %d is > connected Nss %d",
11663 cfg_val, session->nss);
11664 mac_ctx->he_om_ctrl_cfg_nss_set = false;
11665 return 0;
11666 }
11667 sme_debug("Set OM ctrl Rx Nss cfg to %d", cfg_val);
11668 mac_ctx->he_om_ctrl_cfg_nss_set = true;
11669 mac_ctx->he_om_ctrl_cfg_nss = cfg_val;
11670 break;
11671 case QCA_WLAN_VENDOR_ATTR_HE_OMI_CH_BW:
11672 if (cfg_val >
11673 session->connectedProfile.vht_channel_width) {
11674 sme_info("OMI BW %d is > connected BW %d",
11675 cfg_val,
11676 session->connectedProfile.
11677 vht_channel_width);
11678 mac_ctx->he_om_ctrl_cfg_bw_set = false;
11679 return 0;
11680 }
11681 sme_debug("Set OM ctrl BW cfg to %d", cfg_val);
11682 mac_ctx->he_om_ctrl_cfg_bw_set = true;
11683 mac_ctx->he_om_ctrl_cfg_bw = cfg_val;
11684 break;
11685 case QCA_WLAN_VENDOR_ATTR_HE_OMI_TX_NSTS:
11686 if ((cfg_val + 1) > session->nss) {
11687 sme_debug("OMI NSTS %d is > connected Nss %d",
11688 cfg_val, session->nss);
11689 mac_ctx->he_om_ctrl_cfg_tx_nsts_set = false;
11690 return 0;
11691 }
11692 sme_debug("Set OM ctrl tx nsts cfg to %d", cfg_val);
11693 mac_ctx->he_om_ctrl_cfg_tx_nsts_set = true;
11694 mac_ctx->he_om_ctrl_cfg_tx_nsts = cfg_val;
11695 break;
Kiran Kumar Lokere49e3aff2019-02-06 17:00:48 -080011696 case QCA_WLAN_VENDOR_ATTR_HE_OMI_ULMU_DATA_DISABLE:
11697 sme_debug("Set OM ctrl UL MU data dis to %d", cfg_val);
11698 mac_ctx->he_om_ctrl_ul_mu_data_dis = cfg_val;
11699 break;
Kiran Kumar Lokereacd107d2019-01-09 15:02:11 -080011700 default:
11701 sme_debug("Invalid OMI param %d", param);
11702 return -EINVAL;
Kiran Kumar Lokere94634152018-09-24 19:08:35 -070011703 }
11704
11705 return 0;
11706}
11707
Jeff Johnsonc7309062018-11-09 20:59:42 -080011708void sme_reset_he_om_ctrl(mac_handle_t mac_handle)
Kiran Kumar Lokere94634152018-09-24 19:08:35 -070011709{
Jeff Johnson0a8786a2018-12-02 10:49:01 -080011710 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Kiran Kumar Lokere94634152018-09-24 19:08:35 -070011711
11712 mac_ctx->he_om_ctrl_cfg_bw_set = false;
11713 mac_ctx->he_om_ctrl_cfg_nss_set = false;
11714 mac_ctx->he_om_ctrl_cfg_bw = 0;
11715 mac_ctx->he_om_ctrl_cfg_nss = 0;
Kiran Kumar Lokereacd107d2019-01-09 15:02:11 -080011716 mac_ctx->he_om_ctrl_cfg_ul_mu_dis = false;
11717 mac_ctx->he_om_ctrl_cfg_tx_nsts_set = false;
11718 mac_ctx->he_om_ctrl_cfg_tx_nsts = 0;
Kiran Kumar Lokere49e3aff2019-02-06 17:00:48 -080011719 mac_ctx->he_om_ctrl_ul_mu_data_dis = false;
Kiran Kumar Lokere94634152018-09-24 19:08:35 -070011720}
11721
Kiran Kumar Lokereee205772018-09-27 00:27:27 -070011722int sme_config_action_tx_in_tb_ppdu(mac_handle_t mac_handle, uint8_t session_id,
11723 uint8_t cfg_val)
11724{
11725 QDF_STATUS status;
11726 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
11727 struct scheduler_msg msg = {0};
11728 struct sir_cfg_action_frm_tb_ppdu *cfg_msg;
11729
11730 if (!csr_is_conn_state_connected_infra(mac_ctx, session_id)) {
11731 sme_info("STA not in connected state Session_id: %d",
11732 session_id);
11733 return -EINVAL;
11734 }
11735
11736 cfg_msg = qdf_mem_malloc(sizeof(*cfg_msg));
11737
11738 if (!cfg_msg)
11739 return -EIO;
11740
11741 cfg_msg->type = WNI_SME_CFG_ACTION_FRM_HE_TB_PPDU;
11742 cfg_msg->session_id = session_id;
11743 cfg_msg->cfg = cfg_val;
11744
11745 msg.bodyptr = cfg_msg;
11746 msg.type = WNI_SME_CFG_ACTION_FRM_HE_TB_PPDU;
11747 status = scheduler_post_message(QDF_MODULE_ID_SME, QDF_MODULE_ID_PE,
11748 QDF_MODULE_ID_PE, &msg);
11749 if (QDF_STATUS_SUCCESS != status) {
11750 sme_err("Failed to send CFG_ACTION_FRAME_IN_TB_PPDU to PE %d",
11751 status);
11752 qdf_mem_free(cfg_msg);
11753 return -EIO;
11754 }
11755
11756 return 0;
11757}
11758
Jeff Johnsonc7309062018-11-09 20:59:42 -080011759int sme_update_he_tx_bfee_nsts(mac_handle_t mac_handle, uint8_t session_id,
Kiran Kumar Lokeref3044852018-06-27 14:14:24 -070011760 uint8_t cfg_val)
11761{
Jeff Johnson0a8786a2018-12-02 10:49:01 -080011762 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Bala Venkatesh6d537092018-09-25 10:38:36 +053011763 struct csr_roam_session *session;
11764
11765 session = CSR_GET_SESSION(mac_ctx, session_id);
11766
11767 if (!session) {
11768 sme_err("No session for id %d", session_id);
11769 return -EINVAL;
11770 }
11771 if (cfg_in_range(CFG_HE_BFEE_STS_LT80, cfg_val))
11772 mac_ctx->mlme_cfg->he_caps.dot11_he_cap.bfee_sts_lt_80 =
11773 cfg_val;
11774 else
11775 return -EINVAL;
11776
11777 csr_update_session_he_cap(mac_ctx, session);
11778 return 0;
Kiran Kumar Lokeref3044852018-06-27 14:14:24 -070011779}
11780
Kiran Kumar Lokere86e85592018-07-18 15:34:24 -070011781void sme_set_he_tx_bf_cbf_rates(uint8_t session_id)
11782{
11783 uint32_t tx_bf_cbf_rates_5g[] = {91, 1, 0, 3, 2, 4, 0};
11784 uint32_t tx_bf_cbf_rates_2g[] = {91, 1, 1, 3, 1, 3, 0};
11785 QDF_STATUS status;
11786
11787 status = wma_form_unit_test_cmd_and_send(session_id, 0x48, 7,
11788 tx_bf_cbf_rates_5g);
11789 if (QDF_STATUS_SUCCESS != status)
11790 sme_err("send_unit_test_cmd returned %d", status);
11791
11792 status = wma_form_unit_test_cmd_and_send(session_id, 0x48, 7,
11793 tx_bf_cbf_rates_2g);
11794 if (QDF_STATUS_SUCCESS != status)
11795 sme_err("send_unit_test_cmd returned %d", status);
11796}
11797
Kiran Kumar Lokereefdbd0b2018-09-25 18:53:46 -070011798void sme_config_su_ppdu_queue(uint8_t session_id, bool enable)
11799{
11800 uint32_t su_ppdu_enable[] = {69, 1, 1, 1};
11801 uint32_t su_ppdu_disable[] = {69, 1, 1, 0};
11802 QDF_STATUS status;
11803
11804 if (enable) {
11805 sme_debug("Send Tx SU PPDU queue ENABLE cmd to FW");
11806 status = wma_form_unit_test_cmd_and_send(session_id, 0x48, 4,
11807 su_ppdu_enable);
11808 } else {
11809 sme_debug("Send Tx SU PPDU queue DISABLE cmd to FW");
11810 status = wma_form_unit_test_cmd_and_send(session_id, 0x48, 4,
11811 su_ppdu_disable);
11812 }
11813 if (QDF_STATUS_SUCCESS != status)
11814 sme_err("send_unit_test_cmd returned %d", status);
11815}
11816
Jeff Johnsonc7309062018-11-09 20:59:42 -080011817int sme_update_he_tx_stbc_cap(mac_handle_t mac_handle, uint8_t session_id,
11818 int value)
Kiran Kumar Lokere13dedac2018-02-05 19:51:59 -080011819{
Jeff Johnson0a8786a2018-12-02 10:49:01 -080011820 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Bala Venkatesh6d537092018-09-25 10:38:36 +053011821 struct csr_roam_session *session;
Kiran Kumar Lokere5cc2f0d2018-02-08 17:10:05 -080011822 uint32_t he_cap_val = 0;
11823
11824 he_cap_val = value ? 1 : 0;
Bala Venkatesh6d537092018-09-25 10:38:36 +053011825 session = CSR_GET_SESSION(mac_ctx, session_id);
Kiran Kumar Lokere13dedac2018-02-05 19:51:59 -080011826
Bala Venkatesh6d537092018-09-25 10:38:36 +053011827 if (!session) {
11828 sme_err("No session for id %d", session_id);
11829 return -EINVAL;
11830 }
11831 if (he_cap_val <= 1)
Kiran Kumar Lokere9cab5252019-02-04 14:38:08 -080011832 mac_ctx->mlme_cfg->he_caps.dot11_he_cap.tb_ppdu_tx_stbc_lt_80mhz
11833 = he_cap_val;
Bala Venkatesh6d537092018-09-25 10:38:36 +053011834 else
11835 return -EINVAL;
11836 if (he_cap_val <= 1)
Kiran Kumar Lokere9cab5252019-02-04 14:38:08 -080011837 mac_ctx->mlme_cfg->he_caps.dot11_he_cap.tb_ppdu_tx_stbc_gt_80mhz
11838 = he_cap_val;
Bala Venkatesh6d537092018-09-25 10:38:36 +053011839 else
11840 return -EINVAL;
11841 csr_update_session_he_cap(mac_ctx, session);
11842 return 0;
Kiran Kumar Lokere13dedac2018-02-05 19:51:59 -080011843}
11844
Jeff Johnsonc7309062018-11-09 20:59:42 -080011845int sme_update_he_rx_stbc_cap(mac_handle_t mac_handle, uint8_t session_id,
11846 int value)
Kiran Kumar Lokere13dedac2018-02-05 19:51:59 -080011847{
Jeff Johnson0a8786a2018-12-02 10:49:01 -080011848 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Bala Venkatesh6d537092018-09-25 10:38:36 +053011849 struct csr_roam_session *session;
Kiran Kumar Lokere5cc2f0d2018-02-08 17:10:05 -080011850 uint32_t he_cap_val = 0;
11851
11852 he_cap_val = value ? 1 : 0;
Bala Venkatesh6d537092018-09-25 10:38:36 +053011853 session = CSR_GET_SESSION(mac_ctx, session_id);
Kiran Kumar Lokere13dedac2018-02-05 19:51:59 -080011854
Bala Venkatesh6d537092018-09-25 10:38:36 +053011855 if (!session) {
11856 sme_err("No session for id %d", session_id);
11857 return -EINVAL;
11858 }
11859 if (he_cap_val <= 1)
11860 mac_ctx->mlme_cfg->he_caps.dot11_he_cap.rx_stbc_lt_80mhz =
11861 he_cap_val;
11862 else
11863 return -EINVAL;
11864 if (he_cap_val <= 1)
11865 mac_ctx->mlme_cfg->he_caps.dot11_he_cap.rx_stbc_gt_80mhz =
11866 he_cap_val;
11867 else
11868 return -EINVAL;
11869 csr_update_session_he_cap(mac_ctx, session);
11870 return 0;
Kiran Kumar Lokere5cc2f0d2018-02-08 17:10:05 -080011871}
11872
Jeff Johnsonc7309062018-11-09 20:59:42 -080011873int sme_update_he_frag_supp(mac_handle_t mac_handle, uint8_t session_id,
11874 uint16_t he_frag)
Kiran Kumar Lokere5cc2f0d2018-02-08 17:10:05 -080011875{
Jeff Johnson0a8786a2018-12-02 10:49:01 -080011876 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Bala Venkatesh6d537092018-09-25 10:38:36 +053011877 struct csr_roam_session *session;
11878
11879 session = CSR_GET_SESSION(mac_ctx, session_id);
11880
11881 if (!session) {
11882 sme_err("No session for id %d", session_id);
11883 return -EINVAL;
11884 }
11885 if (cfg_in_range(CFG_HE_FRAGMENTATION, he_frag))
11886 mac_ctx->mlme_cfg->he_caps.dot11_he_cap.fragmentation = he_frag;
11887 else
11888 return -EINVAL;
11889
11890 csr_update_session_he_cap(mac_ctx, session);
11891 return 0;
11892
Kiran Kumar Lokere13dedac2018-02-05 19:51:59 -080011893}
Kiran Kumar Lokeree43a4582018-05-08 19:54:03 -070011894
Jeff Johnsonc7309062018-11-09 20:59:42 -080011895int sme_update_he_ldpc_supp(mac_handle_t mac_handle, uint8_t session_id,
Kiran Kumar Lokeree43a4582018-05-08 19:54:03 -070011896 uint16_t he_ldpc)
11897{
Jeff Johnson0a8786a2018-12-02 10:49:01 -080011898 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Bala Venkatesh6d537092018-09-25 10:38:36 +053011899 struct csr_roam_session *session;
11900
11901 session = CSR_GET_SESSION(mac_ctx, session_id);
11902
11903 if (!session) {
11904 sme_err("No session for id %d", session_id);
11905 return -EINVAL;
11906 }
11907 if (he_ldpc <= 1)
11908 mac_ctx->mlme_cfg->he_caps.dot11_he_cap.ldpc_coding = he_ldpc;
11909 else
11910 return -EINVAL;
11911
11912 csr_update_session_he_cap(mac_ctx, session);
11913 return 0;
11914
Kiran Kumar Lokeree43a4582018-05-08 19:54:03 -070011915}
Arif Hussain1f58cbb2019-03-14 17:06:56 -070011916
11917int sme_update_he_twt_req_support(mac_handle_t mac_handle, uint8_t session_id,
11918 uint8_t cfg_val)
11919{
11920 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
11921 struct csr_roam_session *session;
11922
11923 session = CSR_GET_SESSION(mac_ctx, session_id);
11924
11925 if (!session) {
11926 sme_err("No session for id %d", session_id);
11927 return -EINVAL;
11928 }
11929 mac_ctx->mlme_cfg->he_caps.dot11_he_cap.twt_request = cfg_val;
11930
11931 csr_update_session_he_cap(mac_ctx, session);
11932
11933 return 0;
11934}
Kiran Kumar Lokere44a29432018-01-24 16:10:30 -080011935#endif
11936
Archana Ramachandran5041b252016-04-25 14:29:25 -070011937/**
Anurag Chouhan3920c0f2017-09-11 17:10:56 +053011938 * sme_set_nud_debug_stats_cb() - set nud debug stats callback
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -080011939 * @mac_handle: Opaque handle to the global MAC context
Anurag Chouhan3920c0f2017-09-11 17:10:56 +053011940 * @cb: callback function pointer
Dundi Raviteja3bcf3a82018-05-22 13:24:18 +053011941 * @context: callback context
Anurag Chouhan3920c0f2017-09-11 17:10:56 +053011942 *
11943 * This function stores nud debug stats callback function.
11944 *
11945 * Return: QDF_STATUS enumeration.
11946 */
Jeff Johnsonc7309062018-11-09 20:59:42 -080011947QDF_STATUS sme_set_nud_debug_stats_cb(mac_handle_t mac_handle,
Dundi Raviteja3bcf3a82018-05-22 13:24:18 +053011948 void (*cb)(void *, struct rsp_stats *, void *),
11949 void *context)
Anurag Chouhan3920c0f2017-09-11 17:10:56 +053011950{
11951 QDF_STATUS status = QDF_STATUS_SUCCESS;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080011952 struct mac_context *mac;
Anurag Chouhan3920c0f2017-09-11 17:10:56 +053011953
Jeff Johnsonc7309062018-11-09 20:59:42 -080011954 if (!mac_handle) {
Anurag Chouhan3920c0f2017-09-11 17:10:56 +053011955 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Jeff Johnsonc7309062018-11-09 20:59:42 -080011956 FL("mac_handle is not valid"));
Anurag Chouhan3920c0f2017-09-11 17:10:56 +053011957 return QDF_STATUS_E_INVAL;
11958 }
Jeff Johnsona0619e42018-11-28 17:43:00 -080011959 mac = MAC_CONTEXT(mac_handle);
Anurag Chouhan3920c0f2017-09-11 17:10:56 +053011960
11961 status = sme_acquire_global_lock(&mac->sme);
11962 if (!QDF_IS_STATUS_SUCCESS(status)) {
11963 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
11964 FL("sme_acquire_global_lock failed!(status=%d)"),
11965 status);
11966 return status;
11967 }
11968
11969 mac->sme.get_arp_stats_cb = cb;
Dundi Raviteja3bcf3a82018-05-22 13:24:18 +053011970 mac->sme.get_arp_stats_context = context;
Anurag Chouhan3920c0f2017-09-11 17:10:56 +053011971 sme_release_global_lock(&mac->sme);
11972 return status;
11973}
11974
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011975/**
11976 * sme_is_any_session_in_connected_state() - SME wrapper API to
11977 * check if any session is in connected state or not.
11978 *
Jeff Johnsonc7309062018-11-09 20:59:42 -080011979 * @mac_handle: Handle returned by mac open
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011980 *
11981 * This function is used to check if any valid sme session is in
11982 * connected state or not.
11983 *
11984 * Return: true if any session is connected, else false.
11985 *
11986 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -080011987bool sme_is_any_session_in_connected_state(mac_handle_t mac_handle)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011988{
Jeff Johnson0a8786a2018-12-02 10:49:01 -080011989 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011990 QDF_STATUS status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011991 bool ret = false;
11992
11993 status = sme_acquire_global_lock(&mac_ctx->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011994 if (QDF_STATUS_SUCCESS == status) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011995 ret = csr_is_any_session_in_connect_state(mac_ctx);
11996 sme_release_global_lock(&mac_ctx->sme);
11997 }
11998 return ret;
11999}
12000
Jeff Johnsonb7fa2562018-07-02 08:36:17 -070012001QDF_STATUS sme_set_chip_pwr_save_fail_cb(mac_handle_t mac_handle,
12002 pwr_save_fail_cb cb)
12003{
12004 QDF_STATUS status;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080012005 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Ravi Kumar Bokka05c14e52017-03-27 14:48:23 +053012006
12007 status = sme_acquire_global_lock(&mac->sme);
12008 if (status != QDF_STATUS_SUCCESS) {
12009 sme_err("sme_AcquireGlobalLock failed!(status=%d)", status);
12010 return status;
12011 }
12012 mac->sme.chip_power_save_fail_cb = cb;
12013 sme_release_global_lock(&mac->sme);
12014 return status;
12015}
12016
Qiwei Caie689a262018-07-26 15:50:22 +080012017#ifdef FEATURE_RSSI_MONITOR
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012018/**
12019 * sme_set_rssi_monitoring() - set rssi monitoring
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -080012020 * @mac_handle: Opaque handle to the global MAC context
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012021 * @input: request message
12022 *
12023 * This function constructs the vos message and fill in message type,
12024 * bodyptr with @input and posts it to WDA queue.
12025 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012026 * Return: QDF_STATUS enumeration
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012027 */
Jeff Johnsonc7309062018-11-09 20:59:42 -080012028QDF_STATUS sme_set_rssi_monitoring(mac_handle_t mac_handle,
Jeff Johnson4c6d40f2019-02-22 20:49:56 -080012029 struct rssi_monitor_param *input)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012030{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012031 QDF_STATUS status = QDF_STATUS_SUCCESS;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080012032 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Rajeev Kumar37d478b2017-04-17 16:59:28 -070012033 struct scheduler_msg message = {0};
Jeff Johnson4c6d40f2019-02-22 20:49:56 -080012034 struct rssi_monitor_param *req_msg;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012035
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070012036 SME_ENTER();
Anurag Chouhan600c3a02016-03-01 10:33:54 +053012037 req_msg = qdf_mem_malloc(sizeof(*req_msg));
Arif Hussain0ef77082018-10-10 16:42:53 -070012038 if (!req_msg)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012039 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012040
12041 *req_msg = *input;
12042
12043 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012044 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070012045 sme_err("sme_acquire_global_lock failed!(status=%d)", status);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053012046 qdf_mem_free(req_msg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012047 return status;
12048 }
12049
12050 /* Serialize the req through MC thread */
Rajeev Kumar8eaedf62017-01-21 11:03:13 -080012051 message.bodyptr = req_msg;
12052 message.type = WMA_SET_RSSI_MONITOR_REQ;
gaurank kathpalia36b0c582018-08-28 17:45:43 +053012053 status = scheduler_post_message(QDF_MODULE_ID_SME,
12054 QDF_MODULE_ID_WMA,
12055 QDF_MODULE_ID_WMA, &message);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012056 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070012057 sme_err("scheduler_post_msg failed!(err=%d)", status);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053012058 qdf_mem_free(req_msg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012059 }
12060 sme_release_global_lock(&mac->sme);
12061
12062 return status;
12063}
12064
Qiwei Caie689a262018-07-26 15:50:22 +080012065QDF_STATUS sme_set_rssi_threshold_breached_cb(mac_handle_t mac_handle,
12066 rssi_threshold_breached_cb cb)
12067{
12068 QDF_STATUS status;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080012069 struct mac_context *mac;
Qiwei Caie689a262018-07-26 15:50:22 +080012070
12071 mac = MAC_CONTEXT(mac_handle);
12072 if (!mac) {
12073 sme_err("Invalid mac context");
12074 return QDF_STATUS_E_INVAL;
12075 }
12076
12077 status = sme_acquire_global_lock(&mac->sme);
12078 if (!QDF_IS_STATUS_SUCCESS(status)) {
12079 sme_err("sme_acquire_global_lock failed!(status=%d)",
12080 status);
12081 return status;
12082 }
12083
12084 mac->sme.rssi_threshold_breached_cb = cb;
12085 sme_release_global_lock(&mac->sme);
12086 return status;
12087}
12088#endif /* FEATURE_RSSI_MONITOR */
12089
12090QDF_STATUS sme_reset_rssi_threshold_breached_cb(mac_handle_t mac_handle)
12091{
12092 return sme_set_rssi_threshold_breached_cb(mac_handle, NULL);
12093}
12094
Varun Reddy Yeturu951de5d2018-09-10 21:36:22 -070012095static enum band_info sme_get_connected_roaming_vdev_band(void)
12096{
12097 enum band_info band = BAND_ALL;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080012098 struct mac_context *mac = sme_get_mac_context();
Varun Reddy Yeturu951de5d2018-09-10 21:36:22 -070012099 struct csr_roam_session *session;
12100 uint8_t session_id, channel;
12101
12102 if (!mac) {
12103 sme_debug("MAC Context is NULL");
12104 return band;
12105 }
12106 session_id = csr_get_roam_enabled_sta_sessionid(mac);
Srinivas Girigowdad8697d42019-03-08 15:34:39 -080012107 if (session_id != WLAN_UMAC_VDEV_ID_MAX) {
Varun Reddy Yeturu951de5d2018-09-10 21:36:22 -070012108 session = CSR_GET_SESSION(mac, session_id);
12109 channel = session->connectedProfile.operationChannel;
12110 band = csr_get_rf_band(channel);
12111 return band;
12112 }
12113
12114 return band;
12115}
12116
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012117/*
Manishekar Chandrasekaran7009f252016-04-21 19:14:15 +053012118 * sme_pdev_set_pcl() - Send WMI_PDEV_SET_PCL_CMDID to the WMA
Jeff Johnsonc7309062018-11-09 20:59:42 -080012119 * @mac_handle: Handle returned by macOpen
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012120 * @msg: PCL channel list and length structure
12121 *
Manishekar Chandrasekaran7009f252016-04-21 19:14:15 +053012122 * Sends the command to WMA to send WMI_PDEV_SET_PCL_CMDID to FW
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012123 * Return: QDF_STATUS_SUCCESS on successful posting
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012124 */
Krunal Soni8a090df2018-05-03 15:02:54 -070012125QDF_STATUS sme_pdev_set_pcl(struct policy_mgr_pcl_list *msg)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012126{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012127 QDF_STATUS status = QDF_STATUS_SUCCESS;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080012128 struct mac_context *mac = sme_get_mac_context();
Rajeev Kumar37d478b2017-04-17 16:59:28 -070012129 struct scheduler_msg message = {0};
Varun Reddy Yeturu951de5d2018-09-10 21:36:22 -070012130 struct set_pcl_req *req_msg;
12131 uint32_t i;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012132
Krunal Soni3fa80e22018-01-09 14:16:02 -080012133 if (!mac) {
12134 sme_err("mac is NULL");
12135 return QDF_STATUS_E_FAILURE;
12136 }
Krunal Soni8a090df2018-05-03 15:02:54 -070012137
12138 if (!msg) {
12139 sme_err("msg is NULL");
12140 return QDF_STATUS_E_FAILURE;
12141 }
12142
Varun Reddy Yeturu951de5d2018-09-10 21:36:22 -070012143 req_msg = qdf_mem_malloc(sizeof(*req_msg));
Arif Hussain0ef77082018-10-10 16:42:53 -070012144 if (!req_msg)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012145 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012146
Varun Reddy Yeturu951de5d2018-09-10 21:36:22 -070012147 req_msg->band = BAND_ALL;
12148 if (CSR_IS_ROAM_INTRA_BAND_ENABLED(mac)) {
12149 req_msg->band = sme_get_connected_roaming_vdev_band();
12150 sme_debug("Connected STA band %d", req_msg->band);
12151 }
Krunal Soni8a090df2018-05-03 15:02:54 -070012152 for (i = 0; i < msg->pcl_len; i++) {
Varun Reddy Yeturu951de5d2018-09-10 21:36:22 -070012153 req_msg->chan_weights.pcl_list[i] = msg->pcl_list[i];
12154 req_msg->chan_weights.weight_list[i] = msg->weight_list[i];
Manishekar Chandrasekaran7009f252016-04-21 19:14:15 +053012155 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012156
Varun Reddy Yeturu951de5d2018-09-10 21:36:22 -070012157 req_msg->chan_weights.pcl_len = msg->pcl_len;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012158
12159 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012160 if (status != QDF_STATUS_SUCCESS) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070012161 sme_err("sme_acquire_global_lock failed!(status=%d)", status);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053012162 qdf_mem_free(req_msg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012163 return status;
12164 }
12165
12166 /* Serialize the req through MC thread */
Rajeev Kumar8eaedf62017-01-21 11:03:13 -080012167 message.bodyptr = req_msg;
12168 message.type = SIR_HAL_PDEV_SET_PCL_TO_FW;
gaurank kathpalia36b0c582018-08-28 17:45:43 +053012169 status = scheduler_post_message(QDF_MODULE_ID_SME,
12170 QDF_MODULE_ID_WMA,
12171 QDF_MODULE_ID_WMA, &message);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012172 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070012173 sme_err("scheduler_post_msg failed!(err=%d)", status);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053012174 qdf_mem_free(req_msg);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012175 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012176 }
12177 sme_release_global_lock(&mac->sme);
12178
12179 return status;
12180}
12181
12182/*
Manishekar Chandrasekarand9640342016-04-27 12:28:26 +053012183 * sme_pdev_set_hw_mode() - Send WMI_PDEV_SET_HW_MODE_CMDID to the WMA
Jeff Johnsonc7309062018-11-09 20:59:42 -080012184 * @mac_handle: Handle returned by macOpen
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012185 * @msg: HW mode structure containing hw mode and callback details
12186 *
Manishekar Chandrasekarand9640342016-04-27 12:28:26 +053012187 * Sends the command to CSR to send WMI_PDEV_SET_HW_MODE_CMDID to FW
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012188 * Return: QDF_STATUS_SUCCESS on successful posting
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012189 */
Tushnim Bhattacharyya0c4ad2d2017-03-09 15:59:03 -080012190QDF_STATUS sme_pdev_set_hw_mode(struct policy_mgr_hw_mode msg)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012191{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012192 QDF_STATUS status = QDF_STATUS_SUCCESS;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080012193 struct mac_context *mac = sme_get_mac_context();
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012194 tSmeCmd *cmd = NULL;
12195
Krunal Soni3fa80e22018-01-09 14:16:02 -080012196 if (!mac) {
12197 sme_err("mac is NULL");
12198 return QDF_STATUS_E_FAILURE;
12199 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012200 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012201 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070012202 sme_err("Failed to acquire lock");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012203 return QDF_STATUS_E_RESOURCES;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012204 }
12205
Krunal Soni78618d92017-02-14 21:46:31 -080012206 cmd = csr_get_command_buffer(mac);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012207 if (!cmd) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070012208 sme_err("Get command buffer failed");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012209 sme_release_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012210 return QDF_STATUS_E_NULL_VALUE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012211 }
12212
12213 cmd->command = e_sme_command_set_hw_mode;
Ganesh Kondabattiniae1c6a22017-05-02 18:02:11 +053012214 cmd->sessionId = msg.session_id;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012215 cmd->u.set_hw_mode_cmd.hw_mode_index = msg.hw_mode_index;
12216 cmd->u.set_hw_mode_cmd.set_hw_mode_cb = msg.set_hw_mode_cb;
Chandrasekaran, Manishekaref70c0d2015-10-20 19:54:55 +053012217 cmd->u.set_hw_mode_cmd.reason = msg.reason;
12218 cmd->u.set_hw_mode_cmd.session_id = msg.session_id;
Tushnim Bhattacharyyaeab33dd2017-11-15 15:20:02 -080012219 cmd->u.set_hw_mode_cmd.next_action = msg.next_action;
Tushnim Bhattacharyya0c4ad2d2017-03-09 15:59:03 -080012220 cmd->u.set_hw_mode_cmd.context = msg.context;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012221
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070012222 sme_debug("Queuing set hw mode to CSR, session: %d reason: %d",
Chandrasekaran, Manishekarce2172e2016-02-18 16:12:43 +053012223 cmd->u.set_hw_mode_cmd.session_id,
12224 cmd->u.set_hw_mode_cmd.reason);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012225 csr_queue_sme_command(mac, cmd, false);
12226
12227 sme_release_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012228 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012229}
12230
12231/**
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012232 * sme_nss_update_request() - Send beacon templete update to FW with new
12233 * nss value
Jeff Johnsonc7309062018-11-09 20:59:42 -080012234 * @mac_handle: Handle returned by macOpen
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012235 * @vdev_id: the session id
12236 * @new_nss: the new nss value
12237 * @cback: hdd callback
12238 * @next_action: next action to happen at policy mgr after beacon update
Liangwei Dong1ba99482018-10-19 02:57:29 -040012239 * @original_vdev_id: original request hwmode change vdev id
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012240 *
12241 * Sends the command to CSR to send to PE
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012242 * Return: QDF_STATUS_SUCCESS on successful posting
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012243 */
Tushnim Bhattacharyya0c4ad2d2017-03-09 15:59:03 -080012244QDF_STATUS sme_nss_update_request(uint32_t vdev_id,
12245 uint8_t new_nss, policy_mgr_nss_update_cback cback,
12246 uint8_t next_action, struct wlan_objmgr_psoc *psoc,
Liangwei Dong1ba99482018-10-19 02:57:29 -040012247 enum policy_mgr_conn_update_reason reason,
12248 uint32_t original_vdev_id)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012249{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012250 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080012251 struct mac_context *mac = sme_get_mac_context();
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012252 tSmeCmd *cmd = NULL;
12253
Krunal Soni3fa80e22018-01-09 14:16:02 -080012254 if (!mac) {
12255 sme_err("mac is null");
12256 return status;
12257 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012258 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012259 if (QDF_IS_STATUS_SUCCESS(status)) {
Krunal Soni78618d92017-02-14 21:46:31 -080012260 cmd = csr_get_command_buffer(mac);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012261 if (!cmd) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070012262 sme_err("Get command buffer failed");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012263 sme_release_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012264 return QDF_STATUS_E_NULL_VALUE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012265 }
12266 cmd->command = e_sme_command_nss_update;
12267 /* Sessionized modules may require this info */
12268 cmd->sessionId = vdev_id;
12269 cmd->u.nss_update_cmd.new_nss = new_nss;
12270 cmd->u.nss_update_cmd.session_id = vdev_id;
12271 cmd->u.nss_update_cmd.nss_update_cb = cback;
Tushnim Bhattacharyya0c4ad2d2017-03-09 15:59:03 -080012272 cmd->u.nss_update_cmd.context = psoc;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012273 cmd->u.nss_update_cmd.next_action = next_action;
Chandrasekaran, Manishekarce2172e2016-02-18 16:12:43 +053012274 cmd->u.nss_update_cmd.reason = reason;
Liangwei Dong1ba99482018-10-19 02:57:29 -040012275 cmd->u.nss_update_cmd.original_vdev_id = original_vdev_id;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012276
Liangwei Dong1ba99482018-10-19 02:57:29 -040012277 sme_debug("Queuing e_sme_command_nss_update to CSR:vdev (%d %d) ss %d r %d",
12278 vdev_id, original_vdev_id, new_nss, reason);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012279 csr_queue_sme_command(mac, cmd, false);
12280 sme_release_global_lock(&mac->sme);
12281 }
12282 return status;
12283}
12284
12285/**
12286 * sme_soc_set_dual_mac_config() - Set dual mac configurations
Jeff Johnsonc7309062018-11-09 20:59:42 -080012287 * @mac_handle: Handle returned by macOpen
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012288 * @msg: Structure containing the dual mac config parameters
12289 *
12290 * Queues configuration information to CSR to configure
12291 * WLAN firmware for the dual MAC features
12292 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012293 * Return: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012294 */
Tushnim Bhattacharyya0c4ad2d2017-03-09 15:59:03 -080012295QDF_STATUS sme_soc_set_dual_mac_config(struct policy_mgr_dual_mac_config msg)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012296{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012297 QDF_STATUS status = QDF_STATUS_SUCCESS;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080012298 struct mac_context *mac = sme_get_mac_context();
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012299 tSmeCmd *cmd;
12300
Krunal Soni3fa80e22018-01-09 14:16:02 -080012301 if (!mac) {
12302 sme_err("mac is null");
12303 return QDF_STATUS_E_FAILURE;
12304 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012305 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012306 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070012307 sme_err("Failed to acquire lock");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012308 return QDF_STATUS_E_RESOURCES;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012309 }
12310
Krunal Soni78618d92017-02-14 21:46:31 -080012311 cmd = csr_get_command_buffer(mac);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012312 if (!cmd) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070012313 sme_err("Get command buffer failed");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012314 sme_release_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012315 return QDF_STATUS_E_NULL_VALUE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012316 }
12317
12318 cmd->command = e_sme_command_set_dual_mac_config;
12319 cmd->u.set_dual_mac_cmd.scan_config = msg.scan_config;
12320 cmd->u.set_dual_mac_cmd.fw_mode_config = msg.fw_mode_config;
12321 cmd->u.set_dual_mac_cmd.set_dual_mac_cb = msg.set_dual_mac_cb;
12322
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070012323 sme_debug("set_dual_mac_config scan_config: %x fw_mode_config: %x",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012324 cmd->u.set_dual_mac_cmd.scan_config,
12325 cmd->u.set_dual_mac_cmd.fw_mode_config);
12326 csr_queue_sme_command(mac, cmd, false);
12327
12328 sme_release_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012329 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012330}
12331
Ravi Joshi9e891ba2015-11-09 19:03:46 -080012332#ifdef FEATURE_LFR_SUBNET_DETECTION
12333/**
12334 * sme_gateway_param_update() - to update gateway parameters with WMA
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -080012335 * @mac_handle: Opaque handle to the global MAC context
Ravi Joshi9e891ba2015-11-09 19:03:46 -080012336 * @gw_params: request parameters from HDD
12337 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012338 * Return: QDF_STATUS
Ravi Joshi9e891ba2015-11-09 19:03:46 -080012339 *
12340 * This routine will update gateway parameters to WMA
12341 */
Jeff Johnsonc7309062018-11-09 20:59:42 -080012342QDF_STATUS sme_gateway_param_update(mac_handle_t mac_handle,
Jeff Johnson38d0ce62019-02-22 17:05:14 -080012343 struct gateway_update_req_param *gw_params)
Ravi Joshi9e891ba2015-11-09 19:03:46 -080012344{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012345 QDF_STATUS qdf_status;
Rajeev Kumar37d478b2017-04-17 16:59:28 -070012346 struct scheduler_msg message = {0};
Jeff Johnson38d0ce62019-02-22 17:05:14 -080012347 struct gateway_update_req_param *request_buf;
Ravi Joshi9e891ba2015-11-09 19:03:46 -080012348
Anurag Chouhan600c3a02016-03-01 10:33:54 +053012349 request_buf = qdf_mem_malloc(sizeof(*request_buf));
Arif Hussain0ef77082018-10-10 16:42:53 -070012350 if (!request_buf)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012351 return QDF_STATUS_E_NOMEM;
Ravi Joshi9e891ba2015-11-09 19:03:46 -080012352
12353 *request_buf = *gw_params;
12354
Rajeev Kumar8eaedf62017-01-21 11:03:13 -080012355 message.type = WMA_GW_PARAM_UPDATE_REQ;
12356 message.reserved = 0;
12357 message.bodyptr = request_buf;
gaurank kathpalia36b0c582018-08-28 17:45:43 +053012358 qdf_status = scheduler_post_message(QDF_MODULE_ID_SME,
12359 QDF_MODULE_ID_WMA,
12360 QDF_MODULE_ID_WMA, &message);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012361 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053012362 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053012363 "Not able to post WMA_GW_PARAM_UPDATE_REQ message to HAL");
Anurag Chouhan600c3a02016-03-01 10:33:54 +053012364 qdf_mem_free(request_buf);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012365 return QDF_STATUS_E_FAILURE;
Ravi Joshi9e891ba2015-11-09 19:03:46 -080012366 }
12367
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012368 return QDF_STATUS_SUCCESS;
Ravi Joshi9e891ba2015-11-09 19:03:46 -080012369}
12370#endif /* FEATURE_LFR_SUBNET_DETECTION */
12371
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012372/**
Archana Ramachandrana20ef812015-11-13 16:12:13 -080012373 * sme_soc_set_antenna_mode() - set antenna mode
Jeff Johnsonc7309062018-11-09 20:59:42 -080012374 * @mac_handle: Handle returned by macOpen
Archana Ramachandrana20ef812015-11-13 16:12:13 -080012375 * @msg: Structure containing the antenna mode parameters
12376 *
12377 * Send the command to CSR to send
12378 * WMI_SOC_SET_ANTENNA_MODE_CMDID to FW
12379 *
12380 * Return: QDF_STATUS
12381 */
Jeff Johnsonc7309062018-11-09 20:59:42 -080012382QDF_STATUS sme_soc_set_antenna_mode(mac_handle_t mac_handle,
12383 struct sir_antenna_mode_param *msg)
Archana Ramachandrana20ef812015-11-13 16:12:13 -080012384{
12385 QDF_STATUS status = QDF_STATUS_SUCCESS;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080012386 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Archana Ramachandrana20ef812015-11-13 16:12:13 -080012387 tSmeCmd *cmd;
12388
Jeff Johnson038efe72019-03-18 13:39:31 -070012389 if (!msg) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070012390 sme_err("antenna mode mesg is NULL");
Archana Ramachandrana20ef812015-11-13 16:12:13 -080012391 return QDF_STATUS_E_FAILURE;
12392 }
12393
12394 status = sme_acquire_global_lock(&mac->sme);
12395 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070012396 sme_err("Failed to acquire lock");
Archana Ramachandrana20ef812015-11-13 16:12:13 -080012397 return QDF_STATUS_E_RESOURCES;
12398 }
12399
Krunal Soni78618d92017-02-14 21:46:31 -080012400 cmd = csr_get_command_buffer(mac);
Archana Ramachandrana20ef812015-11-13 16:12:13 -080012401 if (!cmd) {
12402 sme_release_global_lock(&mac->sme);
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070012403 sme_err("Get command buffer failed");
Archana Ramachandrana20ef812015-11-13 16:12:13 -080012404 return QDF_STATUS_E_NULL_VALUE;
12405 }
12406
12407 cmd->command = e_sme_command_set_antenna_mode;
12408 cmd->u.set_antenna_mode_cmd = *msg;
12409
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070012410 sme_debug("Antenna mode rx_chains: %d tx_chains: %d",
Archana Ramachandrana20ef812015-11-13 16:12:13 -080012411 cmd->u.set_antenna_mode_cmd.num_rx_chains,
12412 cmd->u.set_antenna_mode_cmd.num_tx_chains);
12413
12414 csr_queue_sme_command(mac, cmd, false);
12415 sme_release_global_lock(&mac->sme);
12416
12417 return QDF_STATUS_SUCCESS;
12418}
12419
12420/**
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012421 * sme_set_peer_authorized() - call peer authorized callback
12422 * @peer_addr: peer mac address
12423 * @auth_cb: auth callback
12424 * @vdev_id: vdev id
12425 *
Anurag Chouhanf04e84f2016-03-03 10:12:12 +053012426 * Return: QDF Status
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012427 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012428QDF_STATUS sme_set_peer_authorized(uint8_t *peer_addr,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012429 sme_peer_authorized_fp auth_cb,
12430 uint32_t vdev_id)
12431{
12432 void *wma_handle;
12433
Anurag Chouhan6d760662016-02-20 16:05:43 +053012434 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012435 if (!wma_handle) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053012436 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012437 "wma handle is NULL");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012438 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012439 }
12440
12441 wma_set_peer_authorized_cb(wma_handle, auth_cb);
12442 return wma_set_peer_param(wma_handle, peer_addr, WMI_PEER_AUTHORIZE,
12443 1, vdev_id);
12444}
12445
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012446/**
Jeff Johnson01f2c232018-11-21 19:17:44 -080012447 * sme_setdef_dot11mode() - Updates mac with default dot11mode
Jeff Johnsonc7309062018-11-09 20:59:42 -080012448 * @mac_handle: Global MAC pointer
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012449 *
12450 * Return: NULL.
12451 */
Jeff Johnsonc7309062018-11-09 20:59:42 -080012452void sme_setdef_dot11mode(mac_handle_t mac_handle)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012453{
Jeff Johnson0a8786a2018-12-02 10:49:01 -080012454 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053012455
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012456 csr_set_default_dot11_mode(mac_ctx);
12457}
12458
12459/**
Krishna Kumaar Natarajan052c6e62015-09-28 15:32:55 -070012460 * sme_update_tgt_services() - update the target services config.
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -080012461 * @mac_handle: Opaque handle to the global MAC context.
Krishna Kumaar Natarajan052c6e62015-09-28 15:32:55 -070012462 * @cfg: wma_tgt_services parameters.
12463 *
12464 * update the target services config.
12465 *
12466 * Return: None.
12467 */
Jeff Johnsonc7309062018-11-09 20:59:42 -080012468void sme_update_tgt_services(mac_handle_t mac_handle,
12469 struct wma_tgt_services *cfg)
Krishna Kumaar Natarajan052c6e62015-09-28 15:32:55 -070012470{
Jeff Johnson0a8786a2018-12-02 10:49:01 -080012471 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Krishna Kumaar Natarajan052c6e62015-09-28 15:32:55 -070012472
Liangwei Dong0da14262018-07-03 03:30:23 -040012473 mac_ctx->obss_scan_offload = cfg->obss_scan_offload;
12474 sme_debug("obss_scan_offload: %d", mac_ctx->obss_scan_offload);
Krunal Sonie6a1cda2017-09-27 15:23:02 -070012475 mac_ctx->lteCoexAntShare = cfg->lte_coex_ant_share;
Krishna Kumaar Natarajan052c6e62015-09-28 15:32:55 -070012476 mac_ctx->beacon_offload = cfg->beacon_offload;
mukul sharma72c8b222015-09-04 17:02:01 +053012477 mac_ctx->pmf_offload = cfg->pmf_offload;
Abhishek Singhe4a1f882017-08-10 17:59:44 +053012478 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
mukul sharma72c8b222015-09-04 17:02:01 +053012479 FL("mac_ctx->pmf_offload: %d"), mac_ctx->pmf_offload);
Vignesh Viswanathan731186f2017-09-18 13:47:37 +053012480 mac_ctx->is_fils_roaming_supported =
12481 cfg->is_fils_roaming_supported;
Vignesh Viswanathan694e28e2018-01-18 20:53:57 +053012482 mac_ctx->is_11k_offload_supported =
12483 cfg->is_11k_offload_supported;
12484 sme_debug("pmf_offload: %d fils_roam support %d 11k_offload %d",
12485 mac_ctx->pmf_offload, mac_ctx->is_fils_roaming_supported,
12486 mac_ctx->is_11k_offload_supported);
Arunk Khandavallica56d4b2018-11-29 15:46:00 +053012487 mac_ctx->bcn_reception_stats = cfg->bcn_reception_stats;
Krishna Kumaar Natarajan052c6e62015-09-28 15:32:55 -070012488}
Masti, Narayanraddic4a7ab82015-11-25 15:41:10 +053012489
Chandrasekaran, Manishekar2859de42016-02-11 16:17:38 +053012490/**
12491 * sme_is_session_id_valid() - Check if the session id is valid
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -080012492 * @mac_handle: Opaque handle to the global MAC context
Chandrasekaran, Manishekar2859de42016-02-11 16:17:38 +053012493 * @session_id: Session id
12494 *
12495 * Checks if the session id is valid or not
12496 *
12497 * Return: True is the session id is valid, false otherwise
12498 */
Jeff Johnsonc7309062018-11-09 20:59:42 -080012499bool sme_is_session_id_valid(mac_handle_t mac_handle, uint32_t session_id)
Chandrasekaran, Manishekar2859de42016-02-11 16:17:38 +053012500{
Jeff Johnson0a8786a2018-12-02 10:49:01 -080012501 struct mac_context *mac;
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053012502
Jeff Johnson038efe72019-03-18 13:39:31 -070012503 if (mac_handle) {
Jeff Johnsona0619e42018-11-28 17:43:00 -080012504 mac = MAC_CONTEXT(mac_handle);
Pragaspathi Thilagarajb11dbe42018-07-23 16:42:17 +053012505 } else {
Chandrasekaran, Manishekard3cb4772016-02-22 22:21:10 +053012506 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
12507 "%s: null mac pointer", __func__);
Chandrasekaran, Manishekar2859de42016-02-11 16:17:38 +053012508 return false;
12509 }
12510
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053012511 if (CSR_IS_SESSION_VALID(mac, session_id))
Chandrasekaran, Manishekar2859de42016-02-11 16:17:38 +053012512 return true;
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053012513
12514 return false;
Chandrasekaran, Manishekar2859de42016-02-11 16:17:38 +053012515}
12516
Masti, Narayanraddic4a7ab82015-11-25 15:41:10 +053012517#ifdef FEATURE_WLAN_TDLS
12518
12519/**
12520 * sme_get_opclass() - determine operating class
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -080012521 * @mac_handle: Opaque handle to the global MAC context
Masti, Narayanraddic4a7ab82015-11-25 15:41:10 +053012522 * @channel: channel id
12523 * @bw_offset: bandwidth offset
12524 * @opclass: pointer to operating class
12525 *
12526 * Function will determine operating class from regdm_get_opclass_from_channel
12527 *
12528 * Return: none
12529 */
Jeff Johnsonc7309062018-11-09 20:59:42 -080012530void sme_get_opclass(mac_handle_t mac_handle, uint8_t channel,
12531 uint8_t bw_offset, uint8_t *opclass)
Masti, Narayanraddic4a7ab82015-11-25 15:41:10 +053012532{
Jeff Johnson0a8786a2018-12-02 10:49:01 -080012533 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Masti, Narayanraddic4a7ab82015-11-25 15:41:10 +053012534
12535 /* redgm opclass table contains opclass for 40MHz low primary,
12536 * 40MHz high primary and 20MHz. No support for 80MHz yet. So
12537 * first we will check if bit for 40MHz is set and if so find
12538 * matching opclass either with low primary or high primary
12539 * (a channel would never be in both) and then search for opclass
12540 * matching 20MHz, else for any BW.
12541 */
12542 if (bw_offset & (1 << BW_40_OFFSET_BIT)) {
Kiran Kumar Lokerea3de2262017-04-12 12:15:04 -070012543 *opclass = wlan_reg_dmn_get_opclass_from_channel(
Masti, Narayanraddic4a7ab82015-11-25 15:41:10 +053012544 mac_ctx->scan.countryCodeCurrent,
12545 channel, BW40_LOW_PRIMARY);
12546 if (!(*opclass)) {
Kiran Kumar Lokerea3de2262017-04-12 12:15:04 -070012547 *opclass = wlan_reg_dmn_get_opclass_from_channel(
Masti, Narayanraddic4a7ab82015-11-25 15:41:10 +053012548 mac_ctx->scan.countryCodeCurrent,
12549 channel, BW40_HIGH_PRIMARY);
12550 }
12551 } else if (bw_offset & (1 << BW_20_OFFSET_BIT)) {
Kiran Kumar Lokerea3de2262017-04-12 12:15:04 -070012552 *opclass = wlan_reg_dmn_get_opclass_from_channel(
Masti, Narayanraddic4a7ab82015-11-25 15:41:10 +053012553 mac_ctx->scan.countryCodeCurrent,
12554 channel, BW20);
12555 } else {
Kiran Kumar Lokerea3de2262017-04-12 12:15:04 -070012556 *opclass = wlan_reg_dmn_get_opclass_from_channel(
Masti, Narayanraddic4a7ab82015-11-25 15:41:10 +053012557 mac_ctx->scan.countryCodeCurrent,
12558 channel, BWALL);
12559 }
12560}
12561#endif
Ryan Hsu3c8f79f2015-12-02 16:45:09 -080012562
Sandeep Puligillae0875662016-02-12 16:09:21 -080012563/**
Anurag Chouhanbf5e0e22016-09-12 12:54:09 +053012564 * sme_set_fw_test() - set fw test
12565 * @fw_test: fw test param
12566 *
12567 * Return: Return QDF_STATUS, otherwise appropriate failure code
12568 */
12569QDF_STATUS sme_set_fw_test(struct set_fwtest_params *fw_test)
12570{
12571 void *wma_handle;
12572
12573 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
12574 if (!wma_handle) {
12575 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
12576 "wma handle is NULL");
12577 return QDF_STATUS_E_FAILURE;
12578 }
Bala Venkateshe45f03d2019-03-25 16:00:42 +053012579
12580 return wma_process_fw_test_cmd(wma_handle, fw_test);
Anurag Chouhanbf5e0e22016-09-12 12:54:09 +053012581}
12582
12583/**
Sandeep Puligillae0875662016-02-12 16:09:21 -080012584 * sme_ht40_stop_obss_scan() - ht40 obss stop scan
Jeff Johnsonc7309062018-11-09 20:59:42 -080012585 * @mac_handle: mac handel
Sandeep Puligillae0875662016-02-12 16:09:21 -080012586 * @vdev_id: vdev identifier
12587 *
12588 * Return: Return QDF_STATUS, otherwise appropriate failure code
12589 */
Jeff Johnsonc7309062018-11-09 20:59:42 -080012590QDF_STATUS sme_ht40_stop_obss_scan(mac_handle_t mac_handle, uint32_t vdev_id)
Sandeep Puligillae0875662016-02-12 16:09:21 -080012591{
12592 void *wma_handle;
12593
12594 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
12595 if (!wma_handle) {
12596 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
12597 "wma handle is NULL");
12598 return QDF_STATUS_E_FAILURE;
12599 }
12600 wma_ht40_stop_obss_scan(wma_handle, vdev_id);
12601 return QDF_STATUS_SUCCESS;
12602}
Archana Ramachandran20d2e232016-02-11 16:58:40 -080012603
12604/**
12605 * sme_update_mimo_power_save() - Update MIMO power save
12606 * configuration
Jeff Johnsonc7309062018-11-09 20:59:42 -080012607 * @mac_handle: The handle returned by macOpen
Archana Ramachandran20d2e232016-02-11 16:58:40 -080012608 * @is_ht_smps_enabled: enable/disable ht smps
12609 * @ht_smps_mode: smps mode disabled/static/dynamic
Archana Ramachandranfec24812016-02-16 16:31:56 -080012610 * @send_smps_action: flag to send smps force mode command
12611 * to FW
Archana Ramachandran20d2e232016-02-11 16:58:40 -080012612 *
12613 * Return: QDF_STATUS if SME update mimo power save
Jeff Johnson698eacd2018-05-12 17:00:03 -070012614 * configuration success else failure status
Archana Ramachandran20d2e232016-02-11 16:58:40 -080012615 */
Jeff Johnsonc7309062018-11-09 20:59:42 -080012616QDF_STATUS sme_update_mimo_power_save(mac_handle_t mac_handle,
Archana Ramachandran20d2e232016-02-11 16:58:40 -080012617 uint8_t is_ht_smps_enabled,
Archana Ramachandranfec24812016-02-16 16:31:56 -080012618 uint8_t ht_smps_mode,
12619 bool send_smps_action)
Archana Ramachandran20d2e232016-02-11 16:58:40 -080012620{
Jeff Johnson0a8786a2018-12-02 10:49:01 -080012621 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Archana Ramachandranfec24812016-02-16 16:31:56 -080012622
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070012623 sme_debug("SMPS enable: %d mode: %d send action: %d",
Archana Ramachandranfec24812016-02-16 16:31:56 -080012624 is_ht_smps_enabled, ht_smps_mode,
12625 send_smps_action);
Vignesh Viswanathanddc89e52018-11-02 18:43:42 +053012626 mac_ctx->mlme_cfg->ht_caps.enable_smps =
Archana Ramachandran20d2e232016-02-11 16:58:40 -080012627 is_ht_smps_enabled;
Vignesh Viswanathanddc89e52018-11-02 18:43:42 +053012628 mac_ctx->mlme_cfg->ht_caps.smps = ht_smps_mode;
Archana Ramachandranfec24812016-02-16 16:31:56 -080012629 mac_ctx->roam.configParam.send_smps_action =
12630 send_smps_action;
Archana Ramachandran20d2e232016-02-11 16:58:40 -080012631
12632 return QDF_STATUS_SUCCESS;
12633}
12634
Abhinav Kumardbbfd2c2019-05-07 12:22:06 +053012635#ifdef WLAN_BCN_RECV_FEATURE
12636QDF_STATUS sme_handle_bcn_recv_start(mac_handle_t mac_handle,
12637 uint32_t vdev_id)
12638{
12639 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
12640 struct csr_roam_session *session;
12641 QDF_STATUS status;
12642
Abhinav Kumardbbfd2c2019-05-07 12:22:06 +053012643 session = CSR_GET_SESSION(mac_ctx, vdev_id);
12644 if (!session) {
12645 sme_err("vdev_id %d not found", vdev_id);
12646 return QDF_STATUS_E_FAILURE;
12647 }
12648
Abhinav Kumar668bd122019-06-01 18:52:11 +053012649 if (!CSR_IS_SESSION_VALID(mac_ctx, vdev_id)) {
12650 sme_err("CSR session not valid: %d", vdev_id);
12651 return QDF_STATUS_E_FAILURE;
12652 }
12653
Abhinav Kumardbbfd2c2019-05-07 12:22:06 +053012654 status = sme_acquire_global_lock(&mac_ctx->sme);
12655 if (QDF_IS_STATUS_SUCCESS(status)) {
12656 if (session->is_bcn_recv_start) {
12657 sme_release_global_lock(&mac_ctx->sme);
12658 sme_err("Beacon receive already started");
12659 return QDF_STATUS_SUCCESS;
12660 }
12661 session->is_bcn_recv_start = true;
12662 sme_release_global_lock(&mac_ctx->sme);
12663
12664 /*
12665 * Remove beacon filter. It allows fw to send all
12666 * beacons of connected AP to driver.
12667 */
12668 status = sme_remove_beacon_filter(mac_handle, vdev_id);
12669 if (!QDF_IS_STATUS_SUCCESS(status)) {
12670 status = sme_acquire_global_lock(&mac_ctx->sme);
12671 if (QDF_IS_STATUS_SUCCESS(status)) {
12672 session->is_bcn_recv_start = false;
12673 sme_release_global_lock(&mac_ctx->sme);
12674 }
12675 sme_err("sme_remove_beacon_filter() failed");
12676 }
12677 }
12678
12679 return status;
12680}
Abhinav Kumar39222152019-05-13 23:53:40 +053012681
12682void sme_stop_beacon_report(mac_handle_t mac_handle, uint32_t session_id)
12683{
12684 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
12685 struct csr_roam_session *session;
12686 QDF_STATUS status;
12687
12688 if (!CSR_IS_SESSION_VALID(mac_ctx, session_id)) {
12689 sme_err("CSR session not valid: %d", session_id);
12690 return;
12691 }
12692
12693 session = CSR_GET_SESSION(mac_ctx, session_id);
12694 if (!session) {
12695 sme_err("vdev_id %d not found", session_id);
12696 return;
12697 }
12698 status = sme_acquire_global_lock(&mac_ctx->sme);
12699 if (QDF_IS_STATUS_SUCCESS(status)) {
12700 session->is_bcn_recv_start = false;
12701 sme_release_global_lock(&mac_ctx->sme);
12702 }
12703}
12704
12705bool sme_is_beacon_report_started(mac_handle_t mac_handle, uint32_t session_id)
12706{
12707 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
12708 struct csr_roam_session *session;
12709
12710 if (!CSR_IS_SESSION_VALID(mac_ctx, session_id)) {
12711 sme_err("CSR session not valid: %d", session_id);
12712 return false;
12713 }
12714
12715 session = CSR_GET_SESSION(mac_ctx, session_id);
12716 if (!session) {
12717 sme_err("vdev_id %d not found", session_id);
12718 return false;
12719 }
12720
12721 return session->is_bcn_recv_start;
12722}
Abhinav Kumardbbfd2c2019-05-07 12:22:06 +053012723#endif
12724
Archana Ramachandran20d2e232016-02-11 16:58:40 -080012725/**
Gupta, Kapil4cb1d7d2016-04-16 18:16:25 -070012726 * sme_add_beacon_filter() - set the beacon filter configuration
Jeff Johnsonc7309062018-11-09 20:59:42 -080012727 * @mac_handle: The handle returned by macOpen
Gupta, Kapil4cb1d7d2016-04-16 18:16:25 -070012728 * @session_id: session id
12729 * @ie_map: bitwise array of IEs
12730 *
12731 * Return: Return QDF_STATUS, otherwise appropriate failure code
12732 */
Jeff Johnsonc7309062018-11-09 20:59:42 -080012733QDF_STATUS sme_add_beacon_filter(mac_handle_t mac_handle,
Gupta, Kapil4cb1d7d2016-04-16 18:16:25 -070012734 uint32_t session_id,
12735 uint32_t *ie_map)
12736{
Rajeev Kumar37d478b2017-04-17 16:59:28 -070012737 struct scheduler_msg message = {0};
Gupta, Kapil4cb1d7d2016-04-16 18:16:25 -070012738 QDF_STATUS qdf_status;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080012739 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Gupta, Kapil4cb1d7d2016-04-16 18:16:25 -070012740 struct beacon_filter_param *filter_param;
12741
12742 if (!CSR_IS_SESSION_VALID(mac_ctx, session_id)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070012743 sme_err("CSR session not valid: %d", session_id);
Gupta, Kapil4cb1d7d2016-04-16 18:16:25 -070012744 return QDF_STATUS_E_FAILURE;
12745 }
12746
12747 filter_param = qdf_mem_malloc(sizeof(*filter_param));
Arif Hussain0ef77082018-10-10 16:42:53 -070012748 if (!filter_param)
Gupta, Kapil4cb1d7d2016-04-16 18:16:25 -070012749 return QDF_STATUS_E_FAILURE;
Gupta, Kapil4cb1d7d2016-04-16 18:16:25 -070012750
12751 filter_param->vdev_id = session_id;
12752
12753 qdf_mem_copy(filter_param->ie_map, ie_map,
12754 BCN_FLT_MAX_ELEMS_IE_LIST * sizeof(uint32_t));
12755
12756 message.type = WMA_ADD_BCN_FILTER_CMDID;
12757 message.bodyptr = filter_param;
gaurank kathpalia36b0c582018-08-28 17:45:43 +053012758 qdf_status = scheduler_post_message(QDF_MODULE_ID_SME,
12759 QDF_MODULE_ID_WMA,
12760 QDF_MODULE_ID_WMA,
12761 &message);
Gupta, Kapil4cb1d7d2016-04-16 18:16:25 -070012762 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
12763 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
12764 "%s: Not able to post msg to WDA!",
12765 __func__);
12766
12767 qdf_mem_free(filter_param);
12768 }
12769 return qdf_status;
12770}
12771
12772/**
12773 * sme_remove_beacon_filter() - set the beacon filter configuration
Jeff Johnsonc7309062018-11-09 20:59:42 -080012774 * @mac_handle: The handle returned by macOpen
Gupta, Kapil4cb1d7d2016-04-16 18:16:25 -070012775 * @session_id: session id
12776 *
12777 * Return: Return QDF_STATUS, otherwise appropriate failure code
12778 */
Jeff Johnsonc7309062018-11-09 20:59:42 -080012779QDF_STATUS sme_remove_beacon_filter(mac_handle_t mac_handle,
12780 uint32_t session_id)
Gupta, Kapil4cb1d7d2016-04-16 18:16:25 -070012781{
Rajeev Kumar37d478b2017-04-17 16:59:28 -070012782 struct scheduler_msg message = {0};
Gupta, Kapil4cb1d7d2016-04-16 18:16:25 -070012783 QDF_STATUS qdf_status;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080012784 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Gupta, Kapil4cb1d7d2016-04-16 18:16:25 -070012785 struct beacon_filter_param *filter_param;
12786
12787 if (!CSR_IS_SESSION_VALID(mac_ctx, session_id)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070012788 sme_err("CSR session not valid: %d", session_id);
Gupta, Kapil4cb1d7d2016-04-16 18:16:25 -070012789 return QDF_STATUS_E_FAILURE;
12790 }
12791
12792 filter_param = qdf_mem_malloc(sizeof(*filter_param));
Arif Hussain0ef77082018-10-10 16:42:53 -070012793 if (!filter_param)
Gupta, Kapil4cb1d7d2016-04-16 18:16:25 -070012794 return QDF_STATUS_E_FAILURE;
Gupta, Kapil4cb1d7d2016-04-16 18:16:25 -070012795
12796 filter_param->vdev_id = session_id;
12797
12798 message.type = WMA_REMOVE_BCN_FILTER_CMDID;
12799 message.bodyptr = filter_param;
gaurank kathpalia36b0c582018-08-28 17:45:43 +053012800 qdf_status = scheduler_post_message(QDF_MODULE_ID_SME,
12801 QDF_MODULE_ID_WMA,
12802 QDF_MODULE_ID_WMA,
12803 &message);
Gupta, Kapil4cb1d7d2016-04-16 18:16:25 -070012804 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
12805 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
12806 "%s: Not able to post msg to WDA!",
12807 __func__);
12808
12809 qdf_mem_free(filter_param);
12810 }
12811 return qdf_status;
12812}
Arun Khandavalli2476ef52016-04-26 20:19:43 +053012813
Arun Khandavalli2476ef52016-04-26 20:19:43 +053012814/**
Kondabattini, Ganesh3f2d02c2016-09-13 12:23:47 +053012815 * sme_send_disassoc_req_frame - send disassoc req
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -080012816 * @mac_handle: Opaque handle to the global MAC context
Kondabattini, Ganesh3f2d02c2016-09-13 12:23:47 +053012817 * @session_id: session id
12818 * @peer_mac: peer mac address
12819 * @reason: reason for disassociation
12820 * wait_for_ack: wait for acknowledgment
12821 *
12822 * function to send disassoc request to lim
12823 *
12824 * return: none
12825 */
Jeff Johnsonc7309062018-11-09 20:59:42 -080012826void sme_send_disassoc_req_frame(mac_handle_t mac_handle, uint8_t session_id,
12827 uint8_t *peer_mac, uint16_t reason,
12828 uint8_t wait_for_ack)
Kondabattini, Ganesh3f2d02c2016-09-13 12:23:47 +053012829{
12830 struct sme_send_disassoc_frm_req *msg;
12831 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Kondabattini, Ganesh3f2d02c2016-09-13 12:23:47 +053012832
Jeff Johnson0e1e7682019-02-20 13:36:04 -080012833 msg = qdf_mem_malloc(sizeof(*msg));
Arif Hussain0ef77082018-10-10 16:42:53 -070012834 if (!msg)
Kondabattini, Ganesh3f2d02c2016-09-13 12:23:47 +053012835 return;
12836
Jeff Johnson0e1e7682019-02-20 13:36:04 -080012837 msg->msg_type = eWNI_SME_SEND_DISASSOC_FRAME;
12838 msg->length = sizeof(*msg);
12839 msg->session_id = session_id;
12840 qdf_mem_copy(msg->peer_mac, peer_mac, QDF_MAC_ADDR_SIZE);
12841 msg->reason = reason;
12842 msg->wait_for_ack = wait_for_ack;
Kondabattini, Ganesh3f2d02c2016-09-13 12:23:47 +053012843
Rajeev Kumard138ac52017-01-30 18:38:37 -080012844 qdf_status = umac_send_mb_message_to_mac(msg);
Jeff Johnson0e1e7682019-02-20 13:36:04 -080012845 if (QDF_IS_STATUS_ERROR(qdf_status))
12846 sme_err("umac_send_mb_message_to_mac failed, %d",
12847 qdf_status);
Kondabattini, Ganesh3f2d02c2016-09-13 12:23:47 +053012848}
12849
Nachiket Kukade177b5b02018-05-22 20:52:17 +053012850#ifdef FEATURE_WLAN_APF
Jeff Johnsonc7309062018-11-09 20:59:42 -080012851QDF_STATUS sme_get_apf_capabilities(mac_handle_t mac_handle,
Nachiket Kukade177b5b02018-05-22 20:52:17 +053012852 apf_get_offload_cb callback,
12853 void *context)
Arun Khandavalli2476ef52016-04-26 20:19:43 +053012854{
12855 QDF_STATUS status = QDF_STATUS_SUCCESS;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080012856 struct mac_context * mac_ctx = MAC_CONTEXT(mac_handle);
Rajeev Kumar37d478b2017-04-17 16:59:28 -070012857 struct scheduler_msg cds_msg = {0};
Arun Khandavalli2476ef52016-04-26 20:19:43 +053012858
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070012859 SME_ENTER();
Arun Khandavalli2476ef52016-04-26 20:19:43 +053012860
12861 status = sme_acquire_global_lock(&mac_ctx->sme);
12862 if (QDF_STATUS_SUCCESS == status) {
12863 /* Serialize the req through MC thread */
Nachiket Kukadee547a482018-05-22 16:43:30 +053012864 mac_ctx->sme.apf_get_offload_cb = callback;
12865 mac_ctx->sme.apf_get_offload_context = context;
Arun Khandavalli2476ef52016-04-26 20:19:43 +053012866 cds_msg.bodyptr = NULL;
Nachiket Kukadee547a482018-05-22 16:43:30 +053012867 cds_msg.type = WDA_APF_GET_CAPABILITIES_REQ;
gaurank kathpalia36b0c582018-08-28 17:45:43 +053012868 status = scheduler_post_message(QDF_MODULE_ID_SME,
12869 QDF_MODULE_ID_WMA,
12870 QDF_MODULE_ID_WMA, &cds_msg);
Arun Khandavalli2476ef52016-04-26 20:19:43 +053012871 if (!QDF_IS_STATUS_SUCCESS(status)) {
12872 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Nachiket Kukadee547a482018-05-22 16:43:30 +053012873 FL("Post apf get offload msg fail"));
Arun Khandavalli2476ef52016-04-26 20:19:43 +053012874 status = QDF_STATUS_E_FAILURE;
12875 }
12876 sme_release_global_lock(&mac_ctx->sme);
Arun Khandavalli2476ef52016-04-26 20:19:43 +053012877 }
Madhvapathi Sriram3e6627a2018-12-19 12:54:49 +053012878
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070012879 SME_EXIT();
Arun Khandavalli2476ef52016-04-26 20:19:43 +053012880 return status;
12881}
12882
Jeff Johnsonc7309062018-11-09 20:59:42 -080012883QDF_STATUS sme_set_apf_instructions(mac_handle_t mac_handle,
Nachiket Kukadee547a482018-05-22 16:43:30 +053012884 struct sir_apf_set_offload *req)
Arun Khandavalli2476ef52016-04-26 20:19:43 +053012885{
Nachiket Kukade4f686582018-11-19 19:18:27 +053012886 void *wma_handle;
Arun Khandavalli2476ef52016-04-26 20:19:43 +053012887
Nachiket Kukade4f686582018-11-19 19:18:27 +053012888 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
12889 if (!wma_handle) {
Arun Khandavalli2476ef52016-04-26 20:19:43 +053012890 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Nachiket Kukade4f686582018-11-19 19:18:27 +053012891 "wma handle is NULL");
12892 return QDF_STATUS_E_FAILURE;
Arun Khandavalli2476ef52016-04-26 20:19:43 +053012893 }
Nachiket Kukade4f686582018-11-19 19:18:27 +053012894
12895 return wma_set_apf_instructions(wma_handle, req);
Arun Khandavalli2476ef52016-04-26 20:19:43 +053012896}
12897
Jeff Johnsonc7309062018-11-09 20:59:42 -080012898QDF_STATUS sme_set_apf_enable_disable(mac_handle_t mac_handle, uint8_t vdev_id,
Nachiket Kukade177b5b02018-05-22 20:52:17 +053012899 bool apf_enable)
12900{
12901 void *wma_handle;
12902
12903 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
12904 if (!wma_handle) {
12905 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
12906 "wma handle is NULL");
12907 return QDF_STATUS_E_FAILURE;
12908 }
12909
12910 return wma_send_apf_enable_cmd(wma_handle, vdev_id, apf_enable);
12911}
12912
12913QDF_STATUS
Jeff Johnsonc7309062018-11-09 20:59:42 -080012914sme_apf_write_work_memory(mac_handle_t mac_handle,
Nachiket Kukade177b5b02018-05-22 20:52:17 +053012915 struct wmi_apf_write_memory_params *write_params)
12916{
12917 void *wma_handle;
12918
12919 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
12920 if (!wma_handle) {
12921 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
12922 "wma handle is NULL");
12923 return QDF_STATUS_E_FAILURE;
12924 }
12925
12926 return wma_send_apf_write_work_memory_cmd(wma_handle, write_params);
12927}
12928
12929QDF_STATUS
Jeff Johnsonc7309062018-11-09 20:59:42 -080012930sme_apf_read_work_memory(mac_handle_t mac_handle,
Nachiket Kukade177b5b02018-05-22 20:52:17 +053012931 struct wmi_apf_read_memory_params *read_params,
12932 apf_read_mem_cb callback)
12933{
12934 QDF_STATUS status = QDF_STATUS_SUCCESS;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080012935 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Nachiket Kukade177b5b02018-05-22 20:52:17 +053012936 void *wma_handle;
12937
12938 status = sme_acquire_global_lock(&mac->sme);
12939 if (QDF_IS_STATUS_SUCCESS(status)) {
12940 mac->sme.apf_read_mem_cb = callback;
12941 sme_release_global_lock(&mac->sme);
12942 } else {
12943 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
12944 FL("sme_acquire_global_lock failed"));
12945 }
12946
12947 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
12948 if (!wma_handle) {
12949 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
12950 "wma handle is NULL");
12951 return QDF_STATUS_E_FAILURE;
12952 }
12953
12954 return wma_send_apf_read_work_memory_cmd(wma_handle, read_params);
12955}
12956#endif /* FEATURE_WLAN_APF */
12957
Arun Khandavalli2476ef52016-04-26 20:19:43 +053012958/**
Abhishek Singh1c676222016-05-09 14:20:28 +053012959 * sme_get_wni_dot11_mode() - return configured wni dot11mode
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -080012960 * @mac_handle: Opaque handle to the global MAC context
Abhishek Singh1c676222016-05-09 14:20:28 +053012961 *
12962 * Return: wni dot11 mode.
12963 */
Jeff Johnsonc7309062018-11-09 20:59:42 -080012964uint32_t sme_get_wni_dot11_mode(mac_handle_t mac_handle)
Abhishek Singh1c676222016-05-09 14:20:28 +053012965{
Jeff Johnson0a8786a2018-12-02 10:49:01 -080012966 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Abhishek Singh1c676222016-05-09 14:20:28 +053012967
12968 return csr_translate_to_wni_cfg_dot11_mode(mac_ctx,
12969 mac_ctx->roam.configParam.uCfgDot11Mode);
12970}
12971
12972/**
Manjunathappa Prakash59f861d2016-04-21 10:33:31 -070012973 * sme_create_mon_session() - post message to create PE session for monitormode
12974 * operation
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -080012975 * @mac_handle: Opaque handle to the global MAC context
Manjunathappa Prakash59f861d2016-04-21 10:33:31 -070012976 * @bssid: pointer to bssid
Rajeev Kumar Sirasanagandlae3b59912018-08-24 15:53:31 +053012977 * @vdev_id: sme session id
Manjunathappa Prakash59f861d2016-04-21 10:33:31 -070012978 *
12979 * Return: QDF_STATUS_SUCCESS on success, non-zero error code on failure.
12980 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -080012981QDF_STATUS sme_create_mon_session(mac_handle_t mac_handle, tSirMacAddr bss_id,
Rajeev Kumar Sirasanagandlae3b59912018-08-24 15:53:31 +053012982 uint8_t vdev_id)
Manjunathappa Prakash59f861d2016-04-21 10:33:31 -070012983{
12984 QDF_STATUS status = QDF_STATUS_E_FAILURE;
12985 struct sir_create_session *msg;
12986
12987 msg = qdf_mem_malloc(sizeof(*msg));
chenguo92af4bf2018-10-25 13:54:58 +080012988 if (msg) {
Manjunathappa Prakash59f861d2016-04-21 10:33:31 -070012989 msg->type = eWNI_SME_MON_INIT_SESSION;
Rajeev Kumar Sirasanagandlae3b59912018-08-24 15:53:31 +053012990 msg->vdev_id = vdev_id;
Manjunathappa Prakash59f861d2016-04-21 10:33:31 -070012991 msg->msg_len = sizeof(*msg);
12992 qdf_mem_copy(msg->bss_id.bytes, bss_id, QDF_MAC_ADDR_SIZE);
Rajeev Kumard138ac52017-01-30 18:38:37 -080012993 status = umac_send_mb_message_to_mac(msg);
Manjunathappa Prakash59f861d2016-04-21 10:33:31 -070012994 }
12995 return status;
12996}
Gupta, Kapil96c7f2f2016-04-25 19:13:41 +053012997
Jeff Johnsonb460dd72018-11-08 10:26:51 -080012998void sme_set_chan_info_callback(mac_handle_t mac_handle,
Kapil Gupta4f0c0c12017-02-07 15:21:15 +053012999 void (*callback)(struct scan_chan_info *chan_info))
13000{
Jeff Johnson0a8786a2018-12-02 10:49:01 -080013001 struct mac_context *mac;
Kapil Gupta4f0c0c12017-02-07 15:21:15 +053013002
Jeff Johnson038efe72019-03-18 13:39:31 -070013003 if (!mac_handle) {
Kapil Gupta4f0c0c12017-02-07 15:21:15 +053013004 QDF_ASSERT(0);
13005 return;
13006 }
Jeff Johnsona0619e42018-11-28 17:43:00 -080013007 mac = MAC_CONTEXT(mac_handle);
Kapil Gupta4f0c0c12017-02-07 15:21:15 +053013008 mac->chan_info_cb = callback;
13009}
13010
Gupta, Kapil96c7f2f2016-04-25 19:13:41 +053013011/**
Naveen Rawata410c5a2016-09-19 14:22:33 -070013012 * sme_set_vdev_ies_per_band() - sends the per band IEs to vdev
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -080013013 * @mac_handle: Opaque handle to the global MAC context
Naveen Rawata410c5a2016-09-19 14:22:33 -070013014 * @vdev_id: vdev_id for which IE is targeted
13015 *
13016 * Return: None
13017 */
Jeff Johnsonc7309062018-11-09 20:59:42 -080013018void sme_set_vdev_ies_per_band(mac_handle_t mac_handle, uint8_t vdev_id)
Naveen Rawata410c5a2016-09-19 14:22:33 -070013019{
Naveen Rawata410c5a2016-09-19 14:22:33 -070013020 struct sir_set_vdev_ies_per_band *p_msg;
13021 QDF_STATUS status = QDF_STATUS_E_FAILURE;
13022
13023 p_msg = qdf_mem_malloc(sizeof(*p_msg));
Arif Hussain0ef77082018-10-10 16:42:53 -070013024 if (!p_msg)
Naveen Rawata410c5a2016-09-19 14:22:33 -070013025 return;
Naveen Rawata410c5a2016-09-19 14:22:33 -070013026
13027 p_msg->vdev_id = vdev_id;
13028 p_msg->msg_type = eWNI_SME_SET_VDEV_IES_PER_BAND;
13029 p_msg->len = sizeof(*p_msg);
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070013030 sme_debug("sending eWNI_SME_SET_VDEV_IES_PER_BAND: vdev_id: %d",
Naveen Rawata410c5a2016-09-19 14:22:33 -070013031 vdev_id);
Rajeev Kumard138ac52017-01-30 18:38:37 -080013032 status = umac_send_mb_message_to_mac(p_msg);
Naveen Rawata410c5a2016-09-19 14:22:33 -070013033 if (QDF_STATUS_SUCCESS != status)
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070013034 sme_err("Send eWNI_SME_SET_VDEV_IES_PER_BAND fail");
Naveen Rawata410c5a2016-09-19 14:22:33 -070013035}
13036
Kiran Kumar Lokere666bf852016-05-02 12:23:02 -070013037/**
13038 * sme_set_pdev_ht_vht_ies() - sends the set pdev IE req
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -080013039 * @mac_handle: Opaque handle to the global MAC context
Kiran Kumar Lokere666bf852016-05-02 12:23:02 -070013040 * @enable2x2: 1x1 or 2x2 mode.
13041 *
13042 * Sends the set pdev IE req with Nss value.
13043 *
13044 * Return: None
13045 */
Jeff Johnsonc7309062018-11-09 20:59:42 -080013046void sme_set_pdev_ht_vht_ies(mac_handle_t mac_handle, bool enable2x2)
Kiran Kumar Lokere666bf852016-05-02 12:23:02 -070013047{
Jeff Johnson0a8786a2018-12-02 10:49:01 -080013048 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Kiran Kumar Lokere666bf852016-05-02 12:23:02 -070013049 struct sir_set_ht_vht_cfg *ht_vht_cfg;
13050 QDF_STATUS status = QDF_STATUS_E_FAILURE;
13051
Kiran Kumar Lokere666bf852016-05-02 12:23:02 -070013052 if (!((mac_ctx->roam.configParam.uCfgDot11Mode ==
13053 eCSR_CFG_DOT11_MODE_AUTO) ||
13054 (mac_ctx->roam.configParam.uCfgDot11Mode ==
13055 eCSR_CFG_DOT11_MODE_11N) ||
13056 (mac_ctx->roam.configParam.uCfgDot11Mode ==
13057 eCSR_CFG_DOT11_MODE_11N_ONLY) ||
13058 (mac_ctx->roam.configParam.uCfgDot11Mode ==
13059 eCSR_CFG_DOT11_MODE_11AC) ||
13060 (mac_ctx->roam.configParam.uCfgDot11Mode ==
13061 eCSR_CFG_DOT11_MODE_11AC_ONLY)))
13062 return;
13063
13064 status = sme_acquire_global_lock(&mac_ctx->sme);
13065 if (QDF_STATUS_SUCCESS == status) {
13066 ht_vht_cfg = qdf_mem_malloc(sizeof(*ht_vht_cfg));
Arif Hussain0ef77082018-10-10 16:42:53 -070013067 if (!ht_vht_cfg) {
Kiran Kumar Lokere666bf852016-05-02 12:23:02 -070013068 sme_release_global_lock(&mac_ctx->sme);
13069 return;
13070 }
13071
13072 ht_vht_cfg->pdev_id = 0;
13073 if (enable2x2)
13074 ht_vht_cfg->nss = 2;
13075 else
13076 ht_vht_cfg->nss = 1;
13077 ht_vht_cfg->dot11mode =
13078 (uint8_t)csr_translate_to_wni_cfg_dot11_mode(mac_ctx,
13079 mac_ctx->roam.configParam.uCfgDot11Mode);
13080
13081 ht_vht_cfg->msg_type = eWNI_SME_PDEV_SET_HT_VHT_IE;
13082 ht_vht_cfg->len = sizeof(*ht_vht_cfg);
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070013083 sme_debug("SET_HT_VHT_IE with nss: %d, dot11mode: %d",
13084 ht_vht_cfg->nss,
13085 ht_vht_cfg->dot11mode);
Rajeev Kumard138ac52017-01-30 18:38:37 -080013086 status = umac_send_mb_message_to_mac(ht_vht_cfg);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053013087 if (QDF_STATUS_SUCCESS != status)
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070013088 sme_err("Send SME_PDEV_SET_HT_VHT_IE fail");
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053013089
Kiran Kumar Lokere666bf852016-05-02 12:23:02 -070013090 sme_release_global_lock(&mac_ctx->sme);
13091 }
Kiran Kumar Lokere666bf852016-05-02 12:23:02 -070013092}
13093
Jeff Johnsonc7309062018-11-09 20:59:42 -080013094void sme_update_vdev_type_nss(mac_handle_t mac_handle, uint8_t max_supp_nss,
gaurank kathpalia651abcd2018-11-12 22:41:23 +053013095 enum nss_chains_band_info band)
Kiran Kumar Lokere666bf852016-05-02 12:23:02 -070013096{
Jeff Johnson0a8786a2018-12-02 10:49:01 -080013097 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Kiran Kumar Lokere666bf852016-05-02 12:23:02 -070013098 struct vdev_type_nss *vdev_nss;
13099
gaurank kathpalia651abcd2018-11-12 22:41:23 +053013100 struct wlan_mlme_nss_chains *nss_chains_ini_cfg =
13101 &mac_ctx->mlme_cfg->nss_chains_ini_cfg;
13102
13103 if (band == NSS_CHAINS_BAND_5GHZ)
Kiran Kumar Lokere666bf852016-05-02 12:23:02 -070013104 vdev_nss = &mac_ctx->vdev_type_nss_5g;
13105 else
13106 vdev_nss = &mac_ctx->vdev_type_nss_2g;
13107
gaurank kathpalia651abcd2018-11-12 22:41:23 +053013108 vdev_nss->sta = QDF_MIN(max_supp_nss, GET_VDEV_NSS_CHAIN(
13109 nss_chains_ini_cfg->
gaurank kathpalia42911082019-01-22 17:39:49 +053013110 rx_nss[band],
gaurank kathpalia651abcd2018-11-12 22:41:23 +053013111 STA_NSS_CHAINS_SHIFT));
13112 vdev_nss->sap = QDF_MIN(max_supp_nss, GET_VDEV_NSS_CHAIN(
13113 nss_chains_ini_cfg->
gaurank kathpalia42911082019-01-22 17:39:49 +053013114 rx_nss[band],
gaurank kathpalia651abcd2018-11-12 22:41:23 +053013115 SAP_NSS_CHAINS_SHIFT));
13116 vdev_nss->p2p_go = QDF_MIN(max_supp_nss, GET_VDEV_NSS_CHAIN(
13117 nss_chains_ini_cfg->
gaurank kathpalia42911082019-01-22 17:39:49 +053013118 rx_nss[band],
gaurank kathpalia651abcd2018-11-12 22:41:23 +053013119 P2P_GO_NSS_CHAINS_SHIFT));
13120 vdev_nss->p2p_cli = QDF_MIN(max_supp_nss, GET_VDEV_NSS_CHAIN(
13121 nss_chains_ini_cfg->
gaurank kathpalia42911082019-01-22 17:39:49 +053013122 rx_nss[band],
gaurank kathpalia651abcd2018-11-12 22:41:23 +053013123 P2P_CLI_CHAINS_SHIFT));
13124 vdev_nss->p2p_dev = QDF_MIN(max_supp_nss, GET_VDEV_NSS_CHAIN(
13125 nss_chains_ini_cfg->
gaurank kathpalia42911082019-01-22 17:39:49 +053013126 rx_nss[band],
gaurank kathpalia651abcd2018-11-12 22:41:23 +053013127 P2P_DEV_NSS_CHAINS_SHIFT));
13128 vdev_nss->ibss = QDF_MIN(max_supp_nss, GET_VDEV_NSS_CHAIN(
13129 nss_chains_ini_cfg->
gaurank kathpalia42911082019-01-22 17:39:49 +053013130 rx_nss[band],
gaurank kathpalia651abcd2018-11-12 22:41:23 +053013131 IBSS_NSS_CHAINS_SHIFT));
13132 vdev_nss->tdls = QDF_MIN(max_supp_nss, GET_VDEV_NSS_CHAIN(
13133 nss_chains_ini_cfg->
gaurank kathpalia42911082019-01-22 17:39:49 +053013134 rx_nss[band],
gaurank kathpalia651abcd2018-11-12 22:41:23 +053013135 TDLS_NSS_CHAINS_SHIFT));
13136 vdev_nss->ocb = QDF_MIN(max_supp_nss, GET_VDEV_NSS_CHAIN(
13137 nss_chains_ini_cfg->
gaurank kathpalia42911082019-01-22 17:39:49 +053013138 rx_nss[band],
gaurank kathpalia651abcd2018-11-12 22:41:23 +053013139 OCB_NSS_CHAINS_SHIFT));
Nachiket Kukadecf941602018-12-12 14:32:35 +053013140 vdev_nss->nan = QDF_MIN(max_supp_nss, GET_VDEV_NSS_CHAIN(
13141 nss_chains_ini_cfg->
gaurank kathpalia42911082019-01-22 17:39:49 +053013142 rx_nss[band],
Nachiket Kukadecf941602018-12-12 14:32:35 +053013143 NAN_NSS_CHAIN_SHIFT));
Nachiket Kukade413c5fa2019-02-19 17:57:19 +053013144 vdev_nss->ndi = QDF_MIN(max_supp_nss, GET_VDEV_NSS_CHAIN(
13145 nss_chains_ini_cfg->
13146 rx_nss[band],
13147 NAN_NSS_CHAIN_SHIFT));
Kiran Kumar Lokere666bf852016-05-02 12:23:02 -070013148
Nachiket Kukadecf941602018-12-12 14:32:35 +053013149 sme_debug("band %d NSS:sta %d sap %d cli %d go %d dev %d ibss %d tdls %d ocb %d nan %d",
13150 band, vdev_nss->sta, vdev_nss->sap, vdev_nss->p2p_cli,
13151 vdev_nss->p2p_go, vdev_nss->p2p_dev, vdev_nss->ibss,
13152 vdev_nss->tdls, vdev_nss->ocb, vdev_nss->nan);
Kiran Kumar Lokere666bf852016-05-02 12:23:02 -070013153}
Peng Xu8fdaa492016-06-22 10:20:47 -070013154
Kiran Kumar Lokeree6476b22017-10-16 23:40:32 -070013155#ifdef WLAN_FEATURE_11AX_BSS_COLOR
13156#define MAX_BSS_COLOR_VAL 63
13157#define MIN_BSS_COLOR_VAL 1
13158
Jeff Johnsonc7309062018-11-09 20:59:42 -080013159QDF_STATUS sme_set_he_bss_color(mac_handle_t mac_handle, uint8_t session_id,
13160 uint8_t bss_color)
Kiran Kumar Lokeree6476b22017-10-16 23:40:32 -070013161
13162{
13163 struct sir_set_he_bss_color *bss_color_msg;
13164 uint8_t len;
13165
Jeff Johnsonc7309062018-11-09 20:59:42 -080013166 if (!mac_handle) {
13167 sme_err("Invalid mac_handle pointer");
Kiran Kumar Lokeree6476b22017-10-16 23:40:32 -070013168 return QDF_STATUS_E_FAULT;
13169 }
13170
13171 sme_debug("Set HE bss_color %d", bss_color);
13172
13173 if (bss_color < MIN_BSS_COLOR_VAL || bss_color > MAX_BSS_COLOR_VAL) {
13174 sme_debug("Invalid HE bss_color %d", bss_color);
13175 return QDF_STATUS_E_INVAL;
13176 }
13177 len = sizeof(*bss_color_msg);
13178 bss_color_msg = qdf_mem_malloc(len);
Arif Hussain0ef77082018-10-10 16:42:53 -070013179 if (!bss_color_msg)
Kiran Kumar Lokeree6476b22017-10-16 23:40:32 -070013180 return QDF_STATUS_E_NOMEM;
Arif Hussain0ef77082018-10-10 16:42:53 -070013181
Kiran Kumar Lokeree6476b22017-10-16 23:40:32 -070013182 bss_color_msg->message_type = eWNI_SME_SET_HE_BSS_COLOR;
13183 bss_color_msg->length = len;
13184 bss_color_msg->session_id = session_id;
13185 bss_color_msg->bss_color = bss_color;
13186 return umac_send_mb_message_to_mac(bss_color_msg);
13187}
13188#endif
13189
Rachit Kankane026e77a2018-07-31 16:21:09 +053013190#ifdef FEATURE_P2P_LISTEN_OFFLOAD
Nitesh Shahdb5ea0d2017-03-22 15:17:47 +053013191/**
Peng Xu8fdaa492016-06-22 10:20:47 -070013192 * sme_register_p2p_lo_event() - Register for the p2p lo event
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -080013193 * @mac_handle: Opaque handle to the global MAC context
Peng Xu8fdaa492016-06-22 10:20:47 -070013194 * @context: the context of the call
13195 * @callback: the callback to hdd
13196 *
13197 * This function registers the callback function for P2P listen
13198 * offload stop event.
13199 *
13200 * Return: none
13201 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -080013202void sme_register_p2p_lo_event(mac_handle_t mac_handle, void *context,
Jeff Johnsonf7e36d62018-07-04 21:14:02 -070013203 p2p_lo_callback callback)
Peng Xu8fdaa492016-06-22 10:20:47 -070013204{
Jeff Johnson0a8786a2018-12-02 10:49:01 -080013205 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Peng Xu8fdaa492016-06-22 10:20:47 -070013206 QDF_STATUS status = QDF_STATUS_E_FAILURE;
13207
Jeff Johnson01f2c232018-11-21 19:17:44 -080013208 status = sme_acquire_global_lock(&mac->sme);
13209 mac->sme.p2p_lo_event_callback = callback;
13210 mac->sme.p2p_lo_event_context = context;
13211 sme_release_global_lock(&mac->sme);
Peng Xu8fdaa492016-06-22 10:20:47 -070013212}
Rachit Kankane026e77a2018-07-31 16:21:09 +053013213#endif
Manjeet Singhf82ed072016-07-08 11:40:00 +053013214
13215/**
13216 * sme_process_mac_pwr_dbg_cmd() - enable mac pwr debugging
Jeff Johnsonc7309062018-11-09 20:59:42 -080013217 * @mac_handle: The handle returned by macOpen
Manjeet Singhf82ed072016-07-08 11:40:00 +053013218 * @session_id: session id
13219 * @dbg_args: args for mac pwr debug command
13220 * Return: Return QDF_STATUS, otherwise appropriate failure code
13221 */
Jeff Johnsonc7309062018-11-09 20:59:42 -080013222QDF_STATUS sme_process_mac_pwr_dbg_cmd(mac_handle_t mac_handle,
13223 uint32_t session_id,
13224 struct sir_mac_pwr_dbg_cmd *dbg_args)
Manjeet Singhf82ed072016-07-08 11:40:00 +053013225{
Rajeev Kumar37d478b2017-04-17 16:59:28 -070013226 struct scheduler_msg message = {0};
Jeff Johnson0a8786a2018-12-02 10:49:01 -080013227 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Manjeet Singhf82ed072016-07-08 11:40:00 +053013228 struct sir_mac_pwr_dbg_cmd *req;
13229 int i;
13230
13231 if (!CSR_IS_SESSION_VALID(mac_ctx, session_id)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070013232 sme_err("CSR session not valid: %d", session_id);
Manjeet Singhf82ed072016-07-08 11:40:00 +053013233 return QDF_STATUS_E_FAILURE;
13234 }
13235
13236 req = qdf_mem_malloc(sizeof(*req));
Arif Hussain0ef77082018-10-10 16:42:53 -070013237 if (!req)
Manjeet Singhf82ed072016-07-08 11:40:00 +053013238 return QDF_STATUS_E_FAILURE;
Arif Hussain0ef77082018-10-10 16:42:53 -070013239
Manjeet Singhf82ed072016-07-08 11:40:00 +053013240 req->module_id = dbg_args->module_id;
13241 req->pdev_id = dbg_args->pdev_id;
13242 req->num_args = dbg_args->num_args;
13243 for (i = 0; i < req->num_args; i++)
13244 req->args[i] = dbg_args->args[i];
13245
13246 message.type = SIR_HAL_POWER_DBG_CMD;
13247 message.bodyptr = req;
13248
gaurank kathpalia36b0c582018-08-28 17:45:43 +053013249 if (!QDF_IS_STATUS_SUCCESS(scheduler_post_message(QDF_MODULE_ID_SME,
13250 QDF_MODULE_ID_WMA,
13251 QDF_MODULE_ID_WMA,
13252 &message))) {
Manjeet Singhf82ed072016-07-08 11:40:00 +053013253 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
13254 "%s: Not able to post msg to WDA!",
13255 __func__);
13256 qdf_mem_free(req);
13257 }
13258 return QDF_STATUS_SUCCESS;
13259}
Tushnim Bhattacharyyaf44a9d82016-07-05 10:52:06 -070013260/**
13261 * sme_get_vdev_type_nss() - gets the nss per vdev type
Tushnim Bhattacharyyaf44a9d82016-07-05 10:52:06 -070013262 * @dev_mode: connection type.
13263 * @nss2g: Pointer to the 2G Nss parameter.
13264 * @nss5g: Pointer to the 5G Nss parameter.
13265 *
13266 * Fills the 2G and 5G Nss values based on connection type.
13267 *
13268 * Return: None
13269 */
Jeff Johnsonc1e62782017-11-09 09:50:17 -080013270void sme_get_vdev_type_nss(enum QDF_OPMODE dev_mode,
13271 uint8_t *nss_2g, uint8_t *nss_5g)
Tushnim Bhattacharyyaf44a9d82016-07-05 10:52:06 -070013272{
Jeff Johnson0a8786a2018-12-02 10:49:01 -080013273 struct mac_context *mac_ctx = sme_get_mac_context();
Tushnim Bhattacharyya0c4ad2d2017-03-09 15:59:03 -080013274
Jeff Johnson038efe72019-03-18 13:39:31 -070013275 if (!mac_ctx) {
Tushnim Bhattacharyya0c4ad2d2017-03-09 15:59:03 -080013276 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
13277 FL("Invalid MAC context"));
13278 return;
13279 }
Tushnim Bhattacharyyaf44a9d82016-07-05 10:52:06 -070013280 csr_get_vdev_type_nss(mac_ctx, dev_mode, nss_2g, nss_5g);
13281}
Agrawal Ashish21ba2572016-09-03 16:40:10 +053013282
13283/**
13284 * sme_update_sta_roam_policy() - update sta roam policy for
13285 * unsafe and DFS channels.
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -080013286 * @mac_handle: Opaque handle to the global MAC context
Agrawal Ashish21ba2572016-09-03 16:40:10 +053013287 * @dfs_mode: dfs mode which tell if dfs channel needs to be
13288 * skipped or not
13289 * @skip_unsafe_channels: Param to tell if driver needs to
13290 * skip unsafe channels or not.
13291 * @param session_id: sme_session_id
Agrawal, Ashish9f84c402016-11-30 16:19:44 +053013292 * @sap_operating_band: Band on which SAP is operating
Agrawal Ashish21ba2572016-09-03 16:40:10 +053013293 *
13294 * sme_update_sta_roam_policy update sta rome policies to csr
13295 * this function will call csrUpdateChannelList as well
13296 * to include/exclude DFS channels and unsafe channels.
13297 *
13298 * Return: eHAL_STATUS_SUCCESS or non-zero on failure.
13299 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -080013300QDF_STATUS sme_update_sta_roam_policy(mac_handle_t mac_handle,
Jeff Johnsonc7309062018-11-09 20:59:42 -080013301 enum sta_roam_policy_dfs_mode dfs_mode,
13302 bool skip_unsafe_channels,
13303 uint8_t session_id,
13304 uint8_t sap_operating_band)
Agrawal Ashish21ba2572016-09-03 16:40:10 +053013305{
Jeff Johnson0a8786a2018-12-02 10:49:01 -080013306 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Agrawal Ashish21ba2572016-09-03 16:40:10 +053013307 QDF_STATUS status = QDF_STATUS_SUCCESS;
Jeff Johnson46b4f0e2019-03-08 10:48:35 -080013308 struct sme_config_params *sme_config;
Agrawal Ashish21ba2572016-09-03 16:40:10 +053013309
13310 if (!mac_ctx) {
13311 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_FATAL,
13312 "%s: mac_ctx is null", __func__);
13313 return QDF_STATUS_E_FAILURE;
13314 }
Agrawal Ashish21ba2572016-09-03 16:40:10 +053013315
Sridhar Selvaraj48c47092017-07-31 18:18:14 +053013316 sme_config = qdf_mem_malloc(sizeof(*sme_config));
Arif Hussain0ef77082018-10-10 16:42:53 -070013317 if (!sme_config)
Sridhar Selvaraj48c47092017-07-31 18:18:14 +053013318 return QDF_STATUS_E_FAILURE;
Arif Hussain0ef77082018-10-10 16:42:53 -070013319
Sridhar Selvaraj48c47092017-07-31 18:18:14 +053013320 qdf_mem_zero(sme_config, sizeof(*sme_config));
Jeff Johnsonb460dd72018-11-08 10:26:51 -080013321 sme_get_config_param(mac_handle, sme_config);
Sridhar Selvaraj48c47092017-07-31 18:18:14 +053013322
Jeff Johnsone94ccd02019-04-02 15:02:56 -070013323 sme_config->csr_config.sta_roam_policy_params.dfs_mode =
Agrawal Ashish21ba2572016-09-03 16:40:10 +053013324 dfs_mode;
Jeff Johnsone94ccd02019-04-02 15:02:56 -070013325 sme_config->csr_config.sta_roam_policy_params.skip_unsafe_channels =
Agrawal Ashish21ba2572016-09-03 16:40:10 +053013326 skip_unsafe_channels;
Jeff Johnsone94ccd02019-04-02 15:02:56 -070013327 sme_config->csr_config.sta_roam_policy_params.sap_operating_band =
Agrawal, Ashish9f84c402016-11-30 16:19:44 +053013328 sap_operating_band;
Agrawal Ashish21ba2572016-09-03 16:40:10 +053013329
Jeff Johnsonb460dd72018-11-08 10:26:51 -080013330 sme_update_config(mac_handle, sme_config);
Agrawal Ashish21ba2572016-09-03 16:40:10 +053013331
13332 status = csr_update_channel_list(mac_ctx);
13333 if (QDF_STATUS_SUCCESS != status) {
13334 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
13335 FL("failed to update the supported channel list"));
13336 }
Vignesh Viswanathan4e65e8e2018-05-01 12:04:16 +053013337
Wu Gao51a63562018-11-08 16:29:10 +080013338 if (mac_ctx->mlme_cfg->lfr.roam_scan_offload_enabled) {
Vignesh Viswanathan4e65e8e2018-05-01 12:04:16 +053013339 status = sme_acquire_global_lock(&mac_ctx->sme);
13340 if (QDF_IS_STATUS_SUCCESS(status)) {
13341 csr_roam_offload_scan(mac_ctx, session_id,
Agrawal Ashish21ba2572016-09-03 16:40:10 +053013342 ROAM_SCAN_OFFLOAD_UPDATE_CFG,
13343 REASON_ROAM_SCAN_STA_ROAM_POLICY_CHANGED);
Vignesh Viswanathan4e65e8e2018-05-01 12:04:16 +053013344 sme_release_global_lock(&mac_ctx->sme);
Vignesh Viswanathan4e65e8e2018-05-01 12:04:16 +053013345 }
13346 }
Sridhar Selvaraj48c47092017-07-31 18:18:14 +053013347 qdf_mem_free(sme_config);
Selvaraj, Sridharebda0f22016-08-29 16:05:23 +053013348 return status;
13349}
13350
13351/**
13352 * sme_enable_disable_chanavoidind_event - configure ca event ind
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -080013353 * @mac_handle: Opaque handle to the global MAC context
Selvaraj, Sridharebda0f22016-08-29 16:05:23 +053013354 * @set_value: enable/disable
13355 *
13356 * function to enable/disable chan avoidance indication
13357 *
13358 * Return: QDF_STATUS
13359 */
Jeff Johnsonc7309062018-11-09 20:59:42 -080013360QDF_STATUS sme_enable_disable_chanavoidind_event(mac_handle_t mac_handle,
13361 uint8_t set_value)
Selvaraj, Sridharebda0f22016-08-29 16:05:23 +053013362{
13363 QDF_STATUS status;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080013364 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Rajeev Kumar37d478b2017-04-17 16:59:28 -070013365 struct scheduler_msg msg = {0};
Selvaraj, Sridharebda0f22016-08-29 16:05:23 +053013366
Vignesh Viswanathana1f3a1a2018-10-04 13:10:46 +053013367 if (!mac_ctx->mlme_cfg->gen.optimize_ca_event) {
13368 sme_err("optimize_ca_event not enabled in ini");
13369 return QDF_STATUS_E_NOSUPPORT;
13370 }
13371
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070013372 sme_debug("set_value: %d", set_value);
Selvaraj, Sridharebda0f22016-08-29 16:05:23 +053013373 status = sme_acquire_global_lock(&mac_ctx->sme);
13374 if (QDF_STATUS_SUCCESS == status) {
Rajeev Kumar8eaedf62017-01-21 11:03:13 -080013375 qdf_mem_zero(&msg, sizeof(struct scheduler_msg));
Selvaraj, Sridharebda0f22016-08-29 16:05:23 +053013376 msg.type = WMA_SEND_FREQ_RANGE_CONTROL_IND;
13377 msg.bodyval = set_value;
gaurank kathpalia36b0c582018-08-28 17:45:43 +053013378 status = scheduler_post_message(QDF_MODULE_ID_SME,
13379 QDF_MODULE_ID_WMA,
13380 QDF_MODULE_ID_WMA, &msg);
Selvaraj, Sridharebda0f22016-08-29 16:05:23 +053013381 sme_release_global_lock(&mac_ctx->sme);
13382 return status;
13383 }
Deepak Dhamdhereb106ae52016-08-10 20:55:30 +053013384 return status;
13385}
Agrawal Ashish21ba2572016-09-03 16:40:10 +053013386
Deepak Dhamdhereb106ae52016-08-10 20:55:30 +053013387/*
13388 * sme_set_default_scan_ie() - API to send default scan IE to LIM
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -080013389 * @mac_handle: Opaque handle to the global MAC context
Deepak Dhamdhereb106ae52016-08-10 20:55:30 +053013390 * @session_id: current session ID
13391 * @ie_data: Pointer to Scan IE data
13392 * @ie_len: Length of @ie_data
13393 *
13394 * Return: QDF_STATUS
13395 */
Jeff Johnsonc7309062018-11-09 20:59:42 -080013396QDF_STATUS sme_set_default_scan_ie(mac_handle_t mac_handle, uint16_t session_id,
13397 uint8_t *ie_data, uint16_t ie_len)
Deepak Dhamdhereb106ae52016-08-10 20:55:30 +053013398{
13399 QDF_STATUS status;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080013400 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Deepak Dhamdhereb106ae52016-08-10 20:55:30 +053013401 struct hdd_default_scan_ie *set_ie_params;
13402
Rajeev Kumar5d17dd52017-12-19 16:17:42 -080013403 if (!ie_data)
13404 return QDF_STATUS_E_INVAL;
13405
Deepak Dhamdhereb106ae52016-08-10 20:55:30 +053013406 status = sme_acquire_global_lock(&mac_ctx->sme);
13407 if (QDF_IS_STATUS_SUCCESS(status)) {
13408 set_ie_params = qdf_mem_malloc(sizeof(*set_ie_params));
13409 if (!set_ie_params)
13410 status = QDF_STATUS_E_NOMEM;
13411 else {
13412 set_ie_params->message_type = eWNI_SME_DEFAULT_SCAN_IE;
13413 set_ie_params->length = sizeof(*set_ie_params);
13414 set_ie_params->session_id = session_id;
13415 set_ie_params->ie_len = ie_len;
13416 qdf_mem_copy(set_ie_params->ie_data, ie_data, ie_len);
Rajeev Kumard138ac52017-01-30 18:38:37 -080013417 status = umac_send_mb_message_to_mac(set_ie_params);
Deepak Dhamdhereb106ae52016-08-10 20:55:30 +053013418 }
13419 sme_release_global_lock(&mac_ctx->sme);
13420 }
Agrawal Ashish21ba2572016-09-03 16:40:10 +053013421 return status;
13422}
Padma, Santhosh Kumard7cc0792016-06-28 18:54:12 +053013423
Jeff Johnsonc7309062018-11-09 20:59:42 -080013424QDF_STATUS sme_get_sar_power_limits(mac_handle_t mac_handle,
Jeff Johnsonf0e54b02017-12-18 15:22:25 -080013425 wma_sar_cb callback, void *context)
13426{
13427 void *wma_handle;
13428
13429 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
13430 if (!wma_handle) {
13431 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
13432 "wma handle is NULL");
13433 return QDF_STATUS_E_FAILURE;
13434 }
13435
13436 return wma_get_sar_limit(wma_handle, callback, context);
13437}
13438
Jeff Johnsonc7309062018-11-09 20:59:42 -080013439QDF_STATUS sme_set_sar_power_limits(mac_handle_t mac_handle,
Kabilan Kannan3c0a7352016-12-02 18:49:38 -080013440 struct sar_limit_cmd_params *sar_limit_cmd)
13441{
13442 void *wma_handle;
13443
13444 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
13445 if (!wma_handle) {
13446 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
13447 "wma handle is NULL");
13448 return QDF_STATUS_E_FAILURE;
13449 }
13450
13451 return wma_set_sar_limit(wma_handle, sar_limit_cmd);
13452}
13453
Dundi Raviteja3b637092018-09-12 13:42:50 +053013454QDF_STATUS sme_send_coex_config_cmd(struct coex_config_params *coex_cfg_params)
13455{
13456 void *wma_handle;
13457
13458 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
13459 if (!wma_handle) {
13460 sme_err("wma handle is NULL");
13461 return QDF_STATUS_E_FAILURE;
13462 }
13463 return wma_send_coex_config_cmd(wma_handle, coex_cfg_params);
13464}
13465
Jeff Johnson6136fb92017-03-30 15:21:49 -070013466#ifdef WLAN_FEATURE_FIPS
Jeff Johnsonc7309062018-11-09 20:59:42 -080013467QDF_STATUS sme_fips_request(mac_handle_t mac_handle, struct fips_params *param,
Jeff Johnson6136fb92017-03-30 15:21:49 -070013468 wma_fips_cb callback, void *context)
13469{
13470 void *wma_handle;
13471
13472 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
13473 if (!wma_handle) {
13474 sme_err("wma handle is NULL");
13475 return QDF_STATUS_E_FAILURE;
13476 }
13477
13478 return wma_fips_request(wma_handle, param, callback, context);
13479}
13480#endif
13481
Jeff Johnsonb460dd72018-11-08 10:26:51 -080013482QDF_STATUS sme_set_cts2self_for_p2p_go(mac_handle_t mac_handle)
Agrawal Ashishb2d1a452016-05-05 12:23:58 +053013483{
Agrawal Ashishb2d1a452016-05-05 12:23:58 +053013484 void *wma_handle;
13485
13486 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
13487 if (!wma_handle) {
13488 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
13489 "wma_handle is NULL");
13490 return QDF_STATUS_E_FAILURE;
13491 }
Agrawal Ashishb2d1a452016-05-05 12:23:58 +053013492 if (QDF_STATUS_SUCCESS !=
13493 wma_set_cts2self_for_p2p_go(wma_handle, true)) {
13494 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
13495 "%s: Failed to set cts2self for p2p GO to firmware",
13496 __func__);
13497 return QDF_STATUS_E_FAILURE;
13498 }
13499 return QDF_STATUS_SUCCESS;
13500}
Yingying Tang95409972016-10-20 15:16:15 +080013501
Agrawal, Ashish35b251d2016-09-08 19:21:03 +053013502/**
13503 * sme_update_tx_fail_cnt_threshold() - update tx fail count Threshold
Jeff Johnsonb460dd72018-11-08 10:26:51 -080013504 * @mac_handle: Handle returned by mac_open
Agrawal, Ashish35b251d2016-09-08 19:21:03 +053013505 * @session_id: Session ID on which tx fail count needs to be updated to FW
13506 * @tx_fail_count: Count for tx fail threshold after which FW will disconnect
13507 *
13508 * This function is used to set tx fail count threshold to firmware.
13509 * firmware will issue disocnnect with peer device once this threshold is
13510 * reached.
13511 *
13512 * Return: Return QDF_STATUS, otherwise appropriate failure code
13513 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -080013514QDF_STATUS sme_update_tx_fail_cnt_threshold(mac_handle_t mac_handle,
Jeff Johnsonc7309062018-11-09 20:59:42 -080013515 uint8_t session_id,
13516 uint32_t tx_fail_count)
Agrawal, Ashish35b251d2016-09-08 19:21:03 +053013517{
Agrawal, Ashish35b251d2016-09-08 19:21:03 +053013518 QDF_STATUS status = QDF_STATUS_E_FAILURE;
13519 struct sme_tx_fail_cnt_threshold *tx_fail_cnt;
Rajeev Kumar37d478b2017-04-17 16:59:28 -070013520 struct scheduler_msg msg = {0};
Agrawal, Ashish35b251d2016-09-08 19:21:03 +053013521
13522 tx_fail_cnt = qdf_mem_malloc(sizeof(*tx_fail_cnt));
Arif Hussain0ef77082018-10-10 16:42:53 -070013523 if (!tx_fail_cnt)
Agrawal, Ashish35b251d2016-09-08 19:21:03 +053013524 return QDF_STATUS_E_FAILURE;
Arif Hussain0ef77082018-10-10 16:42:53 -070013525
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070013526 sme_debug("session_id: %d tx_fail_count: %d",
13527 session_id, tx_fail_count);
Agrawal, Ashish35b251d2016-09-08 19:21:03 +053013528 tx_fail_cnt->session_id = session_id;
13529 tx_fail_cnt->tx_fail_cnt_threshold = tx_fail_count;
13530
Rajeev Kumar8eaedf62017-01-21 11:03:13 -080013531 qdf_mem_zero(&msg, sizeof(struct scheduler_msg));
Agrawal, Ashish35b251d2016-09-08 19:21:03 +053013532 msg.type = SIR_HAL_UPDATE_TX_FAIL_CNT_TH;
13533 msg.reserved = 0;
13534 msg.bodyptr = tx_fail_cnt;
gaurank kathpalia36b0c582018-08-28 17:45:43 +053013535 status = scheduler_post_message(QDF_MODULE_ID_SME,
13536 QDF_MODULE_ID_WMA,
13537 QDF_MODULE_ID_WMA, &msg);
Agrawal, Ashish35b251d2016-09-08 19:21:03 +053013538
13539 if (!QDF_IS_STATUS_SUCCESS(status)) {
13540 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053013541 FL("Not able to post Tx fail count message to WDA"));
Agrawal, Ashish35b251d2016-09-08 19:21:03 +053013542 qdf_mem_free(tx_fail_cnt);
13543 }
Sreelakshmi Konamki58c72432016-11-09 17:06:44 +053013544 return status;
13545}
Agrawal, Ashish35b251d2016-09-08 19:21:03 +053013546
Jeff Johnsondc198ec2018-07-04 17:39:53 -070013547QDF_STATUS sme_set_lost_link_info_cb(mac_handle_t mac_handle,
13548 lost_link_info_cb cb)
Sreelakshmi Konamki58c72432016-11-09 17:06:44 +053013549{
Jeff Johnsondc198ec2018-07-04 17:39:53 -070013550 QDF_STATUS status;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080013551 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Sreelakshmi Konamki58c72432016-11-09 17:06:44 +053013552
13553 status = sme_acquire_global_lock(&mac->sme);
13554 if (QDF_IS_STATUS_SUCCESS(status)) {
13555 mac->sme.lost_link_info_cb = cb;
13556 sme_release_global_lock(&mac->sme);
Sreelakshmi Konamki58c72432016-11-09 17:06:44 +053013557 }
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053013558
Agrawal, Ashish35b251d2016-09-08 19:21:03 +053013559 return status;
13560}
Yingying Tang95409972016-10-20 15:16:15 +080013561
yeshwanth sriram guntukaa1ba9a22017-02-28 16:17:32 +053013562#ifdef FEATURE_WLAN_ESE
Jeff Johnson172237b2017-11-07 15:32:59 -080013563bool sme_roam_is_ese_assoc(struct csr_roam_info *roam_info)
yeshwanth sriram guntukaa1ba9a22017-02-28 16:17:32 +053013564{
13565 return roam_info->isESEAssoc;
13566}
Manjeet Singh2f785062017-03-08 18:14:18 +053013567#endif
yeshwanth sriram guntukaa1ba9a22017-02-28 16:17:32 +053013568
Jeff Johnsond5fb2db2018-11-08 14:20:28 -080013569bool sme_neighbor_roam_is11r_assoc(mac_handle_t mac_handle, uint8_t session_id)
yeshwanth sriram guntukaa1ba9a22017-02-28 16:17:32 +053013570{
Jeff Johnson0a8786a2018-12-02 10:49:01 -080013571 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053013572
yeshwanth sriram guntukaa1ba9a22017-02-28 16:17:32 +053013573 return csr_neighbor_roam_is11r_assoc(mac_ctx, session_id);
13574}
Yingying Tang95409972016-10-20 15:16:15 +080013575
13576#ifdef WLAN_FEATURE_WOW_PULSE
13577/**
13578 * sme_set_wow_pulse() - set wow pulse info
13579 * @wow_pulse_set_info: wow_pulse_mode structure pointer
13580 *
13581 * Return: QDF_STATUS
13582 */
13583QDF_STATUS sme_set_wow_pulse(struct wow_pulse_mode *wow_pulse_set_info)
13584{
Rajeev Kumar37d478b2017-04-17 16:59:28 -070013585 struct scheduler_msg message = {0};
Yingying Tang95409972016-10-20 15:16:15 +080013586 QDF_STATUS status;
13587 struct wow_pulse_mode *wow_pulse_set_cmd;
13588
13589 if (!wow_pulse_set_info) {
13590 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
13591 "%s: invalid wow_pulse_set_info pointer", __func__);
13592 return QDF_STATUS_E_FAILURE;
13593 }
13594
13595 wow_pulse_set_cmd = qdf_mem_malloc(sizeof(*wow_pulse_set_cmd));
Arif Hussain0ef77082018-10-10 16:42:53 -070013596 if (!wow_pulse_set_cmd)
Yingying Tang95409972016-10-20 15:16:15 +080013597 return QDF_STATUS_E_NOMEM;
Yingying Tang95409972016-10-20 15:16:15 +080013598
13599 *wow_pulse_set_cmd = *wow_pulse_set_info;
13600
13601 message.type = WMA_SET_WOW_PULSE_CMD;
13602 message.bodyptr = wow_pulse_set_cmd;
gaurank kathpalia36b0c582018-08-28 17:45:43 +053013603 status = scheduler_post_message(QDF_MODULE_ID_SME,
13604 QDF_MODULE_ID_WMA,
13605 QDF_MODULE_ID_WMA,
Yingying Tang95409972016-10-20 15:16:15 +080013606 &message);
13607 if (!QDF_IS_STATUS_SUCCESS(status)) {
13608 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
13609 "%s: Not able to post msg to WDA!",
13610 __func__);
13611 qdf_mem_free(wow_pulse_set_cmd);
13612 status = QDF_STATUS_E_FAILURE;
13613 }
13614
13615 return status;
13616}
13617#endif
Naveen Rawat664a7cb2017-01-19 17:58:14 -080013618
13619/**
13620 * sme_prepare_beacon_from_bss_descp() - prepares beacon frame by populating
13621 * different fields and IEs from bss descriptor.
13622 * @frame_buf: frame buffer to populate
13623 * @bss_descp: bss descriptor
13624 * @bssid: bssid of the beacon frame to populate
13625 * @ie_len: length of IE fields
13626 *
13627 * Return: None
13628 */
13629static void sme_prepare_beacon_from_bss_descp(uint8_t *frame_buf,
Pragaspathi Thilagaraj1112c962019-05-23 23:45:38 +053013630 struct bss_description *bss_descp,
Naveen Rawat664a7cb2017-01-19 17:58:14 -080013631 const tSirMacAddr bssid,
Naveen Rawat6dabf4e2017-02-08 15:55:49 -080013632 uint32_t ie_len)
Naveen Rawat664a7cb2017-01-19 17:58:14 -080013633{
13634 tDot11fBeacon1 *bcn_fixed;
13635 tpSirMacMgmtHdr mac_hdr = (tpSirMacMgmtHdr)frame_buf;
13636
13637 /* populate mac header first to indicate beacon */
13638 mac_hdr->fc.protVer = SIR_MAC_PROTOCOL_VERSION;
13639 mac_hdr->fc.type = SIR_MAC_MGMT_FRAME;
13640 mac_hdr->fc.subType = SIR_MAC_MGMT_BEACON;
13641 qdf_mem_copy((uint8_t *) mac_hdr->da,
13642 (uint8_t *) "\xFF\xFF\xFF\xFF\xFF\xFF",
13643 sizeof(struct qdf_mac_addr));
13644 qdf_mem_copy((uint8_t *) mac_hdr->sa, bssid,
13645 sizeof(struct qdf_mac_addr));
13646 qdf_mem_copy((uint8_t *) mac_hdr->bssId, bssid,
13647 sizeof(struct qdf_mac_addr));
13648
13649 /* now populate fixed params */
13650 bcn_fixed = (tDot11fBeacon1 *)(frame_buf + SIR_MAC_HDR_LEN_3A);
13651 /* populate timestamp */
13652 qdf_mem_copy(&bcn_fixed->TimeStamp.timestamp, &bss_descp->timeStamp,
13653 sizeof(bss_descp->timeStamp));
13654 /* populate beacon interval */
13655 bcn_fixed->BeaconInterval.interval = bss_descp->beaconInterval;
13656 /* populate capability */
13657 qdf_mem_copy(&bcn_fixed->Capabilities, &bss_descp->capabilityInfo,
13658 sizeof(bss_descp->capabilityInfo));
13659
13660 /* copy IEs now */
13661 qdf_mem_copy(frame_buf + SIR_MAC_HDR_LEN_3A
13662 + SIR_MAC_B_PR_SSID_OFFSET,
13663 &bss_descp->ieFields, ie_len);
13664}
13665
Jeff Johnsonc7309062018-11-09 20:59:42 -080013666QDF_STATUS sme_get_rssi_snr_by_bssid(mac_handle_t mac_handle,
13667 struct csr_roam_profile *profile,
13668 const uint8_t *bssid,
13669 int8_t *rssi, int8_t *snr)
Hanumanth Reddy Pothula90051782017-05-04 22:14:43 +053013670{
Pragaspathi Thilagaraj1112c962019-05-23 23:45:38 +053013671 struct bss_description *bss_descp;
Hanumanth Reddy Pothula90051782017-05-04 22:14:43 +053013672 tCsrScanResultFilter *scan_filter;
13673 struct scan_result_list *bss_list;
13674 tScanResultHandle result_handle = NULL;
13675 QDF_STATUS status = QDF_STATUS_SUCCESS;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080013676 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Hanumanth Reddy Pothula90051782017-05-04 22:14:43 +053013677
13678 scan_filter = qdf_mem_malloc(sizeof(tCsrScanResultFilter));
Arif Hussain0ef77082018-10-10 16:42:53 -070013679 if (!scan_filter) {
Hanumanth Reddy Pothula90051782017-05-04 22:14:43 +053013680 status = QDF_STATUS_E_NOMEM;
13681 goto free_scan_flter;
13682 }
13683
13684 status = csr_roam_prepare_filter_from_profile(mac_ctx,
13685 profile, scan_filter);
13686 if (QDF_STATUS_SUCCESS != status) {
13687 sme_err("prepare_filter failed");
13688 goto free_scan_flter;
13689 }
13690
13691 /* update filter to get scan result with just target BSSID */
Jeff Johnson038efe72019-03-18 13:39:31 -070013692 if (!scan_filter->BSSIDs.bssid) {
Hanumanth Reddy Pothula90051782017-05-04 22:14:43 +053013693 scan_filter->BSSIDs.bssid =
13694 qdf_mem_malloc(sizeof(struct qdf_mac_addr));
Arif Hussain0ef77082018-10-10 16:42:53 -070013695 if (!scan_filter->BSSIDs.bssid) {
Hanumanth Reddy Pothula90051782017-05-04 22:14:43 +053013696 status = QDF_STATUS_E_NOMEM;
13697 goto free_scan_flter;
13698 }
13699 }
13700
13701 scan_filter->BSSIDs.numOfBSSIDs = 1;
13702 qdf_mem_copy(scan_filter->BSSIDs.bssid[0].bytes,
13703 bssid, sizeof(struct qdf_mac_addr));
13704
13705 status = csr_scan_get_result(mac_ctx, scan_filter, &result_handle);
13706 if (QDF_STATUS_SUCCESS != status) {
Jianmin Zhucc6b3d02019-03-07 14:19:34 +080013707 sme_debug("parse_scan_result failed");
Hanumanth Reddy Pothula90051782017-05-04 22:14:43 +053013708 goto free_scan_flter;
13709 }
13710
13711 bss_list = (struct scan_result_list *)result_handle;
13712 bss_descp = csr_get_fst_bssdescr_ptr(bss_list);
13713 if (!bss_descp) {
13714 sme_err("unable to fetch bss descriptor");
13715 status = QDF_STATUS_E_FAULT;
13716 goto free_scan_flter;
13717 }
13718
13719 sme_debug("snr: %d, rssi: %d, raw_rssi: %d",
13720 bss_descp->sinr, bss_descp->rssi, bss_descp->rssi_raw);
13721
13722 if (rssi)
13723 *rssi = bss_descp->rssi;
13724 if (snr)
13725 *snr = bss_descp->sinr;
13726
13727free_scan_flter:
13728 /* free scan filter and exit */
13729 if (scan_filter) {
13730 csr_free_scan_filter(mac_ctx, scan_filter);
13731 qdf_mem_free(scan_filter);
13732 }
13733
13734 if (result_handle)
13735 csr_scan_result_purge(mac_ctx, result_handle);
13736
13737 return status;
13738}
13739
Jeff Johnsonc7309062018-11-09 20:59:42 -080013740QDF_STATUS sme_get_beacon_frm(mac_handle_t mac_handle,
Jeff Johnson1f2dabc2018-11-07 15:33:01 -080013741 struct csr_roam_profile *profile,
Jeff Johnson66ee8a92018-03-17 15:24:26 -070013742 const tSirMacAddr bssid,
13743 uint8_t **frame_buf, uint32_t *frame_len,
13744 int *channel)
Naveen Rawat664a7cb2017-01-19 17:58:14 -080013745{
13746 QDF_STATUS status = QDF_STATUS_SUCCESS;
Naveen Rawat56b4de82017-02-17 14:38:49 -080013747 tScanResultHandle result_handle = NULL;
Naveen Rawat664a7cb2017-01-19 17:58:14 -080013748 tCsrScanResultFilter *scan_filter;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080013749 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Pragaspathi Thilagaraj1112c962019-05-23 23:45:38 +053013750 struct bss_description *bss_descp;
Yeshwanth Sriram Guntuka36c09902017-09-26 11:34:26 +053013751 struct scan_result_list *bss_list;
Naveen Rawat664a7cb2017-01-19 17:58:14 -080013752 uint32_t ie_len;
13753
13754 scan_filter = qdf_mem_malloc(sizeof(tCsrScanResultFilter));
Arif Hussain0ef77082018-10-10 16:42:53 -070013755 if (!scan_filter) {
Naveen Rawat664a7cb2017-01-19 17:58:14 -080013756 status = QDF_STATUS_E_NOMEM;
13757 goto free_scan_flter;
13758 }
13759 status = csr_roam_prepare_filter_from_profile(mac_ctx,
13760 profile, scan_filter);
13761 if (QDF_IS_STATUS_ERROR(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070013762 sme_err("prepare_filter failed");
Selvaraj, Sridhar64b0a9c2017-05-11 16:50:15 +053013763 status = QDF_STATUS_E_FAULT;
Naveen Rawat664a7cb2017-01-19 17:58:14 -080013764 goto free_scan_flter;
13765 }
13766
13767 /* update filter to get scan result with just target BSSID */
Jeff Johnson038efe72019-03-18 13:39:31 -070013768 if (!scan_filter->BSSIDs.bssid) {
Naveen Rawat664a7cb2017-01-19 17:58:14 -080013769 scan_filter->BSSIDs.bssid =
13770 qdf_mem_malloc(sizeof(struct qdf_mac_addr));
Arif Hussain0ef77082018-10-10 16:42:53 -070013771 if (!scan_filter->BSSIDs.bssid) {
Naveen Rawat664a7cb2017-01-19 17:58:14 -080013772 status = QDF_STATUS_E_NOMEM;
13773 goto free_scan_flter;
13774 }
13775 }
13776 scan_filter->BSSIDs.numOfBSSIDs = 1;
13777 qdf_mem_copy(scan_filter->BSSIDs.bssid[0].bytes,
13778 bssid, sizeof(struct qdf_mac_addr));
13779
13780 status = csr_scan_get_result(mac_ctx, scan_filter, &result_handle);
13781 if (QDF_STATUS_SUCCESS != status) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070013782 sme_err("parse_scan_result failed");
Selvaraj, Sridhar64b0a9c2017-05-11 16:50:15 +053013783 status = QDF_STATUS_E_FAULT;
Naveen Rawat664a7cb2017-01-19 17:58:14 -080013784 goto free_scan_flter;
13785 }
13786
Yeshwanth Sriram Guntuka36c09902017-09-26 11:34:26 +053013787 bss_list = (struct scan_result_list *)result_handle;
Naveen Rawat664a7cb2017-01-19 17:58:14 -080013788 bss_descp = csr_get_fst_bssdescr_ptr(bss_list);
Naveen Rawatae0aaa82017-02-17 14:41:19 -080013789 if (!bss_descp) {
Srinivas Girigowda2c263352017-03-17 17:49:53 -070013790 sme_err("unable to fetch bss descriptor");
Naveen Rawatae0aaa82017-02-17 14:41:19 -080013791 status = QDF_STATUS_E_FAULT;
13792 goto free_scan_flter;
13793 }
Naveen Rawat664a7cb2017-01-19 17:58:14 -080013794
Naveen Rawat81f058c2017-06-02 16:02:39 -070013795 /**
13796 * Length of BSS descriptor is without length of
13797 * length itself and length of pointer that holds ieFields.
13798 *
Pragaspathi Thilagaraj1112c962019-05-23 23:45:38 +053013799 * struct bss_description
Naveen Rawat81f058c2017-06-02 16:02:39 -070013800 * +--------+---------------------------------+---------------+
13801 * | length | other fields | pointer to IEs|
13802 * +--------+---------------------------------+---------------+
13803 * ^
13804 * ieFields
Naveen Rawat664a7cb2017-01-19 17:58:14 -080013805 */
Naveen Rawat81f058c2017-06-02 16:02:39 -070013806 ie_len = bss_descp->length + sizeof(bss_descp->length)
Pragaspathi Thilagaraj1112c962019-05-23 23:45:38 +053013807 - (uint16_t)(offsetof(struct bss_description, ieFields[0]));
Selvaraj, Sridhar64b0a9c2017-05-11 16:50:15 +053013808 sme_debug("found bss_descriptor ie_len: %d channel %d",
13809 ie_len, bss_descp->channelId);
Naveen Rawat664a7cb2017-01-19 17:58:14 -080013810
13811 /* include mac header and fixed params along with IEs in frame */
13812 *frame_len = SIR_MAC_HDR_LEN_3A + SIR_MAC_B_PR_SSID_OFFSET + ie_len;
13813 *frame_buf = qdf_mem_malloc(*frame_len);
Arif Hussain0ef77082018-10-10 16:42:53 -070013814 if (!*frame_buf) {
Naveen Rawat664a7cb2017-01-19 17:58:14 -080013815 status = QDF_STATUS_E_NOMEM;
13816 goto free_scan_flter;
13817 }
13818
13819 sme_prepare_beacon_from_bss_descp(*frame_buf, bss_descp, bssid, ie_len);
13820
Selvaraj, Sridhar64b0a9c2017-05-11 16:50:15 +053013821 if (!*channel)
13822 *channel = bss_descp->channelId;
Naveen Rawat664a7cb2017-01-19 17:58:14 -080013823free_scan_flter:
13824 /* free scan filter and exit */
13825 if (scan_filter) {
13826 csr_free_scan_filter(mac_ctx, scan_filter);
13827 qdf_mem_free(scan_filter);
13828 }
Arif Hussainfdb25e22017-02-05 17:38:16 -080013829 if (result_handle)
13830 csr_scan_result_purge(mac_ctx, result_handle);
Naveen Rawat664a7cb2017-01-19 17:58:14 -080013831
Naveen Rawatae0aaa82017-02-17 14:41:19 -080013832 return status;
Naveen Rawat664a7cb2017-01-19 17:58:14 -080013833}
13834
Paul Zhangc3fc0a82018-01-09 16:38:20 +080013835#ifdef WLAN_FEATURE_ROAM_OFFLOAD
gaurank kathpalia7ef72182019-05-29 19:41:25 +053013836QDF_STATUS sme_roam_invoke_nud_fail(mac_handle_t mac_handle, uint8_t vdev_id)
Naveen Rawat4195c5e2017-05-22 17:07:45 -070013837{
gaurank kathpalia7ef72182019-05-29 19:41:25 +053013838 struct wma_roam_invoke_cmd *roam_invoke_params;
Naveen Rawat4195c5e2017-05-22 17:07:45 -070013839 struct scheduler_msg msg = {0};
gaurank kathpalia7ef72182019-05-29 19:41:25 +053013840 QDF_STATUS status;
13841 struct wlan_objmgr_vdev *vdev;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080013842 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
gaurank kathpalia7ef72182019-05-29 19:41:25 +053013843 struct mlme_roam_after_data_stall *vdev_roam_params;
Abhinav Kumareab25932018-07-13 11:48:43 +053013844 struct csr_roam_session *session;
13845 struct csr_roam_profile *roam_profile;
Naveen Rawat4195c5e2017-05-22 17:07:45 -070013846
gaurank kathpalia7ef72182019-05-29 19:41:25 +053013847 if (!mac_ctx->mlme_cfg->gen.data_stall_recovery_fw_support) {
13848 sme_debug("FW does not support data stall recovery, aborting roam invoke");
13849 return QDF_STATUS_E_NOSUPPORT;
13850 }
13851
Abhinav Kumareab25932018-07-13 11:48:43 +053013852 session = CSR_GET_SESSION(mac_ctx, vdev_id);
13853 if (!session || !session->pCurRoamProfile) {
13854 sme_err("session %d not found", vdev_id);
13855 return QDF_STATUS_E_FAILURE;
13856 }
13857
13858 roam_profile = session->pCurRoamProfile;
Abhinav Kumarcd737de2019-03-05 17:01:24 +053013859 if (roam_profile->driver_disabled_roaming) {
13860 sme_debug("roaming status in driver %d",
Abhinav Kumareab25932018-07-13 11:48:43 +053013861 roam_profile->driver_disabled_roaming);
13862 return QDF_STATUS_E_FAILURE;
13863 }
Arif Hussain0ef77082018-10-10 16:42:53 -070013864
gaurank kathpalia7ef72182019-05-29 19:41:25 +053013865 vdev = wlan_objmgr_get_vdev_by_id_from_psoc(mac_ctx->psoc, vdev_id,
13866 WLAN_LEGACY_SME_ID);
13867
13868 if (!vdev) {
13869 sme_err("vdev is NULL, aborting roam invoke");
13870 return QDF_STATUS_E_NULL_VALUE;
13871 }
13872
13873 vdev_roam_params = mlme_get_roam_invoke_params(vdev);
13874
13875 if (!vdev_roam_params) {
13876 sme_err("Invalid vdev roam params, aborting roam invoke");
13877 wlan_objmgr_vdev_release_ref(vdev, WLAN_LEGACY_SME_ID);
13878 return QDF_STATUS_E_NULL_VALUE;
13879 }
13880
13881 if (vdev_roam_params->roam_invoke_in_progress) {
13882 sme_debug("Roaming in progress set by source = %d, aborting this roam invoke",
13883 vdev_roam_params->source);
13884 wlan_objmgr_vdev_release_ref(vdev, WLAN_LEGACY_SME_ID);
13885 return QDF_STATUS_E_BUSY;
13886 }
13887
13888 roam_invoke_params = qdf_mem_malloc(sizeof(*roam_invoke_params));
13889 if (!roam_invoke_params) {
13890 wlan_objmgr_vdev_release_ref(vdev, WLAN_LEGACY_SME_ID);
13891 return QDF_STATUS_E_NOMEM;
13892 }
13893 roam_invoke_params->vdev_id = vdev_id;
13894 /* Set forced roaming as true so that FW scans all ch, and connect */
13895 roam_invoke_params->forced_roaming = true;
13896
13897 msg.type = eWNI_SME_ROAM_INVOKE;
13898 msg.reserved = 0;
13899 msg.bodyptr = roam_invoke_params;
13900 status = scheduler_post_message(QDF_MODULE_ID_SME,
13901 QDF_MODULE_ID_PE,
13902 QDF_MODULE_ID_PE, &msg);
13903 if (QDF_IS_STATUS_ERROR(status)) {
13904 sme_err("Not able to post ROAM_INVOKE_CMD message to PE");
13905 qdf_mem_free(roam_invoke_params);
13906 } else {
13907 vdev_roam_params->roam_invoke_in_progress = true;
13908 vdev_roam_params->source = CONNECTION_MGR_INITIATED;
13909 sme_debug("Trigger roaming for vdev id %d source = CONNECTION_MGR_INITIATED",
13910 session->sessionId);
13911 }
13912 wlan_objmgr_vdev_release_ref(vdev, WLAN_LEGACY_SME_ID);
13913
13914 return status;
13915}
13916
13917QDF_STATUS sme_fast_reassoc(mac_handle_t mac_handle,
13918 struct csr_roam_profile *profile,
13919 const tSirMacAddr bssid, int channel,
13920 uint8_t vdev_id, const tSirMacAddr connected_bssid)
13921{
13922 QDF_STATUS status;
13923 struct wma_roam_invoke_cmd *fastreassoc;
13924 struct scheduler_msg msg = {0};
13925 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
13926 struct csr_roam_session *session;
13927 struct csr_roam_profile *roam_profile;
13928 struct wlan_objmgr_vdev *vdev;
13929 struct mlme_roam_after_data_stall *vdev_roam_params;
13930
13931 session = CSR_GET_SESSION(mac_ctx, vdev_id);
13932 if (!session || !session->pCurRoamProfile) {
13933 sme_err("session %d not found", vdev_id);
13934 return QDF_STATUS_E_FAILURE;
13935 }
13936
13937 roam_profile = session->pCurRoamProfile;
13938 if (roam_profile->driver_disabled_roaming) {
13939 sme_debug("roaming status in driver %d",
13940 roam_profile->driver_disabled_roaming);
13941 return QDF_STATUS_E_FAILURE;
13942 }
13943
13944 vdev = wlan_objmgr_get_vdev_by_id_from_psoc(mac_ctx->psoc, vdev_id,
13945 WLAN_LEGACY_SME_ID);
13946
13947 if (!vdev) {
13948 sme_err("vdev is NULL, aborting roam invoke");
13949 return QDF_STATUS_E_NULL_VALUE;
13950 }
13951
13952 vdev_roam_params = mlme_get_roam_invoke_params(vdev);
13953
13954 if (!vdev_roam_params) {
13955 sme_err("Invalid vdev roam params, aborting roam invoke");
13956 wlan_objmgr_vdev_release_ref(vdev, WLAN_LEGACY_SME_ID);
13957 return QDF_STATUS_E_NULL_VALUE;
13958 }
13959
13960 if (vdev_roam_params->roam_invoke_in_progress) {
13961 sme_debug("Roaming in progress set by source = %d, aborting this roam invoke",
13962 vdev_roam_params->source);
13963 wlan_objmgr_vdev_release_ref(vdev, WLAN_LEGACY_SME_ID);
13964 return QDF_STATUS_E_FAILURE;
13965 }
13966
13967 fastreassoc = qdf_mem_malloc(sizeof(*fastreassoc));
13968 if (!fastreassoc) {
13969 wlan_objmgr_vdev_release_ref(vdev, WLAN_LEGACY_SME_ID);
13970 return QDF_STATUS_E_NOMEM;
13971 }
Krunal Soni332f4af2017-06-01 14:36:17 -070013972 /* if both are same then set the flag */
13973 if (!qdf_mem_cmp(connected_bssid, bssid, ETH_ALEN)) {
13974 fastreassoc->is_same_bssid = true;
13975 sme_debug("bssid same, bssid[%pM]", bssid);
13976 }
Naveen Rawat4195c5e2017-05-22 17:07:45 -070013977 fastreassoc->vdev_id = vdev_id;
Naveen Rawat4195c5e2017-05-22 17:07:45 -070013978 fastreassoc->bssid[0] = bssid[0];
13979 fastreassoc->bssid[1] = bssid[1];
13980 fastreassoc->bssid[2] = bssid[2];
13981 fastreassoc->bssid[3] = bssid[3];
13982 fastreassoc->bssid[4] = bssid[4];
13983 fastreassoc->bssid[5] = bssid[5];
13984
Jeff Johnsonc7309062018-11-09 20:59:42 -080013985 status = sme_get_beacon_frm(mac_handle, profile, bssid,
Naveen Rawat4195c5e2017-05-22 17:07:45 -070013986 &fastreassoc->frame_buf,
Selvaraj, Sridhar64b0a9c2017-05-11 16:50:15 +053013987 &fastreassoc->frame_len,
13988 &channel);
Naveen Rawat4195c5e2017-05-22 17:07:45 -070013989
Selvaraj, Sridhar64b0a9c2017-05-11 16:50:15 +053013990 if (!channel) {
13991 sme_err("channel retrieval from BSS desc fails!");
gaurank kathpalia7ef72182019-05-29 19:41:25 +053013992 qdf_mem_free(fastreassoc->frame_buf);
13993 fastreassoc->frame_buf = NULL;
13994 fastreassoc->frame_len = 0;
Selvaraj, Sridhar64b0a9c2017-05-11 16:50:15 +053013995 qdf_mem_free(fastreassoc);
gaurank kathpalia7ef72182019-05-29 19:41:25 +053013996 wlan_objmgr_vdev_release_ref(vdev, WLAN_LEGACY_SME_ID);
Selvaraj, Sridhar64b0a9c2017-05-11 16:50:15 +053013997 return QDF_STATUS_E_FAULT;
13998 }
13999
14000 fastreassoc->channel = channel;
Naveen Rawat4195c5e2017-05-22 17:07:45 -070014001 if (QDF_STATUS_SUCCESS != status) {
14002 sme_warn("sme_get_beacon_frm failed");
gaurank kathpalia7ef72182019-05-29 19:41:25 +053014003 qdf_mem_free(fastreassoc->frame_buf);
Naveen Rawat4195c5e2017-05-22 17:07:45 -070014004 fastreassoc->frame_buf = NULL;
14005 fastreassoc->frame_len = 0;
14006 }
14007
Padma, Santhosh Kumar5bc0c242017-11-29 15:44:27 +053014008 if (csr_is_auth_type_ese(mac_ctx->roam.roamSession[vdev_id].
14009 connectedProfile.AuthType)) {
14010 sme_debug("Beacon is not required for ESE");
14011 if (fastreassoc->frame_len) {
14012 qdf_mem_free(fastreassoc->frame_buf);
14013 fastreassoc->frame_buf = NULL;
14014 fastreassoc->frame_len = 0;
14015 }
14016 }
14017
Paul Zhang624f88d2018-11-07 15:29:45 +080014018 msg.type = eWNI_SME_ROAM_INVOKE;
Naveen Rawat4195c5e2017-05-22 17:07:45 -070014019 msg.reserved = 0;
14020 msg.bodyptr = fastreassoc;
gaurank kathpalia36b0c582018-08-28 17:45:43 +053014021 status = scheduler_post_message(QDF_MODULE_ID_SME,
Paul Zhang624f88d2018-11-07 15:29:45 +080014022 QDF_MODULE_ID_PE,
14023 QDF_MODULE_ID_PE, &msg);
gaurank kathpalia7ef72182019-05-29 19:41:25 +053014024 if (QDF_IS_STATUS_ERROR(status)) {
Paul Zhang624f88d2018-11-07 15:29:45 +080014025 sme_err("Not able to post ROAM_INVOKE_CMD message to PE");
gaurank kathpalia7ef72182019-05-29 19:41:25 +053014026 qdf_mem_free(fastreassoc->frame_buf);
14027 fastreassoc->frame_buf = NULL;
14028 fastreassoc->frame_len = 0;
Naveen Rawat4195c5e2017-05-22 17:07:45 -070014029 qdf_mem_free(fastreassoc);
gaurank kathpalia7ef72182019-05-29 19:41:25 +053014030 } else {
14031 vdev_roam_params->roam_invoke_in_progress = true;
14032 vdev_roam_params->source = USERSPACE_INITIATED;
14033 sme_debug("Trigger roaming for vdev id %d source = USERSPACE_INITIATED",
14034 session->sessionId);
Naveen Rawat4195c5e2017-05-22 17:07:45 -070014035 }
14036
gaurank kathpalia7ef72182019-05-29 19:41:25 +053014037 wlan_objmgr_vdev_release_ref(vdev, WLAN_LEGACY_SME_ID);
Naveen Rawat4195c5e2017-05-22 17:07:45 -070014038 return status;
14039}
Paul Zhangc3fc0a82018-01-09 16:38:20 +080014040#endif
Naveen Rawat4195c5e2017-05-22 17:07:45 -070014041
Jeff Johnsonc7309062018-11-09 20:59:42 -080014042QDF_STATUS sme_set_del_pmkid_cache(mac_handle_t mac_handle, uint8_t session_id,
Vignesh Viswanathanc6d1e1c2017-09-18 12:32:49 +053014043 tPmkidCacheInfo *pmk_cache_info,
14044 bool is_add)
14045{
14046 struct wmi_unified_pmk_cache *pmk_cache;
14047 struct scheduler_msg msg;
14048
14049 pmk_cache = qdf_mem_malloc(sizeof(*pmk_cache));
Arif Hussain0ef77082018-10-10 16:42:53 -070014050 if (!pmk_cache)
Vignesh Viswanathanc6d1e1c2017-09-18 12:32:49 +053014051 return QDF_STATUS_E_NOMEM;
Vignesh Viswanathanc6d1e1c2017-09-18 12:32:49 +053014052
hangtian127c9532019-01-12 13:29:07 +080014053 qdf_mem_zero(pmk_cache, sizeof(*pmk_cache));
Vignesh Viswanathane8a26b22017-10-11 20:38:47 +053014054
Jeff Johnson622aad62018-12-07 15:05:37 -080014055 pmk_cache->vdev_id = session_id;
Vignesh Viswanathanc6d1e1c2017-09-18 12:32:49 +053014056
Vignesh Viswanathane8a26b22017-10-11 20:38:47 +053014057 if (!pmk_cache_info)
14058 goto send_flush_cmd;
14059
Vignesh Viswanathanc6d1e1c2017-09-18 12:32:49 +053014060 if (!pmk_cache_info->ssid_len) {
14061 pmk_cache->cat_flag = WMI_PMK_CACHE_CAT_FLAG_BSSID;
14062 WMI_CHAR_ARRAY_TO_MAC_ADDR(pmk_cache_info->BSSID.bytes,
14063 &pmk_cache->bssid);
14064 } else {
14065 pmk_cache->cat_flag = WMI_PMK_CACHE_CAT_FLAG_SSID_CACHE_ID;
14066 pmk_cache->ssid.length = pmk_cache_info->ssid_len;
14067 qdf_mem_copy(pmk_cache->ssid.mac_ssid,
14068 pmk_cache_info->ssid,
14069 pmk_cache->ssid.length);
14070 }
14071 pmk_cache->cache_id = (uint32_t) (pmk_cache_info->cache_id[0] << 8 |
14072 pmk_cache_info->cache_id[1]);
14073
14074 if (is_add)
14075 pmk_cache->action_flag = WMI_PMK_CACHE_ACTION_FLAG_ADD_ENTRY;
14076 else
14077 pmk_cache->action_flag = WMI_PMK_CACHE_ACTION_FLAG_DEL_ENTRY;
14078
Srinivas Girigowdaff8f5ef2019-03-26 17:20:55 -070014079 pmk_cache->pmkid_len = PMKID_LEN;
Vignesh Viswanathanc6d1e1c2017-09-18 12:32:49 +053014080 qdf_mem_copy(pmk_cache->pmkid, pmk_cache_info->PMKID,
Srinivas Girigowdaff8f5ef2019-03-26 17:20:55 -070014081 PMKID_LEN);
Vignesh Viswanathanc6d1e1c2017-09-18 12:32:49 +053014082
14083 pmk_cache->pmk_len = pmk_cache_info->pmk_len;
14084 qdf_mem_copy(pmk_cache->pmk, pmk_cache_info->pmk,
14085 pmk_cache->pmk_len);
14086
Vignesh Viswanathane8a26b22017-10-11 20:38:47 +053014087send_flush_cmd:
Vignesh Viswanathanc6d1e1c2017-09-18 12:32:49 +053014088 msg.type = SIR_HAL_SET_DEL_PMKID_CACHE;
14089 msg.reserved = 0;
14090 msg.bodyptr = pmk_cache;
14091 if (QDF_STATUS_SUCCESS !=
gaurank kathpalia36b0c582018-08-28 17:45:43 +053014092 scheduler_post_message(QDF_MODULE_ID_SME,
14093 QDF_MODULE_ID_WMA,
14094 QDF_MODULE_ID_WMA, &msg)) {
Vignesh Viswanathanc6d1e1c2017-09-18 12:32:49 +053014095 sme_err("Not able to post message to WDA");
Ashish Kumar Dhanotiya36510832019-02-20 22:13:25 +053014096 if (pmk_cache) {
14097 qdf_mem_zero(pmk_cache, sizeof(*pmk_cache));
14098 qdf_mem_free(pmk_cache);
14099 }
Vignesh Viswanathanc6d1e1c2017-09-18 12:32:49 +053014100 return QDF_STATUS_E_FAILURE;
14101 }
14102
14103 return QDF_STATUS_SUCCESS;
14104}
14105
Anurag Chouhan3920c0f2017-09-11 17:10:56 +053014106/* ARP DEBUG STATS */
14107
14108/**
14109 * sme_set_nud_debug_stats() - sme api to set nud debug stats
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -080014110 * @mac_handle: Opaque handle to the global MAC context
Anurag Chouhan3920c0f2017-09-11 17:10:56 +053014111 * @set_stats_param: pointer to set stats param
14112 *
14113 * Return: Return QDF_STATUS.
14114 */
Jeff Johnsonc7309062018-11-09 20:59:42 -080014115QDF_STATUS sme_set_nud_debug_stats(mac_handle_t mac_handle,
Anurag Chouhan3920c0f2017-09-11 17:10:56 +053014116 struct set_arp_stats_params
14117 *set_stats_param)
14118{
14119 struct set_arp_stats_params *arp_set_param;
14120 struct scheduler_msg msg;
14121
14122 arp_set_param = qdf_mem_malloc(sizeof(*arp_set_param));
Arif Hussain0ef77082018-10-10 16:42:53 -070014123 if (!arp_set_param)
Anurag Chouhan3920c0f2017-09-11 17:10:56 +053014124 return QDF_STATUS_E_NOMEM;
Anurag Chouhan3920c0f2017-09-11 17:10:56 +053014125
14126 qdf_mem_copy(arp_set_param, set_stats_param, sizeof(*arp_set_param));
14127
14128 msg.type = WMA_SET_ARP_STATS_REQ;
14129 msg.reserved = 0;
14130 msg.bodyptr = arp_set_param;
14131
14132 if (QDF_STATUS_SUCCESS !=
gaurank kathpalia36b0c582018-08-28 17:45:43 +053014133 scheduler_post_message(QDF_MODULE_ID_SME,
14134 QDF_MODULE_ID_WMA,
14135 QDF_MODULE_ID_WMA, &msg)) {
Anurag Chouhan3920c0f2017-09-11 17:10:56 +053014136 sme_err("Not able to post message to WDA");
14137 qdf_mem_free(arp_set_param);
14138 return QDF_STATUS_E_FAILURE;
14139 }
14140
14141 return QDF_STATUS_SUCCESS;
14142}
14143
14144/**
14145 * sme_get_nud_debug_stats() - sme api to get nud debug stats
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -080014146 * @mac_handle: Opaque handle to the global MAC context
Anurag Chouhan3920c0f2017-09-11 17:10:56 +053014147 * @get_stats_param: pointer to set stats param
14148 *
14149 * Return: Return QDF_STATUS.
14150 */
Jeff Johnsonc7309062018-11-09 20:59:42 -080014151QDF_STATUS sme_get_nud_debug_stats(mac_handle_t mac_handle,
Anurag Chouhan3920c0f2017-09-11 17:10:56 +053014152 struct get_arp_stats_params
14153 *get_stats_param)
14154{
14155 struct get_arp_stats_params *arp_get_param;
14156 struct scheduler_msg msg;
14157
14158 arp_get_param = qdf_mem_malloc(sizeof(*arp_get_param));
Arif Hussain0ef77082018-10-10 16:42:53 -070014159 if (!arp_get_param)
Anurag Chouhan3920c0f2017-09-11 17:10:56 +053014160 return QDF_STATUS_E_NOMEM;
Anurag Chouhan3920c0f2017-09-11 17:10:56 +053014161
14162 qdf_mem_copy(arp_get_param, get_stats_param, sizeof(*arp_get_param));
14163
14164 msg.type = WMA_GET_ARP_STATS_REQ;
14165 msg.reserved = 0;
14166 msg.bodyptr = arp_get_param;
14167
14168 if (QDF_STATUS_SUCCESS !=
gaurank kathpalia36b0c582018-08-28 17:45:43 +053014169 scheduler_post_message(QDF_MODULE_ID_SME,
14170 QDF_MODULE_ID_WMA,
14171 QDF_MODULE_ID_WMA, &msg)) {
Anurag Chouhan3920c0f2017-09-11 17:10:56 +053014172 sme_err("Not able to post message to WDA");
14173 qdf_mem_free(arp_get_param);
14174 return QDF_STATUS_E_FAILURE;
14175 }
14176
14177 return QDF_STATUS_SUCCESS;
14178}
14179
Krishna Kumaar Natarajanf1581df2017-02-21 13:42:08 -080014180QDF_STATUS sme_set_peer_param(uint8_t *peer_addr, uint32_t param_id,
14181 uint32_t param_value, uint32_t vdev_id)
14182{
14183 void *wma_handle;
14184
14185 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
14186 if (!wma_handle) {
Srinivas Girigowda2c263352017-03-17 17:49:53 -070014187 sme_err("wma handle is NULL");
Krishna Kumaar Natarajanf1581df2017-02-21 13:42:08 -080014188 return QDF_STATUS_E_FAILURE;
14189 }
14190
14191 return wma_set_peer_param(wma_handle, peer_addr, param_id,
14192 param_value, vdev_id);
14193}
Tushnim Bhattacharyya9e81b4c2017-02-15 17:11:14 -080014194
Jeff Johnsonb460dd72018-11-08 10:26:51 -080014195QDF_STATUS sme_register_set_connection_info_cb(mac_handle_t mac_handle,
Tushnim Bhattacharyya0c4ad2d2017-03-09 15:59:03 -080014196 bool (*set_connection_info_cb)(bool),
14197 bool (*get_connection_info_cb)(uint8_t *session_id,
14198 enum scan_reject_states *reason))
Tushnim Bhattacharyya9e81b4c2017-02-15 17:11:14 -080014199{
14200 QDF_STATUS status = QDF_STATUS_SUCCESS;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080014201 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Tushnim Bhattacharyya9e81b4c2017-02-15 17:11:14 -080014202
Jeff Johnson01f2c232018-11-21 19:17:44 -080014203 status = sme_acquire_global_lock(&mac->sme);
Tushnim Bhattacharyya9e81b4c2017-02-15 17:11:14 -080014204 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson01f2c232018-11-21 19:17:44 -080014205 mac->sme.set_connection_info_cb = set_connection_info_cb;
14206 mac->sme.get_connection_info_cb = get_connection_info_cb;
14207 sme_release_global_lock(&mac->sme);
Tushnim Bhattacharyya9e81b4c2017-02-15 17:11:14 -080014208 }
14209 return status;
14210}
Sreelakshmi Konamki88a2a412017-04-14 15:11:55 +053014211
Jeff Johnson43975142018-07-04 15:33:47 -070014212QDF_STATUS sme_rso_cmd_status_cb(mac_handle_t mac_handle,
14213 rso_cmd_status_cb cb)
Sreelakshmi Konamki88a2a412017-04-14 15:11:55 +053014214{
14215 QDF_STATUS status = QDF_STATUS_SUCCESS;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080014216 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Sreelakshmi Konamki88a2a412017-04-14 15:11:55 +053014217
14218 mac->sme.rso_cmd_status_cb = cb;
Srinivas Girigowda2c263352017-03-17 17:49:53 -070014219 sme_debug("Registered RSO command status callback");
Sreelakshmi Konamki88a2a412017-04-14 15:11:55 +053014220 return status;
14221}
Kiran Kumar Lokerea3de2262017-04-12 12:15:04 -070014222
Jeff Johnsonc7309062018-11-09 20:59:42 -080014223QDF_STATUS sme_set_dbs_scan_selection_config(mac_handle_t mac_handle,
Nitesh Shahf9a09ff2017-05-22 15:46:25 +053014224 struct wmi_dbs_scan_sel_params *params)
14225{
14226 struct scheduler_msg message = {0};
14227 QDF_STATUS status;
14228 struct wmi_dbs_scan_sel_params *dbs_scan_params;
14229 uint32_t i;
14230
14231 if (0 == params->num_clients) {
14232 sme_err("Num of clients is 0");
14233 return QDF_STATUS_E_FAILURE;
14234 }
14235
14236 dbs_scan_params = qdf_mem_malloc(sizeof(*dbs_scan_params));
Arif Hussain0ef77082018-10-10 16:42:53 -070014237 if (!dbs_scan_params)
Nitesh Shahf9a09ff2017-05-22 15:46:25 +053014238 return QDF_STATUS_E_NOMEM;
Nitesh Shahf9a09ff2017-05-22 15:46:25 +053014239
14240 dbs_scan_params->num_clients = params->num_clients;
14241 dbs_scan_params->pdev_id = params->pdev_id;
14242 for (i = 0; i < params->num_clients; i++) {
14243 dbs_scan_params->module_id[i] = params->module_id[i];
14244 dbs_scan_params->num_dbs_scans[i] = params->num_dbs_scans[i];
14245 dbs_scan_params->num_non_dbs_scans[i] =
14246 params->num_non_dbs_scans[i];
14247 }
14248 message.type = WMA_SET_DBS_SCAN_SEL_CONF_PARAMS;
14249 message.bodyptr = dbs_scan_params;
gaurank kathpalia36b0c582018-08-28 17:45:43 +053014250 status = scheduler_post_message(QDF_MODULE_ID_SME,
14251 QDF_MODULE_ID_WMA,
14252 QDF_MODULE_ID_WMA, &message);
Nitesh Shahf9a09ff2017-05-22 15:46:25 +053014253 if (!QDF_IS_STATUS_SUCCESS(status)) {
14254 sme_err("Not able to post msg to WMA!");
14255 qdf_mem_free(dbs_scan_params);
14256 }
14257
14258 return status;
14259}
14260
Jeff Johnsonc7309062018-11-09 20:59:42 -080014261QDF_STATUS sme_get_rcpi(mac_handle_t mac_handle, struct sme_rcpi_req *rcpi)
Rajeev Kumar Sirasanagandla996e5292016-11-22 21:20:33 +053014262{
14263 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080014264 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Naveen Rawatb7be1ed2017-11-16 16:52:08 -080014265 struct scheduler_msg msg = {0};
Rajeev Kumar Sirasanagandla996e5292016-11-22 21:20:33 +053014266 struct sme_rcpi_req *rcpi_req;
14267
14268 rcpi_req = qdf_mem_malloc(sizeof(*rcpi_req));
Arif Hussain0ef77082018-10-10 16:42:53 -070014269 if (!rcpi_req)
Rajeev Kumar Sirasanagandla996e5292016-11-22 21:20:33 +053014270 return QDF_STATUS_E_NOMEM;
Arif Hussain0ef77082018-10-10 16:42:53 -070014271
Rajeev Kumar Sirasanagandla996e5292016-11-22 21:20:33 +053014272 qdf_mem_copy(rcpi_req, rcpi, sizeof(*rcpi_req));
14273
Jeff Johnson01f2c232018-11-21 19:17:44 -080014274 status = sme_acquire_global_lock(&mac->sme);
Rajeev Kumar Sirasanagandla996e5292016-11-22 21:20:33 +053014275 if (QDF_IS_STATUS_SUCCESS(status)) {
14276 msg.bodyptr = rcpi_req;
14277 msg.type = WMA_GET_RCPI_REQ;
gaurank kathpalia36b0c582018-08-28 17:45:43 +053014278 status = scheduler_post_message(QDF_MODULE_ID_SME,
14279 QDF_MODULE_ID_WMA,
14280 QDF_MODULE_ID_WMA, &msg);
Jeff Johnson01f2c232018-11-21 19:17:44 -080014281 sme_release_global_lock(&mac->sme);
Rajeev Kumar Sirasanagandla996e5292016-11-22 21:20:33 +053014282 if (!QDF_IS_STATUS_SUCCESS(status)) {
14283 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
14284 FL("post get rcpi req failed"));
14285 status = QDF_STATUS_E_FAILURE;
14286 qdf_mem_free(rcpi_req);
14287 }
14288 } else {
Rajeev Kumar Sirasanagandla996e5292016-11-22 21:20:33 +053014289 qdf_mem_free(rcpi_req);
14290 }
14291
14292 return status;
14293}
14294
Jeff Johnsonc7309062018-11-09 20:59:42 -080014295void sme_store_pdev(mac_handle_t mac_handle, struct wlan_objmgr_pdev *pdev)
Kiran Kumar Lokerea3de2262017-04-12 12:15:04 -070014296{
Jeff Johnson0a8786a2018-12-02 10:49:01 -080014297 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Kiran Kumar Lokerea3de2262017-04-12 12:15:04 -070014298 void *wma_handle;
14299 QDF_STATUS status;
14300
Kiran Kumar Lokeref089a3a2017-04-20 21:39:26 -070014301 status = wlan_objmgr_pdev_try_get_ref(pdev, WLAN_LEGACY_MAC_ID);
Kiran Kumar Lokerea3de2262017-04-12 12:15:04 -070014302 if (QDF_STATUS_SUCCESS != status) {
14303 mac_ctx->pdev = NULL;
14304 return;
14305 }
14306 mac_ctx->pdev = pdev;
14307 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
14308 if (!wma_handle) {
14309 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Kiran Kumar Lokeref089a3a2017-04-20 21:39:26 -070014310 FL("wma handle is NULL"));
Kiran Kumar Lokerea3de2262017-04-12 12:15:04 -070014311 return;
14312 }
14313 wma_store_pdev(wma_handle, pdev);
Kiran Kumar Lokere4ce40482018-08-30 16:31:00 -070014314 pdev->pdev_nif.pdev_fw_caps |= SUPPORTED_CRYPTO_CAPS;
Kiran Kumar Lokerea3de2262017-04-12 12:15:04 -070014315}
14316
Jeff Johnsonc7309062018-11-09 20:59:42 -080014317QDF_STATUS sme_congestion_register_callback(mac_handle_t mac_handle,
Jeff Johnsonf6182e42018-07-03 14:46:17 -070014318 congestion_cb congestion_cb)
Padma, Santhosh Kumar16dacfb2017-03-21 19:05:40 +053014319{
14320 QDF_STATUS status;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080014321 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Padma, Santhosh Kumar16dacfb2017-03-21 19:05:40 +053014322
14323 status = sme_acquire_global_lock(&mac->sme);
14324 if (QDF_IS_STATUS_SUCCESS(status)) {
14325 mac->sme.congestion_cb = congestion_cb;
14326 sme_release_global_lock(&mac->sme);
Srinivas Girigowda2c263352017-03-17 17:49:53 -070014327 sme_debug("congestion callback set");
Padma, Santhosh Kumar16dacfb2017-03-21 19:05:40 +053014328 }
14329
14330 return status;
14331}
Sandeep Puligillaf587adf2017-04-27 19:53:21 -070014332
Jeff Johnsonda2afa42018-07-04 10:25:42 -070014333QDF_STATUS sme_register_tx_queue_cb(mac_handle_t mac_handle,
14334 tx_queue_cb tx_queue_cb)
Varun Reddy Yeturu076eaa82018-01-16 12:16:14 -080014335{
14336 QDF_STATUS status;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080014337 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Varun Reddy Yeturu076eaa82018-01-16 12:16:14 -080014338
14339 status = sme_acquire_global_lock(&mac->sme);
14340 if (QDF_IS_STATUS_SUCCESS(status)) {
14341 mac->sme.tx_queue_cb = tx_queue_cb;
14342 sme_release_global_lock(&mac->sme);
14343 sme_debug("Tx queue callback set");
Varun Reddy Yeturu076eaa82018-01-16 12:16:14 -080014344 }
14345
14346 return status;
14347}
14348
Jeff Johnsonda2afa42018-07-04 10:25:42 -070014349QDF_STATUS sme_deregister_tx_queue_cb(mac_handle_t mac_handle)
Varun Reddy Yeturu076eaa82018-01-16 12:16:14 -080014350{
Jeff Johnsonda2afa42018-07-04 10:25:42 -070014351 return sme_register_tx_queue_cb(mac_handle, NULL);
Varun Reddy Yeturu076eaa82018-01-16 12:16:14 -080014352}
14353
Varun Reddy Yeturud33033f2018-06-11 10:58:30 -070014354#ifdef WLAN_SUPPORT_TWT
Jeff Johnson3a08ff92018-07-03 19:40:44 -070014355QDF_STATUS sme_register_twt_enable_complete_cb(mac_handle_t mac_handle,
14356 twt_enable_cb twt_enable_cb)
Varun Reddy Yeturu3c9f89c2018-04-18 19:10:34 -070014357{
14358 QDF_STATUS status;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080014359 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Varun Reddy Yeturu3c9f89c2018-04-18 19:10:34 -070014360
14361 status = sme_acquire_global_lock(&mac->sme);
14362 if (QDF_IS_STATUS_SUCCESS(status)) {
14363 mac->sme.twt_enable_cb = twt_enable_cb;
14364 sme_release_global_lock(&mac->sme);
14365 sme_debug("TWT: enable callback set");
Varun Reddy Yeturu3c9f89c2018-04-18 19:10:34 -070014366 }
14367
14368 return status;
14369}
14370
Jeff Johnson3a08ff92018-07-03 19:40:44 -070014371QDF_STATUS sme_register_twt_disable_complete_cb(mac_handle_t mac_handle,
14372 twt_disable_cb twt_disable_cb)
Varun Reddy Yeturu3c9f89c2018-04-18 19:10:34 -070014373{
14374 QDF_STATUS status;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080014375 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Varun Reddy Yeturu3c9f89c2018-04-18 19:10:34 -070014376
14377 status = sme_acquire_global_lock(&mac->sme);
14378 if (QDF_IS_STATUS_SUCCESS(status)) {
14379 mac->sme.twt_disable_cb = twt_disable_cb;
14380 sme_release_global_lock(&mac->sme);
14381 sme_debug("TWT: disable callback set");
Varun Reddy Yeturu3c9f89c2018-04-18 19:10:34 -070014382 }
14383
14384 return status;
14385}
14386
Jeff Johnson3a08ff92018-07-03 19:40:44 -070014387QDF_STATUS sme_deregister_twt_enable_complete_cb(mac_handle_t mac_handle)
Varun Reddy Yeturu3c9f89c2018-04-18 19:10:34 -070014388{
Jeff Johnson3a08ff92018-07-03 19:40:44 -070014389 return sme_register_twt_enable_complete_cb(mac_handle, NULL);
Varun Reddy Yeturu3c9f89c2018-04-18 19:10:34 -070014390}
14391
Jeff Johnson3a08ff92018-07-03 19:40:44 -070014392QDF_STATUS sme_deregister_twt_disable_complete_cb(mac_handle_t mac_handle)
Varun Reddy Yeturu3c9f89c2018-04-18 19:10:34 -070014393{
Jeff Johnson3a08ff92018-07-03 19:40:44 -070014394 return sme_register_twt_disable_complete_cb(mac_handle, NULL);
Varun Reddy Yeturu3c9f89c2018-04-18 19:10:34 -070014395}
14396#endif
14397
Ashish Kumar Dhanotiyab28338c2017-07-21 20:12:34 +053014398QDF_STATUS sme_set_smps_cfg(uint32_t vdev_id, uint32_t param_id,
14399 uint32_t param_val)
14400{
14401 return wma_configure_smps_params(vdev_id, param_id, param_val);
14402}
14403
Jeff Johnsonc7309062018-11-09 20:59:42 -080014404QDF_STATUS sme_set_reorder_timeout(mac_handle_t mac_handle,
14405 struct sir_set_rx_reorder_timeout_val *req)
lifeng66831662017-05-19 16:01:35 +080014406{
14407 QDF_STATUS status;
Zhang Qian1e7649e2018-06-04 13:07:18 +080014408 tp_wma_handle wma_handle;
lifeng66831662017-05-19 16:01:35 +080014409
Zhang Qian1e7649e2018-06-04 13:07:18 +080014410 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
14411 status = wma_set_rx_reorder_timeout_val(wma_handle, req);
lifeng66831662017-05-19 16:01:35 +080014412
14413 return status;
14414}
14415
Jeff Johnsonc7309062018-11-09 20:59:42 -080014416QDF_STATUS sme_set_rx_set_blocksize(mac_handle_t mac_handle,
14417 struct sir_peer_set_rx_blocksize *req)
lifeng66831662017-05-19 16:01:35 +080014418{
14419 QDF_STATUS status;
Zhang Qian1e7649e2018-06-04 13:07:18 +080014420 tp_wma_handle wma_handle;
lifeng66831662017-05-19 16:01:35 +080014421
Zhang Qian1e7649e2018-06-04 13:07:18 +080014422 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
14423 status = wma_set_rx_blocksize(wma_handle, req);
lifeng66831662017-05-19 16:01:35 +080014424
14425 return status;
14426}
Naveen Rawat247a8682017-06-05 15:00:31 -070014427
14428int sme_cli_set_command(int vdev_id, int param_id, int sval, int vpdev)
14429{
14430 return wma_cli_set_command(vdev_id, param_id, sval, vpdev);
14431}
Vidyullatha Kanchanapallybe0ebb32017-03-23 14:36:21 +053014432
Vignesh Viswanathana851d752018-10-03 19:44:38 +053014433int sme_set_enable_mem_deep_sleep(mac_handle_t mac_handle, int vdev_id)
14434{
Jeff Johnson0a8786a2018-12-02 10:49:01 -080014435 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Vignesh Viswanathana851d752018-10-03 19:44:38 +053014436
14437 return wma_cli_set_command(vdev_id, WMI_PDEV_PARAM_HYST_EN,
14438 mac_ctx->mlme_cfg->gen.memory_deep_sleep,
14439 PDEV_CMD);
14440}
14441
14442int sme_set_cck_tx_fir_override(mac_handle_t mac_handle, int vdev_id)
14443{
Jeff Johnson0a8786a2018-12-02 10:49:01 -080014444 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Vignesh Viswanathana851d752018-10-03 19:44:38 +053014445
14446 return wma_cli_set_command(vdev_id,
14447 WMI_PDEV_PARAM_ENABLE_CCK_TXFIR_OVERRIDE,
14448 mac_ctx->mlme_cfg->gen.cck_tx_fir_override,
14449 PDEV_CMD);
14450}
14451
Jeff Johnsond0b6c7e2018-07-04 14:53:06 -070014452QDF_STATUS sme_set_bt_activity_info_cb(mac_handle_t mac_handle,
14453 bt_activity_info_cb cb)
Vidyullatha Kanchanapallybe0ebb32017-03-23 14:36:21 +053014454{
14455 QDF_STATUS status;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080014456 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Vidyullatha Kanchanapallybe0ebb32017-03-23 14:36:21 +053014457
14458 status = sme_acquire_global_lock(&mac->sme);
14459 if (QDF_IS_STATUS_SUCCESS(status)) {
14460 mac->sme.bt_activity_info_cb = cb;
14461 sme_release_global_lock(&mac->sme);
14462 sme_debug("bt activity info callback set");
Vidyullatha Kanchanapallybe0ebb32017-03-23 14:36:21 +053014463 }
14464
14465 return status;
14466}
lifengd217d192017-05-09 19:44:16 +080014467
Jeff Johnsonc7309062018-11-09 20:59:42 -080014468QDF_STATUS sme_get_chain_rssi(mac_handle_t mac_handle,
lifengd217d192017-05-09 19:44:16 +080014469 struct get_chain_rssi_req_params *input,
14470 get_chain_rssi_callback callback,
14471 void *context)
14472{
14473 QDF_STATUS status = QDF_STATUS_SUCCESS;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080014474 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Zhang Qian1e7649e2018-06-04 13:07:18 +080014475 tp_wma_handle wma_handle;
lifengd217d192017-05-09 19:44:16 +080014476
14477 SME_ENTER();
14478
Jeff Johnson038efe72019-03-18 13:39:31 -070014479 if (!input) {
lifengd217d192017-05-09 19:44:16 +080014480 sme_err("Invalid req params");
14481 return QDF_STATUS_E_INVAL;
14482 }
14483
14484 mac_ctx->sme.get_chain_rssi_cb = callback;
14485 mac_ctx->sme.get_chain_rssi_context = context;
Zhang Qian1e7649e2018-06-04 13:07:18 +080014486 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
14487 wma_get_chain_rssi(wma_handle, input);
lifengd217d192017-05-09 19:44:16 +080014488
14489 SME_EXIT();
14490 return status;
14491}
Vignesh Viswanathan66c951d2017-09-06 12:23:42 +053014492
Jeff Johnson0a8786a2018-12-02 10:49:01 -080014493QDF_STATUS sme_process_msg_callback(struct mac_context *mac,
Jeff Johnson5f9ce2d2018-06-09 21:20:45 -070014494 struct scheduler_msg *msg)
Sandeep Puligilla1426d612017-04-12 18:22:06 -070014495{
14496 QDF_STATUS status = QDF_STATUS_E_FAILURE;
14497
Jeff Johnson038efe72019-03-18 13:39:31 -070014498 if (!msg) {
Sandeep Puligilla1426d612017-04-12 18:22:06 -070014499 sme_err("Empty message for SME Msg callback");
14500 return status;
14501 }
Jeff Johnson5f9ce2d2018-06-09 21:20:45 -070014502 status = sme_process_msg(mac, msg);
Sandeep Puligilla1426d612017-04-12 18:22:06 -070014503 return status;
14504}
14505
Jeff Johnsonc7309062018-11-09 20:59:42 -080014506void sme_display_disconnect_stats(mac_handle_t mac_handle, uint8_t session_id)
Vignesh Viswanathan66c951d2017-09-06 12:23:42 +053014507{
14508 struct csr_roam_session *session;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080014509 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Vignesh Viswanathan66c951d2017-09-06 12:23:42 +053014510
14511 if (!CSR_IS_SESSION_VALID(mac_ctx, session_id)) {
14512 sme_err("%s Invalid session id: %d", __func__, session_id);
14513 return;
14514 }
14515
14516 session = CSR_GET_SESSION(mac_ctx, session_id);
14517 if (!session) {
14518 sme_err("%s Failed to get session for id: %d",
14519 __func__, session_id);
14520 return;
14521 }
14522
Nirav Shahe6194ac2018-07-13 11:04:41 +053014523 sme_nofl_info("Total No. of Disconnections: %d",
14524 session->disconnect_stats.disconnection_cnt);
Vignesh Viswanathan66c951d2017-09-06 12:23:42 +053014525
Nirav Shahe6194ac2018-07-13 11:04:41 +053014526 sme_nofl_info("No. of Diconnects Triggered by Application: %d",
14527 session->disconnect_stats.disconnection_by_app);
Vignesh Viswanathan66c951d2017-09-06 12:23:42 +053014528
Nirav Shahe6194ac2018-07-13 11:04:41 +053014529 sme_nofl_info("No. of Disassoc Sent by Peer: %d",
14530 session->disconnect_stats.disassoc_by_peer);
Vignesh Viswanathan66c951d2017-09-06 12:23:42 +053014531
Nirav Shahe6194ac2018-07-13 11:04:41 +053014532 sme_nofl_info("No. of Deauth Sent by Peer: %d",
14533 session->disconnect_stats.deauth_by_peer);
Vignesh Viswanathan66c951d2017-09-06 12:23:42 +053014534
Nirav Shahe6194ac2018-07-13 11:04:41 +053014535 sme_nofl_info("No. of Disconnections due to Beacon Miss: %d",
14536 session->disconnect_stats.bmiss);
Vignesh Viswanathan66c951d2017-09-06 12:23:42 +053014537
Nirav Shahe6194ac2018-07-13 11:04:41 +053014538 sme_nofl_info("No. of Disconnections due to Peer Kickout: %d",
14539 session->disconnect_stats.peer_kickout);
Vignesh Viswanathan66c951d2017-09-06 12:23:42 +053014540}
Nachiket Kukadeaaf8a712017-07-27 19:15:36 +053014541
Rachit Kankanef6834c42018-08-02 18:47:50 +053014542#ifdef FEATURE_WLAN_DYNAMIC_CVM
Nachiket Kukade8983cf62017-10-12 18:14:48 +053014543 /**
14544 * sme_set_vc_mode_config() - Set voltage corner config to FW
14545 * @bitmap: Bitmap that referes to voltage corner config with
14546 * different phymode and bw configuration
14547 *
14548 * Return: QDF_STATUS
14549 */
14550QDF_STATUS sme_set_vc_mode_config(uint32_t vc_bitmap)
14551{
14552 void *wma_handle;
14553
14554 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
14555 if (!wma_handle) {
14556 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
14557 "wma_handle is NULL");
14558 return QDF_STATUS_E_FAILURE;
14559 }
14560 if (QDF_STATUS_SUCCESS !=
14561 wma_set_vc_mode_config(wma_handle, vc_bitmap)) {
14562 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
14563 "%s: Failed to set Voltage Control config to FW",
14564 __func__);
14565 return QDF_STATUS_E_FAILURE;
14566 }
14567 return QDF_STATUS_SUCCESS;
14568}
Rachit Kankanef6834c42018-08-02 18:47:50 +053014569#endif
Nachiket Kukade8983cf62017-10-12 18:14:48 +053014570
Nachiket Kukadeaaf8a712017-07-27 19:15:36 +053014571/**
14572 * sme_set_bmiss_bcnt() - set bmiss config parameters
14573 * @vdev_id: virtual device for the command
14574 * @first_cnt: bmiss first value
14575 * @final_cnt: bmiss final value
14576 *
14577 * Return: QDF_STATUS_SUCCESS or non-zero on failure
14578 */
14579QDF_STATUS sme_set_bmiss_bcnt(uint32_t vdev_id, uint32_t first_cnt,
14580 uint32_t final_cnt)
14581{
14582 return wma_config_bmiss_bcnt_params(vdev_id, first_cnt, final_cnt);
14583}
Ganesh Kondabattini479a8ae2017-10-03 16:49:24 +053014584
Jeff Johnsonc7309062018-11-09 20:59:42 -080014585QDF_STATUS sme_send_limit_off_channel_params(mac_handle_t mac_handle,
14586 uint8_t vdev_id,
14587 bool is_tos_active,
14588 uint32_t max_off_chan_time,
14589 uint32_t rest_time,
14590 bool skip_dfs_chan)
Ganesh Kondabattini479a8ae2017-10-03 16:49:24 +053014591{
14592 struct sir_limit_off_chan *cmd;
14593 struct scheduler_msg msg = {0};
14594
14595 cmd = qdf_mem_malloc(sizeof(*cmd));
Arif Hussain0ef77082018-10-10 16:42:53 -070014596 if (!cmd)
Ganesh Kondabattini479a8ae2017-10-03 16:49:24 +053014597 return QDF_STATUS_E_NOMEM;
Ganesh Kondabattini479a8ae2017-10-03 16:49:24 +053014598
14599 cmd->vdev_id = vdev_id;
14600 cmd->is_tos_active = is_tos_active;
14601 cmd->max_off_chan_time = max_off_chan_time;
14602 cmd->rest_time = rest_time;
14603 cmd->skip_dfs_chans = skip_dfs_chan;
14604
14605 msg.type = WMA_SET_LIMIT_OFF_CHAN;
14606 msg.reserved = 0;
14607 msg.bodyptr = cmd;
14608
gaurank kathpalia36b0c582018-08-28 17:45:43 +053014609 if (!QDF_IS_STATUS_SUCCESS(scheduler_post_message(QDF_MODULE_ID_SME,
14610 QDF_MODULE_ID_WMA,
14611 QDF_MODULE_ID_WMA,
14612 &msg))) {
Ganesh Kondabattini479a8ae2017-10-03 16:49:24 +053014613 sme_err("Not able to post WMA_SET_LIMIT_OFF_CHAN to WMA");
14614 qdf_mem_free(cmd);
14615 return QDF_STATUS_E_FAILURE;
14616 }
14617
14618 return QDF_STATUS_SUCCESS;
14619}
Vignesh Viswanathan9dd88d32017-11-22 14:22:03 +053014620
Jeff Johnsonc7309062018-11-09 20:59:42 -080014621uint32_t sme_unpack_rsn_ie(mac_handle_t mac_handle, uint8_t *buf,
Qiwei Caie689a262018-07-26 15:50:22 +080014622 uint8_t buf_len, tDot11fIERSN *rsn_ie,
14623 bool append_ie)
14624{
Jeff Johnson0a8786a2018-12-02 10:49:01 -080014625 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Qiwei Caie689a262018-07-26 15:50:22 +080014626
14627 return dot11f_unpack_ie_rsn(mac_ctx, buf, buf_len, rsn_ie, append_ie);
14628}
14629
14630#ifdef FEATURE_BSS_TRANSITION
Vignesh Viswanathan9dd88d32017-11-22 14:22:03 +053014631/**
14632 * sme_get_status_for_candidate() - Get bss transition status for candidate
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -080014633 * @mac_handle: Opaque handle to the global MAC context
Vignesh Viswanathan9dd88d32017-11-22 14:22:03 +053014634 * @conn_bss_desc: connected bss descriptor
14635 * @bss_desc: candidate bss descriptor
14636 * @info: candiadate bss information
14637 * @trans_reason: transition reason code
14638 * @is_bt_in_progress: bt activity indicator
14639 *
14640 * Return : true if candidate is rejected and reject reason is filled
14641 * @info->status. Otherwise returns false.
14642 */
Jeff Johnsonc7309062018-11-09 20:59:42 -080014643static bool sme_get_status_for_candidate(mac_handle_t mac_handle,
Pragaspathi Thilagaraj1112c962019-05-23 23:45:38 +053014644 struct bss_description *conn_bss_desc,
14645 struct bss_description *bss_desc,
Jeff Johnsonc7309062018-11-09 20:59:42 -080014646 struct bss_candidate_info *info,
14647 uint8_t trans_reason,
14648 bool is_bt_in_progress)
Vignesh Viswanathan9dd88d32017-11-22 14:22:03 +053014649{
Jeff Johnson0a8786a2018-12-02 10:49:01 -080014650 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Pragaspathi Thilagarajcd6aef02018-09-11 20:30:23 +053014651 struct wlan_mlme_mbo *mbo_cfg;
14652 int8_t current_rssi_mcc_thres;
14653
14654 if (!(mac_ctx->mlme_cfg)) {
14655 pe_err("mlme cfg is NULL");
14656 return false;
14657 }
14658 mbo_cfg = &mac_ctx->mlme_cfg->mbo_cfg;
Vignesh Viswanathan9dd88d32017-11-22 14:22:03 +053014659
14660 /*
14661 * Low RSSI based rejection
14662 * If candidate rssi is less than mbo_candidate_rssi_thres and connected
14663 * bss rssi is greater than mbo_current_rssi_thres, then reject the
14664 * candidate with MBO reason code 4.
14665 */
Pragaspathi Thilagarajcd6aef02018-09-11 20:30:23 +053014666 if ((bss_desc->rssi < mbo_cfg->mbo_candidate_rssi_thres) &&
14667 (conn_bss_desc->rssi > mbo_cfg->mbo_current_rssi_thres)) {
Srinivas Girigowdacb7b8b82019-04-10 14:27:47 -070014668 sme_err("Candidate BSS "QDF_MAC_ADDR_STR" has LOW RSSI(%d), hence reject",
Srinivas Girigowda34fbba02019-04-08 12:07:44 -070014669 QDF_MAC_ADDR_ARRAY(bss_desc->bssId), bss_desc->rssi);
Vignesh Viswanathan9dd88d32017-11-22 14:22:03 +053014670 info->status = QCA_STATUS_REJECT_LOW_RSSI;
14671 return true;
14672 }
14673
14674 if (trans_reason == MBO_TRANSITION_REASON_LOAD_BALANCING ||
14675 trans_reason == MBO_TRANSITION_REASON_TRANSITIONING_TO_PREMIUM_AP) {
14676 /*
14677 * MCC rejection
14678 * If moving to candidate's channel will result in MCC scenario
14679 * and the rssi of connected bss is greater than
14680 * mbo_current_rssi_mss_thres, then reject the candidate with
14681 * MBO reason code 3.
14682 */
Pragaspathi Thilagarajcd6aef02018-09-11 20:30:23 +053014683 current_rssi_mcc_thres = mbo_cfg->mbo_current_rssi_mcc_thres;
14684 if ((conn_bss_desc->rssi > current_rssi_mcc_thres) &&
Jeff Johnson9d118852018-06-10 16:54:59 -070014685 csr_is_mcc_channel(mac_ctx, bss_desc->channelId)) {
Srinivas Girigowdacb7b8b82019-04-10 14:27:47 -070014686 sme_err("Candidate BSS "QDF_MAC_ADDR_STR" causes MCC, hence reject",
Srinivas Girigowda34fbba02019-04-08 12:07:44 -070014687 QDF_MAC_ADDR_ARRAY(bss_desc->bssId));
Vignesh Viswanathan9dd88d32017-11-22 14:22:03 +053014688 info->status =
14689 QCA_STATUS_REJECT_INSUFFICIENT_QOS_CAPACITY;
14690 return true;
14691 }
14692
14693 /*
14694 * BT coex rejection
14695 * If AP is trying to move the client from 5G to 2.4G and moving
14696 * to 2.4G will result in BT coex and candidate channel rssi is
14697 * less than mbo_candidate_rssi_btc_thres, then reject the
14698 * candidate with MBO reason code 2.
14699 */
14700 if (WLAN_REG_IS_5GHZ_CH(conn_bss_desc->channelId) &&
14701 WLAN_REG_IS_24GHZ_CH(bss_desc->channelId) &&
14702 is_bt_in_progress &&
Pragaspathi Thilagarajcd6aef02018-09-11 20:30:23 +053014703 (bss_desc->rssi < mbo_cfg->mbo_candidate_rssi_btc_thres)) {
Srinivas Girigowdacb7b8b82019-04-10 14:27:47 -070014704 sme_err("Candidate BSS "QDF_MAC_ADDR_STR" causes BT coex, hence reject",
Srinivas Girigowda34fbba02019-04-08 12:07:44 -070014705 QDF_MAC_ADDR_ARRAY(bss_desc->bssId));
Vignesh Viswanathan9dd88d32017-11-22 14:22:03 +053014706 info->status =
14707 QCA_STATUS_REJECT_EXCESSIVE_DELAY_EXPECTED;
14708 return true;
14709 }
14710
14711 /*
14712 * LTE coex rejection
14713 * If moving to candidate's channel can cause LTE coex, then
14714 * reject the candidate with MBO reason code 5.
14715 */
14716 if (policy_mgr_is_safe_channel(mac_ctx->psoc,
14717 conn_bss_desc->channelId) &&
14718 !(policy_mgr_is_safe_channel(mac_ctx->psoc,
14719 bss_desc->channelId))) {
14720 sme_err("High interference expected if transitioned to BSS "
Srinivas Girigowdacb7b8b82019-04-10 14:27:47 -070014721 QDF_MAC_ADDR_STR" hence reject",
Srinivas Girigowda34fbba02019-04-08 12:07:44 -070014722 QDF_MAC_ADDR_ARRAY(bss_desc->bssId));
Vignesh Viswanathan9dd88d32017-11-22 14:22:03 +053014723 info->status =
14724 QCA_STATUS_REJECT_HIGH_INTERFERENCE;
14725 return true;
14726 }
14727 }
14728
14729 return false;
14730}
14731
Jeff Johnson62737252018-11-17 10:59:43 -080014732QDF_STATUS sme_get_bss_transition_status(mac_handle_t mac_handle,
14733 uint8_t transition_reason,
14734 struct qdf_mac_addr *bssid,
14735 struct bss_candidate_info *info,
14736 uint16_t n_candidates,
14737 bool is_bt_in_progress)
Vignesh Viswanathan9dd88d32017-11-22 14:22:03 +053014738{
14739 QDF_STATUS status = QDF_STATUS_SUCCESS;
Pragaspathi Thilagaraj1112c962019-05-23 23:45:38 +053014740 struct bss_description *bss_desc, *conn_bss_desc;
Vignesh Viswanathan9dd88d32017-11-22 14:22:03 +053014741 tCsrScanResultInfo *res, *conn_res;
14742 uint16_t i;
14743
14744 if (!n_candidates || !info) {
14745 sme_err("No candidate info available");
14746 return QDF_STATUS_E_INVAL;
14747 }
14748
14749 conn_res = qdf_mem_malloc(sizeof(tCsrScanResultInfo));
Arif Hussain0ef77082018-10-10 16:42:53 -070014750 if (!conn_res)
Vignesh Viswanathan9dd88d32017-11-22 14:22:03 +053014751 return QDF_STATUS_E_NOMEM;
Vignesh Viswanathan9dd88d32017-11-22 14:22:03 +053014752
14753 res = qdf_mem_malloc(sizeof(tCsrScanResultInfo));
14754 if (!res) {
Vignesh Viswanathan9dd88d32017-11-22 14:22:03 +053014755 status = QDF_STATUS_E_NOMEM;
14756 goto free;
14757 }
14758
14759 /* Get the connected BSS descriptor */
Jeff Johnsonc7309062018-11-09 20:59:42 -080014760 status = sme_scan_get_result_for_bssid(mac_handle, bssid, conn_res);
Vignesh Viswanathan9dd88d32017-11-22 14:22:03 +053014761 if (!QDF_IS_STATUS_SUCCESS(status)) {
14762 sme_err("Failed to find connected BSS in scan list");
14763 goto free;
14764 }
14765 conn_bss_desc = &conn_res->BssDescriptor;
14766
14767 for (i = 0; i < n_candidates; i++) {
14768 /* Get candidate BSS descriptors */
Jeff Johnsonc7309062018-11-09 20:59:42 -080014769 status = sme_scan_get_result_for_bssid(mac_handle,
14770 &info[i].bssid,
Vignesh Viswanathan9dd88d32017-11-22 14:22:03 +053014771 res);
14772 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowdacb7b8b82019-04-10 14:27:47 -070014773 sme_err("BSS "QDF_MAC_ADDR_STR" not present in scan list",
Srinivas Girigowda34fbba02019-04-08 12:07:44 -070014774 QDF_MAC_ADDR_ARRAY(info[i].bssid.bytes));
Vignesh Viswanathan9dd88d32017-11-22 14:22:03 +053014775 info[i].status = QCA_STATUS_REJECT_UNKNOWN;
14776 continue;
14777 }
14778
14779 bss_desc = &res->BssDescriptor;
Jeff Johnsonc7309062018-11-09 20:59:42 -080014780 if (!sme_get_status_for_candidate(mac_handle, conn_bss_desc,
14781 bss_desc, &info[i],
14782 transition_reason,
14783 is_bt_in_progress)) {
Vignesh Viswanathan9dd88d32017-11-22 14:22:03 +053014784 /*
14785 * If status is not over written, it means it is a
14786 * candidate for accept.
14787 */
14788 info[i].status = QCA_STATUS_ACCEPT;
14789 }
14790 }
14791
14792 /* success */
14793 status = QDF_STATUS_SUCCESS;
14794
14795free:
14796 /* free allocated memory */
14797 if (conn_res)
14798 qdf_mem_free(conn_res);
14799 if (res)
14800 qdf_mem_free(res);
14801
14802 return status;
14803}
Qiwei Caie689a262018-07-26 15:50:22 +080014804#endif /* FEATURE_BSS_TRANSITION */
Vignesh Viswanathan9dd88d32017-11-22 14:22:03 +053014805
Jeff Johnsonc7309062018-11-09 20:59:42 -080014806bool sme_is_conn_state_connected(mac_handle_t mac_handle, uint8_t session_id)
Vignesh Viswanathan79f7e3f2018-09-30 23:56:10 +053014807{
Jeff Johnson0a8786a2018-12-02 10:49:01 -080014808 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Vignesh Viswanathan79f7e3f2018-09-30 23:56:10 +053014809
14810 return csr_is_conn_state_connected(mac_ctx, session_id);
14811}
14812
Jeff Johnsonc7309062018-11-09 20:59:42 -080014813void sme_enable_roaming_on_connected_sta(mac_handle_t mac_handle)
Abhishek Singh1f217ec2017-12-22 11:48:27 +053014814{
14815 uint8_t session_id;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080014816 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Abhishek Singh1f217ec2017-12-22 11:48:27 +053014817 QDF_STATUS status;
14818
14819 session_id = csr_get_roam_enabled_sta_sessionid(mac_ctx);
Srinivas Girigowdad8697d42019-03-08 15:34:39 -080014820 if (session_id != WLAN_UMAC_VDEV_ID_MAX)
Abhishek Singh1f217ec2017-12-22 11:48:27 +053014821 return;
14822
14823 session_id = csr_get_connected_infra(mac_ctx);
Srinivas Girigowdad8697d42019-03-08 15:34:39 -080014824 if (session_id == WLAN_UMAC_VDEV_ID_MAX) {
Abhishek Singh1f217ec2017-12-22 11:48:27 +053014825 sme_debug("No STA in conencted state");
14826 return;
14827 }
14828
14829 sme_debug("Roaming not enabled on any STA, enable roaming on session %d",
14830 session_id);
14831 status = sme_acquire_global_lock(&mac_ctx->sme);
14832 if (QDF_IS_STATUS_SUCCESS(status)) {
14833 csr_roam_offload_scan(mac_ctx, session_id,
14834 ROAM_SCAN_OFFLOAD_START,
14835 REASON_CTX_INIT);
14836 sme_release_global_lock(&mac_ctx->sme);
14837 }
Sandeep Puligilla063a4342018-01-10 02:50:14 -080014838}
Abhishek Singh1f217ec2017-12-22 11:48:27 +053014839
Sandeep Puligilla063a4342018-01-10 02:50:14 -080014840int16_t sme_get_oper_chan_freq(struct wlan_objmgr_vdev *vdev)
14841{
14842 uint8_t vdev_id, chan;
14843 struct csr_roam_session *session;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080014844 struct mac_context *mac_ctx;
Jeff Johnsonb460dd72018-11-08 10:26:51 -080014845 mac_handle_t mac_handle;
Sandeep Puligilla063a4342018-01-10 02:50:14 -080014846 int16_t freq = 0;
14847
Jeff Johnson038efe72019-03-18 13:39:31 -070014848 if (!vdev) {
Sandeep Puligilla063a4342018-01-10 02:50:14 -080014849 sme_err("Invalid vdev id is passed");
14850 return 0;
14851 }
14852
Jeff Johnsonb460dd72018-11-08 10:26:51 -080014853 mac_handle = cds_get_context(QDF_MODULE_ID_SME);
14854 if (!mac_handle) {
14855 sme_err("mac_handle is null");
Arif Hussaind15902c2018-03-02 00:08:29 -080014856 return 0;
14857 }
Jeff Johnsona0619e42018-11-28 17:43:00 -080014858 mac_ctx = MAC_CONTEXT(mac_handle);
Sandeep Puligilla063a4342018-01-10 02:50:14 -080014859 vdev_id = wlan_vdev_get_id(vdev);
14860 if (!CSR_IS_SESSION_VALID(mac_ctx, vdev_id)) {
14861 sme_err("Invalid vdev id is passed");
14862 return 0;
14863 }
14864
14865 session = CSR_GET_SESSION(mac_ctx, vdev_id);
14866 chan = csr_get_infra_operation_channel(mac_ctx, vdev_id);
14867 if (chan)
14868 freq = cds_chan_to_freq(chan);
14869
14870 return freq;
14871}
14872
14873enum phy_ch_width sme_get_oper_ch_width(struct wlan_objmgr_vdev *vdev)
14874{
14875 uint8_t vdev_id;
14876 struct csr_roam_session *session;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080014877 struct mac_context *mac_ctx;
Jeff Johnsonb460dd72018-11-08 10:26:51 -080014878 mac_handle_t mac_handle;
Sandeep Puligilla063a4342018-01-10 02:50:14 -080014879 enum phy_ch_width ch_width = CH_WIDTH_20MHZ;
14880
Jeff Johnson038efe72019-03-18 13:39:31 -070014881 if (!vdev) {
Sandeep Puligilla063a4342018-01-10 02:50:14 -080014882 sme_err("Invalid vdev id is passed");
14883 return CH_WIDTH_INVALID;
14884 }
14885
Jeff Johnsonb460dd72018-11-08 10:26:51 -080014886 mac_handle = cds_get_context(QDF_MODULE_ID_SME);
14887 if (!mac_handle) {
14888 sme_err("mac_handle is null");
Arif Hussaind15902c2018-03-02 00:08:29 -080014889 return CH_WIDTH_INVALID;
14890 }
Jeff Johnsona0619e42018-11-28 17:43:00 -080014891 mac_ctx = MAC_CONTEXT(mac_handle);
Sandeep Puligilla063a4342018-01-10 02:50:14 -080014892 vdev_id = wlan_vdev_get_id(vdev);
14893 if (!CSR_IS_SESSION_VALID(mac_ctx, vdev_id)) {
14894 sme_err("Invalid vdev id is passed");
14895 return CH_WIDTH_INVALID;
14896 }
14897
14898 session = CSR_GET_SESSION(mac_ctx, vdev_id);
14899
14900 if (csr_is_conn_state_connected(mac_ctx, vdev_id))
14901 ch_width = session->connectedProfile.vht_channel_width;
14902
14903 return ch_width;
14904}
14905
14906int sme_get_sec20chan_freq_mhz(struct wlan_objmgr_vdev *vdev,
14907 uint16_t *sec20chan_freq)
14908{
14909 uint8_t vdev_id;
14910
14911 vdev_id = wlan_vdev_get_id(vdev);
14912 /* Need to extend */
14913 return 0;
Abhishek Singh1f217ec2017-12-22 11:48:27 +053014914}
14915
Padma, Santhosh Kumardd3f4852018-01-16 18:51:51 +053014916#ifdef WLAN_FEATURE_SAE
Srinivas Dasarie854ff02019-02-11 17:24:48 +053014917QDF_STATUS sme_handle_sae_msg(mac_handle_t mac_handle,
14918 uint8_t session_id,
14919 uint8_t sae_status,
14920 struct qdf_mac_addr peer_mac_addr)
Padma, Santhosh Kumardd3f4852018-01-16 18:51:51 +053014921{
14922 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080014923 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Padma, Santhosh Kumardd3f4852018-01-16 18:51:51 +053014924 struct sir_sae_msg *sae_msg;
14925 struct scheduler_msg sch_msg = {0};
14926
14927 qdf_status = sme_acquire_global_lock(&mac->sme);
14928 if (QDF_IS_STATUS_SUCCESS(qdf_status)) {
14929 sae_msg = qdf_mem_malloc(sizeof(*sae_msg));
14930 if (!sae_msg) {
14931 qdf_status = QDF_STATUS_E_NOMEM;
Padma, Santhosh Kumardd3f4852018-01-16 18:51:51 +053014932 } else {
14933 sae_msg->message_type = eWNI_SME_SEND_SAE_MSG;
14934 sae_msg->length = sizeof(*sae_msg);
14935 sae_msg->session_id = session_id;
14936 sae_msg->sae_status = sae_status;
Srinivas Dasarie854ff02019-02-11 17:24:48 +053014937 qdf_mem_copy(sae_msg->peer_mac_addr,
14938 peer_mac_addr.bytes,
14939 QDF_MAC_ADDR_SIZE);
14940 sme_debug("SAE: sae_status %d session_id %d Peer: "
Srinivas Girigowdacb7b8b82019-04-10 14:27:47 -070014941 QDF_MAC_ADDR_STR, sae_msg->sae_status,
Srinivas Dasarie854ff02019-02-11 17:24:48 +053014942 sae_msg->session_id,
Srinivas Girigowda34fbba02019-04-08 12:07:44 -070014943 QDF_MAC_ADDR_ARRAY(sae_msg->peer_mac_addr));
Padma, Santhosh Kumardd3f4852018-01-16 18:51:51 +053014944
14945 sch_msg.type = eWNI_SME_SEND_SAE_MSG;
14946 sch_msg.bodyptr = sae_msg;
14947
14948 qdf_status =
gaurank kathpalia36b0c582018-08-28 17:45:43 +053014949 scheduler_post_message(QDF_MODULE_ID_SME,
14950 QDF_MODULE_ID_PE,
14951 QDF_MODULE_ID_PE,
Jeff Johnsonc7309062018-11-09 20:59:42 -080014952 &sch_msg);
Padma, Santhosh Kumardd3f4852018-01-16 18:51:51 +053014953 }
14954 sme_release_global_lock(&mac->sme);
14955 }
14956
14957 return qdf_status;
14958}
14959#endif
Vignesh Viswanathan0a569292018-02-14 15:34:47 +053014960
Jeff Johnsonc7309062018-11-09 20:59:42 -080014961bool sme_is_sta_key_exchange_in_progress(mac_handle_t mac_handle,
14962 uint8_t session_id)
Vignesh Viswanathan0a569292018-02-14 15:34:47 +053014963{
Jeff Johnson0a8786a2018-12-02 10:49:01 -080014964 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Vignesh Viswanathan0a569292018-02-14 15:34:47 +053014965
14966 if (!CSR_IS_SESSION_VALID(mac_ctx, session_id)) {
14967 sme_err("Invalid session id: %d", session_id);
14968 return false;
14969 }
14970
14971 return CSR_IS_WAIT_FOR_KEY(mac_ctx, session_id);
14972}
Vignesh Viswanathana2f5ce582018-05-09 20:38:39 +053014973
Jeff Johnsonc7309062018-11-09 20:59:42 -080014974bool sme_validate_channel_list(mac_handle_t mac_handle,
14975 uint8_t *chan_list,
14976 uint8_t num_channels)
Vignesh Viswanathana2f5ce582018-05-09 20:38:39 +053014977{
Jeff Johnson0a8786a2018-12-02 10:49:01 -080014978 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Vignesh Viswanathana2f5ce582018-05-09 20:38:39 +053014979 uint8_t i = 0;
14980 uint8_t j;
14981 bool found;
14982 struct csr_channel *ch_lst_info = &mac_ctx->scan.base_channels;
14983
14984 if (!chan_list || !num_channels) {
14985 sme_err("Chan list empty %pK or num_channels is 0", chan_list);
14986 return false;
14987 }
14988
14989 while (i < num_channels) {
14990 found = false;
14991 for (j = 0; j < ch_lst_info->numChannels; j++) {
14992 if (ch_lst_info->channelList[j] == chan_list[i]) {
14993 found = true;
14994 break;
14995 }
14996 }
14997
14998 if (!found) {
14999 sme_debug("Invalid channel %d", chan_list[i]);
15000 return false;
15001 }
15002
15003 i++;
15004 }
Arif Hussain0e246802018-05-01 18:13:44 -070015005
Vignesh Viswanathana2f5ce582018-05-09 20:38:39 +053015006 return true;
15007}
Arif Hussain0e246802018-05-01 18:13:44 -070015008
Jeff Johnsonc7309062018-11-09 20:59:42 -080015009void sme_set_amsdu(mac_handle_t mac_handle, bool enable)
Arif Hussain0e246802018-05-01 18:13:44 -070015010{
Jeff Johnson0a8786a2018-12-02 10:49:01 -080015011 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Arif Hussain0e246802018-05-01 18:13:44 -070015012 mac_ctx->is_usr_cfg_amsdu_enabled = enable;
15013}
Naveen Rawatfa2a1002018-05-17 16:06:37 -070015014
Kiran Kumar Lokere921b5a52019-02-24 21:53:20 -080015015#ifdef WLAN_FEATURE_11AX
15016void sme_set_he_testbed_def(mac_handle_t mac_handle, uint8_t vdev_id)
15017{
15018 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
15019 struct csr_roam_session *session;
15020
15021 session = CSR_GET_SESSION(mac_ctx, vdev_id);
15022
15023 if (!session) {
15024 sme_debug("No session for id %d", vdev_id);
15025 return;
15026 }
15027 sme_debug("set HE testbed defaults");
15028 mac_ctx->mlme_cfg->he_caps.dot11_he_cap.amsdu_in_ampdu = 0;
15029 mac_ctx->mlme_cfg->he_caps.dot11_he_cap.twt_request = 0;
15030 mac_ctx->mlme_cfg->he_caps.dot11_he_cap.omi_a_ctrl = 0;
15031 mac_ctx->mlme_cfg->he_caps.dot11_he_cap.he_ppdu_20_in_160_80p80Mhz = 0;
15032 mac_ctx->mlme_cfg->he_caps.dot11_he_cap.he_ppdu_20_in_40Mhz_2G = 0;
15033 mac_ctx->mlme_cfg->he_caps.dot11_he_cap.he_ppdu_80_in_160_80p80Mhz = 0;
15034 mac_ctx->mlme_cfg->he_caps.dot11_he_cap.dcm_enc_tx = 0;
15035 mac_ctx->mlme_cfg->he_caps.dot11_he_cap.dcm_enc_rx = 0;
15036 mac_ctx->mlme_cfg->he_caps.dot11_he_cap.max_nc = 0;
15037 mac_ctx->mlme_cfg->he_caps.dot11_he_cap.trigger_frm_mac_pad =
15038 QCA_WLAN_HE_16US_OF_PROCESS_TIME;
Kiran Kumar Lokere05a61852019-04-02 18:39:19 -070015039 mac_ctx->mlme_cfg->he_caps.dot11_he_cap.flex_twt_sched = 0;
15040 mac_ctx->mlme_cfg->he_caps.dot11_he_cap.ofdma_ra = 0;
15041 mac_ctx->mlme_cfg->he_caps.dot11_he_cap.he_4x_ltf_3200_gi_ndp = 0;
15042 mac_ctx->mlme_cfg->he_caps.dot11_he_cap.qtp = 0;
15043 mac_ctx->mlme_cfg->he_caps.dot11_he_cap.bsrp_ampdu_aggr = 0;
15044 mac_ctx->mlme_cfg->he_caps.dot11_he_cap.a_bqr = 0;
15045 mac_ctx->mlme_cfg->he_caps.dot11_he_cap.he_sub_ch_sel_tx_supp = 0;
15046 mac_ctx->mlme_cfg->he_caps.dot11_he_cap.ndp_feedback_supp = 0;
15047 mac_ctx->mlme_cfg->he_caps.dot11_he_cap.ops_supp = 0;
15048 mac_ctx->mlme_cfg->he_caps.dot11_he_cap.srp = 0;
15049 mac_ctx->mlme_cfg->he_caps.dot11_he_cap.power_boost = 0;
15050 mac_ctx->mlme_cfg->he_caps.dot11_he_cap.num_sounding_lt_80 = 0;
15051 mac_ctx->mlme_cfg->he_caps.dot11_he_cap.num_sounding_gt_80 = 0;
15052 mac_ctx->mlme_cfg->he_caps.dot11_he_cap.dl_mu_mimo_part_bw = 0;
15053 mac_ctx->mlme_cfg->he_caps.dot11_he_cap.non_trig_cqi_feedback = 0;
15054 mac_ctx->mlme_cfg->he_caps.dot11_he_cap.tx_1024_qam_lt_242_tone_ru = 0;
15055 mac_ctx->mlme_cfg->he_caps.dot11_he_cap.rx_1024_qam_lt_242_tone_ru = 0;
15056 mac_ctx->mlme_cfg->he_caps.dot11_he_cap.rx_full_bw_su_he_mu_compress_sigb = 0;
15057 mac_ctx->mlme_cfg->he_caps.dot11_he_cap.rx_full_bw_su_he_mu_non_cmpr_sigb = 0;
15058 mac_ctx->mlme_cfg->he_caps.dot11_he_cap.su_beamformer = 0;
15059 mac_ctx->mlme_cfg->he_caps.dot11_he_cap.multi_tid_aggr_rx_supp = 0;
15060 mac_ctx->mlme_cfg->he_caps.dot11_he_cap.multi_tid_aggr_tx_supp = 0;
15061 mac_ctx->mlme_cfg->he_caps.dot11_he_cap.he_dynamic_smps = 0;
15062 mac_ctx->mlme_cfg->he_caps.dot11_he_cap.punctured_sounding_supp = 0;
15063 mac_ctx->mlme_cfg->he_caps.dot11_he_cap.ht_vht_trg_frm_rx_supp = 0;
15064 mac_ctx->mlme_cfg->he_caps.dot11_he_cap.su_feedback_tone16 = 0;
15065 mac_ctx->mlme_cfg->he_caps.dot11_he_cap.mu_feedback_tone16 = 0;
15066 mac_ctx->mlme_cfg->he_caps.dot11_he_cap.codebook_su = 0;
15067 mac_ctx->mlme_cfg->he_caps.dot11_he_cap.codebook_mu = 0;
15068 mac_ctx->mlme_cfg->he_caps.dot11_he_cap.ul_2x996_tone_ru_supp = 0;
15069 mac_ctx->mlme_cfg->he_caps.dot11_he_cap.beamforming_feedback = 0;
15070 mac_ctx->mlme_cfg->he_caps.dot11_he_cap.he_er_su_ppdu = 0;
15071 mac_ctx->mlme_cfg->he_caps.dot11_he_cap.dl_mu_mimo_part_bw = 0;
Kiran Kumar Lokere921b5a52019-02-24 21:53:20 -080015072 csr_update_session_he_cap(mac_ctx, session);
15073}
15074
15075void sme_reset_he_caps(mac_handle_t mac_handle, uint8_t vdev_id)
15076{
15077 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
15078 struct csr_roam_session *session;
15079
15080 session = CSR_GET_SESSION(mac_ctx, vdev_id);
15081
15082 if (!session) {
15083 sme_err("No session for id %d", vdev_id);
15084 return;
15085 }
15086 sme_debug("reset HE caps");
15087 mac_ctx->mlme_cfg->he_caps.dot11_he_cap =
15088 mac_ctx->mlme_cfg->he_caps.he_cap_orig;
15089 csr_update_session_he_cap(mac_ctx, session);
15090}
15091#endif
15092
Naveen Rawatfa2a1002018-05-17 16:06:37 -070015093uint8_t sme_get_mcs_idx(uint16_t max_rate, uint8_t rate_flags,
Hanumanth Reddy Pothula834f9432018-05-30 14:20:32 +053015094 uint8_t *nss, uint8_t *mcs_rate_flags)
Naveen Rawatfa2a1002018-05-17 16:06:37 -070015095{
15096 return wma_get_mcs_idx(max_rate, rate_flags, nss, mcs_rate_flags);
15097}
Chaoli Zhou75b062f2018-06-11 12:36:54 +080015098
Jeff Johnsonc7309062018-11-09 20:59:42 -080015099bool sme_find_session_by_bssid(mac_handle_t mac_handle, uint8_t *bssid)
Chaoli Zhou75b062f2018-06-11 12:36:54 +080015100{
Jeff Johnson0a8786a2018-12-02 10:49:01 -080015101 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Chaoli Zhou75b062f2018-06-11 12:36:54 +080015102 bool ret;
15103
15104 ret = csr_find_session_by_bssid(mac_ctx, bssid);
15105
15106 return ret;
15107}
Rajeev Kumar Sirasanagandla4f20b672018-03-12 13:52:50 +053015108
Krunal Soni5e483782018-10-25 15:42:44 -070015109#ifdef FEATURE_WLAN_DIAG_SUPPORT_CSR
15110QDF_STATUS sme_get_sta_cxn_info(mac_handle_t mac_handle, uint32_t session_id,
15111 char *buf, uint32_t buf_sz)
15112{
15113 QDF_STATUS status;
15114 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
15115 struct tagCsrRoamConnectedProfile *conn_profile;
15116 struct csr_roam_session *session = CSR_GET_SESSION(mac_ctx, session_id);
15117
15118 status = sme_acquire_global_lock(&mac_ctx->sme);
15119 if (!QDF_IS_STATUS_SUCCESS(status))
15120 return status;
15121 if (!session || !session->pCurRoamProfile) {
15122 status = QDF_STATUS_E_FAILURE;
15123 goto end;
15124 }
15125 conn_profile = &session->connectedProfile;
15126 if (!conn_profile) {
15127 status = QDF_STATUS_E_FAILURE;
15128 goto end;
15129 }
15130 csr_get_sta_cxn_info(mac_ctx, session, conn_profile, buf, buf_sz);
15131end:
15132 sme_release_global_lock(&mac_ctx->sme);
15133
15134 return status;
15135}
15136#endif
Rajeev Kumar Sirasanagandla4f20b672018-03-12 13:52:50 +053015137QDF_STATUS
Jeff Johnsonc7309062018-11-09 20:59:42 -080015138sme_get_roam_scan_stats(mac_handle_t mac_handle,
15139 roam_scan_stats_cb cb, void *context,
Rajeev Kumar Sirasanagandla4f20b672018-03-12 13:52:50 +053015140 uint32_t vdev_id)
15141{
15142 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080015143 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Rajeev Kumar Sirasanagandla4f20b672018-03-12 13:52:50 +053015144 struct scheduler_msg msg = {0};
15145 struct sir_roam_scan_stats *req;
15146
15147 req = qdf_mem_malloc(sizeof(*req));
Arif Hussain0ef77082018-10-10 16:42:53 -070015148 if (!req)
Rajeev Kumar Sirasanagandla4f20b672018-03-12 13:52:50 +053015149 return QDF_STATUS_E_NOMEM;
Rajeev Kumar Sirasanagandla4f20b672018-03-12 13:52:50 +053015150
15151 req->vdev_id = vdev_id;
15152 req->cb = cb;
15153 req->context = context;
15154
15155 status = sme_acquire_global_lock(&mac->sme);
15156 if (QDF_IS_STATUS_SUCCESS(status)) {
15157 msg.bodyptr = req;
15158 msg.type = WMA_GET_ROAM_SCAN_STATS;
15159 msg.reserved = 0;
gaurank kathpalia36b0c582018-08-28 17:45:43 +053015160 status = scheduler_post_message(QDF_MODULE_ID_SME,
15161 QDF_MODULE_ID_WMA,
15162 QDF_MODULE_ID_WMA,
15163 &msg);
Rajeev Kumar Sirasanagandla4f20b672018-03-12 13:52:50 +053015164 sme_release_global_lock(&mac->sme);
15165 if (!QDF_IS_STATUS_SUCCESS(status)) {
15166 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
15167 FL("post roam scan stats req failed"));
15168 status = QDF_STATUS_E_FAILURE;
15169 qdf_mem_free(req);
15170 }
15171 } else {
Rajeev Kumar Sirasanagandla4f20b672018-03-12 13:52:50 +053015172 qdf_mem_free(req);
15173 }
15174
15175 return status;
15176}
Vignesh Viswanathan987f0bb2018-09-17 17:00:29 +053015177
Jeff Johnsonc7309062018-11-09 20:59:42 -080015178void sme_update_score_config(mac_handle_t mac_handle,
Vignesh Viswanathan987f0bb2018-09-17 17:00:29 +053015179 struct scoring_config *score_config)
15180{
Jeff Johnson0a8786a2018-12-02 10:49:01 -080015181 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Vignesh Viswanathan987f0bb2018-09-17 17:00:29 +053015182 struct wlan_mlme_scoring_cfg *mlme_scoring_cfg;
15183
15184 mlme_scoring_cfg = &mac_ctx->mlme_cfg->scoring;
15185
15186 score_config->weight_cfg.rssi_weightage =
15187 mlme_scoring_cfg->weight_cfg.rssi_weightage;
15188 score_config->weight_cfg.ht_caps_weightage =
15189 mlme_scoring_cfg->weight_cfg.ht_caps_weightage;
15190 score_config->weight_cfg.vht_caps_weightage =
15191 mlme_scoring_cfg->weight_cfg.vht_caps_weightage;
15192 score_config->weight_cfg.he_caps_weightage =
15193 mlme_scoring_cfg->weight_cfg.he_caps_weightage;
15194 score_config->weight_cfg.chan_width_weightage =
15195 mlme_scoring_cfg->weight_cfg.chan_width_weightage;
15196 score_config->weight_cfg.chan_band_weightage =
15197 mlme_scoring_cfg->weight_cfg.chan_band_weightage;
15198 score_config->weight_cfg.nss_weightage =
15199 mlme_scoring_cfg->weight_cfg.nss_weightage;
15200 score_config->weight_cfg.beamforming_cap_weightage =
15201 mlme_scoring_cfg->weight_cfg.beamforming_cap_weightage;
15202 score_config->weight_cfg.pcl_weightage =
15203 mlme_scoring_cfg->weight_cfg.pcl_weightage;
15204 score_config->weight_cfg.channel_congestion_weightage =
15205 mlme_scoring_cfg->weight_cfg.channel_congestion_weightage;
15206 score_config->weight_cfg.oce_wan_weightage =
15207 mlme_scoring_cfg->weight_cfg.oce_wan_weightage;
15208
15209 score_config->bandwidth_weight_per_index =
15210 mlme_scoring_cfg->bandwidth_weight_per_index;
15211 score_config->nss_weight_per_index =
15212 mlme_scoring_cfg->nss_weight_per_index;
15213 score_config->band_weight_per_index =
15214 mlme_scoring_cfg->band_weight_per_index;
15215
15216 score_config->rssi_score.best_rssi_threshold =
15217 mlme_scoring_cfg->rssi_score.best_rssi_threshold;
15218 score_config->rssi_score.good_rssi_threshold =
15219 mlme_scoring_cfg->rssi_score.good_rssi_threshold;
15220 score_config->rssi_score.bad_rssi_threshold =
15221 mlme_scoring_cfg->rssi_score.bad_rssi_threshold;
15222 score_config->rssi_score.good_rssi_pcnt =
15223 mlme_scoring_cfg->rssi_score.good_rssi_pcnt;
15224 score_config->rssi_score.bad_rssi_pcnt =
15225 mlme_scoring_cfg->rssi_score.bad_rssi_pcnt;
15226 score_config->rssi_score.good_rssi_bucket_size =
15227 mlme_scoring_cfg->rssi_score.good_rssi_bucket_size;
15228 score_config->rssi_score.bad_rssi_bucket_size =
15229 mlme_scoring_cfg->rssi_score.bad_rssi_bucket_size;
15230 score_config->rssi_score.rssi_pref_5g_rssi_thresh =
15231 mlme_scoring_cfg->rssi_score.rssi_pref_5g_rssi_thresh;
15232
15233 score_config->esp_qbss_scoring.num_slot =
15234 mlme_scoring_cfg->esp_qbss_scoring.num_slot;
15235 score_config->esp_qbss_scoring.score_pcnt3_to_0 =
15236 mlme_scoring_cfg->esp_qbss_scoring.score_pcnt3_to_0;
15237 score_config->esp_qbss_scoring.score_pcnt7_to_4 =
15238 mlme_scoring_cfg->esp_qbss_scoring.score_pcnt7_to_4;
15239 score_config->esp_qbss_scoring.score_pcnt11_to_8 =
15240 mlme_scoring_cfg->esp_qbss_scoring.score_pcnt11_to_8;
15241 score_config->esp_qbss_scoring.score_pcnt15_to_12 =
15242 mlme_scoring_cfg->esp_qbss_scoring.score_pcnt15_to_12;
15243
15244 score_config->oce_wan_scoring.num_slot =
15245 mlme_scoring_cfg->oce_wan_scoring.num_slot;
15246 score_config->oce_wan_scoring.score_pcnt3_to_0 =
15247 mlme_scoring_cfg->oce_wan_scoring.score_pcnt3_to_0;
15248 score_config->oce_wan_scoring.score_pcnt7_to_4 =
15249 mlme_scoring_cfg->oce_wan_scoring.score_pcnt7_to_4;
15250 score_config->oce_wan_scoring.score_pcnt11_to_8 =
15251 mlme_scoring_cfg->oce_wan_scoring.score_pcnt11_to_8;
15252 score_config->oce_wan_scoring.score_pcnt15_to_12 =
15253 mlme_scoring_cfg->oce_wan_scoring.score_pcnt15_to_12;
15254}
lifengfaa83cb2018-11-24 01:53:56 +080015255
15256void sme_enable_fw_module_log_level(mac_handle_t mac_handle, int vdev_id)
15257{
15258 QDF_STATUS status;
15259 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
15260 uint8_t *enable_fw_module_log_level;
15261 uint8_t enable_fw_module_log_level_num;
15262 uint8_t count = 0;
15263 uint32_t value = 0;
15264 int ret;
15265
15266 status = ucfg_fwol_get_enable_fw_module_log_level(
15267 mac_ctx->psoc, &enable_fw_module_log_level,
15268 &enable_fw_module_log_level_num);
15269 if (QDF_IS_STATUS_ERROR(status))
15270 return;
15271
15272 while (count < enable_fw_module_log_level_num) {
15273 /*
15274 * FW module log level input array looks like
15275 * below:
15276 * enable_fw_module_log_level = {<FW Module ID>,
15277 * <Log Level>,...}
15278 * For example:
15279 * enable_fw_module_log_level=
15280 * {1,0,2,1,3,2,4,3,5,4,6,5,7,6}
15281 * Above input array means :
15282 * For FW module ID 1 enable log level 0
15283 * For FW module ID 2 enable log level 1
15284 * For FW module ID 3 enable log level 2
15285 * For FW module ID 4 enable log level 3
15286 * For FW module ID 5 enable log level 4
15287 * For FW module ID 6 enable log level 5
15288 * For FW module ID 7 enable log level 6
15289 */
15290
15291 if ((enable_fw_module_log_level[count] > WLAN_MODULE_ID_MAX) ||
15292 (enable_fw_module_log_level[count + 1] > DBGLOG_LVL_MAX)) {
15293 sme_err("Module id %d or dbglog level %d input value is more than max",
15294 enable_fw_module_log_level[count],
15295 enable_fw_module_log_level[count + 1]);
wadesongeb865bb2019-01-09 19:01:06 +080015296 count += 2;
lifengfaa83cb2018-11-24 01:53:56 +080015297 continue;
15298 }
15299
15300 value = enable_fw_module_log_level[count] << 16;
15301 value |= enable_fw_module_log_level[count + 1];
15302 ret = sme_cli_set_command(vdev_id,
15303 WMI_DBGLOG_MOD_LOG_LEVEL,
15304 value, DBG_CMD);
15305 if (ret != 0)
15306 sme_err("Failed to enable FW module log level %d ret %d",
15307 value, ret);
15308
15309 count += 2;
15310 }
15311}
Visweswara Tanuku633976b2019-01-07 16:13:12 +053015312
15313#ifdef WLAN_FEATURE_MOTION_DETECTION
15314/**
15315 * sme_set_md_host_evt_cb - Register/set motion detection callback
15316 * @mac_handle: mac handle
15317 * @callback_fn: motion detection callback function pointer
15318 * @hdd_ctx: hdd context
15319 *
15320 * Return: QDF_STATUS_SUCCESS or non-zero on failure
15321 */
15322QDF_STATUS sme_set_md_host_evt_cb(
15323 mac_handle_t mac_handle,
15324 QDF_STATUS (*callback_fn)(void *ctx, struct sir_md_evt *event),
15325 void *hdd_ctx
15326)
15327{
15328 struct mac_context *mac = MAC_CONTEXT(mac_handle);
15329 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
15330
15331 qdf_status = sme_acquire_global_lock(&mac->sme);
15332 if (QDF_IS_STATUS_SUCCESS(qdf_status)) {
15333 mac->sme.md_host_evt_cb = callback_fn;
15334 mac->sme.md_ctx = hdd_ctx;
15335 sme_release_global_lock(&mac->sme);
15336 }
15337 return qdf_status;
15338}
15339
15340/**
15341 * sme_motion_det_config - Post motion detection configuration msg to scheduler
15342 * @mac_handle: mac handle
15343 * @motion_det_config: motion detection configuration
15344 *
15345 * Return: QDF_STATUS_SUCCESS or non-zero on failure
15346 */
15347QDF_STATUS sme_motion_det_config(mac_handle_t mac_handle,
15348 struct sme_motion_det_cfg *motion_det_config)
15349{
Visweswara Tanuku025f5862019-01-08 17:35:33 +053015350 struct scheduler_msg msg;
Visweswara Tanuku633976b2019-01-07 16:13:12 +053015351 struct sme_motion_det_cfg *motion_det_cfg;
15352 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
15353 struct mac_context *mac = MAC_CONTEXT(mac_handle);
15354
15355 qdf_status = sme_acquire_global_lock(&mac->sme);
15356 if (QDF_IS_STATUS_SUCCESS(qdf_status)) {
15357 motion_det_cfg =
15358 qdf_mem_malloc(sizeof(*motion_det_cfg));
15359 if (!motion_det_cfg) {
15360 sme_release_global_lock(&mac->sme);
15361 return QDF_STATUS_E_NOMEM;
15362 }
15363
15364 *motion_det_cfg = *motion_det_config;
15365
15366 qdf_mem_set(&msg, sizeof(msg), 0);
15367 msg.type = WMA_SET_MOTION_DET_CONFIG;
15368 msg.bodyptr = motion_det_cfg;
15369
15370 qdf_status = scheduler_post_message(QDF_MODULE_ID_SME,
15371 QDF_MODULE_ID_WMA,
15372 QDF_MODULE_ID_WMA,
15373 &msg);
15374 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
15375 qdf_mem_free(motion_det_cfg);
15376 qdf_status = QDF_STATUS_E_FAILURE;
15377 }
15378 sme_release_global_lock(&mac->sme);
15379 }
15380 return qdf_status;
15381}
15382
15383/**
15384 * sme_motion_det_enable - Post motion detection start/stop msg to scheduler
15385 * @mac_handle: mac handle
15386 * @motion_det_enable: motion detection start/stop
15387 *
15388 * Return: QDF_STATUS_SUCCESS or non-zero on failure
15389 */
15390QDF_STATUS sme_motion_det_enable(mac_handle_t mac_handle,
15391 struct sme_motion_det_en *motion_det_enable)
15392{
Visweswara Tanuku025f5862019-01-08 17:35:33 +053015393 struct scheduler_msg msg;
Visweswara Tanuku633976b2019-01-07 16:13:12 +053015394 struct sme_motion_det_en *motion_det_en;
15395 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
15396 struct mac_context *mac = MAC_CONTEXT(mac_handle);
15397
15398 qdf_status = sme_acquire_global_lock(&mac->sme);
15399 if (QDF_IS_STATUS_SUCCESS(qdf_status)) {
15400 motion_det_en = qdf_mem_malloc(sizeof(*motion_det_en));
15401 if (!motion_det_en) {
15402 sme_release_global_lock(&mac->sme);
15403 return QDF_STATUS_E_NOMEM;
15404 }
15405
15406 *motion_det_en = *motion_det_enable;
15407
15408 qdf_mem_set(&msg, sizeof(msg), 0);
15409 msg.type = WMA_SET_MOTION_DET_ENABLE;
15410 msg.bodyptr = motion_det_en;
15411
15412 qdf_status = scheduler_post_message(QDF_MODULE_ID_SME,
15413 QDF_MODULE_ID_WMA,
15414 QDF_MODULE_ID_WMA,
15415 &msg);
15416 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
15417 qdf_mem_free(motion_det_en);
15418 qdf_status = QDF_STATUS_E_FAILURE;
15419 }
15420 sme_release_global_lock(&mac->sme);
15421 }
15422 return qdf_status;
15423}
15424
15425/**
15426 * sme_motion_det_base_line_config - Post md baselining cfg msg to scheduler
15427 * @mac_handle: mac handle
15428 * @motion_det_base_line_config: motion detection baselining configuration
15429 *
15430 * Return: QDF_STATUS_SUCCESS or non-zero on failure
15431 */
15432QDF_STATUS sme_motion_det_base_line_config(
15433 mac_handle_t mac_handle,
15434 struct sme_motion_det_base_line_cfg *motion_det_base_line_config)
15435{
Visweswara Tanuku025f5862019-01-08 17:35:33 +053015436 struct scheduler_msg msg;
Visweswara Tanuku633976b2019-01-07 16:13:12 +053015437 struct sme_motion_det_base_line_cfg *motion_det_base_line_cfg;
15438 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
15439 struct mac_context *mac = MAC_CONTEXT(mac_handle);
15440
15441 qdf_status = sme_acquire_global_lock(&mac->sme);
15442 if (QDF_IS_STATUS_SUCCESS(qdf_status)) {
15443 motion_det_base_line_cfg =
15444 qdf_mem_malloc(sizeof(*motion_det_base_line_cfg));
15445
15446 if (!motion_det_base_line_cfg) {
15447 sme_release_global_lock(&mac->sme);
15448 return QDF_STATUS_E_NOMEM;
15449 }
15450
15451 *motion_det_base_line_cfg = *motion_det_base_line_config;
15452
Visweswara Tanuku025f5862019-01-08 17:35:33 +053015453 qdf_mem_set(&msg, sizeof(msg), 0);
Visweswara Tanuku633976b2019-01-07 16:13:12 +053015454 msg.type = WMA_SET_MOTION_DET_BASE_LINE_CONFIG;
15455 msg.bodyptr = motion_det_base_line_cfg;
15456
15457 qdf_status = scheduler_post_message(QDF_MODULE_ID_SME,
15458 QDF_MODULE_ID_WMA,
15459 QDF_MODULE_ID_WMA,
15460 &msg);
15461 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
15462 qdf_mem_free(motion_det_base_line_cfg);
15463 qdf_status = QDF_STATUS_E_FAILURE;
15464 }
15465 sme_release_global_lock(&mac->sme);
15466 }
15467 return qdf_status;
15468}
15469
15470/**
15471 * sme_motion_det_base_line_enable - Post md baselining enable msg to scheduler
15472 * @mac_handle: mac handle
15473 * @motion_det_base_line_enable: motion detection baselining start/stop
15474 *
15475 * Return: QDF_STATUS_SUCCESS or non-zero on failure
15476 */
15477QDF_STATUS sme_motion_det_base_line_enable(
15478 mac_handle_t mac_handle,
15479 struct sme_motion_det_base_line_en *motion_det_base_line_enable)
15480{
Visweswara Tanuku025f5862019-01-08 17:35:33 +053015481 struct scheduler_msg msg;
Visweswara Tanuku633976b2019-01-07 16:13:12 +053015482 struct sme_motion_det_base_line_en *motion_det_base_line_en;
15483 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
15484 struct mac_context *mac = MAC_CONTEXT(mac_handle);
15485
15486 qdf_status = sme_acquire_global_lock(&mac->sme);
15487 if (QDF_IS_STATUS_SUCCESS(qdf_status)) {
15488 motion_det_base_line_en =
15489 qdf_mem_malloc(sizeof(*motion_det_base_line_en));
15490
15491 if (!motion_det_base_line_en) {
15492 sme_release_global_lock(&mac->sme);
15493 return QDF_STATUS_E_NOMEM;
15494 }
15495
15496 *motion_det_base_line_en = *motion_det_base_line_enable;
15497
Visweswara Tanuku025f5862019-01-08 17:35:33 +053015498 qdf_mem_set(&msg, sizeof(msg), 0);
Visweswara Tanuku633976b2019-01-07 16:13:12 +053015499 msg.type = WMA_SET_MOTION_DET_BASE_LINE_ENABLE;
15500 msg.bodyptr = motion_det_base_line_en;
15501
15502 qdf_status = scheduler_post_message(QDF_MODULE_ID_SME,
15503 QDF_MODULE_ID_WMA,
15504 QDF_MODULE_ID_WMA,
15505 &msg);
15506 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
15507 qdf_mem_free(motion_det_base_line_en);
15508 qdf_status = QDF_STATUS_E_FAILURE;
15509 }
15510 sme_release_global_lock(&mac->sme);
15511 }
15512 return qdf_status;
15513}
15514#endif /* WLAN_FEATURE_MOTION_DETECTION */
Visweswara Tanuku025f5862019-01-08 17:35:33 +053015515#ifdef FW_THERMAL_THROTTLE_SUPPORT
15516/**
15517 * sme_set_thermal_throttle_cfg() - SME API to set the thermal throttle
15518 * configuration parameters
15519 * @mac_handle: Opaque handle to the global MAC context
15520 * @enable: Enable Throttle
15521 * @dc: duty cycle in msecs
15522 * @dc_off_percent: duty cycle off percentage
15523 * @prio: Disables the transmit queues in fw that have lower priority
15524 * than value defined by prio
15525 * @target_temp: Target temperature
15526 *
15527 * Return: QDF_STATUS
15528 */
15529QDF_STATUS sme_set_thermal_throttle_cfg(mac_handle_t mac_handle, bool enable,
15530 uint32_t dc, uint32_t dc_off_percent,
15531 uint32_t prio, uint32_t target_temp)
15532{
15533 struct scheduler_msg msg;
15534 struct mac_context *mac = MAC_CONTEXT(mac_handle);
15535 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
15536 struct thermal_mitigation_params *therm_cfg_params;
15537
15538 qdf_status = sme_acquire_global_lock(&mac->sme);
15539 if (QDF_STATUS_SUCCESS == qdf_status) {
15540 therm_cfg_params = qdf_mem_malloc(sizeof(*therm_cfg_params));
15541 if (!therm_cfg_params) {
15542 sme_release_global_lock(&mac->sme);
15543 return QDF_STATUS_E_NOMEM;
15544 }
15545
15546 therm_cfg_params->enable = enable;
15547 therm_cfg_params->dc = dc;
15548 therm_cfg_params->levelconf[0].dcoffpercent = dc_off_percent;
15549 therm_cfg_params->levelconf[0].priority = prio;
15550 therm_cfg_params->levelconf[0].tmplwm = target_temp;
15551
15552 qdf_mem_set(&msg, sizeof(msg), 0);
15553 msg.type = WMA_SET_THERMAL_THROTTLE_CFG;
15554 msg.reserved = 0;
15555 msg.bodyptr = therm_cfg_params;
15556
15557 qdf_status = scheduler_post_message(QDF_MODULE_ID_SME,
15558 QDF_MODULE_ID_WMA,
15559 QDF_MODULE_ID_WMA, &msg);
15560 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
15561 qdf_mem_free(therm_cfg_params);
15562 qdf_status = QDF_STATUS_E_FAILURE;
15563 }
15564 sme_release_global_lock(&mac->sme);
15565 }
15566 return qdf_status;
15567}
15568
15569/**
15570 * sme_set_thermal_mgmt() - SME API to set the thermal management params
15571 * @mac_handle: Opaque handle to the global MAC context
15572 * @lower_thresh_deg: Lower threshold value of Temperature
15573 * @higher_thresh_deg: Higher threshold value of Temperature
15574 *
15575 * Return: QDF_STATUS
15576 */
15577QDF_STATUS sme_set_thermal_mgmt(mac_handle_t mac_handle,
15578 uint16_t lower_thresh_deg,
15579 uint16_t higher_thresh_deg)
15580{
15581 struct scheduler_msg msg;
15582 struct mac_context *mac = MAC_CONTEXT(mac_handle);
15583 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
15584 t_thermal_cmd_params *therm_mgmt_cmd;
15585
15586 qdf_status = sme_acquire_global_lock(&mac->sme);
15587 if (QDF_STATUS_SUCCESS == qdf_status) {
15588 therm_mgmt_cmd = qdf_mem_malloc(sizeof(*therm_mgmt_cmd));
15589 if (!therm_mgmt_cmd) {
15590 sme_release_global_lock(&mac->sme);
15591 return QDF_STATUS_E_NOMEM;
15592 }
15593
15594 therm_mgmt_cmd->minTemp = lower_thresh_deg;
15595 therm_mgmt_cmd->maxTemp = higher_thresh_deg;
15596 therm_mgmt_cmd->thermalEnable = 1;
15597
15598 qdf_mem_set(&msg, sizeof(msg), 0);
15599 msg.type = WMA_SET_THERMAL_MGMT;
15600 msg.reserved = 0;
15601 msg.bodyptr = therm_mgmt_cmd;
15602
15603 qdf_status = scheduler_post_message(QDF_MODULE_ID_SME,
15604 QDF_MODULE_ID_WMA,
15605 QDF_MODULE_ID_WMA, &msg);
15606 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
15607 qdf_mem_free(therm_mgmt_cmd);
15608 qdf_status = QDF_STATUS_E_FAILURE;
15609 }
15610 sme_release_global_lock(&mac->sme);
15611 }
15612 return qdf_status;
15613}
15614#endif /* FW_THERMAL_THROTTLE_SUPPORT */
Abhinav Kumar338e57d2019-02-04 17:30:10 +053015615
15616QDF_STATUS sme_update_hidden_ssid_status_cb(mac_handle_t mac_handle,
15617 hidden_ssid_cb cb)
15618{
15619 QDF_STATUS status;
15620 struct mac_context *mac = MAC_CONTEXT(mac_handle);
15621
15622 status = sme_acquire_global_lock(&mac->sme);
15623 if (QDF_IS_STATUS_SUCCESS(status)) {
15624 mac->sme.hidden_ssid_cb = cb;
15625 sme_release_global_lock(&mac->sme);
15626 }
15627
15628 return status;
15629}
Min Liu0daa0982019-02-01 17:50:44 +080015630
15631QDF_STATUS sme_update_owe_info(struct mac_context *mac,
15632 struct assoc_ind *assoc_ind)
15633{
15634 QDF_STATUS status;
15635
15636 status = sme_acquire_global_lock(&mac->sme);
15637 if (QDF_IS_STATUS_SUCCESS(status)) {
15638 status = csr_update_owe_info(mac, assoc_ind);
15639 sme_release_global_lock(&mac->sme);
15640 }
15641
15642 return status;
15643}
Arun Kumar Khandavallideda5a82019-03-11 15:32:19 +053015644
15645#ifdef WLAN_MWS_INFO_DEBUGFS
15646QDF_STATUS
15647sme_get_mws_coex_info(mac_handle_t mac_handle, uint32_t vdev_id,
15648 uint32_t cmd_id, void (*callback_fn)(void *coex_info_data,
15649 void *context,
15650 wmi_mws_coex_cmd_id
15651 cmd_id),
15652 void *context)
15653{
15654 QDF_STATUS status = QDF_STATUS_E_FAILURE;
15655 struct mac_context *mac = MAC_CONTEXT(mac_handle);
15656 struct scheduler_msg msg = {0};
15657 struct sir_get_mws_coex_info *req;
15658
15659 req = qdf_mem_malloc(sizeof(*req));
15660 if (!req) {
15661 sme_err("Failed allocate memory for MWS coex info req");
15662 return QDF_STATUS_E_NOMEM;
15663 }
15664
15665 req->vdev_id = vdev_id;
15666 req->cmd_id = cmd_id;
15667 mac->sme.mws_coex_info_state_resp_callback = callback_fn;
15668 mac->sme.mws_coex_info_ctx = context;
15669 status = sme_acquire_global_lock(&mac->sme);
15670 if (QDF_IS_STATUS_SUCCESS(status)) {
15671 msg.bodyptr = req;
15672 msg.type = WMA_GET_MWS_COEX_INFO_REQ;
15673 status = scheduler_post_message(QDF_MODULE_ID_SME,
15674 QDF_MODULE_ID_WMA,
15675 QDF_MODULE_ID_WMA,
15676 &msg);
15677 sme_release_global_lock(&mac->sme);
15678 if (!QDF_IS_STATUS_SUCCESS(status)) {
15679 sme_err("post MWS coex info req failed");
15680 status = QDF_STATUS_E_FAILURE;
15681 qdf_mem_free(req);
15682 }
15683 } else {
15684 sme_err("sme_acquire_global_lock failed");
15685 qdf_mem_free(req);
15686 }
15687
15688 return status;
15689}
15690#endif /* WLAN_MWS_INFO_DEBUGFS */
Abhinav Kumar0ed614c2019-04-11 22:11:47 +053015691
15692#ifdef WLAN_BCN_RECV_FEATURE
15693/**
15694 * sme_scan_event_handler() - Scan complete event handler
15695 * @vdev: vdev obj manager
15696 * @event: scan event
15697 * @arg: arg of scan event
15698 *
15699 * This function is getting called after Host receive scan start
15700 *
15701 * Return: None
15702 */
15703static void sme_scan_event_handler(struct wlan_objmgr_vdev *vdev,
15704 struct scan_event *event,
15705 void *arg)
15706{
15707 struct mac_context *mac = arg;
15708 struct csr_roam_session *session;
15709
15710 if (!mac) {
15711 sme_err("Invalid mac context");
15712 return;
15713 }
15714
15715 if (!CSR_IS_SESSION_VALID(mac, vdev->vdev_objmgr.vdev_id)) {
15716 sme_err("Invalid vdev_id: %d", vdev->vdev_objmgr.vdev_id);
15717 return;
15718 }
15719
15720 session = CSR_GET_SESSION(mac, vdev->vdev_objmgr.vdev_id);
15721
15722 if (event->type == SCAN_EVENT_TYPE_STARTED) {
15723 if (mac->sme.beacon_pause_cb)
15724 mac->sme.beacon_pause_cb(mac->hdd_handle,
Abhinav Kumar39222152019-05-13 23:53:40 +053015725 vdev->vdev_objmgr.vdev_id, event->type, false);
Abhinav Kumar0ed614c2019-04-11 22:11:47 +053015726 }
15727}
15728
15729QDF_STATUS sme_register_bcn_recv_pause_ind_cb(mac_handle_t mac_handle,
15730 beacon_pause_cb cb)
15731{
15732 QDF_STATUS status;
15733 struct mac_context *mac = MAC_CONTEXT(mac_handle);
15734
15735 if (!mac) {
15736 sme_err("Invalid mac context");
15737 return QDF_STATUS_E_NOMEM;
15738 }
15739
Abhinav Kumar39222152019-05-13 23:53:40 +053015740 /* scan event de-registration */
15741 if (!cb) {
15742 ucfg_scan_unregister_event_handler(mac->pdev,
15743 sme_scan_event_handler, mac);
15744 return QDF_STATUS_SUCCESS;
15745 }
Abhinav Kumar0ed614c2019-04-11 22:11:47 +053015746 status = sme_acquire_global_lock(&mac->sme);
15747 if (QDF_IS_STATUS_SUCCESS(status)) {
15748 mac->sme.beacon_pause_cb = cb;
15749 sme_release_global_lock(&mac->sme);
15750 }
15751
15752 /* scan event registration */
15753 status = ucfg_scan_register_event_handler(mac->pdev,
15754 sme_scan_event_handler, mac);
15755 if (QDF_IS_STATUS_ERROR(status))
15756 sme_err("scan event register failed ");
15757
15758 return status;
15759}
15760#endif