blob: 72b5a857a9323bdc5ee5322215d19cdccfdb43db [file] [log] [blame]
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001/*
gaurank kathpalia570f0af2019-12-19 19:42:44 +05302 * Copyright (c) 2012-2020 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 */
gaurank kathpalia570f0af2019-12-19 19:42:44 +0530202 if (param->status == SET_HW_MODE_STATUS_OK ||
203 param->status == SET_HW_MODE_STATUS_ALREADY) {
Srinivas Girigowda2c263352017-03-17 17:49:53 -0700204 sme_debug("search for ssid success");
Sandeep Puligillaa330c8c2017-03-09 18:03:21 -0800205 csr_scan_handle_search_for_ssid(mac,
206 session_id);
207 } else {
Srinivas Girigowda2c263352017-03-17 17:49:53 -0700208 sme_debug("search for ssid failure");
Sandeep Puligillaa330c8c2017-03-09 18:03:21 -0800209 csr_scan_handle_search_for_ssid_failure(mac,
210 session_id);
211 }
Deepak Dhamdhere6f7fbbe2017-02-28 13:35:52 -0800212 csr_saved_scan_cmd_free_fields(mac, session);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800213 }
Abhishek Singhbc4261f2019-03-14 13:21:57 +0530214 if (reason == POLICY_MGR_UPDATE_REASON_CHANNEL_SWITCH_STA) {
Abhishek Singh25475122019-07-03 17:28:34 +0530215 sme_info("Continue channel switch for STA");
Abhishek Singhbc4261f2019-03-14 13:21:57 +0530216 csr_sta_continue_csa(mac, session_id);
217 }
Abhishek Singh25475122019-07-03 17:28:34 +0530218
219 if (reason == POLICY_MGR_UPDATE_REASON_CHANNEL_SWITCH) {
220 sme_info("Continue channel switch for SAP");
221 csr_csa_restart(mac, session_id);
222 }
Rajasekaran Kalidoss869bc4a2018-11-20 20:35:14 +0530223 if (reason == POLICY_MGR_UPDATE_REASON_LFR2_ROAM)
224 csr_continue_lfr2_connect(mac, session_id);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800225
Chandrasekaran, Manishekaref70c0d2015-10-20 19:54:55 +0530226end:
Krunal Soni72dba662017-02-15 20:13:17 -0800227 found = csr_nonscan_active_ll_remove_entry(mac, entry,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800228 LL_ACCESS_LOCK);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +0530229 if (found)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800230 /* Now put this command back on the avilable command list */
Krunal Soni78618d92017-02-14 21:46:31 -0800231 csr_release_command(mac, command);
Krunal Sonia8270f52017-02-23 19:51:25 -0800232
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530233 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800234}
235
236/**
237 * sme_process_hw_mode_trans_ind() - Process HW mode transition indication
238 * @mac: Global MAC pointer
239 * @msg: HW mode transition response
240 *
241 * Processes the HW mode transition indication and invoke the HDD callback
242 * to process further
243 */
Jeff Johnson0a8786a2018-12-02 10:49:01 -0800244static QDF_STATUS sme_process_hw_mode_trans_ind(struct mac_context *mac,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800245 uint8_t *msg)
246{
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800247 struct sir_hw_mode_trans_ind *param;
248
249 param = (struct sir_hw_mode_trans_ind *)msg;
250 if (!param) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -0700251 sme_err("HW mode trans ind param is NULL");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530252 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800253 }
254
Tushnim Bhattacharyya0c4ad2d2017-03-09 15:59:03 -0800255 policy_mgr_hw_mode_transition_cb(param->old_hw_mode_index,
Tushnim Bhattacharyya9e81b4c2017-02-15 17:11:14 -0800256 param->new_hw_mode_index,
257 param->num_vdev_mac_entries,
Tushnim Bhattacharyya0c4ad2d2017-03-09 15:59:03 -0800258 param->vdev_mac_map, mac->psoc);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800259
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530260 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800261}
262
Abhishek Singh0d0568a2018-11-22 15:01:51 +0530263void sme_purge_pdev_all_ser_cmd_list(mac_handle_t mac_handle)
264{
265 QDF_STATUS status;
Jeff Johnson0a8786a2018-12-02 10:49:01 -0800266 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Abhishek Singh0d0568a2018-11-22 15:01:51 +0530267
268 status = sme_acquire_global_lock(&mac_ctx->sme);
269 if (QDF_IS_STATUS_ERROR(status))
270 return;
271
272 csr_purge_pdev_all_ser_cmd_list(mac_ctx);
273 sme_release_global_lock(&mac_ctx->sme);
274}
275
Naveen Rawate7d86052015-11-13 12:01:43 -0800276/**
277 * free_sme_cmds() - This function frees memory allocated for SME commands
278 * @mac_ctx: Pointer to Global MAC structure
279 *
280 * This function frees memory allocated for SME commands
281 *
282 * @Return: void
283 */
Jeff Johnson0a8786a2018-12-02 10:49:01 -0800284static void free_sme_cmds(struct mac_context *mac_ctx)
Naveen Rawate7d86052015-11-13 12:01:43 -0800285{
286 uint32_t idx;
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +0530287
Jeff Johnson19353172019-02-17 12:53:46 -0800288 if (!mac_ctx->sme.sme_cmd_buf_addr)
Naveen Rawate7d86052015-11-13 12:01:43 -0800289 return;
290
Jeff Johnson2a84c532019-02-17 12:22:04 -0800291 for (idx = 0; idx < mac_ctx->sme.sme_cmd_count; idx++)
Jeff Johnson19353172019-02-17 12:53:46 -0800292 qdf_mem_free(mac_ctx->sme.sme_cmd_buf_addr[idx]);
Naveen Rawate7d86052015-11-13 12:01:43 -0800293
Jeff Johnson19353172019-02-17 12:53:46 -0800294 qdf_mem_free(mac_ctx->sme.sme_cmd_buf_addr);
295 mac_ctx->sme.sme_cmd_buf_addr = NULL;
Naveen Rawate7d86052015-11-13 12:01:43 -0800296}
297
Jeff Johnson0a8786a2018-12-02 10:49:01 -0800298static QDF_STATUS init_sme_cmd_list(struct mac_context *mac)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800299{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530300 QDF_STATUS status;
Jeff Johnson19353172019-02-17 12:53:46 -0800301 tSmeCmd *cmd;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800302 uint32_t cmd_idx;
Naveen Rawate7d86052015-11-13 12:01:43 -0800303 uint32_t sme_cmd_ptr_ary_sz;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800304
Jeff Johnson2a84c532019-02-17 12:22:04 -0800305 mac->sme.sme_cmd_count = SME_TOTAL_COMMAND;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800306
Jeff Johnsonea9f3d72019-02-17 13:27:55 -0800307 status = csr_ll_open(&mac->sme.sme_cmd_freelist);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530308 if (!QDF_IS_STATUS_SUCCESS(status))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800309 goto end;
310
Naveen Rawate7d86052015-11-13 12:01:43 -0800311 /* following pointer contains array of pointers for tSmeCmd* */
Jeff Johnson2a84c532019-02-17 12:22:04 -0800312 sme_cmd_ptr_ary_sz = sizeof(void *) * mac->sme.sme_cmd_count;
Jeff Johnson19353172019-02-17 12:53:46 -0800313 mac->sme.sme_cmd_buf_addr = qdf_mem_malloc(sme_cmd_ptr_ary_sz);
314 if (!mac->sme.sme_cmd_buf_addr) {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530315 status = QDF_STATUS_E_NOMEM;
Naveen Rawate7d86052015-11-13 12:01:43 -0800316 goto end;
317 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800318
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530319 status = QDF_STATUS_SUCCESS;
Jeff Johnson2a84c532019-02-17 12:22:04 -0800320 for (cmd_idx = 0; cmd_idx < mac->sme.sme_cmd_count; cmd_idx++) {
Naveen Rawate7d86052015-11-13 12:01:43 -0800321 /*
322 * Since total size of all commands together can be huge chunk
323 * of memory, allocate SME cmd individually. These SME CMDs are
324 * moved between pending and active queues. And these freeing of
325 * these queues just manipulates the list but does not actually
326 * frees SME CMD pointers. Hence store each SME CMD address in
Jeff Johnson19353172019-02-17 12:53:46 -0800327 * the array, sme.sme_cmd_buf_addr. This will later facilitate
Naveen Rawate7d86052015-11-13 12:01:43 -0800328 * freeing up of all SME CMDs with just a for loop.
329 */
Jeff Johnson19353172019-02-17 12:53:46 -0800330 cmd = qdf_mem_malloc(sizeof(*cmd));
331 if (!cmd) {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530332 status = QDF_STATUS_E_NOMEM;
Jeff Johnson01f2c232018-11-21 19:17:44 -0800333 free_sme_cmds(mac);
Naveen Rawate7d86052015-11-13 12:01:43 -0800334 goto end;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800335 }
Jeff Johnson19353172019-02-17 12:53:46 -0800336 mac->sme.sme_cmd_buf_addr[cmd_idx] = cmd;
Jeff Johnsonea9f3d72019-02-17 13:27:55 -0800337 csr_ll_insert_tail(&mac->sme.sme_cmd_freelist,
Jeff Johnson19353172019-02-17 12:53:46 -0800338 &cmd->Link, LL_ACCESS_LOCK);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800339 }
340
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800341end:
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530342 if (!QDF_IS_STATUS_SUCCESS(status))
Srinivas Girigowda2da81e22017-03-16 21:22:19 -0700343 sme_err("Failed to initialize sme command list: %d", status);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800344
345 return status;
346}
347
Jeff Johnson0a8786a2018-12-02 10:49:01 -0800348void sme_release_command(struct mac_context *mac_ctx, tSmeCmd *sme_cmd)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800349{
Krunal Sonia8270f52017-02-23 19:51:25 -0800350 sme_cmd->command = eSmeNoCommand;
Jeff Johnsonea9f3d72019-02-17 13:27:55 -0800351 csr_ll_insert_tail(&mac_ctx->sme.sme_cmd_freelist, &sme_cmd->Link,
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +0530352 LL_ACCESS_LOCK);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800353}
354
Jeff Johnson0a8786a2018-12-02 10:49:01 -0800355static QDF_STATUS free_sme_cmd_list(struct mac_context *mac)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800356{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530357 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800358
Jeff Johnsonea9f3d72019-02-17 13:27:55 -0800359 csr_ll_close(&mac->sme.sme_cmd_freelist);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800360
Jeff Johnson3e7a4932019-02-17 12:11:36 -0800361 status = sme_acquire_global_lock(&mac->sme);
Madhvapathi Sriram3e6627a2018-12-19 12:54:49 +0530362 if (status != QDF_STATUS_SUCCESS)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800363 goto done;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800364
Jeff Johnson01f2c232018-11-21 19:17:44 -0800365 free_sme_cmds(mac);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800366
Jeff Johnson3e7a4932019-02-17 12:11:36 -0800367 status = sme_release_global_lock(&mac->sme);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +0530368 if (status != QDF_STATUS_SUCCESS)
Srinivas Girigowda2da81e22017-03-16 21:22:19 -0700369 sme_err("Failed to release the lock status: %d", status);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800370done:
371 return status;
372}
373
Jeff Johnson0a8786a2018-12-02 10:49:01 -0800374static void dump_csr_command_info(struct mac_context *mac, tSmeCmd *pCmd)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800375{
376 switch (pCmd->command) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800377 case eSmeCommandRoam:
Srinivas Girigowda2da81e22017-03-16 21:22:19 -0700378 sme_debug("roam command reason is %d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800379 pCmd->u.roamCmd.roamReason);
380 break;
381
382 case eSmeCommandWmStatusChange:
Srinivas Girigowda2da81e22017-03-16 21:22:19 -0700383 sme_debug("WMStatusChange command type is %d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800384 pCmd->u.wmStatusChangeCmd.Type);
385 break;
386
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800387 default:
Srinivas Girigowda2da81e22017-03-16 21:22:19 -0700388 sme_debug("default: Unhandled command %d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800389 pCmd->command);
390 break;
391 }
392}
393
Jeff Johnson0a8786a2018-12-02 10:49:01 -0800394tSmeCmd *sme_get_command_buffer(struct mac_context *mac)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800395{
396 tSmeCmd *pRetCmd = NULL, *pTempCmd = NULL;
397 tListElem *pEntry;
398 static int sme_command_queue_full;
399
Jeff Johnsonea9f3d72019-02-17 13:27:55 -0800400 pEntry = csr_ll_remove_head(&mac->sme.sme_cmd_freelist, LL_ACCESS_LOCK);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800401
Jeff Johnsonea9f3d72019-02-17 13:27:55 -0800402 /* If we can get another MS Msg buffer, then we are ok. Just
403 * link the entry onto the linked list. (We are using the
404 * linked list to keep track of the message buffers).
405 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800406 if (pEntry) {
407 pRetCmd = GET_BASE_ADDR(pEntry, tSmeCmd, Link);
408 /* reset when free list is available */
409 sme_command_queue_full = 0;
410 } else {
411 int idx = 1;
412
413 /* Cannot change pRetCmd here since it needs to return later. */
Jeff Johnson01f2c232018-11-21 19:17:44 -0800414 pEntry = csr_nonscan_active_ll_peek_head(mac, LL_ACCESS_LOCK);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +0530415 if (pEntry)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800416 pTempCmd = GET_BASE_ADDR(pEntry, tSmeCmd, Link);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +0530417
418 sme_err("Out of command buffer.... command (0x%X) stuck",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800419 (pTempCmd) ? pTempCmd->command : eSmeNoCommand);
420 if (pTempCmd) {
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +0530421 if (eSmeCsrCommandMask & pTempCmd->command)
422 /* CSR command is stuck. See what the reason
423 * code is for that command
424 */
Jeff Johnson01f2c232018-11-21 19:17:44 -0800425 dump_csr_command_info(mac, pTempCmd);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800426 } /* if(pTempCmd) */
427
428 /* dump what is in the pending queue */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800429 pEntry =
Jeff Johnson01f2c232018-11-21 19:17:44 -0800430 csr_nonscan_pending_ll_peek_head(mac,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800431 LL_ACCESS_NOLOCK);
432 while (pEntry && !sme_command_queue_full) {
433 pTempCmd = GET_BASE_ADDR(pEntry, tSmeCmd, Link);
434 /* Print only 1st five commands from pending queue. */
435 if (idx <= 5)
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +0530436 sme_err("Out of command buffer.... SME pending command #%d (0x%X)",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800437 idx, pTempCmd->command);
438 idx++;
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +0530439 if (eSmeCsrCommandMask & pTempCmd->command)
440 /* CSR command is stuck. See what the reason
441 * code is for that command
442 */
Jeff Johnson01f2c232018-11-21 19:17:44 -0800443 dump_csr_command_info(mac, pTempCmd);
444 pEntry = csr_nonscan_pending_ll_next(mac, pEntry,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800445 LL_ACCESS_NOLOCK);
446 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800447
Jeff Johnson01f2c232018-11-21 19:17:44 -0800448 if (mac->mlme_cfg->gen.fatal_event_trigger)
Abhishek Singh5ea86532016-04-27 14:10:53 +0530449 cds_flush_logs(WLAN_LOG_TYPE_FATAL,
450 WLAN_LOG_INDICATOR_HOST_DRIVER,
451 WLAN_LOG_REASON_SME_OUT_OF_CMD_BUF,
452 false,
Jeff Johnson01f2c232018-11-21 19:17:44 -0800453 mac->mlme_cfg->gen.self_recovery);
Abhishek Singh5ea86532016-04-27 14:10:53 +0530454 else
Anurag Chouhan4085ff72017-10-05 18:09:56 +0530455 cds_trigger_recovery(QDF_GET_MSG_BUFF_FAILURE);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800456 }
457
458 /* memset to zero */
459 if (pRetCmd) {
hangtian127c9532019-01-12 13:29:07 +0800460 qdf_mem_zero((uint8_t *)&pRetCmd->command,
461 sizeof(pRetCmd->command));
Abhishek Singhf37d49f2019-11-25 16:00:18 +0530462 qdf_mem_zero((uint8_t *)&pRetCmd->vdev_id,
463 sizeof(pRetCmd->vdev_id));
hangtian127c9532019-01-12 13:29:07 +0800464 qdf_mem_zero((uint8_t *)&pRetCmd->u, sizeof(pRetCmd->u));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800465 }
466
467 return pRetCmd;
468}
469
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800470/**
Krunal Sonia8270f52017-02-23 19:51:25 -0800471 * sme_ser_handle_active_cmd() - handle command activation callback from
472 * new serialization module
473 * @cmd: pointer to new serialization command
474 *
475 * This API is to handle command activation callback from new serialization
476 * callback
477 *
478 * Return: QDF_STATUS_SUCCESS
479 */
480static
481QDF_STATUS sme_ser_handle_active_cmd(struct wlan_serialization_command *cmd)
482{
483 tSmeCmd *sme_cmd;
Jeff Johnsonc7309062018-11-09 20:59:42 -0800484 mac_handle_t mac_handle;
Jeff Johnson0a8786a2018-12-02 10:49:01 -0800485 struct mac_context *mac_ctx;
Krunal Sonia8270f52017-02-23 19:51:25 -0800486 QDF_STATUS status = QDF_STATUS_SUCCESS;
487 bool do_continue;
488
489 if (!cmd) {
Srinivas Girigowda2c263352017-03-17 17:49:53 -0700490 sme_err("No serialization command found");
Krunal Sonia8270f52017-02-23 19:51:25 -0800491 return QDF_STATUS_E_FAILURE;
492 }
493
Jeff Johnsonc7309062018-11-09 20:59:42 -0800494 mac_handle = cds_get_context(QDF_MODULE_ID_SME);
Jeff Johnson038efe72019-03-18 13:39:31 -0700495 if (mac_handle) {
Jeff Johnsona0619e42018-11-28 17:43:00 -0800496 mac_ctx = MAC_CONTEXT(mac_handle);
Pragaspathi Thilagarajb11dbe42018-07-23 16:42:17 +0530497 } else {
Jeff Johnsonc7309062018-11-09 20:59:42 -0800498 sme_err("No mac_handle found");
Krunal Sonia8270f52017-02-23 19:51:25 -0800499 return QDF_STATUS_E_FAILURE;
500 }
501 sme_cmd = cmd->umac_cmd;
502 if (!sme_cmd) {
Srinivas Girigowda2c263352017-03-17 17:49:53 -0700503 sme_err("No SME command found");
Krunal Sonia8270f52017-02-23 19:51:25 -0800504 return QDF_STATUS_E_FAILURE;
505 }
506
507 switch (sme_cmd->command) {
508 case eSmeCommandRoam:
509 status = csr_roam_process_command(mac_ctx, sme_cmd);
510 break;
511 case eSmeCommandWmStatusChange:
512 csr_roam_process_wm_status_change_command(mac_ctx,
513 sme_cmd);
514 break;
Krunal Sonia8270f52017-02-23 19:51:25 -0800515 case eSmeCommandAddTs:
516 case eSmeCommandDelTs:
517#ifndef WLAN_MDM_CODE_REDUCTION_OPT
518 do_continue = qos_process_command(mac_ctx, sme_cmd);
519 if (do_continue)
520 status = QDF_STATUS_E_FAILURE;
521#endif
522 break;
Krunal Sonia8270f52017-02-23 19:51:25 -0800523 case e_sme_command_set_hw_mode:
524 csr_process_set_hw_mode(mac_ctx, sme_cmd);
525 break;
526 case e_sme_command_nss_update:
527 csr_process_nss_update_req(mac_ctx, sme_cmd);
528 break;
529 case e_sme_command_set_dual_mac_config:
530 csr_process_set_dual_mac_config(mac_ctx, sme_cmd);
531 break;
532 case e_sme_command_set_antenna_mode:
533 csr_process_set_antenna_mode(mac_ctx, sme_cmd);
534 break;
535 default:
536 /* something is wrong */
Srinivas Girigowda2da81e22017-03-16 21:22:19 -0700537 sme_err("unknown command %d", sme_cmd->command);
Krunal Sonia8270f52017-02-23 19:51:25 -0800538 status = QDF_STATUS_E_FAILURE;
539 break;
540 }
Krunal Sonia8270f52017-02-23 19:51:25 -0800541 return status;
542}
543
Rajeev Kumar Sirasanagandla4477e7e2019-01-29 14:05:44 -0800544QDF_STATUS sme_ser_cmd_callback(struct wlan_serialization_command *cmd,
Krunal Sonia8270f52017-02-23 19:51:25 -0800545 enum wlan_serialization_cb_reason reason)
546{
Jeff Johnsonc7309062018-11-09 20:59:42 -0800547 mac_handle_t mac_handle;
Jeff Johnson0a8786a2018-12-02 10:49:01 -0800548 struct mac_context *mac_ctx;
Krunal Sonia8270f52017-02-23 19:51:25 -0800549 QDF_STATUS status = QDF_STATUS_SUCCESS;
550 tSmeCmd *sme_cmd;
551
Jeff Johnsonc7309062018-11-09 20:59:42 -0800552 mac_handle = cds_get_context(QDF_MODULE_ID_SME);
Jeff Johnson038efe72019-03-18 13:39:31 -0700553 if (mac_handle) {
Jeff Johnsona0619e42018-11-28 17:43:00 -0800554 mac_ctx = MAC_CONTEXT(mac_handle);
Pragaspathi Thilagarajb11dbe42018-07-23 16:42:17 +0530555 } else {
Jeff Johnsonc7309062018-11-09 20:59:42 -0800556 sme_err("mac_handle is null");
Krunal Sonia8270f52017-02-23 19:51:25 -0800557 return QDF_STATUS_E_FAILURE;
558 }
559 /*
560 * Do not acquire lock here as sme global lock is already acquired in
561 * caller or MC thread context
562 */
563 if (!cmd) {
Srinivas Girigowda2c263352017-03-17 17:49:53 -0700564 sme_err("serialization command is null");
Krunal Sonia8270f52017-02-23 19:51:25 -0800565 return QDF_STATUS_E_FAILURE;
566 }
567
568 switch (reason) {
569 case WLAN_SER_CB_ACTIVATE_CMD:
Krunal Sonia8270f52017-02-23 19:51:25 -0800570 status = sme_ser_handle_active_cmd(cmd);
571 break;
572 case WLAN_SER_CB_CANCEL_CMD:
Krunal Sonia8270f52017-02-23 19:51:25 -0800573 break;
574 case WLAN_SER_CB_RELEASE_MEM_CMD:
Vignesh Viswanathan062b5162018-10-11 17:18:41 +0530575 if (cmd->vdev)
576 wlan_objmgr_vdev_release_ref(cmd->vdev,
577 WLAN_LEGACY_SME_ID);
Krunal Sonia8270f52017-02-23 19:51:25 -0800578 sme_cmd = cmd->umac_cmd;
579 csr_release_command_buffer(mac_ctx, sme_cmd);
580 break;
581 case WLAN_SER_CB_ACTIVE_CMD_TIMEOUT:
Krunal Sonia8270f52017-02-23 19:51:25 -0800582 break;
583 default:
Abhishek Singh4dfc0ee2020-01-30 14:49:19 +0530584 sme_debug("unknown reason code");
Krunal Sonia8270f52017-02-23 19:51:25 -0800585 return QDF_STATUS_E_FAILURE;
586 }
587 return status;
588}
589
Wen Gong3f003382018-05-14 14:26:37 +0800590#ifdef WLAN_FEATURE_MEMDUMP_ENABLE
Krunal Sonia8270f52017-02-23 19:51:25 -0800591/**
Abhishek Singhf37d49f2019-11-25 16:00:18 +0530592 * sme_get_sessionid_from_activelist() - gets vdev_id
Padma, Santhosh Kumar9aba02f2016-08-11 16:30:25 +0530593 * @mac: mac context
594 *
595 * This function is used to get session id from sme command
596 * active list
597 *
Abhishek Singhf37d49f2019-11-25 16:00:18 +0530598 * Return: returns vdev_id
Padma, Santhosh Kumar9aba02f2016-08-11 16:30:25 +0530599 */
Jeff Johnson0a8786a2018-12-02 10:49:01 -0800600static uint32_t sme_get_sessionid_from_activelist(struct mac_context *mac)
Padma, Santhosh Kumar9aba02f2016-08-11 16:30:25 +0530601{
602 tListElem *entry;
603 tSmeCmd *command;
Abhishek Singhf37d49f2019-11-25 16:00:18 +0530604 uint32_t vdev_id = WLAN_UMAC_VDEV_ID_MAX;
Padma, Santhosh Kumar9aba02f2016-08-11 16:30:25 +0530605
Krunal Sonia8270f52017-02-23 19:51:25 -0800606 entry = csr_nonscan_active_ll_peek_head(mac, LL_ACCESS_LOCK);
Padma, Santhosh Kumar9aba02f2016-08-11 16:30:25 +0530607 if (entry) {
608 command = GET_BASE_ADDR(entry, tSmeCmd, Link);
Abhishek Singhf37d49f2019-11-25 16:00:18 +0530609 vdev_id = command->vdev_id;
Padma, Santhosh Kumar9aba02f2016-08-11 16:30:25 +0530610 }
611
Abhishek Singhf37d49f2019-11-25 16:00:18 +0530612 return vdev_id;
Padma, Santhosh Kumar9aba02f2016-08-11 16:30:25 +0530613}
614
615/**
616 * sme_state_info_dump() - prints state information of sme layer
617 * @buf: buffer pointer
618 * @size: size of buffer to be filled
619 *
620 * This function is used to dump state information of sme layer
621 *
622 * Return: None
623 */
624static void sme_state_info_dump(char **buf_ptr, uint16_t *size)
625{
626 uint32_t session_id, active_session_id;
Jeff Johnsonc7309062018-11-09 20:59:42 -0800627 mac_handle_t mac_handle;
Jeff Johnson0a8786a2018-12-02 10:49:01 -0800628 struct mac_context *mac;
Padma, Santhosh Kumar9aba02f2016-08-11 16:30:25 +0530629 uint16_t len = 0;
630 char *buf = *buf_ptr;
631 eCsrConnectState connect_state;
632
Jeff Johnsonc7309062018-11-09 20:59:42 -0800633 mac_handle = cds_get_context(QDF_MODULE_ID_SME);
Jeff Johnson038efe72019-03-18 13:39:31 -0700634 if (!mac_handle) {
Padma, Santhosh Kumar9aba02f2016-08-11 16:30:25 +0530635 QDF_ASSERT(0);
636 return;
637 }
638
Jeff Johnsona0619e42018-11-28 17:43:00 -0800639 mac = MAC_CONTEXT(mac_handle);
Padma, Santhosh Kumar9aba02f2016-08-11 16:30:25 +0530640
641 active_session_id = sme_get_sessionid_from_activelist(mac);
Srinivas Girigowdad8697d42019-03-08 15:34:39 -0800642 if (active_session_id != WLAN_UMAC_VDEV_ID_MAX) {
Padma, Santhosh Kumar9aba02f2016-08-11 16:30:25 +0530643 len += qdf_scnprintf(buf + len, *size - len,
644 "\n active command sessionid %d", active_session_id);
645 }
646
Dustin Brownad06be62019-02-04 14:52:56 -0800647 for (session_id = 0; session_id < WLAN_MAX_VDEVS; session_id++) {
Padma, Santhosh Kumar9aba02f2016-08-11 16:30:25 +0530648 if (CSR_IS_SESSION_VALID(mac, session_id)) {
649 connect_state =
650 mac->roam.roamSession[session_id].connectState;
651 if ((eCSR_ASSOC_STATE_TYPE_INFRA_ASSOCIATED ==
652 connect_state)
653 || (eCSR_ASSOC_STATE_TYPE_INFRA_CONNECTED ==
654 connect_state)) {
655 len += qdf_scnprintf(buf + len, *size - len,
656 "\n NeighborRoamState: %d",
657 mac->roam.neighborRoamInfo[session_id].
658 neighborRoamState);
659 len += qdf_scnprintf(buf + len, *size - len,
660 "\n RoamState: %d", mac->roam.
661 curState[session_id]);
662 len += qdf_scnprintf(buf + len, *size - len,
663 "\n RoamSubState: %d", mac->roam.
664 curSubState[session_id]);
665 len += qdf_scnprintf(buf + len, *size - len,
666 "\n ConnectState: %d",
667 connect_state);
668 }
669 }
670 }
671
672 *size -= len;
673 *buf_ptr += len;
674}
675
676/**
677 * sme_register_debug_callback() - registration function sme layer
678 * to print sme state information
679 *
680 * Return: None
681 */
682static void sme_register_debug_callback(void)
683{
684 qdf_register_debug_callback(QDF_MODULE_ID_SME, &sme_state_info_dump);
685}
Wen Gong3f003382018-05-14 14:26:37 +0800686#else /* WLAN_FEATURE_MEMDUMP_ENABLE */
Wen Gongaa6d55d2018-04-26 16:33:21 +0800687static void sme_register_debug_callback(void)
688{
689}
Wen Gong3f003382018-05-14 14:26:37 +0800690#endif /* WLAN_FEATURE_MEMDUMP_ENABLE */
Padma, Santhosh Kumar9aba02f2016-08-11 16:30:25 +0530691
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800692/* Global APIs */
693
694/**
695 * sme_open() - Initialze all SME modules and put them at idle state
Jeff Johnsonb460dd72018-11-08 10:26:51 -0800696 * @mac_handle: The handle returned by mac_open
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800697 *
698 * The function initializes each module inside SME, PMC, CSR, etc. Upon
699 * successfully return, all modules are at idle state ready to start.
700 * smeOpen must be called before any other SME APIs can be involved.
701 * smeOpen must be called after mac_open.
702 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530703 * Return: QDF_STATUS_SUCCESS - SME is successfully initialized.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800704 * Other status means SME is failed to be initialized
705 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -0800706QDF_STATUS sme_open(mac_handle_t mac_handle)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800707{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530708 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -0800709 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800710
Jeff Johnson01f2c232018-11-21 19:17:44 -0800711 mac->sme.state = SME_STATE_STOP;
Jeff Johnson5a6a0c92019-02-17 16:12:02 -0800712 mac->sme.curr_device_mode = QDF_STA_MODE;
Anurag Chouhana37b5b72016-02-21 14:53:42 +0530713 if (!QDF_IS_STATUS_SUCCESS(qdf_mutex_create(
Jeff Johnson3e7a4932019-02-17 12:11:36 -0800714 &mac->sme.sme_global_lock))) {
Srinivas Girigowda09625b02018-09-10 15:28:09 -0700715 sme_err("Init lock failed");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530716 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800717 }
Jeff Johnson01f2c232018-11-21 19:17:44 -0800718 status = csr_open(mac);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530719 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -0700720 sme_err("csr_open failed, status: %d", status);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800721 return status;
722 }
723
Jeff Johnsonb460dd72018-11-08 10:26:51 -0800724 status = sme_ps_open(mac_handle);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530725 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -0700726 sme_err("sme_ps_open failed with status: %d", status);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800727 return status;
728 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800729
730#ifndef WLAN_MDM_CODE_REDUCTION_OPT
Jeff Johnson01f2c232018-11-21 19:17:44 -0800731 status = sme_qos_open(mac);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530732 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -0700733 sme_err("Qos open, status: %d", status);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800734 return status;
735 }
736#endif
Jeff Johnson01f2c232018-11-21 19:17:44 -0800737 status = init_sme_cmd_list(mac);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530738 if (!QDF_IS_STATUS_SUCCESS(status))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800739 return status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800740
Jeff Johnson01f2c232018-11-21 19:17:44 -0800741 status = rrm_open(mac);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530742 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -0700743 sme_err("rrm_open failed, status: %d", status);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800744 return status;
745 }
Jeff Johnson01f2c232018-11-21 19:17:44 -0800746 sme_trace_init(mac);
Padma, Santhosh Kumar9aba02f2016-08-11 16:30:25 +0530747 sme_register_debug_callback();
Krunal Soni33787902017-08-29 11:39:28 -0700748
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800749 return status;
750}
751
752/*
753 * sme_init_chan_list, triggers channel setup based on country code.
754 */
Jeff Johnsonc7309062018-11-09 20:59:42 -0800755QDF_STATUS sme_init_chan_list(mac_handle_t mac_handle, uint8_t *alpha2,
Amar Singhala297bfa2015-10-15 15:07:29 -0700756 enum country_src cc_src)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800757{
Jeff Johnson0a8786a2018-12-02 10:49:01 -0800758 struct mac_context *pmac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800759
Amar Singhala297bfa2015-10-15 15:07:29 -0700760 if ((cc_src == SOURCE_USERSPACE) &&
Bala Venkatesh46e29032018-11-14 18:24:55 +0530761 (pmac->mlme_cfg->sap_cfg.country_code_priority)) {
Abhinav Kumard4d6eb72018-12-04 20:30:37 +0530762 pmac->mlme_cfg->gen.enabled_11d = false;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800763 }
764
765 return csr_init_chan_list(pmac, alpha2);
766}
767
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +0530768/*
769 * sme_set11dinfo() - Set the 11d information about valid channels
770 * and there power using information from nvRAM
771 * This function is called only for AP.
772 *
773 * This is a synchronous call
774 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -0800775 * mac_handle - The handle returned by mac_open.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +0530776 * pSmeConfigParams - a pointer to a caller allocated object of
Jeff Johnson46b4f0e2019-03-08 10:48:35 -0800777 * struct sme_config_params.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +0530778 *
779 * Return QDF_STATUS_SUCCESS - SME update the config parameters successfully.
780 *
781 * Other status means SME is failed to update the config parameters.
782 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800783
Jeff Johnsonc7309062018-11-09 20:59:42 -0800784QDF_STATUS sme_set11dinfo(mac_handle_t mac_handle,
Jeff Johnson46b4f0e2019-03-08 10:48:35 -0800785 struct sme_config_params *pSmeConfigParams)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800786{
Jeff Johnson0a8786a2018-12-02 10:49:01 -0800787 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530788 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800789
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +0530790 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800791 TRACE_CODE_SME_RX_HDD_MSG_SET_11DINFO, NO_SESSION, 0));
Jeff Johnson038efe72019-03-18 13:39:31 -0700792 if (!pSmeConfigParams) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -0700793 sme_err("SME config params empty");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800794 return status;
795 }
796
Jeff Johnsone94ccd02019-04-02 15:02:56 -0700797 status = csr_set_channels(mac_ctx, &pSmeConfigParams->csr_config);
Srinivas Girigowda2da81e22017-03-16 21:22:19 -0700798 if (!QDF_IS_STATUS_SUCCESS(status))
799 sme_err("csr_set_channels failed with status: %d", status);
800
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800801 return status;
802}
803
Krunal Sonie3531942016-04-12 17:43:53 -0700804/**
805 * sme_update_fine_time_measurement_capab() - Update the FTM capabitlies from
806 * incoming val
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -0800807 * @mac_handle: Opaque handle to the global MAC context
Krunal Sonie3531942016-04-12 17:43:53 -0700808 * @val: New FTM capability value
809 *
810 * Return: None
811 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -0800812void sme_update_fine_time_measurement_capab(mac_handle_t mac_handle,
Jeff Johnson1f2dabc2018-11-07 15:33:01 -0800813 uint8_t session_id,
814 uint32_t val)
Krunal Sonie3531942016-04-12 17:43:53 -0700815{
Jeff Johnson0a8786a2018-12-02 10:49:01 -0800816 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Vignesh Viswanathan4e65e8e2018-05-01 12:04:16 +0530817 QDF_STATUS status;
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +0530818
Naveen Rawatd2657be2017-10-10 14:31:23 -0700819 ucfg_wifi_pos_set_ftm_cap(mac_ctx->psoc, val);
Krunal Sonie3531942016-04-12 17:43:53 -0700820
Selvaraj, Sridhar57bb4d02016-08-31 16:14:15 +0530821 if (!val) {
Krunal Sonie3531942016-04-12 17:43:53 -0700822 mac_ctx->rrm.rrmPEContext.rrmEnabledCaps.fine_time_meas_rpt = 0;
823 ((tpRRMCaps)mac_ctx->rrm.rrmSmeContext.
824 rrmConfig.rm_capability)->fine_time_meas_rpt = 0;
825 } else {
826 mac_ctx->rrm.rrmPEContext.rrmEnabledCaps.fine_time_meas_rpt = 1;
827 ((tpRRMCaps)mac_ctx->rrm.rrmSmeContext.
828 rrmConfig.rm_capability)->fine_time_meas_rpt = 1;
829 }
Selvaraj, Sridhar57bb4d02016-08-31 16:14:15 +0530830
831 /* Inform this RRM IE change to FW */
Vignesh Viswanathan4e65e8e2018-05-01 12:04:16 +0530832 status = sme_acquire_global_lock(&mac_ctx->sme);
833 if (QDF_IS_STATUS_SUCCESS(status)) {
Abhinav Kumar523ca372019-08-30 16:28:19 +0530834 csr_roam_update_cfg(mac_ctx, session_id,
835 REASON_CONNECT_IES_CHANGED);
Vignesh Viswanathan4e65e8e2018-05-01 12:04:16 +0530836 sme_release_global_lock(&mac_ctx->sme);
Vignesh Viswanathan4e65e8e2018-05-01 12:04:16 +0530837 }
Krunal Sonie3531942016-04-12 17:43:53 -0700838}
839
Manikandan Mohan06d38d82018-11-26 18:36:58 -0800840/**
841 * sme_update_neighbor_report_config() - Update CSR config for 11k params
842 * @mac_handle: Pointer to MAC context
843 * @csr_config: Pointer to CSR config data structure
844 *
845 * Return: None
846 */
Jeff Johnsondd821152019-04-02 14:50:51 -0700847static void
848sme_update_neighbor_report_config(struct mac_context *mac,
849 struct csr_config_params *csr_config)
Manikandan Mohan06d38d82018-11-26 18:36:58 -0800850{
851 struct wlan_fwol_neighbor_report_cfg fwol_neighbor_report_cfg = {0};
852 QDF_STATUS status;
853
854 status = ucfg_fwol_get_neighbor_report_cfg(mac->psoc,
855 &fwol_neighbor_report_cfg);
856 if (!QDF_IS_STATUS_SUCCESS(status))
857 sme_err("Using defaults for 11K offload params: Error: %d",
858 status);
859
860 csr_config->offload_11k_enable_bitmask =
861 fwol_neighbor_report_cfg.enable_bitmask;
862 csr_config->neighbor_report_offload.params_bitmask =
863 fwol_neighbor_report_cfg.params_bitmask;
864 csr_config->neighbor_report_offload.time_offset =
865 fwol_neighbor_report_cfg.time_offset;
866 csr_config->neighbor_report_offload.low_rssi_offset =
867 fwol_neighbor_report_cfg.low_rssi_offset;
868 csr_config->neighbor_report_offload.bmiss_count_trigger =
869 fwol_neighbor_report_cfg.bmiss_count_trigger;
870 csr_config->neighbor_report_offload.per_threshold_offset =
871 fwol_neighbor_report_cfg.per_threshold_offset;
872 csr_config->neighbor_report_offload.neighbor_report_cache_timeout =
873 fwol_neighbor_report_cfg.cache_timeout;
874 csr_config->neighbor_report_offload.max_neighbor_report_req_cap =
875 fwol_neighbor_report_cfg.max_req_cap;
876}
877
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +0530878/*
879 * sme_update_config() - Change configurations for all SME moduels
880 * The function updates some configuration for modules in SME, CSR, etc
881 * during SMEs close open sequence.
882 * Modules inside SME apply the new configuration at the next transaction.
883 * This is a synchronous call
884 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -0800885 * mac_handle - The handle returned by mac_open.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +0530886 * pSmeConfigParams - a pointer to a caller allocated object of
Jeff Johnson46b4f0e2019-03-08 10:48:35 -0800887 * struct sme_config_params.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +0530888 * Return QDF_STATUS_SUCCESS - SME update the config parameters successfully.
889 * Other status means SME is failed to update the config parameters.
890 */
Jeff Johnson46b4f0e2019-03-08 10:48:35 -0800891QDF_STATUS sme_update_config(mac_handle_t mac_handle,
892 struct sme_config_params *pSmeConfigParams)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800893{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530894 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -0800895 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800896
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +0530897 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800898 TRACE_CODE_SME_RX_HDD_MSG_UPDATE_CONFIG, NO_SESSION,
899 0));
Jeff Johnson038efe72019-03-18 13:39:31 -0700900 if (!pSmeConfigParams) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -0700901 sme_err("SME config params empty");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800902 return status;
903 }
Jeff Johnsone94ccd02019-04-02 15:02:56 -0700904 sme_update_neighbor_report_config(mac, &pSmeConfigParams->csr_config);
Jeff Johnson01f2c232018-11-21 19:17:44 -0800905 status = csr_change_default_config_param(mac, &pSmeConfigParams->
Jeff Johnsone94ccd02019-04-02 15:02:56 -0700906 csr_config);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800907
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +0530908 if (!QDF_IS_STATUS_SUCCESS(status))
Srinivas Girigowda2da81e22017-03-16 21:22:19 -0700909 sme_err("csr_change_default_config_param failed status: %d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800910 status);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800911
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +0530912 /* For SOC, CFG is set before start We don't want to apply global CFG
913 * in connect state because that may cause some side affect
914 */
Jeff Johnson01f2c232018-11-21 19:17:44 -0800915 if (csr_is_all_session_disconnected(mac))
916 csr_set_global_cfgs(mac);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800917
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800918 return status;
919}
920
921/**
922 * sme_update_roam_params() - Store/Update the roaming params
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -0800923 * @mac_handle: Opaque handle to the global MAC context
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800924 * @session_id: SME Session ID
925 * @roam_params_src: The source buffer to copy
926 * @update_param: Type of parameter to be updated
927 *
928 * Return: Return the status of the updation.
929 */
Jeff Johnsonc7309062018-11-09 20:59:42 -0800930QDF_STATUS sme_update_roam_params(mac_handle_t mac_handle,
931 uint8_t session_id,
932 struct roam_ext_params *roam_params_src,
933 int update_param)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800934{
Jeff Johnson0a8786a2018-12-02 10:49:01 -0800935 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800936 struct roam_ext_params *roam_params_dst;
Vignesh Viswanathan4e65e8e2018-05-01 12:04:16 +0530937 QDF_STATUS status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800938 uint8_t i;
939
940 roam_params_dst = &mac_ctx->roam.configParam.roam_params;
941 switch (update_param) {
942 case REASON_ROAM_EXT_SCAN_PARAMS_CHANGED:
Wu Gaoca416ff2018-09-17 11:05:07 +0800943 mac_ctx->mlme_cfg->lfr.rssi_boost_threshold_5g =
Srinivas Girigowda72f30392017-07-13 18:55:09 -0700944 roam_params_src->raise_rssi_thresh_5g;
Wu Gaoca416ff2018-09-17 11:05:07 +0800945 mac_ctx->mlme_cfg->lfr.rssi_penalize_threshold_5g =
Srinivas Girigowda72f30392017-07-13 18:55:09 -0700946 roam_params_src->drop_rssi_thresh_5g;
Wu Gaoca416ff2018-09-17 11:05:07 +0800947 mac_ctx->mlme_cfg->lfr.rssi_boost_factor_5g =
Srinivas Girigowda72f30392017-07-13 18:55:09 -0700948 roam_params_src->raise_factor_5g;
Wu Gaoca416ff2018-09-17 11:05:07 +0800949 mac_ctx->mlme_cfg->lfr.rssi_penalize_factor_5g =
Srinivas Girigowda72f30392017-07-13 18:55:09 -0700950 roam_params_src->drop_factor_5g;
Wu Gaoca416ff2018-09-17 11:05:07 +0800951 mac_ctx->mlme_cfg->lfr.max_rssi_boost_5g =
Srinivas Girigowda72f30392017-07-13 18:55:09 -0700952 roam_params_src->max_raise_rssi_5g;
Wu Gaoca416ff2018-09-17 11:05:07 +0800953 mac_ctx->mlme_cfg->lfr.max_rssi_penalize_5g =
Srinivas Girigowda72f30392017-07-13 18:55:09 -0700954 roam_params_src->max_drop_rssi_5g;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800955 roam_params_dst->alert_rssi_threshold =
Srinivas Girigowda72f30392017-07-13 18:55:09 -0700956 roam_params_src->alert_rssi_threshold;
Wu Gaoca416ff2018-09-17 11:05:07 +0800957 mac_ctx->mlme_cfg->lfr.enable_5g_band_pref = true;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800958 break;
959 case REASON_ROAM_SET_SSID_ALLOWED:
hangtian127c9532019-01-12 13:29:07 +0800960 qdf_mem_zero(&roam_params_dst->ssid_allowed_list,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800961 sizeof(tSirMacSSid) * MAX_SSID_ALLOWED_LIST);
962 roam_params_dst->num_ssid_allowed_list =
Srinivas Girigowda72f30392017-07-13 18:55:09 -0700963 roam_params_src->num_ssid_allowed_list;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800964 for (i = 0; i < roam_params_dst->num_ssid_allowed_list; i++) {
965 roam_params_dst->ssid_allowed_list[i].length =
Srinivas Girigowda72f30392017-07-13 18:55:09 -0700966 roam_params_src->ssid_allowed_list[i].length;
Anurag Chouhan600c3a02016-03-01 10:33:54 +0530967 qdf_mem_copy(roam_params_dst->ssid_allowed_list[i].ssId,
Srinivas Girigowda72f30392017-07-13 18:55:09 -0700968 roam_params_src->ssid_allowed_list[i].ssId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800969 roam_params_dst->ssid_allowed_list[i].length);
970 }
971 break;
972 case REASON_ROAM_SET_FAVORED_BSSID:
hangtian127c9532019-01-12 13:29:07 +0800973 qdf_mem_zero(&roam_params_dst->bssid_favored,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800974 sizeof(tSirMacAddr) * MAX_BSSID_FAVORED);
975 roam_params_dst->num_bssid_favored =
Srinivas Girigowda72f30392017-07-13 18:55:09 -0700976 roam_params_src->num_bssid_favored;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800977 for (i = 0; i < roam_params_dst->num_bssid_favored; i++) {
Anurag Chouhan600c3a02016-03-01 10:33:54 +0530978 qdf_mem_copy(&roam_params_dst->bssid_favored[i],
Srinivas Girigowda72f30392017-07-13 18:55:09 -0700979 &roam_params_src->bssid_favored[i],
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800980 sizeof(tSirMacAddr));
981 roam_params_dst->bssid_favored_factor[i] =
Srinivas Girigowda72f30392017-07-13 18:55:09 -0700982 roam_params_src->bssid_favored_factor[i];
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800983 }
984 break;
985 case REASON_ROAM_SET_BLACKLIST_BSSID:
hangtian127c9532019-01-12 13:29:07 +0800986 qdf_mem_zero(&roam_params_dst->bssid_avoid_list,
Anurag Chouhan6d760662016-02-20 16:05:43 +0530987 QDF_MAC_ADDR_SIZE * MAX_BSSID_AVOID_LIST);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800988 roam_params_dst->num_bssid_avoid_list =
Srinivas Girigowda72f30392017-07-13 18:55:09 -0700989 roam_params_src->num_bssid_avoid_list;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800990 for (i = 0; i < roam_params_dst->num_bssid_avoid_list; i++) {
Anurag Chouhanc5548422016-02-24 18:33:27 +0530991 qdf_copy_macaddr(&roam_params_dst->bssid_avoid_list[i],
Srinivas Girigowda72f30392017-07-13 18:55:09 -0700992 &roam_params_src->bssid_avoid_list[i]);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800993 }
994 break;
995 case REASON_ROAM_GOOD_RSSI_CHANGED:
996 roam_params_dst->good_rssi_roam =
Srinivas Girigowda72f30392017-07-13 18:55:09 -0700997 roam_params_src->good_rssi_roam;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800998 break;
999 default:
1000 break;
1001 }
Vignesh Viswanathan4e65e8e2018-05-01 12:04:16 +05301002
1003 status = sme_acquire_global_lock(&mac_ctx->sme);
1004 if (QDF_IS_STATUS_SUCCESS(status)) {
Abhinav Kumar523ca372019-08-30 16:28:19 +05301005 csr_roam_update_cfg(mac_ctx, session_id, update_param);
Vignesh Viswanathan4e65e8e2018-05-01 12:04:16 +05301006 sme_release_global_lock(&mac_ctx->sme);
Vignesh Viswanathan4e65e8e2018-05-01 12:04:16 +05301007 }
Abhishek Singh158fe252017-03-23 11:09:34 +05301008
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001009 return 0;
1010}
1011
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001012#ifdef WLAN_FEATURE_EXTWOW_SUPPORT
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001013
Krishna Kumaar Natarajand9131902015-10-19 11:52:47 -07001014/**
1015 * sme_process_ready_to_ext_wow() - inform ready to ExtWoW indication.
Jeff Johnson9d7c99e2018-06-28 15:36:00 -07001016 * @mac: Global MAC context
1017 * @indication: ready to Ext WoW indication from lower layer
Krishna Kumaar Natarajand9131902015-10-19 11:52:47 -07001018 *
1019 * On getting ready to Ext WoW indication, this function calls callback
Jeff Johnson9d7c99e2018-06-28 15:36:00 -07001020 * registered (HDD callback) with SME to inform ready to ExtWoW indication.
Krishna Kumaar Natarajand9131902015-10-19 11:52:47 -07001021 *
1022 * Return: None
1023 */
Jeff Johnson0a8786a2018-12-02 10:49:01 -08001024static void sme_process_ready_to_ext_wow(struct mac_context *mac,
Jeff Johnson9d7c99e2018-06-28 15:36:00 -07001025 tpSirReadyToExtWoWInd indication)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001026{
Jeff Johnson9d7c99e2018-06-28 15:36:00 -07001027 if (!mac) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301028 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_FATAL,
Jeff Johnson9d7c99e2018-06-28 15:36:00 -07001029 "%s: mac is null", __func__);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001030 return;
1031 }
1032
Jeff Johnson038efe72019-03-18 13:39:31 -07001033 if (mac->readyToExtWoWCallback) {
Jeff Johnson9d7c99e2018-06-28 15:36:00 -07001034 mac->readyToExtWoWCallback(mac->readyToExtWoWContext,
1035 indication->status);
1036 mac->readyToExtWoWCallback = NULL;
1037 mac->readyToExtWoWContext = NULL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001038 }
1039
1040}
1041#endif
1042
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05301043/*
1044 * sme_hdd_ready_ind() - SME sends eWNI_SME_SYS_READY_IND to PE to inform
1045 * that the NIC is ready tio run.
1046 * The function is called by HDD at the end of initialization stage so PE/HAL
1047 * can enable the NIC to running state.
1048 * This is a synchronous call
1049 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08001050 * @mac_handle - The handle returned by mac_open.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05301051 * Return QDF_STATUS_SUCCESS - eWNI_SME_SYS_READY_IND is sent to PE
1052 * successfully.
1053 * Other status means SME failed to send the message to PE.
1054 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08001055QDF_STATUS sme_hdd_ready_ind(mac_handle_t mac_handle)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001056{
Jeff Johnson47e4b552019-02-01 23:12:25 -08001057 struct sme_ready_req *msg;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301058 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08001059 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001060
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301061 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001062 TRACE_CODE_SME_RX_HDD_MSG_HDDREADYIND, NO_SESSION, 0));
1063 do {
1064
Abhishek Singhde410b72017-05-22 15:25:39 +05301065 msg = qdf_mem_malloc(sizeof(*msg));
Arif Hussain0ef77082018-10-10 16:42:53 -07001066 if (!msg)
Abhishek Singhde410b72017-05-22 15:25:39 +05301067 return QDF_STATUS_E_NOMEM;
Arif Hussain0ef77082018-10-10 16:42:53 -07001068
Abhishek Singhde410b72017-05-22 15:25:39 +05301069 msg->messageType = eWNI_SME_SYS_READY_IND;
1070 msg->length = sizeof(*msg);
Abhishek Singhde410b72017-05-22 15:25:39 +05301071 msg->csr_roam_synch_cb = csr_roam_synch_callback;
Sandeep Puligilla1426d612017-04-12 18:22:06 -07001072 msg->sme_msg_cb = sme_process_msg_callback;
Vignesh Viswanathan3d478032018-08-02 20:18:53 +05301073 msg->stop_roaming_cb = sme_stop_roaming;
Pragaspathi Thilagaraj7a7163b2019-07-14 22:47:09 +05301074 msg->csr_roam_auth_event_handle_cb =
1075 csr_roam_auth_offload_callback;
Srikanth Marepalli6a872782020-01-24 18:12:05 +05301076 msg->csr_roam_pmkid_req_cb = csr_roam_pmkid_req_callback;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001077
Jeff Johnsonb460dd72018-11-08 10:26:51 -08001078 status = u_mac_post_ctrl_msg(mac_handle, (tSirMbMsg *)msg);
Jeff Johnsonc09caa42018-06-07 22:58:55 -07001079 if (QDF_IS_STATUS_ERROR(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07001080 sme_err("u_mac_post_ctrl_msg failed to send eWNI_SME_SYS_READY_IND");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001081 break;
1082 }
1083
Jeff Johnson01f2c232018-11-21 19:17:44 -08001084 status = csr_ready(mac);
Jeff Johnsonc09caa42018-06-07 22:58:55 -07001085 if (QDF_IS_STATUS_ERROR(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07001086 sme_err("csr_ready failed with status: %d", status);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001087 break;
1088 }
1089
Jeff Johnson01f2c232018-11-21 19:17:44 -08001090 mac->sme.state = SME_STATE_READY;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001091 } while (0);
1092
1093 return status;
1094}
1095
Abhinav Kumar4d1f9f42019-05-07 13:14:49 +05301096#ifdef WLAN_BCN_RECV_FEATURE
1097QDF_STATUS
1098sme_register_bcn_report_pe_cb(mac_handle_t mac_handle, beacon_report_cb cb)
1099{
1100 struct scheduler_msg msg = {0};
1101 QDF_STATUS status;
1102
1103 msg.type = WNI_SME_REGISTER_BCN_REPORT_SEND_CB;
1104 msg.callback = cb;
1105
1106 status = scheduler_post_message(QDF_MODULE_ID_SME,
1107 QDF_MODULE_ID_PE,
1108 QDF_MODULE_ID_PE, &msg);
1109 if (QDF_IS_STATUS_ERROR(status))
1110 sme_err("Failed to post message to LIM");
1111
1112 return status;
1113}
1114#endif
1115
Manikandan Mohan932c11e2019-08-14 14:09:08 -07001116QDF_STATUS sme_get_valid_channels(uint32_t *ch_freq_list, uint32_t *list_len)
Tushnim Bhattacharyyac3c375e2017-08-04 23:39:55 -07001117{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08001118 struct mac_context *mac_ctx = sme_get_mac_context();
gaurank kathpalia5aafb672019-06-24 17:11:15 +05301119 uint32_t num_valid_chan;
Tushnim Bhattacharyyad1d0db92019-08-30 13:50:15 -07001120 uint8_t i;
Tushnim Bhattacharyyac3c375e2017-08-04 23:39:55 -07001121
Jeff Johnson038efe72019-03-18 13:39:31 -07001122 if (!mac_ctx) {
Tushnim Bhattacharyyac3c375e2017-08-04 23:39:55 -07001123 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
1124 FL("Invalid MAC context"));
gaurank kathpalia5aafb672019-06-24 17:11:15 +05301125 *list_len = 0;
Tushnim Bhattacharyyac3c375e2017-08-04 23:39:55 -07001126 return QDF_STATUS_E_FAILURE;
1127 }
1128
gaurank kathpalia5aafb672019-06-24 17:11:15 +05301129 num_valid_chan = mac_ctx->mlme_cfg->reg.valid_channel_list_num;
1130
1131 if (num_valid_chan > *list_len) {
1132 sme_err("list len size %d less than expected %d", *list_len,
1133 num_valid_chan);
1134 num_valid_chan = *list_len;
1135 }
1136 *list_len = num_valid_chan;
Tushnim Bhattacharyyad1d0db92019-08-30 13:50:15 -07001137 for (i = 0; i < *list_len; i++) {
Manikandan Mohan932c11e2019-08-14 14:09:08 -07001138 ch_freq_list[i] =
1139 mac_ctx->mlme_cfg->reg.valid_channel_freq_list[i];
Tushnim Bhattacharyyad1d0db92019-08-30 13:50:15 -07001140 }
Wu Gaof3cbeaf2019-01-15 18:26:25 +08001141
1142 return QDF_STATUS_SUCCESS;
Tushnim Bhattacharyyac3c375e2017-08-04 23:39:55 -07001143}
1144
Sandeep Puligilla8e89d572018-04-02 18:07:45 -07001145#ifdef WLAN_CONV_SPECTRAL_ENABLE
Jeff Johnson0a8786a2018-12-02 10:49:01 -08001146static QDF_STATUS sme_register_spectral_cb(struct mac_context *mac_ctx)
Sandeep Puligilla8e89d572018-04-02 18:07:45 -07001147{
1148 struct spectral_legacy_cbacks spectral_cb;
1149 QDF_STATUS status;
1150
1151 spectral_cb.vdev_get_chan_freq = sme_get_oper_chan_freq;
1152 spectral_cb.vdev_get_ch_width = sme_get_oper_ch_width;
1153 spectral_cb.vdev_get_sec20chan_freq_mhz = sme_get_sec20chan_freq_mhz;
1154 status = spectral_register_legacy_cb(mac_ctx->psoc, &spectral_cb);
1155
1156 return status;
1157}
1158#else
Jeff Johnson0a8786a2018-12-02 10:49:01 -08001159static QDF_STATUS sme_register_spectral_cb(struct mac_context *mac_ctx)
Sandeep Puligilla8e89d572018-04-02 18:07:45 -07001160{
1161 return QDF_STATUS_SUCCESS;
1162}
1163#endif
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05301164/*
1165 * sme_start() - Put all SME modules at ready state.
1166 * The function starts each module in SME, PMC, CSR, etc. . Upon
1167 * successfully return, all modules are ready to run.
1168 * This is a synchronous call
1169 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08001170 * mac_handle - The handle returned by mac_open.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05301171 * Return QDF_STATUS_SUCCESS - SME is ready.
1172 * Other status means SME is failed to start
1173 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08001174QDF_STATUS sme_start(mac_handle_t mac_handle)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001175{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301176 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08001177 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Tushnim Bhattacharyya91049632017-03-17 17:31:27 -07001178 struct policy_mgr_sme_cbacks sme_cbacks;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001179
1180 do {
Jeff Johnson01f2c232018-11-21 19:17:44 -08001181 status = csr_start(mac);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301182 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07001183 sme_err("csr_start failed status: %d", status);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001184 break;
1185 }
Tushnim Bhattacharyya91049632017-03-17 17:31:27 -07001186 sme_cbacks.sme_get_nss_for_vdev = sme_get_vdev_type_nss;
Tushnim Bhattacharyya91049632017-03-17 17:31:27 -07001187 sme_cbacks.sme_nss_update_request = sme_nss_update_request;
1188 sme_cbacks.sme_pdev_set_hw_mode = sme_pdev_set_hw_mode;
1189 sme_cbacks.sme_pdev_set_pcl = sme_pdev_set_pcl;
1190 sme_cbacks.sme_soc_set_dual_mac_config =
1191 sme_soc_set_dual_mac_config;
Archana Ramachandran2eb7a612017-03-23 22:58:42 -07001192 sme_cbacks.sme_change_mcc_beacon_interval =
1193 sme_change_mcc_beacon_interval;
1194 sme_cbacks.sme_get_ap_channel_from_scan =
1195 sme_get_ap_channel_from_scan;
1196 sme_cbacks.sme_scan_result_purge = sme_scan_result_purge;
Jeff Johnson01f2c232018-11-21 19:17:44 -08001197 status = policy_mgr_register_sme_cb(mac->psoc, &sme_cbacks);
Tushnim Bhattacharyya91049632017-03-17 17:31:27 -07001198 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda2c263352017-03-17 17:49:53 -07001199 sme_err("Failed to register sme cb with Policy Manager: %d",
Tushnim Bhattacharyya91049632017-03-17 17:31:27 -07001200 status);
1201 break;
1202 }
Jeff Johnson01f2c232018-11-21 19:17:44 -08001203 sme_register_spectral_cb(mac);
1204 mac->sme.state = SME_STATE_START;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001205
Sandeep Puligilla66d09c42017-09-06 17:10:27 -07001206 /* START RRM */
Jeff Johnson01f2c232018-11-21 19:17:44 -08001207 status = rrm_start(mac);
Sandeep Puligilla66d09c42017-09-06 17:10:27 -07001208 if (!QDF_IS_STATUS_SUCCESS(status)) {
1209 sme_err("Failed to start RRM");
1210 break;
1211 }
1212 } while (0);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001213 return status;
1214}
1215
Jeff Johnson0a8786a2018-12-02 10:49:01 -08001216static QDF_STATUS dfs_msg_processor(struct mac_context *mac,
Arif Hussaincd151632017-02-11 16:57:19 -08001217 struct scheduler_msg *msg)
1218{
1219 QDF_STATUS status = QDF_STATUS_SUCCESS;
Min Liu3621ede2018-11-07 18:36:00 +08001220 struct csr_roam_info *roam_info;
Arif Hussaincd151632017-02-11 16:57:19 -08001221 tSirSmeCSAIeTxCompleteRsp *csa_ie_tx_complete_rsp;
1222 uint32_t session_id = 0;
1223 eRoamCmdStatus roam_status;
1224 eCsrRoamResult roam_result;
1225
Min Liu3621ede2018-11-07 18:36:00 +08001226 roam_info = qdf_mem_malloc(sizeof(*roam_info));
1227 if (!roam_info)
1228 return QDF_STATUS_E_NOMEM;
1229
Arif Hussaincd151632017-02-11 16:57:19 -08001230 switch (msg->type) {
1231 case eWNI_SME_DFS_RADAR_FOUND:
1232 {
bings3d18e552019-08-21 18:26:47 +08001233 session_id = policy_mgr_get_dfs_beaconing_session_id(mac->psoc);
1234 if (!CSR_IS_SESSION_VALID(mac, session_id)) {
1235 sme_err("CSR session not valid: %d", session_id);
1236 qdf_mem_free(roam_info);
1237 return QDF_STATUS_E_FAILURE;
1238 }
Arif Hussaincd151632017-02-11 16:57:19 -08001239 roam_status = eCSR_ROAM_DFS_RADAR_IND;
1240 roam_result = eCSR_ROAM_RESULT_DFS_RADAR_FOUND_IND;
Abhishek Singhe4a1f882017-08-10 17:59:44 +05301241 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Arif Hussaincd151632017-02-11 16:57:19 -08001242 "sapdfs: Radar indication event occurred");
1243 break;
1244 }
1245 case eWNI_SME_DFS_CSAIE_TX_COMPLETE_IND:
1246 {
1247 csa_ie_tx_complete_rsp =
1248 (tSirSmeCSAIeTxCompleteRsp *) msg->bodyptr;
1249 if (!csa_ie_tx_complete_rsp) {
1250 sme_err("eWNI_SME_DFS_CSAIE_TX_COMPLETE_IND null msg");
Min Liu3621ede2018-11-07 18:36:00 +08001251 qdf_mem_free(roam_info);
Arif Hussaincd151632017-02-11 16:57:19 -08001252 return QDF_STATUS_E_FAILURE;
1253 }
1254 session_id = csa_ie_tx_complete_rsp->sessionId;
1255 roam_status = eCSR_ROAM_DFS_CHAN_SW_NOTIFY;
1256 roam_result = eCSR_ROAM_RESULT_DFS_CHANSW_UPDATE_SUCCESS;
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 "eWNI_SME_DFS_CSAIE_TX_COMPLETE_IND session=%d",
1259 session_id);
1260 break;
1261 }
1262 case eWNI_SME_DFS_CAC_COMPLETE:
1263 {
1264 session_id = msg->bodyval;
1265 roam_status = eCSR_ROAM_CAC_COMPLETE_IND;
1266 roam_result = eCSR_ROAM_RESULT_CAC_END_IND;
Abhishek Singhe4a1f882017-08-10 17:59:44 +05301267 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Arif Hussaincd151632017-02-11 16:57:19 -08001268 "sapdfs: Received eWNI_SME_DFS_CAC_COMPLETE vdevid%d",
1269 session_id);
1270 break;
1271 }
Abhishek Singh20a8e442018-09-12 15:50:44 +05301272 case eWNI_SME_CSA_RESTART_RSP:
1273 {
1274 session_id = msg->bodyval;
1275 roam_status = 0;
1276 roam_result = eCSR_ROAM_RESULT_CSA_RESTART_RSP;
1277 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
1278 "sapdfs: Received eCSR_ROAM_RESULT_DFS_CHANSW_UPDATE_REQ vdevid%d",
1279 session_id);
1280 break;
1281 }
Arif Hussaincd151632017-02-11 16:57:19 -08001282 default:
1283 {
1284 sme_err("Invalid DFS message: 0x%x", msg->type);
Min Liu3621ede2018-11-07 18:36:00 +08001285 qdf_mem_free(roam_info);
Arif Hussaincd151632017-02-11 16:57:19 -08001286 status = QDF_STATUS_E_FAILURE;
1287 return status;
1288 }
1289 }
1290
1291 /* Indicate Radar Event to SAP */
Min Liu3621ede2018-11-07 18:36:00 +08001292 csr_roam_call_callback(mac, session_id, roam_info, 0,
Arif Hussaincd151632017-02-11 16:57:19 -08001293 roam_status, roam_result);
Min Liu3621ede2018-11-07 18:36:00 +08001294 qdf_mem_free(roam_info);
Arif Hussaincd151632017-02-11 16:57:19 -08001295 return status;
1296}
1297
1298
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001299#ifdef WLAN_FEATURE_11W
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05301300/*
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001301 * Handle the unprotected management frame indication from LIM and
1302 * forward it to HDD.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05301303 */
Jeff Johnson2ef47442018-06-09 23:43:40 -07001304static QDF_STATUS
Jeff Johnson0a8786a2018-12-02 10:49:01 -08001305sme_unprotected_mgmt_frm_ind(struct mac_context *mac,
Jeff Johnson2ef47442018-06-09 23:43:40 -07001306 tpSirSmeUnprotMgmtFrameInd pSmeMgmtFrm)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001307{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301308 QDF_STATUS status = QDF_STATUS_SUCCESS;
Min Liu3621ede2018-11-07 18:36:00 +08001309 struct csr_roam_info *roam_info;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001310 uint32_t SessionId = pSmeMgmtFrm->sessionId;
1311
Min Liu3621ede2018-11-07 18:36:00 +08001312 roam_info = qdf_mem_malloc(sizeof(*roam_info));
1313 if (!roam_info)
1314 return QDF_STATUS_E_NOMEM;
1315
1316 roam_info->nFrameLength = pSmeMgmtFrm->frameLen;
1317 roam_info->pbFrames = pSmeMgmtFrm->frameBuf;
1318 roam_info->frameType = pSmeMgmtFrm->frameType;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001319
1320 /* forward the mgmt frame to HDD */
Min Liu3621ede2018-11-07 18:36:00 +08001321 csr_roam_call_callback(mac, SessionId, roam_info, 0,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001322 eCSR_ROAM_UNPROT_MGMT_FRAME_IND, 0);
1323
Min Liu3621ede2018-11-07 18:36:00 +08001324 qdf_mem_free(roam_info);
1325
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001326 return status;
1327}
1328#endif
1329
Jeff Johnsonc7309062018-11-09 20:59:42 -08001330QDF_STATUS sme_update_new_channel_event(mac_handle_t mac_handle,
1331 uint8_t session_id)
Kapil Gupta8878ad92017-02-13 11:56:04 +05301332{
1333 QDF_STATUS status = QDF_STATUS_SUCCESS;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08001334 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Jeff Johnson172237b2017-11-07 15:32:59 -08001335 struct csr_roam_info *roamInfo;
Kapil Gupta8878ad92017-02-13 11:56:04 +05301336 eRoamCmdStatus roamStatus;
1337 eCsrRoamResult roamResult;
1338
1339 roamInfo = qdf_mem_malloc(sizeof(*roamInfo));
Arif Hussain0ef77082018-10-10 16:42:53 -07001340 if (!roamInfo)
Krunal Soni3fa80e22018-01-09 14:16:02 -08001341 return QDF_STATUS_E_FAILURE;
Kapil Gupta8878ad92017-02-13 11:56:04 +05301342
Arif Hussain0ef77082018-10-10 16:42:53 -07001343 roamInfo->dfs_event.sessionId = session_id;
Kapil Gupta8878ad92017-02-13 11:56:04 +05301344 roamStatus = eCSR_ROAM_CHANNEL_COMPLETE_IND;
1345 roamResult = eCSR_ROAM_RESULT_DFS_RADAR_FOUND_IND;
Abhishek Singhe4a1f882017-08-10 17:59:44 +05301346 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Kapil Gupta8878ad92017-02-13 11:56:04 +05301347 "sapdfs: Updated new channel event");
1348
1349 /* Indicate channel Event to SAP */
1350 csr_roam_call_callback(mac, session_id, roamInfo, 0,
1351 roamStatus, roamResult);
1352
1353 qdf_mem_free(roamInfo);
1354 return status;
1355}
1356
1357
Abhishek Singh518323d2015-10-19 17:42:01 +05301358/**
1359 * sme_extended_change_channel_ind()- function to indicate ECSA
1360 * action frame is received in lim to SAP
1361 * @mac_ctx: pointer to global mac structure
1362 * @msg_buf: contain new channel and session id.
1363 *
1364 * This function is called to post ECSA action frame
1365 * receive event to SAP.
1366 *
1367 * Return: success if msg indicated to SAP else return failure
1368 */
Jeff Johnson0a8786a2018-12-02 10:49:01 -08001369static QDF_STATUS sme_extended_change_channel_ind(struct mac_context *mac_ctx,
Abhishek Singh518323d2015-10-19 17:42:01 +05301370 void *msg_buf)
1371{
1372 struct sir_sme_ext_cng_chan_ind *ext_chan_ind;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301373 QDF_STATUS status = QDF_STATUS_SUCCESS;
Abhishek Singh518323d2015-10-19 17:42:01 +05301374 uint32_t session_id = 0;
Min Liu3621ede2018-11-07 18:36:00 +08001375 struct csr_roam_info *roam_info;
Abhishek Singh518323d2015-10-19 17:42:01 +05301376 eRoamCmdStatus roam_status;
1377 eCsrRoamResult roam_result;
1378
Abhishek Singh518323d2015-10-19 17:42:01 +05301379 ext_chan_ind = msg_buf;
Jeff Johnson038efe72019-03-18 13:39:31 -07001380 if (!ext_chan_ind) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07001381 sme_err("ext_chan_ind is NULL");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301382 return QDF_STATUS_E_FAILURE;
Abhishek Singh518323d2015-10-19 17:42:01 +05301383 }
Min Liu3621ede2018-11-07 18:36:00 +08001384 roam_info = qdf_mem_malloc(sizeof(*roam_info));
1385 if (!roam_info)
1386 return QDF_STATUS_E_NOMEM;
Abhishek Singh518323d2015-10-19 17:42:01 +05301387 session_id = ext_chan_ind->session_id;
Tushnim Bhattacharyya6c40b112019-10-30 11:39:25 -07001388 roam_info->target_chan_freq = ext_chan_ind->new_chan_freq;
Abhishek Singh518323d2015-10-19 17:42:01 +05301389 roam_status = eCSR_ROAM_EXT_CHG_CHNL_IND;
1390 roam_result = eCSR_ROAM_EXT_CHG_CHNL_UPDATE_IND;
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07001391 sme_debug("sapdfs: Received eWNI_SME_EXT_CHANGE_CHANNEL_IND for session id [%d]",
1392 session_id);
Abhishek Singh518323d2015-10-19 17:42:01 +05301393
1394 /* Indicate Ext Channel Change event to SAP */
Min Liu3621ede2018-11-07 18:36:00 +08001395 csr_roam_call_callback(mac_ctx, session_id, roam_info, 0,
1396 roam_status, roam_result);
1397 qdf_mem_free(roam_info);
Abhishek Singh518323d2015-10-19 17:42:01 +05301398 return status;
1399}
1400
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001401#ifdef FEATURE_WLAN_ESE
1402/**
1403 * sme_update_is_ese_feature_enabled() - enable/disable ESE support at runtime
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -08001404 * @mac_handle: Opaque handle to the global MAC context
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001405 * @sessionId: session id
1406 * @isEseIniFeatureEnabled: ese ini enabled
1407 *
1408 * It is used at in the REG_DYNAMIC_VARIABLE macro definition of
1409 * isEseIniFeatureEnabled. This is a synchronous call
1410 *
1411 * Return: QDF_STATUS enumeration
1412 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08001413QDF_STATUS sme_update_is_ese_feature_enabled(mac_handle_t mac_handle,
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001414 uint8_t sessionId, const bool isEseIniFeatureEnabled)
1415{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08001416 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Vignesh Viswanathan4e65e8e2018-05-01 12:04:16 +05301417 QDF_STATUS status;
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001418
Wu Gao51a63562018-11-08 16:29:10 +08001419 if (mac->mlme_cfg->lfr.ese_enabled ==
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001420 isEseIniFeatureEnabled) {
Abhishek Singhe4a1f882017-08-10 17:59:44 +05301421 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001422 "%s: ESE Mode is already enabled or disabled, nothing to do (returning) old(%d) new(%d)",
1423 __func__,
Wu Gao51a63562018-11-08 16:29:10 +08001424 mac->mlme_cfg->lfr.ese_enabled,
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001425 isEseIniFeatureEnabled);
1426 return QDF_STATUS_SUCCESS;
1427 }
1428
Abhishek Singhe4a1f882017-08-10 17:59:44 +05301429 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001430 "%s: EseEnabled is changed from %d to %d", __func__,
Wu Gao51a63562018-11-08 16:29:10 +08001431 mac->mlme_cfg->lfr.ese_enabled,
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001432 isEseIniFeatureEnabled);
Wu Gao51a63562018-11-08 16:29:10 +08001433 mac->mlme_cfg->lfr.ese_enabled = isEseIniFeatureEnabled;
Varun Reddy Yeturuff4feb02016-04-20 12:26:11 -07001434 csr_neighbor_roam_update_fast_roaming_enabled(
Jeff Johnson01f2c232018-11-21 19:17:44 -08001435 mac, sessionId, isEseIniFeatureEnabled);
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001436
1437 if (true == isEseIniFeatureEnabled)
Wu Gao51a63562018-11-08 16:29:10 +08001438 mac->mlme_cfg->lfr.fast_transition_enabled = true;
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001439
Wu Gao51a63562018-11-08 16:29:10 +08001440 if (mac->mlme_cfg->lfr.roam_scan_offload_enabled) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08001441 status = sme_acquire_global_lock(&mac->sme);
Vignesh Viswanathan4e65e8e2018-05-01 12:04:16 +05301442 if (QDF_IS_STATUS_SUCCESS(status)) {
Abhinav Kumar523ca372019-08-30 16:28:19 +05301443 csr_roam_update_cfg(mac, sessionId,
1444 REASON_ESE_INI_CFG_CHANGED);
Jeff Johnson01f2c232018-11-21 19:17:44 -08001445 sme_release_global_lock(&mac->sme);
Vignesh Viswanathan4e65e8e2018-05-01 12:04:16 +05301446 } else {
Vignesh Viswanathan4e65e8e2018-05-01 12:04:16 +05301447 return status;
1448 }
1449 }
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001450 return QDF_STATUS_SUCCESS;
1451}
1452
Jeff Johnson36583f02019-02-26 08:02:11 -08001453QDF_STATUS sme_set_plm_request(mac_handle_t mac_handle,
1454 struct plm_req_params *req)
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001455{
1456 QDF_STATUS status;
1457 bool ret = false;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08001458 struct mac_context *mac = MAC_CONTEXT(mac_handle);
wadesong88aa89a2019-11-04 12:34:12 +08001459 uint32_t ch_freq_list[CFG_VALID_CHANNEL_LIST_LEN] = { 0 };
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001460 uint8_t count, valid_count = 0;
Rajeev Kumar37d478b2017-04-17 16:59:28 -07001461 struct scheduler_msg msg = {0};
Jeff Johnson36583f02019-02-26 08:02:11 -08001462 struct csr_roam_session *session;
1463 struct plm_req_params *body;
wadesong88aa89a2019-11-04 12:34:12 +08001464 uint32_t ch_freq;
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001465
Harprit Chhabadacb9f73c2019-04-04 14:24:43 -07001466 if (!req)
1467 return QDF_STATUS_E_FAILURE;
1468
Jeff Johnson01f2c232018-11-21 19:17:44 -08001469 status = sme_acquire_global_lock(&mac->sme);
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001470 if (!QDF_IS_STATUS_SUCCESS(status))
1471 return status;
1472
Jeff Johnson36583f02019-02-26 08:02:11 -08001473 session = CSR_GET_SESSION(mac, req->vdev_id);
1474 if (!session) {
1475 sme_err("session %d not found", req->vdev_id);
Jeff Johnson01f2c232018-11-21 19:17:44 -08001476 sme_release_global_lock(&mac->sme);
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001477 return QDF_STATUS_E_FAILURE;
1478 }
1479
Jeff Johnson36583f02019-02-26 08:02:11 -08001480 if (!session->sessionActive) {
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001481 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
1482 FL("Invalid Sessionid"));
Jeff Johnson01f2c232018-11-21 19:17:44 -08001483 sme_release_global_lock(&mac->sme);
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001484 return QDF_STATUS_E_FAILURE;
1485 }
1486
Jeff Johnson36583f02019-02-26 08:02:11 -08001487 /* per contract must make a copy of the params when messaging */
1488 body = qdf_mem_malloc(sizeof(*body));
Harprit Chhabadacb9f73c2019-04-04 14:24:43 -07001489
1490 if (!body) {
1491 sme_release_global_lock(&mac->sme);
Jeff Johnson36583f02019-02-26 08:02:11 -08001492 return QDF_STATUS_E_NOMEM;
Harprit Chhabadacb9f73c2019-04-04 14:24:43 -07001493 }
1494
Jeff Johnson36583f02019-02-26 08:02:11 -08001495 *body = *req;
1496
1497 if (!body->enable)
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001498 goto send_plm_start;
1499 /* validating channel numbers */
Jeff Johnson36583f02019-02-26 08:02:11 -08001500 for (count = 0; count < body->plm_num_ch; count++) {
wadesong88aa89a2019-11-04 12:34:12 +08001501 ch_freq = body->plm_ch_freq_list[count];
1502 ret = csr_is_supported_channel(mac, ch_freq);
Jeff Johnson36583f02019-02-26 08:02:11 -08001503 if (!ret) {
1504 /* Not supported, ignore the channel */
1505 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
wadesong88aa89a2019-11-04 12:34:12 +08001506 FL("Unsupported freq %d ignored for PLM"),
1507 ch_freq);
Jeff Johnson36583f02019-02-26 08:02:11 -08001508 continue;
1509 }
1510
wadesong88aa89a2019-11-04 12:34:12 +08001511 if (ch_freq > 2477) {
Jeff Johnson36583f02019-02-26 08:02:11 -08001512 enum channel_state state =
wadesong88aa89a2019-11-04 12:34:12 +08001513 wlan_reg_get_channel_state_for_freq(
1514 mac->pdev, ch_freq);
Jeff Johnson36583f02019-02-26 08:02:11 -08001515
1516 if (state == CHANNEL_STATE_DFS) {
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001517 /* DFS channel is provided, no PLM bursts can be
1518 * transmitted. Ignoring these channels.
1519 */
1520 QDF_TRACE(QDF_MODULE_ID_SME,
Abhishek Singhe4a1f882017-08-10 17:59:44 +05301521 QDF_TRACE_LEVEL_DEBUG,
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001522 FL("DFS channel %d ignored for PLM"),
wadesong88aa89a2019-11-04 12:34:12 +08001523 ch_freq);
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001524 continue;
1525 }
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001526 }
wadesong88aa89a2019-11-04 12:34:12 +08001527 ch_freq_list[valid_count++] = ch_freq;
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001528 } /* End of for () */
1529
1530 /* Copying back the valid channel list to plm struct */
wadesong88aa89a2019-11-04 12:34:12 +08001531 qdf_mem_zero(body->plm_ch_freq_list, body->plm_num_ch);
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001532 if (valid_count)
wadesong88aa89a2019-11-04 12:34:12 +08001533 qdf_mem_copy(body->plm_ch_freq_list, ch_freq_list, valid_count);
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001534 /* All are invalid channels, FW need to send the PLM
1535 * report with "incapable" bit set.
1536 */
Jeff Johnson36583f02019-02-26 08:02:11 -08001537 body->plm_num_ch = valid_count;
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001538
1539send_plm_start:
1540 /* PLM START */
1541 msg.type = WMA_SET_PLM_REQ;
1542 msg.reserved = 0;
Jeff Johnson36583f02019-02-26 08:02:11 -08001543 msg.bodyptr = body;
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001544
gaurank kathpalia36b0c582018-08-28 17:45:43 +05301545 if (!QDF_IS_STATUS_SUCCESS(scheduler_post_message(QDF_MODULE_ID_SME,
1546 QDF_MODULE_ID_WMA,
1547 QDF_MODULE_ID_WMA,
1548 &msg))) {
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001549 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
1550 FL("Not able to post WMA_SET_PLM_REQ to WMA"));
Jeff Johnson01f2c232018-11-21 19:17:44 -08001551 sme_release_global_lock(&mac->sme);
Jeff Johnson36583f02019-02-26 08:02:11 -08001552 qdf_mem_free(body);
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001553 return QDF_STATUS_E_FAILURE;
1554 }
1555
Jeff Johnson01f2c232018-11-21 19:17:44 -08001556 sme_release_global_lock(&mac->sme);
Jeff Johnson36583f02019-02-26 08:02:11 -08001557 return QDF_STATUS_SUCCESS;
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001558}
1559
1560/**
1561 * sme_tsm_ie_ind() - sme tsm ie indication
Jeff Johnson24e65b52018-06-10 08:45:26 -07001562 * @mac: Global mac context
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001563 * @pSmeTsmIeInd: Pointer to tsm ie indication
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001564 *
1565 * Handle the tsm ie indication from LIM and forward it to HDD.
1566 *
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001567 * Return: QDF_STATUS enumeration
1568 */
Jeff Johnson0a8786a2018-12-02 10:49:01 -08001569static QDF_STATUS sme_tsm_ie_ind(struct mac_context *mac,
Jeff Johnsone21b0eb2019-02-02 19:31:54 -08001570 struct tsm_ie_ind *pSmeTsmIeInd)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001571{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301572 QDF_STATUS status = QDF_STATUS_SUCCESS;
Min Liu3621ede2018-11-07 18:36:00 +08001573 struct csr_roam_info *roam_info;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001574 uint32_t SessionId = pSmeTsmIeInd->sessionId;
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05301575
Min Liu3621ede2018-11-07 18:36:00 +08001576 roam_info = qdf_mem_malloc(sizeof(*roam_info));
1577 if (!roam_info)
1578 return QDF_STATUS_E_NOMEM;
1579
1580 roam_info->tsm_ie.tsid = pSmeTsmIeInd->tsm_ie.tsid;
1581 roam_info->tsm_ie.state = pSmeTsmIeInd->tsm_ie.state;
1582 roam_info->tsm_ie.msmt_interval = pSmeTsmIeInd->tsm_ie.msmt_interval;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001583 /* forward the tsm ie information to HDD */
Min Liu3621ede2018-11-07 18:36:00 +08001584 csr_roam_call_callback(mac, SessionId, roam_info, 0,
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05301585 eCSR_ROAM_TSM_IE_IND, 0);
Min Liu3621ede2018-11-07 18:36:00 +08001586 qdf_mem_free(roam_info);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001587 return status;
1588}
1589
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001590/**
1591 * sme_set_cckm_ie() - set cckm ie
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -08001592 * @mac_handle: Opaque handle to the global MAC context
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001593 * @sessionId: session id
1594 * @pCckmIe: Pointer to CCKM Ie
1595 * @cckmIeLen: Length of @pCckmIe
1596 *
1597 * Function to store the CCKM IE passed from supplicant and use
1598 * it while packing reassociation request.
1599 *
1600 * Return: QDF_STATUS enumeration
1601 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08001602QDF_STATUS sme_set_cckm_ie(mac_handle_t mac_handle, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001603 uint8_t *pCckmIe, uint8_t cckmIeLen)
1604{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08001605 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301606 QDF_STATUS status = QDF_STATUS_SUCCESS;
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05301607
Jeff Johnson01f2c232018-11-21 19:17:44 -08001608 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301609 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08001610 csr_set_cckm_ie(mac, sessionId, pCckmIe, cckmIeLen);
1611 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001612 }
1613 return status;
1614}
1615
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001616/**
1617 * sme_set_ese_beacon_request() - set ese beacon request
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -08001618 * @mac_handle: Opaque handle to the global MAC context
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001619 * @sessionId: session id
Jeff Johnsonb2c3d042019-02-26 12:23:26 -08001620 * @in_req: Ese beacon report request
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001621 *
1622 * function to set ESE beacon request parameters
1623 *
1624 * Return: QDF_STATUS enumeration
1625 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08001626QDF_STATUS sme_set_ese_beacon_request(mac_handle_t mac_handle,
Jeff Johnson1f2dabc2018-11-07 15:33:01 -08001627 const uint8_t sessionId,
Jeff Johnsonb2c3d042019-02-26 12:23:26 -08001628 const tCsrEseBeaconReq *in_req)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001629{
Varun Reddy Yeturu7b2a6572017-06-15 11:07:28 -07001630 QDF_STATUS status;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08001631 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Will Huang2f114542019-10-31 17:35:29 +08001632 tpSirBeaconReportReqInd sme_bcn_rpt_req = NULL;
1633 const tCsrEseBeaconReqParams *bcn_req = NULL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001634 uint8_t counter = 0;
Will Huang2f114542019-10-31 17:35:29 +08001635 struct csr_roam_session *session = CSR_GET_SESSION(mac, sessionId);
1636 tpRrmSMEContext sme_rrm_ctx = &mac->rrm.rrmSmeContext;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001637
Will Huang2f114542019-10-31 17:35:29 +08001638 if (sme_rrm_ctx->eseBcnReqInProgress == true) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07001639 sme_err("A Beacon Report Req is already in progress");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301640 return QDF_STATUS_E_RESOURCES;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001641 }
1642
1643 /* Store the info in RRM context */
Will Huang2f114542019-10-31 17:35:29 +08001644 qdf_mem_copy(&sme_rrm_ctx->eseBcnReqInfo, in_req,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001645 sizeof(tCsrEseBeaconReq));
1646
1647 /* Prepare the request to send to SME. */
Will Huang2f114542019-10-31 17:35:29 +08001648 sme_bcn_rpt_req = qdf_mem_malloc(sizeof(tSirBeaconReportReqInd));
1649 if (!sme_bcn_rpt_req)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301650 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001651
Will Huang2f114542019-10-31 17:35:29 +08001652 sme_rrm_ctx->eseBcnReqInProgress = true;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001653
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07001654 sme_debug("Sending Beacon Report Req to SME");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001655
Will Huang2f114542019-10-31 17:35:29 +08001656 sme_bcn_rpt_req->messageType = eWNI_SME_BEACON_REPORT_REQ_IND;
1657 sme_bcn_rpt_req->length = sizeof(tSirBeaconReportReqInd);
1658 qdf_mem_copy(sme_bcn_rpt_req->bssId,
1659 session->connectedProfile.bssid.bytes,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001660 sizeof(tSirMacAddr));
Will Huang2f114542019-10-31 17:35:29 +08001661 sme_bcn_rpt_req->channel_info.chan_num = 255;
1662 sme_bcn_rpt_req->channel_list.num_channels = in_req->numBcnReqIe;
1663 sme_bcn_rpt_req->msgSource = eRRM_MSG_SOURCE_ESE_UPLOAD;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001664
Jeff Johnsonb2c3d042019-02-26 12:23:26 -08001665 for (counter = 0; counter < in_req->numBcnReqIe; counter++) {
Will Huang2f114542019-10-31 17:35:29 +08001666 bcn_req = &in_req->bcnReq[counter];
1667 sme_bcn_rpt_req->fMeasurementtype[counter] =
1668 bcn_req->scanMode;
1669 sme_bcn_rpt_req->measurementDuration[counter] =
1670 SYS_TU_TO_MS(bcn_req->measurementDuration);
1671 sme_bcn_rpt_req->channel_list.chan_freq_lst[counter] =
1672 bcn_req->ch_freq;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001673 }
1674
Will Huang2f114542019-10-31 17:35:29 +08001675 status = sme_rrm_process_beacon_report_req_ind(mac, sme_bcn_rpt_req);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001676
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301677 if (status != QDF_STATUS_SUCCESS)
Will Huang2f114542019-10-31 17:35:29 +08001678 sme_rrm_ctx->eseBcnReqInProgress = false;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001679
Will Huang2f114542019-10-31 17:35:29 +08001680 qdf_mem_free(sme_bcn_rpt_req);
Hanumanth Reddy Pothula7f7a2712016-09-07 18:44:47 +05301681
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001682 return status;
1683}
1684
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001685/**
1686 * sme_get_tsm_stats() - SME get tsm stats
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -08001687 * @mac_handle: Opaque handle to the global MAC context
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001688 * @callback: SME sends back the requested stats using the callback
1689 * @staId: The station ID for which the stats is requested for
1690 * @bssId: bssid
1691 * @pContext: user context to be passed back along with the callback
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001692 * @tid: Traffic id
1693 *
1694 * API register a callback to get TSM Stats.
1695 *
1696 * Return: QDF_STATUS enumeration
1697 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08001698QDF_STATUS sme_get_tsm_stats(mac_handle_t mac_handle,
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001699 tCsrTsmStatsCallback callback,
Sourav Mohapatradcd8f8d2019-07-03 15:43:15 +05301700 struct qdf_mac_addr bssId,
Jeff Johnson30f84552017-09-13 14:55:25 -07001701 void *pContext, uint8_t tid)
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001702{
1703 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08001704 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001705
Jeff Johnson01f2c232018-11-21 19:17:44 -08001706 status = sme_acquire_global_lock(&mac->sme);
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001707 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08001708 status = csr_get_tsm_stats(mac, callback,
Sourav Mohapatradcd8f8d2019-07-03 15:43:15 +05301709 bssId, pContext,
Jeff Johnson30f84552017-09-13 14:55:25 -07001710 tid);
Jeff Johnson01f2c232018-11-21 19:17:44 -08001711 sme_release_global_lock(&mac->sme);
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001712 }
1713 return status;
1714}
1715
1716/**
1717 * sme_set_ese_roam_scan_channel_list() - To set ese roam scan channel list
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -08001718 * @mac_handle: Opaque handle to the global MAC context
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001719 * @sessionId: sme session id
Liangwei Dong075afa72019-10-30 12:58:22 +08001720 * @chan_freq_list: Output channel list
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001721 * @numChannels: Output number of channels
1722 *
1723 * This routine is called to set ese roam scan channel list.
1724 * This is a synchronous call
1725 *
1726 * Return: QDF_STATUS
1727 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08001728QDF_STATUS sme_set_ese_roam_scan_channel_list(mac_handle_t mac_handle,
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001729 uint8_t sessionId,
Liangwei Dong075afa72019-10-30 12:58:22 +08001730 uint32_t *chan_freq_list,
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001731 uint8_t numChannels)
1732{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08001733 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001734 QDF_STATUS status = QDF_STATUS_SUCCESS;
Naveen Rawatc36f7eb2016-11-10 20:01:03 -08001735 tpCsrNeighborRoamControlInfo pNeighborRoamInfo = NULL;
1736 tpCsrChannelInfo curchnl_list_info = NULL;
Liangwei Dong075afa72019-10-30 12:58:22 +08001737 uint8_t oldChannelList[CFG_VALID_CHANNEL_LIST_LEN * 5] = { 0 };
1738 uint8_t newChannelList[CFG_VALID_CHANNEL_LIST_LEN * 5] = { 0 };
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001739 uint8_t i = 0, j = 0;
Harprit Chhabada5dff30e2019-03-12 17:56:45 -07001740 enum band_info band = -1;
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001741
Dustin Brownad06be62019-02-04 14:52:56 -08001742 if (sessionId >= WLAN_MAX_VDEVS) {
Naveen Rawatc36f7eb2016-11-10 20:01:03 -08001743 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
1744 FL("Invalid sme session id: %d"), sessionId);
1745 return QDF_STATUS_E_INVAL;
1746 }
1747
Jeff Johnson01f2c232018-11-21 19:17:44 -08001748 pNeighborRoamInfo = &mac->roam.neighborRoamInfo[sessionId];
Naveen Rawatc36f7eb2016-11-10 20:01:03 -08001749 curchnl_list_info =
1750 &pNeighborRoamInfo->roamChannelInfo.currentChannelListInfo;
1751
Jeff Johnson01f2c232018-11-21 19:17:44 -08001752 status = sme_acquire_global_lock(&mac->sme);
Madhvapathi Sriram3e6627a2018-12-19 12:54:49 +05301753 if (!QDF_IS_STATUS_SUCCESS(status))
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001754 return status;
Madhvapathi Sriram3e6627a2018-12-19 12:54:49 +05301755
Liangwei Dong4d8c7622019-07-31 17:31:55 +08001756 if (curchnl_list_info->freq_list) {
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001757 for (i = 0; i < curchnl_list_info->numOfChannels; i++) {
1758 j += snprintf(oldChannelList + j,
1759 sizeof(oldChannelList) - j, "%d",
Liangwei Dong4d8c7622019-07-31 17:31:55 +08001760 curchnl_list_info->freq_list[i]);
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001761 }
1762 }
Harprit Chhabada5dff30e2019-03-12 17:56:45 -07001763 ucfg_reg_get_band(mac->pdev, &band);
Jeff Johnson01f2c232018-11-21 19:17:44 -08001764 status = csr_create_roam_scan_channel_list(mac, sessionId,
Liangwei Dong075afa72019-10-30 12:58:22 +08001765 chan_freq_list, numChannels,
Harprit Chhabada5dff30e2019-03-12 17:56:45 -07001766 band);
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001767 if (QDF_IS_STATUS_SUCCESS(status)) {
Liangwei Dong4d8c7622019-07-31 17:31:55 +08001768 if (curchnl_list_info->freq_list) {
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001769 j = 0;
1770 for (i = 0; i < curchnl_list_info->numOfChannels; i++) {
1771 j += snprintf(newChannelList + j,
1772 sizeof(newChannelList) - j, "%d",
Liangwei Dong4d8c7622019-07-31 17:31:55 +08001773 curchnl_list_info->freq_list[i]);
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001774 }
1775 }
1776 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
1777 "ESE roam scan chnl list successfully set to %s-old value is %s-roam state is %d",
1778 newChannelList, oldChannelList,
1779 pNeighborRoamInfo->neighborRoamState);
1780 }
Vignesh Viswanathan4e65e8e2018-05-01 12:04:16 +05301781
Wu Gao51a63562018-11-08 16:29:10 +08001782 if (mac->mlme_cfg->lfr.roam_scan_offload_enabled)
Abhinav Kumar523ca372019-08-30 16:28:19 +05301783 csr_roam_update_cfg(mac, sessionId,
1784 REASON_CHANNEL_LIST_CHANGED);
Vignesh Viswanathan4e65e8e2018-05-01 12:04:16 +05301785
Jeff Johnson01f2c232018-11-21 19:17:44 -08001786 sme_release_global_lock(&mac->sme);
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001787 return status;
1788}
1789
1790#endif /* FEATURE_WLAN_ESE */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001791
Abhishek Amburee0fe68d2019-09-18 15:06:32 +05301792#ifdef QCA_IBSS_SUPPORT
1793/**
1794 * sme_ibss_peer_info_response_handler() - Handler for ibss peer info
1795 * @mac: Global MAC pointer
1796 * @sme_ibss_peer_info_response_handler: ibss peer info params
1797 *
1798 * Return: QDF_STATUS
1799 */
Jeff Johnson49c02f92016-10-07 10:29:09 -07001800static
Jeff Johnson0a8786a2018-12-02 10:49:01 -08001801QDF_STATUS sme_ibss_peer_info_response_handler(struct mac_context *mac,
Jeff Johnson49c02f92016-10-07 10:29:09 -07001802 tpSirIbssGetPeerInfoRspParams
1803 pIbssPeerInfoParams)
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08001804{
Jeff Johnson56ba88a2019-02-17 17:18:43 -08001805 struct ibss_peer_info_cb_info *cb_info;
1806
1807 if (!mac) {
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08001808 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_FATAL,
Jeff Johnson01f2c232018-11-21 19:17:44 -08001809 "%s: mac is null", __func__);
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08001810 return QDF_STATUS_E_FAILURE;
1811 }
Jeff Johnsone7aa5cd2019-02-17 19:36:01 -08001812 cb_info = &mac->sme.peer_info_cb_info;
Jeff Johnson56ba88a2019-02-17 17:18:43 -08001813 if (!cb_info->peer_info_cb) {
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08001814 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
1815 "%s: HDD callback is null", __func__);
1816 return QDF_STATUS_E_FAILURE;
1817 }
Jeff Johnson56ba88a2019-02-17 17:18:43 -08001818 cb_info->peer_info_cb(cb_info->peer_info_cb_context,
1819 &pIbssPeerInfoParams->ibssPeerInfoRspParams);
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08001820 return QDF_STATUS_SUCCESS;
1821}
1822
Abhishek Amburee0fe68d2019-09-18 15:06:32 +05301823QDF_STATUS sme_request_ibss_peer_info(mac_handle_t mac_handle, void *cb_context,
1824 ibss_peer_info_cb peer_info_cb,
Yeshwanth Sriram Guntuka3f262102019-07-16 15:41:08 +05301825 bool allPeerInfoReqd, uint8_t *mac_addr)
Abhishek Amburee0fe68d2019-09-18 15:06:32 +05301826{
1827 QDF_STATUS status = QDF_STATUS_E_FAILURE;
1828 QDF_STATUS qdf_status = QDF_STATUS_E_FAILURE;
1829 struct mac_context *mac = MAC_CONTEXT(mac_handle);
1830 struct scheduler_msg message = {0};
1831 tSirIbssGetPeerInfoReqParams *pIbssInfoReqParams;
1832 struct ibss_peer_info_cb_info *cb_info;
1833
1834 status = sme_acquire_global_lock(&mac->sme);
1835 if (status == QDF_STATUS_SUCCESS) {
1836 cb_info = &mac->sme.peer_info_cb_info;
1837 cb_info->peer_info_cb = peer_info_cb;
1838 cb_info->peer_info_cb_context = cb_context;
1839
1840 pIbssInfoReqParams = (tSirIbssGetPeerInfoReqParams *)
1841 qdf_mem_malloc(sizeof(tSirIbssGetPeerInfoReqParams));
1842 if (!pIbssInfoReqParams) {
1843 sme_release_global_lock(&mac->sme);
1844 return QDF_STATUS_E_NOMEM;
1845 }
1846 pIbssInfoReqParams->allPeerInfoReqd = allPeerInfoReqd;
Yeshwanth Sriram Guntuka3f262102019-07-16 15:41:08 +05301847 qdf_mem_copy(pIbssInfoReqParams->peer_mac.bytes, mac_addr,
1848 QDF_MAC_ADDR_SIZE);
Abhishek Amburee0fe68d2019-09-18 15:06:32 +05301849
1850 message.type = WMA_GET_IBSS_PEER_INFO_REQ;
1851 message.bodyptr = pIbssInfoReqParams;
1852 message.reserved = 0;
1853
1854 qdf_status = scheduler_post_message(QDF_MODULE_ID_SME,
1855 QDF_MODULE_ID_WMA,
1856 QDF_MODULE_ID_WMA,
1857 &message);
1858 if (qdf_status != QDF_STATUS_SUCCESS) {
1859 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
1860 "%s: Post WMA_GET_IBSS_PEER_INFO_REQ MSG failed",
1861 __func__);
1862 qdf_mem_free(pIbssInfoReqParams);
1863 qdf_status = QDF_STATUS_E_FAILURE;
1864 }
1865 sme_release_global_lock(&mac->sme);
1866 }
1867
1868 return qdf_status;
1869}
1870#else
1871static inline
1872QDF_STATUS sme_ibss_peer_info_response_handler(struct mac_context *mac,
1873 tpSirIbssGetPeerInfoRspParams
1874 pIbssPeerInfoParams)
1875{
1876 return QDF_STATUS_SUCCESS;
1877}
1878#endif
1879
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001880/**
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001881 * sme_process_dual_mac_config_resp() - Process set Dual mac config response
1882 * @mac: Global MAC pointer
1883 * @msg: Dual mac config response
1884 *
1885 * Processes the dual mac configuration response and invokes the HDD callback
1886 * to process further
1887 */
Jeff Johnson0a8786a2018-12-02 10:49:01 -08001888static QDF_STATUS sme_process_dual_mac_config_resp(struct mac_context *mac,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001889 uint8_t *msg)
1890{
1891 tListElem *entry = NULL;
1892 tSmeCmd *command = NULL;
1893 bool found;
1894 dual_mac_cb callback = NULL;
1895 struct sir_dual_mac_config_resp *param;
1896
1897 param = (struct sir_dual_mac_config_resp *)msg;
1898 if (!param) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07001899 sme_err("Dual mac config resp param is NULL");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001900 /* Not returning. Need to check if active command list
1901 * needs to be freed
1902 */
1903 }
1904
Krunal Sonia8270f52017-02-23 19:51:25 -08001905 entry = csr_nonscan_active_ll_peek_head(mac, LL_ACCESS_LOCK);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001906 if (!entry) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07001907 sme_err("No cmd found in active list");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301908 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001909 }
1910
1911 command = GET_BASE_ADDR(entry, tSmeCmd, Link);
1912 if (!command) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07001913 sme_err("Base address is NULL");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301914 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001915 }
1916
1917 if (e_sme_command_set_dual_mac_config != command->command) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07001918 sme_err("Command mismatch!");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301919 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001920 }
1921
1922 callback = command->u.set_dual_mac_cmd.set_dual_mac_cb;
1923 if (callback) {
1924 if (!param) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07001925 sme_err("Callback failed-Dual mac config is NULL");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001926 } else {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07001927 sme_debug("Calling HDD callback for Dual mac config");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001928 callback(param->status,
1929 command->u.set_dual_mac_cmd.scan_config,
1930 command->u.set_dual_mac_cmd.fw_mode_config);
1931 }
1932 } else {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07001933 sme_err("Callback does not exist");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001934 }
1935
Krunal Soni72dba662017-02-15 20:13:17 -08001936 found = csr_nonscan_active_ll_remove_entry(mac, entry, LL_ACCESS_LOCK);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001937 if (found)
1938 /* Now put this command back on the available command list */
Krunal Soni78618d92017-02-14 21:46:31 -08001939 csr_release_command(mac, command);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001940
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301941 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001942}
1943
Archana Ramachandrana20ef812015-11-13 16:12:13 -08001944/**
1945 * sme_process_antenna_mode_resp() - Process set antenna mode
1946 * response
1947 * @mac: Global MAC pointer
1948 * @msg: antenna mode response
1949 *
1950 * Processes the antenna mode response and invokes the HDD
1951 * callback to process further
1952 */
Jeff Johnson0a8786a2018-12-02 10:49:01 -08001953static QDF_STATUS sme_process_antenna_mode_resp(struct mac_context *mac,
Archana Ramachandrana20ef812015-11-13 16:12:13 -08001954 uint8_t *msg)
1955{
1956 tListElem *entry;
1957 tSmeCmd *command;
1958 bool found;
Dundi Raviteja6bb9e322018-05-16 17:04:41 +05301959 void *context = NULL;
Archana Ramachandrana20ef812015-11-13 16:12:13 -08001960 antenna_mode_cb callback;
1961 struct sir_antenna_mode_resp *param;
1962
1963 param = (struct sir_antenna_mode_resp *)msg;
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05301964 if (!param)
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07001965 sme_err("set antenna mode resp is NULL");
Archana Ramachandrana20ef812015-11-13 16:12:13 -08001966 /* Not returning. Need to check if active command list
1967 * needs to be freed
1968 */
Archana Ramachandrana20ef812015-11-13 16:12:13 -08001969
Krunal Sonia8270f52017-02-23 19:51:25 -08001970 entry = csr_nonscan_active_ll_peek_head(mac, LL_ACCESS_LOCK);
Archana Ramachandrana20ef812015-11-13 16:12:13 -08001971 if (!entry) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07001972 sme_err("No cmd found in active list");
Archana Ramachandrana20ef812015-11-13 16:12:13 -08001973 return QDF_STATUS_E_FAILURE;
1974 }
1975
1976 command = GET_BASE_ADDR(entry, tSmeCmd, Link);
1977 if (!command) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07001978 sme_err("Base address is NULL");
Archana Ramachandrana20ef812015-11-13 16:12:13 -08001979 return QDF_STATUS_E_FAILURE;
1980 }
1981
1982 if (e_sme_command_set_antenna_mode != command->command) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07001983 sme_err("Command mismatch!");
Archana Ramachandrana20ef812015-11-13 16:12:13 -08001984 return QDF_STATUS_E_FAILURE;
1985 }
1986
Dundi Raviteja6bb9e322018-05-16 17:04:41 +05301987 context = command->u.set_antenna_mode_cmd.set_antenna_mode_ctx;
1988 callback = command->u.set_antenna_mode_cmd.set_antenna_mode_resp;
Archana Ramachandrana20ef812015-11-13 16:12:13 -08001989 if (callback) {
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05301990 if (!param)
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07001991 sme_err("Set antenna mode call back is NULL");
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05301992 else
Dundi Raviteja6bb9e322018-05-16 17:04:41 +05301993 callback(param->status, context);
Archana Ramachandrana20ef812015-11-13 16:12:13 -08001994 } else {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07001995 sme_err("Callback does not exist");
Archana Ramachandrana20ef812015-11-13 16:12:13 -08001996 }
1997
Krunal Soni72dba662017-02-15 20:13:17 -08001998 found = csr_nonscan_active_ll_remove_entry(mac, entry, LL_ACCESS_LOCK);
Archana Ramachandrana20ef812015-11-13 16:12:13 -08001999 if (found)
2000 /* Now put this command back on the available command list */
Krunal Soni78618d92017-02-14 21:46:31 -08002001 csr_release_command(mac, command);
Archana Ramachandrana20ef812015-11-13 16:12:13 -08002002
Archana Ramachandrana20ef812015-11-13 16:12:13 -08002003 return QDF_STATUS_SUCCESS;
2004}
2005
Jeff Johnson0a8786a2018-12-02 10:49:01 -08002006QDF_STATUS sme_process_msg(struct mac_context *mac, struct scheduler_msg *pMsg)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002007{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302008 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002009
Jeff Johnson038efe72019-03-18 13:39:31 -07002010 if (!pMsg) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002011 sme_err("Empty message for SME");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002012 return status;
2013 }
Jeff Johnson01f2c232018-11-21 19:17:44 -08002014 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302015 if (!QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002016 if (pMsg->bodyptr)
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302017 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002018 return status;
2019 }
Jeff Johnson01f2c232018-11-21 19:17:44 -08002020 if (!SME_IS_START(mac)) {
Rajeev Kumar3887f9b2018-01-10 11:24:01 -08002021 sme_debug("message type %d in stop state ignored", pMsg->type);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002022 if (pMsg->bodyptr)
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302023 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002024 goto release_lock;
2025 }
2026 switch (pMsg->type) {
2027#ifdef WLAN_FEATURE_ROAM_OFFLOAD
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002028 case eWNI_SME_HO_FAIL_IND:
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302029 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002030 FL("LFR3: Rcvd eWNI_SME_HO_FAIL_IND"));
Jeff Johnson01f2c232018-11-21 19:17:44 -08002031 csr_process_ho_fail_ind(mac, pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302032 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002033 break;
2034#endif
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002035 case eWNI_SME_ADDTS_RSP:
2036 case eWNI_SME_DELTS_RSP:
2037 case eWNI_SME_DELTS_IND:
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002038 case eWNI_SME_FT_AGGR_QOS_RSP:
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002039 /* QoS */
2040 if (pMsg->bodyptr) {
2041#ifndef WLAN_MDM_CODE_REDUCTION_OPT
Jeff Johnson01f2c232018-11-21 19:17:44 -08002042 status = sme_qos_msg_processor(mac, pMsg->type,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002043 pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302044 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002045#endif
2046 } else {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002047 sme_err("Empty message for: %d", pMsg->type);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002048 }
2049 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002050 case eWNI_SME_NEIGHBOR_REPORT_IND:
2051 case eWNI_SME_BEACON_REPORT_REQ_IND:
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002052 if (pMsg->bodyptr) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08002053 status = sme_rrm_msg_processor(mac, pMsg->type,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002054 pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302055 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002056 } else {
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302057 sme_err("Empty message for: %d", pMsg->type);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002058 }
2059 break;
Abhishek Amburecbef1442019-06-10 17:15:00 +05302060 case eWNI_SME_VDEV_DELETE_RSP:
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002061 if (pMsg->bodyptr) {
Abhishek Amburecbef1442019-06-10 17:15:00 +05302062 status = csr_process_vdev_del_rsp(mac, pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302063 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002064 } else {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002065 sme_err("Empty message for: %d", pMsg->type);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002066 }
2067 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002068 case eWNI_SME_GENERIC_CHANGE_COUNTRY_CODE:
2069 if (pMsg->bodyptr) {
2070 status = sme_handle_generic_change_country_code(
Jeff Johnson01f2c232018-11-21 19:17:44 -08002071 (void *)mac, pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302072 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002073 } else {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002074 sme_err("Empty message for: %d", pMsg->type);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002075 }
2076 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002077#ifdef WLAN_FEATURE_11W
2078 case eWNI_SME_UNPROT_MGMT_FRM_IND:
2079 if (pMsg->bodyptr) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08002080 sme_unprotected_mgmt_frm_ind(mac, 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;
2086#endif
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08002087#ifdef FEATURE_WLAN_ESE
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002088 case eWNI_SME_TSM_IE_IND:
2089 if (pMsg->bodyptr) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08002090 sme_tsm_ie_ind(mac, pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302091 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002092 } else {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002093 sme_err("Empty message for: %d", pMsg->type);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002094 }
2095 break;
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08002096#endif /* FEATURE_WLAN_ESE */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002097 case eWNI_SME_ROAM_SCAN_OFFLOAD_RSP:
Jeff Johnson01f2c232018-11-21 19:17:44 -08002098 status = csr_roam_offload_scan_rsp_hdlr((void *)mac,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002099 pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302100 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002101 break;
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08002102 case eWNI_SME_IBSS_PEER_INFO_RSP:
2103 if (pMsg->bodyptr) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08002104 sme_ibss_peer_info_response_handler(mac,
Jeff Johnson49c02f92016-10-07 10:29:09 -07002105 pMsg->bodyptr);
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08002106 qdf_mem_free(pMsg->bodyptr);
2107 } else {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002108 sme_err("Empty message for: %d", pMsg->type);
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08002109 }
2110 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002111#ifdef WLAN_FEATURE_EXTWOW_SUPPORT
2112 case eWNI_SME_READY_TO_EXTWOW_IND:
2113 if (pMsg->bodyptr) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08002114 sme_process_ready_to_ext_wow(mac, pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302115 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002116 } else {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002117 sme_err("Empty message for: %d", pMsg->type);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002118 }
2119 break;
2120#endif
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002121#ifdef FEATURE_WLAN_AUTO_SHUTDOWN
2122 case eWNI_SME_AUTO_SHUTDOWN_IND:
Jeff Johnsoneb7bbed2019-02-17 10:34:24 -08002123 if (mac->sme.auto_shutdown_cb) {
Abhishek Singhe4a1f882017-08-10 17:59:44 +05302124 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002125 FL("Auto shutdown notification"));
Jeff Johnsoneb7bbed2019-02-17 10:34:24 -08002126 mac->sme.auto_shutdown_cb();
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002127 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002128 break;
2129#endif
2130 case eWNI_SME_DFS_RADAR_FOUND:
Arif Hussaincd151632017-02-11 16:57:19 -08002131 case eWNI_SME_DFS_CAC_COMPLETE:
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002132 case eWNI_SME_DFS_CSAIE_TX_COMPLETE_IND:
Abhishek Singh20a8e442018-09-12 15:50:44 +05302133 case eWNI_SME_CSA_RESTART_RSP:
Jeff Johnson01f2c232018-11-21 19:17:44 -08002134 status = dfs_msg_processor(mac, pMsg);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302135 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002136 break;
2137 case eWNI_SME_CHANNEL_CHANGE_RSP:
2138 if (pMsg->bodyptr) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08002139 status = sme_process_channel_change_resp(mac,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002140 pMsg->type,
2141 pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302142 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002143 } else {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002144 sme_err("Empty message for: %d", pMsg->type);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002145 }
2146 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002147 case eWNI_SME_STATS_EXT_EVENT:
Jeff Johnson01f2c232018-11-21 19:17:44 -08002148 status = sme_stats_ext_event(mac, pMsg->bodyptr);
Jeff Johnsonfdecd512018-06-10 09:18:32 -07002149 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002150 break;
Will Huang558f8082017-05-31 16:22:24 +08002151 case eWNI_SME_GET_PEER_INFO_EXT_IND:
Jeff Johnson01f2c232018-11-21 19:17:44 -08002152 if (mac->sme.pget_peer_info_ext_ind_cb)
2153 mac->sme.pget_peer_info_ext_ind_cb(pMsg->bodyptr,
2154 mac->sme.pget_peer_info_ext_cb_context);
Will Huang558f8082017-05-31 16:22:24 +08002155 qdf_mem_free(pMsg->bodyptr);
2156 break;
Qun Zhangef655622019-02-25 10:48:10 +08002157 case eWNI_SME_FW_STATUS_IND:
2158 status = sme_fw_state_resp(mac);
2159 break;
Manikandan Mohandcc21ba2016-03-15 14:31:56 -07002160 case eWNI_SME_TSF_EVENT:
Jeff Johnson01f2c232018-11-21 19:17:44 -08002161 if (mac->sme.get_tsf_cb) {
2162 mac->sme.get_tsf_cb(mac->sme.get_tsf_cxt,
Manikandan Mohandcc21ba2016-03-15 14:31:56 -07002163 (struct stsf *)pMsg->bodyptr);
2164 }
2165 if (pMsg->bodyptr)
2166 qdf_mem_free(pMsg->bodyptr);
2167 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002168 case eWNI_SME_LINK_STATUS_IND:
2169 {
2170 tAniGetLinkStatus *pLinkStatus =
2171 (tAniGetLinkStatus *) pMsg->bodyptr;
2172 if (pLinkStatus) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08002173 if (mac->sme.link_status_callback)
2174 mac->sme.link_status_callback(
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002175 pLinkStatus->linkStatus,
Jeff Johnson01f2c232018-11-21 19:17:44 -08002176 mac->sme.link_status_context);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302177
Jeff Johnson01f2c232018-11-21 19:17:44 -08002178 mac->sme.link_status_callback = NULL;
2179 mac->sme.link_status_context = NULL;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302180 qdf_mem_free(pLinkStatus);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002181 }
2182 break;
2183 }
2184 case eWNI_SME_MSG_GET_TEMPERATURE_IND:
Jeff Johnson3f3ad252019-02-17 20:44:11 -08002185 if (mac->sme.temperature_cb)
2186 mac->sme.temperature_cb(pMsg->bodyval,
2187 mac->sme.temperature_cb_context);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002188 break;
2189 case eWNI_SME_SNR_IND:
2190 {
2191 tAniGetSnrReq *pSnrReq = (tAniGetSnrReq *) pMsg->bodyptr;
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302192
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002193 if (pSnrReq) {
2194 if (pSnrReq->snrCallback) {
2195 ((tCsrSnrCallback)
Sourav Mohapatra05a52ed2019-08-06 16:07:05 +05302196 (pSnrReq->snrCallback))(pSnrReq->snr,
2197 pSnrReq->pDevContext);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002198 }
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302199 qdf_mem_free(pSnrReq);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002200 }
2201 break;
2202 }
2203#ifdef FEATURE_WLAN_EXTSCAN
2204 case eWNI_SME_EXTSCAN_FULL_SCAN_RESULT_IND:
Jeff Johnson01f2c232018-11-21 19:17:44 -08002205 if (mac->sme.ext_scan_ind_cb)
2206 mac->sme.ext_scan_ind_cb(mac->hdd_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002207 eSIR_EXTSCAN_FULL_SCAN_RESULT_IND,
2208 pMsg->bodyptr);
2209 else
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002210 sme_err("callback not registered to process: %d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002211 pMsg->type);
2212
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302213 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002214 break;
2215 case eWNI_SME_EPNO_NETWORK_FOUND_IND:
Jeff Johnson01f2c232018-11-21 19:17:44 -08002216 if (mac->sme.ext_scan_ind_cb)
2217 mac->sme.ext_scan_ind_cb(mac->hdd_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002218 eSIR_EPNO_NETWORK_FOUND_IND,
2219 pMsg->bodyptr);
2220 else
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002221 sme_err("callback not registered to process: %d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002222 pMsg->type);
2223
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302224 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002225 break;
2226#endif
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002227 case eWNI_SME_SET_HW_MODE_RESP:
2228 if (pMsg->bodyptr) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08002229 status = sme_process_set_hw_mode_resp(mac,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002230 pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302231 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002232 } else {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002233 sme_err("Empty message for: %d", pMsg->type);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002234 }
2235 break;
2236 case eWNI_SME_HW_MODE_TRANS_IND:
2237 if (pMsg->bodyptr) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08002238 status = sme_process_hw_mode_trans_ind(mac,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002239 pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302240 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002241 } else {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002242 sme_err("Empty message for: %d", pMsg->type);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002243 }
2244 break;
2245 case eWNI_SME_NSS_UPDATE_RSP:
2246 if (pMsg->bodyptr) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08002247 status = sme_process_nss_update_resp(mac,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002248 pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302249 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002250 } else {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002251 sme_err("Empty message for: %d", pMsg->type);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002252 }
2253 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002254 case eWNI_SME_SET_DUAL_MAC_CFG_RESP:
2255 if (pMsg->bodyptr) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08002256 status = sme_process_dual_mac_config_resp(mac,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002257 pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302258 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002259 } else {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002260 sme_err("Empty message for: %d", pMsg->type);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002261 }
gaurank kathpaliaebe3fc82018-05-07 09:39:46 +05302262 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002263 case eWNI_SME_SET_THERMAL_LEVEL_IND:
Jeff Johnson01f2c232018-11-21 19:17:44 -08002264 if (mac->sme.set_thermal_level_cb)
2265 mac->sme.set_thermal_level_cb(mac->hdd_handle,
Jeff Johnson6aaaa992018-06-30 10:43:04 -07002266 pMsg->bodyval);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002267 break;
Abhishek Singh518323d2015-10-19 17:42:01 +05302268 case eWNI_SME_EXT_CHANGE_CHANNEL_IND:
Jeff Johnson01f2c232018-11-21 19:17:44 -08002269 status = sme_extended_change_channel_ind(mac, pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302270 qdf_mem_free(pMsg->bodyptr);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302271 break;
Archana Ramachandrana20ef812015-11-13 16:12:13 -08002272 case eWNI_SME_SET_ANTENNA_MODE_RESP:
2273 if (pMsg->bodyptr) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08002274 status = sme_process_antenna_mode_resp(mac,
Archana Ramachandrana20ef812015-11-13 16:12:13 -08002275 pMsg->bodyptr);
2276 qdf_mem_free(pMsg->bodyptr);
2277 } else {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002278 sme_err("Empty message for: %d", pMsg->type);
Archana Ramachandrana20ef812015-11-13 16:12:13 -08002279 }
2280 break;
Sreelakshmi Konamki58c72432016-11-09 17:06:44 +05302281 case eWNI_SME_LOST_LINK_INFO_IND:
Jeff Johnson01f2c232018-11-21 19:17:44 -08002282 if (mac->sme.lost_link_info_cb)
2283 mac->sme.lost_link_info_cb(mac->hdd_handle,
Sreelakshmi Konamki58c72432016-11-09 17:06:44 +05302284 (struct sir_lost_link_info *)pMsg->bodyptr);
2285 qdf_mem_free(pMsg->bodyptr);
2286 break;
Sreelakshmi Konamki88a2a412017-04-14 15:11:55 +05302287 case eWNI_SME_RSO_CMD_STATUS_IND:
Jeff Johnson01f2c232018-11-21 19:17:44 -08002288 if (mac->sme.rso_cmd_status_cb)
2289 mac->sme.rso_cmd_status_cb(mac->hdd_handle,
Jeff Johnson6aaaa992018-06-30 10:43:04 -07002290 pMsg->bodyptr);
lifeng66831662017-05-19 16:01:35 +08002291 qdf_mem_free(pMsg->bodyptr);
2292 break;
Zhang Qiana6e9c102016-12-22 16:47:24 +08002293 case eWMI_SME_LL_STATS_IND:
Jeff Johnson01f2c232018-11-21 19:17:44 -08002294 if (mac->sme.link_layer_stats_ext_cb)
2295 mac->sme.link_layer_stats_ext_cb(mac->hdd_handle,
Zhang Qiana6e9c102016-12-22 16:47:24 +08002296 pMsg->bodyptr);
Sreelakshmi Konamki88a2a412017-04-14 15:11:55 +05302297 qdf_mem_free(pMsg->bodyptr);
2298 break;
Vidyullatha Kanchanapallybe0ebb32017-03-23 14:36:21 +05302299 case eWNI_SME_BT_ACTIVITY_INFO_IND:
Jeff Johnson01f2c232018-11-21 19:17:44 -08002300 if (mac->sme.bt_activity_info_cb)
2301 mac->sme.bt_activity_info_cb(mac->hdd_handle,
Vidyullatha Kanchanapallybe0ebb32017-03-23 14:36:21 +05302302 pMsg->bodyval);
2303 break;
Abhinav Kumar338e57d2019-02-04 17:30:10 +05302304 case eWNI_SME_HIDDEN_SSID_RESTART_RSP:
2305 if (mac->sme.hidden_ssid_cb)
2306 mac->sme.hidden_ssid_cb(mac->hdd_handle, pMsg->bodyval);
2307 else
2308 sme_err("callback is NULL");
2309 break;
guangde4853c402019-05-06 15:54:04 +08002310 case eWNI_SME_ANTENNA_ISOLATION_RSP:
2311 if (pMsg->bodyptr) {
2312 if (mac->sme.get_isolation_cb)
2313 mac->sme.get_isolation_cb(
2314 (struct sir_isolation_resp *)pMsg->bodyptr,
2315 mac->sme.get_isolation_cb_context);
2316 qdf_mem_free(pMsg->bodyptr);
2317 } else {
2318 sme_err("Empty message for: %d", pMsg->type);
2319 }
2320 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002321 default:
2322
2323 if ((pMsg->type >= eWNI_SME_MSG_TYPES_BEGIN)
2324 && (pMsg->type <= eWNI_SME_MSG_TYPES_END)) {
2325 /* CSR */
2326 if (pMsg->bodyptr) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08002327 status = csr_msg_processor(mac, pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302328 qdf_mem_free(pMsg->bodyptr);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302329 } else
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002330 sme_err("Empty message for: %d", pMsg->type);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002331 } else {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002332 sme_warn("Unknown message type: %d", pMsg->type);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002333 if (pMsg->bodyptr)
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302334 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002335 }
2336 } /* switch */
2337release_lock:
Jeff Johnson01f2c232018-11-21 19:17:44 -08002338 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002339 return status;
2340}
2341
Krunal Sonid32c6bc2016-10-18 18:00:21 -07002342QDF_STATUS sme_mc_process_handler(struct scheduler_msg *msg)
2343{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08002344 struct mac_context *mac_ctx = cds_get_context(QDF_MODULE_ID_SME);
Krunal Sonid32c6bc2016-10-18 18:00:21 -07002345
Jeff Johnson038efe72019-03-18 13:39:31 -07002346 if (!mac_ctx) {
Krunal Sonid32c6bc2016-10-18 18:00:21 -07002347 QDF_ASSERT(0);
2348 return QDF_STATUS_E_FAILURE;
2349 }
2350
Jeff Johnson5f9ce2d2018-06-09 21:20:45 -07002351 return sme_process_msg(mac_ctx, msg);
Krunal Sonid32c6bc2016-10-18 18:00:21 -07002352}
Krunal Sonid32c6bc2016-10-18 18:00:21 -07002353
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002354/**
2355 * sme_process_nss_update_resp() - Process nss update response
2356 * @mac: Global MAC pointer
2357 * @msg: nss update response
2358 *
2359 * Processes the nss update response and invokes the HDD
2360 * callback to process further
2361 */
Jeff Johnson0a8786a2018-12-02 10:49:01 -08002362static QDF_STATUS sme_process_nss_update_resp(struct mac_context *mac, uint8_t *msg)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002363{
2364 tListElem *entry = NULL;
2365 tSmeCmd *command = NULL;
2366 bool found;
Tushnim Bhattacharyyaeab33dd2017-11-15 15:20:02 -08002367 policy_mgr_nss_update_cback callback = NULL;
Abhishek Singhfc740be2018-10-12 11:34:26 +05302368 struct sir_bcn_update_rsp *param;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002369
Abhishek Singhfc740be2018-10-12 11:34:26 +05302370 param = (struct sir_bcn_update_rsp *)msg;
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302371 if (!param)
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002372 sme_err("nss update resp param is NULL");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002373 /* Not returning. Need to check if active command list
2374 * needs to be freed
2375 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002376
Abhishek Singhfc740be2018-10-12 11:34:26 +05302377 if (param && param->reason != REASON_NSS_UPDATE) {
2378 sme_err("reason not NSS update");
2379 return QDF_STATUS_E_INVAL;
2380 }
Krunal Sonia8270f52017-02-23 19:51:25 -08002381 entry = csr_nonscan_active_ll_peek_head(mac, LL_ACCESS_LOCK);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002382 if (!entry) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002383 sme_err("No cmd found in active list");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302384 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002385 }
2386
2387 command = GET_BASE_ADDR(entry, tSmeCmd, Link);
2388 if (!command) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002389 sme_err("Base address is NULL");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302390 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002391 }
2392
2393 if (e_sme_command_nss_update != command->command) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002394 sme_err("Command mismatch!");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302395 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002396 }
2397
2398 callback = command->u.nss_update_cmd.nss_update_cb;
2399 if (callback) {
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302400 if (!param)
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002401 sme_err("Callback failed since nss update params is NULL");
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302402 else
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002403 callback(command->u.nss_update_cmd.context,
Abhishek Singhfc740be2018-10-12 11:34:26 +05302404 param->status,
2405 param->vdev_id,
Chandrasekaran, Manishekarce2172e2016-02-18 16:12:43 +05302406 command->u.nss_update_cmd.next_action,
Liangwei Dong1ba99482018-10-19 02:57:29 -04002407 command->u.nss_update_cmd.reason,
2408 command->u.nss_update_cmd.original_vdev_id);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002409 } else {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002410 sme_err("Callback does not exisit");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002411 }
2412
Krunal Soni72dba662017-02-15 20:13:17 -08002413 found = csr_nonscan_active_ll_remove_entry(mac, entry, LL_ACCESS_LOCK);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002414 if (found) {
2415 /* Now put this command back on the avilable command list */
Krunal Soni78618d92017-02-14 21:46:31 -08002416 csr_release_command(mac, command);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002417 }
Krunal Sonia8270f52017-02-23 19:51:25 -08002418
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302419 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002420}
2421
Jeff Johnson62cd6802018-07-20 12:38:25 -07002422QDF_STATUS sme_stop(mac_handle_t mac_handle)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002423{
Jeff Johnson62cd6802018-07-20 12:38:25 -07002424 QDF_STATUS status;
2425 QDF_STATUS ret_status = QDF_STATUS_SUCCESS;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08002426 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002427
Jeff Johnson62cd6802018-07-20 12:38:25 -07002428 status = rrm_stop(mac);
2429 if (QDF_IS_STATUS_ERROR(status)) {
2430 ret_status = status;
Sandeep Puligilla66d09c42017-09-06 17:10:27 -07002431 sme_err("rrm_stop failed with status: %d", status);
2432 }
2433
Jeff Johnson62cd6802018-07-20 12:38:25 -07002434 status = csr_stop(mac);
2435 if (QDF_IS_STATUS_ERROR(status)) {
2436 ret_status = status;
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002437 sme_err("csr_stop failed with status: %d", status);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002438 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002439
Jeff Johnson62cd6802018-07-20 12:38:25 -07002440 mac->sme.state = SME_STATE_STOP;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002441
Jeff Johnson62cd6802018-07-20 12:38:25 -07002442 return ret_status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002443}
2444
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302445/*
2446 * sme_close() - Release all SME modules and their resources.
2447 * The function release each module in SME, PMC, CSR, etc. . Upon
2448 * return, all modules are at closed state.
2449 *
2450 * No SME APIs can be involved after smeClose except smeOpen.
2451 * smeClose must be called before mac_close.
2452 * This is a synchronous call
2453 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08002454 * mac_handle - The handle returned by mac_open
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302455 * Return QDF_STATUS_SUCCESS - SME is successfully close.
2456 *
2457 * Other status means SME is failed to be closed but caller still cannot
2458 * call any other SME functions except smeOpen.
2459 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08002460QDF_STATUS sme_close(mac_handle_t mac_handle)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002461{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302462 QDF_STATUS status = QDF_STATUS_E_FAILURE;
2463 QDF_STATUS fail_status = QDF_STATUS_SUCCESS;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08002464 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002465
Jeff Johnson01f2c232018-11-21 19:17:44 -08002466 if (!mac)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302467 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002468
Jeff Johnson01f2c232018-11-21 19:17:44 -08002469 status = csr_close(mac);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302470 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002471 sme_err("csr_close failed with status: %d", status);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002472 fail_status = status;
2473 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002474#ifndef WLAN_MDM_CODE_REDUCTION_OPT
Jeff Johnson01f2c232018-11-21 19:17:44 -08002475 status = sme_qos_close(mac);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302476 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002477 sme_err("Qos close failed with status: %d", status);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002478 fail_status = status;
2479 }
2480#endif
Jeff Johnsonb460dd72018-11-08 10:26:51 -08002481 status = sme_ps_close(mac_handle);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302482 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002483 sme_err("sme_ps_close failed status: %d", status);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002484 fail_status = status;
2485 }
2486
Jeff Johnson01f2c232018-11-21 19:17:44 -08002487 status = rrm_close(mac);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302488 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002489 sme_err("RRM close failed with status: %d", status);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002490 fail_status = status;
2491 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002492
Jeff Johnson01f2c232018-11-21 19:17:44 -08002493 free_sme_cmd_list(mac);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002494
Jeff Johnson3e7a4932019-02-17 12:11:36 -08002495 status = qdf_mutex_destroy(&mac->sme.sme_global_lock);
2496 if (!QDF_IS_STATUS_SUCCESS(status))
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302497 fail_status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002498
Jeff Johnson01f2c232018-11-21 19:17:44 -08002499 mac->sme.state = SME_STATE_STOP;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002500
Jeff Johnson3e7a4932019-02-17 12:11:36 -08002501 return fail_status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002502}
2503
2504/**
Abhishek Singhc9941602016-08-09 16:06:22 +05302505 * sme_remove_bssid_from_scan_list() - wrapper to remove the bssid from
2506 * scan list
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -08002507 * @mac_handle: Opaque handle to the global MAC context.
Abhishek Singhc9941602016-08-09 16:06:22 +05302508 * @bssid: bssid to be removed
2509 *
2510 * This function remove the given bssid from scan list.
2511 *
2512 * Return: QDF status.
2513 */
Jeff Johnsonc7309062018-11-09 20:59:42 -08002514QDF_STATUS sme_remove_bssid_from_scan_list(mac_handle_t mac_handle,
2515 tSirMacAddr bssid)
Abhishek Singhc9941602016-08-09 16:06:22 +05302516{
2517 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08002518 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Abhishek Singhc9941602016-08-09 16:06:22 +05302519
2520 status = sme_acquire_global_lock(&mac_ctx->sme);
2521 if (QDF_IS_STATUS_SUCCESS(status)) {
2522 csr_remove_bssid_from_scan_list(mac_ctx, bssid);
2523 sme_release_global_lock(&mac_ctx->sme);
2524 }
2525
2526 return status;
2527}
2528
Abhishek Amburec5151392019-10-14 12:15:24 +05302529QDF_STATUS sme_scan_get_result(mac_handle_t mac_handle, uint8_t vdev_id,
2530 struct scan_filter *filter,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002531 tScanResultHandle *phResult)
2532{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302533 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08002534 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002535
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302536 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Abhishek Amburec5151392019-10-14 12:15:24 +05302537 TRACE_CODE_SME_RX_HDD_MSG_SCAN_GET_RESULTS, vdev_id,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002538 0));
Jeff Johnson01f2c232018-11-21 19:17:44 -08002539 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302540 if (QDF_IS_STATUS_SUCCESS(status)) {
Abhishek Amburec5151392019-10-14 12:15:24 +05302541 status = csr_scan_get_result(mac, filter, phResult);
Jeff Johnson01f2c232018-11-21 19:17:44 -08002542 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002543 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002544
2545 return status;
2546}
2547
Jeff Johnsonb460dd72018-11-08 10:26:51 -08002548QDF_STATUS sme_scan_get_result_for_bssid(mac_handle_t mac_handle,
Vignesh Viswanathan9dd88d32017-11-22 14:22:03 +05302549 struct qdf_mac_addr *bssid,
2550 tCsrScanResultInfo *res)
2551{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08002552 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Vignesh Viswanathan9dd88d32017-11-22 14:22:03 +05302553 QDF_STATUS status;
2554
2555 status = sme_acquire_global_lock(&mac_ctx->sme);
2556 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson1b56f6b2018-06-10 18:17:10 -07002557 status = csr_scan_get_result_for_bssid(mac_ctx, bssid, res);
Vignesh Viswanathan9dd88d32017-11-22 14:22:03 +05302558 sme_release_global_lock(&mac_ctx->sme);
2559 }
2560
2561 return status;
2562}
2563
Archana Ramachandran2eb7a612017-03-23 22:58:42 -07002564QDF_STATUS sme_get_ap_channel_from_scan(void *profile,
2565 tScanResultHandle *scan_cache,
Manikandan Mohan932c11e2019-08-14 14:09:08 -07002566 uint32_t *ap_ch_freq)
Archana Ramachandran2eb7a612017-03-23 22:58:42 -07002567{
Manikandan Mohan932c11e2019-08-14 14:09:08 -07002568 QDF_STATUS status;
2569
2570 status = sme_get_ap_channel_from_scan_cache((struct csr_roam_profile *)
Archana Ramachandran2eb7a612017-03-23 22:58:42 -07002571 profile,
2572 scan_cache,
Manikandan Mohan0ba7e552019-10-23 17:38:35 -07002573 ap_ch_freq);
Manikandan Mohan932c11e2019-08-14 14:09:08 -07002574 return status;
Archana Ramachandran2eb7a612017-03-23 22:58:42 -07002575}
2576
2577/**
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002578 * sme_get_ap_channel_from_scan_cache() - a wrapper function to get AP's
2579 * channel id from CSR by filtering the
2580 * result which matches our roam profile.
2581 * @profile: SAP adapter
Manikandan Mohan0ba7e552019-10-23 17:38:35 -07002582 * @ap_ch_freq: pointer to channel freq of SAP. Fill the value after finding the
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002583 * best ap from scan cache.
2584 *
2585 * This function is written to get AP's channel id from CSR by filtering
2586 * the result which matches our roam profile. This is a synchronous call.
2587 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302588 * Return: QDF_STATUS.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002589 */
Archana Ramachandran2eb7a612017-03-23 22:58:42 -07002590QDF_STATUS sme_get_ap_channel_from_scan_cache(
Jeff Johnson66ee8a92018-03-17 15:24:26 -07002591 struct csr_roam_profile *profile, tScanResultHandle *scan_cache,
Manikandan Mohan0ba7e552019-10-23 17:38:35 -07002592 uint32_t *ap_ch_freq)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002593{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302594 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08002595 struct mac_context *mac_ctx = sme_get_mac_context();
Abhishek Amburec5151392019-10-14 12:15:24 +05302596 struct scan_filter *scan_filter;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002597 tScanResultHandle filtered_scan_result = NULL;
Pragaspathi Thilagaraj1112c962019-05-23 23:45:38 +05302598 struct bss_description first_ap_profile;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002599
Jeff Johnson038efe72019-03-18 13:39:31 -07002600 if (!mac_ctx) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302601 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002602 FL("mac_ctx is NULL"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302603 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002604 }
Abhishek Amburec5151392019-10-14 12:15:24 +05302605 scan_filter = qdf_mem_malloc(sizeof(*scan_filter));
Arif Hussain0ef77082018-10-10 16:42:53 -07002606 if (!scan_filter)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302607 return QDF_STATUS_E_FAILURE;
Arif Hussain0ef77082018-10-10 16:42:53 -07002608
Pragaspathi Thilagaraj1112c962019-05-23 23:45:38 +05302609 qdf_mem_zero(&first_ap_profile, sizeof(struct bss_description));
Jeff Johnson038efe72019-03-18 13:39:31 -07002610 if (!profile) {
Abhishek Amburec5151392019-10-14 12:15:24 +05302611 /* No encryption */
2612 scan_filter->num_of_enc_type = 1;
2613 scan_filter->enc_type[0] = WLAN_ENCRYPT_TYPE_NONE;
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302614 } else {
2615 /* Here is the profile we need to connect to */
Abhishek Amburec5151392019-10-14 12:15:24 +05302616 status = csr_roam_get_scan_filter_from_profile(mac_ctx,
2617 profile,
2618 scan_filter,
2619 false);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302620 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002621
Abhishek Amburec5151392019-10-14 12:15:24 +05302622 if (QDF_IS_STATUS_ERROR(status)) {
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302623 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
2624 FL("Preparing the profile filter failed"));
2625 qdf_mem_free(scan_filter);
2626 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002627 }
2628 status = sme_acquire_global_lock(&mac_ctx->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302629 if (QDF_STATUS_SUCCESS == status) {
Archana Ramachandran2eb7a612017-03-23 22:58:42 -07002630 status = csr_scan_get_result(mac_ctx, scan_filter,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002631 &filtered_scan_result);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302632 if (QDF_STATUS_SUCCESS == status) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002633 csr_get_bssdescr_from_scan_handle(filtered_scan_result,
2634 &first_ap_profile);
2635 *scan_cache = filtered_scan_result;
Manikandan Mohan0ba7e552019-10-23 17:38:35 -07002636 if (first_ap_profile.chan_freq) {
2637 *ap_ch_freq = first_ap_profile.chan_freq;
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302638 QDF_TRACE(QDF_MODULE_ID_SME,
Abhishek Singh5d8d7332017-08-10 15:15:24 +05302639 QDF_TRACE_LEVEL_DEBUG,
Will Huang65d64252019-07-16 17:57:42 +08002640 FL("Found best AP & its on freq[%d]"),
2641 first_ap_profile.chan_freq);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002642 } else {
2643 /*
2644 * This means scan result is empty
2645 * so set the channel to zero, caller should
2646 * take of zero channel id case.
2647 */
Manikandan Mohan0ba7e552019-10-23 17:38:35 -07002648 *ap_ch_freq = 0;
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302649 QDF_TRACE(QDF_MODULE_ID_SME,
2650 QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002651 FL("Scan is empty, set chnl to 0"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302652 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002653 }
2654 } else {
Sandeep Puligilla1f1e4002018-08-18 12:15:01 -07002655 sme_err("Failed to get scan get result");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302656 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002657 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002658 sme_release_global_lock(&mac_ctx->sme);
2659 } else {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302660 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002661 }
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302662 qdf_mem_free(scan_filter);
Abhishek Amburec5151392019-10-14 12:15:24 +05302663
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002664 return status;
2665}
2666
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302667/*
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302668 * sme_scan_result_get_first() -
2669 * A wrapper function to request CSR to returns the first element of
2670 * scan result.
2671 * This is a synchronous call
2672 *
2673 * hScanResult - returned from csr_scan_get_result
2674 * Return tCsrScanResultInfo * - NULL if no result
2675 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08002676tCsrScanResultInfo *sme_scan_result_get_first(mac_handle_t mac_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002677 tScanResultHandle hScanResult)
2678{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302679 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08002680 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002681 tCsrScanResultInfo *pRet = NULL;
2682
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302683 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002684 TRACE_CODE_SME_RX_HDD_MSG_SCAN_RESULT_GETFIRST,
2685 NO_SESSION, 0));
Jeff Johnson01f2c232018-11-21 19:17:44 -08002686 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302687 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08002688 pRet = csr_scan_result_get_first(mac, hScanResult);
2689 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002690 }
2691
2692 return pRet;
2693}
2694
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302695/*
2696 * sme_scan_result_get_next() -
2697 * A wrapper function to request CSR to returns the next element of
2698 * scan result. It can be called without calling csr_scan_result_get_first first
2699 * This is a synchronous call
2700 *
2701 * hScanResult - returned from csr_scan_get_result
2702 * Return Null if no result or reach the end
2703 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08002704tCsrScanResultInfo *sme_scan_result_get_next(mac_handle_t mac_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002705 tScanResultHandle hScanResult)
2706{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302707 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08002708 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002709 tCsrScanResultInfo *pRet = NULL;
2710
Jeff Johnson01f2c232018-11-21 19:17:44 -08002711 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302712 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08002713 pRet = csr_scan_result_get_next(mac, hScanResult);
2714 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002715 }
2716
2717 return pRet;
2718}
2719
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302720/*
2721 * sme_scan_result_purge() -
2722 * A wrapper function to request CSR to remove all items(tCsrScanResult)
2723 * in the list and free memory for each item
2724 * This is a synchronous call
2725 *
2726 * hScanResult - returned from csr_scan_get_result. hScanResult is
2727 * considered gone by
2728 * calling this function and even before this function reutrns.
2729 * Return QDF_STATUS
2730 */
Archana Ramachandran2eb7a612017-03-23 22:58:42 -07002731QDF_STATUS sme_scan_result_purge(tScanResultHandle hScanResult)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002732{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302733 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08002734 struct mac_context *mac_ctx = sme_get_mac_context();
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002735
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302736 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002737 TRACE_CODE_SME_RX_HDD_MSG_SCAN_RESULT_PURGE,
2738 NO_SESSION, 0));
Archana Ramachandran2eb7a612017-03-23 22:58:42 -07002739 status = sme_acquire_global_lock(&mac_ctx->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302740 if (QDF_IS_STATUS_SUCCESS(status)) {
Archana Ramachandran2eb7a612017-03-23 22:58:42 -07002741 status = csr_scan_result_purge(mac_ctx, hScanResult);
2742 sme_release_global_lock(&mac_ctx->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002743 }
2744
2745 return status;
2746}
2747
Jeff Johnsonb460dd72018-11-08 10:26:51 -08002748eCsrPhyMode sme_get_phy_mode(mac_handle_t mac_handle)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002749{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08002750 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302751
Jeff Johnson01f2c232018-11-21 19:17:44 -08002752 return mac->roam.configParam.phyMode;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002753}
2754
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302755/*
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302756 * sme_roam_connect() -
2757 * A wrapper function to request CSR to inititiate an association
2758 * This is an asynchronous call.
2759 *
2760 * sessionId - the sessionId returned by sme_open_session.
2761 * pProfile - description of the network to which to connect
2762 * hBssListIn - a list of BSS descriptor to roam to. It is returned
2763 * from csr_scan_get_result
2764 * pRoamId - to get back the request ID
2765 * Return QDF_STATUS
2766 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08002767QDF_STATUS sme_roam_connect(mac_handle_t mac_handle, uint8_t sessionId,
Jeff Johnson66ee8a92018-03-17 15:24:26 -07002768 struct csr_roam_profile *pProfile,
2769 uint32_t *pRoamId)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002770{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302771 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08002772 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002773
Jeff Johnson01f2c232018-11-21 19:17:44 -08002774 if (!mac)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302775 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002776
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302777 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002778 TRACE_CODE_SME_RX_HDD_MSG_CONNECT, sessionId, 0));
Jeff Johnson01f2c232018-11-21 19:17:44 -08002779 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302780 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08002781 if (CSR_IS_SESSION_VALID(mac, sessionId)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002782 status =
Jeff Johnson01f2c232018-11-21 19:17:44 -08002783 csr_roam_connect(mac, sessionId, pProfile,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002784 pRoamId);
2785 } else {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002786 sme_err("Invalid sessionID: %d", sessionId);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302787 status = QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002788 }
Jeff Johnson01f2c232018-11-21 19:17:44 -08002789 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002790 }
2791
2792 return status;
2793}
2794
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302795/*
2796 * sme_set_phy_mode() -
2797 * Changes the PhyMode.
2798 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08002799 * mac_handle - The handle returned by mac_open.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302800 * phyMode new phyMode which is to set
2801 * Return QDF_STATUS SUCCESS.
2802 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08002803QDF_STATUS sme_set_phy_mode(mac_handle_t mac_handle, eCsrPhyMode phyMode)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002804{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08002805 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002806
Jeff Johnson01f2c232018-11-21 19:17:44 -08002807 mac->roam.configParam.phyMode = phyMode;
2808 mac->roam.configParam.uCfgDot11Mode =
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002809 csr_get_cfg_dot11_mode_from_csr_phy_mode(NULL,
Jeff Johnson01f2c232018-11-21 19:17:44 -08002810 mac->roam.configParam.phyMode,
2811 mac->roam.configParam.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302812 ProprietaryRatesEnabled);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002813
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302814 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002815}
2816
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302817/*
2818 * sme_roam_reassoc() -
2819 * A wrapper function to request CSR to inititiate a re-association
2820 *
2821 * pProfile - can be NULL to join the currently connected AP. In that
2822 * case modProfileFields should carry the modified field(s) which could trigger
2823 * reassoc
2824 * modProfileFields - fields which are part of tCsrRoamConnectedProfile
2825 * that might need modification dynamically once STA is up & running and this
2826 * could trigger a reassoc
2827 * pRoamId - to get back the request ID
2828 * Return QDF_STATUS
2829 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08002830QDF_STATUS sme_roam_reassoc(mac_handle_t mac_handle, uint8_t sessionId,
Jeff Johnson66ee8a92018-03-17 15:24:26 -07002831 struct csr_roam_profile *pProfile,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002832 tCsrRoamModifyProfileFields modProfileFields,
2833 uint32_t *pRoamId, bool fForce)
2834{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302835 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08002836 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002837
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302838 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002839 TRACE_CODE_SME_RX_HDD_ROAM_REASSOC, sessionId, 0));
Jeff Johnson01f2c232018-11-21 19:17:44 -08002840 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302841 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08002842 if (CSR_IS_SESSION_VALID(mac, sessionId)) {
Jeff Johnson038efe72019-03-18 13:39:31 -07002843 if ((!pProfile) && (fForce == 1))
Jeff Johnson01f2c232018-11-21 19:17:44 -08002844 status = csr_reassoc(mac, sessionId,
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302845 &modProfileFields, pRoamId,
2846 fForce);
2847 else
Jeff Johnson01f2c232018-11-21 19:17:44 -08002848 status = csr_roam_reassoc(mac, sessionId,
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302849 pProfile,
2850 modProfileFields, pRoamId);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002851 } else {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302852 status = QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002853 }
Jeff Johnson01f2c232018-11-21 19:17:44 -08002854 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002855 }
2856
2857 return status;
2858}
2859
Jeff Johnsonc7309062018-11-09 20:59:42 -08002860QDF_STATUS sme_roam_disconnect(mac_handle_t mac_handle, uint8_t session_id,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002861 eCsrRoamDisconnectReason reason)
2862{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302863 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08002864 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002865
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302866 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Varun Reddy Yeturu363809c2018-06-27 14:12:52 -07002867 TRACE_CODE_SME_RX_HDD_ROAM_DISCONNECT, session_id,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002868 reason));
Varun Reddy Yeturu363809c2018-06-27 14:12:52 -07002869 status = sme_acquire_global_lock(&mac_ctx->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302870 if (QDF_IS_STATUS_SUCCESS(status)) {
Varun Reddy Yeturu363809c2018-06-27 14:12:52 -07002871 if (CSR_IS_SESSION_VALID(mac_ctx, session_id))
2872 status = csr_roam_disconnect(mac_ctx, session_id,
2873 reason);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302874 else
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302875 status = QDF_STATUS_E_INVAL;
Varun Reddy Yeturu363809c2018-06-27 14:12:52 -07002876 sme_release_global_lock(&mac_ctx->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002877 }
2878
2879 return status;
2880}
2881
Abhishek Singhca408032016-09-13 15:26:12 +05302882/* sme_dhcp_done_ind() - send dhcp done ind
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -08002883 * @mac_handle: Opaque handle to the global MAC context
Abhishek Singhca408032016-09-13 15:26:12 +05302884 * @session_id: session id
2885 *
2886 * Return: void.
2887 */
Jeff Johnsonc7309062018-11-09 20:59:42 -08002888void sme_dhcp_done_ind(mac_handle_t mac_handle, uint8_t session_id)
Abhishek Singhca408032016-09-13 15:26:12 +05302889{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08002890 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
gaurank kathpalia14e2f912017-08-31 14:51:45 +05302891 struct csr_roam_session *session;
Abhishek Singhca408032016-09-13 15:26:12 +05302892
2893 if (!mac_ctx)
2894 return;
2895
2896 session = CSR_GET_SESSION(mac_ctx, session_id);
2897 if (!session) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002898 sme_err("Session: %d not found", session_id);
Abhishek Singhca408032016-09-13 15:26:12 +05302899 return;
2900 }
2901 session->dhcp_done = true;
2902}
2903
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302904/*
2905 * sme_roam_stop_bss() -
2906 * To stop BSS for Soft AP. This is an asynchronous API.
2907 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08002908 * mac_handle - Global structure
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302909 * sessionId - sessionId of SoftAP
2910 * Return QDF_STATUS SUCCESS Roam callback will be called to indicate
2911 * actual results
2912 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08002913QDF_STATUS sme_roam_stop_bss(mac_handle_t mac_handle, uint8_t sessionId)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002914{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302915 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08002916 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002917
Jeff Johnson01f2c232018-11-21 19:17:44 -08002918 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302919 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08002920 if (CSR_IS_SESSION_VALID(mac, sessionId))
2921 status = csr_roam_issue_stop_bss_cmd(mac, sessionId,
Himanshu Agarwal75c8d792017-12-19 18:31:04 +05302922 false);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302923 else
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302924 status = QDF_STATUS_E_INVAL;
Jeff Johnson01f2c232018-11-21 19:17:44 -08002925 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002926 }
2927
2928 return status;
2929}
2930
Deepthi Gowrib3bfefd2016-09-13 15:14:34 +05302931/**
2932 * sme_roam_disconnect_sta() - disassociate a station
Jeff Johnsonb460dd72018-11-08 10:26:51 -08002933 * @mac_handle: Global structure
Deepthi Gowrib3bfefd2016-09-13 15:14:34 +05302934 * @sessionId: SessionId of SoftAP
2935 * @p_del_sta_params: Pointer to parameters of the station to disassoc
2936 *
2937 * To disassociate a station. This is an asynchronous API.
2938 *
2939 * Return: QDF_STATUS_SUCCESS on success.Roam callback will
2940 * be called to indicate actual result.
2941 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08002942QDF_STATUS sme_roam_disconnect_sta(mac_handle_t mac_handle, uint8_t sessionId,
Jeff Johnsone6bf7192017-11-07 15:16:09 -08002943 struct csr_del_sta_params *p_del_sta_params)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002944{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302945 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08002946 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002947
Jeff Johnson038efe72019-03-18 13:39:31 -07002948 if (!mac) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302949 QDF_ASSERT(0);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002950 return status;
2951 }
2952
Jeff Johnson01f2c232018-11-21 19:17:44 -08002953 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302954 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08002955 if (CSR_IS_SESSION_VALID(mac, sessionId))
2956 status = csr_roam_issue_disassociate_sta_cmd(mac,
Deepthi Gowrib3bfefd2016-09-13 15:14:34 +05302957 sessionId, p_del_sta_params);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302958 else
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302959 status = QDF_STATUS_E_INVAL;
Jeff Johnson01f2c232018-11-21 19:17:44 -08002960 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002961 }
2962
2963 return status;
2964}
2965
2966/**
2967 * sme_roam_deauth_sta() - deauthenticate a station
Jeff Johnsonb460dd72018-11-08 10:26:51 -08002968 * @mac_handle: Global structure
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002969 * @sessionId: SessionId of SoftAP
2970 * @pDelStaParams: Pointer to parameters of the station to deauthenticate
2971 *
2972 * To disassociate a station. This is an asynchronous API.
2973 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302974 * Return: QDF_STATUS_SUCCESS on success or another QDF_STATUS error
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002975 * code on error. Roam callback will be called to indicate actual
2976 * result
2977 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08002978QDF_STATUS sme_roam_deauth_sta(mac_handle_t mac_handle, uint8_t sessionId,
Jeff Johnsone6bf7192017-11-07 15:16:09 -08002979 struct csr_del_sta_params *pDelStaParams)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002980{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302981 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08002982 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002983
Jeff Johnson038efe72019-03-18 13:39:31 -07002984 if (!mac) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302985 QDF_ASSERT(0);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002986 return status;
2987 }
2988
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302989 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Sreelakshmi Konamki6744cff2015-09-07 12:10:39 +05302990 TRACE_CODE_SME_RX_HDD_MSG_DEAUTH_STA,
2991 sessionId, pDelStaParams->reason_code));
Jeff Johnson01f2c232018-11-21 19:17:44 -08002992 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302993 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08002994 if (CSR_IS_SESSION_VALID(mac, sessionId))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002995 status =
Jeff Johnson01f2c232018-11-21 19:17:44 -08002996 csr_roam_issue_deauth_sta_cmd(mac, sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002997 pDelStaParams);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302998 else
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302999 status = QDF_STATUS_E_INVAL;
Jeff Johnson01f2c232018-11-21 19:17:44 -08003000 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003001 }
3002
3003 return status;
3004}
3005
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303006/*
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303007 * sme_roam_get_connect_profile() -
3008 * A wrapper function to request CSR to return the current connect
3009 * profile. Caller must call csr_roam_free_connect_profile after it is done
3010 * and before reuse for another csr_roam_get_connect_profile call.
3011 * This is a synchronous call.
3012 *
3013 * pProfile - pointer to a caller allocated structure
3014 * tCsrRoamConnectedProfile
3015 * eturn QDF_STATUS. Failure if not connected
3016 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08003017QDF_STATUS sme_roam_get_connect_profile(mac_handle_t mac_handle,
3018 uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003019 tCsrRoamConnectedProfile *pProfile)
3020{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303021 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08003022 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003023
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303024 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003025 TRACE_CODE_SME_RX_HDD_ROAM_GET_CONNECTPROFILE,
3026 sessionId, 0));
Jeff Johnson01f2c232018-11-21 19:17:44 -08003027 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303028 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08003029 if (CSR_IS_SESSION_VALID(mac, sessionId))
3030 status = csr_roam_get_connect_profile(mac, sessionId,
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303031 pProfile);
3032 else
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303033 status = QDF_STATUS_E_INVAL;
Jeff Johnson01f2c232018-11-21 19:17:44 -08003034 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003035 }
3036
3037 return status;
3038}
3039
Naveen Rawatdf0a7e72016-01-06 18:35:53 -08003040/**
3041 * sme_roam_free_connect_profile - a wrapper function to request CSR to free and
3042 * reinitialize the profile returned previously by csr_roam_get_connect_profile.
3043 *
3044 * @profile - pointer to a caller allocated structure tCsrRoamConnectedProfile
3045 *
3046 * Return: none
3047 */
3048void sme_roam_free_connect_profile(tCsrRoamConnectedProfile *profile)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003049{
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303050 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003051 TRACE_CODE_SME_RX_HDD_ROAM_FREE_CONNECTPROFILE,
3052 NO_SESSION, 0));
Naveen Rawatdf0a7e72016-01-06 18:35:53 -08003053 csr_roam_free_connect_profile(profile);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003054}
3055
Jeff Johnsonb460dd72018-11-08 10:26:51 -08003056QDF_STATUS sme_roam_del_pmkid_from_cache(mac_handle_t mac_handle,
3057 uint8_t sessionId,
Sridhar Selvarajc3684c72017-08-21 14:32:47 +05303058 tPmkidCacheInfo *pmksa,
3059 bool flush_cache)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003060{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303061 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08003062 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Sreelakshmi Konamki6744cff2015-09-07 12:10:39 +05303063
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303064 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Sreelakshmi Konamki6744cff2015-09-07 12:10:39 +05303065 TRACE_CODE_SME_RX_HDD_ROAM_DEL_PMKIDCACHE,
3066 sessionId, flush_cache));
Jeff Johnson01f2c232018-11-21 19:17:44 -08003067 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303068 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08003069 if (CSR_IS_SESSION_VALID(mac, sessionId))
3070 status = csr_roam_del_pmkid_from_cache(mac, sessionId,
Sridhar Selvarajc3684c72017-08-21 14:32:47 +05303071 pmksa, flush_cache);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303072 else
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303073 status = QDF_STATUS_E_INVAL;
Jeff Johnson01f2c232018-11-21 19:17:44 -08003074 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003075 }
3076 return status;
3077}
3078
Abhinav Kumar7830d9c2018-06-27 17:57:48 +05303079#ifdef WLAN_FEATURE_ROAM_OFFLOAD
Jeff Johnsonc7309062018-11-09 20:59:42 -08003080void sme_get_pmk_info(mac_handle_t mac_handle, uint8_t session_id,
3081 tPmkidCacheInfo *pmk_cache)
gaurank kathpalia99d06c12018-05-16 16:28:35 +05303082{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08003083 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
gaurank kathpalia99d06c12018-05-16 16:28:35 +05303084 QDF_STATUS status = sme_acquire_global_lock(&mac_ctx->sme);
3085
3086 if (QDF_IS_STATUS_SUCCESS(status)) {
3087 if (CSR_IS_SESSION_VALID(mac_ctx, session_id))
3088 csr_get_pmk_info(mac_ctx, session_id, pmk_cache);
3089 sme_release_global_lock(&mac_ctx->sme);
3090 }
3091}
Abhinav Kumar7830d9c2018-06-27 17:57:48 +05303092#endif
3093
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003094#ifdef WLAN_FEATURE_ROAM_OFFLOAD
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303095/*
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003096 * \fn sme_roam_set_psk_pmk
3097 * \brief a wrapper function to request CSR to save PSK/PMK
3098 * This is a synchronous call.
Jeff Johnsonb460dd72018-11-08 10:26:51 -08003099 * \param mac_handle - Global structure
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003100 * \param sessionId - SME sessionId
3101 * \param pPSK_PMK - pointer to an array of Psk[]/Pmk
3102 * \param pmk_len - Length could be only 16 bytes in case if LEAP
3103 * connections. Need to pass this information to
3104 * firmware.
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303105 * \return QDF_STATUS -status whether PSK/PMK is set or not
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003106 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08003107QDF_STATUS sme_roam_set_psk_pmk(mac_handle_t mac_handle, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003108 uint8_t *pPSK_PMK, size_t pmk_len)
3109{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303110 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08003111 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303112
Jeff Johnson01f2c232018-11-21 19:17:44 -08003113 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303114 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08003115 if (CSR_IS_SESSION_VALID(mac, sessionId))
3116 status = csr_roam_set_psk_pmk(mac, sessionId, pPSK_PMK,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003117 pmk_len);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303118 else
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303119 status = QDF_STATUS_E_INVAL;
Jeff Johnson01f2c232018-11-21 19:17:44 -08003120 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003121 }
3122 return status;
3123}
3124#endif
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003125
Jeff Johnsonc7309062018-11-09 20:59:42 -08003126QDF_STATUS sme_roam_get_wpa_rsn_req_ie(mac_handle_t mac_handle,
3127 uint8_t session_id,
Jeff Johnson0a078b52018-06-01 16:15:54 -07003128 uint32_t *len, uint8_t *buf)
3129{
3130 QDF_STATUS status;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08003131 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Jeff Johnson0a078b52018-06-01 16:15:54 -07003132
3133 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303134 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson0a078b52018-06-01 16:15:54 -07003135 if (CSR_IS_SESSION_VALID(mac, session_id))
3136 status = csr_roam_get_wpa_rsn_req_ie(mac, session_id,
3137 len, buf);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303138 else
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303139 status = QDF_STATUS_E_INVAL;
Jeff Johnson0a078b52018-06-01 16:15:54 -07003140 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003141 }
3142
3143 return status;
3144}
3145
Jeff Johnsonc7309062018-11-09 20:59:42 -08003146QDF_STATUS sme_roam_get_wpa_rsn_rsp_ie(mac_handle_t mac_handle,
3147 uint8_t session_id,
Jeff Johnson0a078b52018-06-01 16:15:54 -07003148 uint32_t *len, uint8_t *buf)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003149{
Jeff Johnson0a078b52018-06-01 16:15:54 -07003150 QDF_STATUS status;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08003151 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003152
Jeff Johnson0a078b52018-06-01 16:15:54 -07003153 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303154 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson0a078b52018-06-01 16:15:54 -07003155 if (CSR_IS_SESSION_VALID(mac, session_id))
3156 status = csr_roam_get_wpa_rsn_rsp_ie(mac, session_id,
3157 len, buf);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303158 else
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303159 status = QDF_STATUS_E_INVAL;
Jeff Johnson0a078b52018-06-01 16:15:54 -07003160 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003161 }
3162
3163 return status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003164}
3165
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303166/*
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303167 * sme_get_config_param() -
3168 * A wrapper function that HDD calls to get the global settings
3169 * currently maintained by CSR.
3170 * This is a synchronous call.
3171 *
3172 * pParam - caller allocated memory
3173 * Return QDF_STATUS
3174 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08003175QDF_STATUS sme_get_config_param(mac_handle_t mac_handle,
Jeff Johnson46b4f0e2019-03-08 10:48:35 -08003176 struct sme_config_params *pParam)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003177{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303178 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08003179 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003180
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303181 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003182 TRACE_CODE_SME_RX_HDD_GET_CONFIGPARAM, NO_SESSION, 0));
Jeff Johnson01f2c232018-11-21 19:17:44 -08003183 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303184 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnsone94ccd02019-04-02 15:02:56 -07003185 status = csr_get_config_param(mac, &pParam->csr_config);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303186 if (status != QDF_STATUS_SUCCESS) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07003187 sme_err("csr_get_config_param failed");
Jeff Johnson01f2c232018-11-21 19:17:44 -08003188 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003189 return status;
3190 }
Jeff Johnson01f2c232018-11-21 19:17:44 -08003191 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003192 }
3193
3194 return status;
3195}
3196
gaurank kathpalia31800672019-11-22 13:50:11 +05303197uint32_t sme_get_vht_ch_width(void)
3198{
3199 return wma_get_vht_ch_width();
3200}
3201
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303202/*
3203 * sme_get_modify_profile_fields() -
3204 * HDD or SME - QOS calls this function to get the current values of
3205 * connected profile fields, changing which can cause reassoc.
3206 * This function must be called after CFG is downloaded and STA is in connected
3207 * state. Also, make sure to call this function to get the current profile
3208 * fields before calling the reassoc. So that pModifyProfileFields will have
3209 * all the latest values plus the one(s) has been updated as part of reassoc
3210 * request.
3211 *
3212 * pModifyProfileFields - pointer to the connected profile fields
3213 * changing which can cause reassoc
3214 * Return QDF_STATUS
3215 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08003216QDF_STATUS sme_get_modify_profile_fields(mac_handle_t mac_handle,
3217 uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003218 tCsrRoamModifyProfileFields *
3219 pModifyProfileFields)
3220{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303221 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08003222 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003223
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303224 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003225 TRACE_CODE_SME_RX_HDD_GET_MODPROFFIELDS, sessionId,
3226 0));
Jeff Johnson01f2c232018-11-21 19:17:44 -08003227 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303228 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08003229 if (CSR_IS_SESSION_VALID(mac, sessionId))
3230 status = csr_get_modify_profile_fields(mac, sessionId,
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303231 pModifyProfileFields);
3232 else
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303233 status = QDF_STATUS_E_INVAL;
Jeff Johnson01f2c232018-11-21 19:17:44 -08003234 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003235 }
3236
3237 return status;
3238}
3239
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003240#ifdef FEATURE_OEM_DATA_SUPPORT
3241/**
3242 * sme_register_oem_data_rsp_callback() - Register a routine of
3243 * type send_oem_data_rsp_msg
Jeff Johnsonb460dd72018-11-08 10:26:51 -08003244 * @mac_handle: Handle returned by mac_open.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003245 * @callback: Callback to send response
3246 * to oem application.
3247 *
3248 * sme_oem_data_rsp_callback is used to register sme_send_oem_data_rsp_msg
3249 * callback function.
3250 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303251 * Return: QDF_STATUS.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003252 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08003253QDF_STATUS sme_register_oem_data_rsp_callback(mac_handle_t mac_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003254 sme_send_oem_data_rsp_msg callback)
3255{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303256 QDF_STATUS status = QDF_STATUS_SUCCESS;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08003257 struct mac_context *pmac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003258
Krishna Kumaar Natarajanbbbf2ef2016-08-03 14:06:26 -07003259 pmac->sme.oem_data_rsp_callback = callback;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003260
3261 return status;
3262
3263}
Arun Khandavalli4b55da72016-07-19 19:55:01 +05303264
3265/**
3266 * sme_deregister_oem_data_rsp_callback() - De-register OEM datarsp callback
Jeff Johnsonb460dd72018-11-08 10:26:51 -08003267 * @mac_handle: Handler return by mac_open
Arun Khandavalli4b55da72016-07-19 19:55:01 +05303268 * This function De-registers the OEM data response callback to SME
3269 *
3270 * Return: None
3271 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08003272void sme_deregister_oem_data_rsp_callback(mac_handle_t mac_handle)
Arun Khandavalli4b55da72016-07-19 19:55:01 +05303273{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08003274 struct mac_context *pmac;
Arun Khandavalli4b55da72016-07-19 19:55:01 +05303275
Jeff Johnsonb460dd72018-11-08 10:26:51 -08003276 if (!mac_handle) {
Arun Khandavalli4b55da72016-07-19 19:55:01 +05303277 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Jeff Johnsonb460dd72018-11-08 10:26:51 -08003278 FL("mac_handle is not valid"));
Arun Khandavalli4b55da72016-07-19 19:55:01 +05303279 return;
3280 }
Jeff Johnsona0619e42018-11-28 17:43:00 -08003281 pmac = MAC_CONTEXT(mac_handle);
Arun Khandavalli4b55da72016-07-19 19:55:01 +05303282
Krishna Kumaar Natarajanbbbf2ef2016-08-03 14:06:26 -07003283 pmac->sme.oem_data_rsp_callback = NULL;
Arun Khandavalli4b55da72016-07-19 19:55:01 +05303284}
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003285
3286/**
Krishna Kumaar Natarajan53ca2902015-12-04 14:01:46 -08003287 * sme_oem_update_capability() - update UMAC's oem related capability.
Jeff Johnsonc7309062018-11-09 20:59:42 -08003288 * @mac_handle: Handle returned by mac_open
Krishna Kumaar Natarajan53ca2902015-12-04 14:01:46 -08003289 * @oem_cap: pointer to oem_capability
3290 *
3291 * This function updates OEM capability to UMAC. Currently RTT
3292 * related capabilities are updated. More capabilities can be
3293 * added in future.
3294 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303295 * Return: QDF_STATUS
Krishna Kumaar Natarajan53ca2902015-12-04 14:01:46 -08003296 */
Jeff Johnsonc7309062018-11-09 20:59:42 -08003297QDF_STATUS sme_oem_update_capability(mac_handle_t mac_handle,
Krishna Kumaar Natarajan53ca2902015-12-04 14:01:46 -08003298 struct sme_oem_capability *cap)
3299{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303300 QDF_STATUS status = QDF_STATUS_SUCCESS;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08003301 struct mac_context *pmac = MAC_CONTEXT(mac_handle);
Krishna Kumaar Natarajan53ca2902015-12-04 14:01:46 -08003302 uint8_t *bytes;
3303
3304 bytes = pmac->rrm.rrmSmeContext.rrmConfig.rm_capability;
3305
3306 if (cap->ftm_rr)
3307 bytes[4] |= RM_CAP_FTM_RANGE_REPORT;
3308 if (cap->lci_capability)
3309 bytes[4] |= RM_CAP_CIVIC_LOC_MEASUREMENT;
3310
3311 return status;
3312}
3313
3314/**
3315 * sme_oem_get_capability() - get oem 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 is used to get the OEM capability from UMAC.
3320 * Currently RTT related capabilities are received. More
3321 * capabilities can be 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_get_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 cap->ftm_rr = bytes[4] & RM_CAP_FTM_RANGE_REPORT;
3335 cap->lci_capability = bytes[4] & RM_CAP_CIVIC_LOC_MEASUREMENT;
3336
3337 return status;
3338}
Naveen Rawat910726a2017-03-06 11:42:51 -08003339#endif
Krishna Kumaar Natarajan53ca2902015-12-04 14:01:46 -08003340
3341/**
Masti, Narayanraddiab712a72016-08-04 11:59:11 +05303342 * sme_roam_set_default_key_index - To set default wep key idx
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -08003343 * @mac_handle: Opaque handle to the global MAC context
Masti, Narayanraddiab712a72016-08-04 11:59:11 +05303344 * @session_id: session id
3345 * @default_idx: default wep key index
3346 *
3347 * This function prepares a message and post to WMA to set wep default
3348 * key index
3349 *
3350 * Return: Success:QDF_STATUS_SUCCESS Failure: Error value
3351 */
Jeff Johnsonc7309062018-11-09 20:59:42 -08003352QDF_STATUS sme_roam_set_default_key_index(mac_handle_t mac_handle,
3353 uint8_t session_id,
Masti, Narayanraddiab712a72016-08-04 11:59:11 +05303354 uint8_t default_idx)
3355{
Rajeev Kumar37d478b2017-04-17 16:59:28 -07003356 struct scheduler_msg msg = {0};
Masti, Narayanraddiab712a72016-08-04 11:59:11 +05303357 struct wep_update_default_key_idx *update_key;
3358
3359 update_key = qdf_mem_malloc(sizeof(*update_key));
Arif Hussain0ef77082018-10-10 16:42:53 -07003360 if (!update_key)
Masti, Narayanraddiab712a72016-08-04 11:59:11 +05303361 return QDF_STATUS_E_NOMEM;
Masti, Narayanraddiab712a72016-08-04 11:59:11 +05303362
3363 update_key->session_id = session_id;
3364 update_key->default_idx = default_idx;
3365
3366 msg.type = WMA_UPDATE_WEP_DEFAULT_KEY;
3367 msg.reserved = 0;
3368 msg.bodyptr = (void *)update_key;
3369
3370 if (QDF_STATUS_SUCCESS !=
gaurank kathpalia36b0c582018-08-28 17:45:43 +05303371 scheduler_post_message(QDF_MODULE_ID_SME,
3372 QDF_MODULE_ID_WMA,
3373 QDF_MODULE_ID_WMA, &msg)) {
Masti, Narayanraddiab712a72016-08-04 11:59:11 +05303374 qdf_mem_free(update_key);
3375 return QDF_STATUS_E_FAILURE;
3376 }
3377
3378 return QDF_STATUS_SUCCESS;
3379}
3380
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303381/*
3382 * sme_get_snr() -
3383 * A wrapper function that client calls to register a callback to get SNR
3384 *
3385 * callback - SME sends back the requested stats using the callback
3386 * staId - The station ID for which the stats is requested for
3387 * pContext - user context to be passed back along with the callback
3388 * p_cds_context - cds context
3389 * \return QDF_STATUS
3390 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08003391QDF_STATUS sme_get_snr(mac_handle_t mac_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003392 tCsrSnrCallback callback,
Sourav Mohapatra05a52ed2019-08-06 16:07:05 +05303393 struct qdf_mac_addr bssId, void *pContext)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003394{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303395 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08003396 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003397
Jeff Johnson01f2c232018-11-21 19:17:44 -08003398 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303399 if (QDF_IS_STATUS_SUCCESS(status)) {
Sourav Mohapatra05a52ed2019-08-06 16:07:05 +05303400 status = csr_get_snr(mac, callback, bssId, pContext);
Jeff Johnson01f2c232018-11-21 19:17:44 -08003401 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003402 }
3403 return status;
3404}
3405
Jeff Johnsonca7a7162018-07-07 12:56:54 -07003406QDF_STATUS sme_get_link_status(mac_handle_t mac_handle,
3407 csr_link_status_callback callback,
3408 void *context, uint8_t session_id)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003409{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303410 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08003411 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Jeff Johnsonca7a7162018-07-07 12:56:54 -07003412 tAniGetLinkStatus *msg;
Rajeev Kumar37d478b2017-04-17 16:59:28 -07003413 struct scheduler_msg message = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003414
Jeff Johnsonca7a7162018-07-07 12:56:54 -07003415 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303416 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnsonca7a7162018-07-07 12:56:54 -07003417 msg = qdf_mem_malloc(sizeof(*msg));
3418 if (!msg) {
Jeff Johnsonca7a7162018-07-07 12:56:54 -07003419 sme_release_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303420 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003421 }
3422
Jeff Johnsonca7a7162018-07-07 12:56:54 -07003423 msg->msgType = WMA_LINK_STATUS_GET_REQ;
3424 msg->msgLen = sizeof(*msg);
3425 msg->sessionId = session_id;
3426 mac->sme.link_status_context = context;
3427 mac->sme.link_status_callback = callback;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003428
Rajeev Kumar8eaedf62017-01-21 11:03:13 -08003429 message.type = WMA_LINK_STATUS_GET_REQ;
Jeff Johnsonca7a7162018-07-07 12:56:54 -07003430 message.bodyptr = msg;
Rajeev Kumar8eaedf62017-01-21 11:03:13 -08003431 message.reserved = 0;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003432
gaurank kathpalia36b0c582018-08-28 17:45:43 +05303433 status = scheduler_post_message(QDF_MODULE_ID_SME,
3434 QDF_MODULE_ID_WMA,
3435 QDF_MODULE_ID_WMA, &message);
Jeff Johnsonca7a7162018-07-07 12:56:54 -07003436 if (QDF_IS_STATUS_ERROR(status)) {
3437 sme_err("post msg failed, %d", status);
3438 qdf_mem_free(msg);
3439 mac->sme.link_status_context = NULL;
3440 mac->sme.link_status_callback = NULL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003441 }
3442
Jeff Johnsonca7a7162018-07-07 12:56:54 -07003443 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003444 }
3445
3446 return status;
3447}
3448
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303449/*
3450 * sme_get_country_code() -
3451 * To return the current country code. If no country code is applied,
3452 * default country code is used to fill the buffer.
3453 * If 11d supported is turned off, an error is return and the last
3454 * applied/default country code is used.
3455 * This is a synchronous API.
3456 *
3457 * pBuf - pointer to a caller allocated buffer for returned country code.
3458 * pbLen For input, this parameter indicates how big is the buffer.
3459 * Upon return, this parameter has the number of bytes for
3460 * country. If pBuf doesn't have enough space, this function
3461 * returns fail status and this parameter contains the number
3462 * that is needed.
3463 *
3464 * Return QDF_STATUS SUCCESS.
3465 *
3466 * FAILURE or RESOURCES The API finished and failed.
3467 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08003468QDF_STATUS sme_get_country_code(mac_handle_t mac_handle, uint8_t *pBuf,
Jeff Johnson1f2dabc2018-11-07 15:33:01 -08003469 uint8_t *pbLen)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003470{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08003471 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003472
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303473 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003474 TRACE_CODE_SME_RX_HDD_GET_CNTRYCODE, NO_SESSION, 0));
3475
Jeff Johnson01f2c232018-11-21 19:17:44 -08003476 return csr_get_country_code(mac, pBuf, pbLen);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003477}
3478
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303479/*
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303480 * sme_generic_change_country_code() -
3481 * Change Country code from upperlayer during WLAN driver operation.
3482 * This is a synchronous API.
3483 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08003484 * mac_handle - The handle returned by mac_open.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303485 * pCountry New Country Code String
3486 * reg_domain regulatory domain
3487 * Return QDF_STATUS SUCCESS.
3488 * FAILURE or RESOURCES The API finished and failed.
3489 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08003490QDF_STATUS sme_generic_change_country_code(mac_handle_t mac_handle,
Amar Singhal7f1f3ec2015-10-13 17:14:08 -07003491 uint8_t *pCountry)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003492{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303493 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08003494 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Rajeev Kumar37d478b2017-04-17 16:59:28 -07003495 struct scheduler_msg msg = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003496 tAniGenericChangeCountryCodeReq *pMsg;
3497
Jeff Johnson038efe72019-03-18 13:39:31 -07003498 if (!mac) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303499 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_FATAL,
Jeff Johnson01f2c232018-11-21 19:17:44 -08003500 "%s: mac is null", __func__);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003501 return status;
3502 }
3503
Jeff Johnson01f2c232018-11-21 19:17:44 -08003504 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303505 if (QDF_IS_STATUS_SUCCESS(status)) {
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303506 pMsg = qdf_mem_malloc(sizeof(tAniGenericChangeCountryCodeReq));
Arif Hussain0ef77082018-10-10 16:42:53 -07003507 if (!pMsg) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08003508 sme_release_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303509 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003510 }
3511
3512 pMsg->msgType = eWNI_SME_GENERIC_CHANGE_COUNTRY_CODE;
3513 pMsg->msgLen =
3514 (uint16_t) sizeof(tAniGenericChangeCountryCodeReq);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303515 qdf_mem_copy(pMsg->countryCode, pCountry, 2);
Amar Singhal7f1f3ec2015-10-13 17:14:08 -07003516 pMsg->countryCode[2] = ' ';
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003517
3518 msg.type = eWNI_SME_GENERIC_CHANGE_COUNTRY_CODE;
3519 msg.bodyptr = pMsg;
3520 msg.reserved = 0;
3521
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303522 if (QDF_STATUS_SUCCESS !=
gaurank kathpalia36b0c582018-08-28 17:45:43 +05303523 scheduler_post_message(QDF_MODULE_ID_SME,
3524 QDF_MODULE_ID_SME,
3525 QDF_MODULE_ID_SME, &msg)) {
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303526 qdf_mem_free(pMsg);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303527 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003528 }
Jeff Johnson01f2c232018-11-21 19:17:44 -08003529 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003530 }
3531
3532 return status;
3533}
3534
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303535/*
3536 * sme_dhcp_start_ind() -
3537 * API to signal the FW about the DHCP Start event.
3538 *
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -08003539 * mac_handle: Opaque handle to the global MAC context.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303540 * device_mode - mode(AP,SAP etc) of the device.
3541 * macAddr - MAC address of the adapter.
3542 * sessionId - session ID.
3543 * Return QDF_STATUS SUCCESS.
3544 * FAILURE or RESOURCES The API finished and failed.
3545 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08003546QDF_STATUS sme_dhcp_start_ind(mac_handle_t mac_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003547 uint8_t device_mode,
3548 uint8_t *macAddr, uint8_t sessionId)
3549{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303550 QDF_STATUS status;
3551 QDF_STATUS qdf_status;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08003552 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Rajeev Kumar37d478b2017-04-17 16:59:28 -07003553 struct scheduler_msg message = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003554 tAniDHCPInd *pMsg;
gaurank kathpalia14e2f912017-08-31 14:51:45 +05303555 struct csr_roam_session *pSession;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003556
Jeff Johnson01f2c232018-11-21 19:17:44 -08003557 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303558 if (QDF_STATUS_SUCCESS == status) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08003559 pSession = CSR_GET_SESSION(mac, sessionId);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003560
3561 if (!pSession) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07003562 sme_err("Session: %d not found", sessionId);
Jeff Johnson01f2c232018-11-21 19:17:44 -08003563 sme_release_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303564 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003565 }
Arif Hussain3316f402016-11-10 13:08:03 -08003566 pSession->dhcp_done = false;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003567
Arif Hussain0ef77082018-10-10 16:42:53 -07003568 pMsg = qdf_mem_malloc(sizeof(tAniDHCPInd));
3569 if (!pMsg) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08003570 sme_release_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303571 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003572 }
3573 pMsg->msgType = WMA_DHCP_START_IND;
3574 pMsg->msgLen = (uint16_t) sizeof(tAniDHCPInd);
3575 pMsg->device_mode = device_mode;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303576 qdf_mem_copy(pMsg->adapterMacAddr.bytes, macAddr,
Anurag Chouhan6d760662016-02-20 16:05:43 +05303577 QDF_MAC_ADDR_SIZE);
Anurag Chouhanc5548422016-02-24 18:33:27 +05303578 qdf_copy_macaddr(&pMsg->peerMacAddr,
Srinivas Girigowda296105a2015-09-24 16:31:16 -07003579 &pSession->connectedProfile.bssid);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003580
Rajeev Kumar8eaedf62017-01-21 11:03:13 -08003581 message.type = WMA_DHCP_START_IND;
3582 message.bodyptr = pMsg;
3583 message.reserved = 0;
Sreelakshmi Konamki6a065362016-05-31 16:05:01 +05303584 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
Rajeev Kumar8eaedf62017-01-21 11:03:13 -08003585 sessionId, message.type));
gaurank kathpalia36b0c582018-08-28 17:45:43 +05303586 qdf_status = scheduler_post_message(QDF_MODULE_ID_SME,
3587 QDF_MODULE_ID_WMA,
3588 QDF_MODULE_ID_WMA,
3589 &message);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303590 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303591 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003592 "%s: Post DHCP Start MSG fail", __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303593 qdf_mem_free(pMsg);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303594 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003595 }
Jeff Johnson01f2c232018-11-21 19:17:44 -08003596 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003597 }
3598 return status;
3599}
3600
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303601/*
3602 * sme_dhcp_stop_ind() -
3603 * API to signal the FW about the DHCP complete event.
3604 *
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -08003605 * mac_handle: Opaque handle to the global MAC context.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303606 * device_mode - mode(AP, SAP etc) of the device.
3607 * macAddr - MAC address of the adapter.
3608 * sessionId - session ID.
3609 * Return QDF_STATUS SUCCESS.
3610 * FAILURE or RESOURCES The API finished and failed.
3611 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08003612QDF_STATUS sme_dhcp_stop_ind(mac_handle_t mac_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003613 uint8_t device_mode,
3614 uint8_t *macAddr, uint8_t sessionId)
3615{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303616 QDF_STATUS status;
3617 QDF_STATUS qdf_status;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08003618 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Rajeev Kumar37d478b2017-04-17 16:59:28 -07003619 struct scheduler_msg message = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003620 tAniDHCPInd *pMsg;
gaurank kathpalia14e2f912017-08-31 14:51:45 +05303621 struct csr_roam_session *pSession;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003622
Jeff Johnson01f2c232018-11-21 19:17:44 -08003623 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303624 if (QDF_STATUS_SUCCESS == status) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08003625 pSession = CSR_GET_SESSION(mac, sessionId);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003626
3627 if (!pSession) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07003628 sme_err("Session: %d not found", sessionId);
Jeff Johnson01f2c232018-11-21 19:17:44 -08003629 sme_release_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303630 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003631 }
Arif Hussain3316f402016-11-10 13:08:03 -08003632 pSession->dhcp_done = true;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003633
Arif Hussain0ef77082018-10-10 16:42:53 -07003634 pMsg = qdf_mem_malloc(sizeof(tAniDHCPInd));
3635 if (!pMsg) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08003636 sme_release_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303637 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003638 }
3639
3640 pMsg->msgType = WMA_DHCP_STOP_IND;
3641 pMsg->msgLen = (uint16_t) sizeof(tAniDHCPInd);
3642 pMsg->device_mode = device_mode;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303643 qdf_mem_copy(pMsg->adapterMacAddr.bytes, macAddr,
Anurag Chouhan6d760662016-02-20 16:05:43 +05303644 QDF_MAC_ADDR_SIZE);
Anurag Chouhanc5548422016-02-24 18:33:27 +05303645 qdf_copy_macaddr(&pMsg->peerMacAddr,
Srinivas Girigowda296105a2015-09-24 16:31:16 -07003646 &pSession->connectedProfile.bssid);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003647
Rajeev Kumar8eaedf62017-01-21 11:03:13 -08003648 message.type = WMA_DHCP_STOP_IND;
3649 message.bodyptr = pMsg;
3650 message.reserved = 0;
Sreelakshmi Konamki6a065362016-05-31 16:05:01 +05303651 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
Rajeev Kumar8eaedf62017-01-21 11:03:13 -08003652 sessionId, message.type));
gaurank kathpalia36b0c582018-08-28 17:45:43 +05303653 qdf_status = scheduler_post_message(QDF_MODULE_ID_SME,
3654 QDF_MODULE_ID_WMA,
3655 QDF_MODULE_ID_WMA,
3656 &message);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303657 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303658 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003659 "%s: Post DHCP Stop MSG fail", __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303660 qdf_mem_free(pMsg);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303661 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003662 }
3663
Jeff Johnson01f2c232018-11-21 19:17:44 -08003664 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003665 }
3666 return status;
3667}
3668
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303669/*
3670 * sme_TXFailMonitorStopInd() -
3671 * API to signal the FW to start monitoring TX failures
3672 *
3673 * Return QDF_STATUS SUCCESS.
3674 * FAILURE or RESOURCES The API finished and failed.
3675 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08003676QDF_STATUS sme_tx_fail_monitor_start_stop_ind(mac_handle_t mac_handle,
3677 uint8_t tx_fail_count,
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08003678 void *txFailIndCallback)
3679{
3680 QDF_STATUS status;
3681 QDF_STATUS qdf_status;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08003682 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Rajeev Kumar37d478b2017-04-17 16:59:28 -07003683 struct scheduler_msg message = {0};
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08003684 tAniTXFailMonitorInd *pMsg;
3685
Jeff Johnson01f2c232018-11-21 19:17:44 -08003686 status = sme_acquire_global_lock(&mac->sme);
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08003687 if (QDF_STATUS_SUCCESS == status) {
Arif Hussain0ef77082018-10-10 16:42:53 -07003688 pMsg = qdf_mem_malloc(sizeof(tAniTXFailMonitorInd));
3689 if (!pMsg) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08003690 sme_release_global_lock(&mac->sme);
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08003691 return QDF_STATUS_E_NOMEM;
3692 }
3693
3694 pMsg->msgType = WMA_TX_FAIL_MONITOR_IND;
3695 pMsg->msgLen = (uint16_t) sizeof(tAniTXFailMonitorInd);
3696
3697 /* tx_fail_count = 0 should disable the Monitoring in FW */
3698 pMsg->tx_fail_count = tx_fail_count;
3699 pMsg->txFailIndCallback = txFailIndCallback;
3700
Rajeev Kumar8eaedf62017-01-21 11:03:13 -08003701 message.type = WMA_TX_FAIL_MONITOR_IND;
3702 message.bodyptr = pMsg;
3703 message.reserved = 0;
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08003704
gaurank kathpalia36b0c582018-08-28 17:45:43 +05303705 qdf_status = scheduler_post_message(QDF_MODULE_ID_SME,
3706 QDF_MODULE_ID_WMA,
3707 QDF_MODULE_ID_WMA,
3708 &message);
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08003709 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
3710 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
3711 "%s: Post TX Fail monitor Start MSG fail",
3712 __func__);
3713 qdf_mem_free(pMsg);
3714 status = QDF_STATUS_E_FAILURE;
3715 }
Jeff Johnson01f2c232018-11-21 19:17:44 -08003716 sme_release_global_lock(&mac->sme);
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08003717 }
3718 return status;
3719}
3720
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303721/*
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303722 * sme_neighbor_report_request() -
3723 * API to request neighbor report.
3724 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08003725 * mac_handle - The handle returned by mac_open.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303726 * pRrmNeighborReq - Pointer to a caller allocated object of type
3727 * tRrmNeighborReq. Caller owns the memory and is
3728 * responsible for freeing it.
3729 * Return QDF_STATUS
3730 * QDF_STATUS_E_FAILURE - failure
3731 * QDF_STATUS_SUCCESS success
3732 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08003733QDF_STATUS sme_neighbor_report_request(
3734 mac_handle_t mac_handle,
3735 uint8_t sessionId,
3736 tpRrmNeighborReq pRrmNeighborReq,
3737 tpRrmNeighborRspCallbackInfo callbackInfo)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003738{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303739 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08003740 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303741
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303742 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003743 TRACE_CODE_SME_RX_HDD_NEIGHBOR_REPORTREQ, NO_SESSION,
3744 0));
3745
Vignesh Viswanathan694e28e2018-01-18 20:53:57 +05303746 if (pRrmNeighborReq->neighbor_report_offload) {
3747 status = csr_invoke_neighbor_report_request(sessionId,
3748 pRrmNeighborReq,
3749 false);
3750 return status;
3751 }
3752
Jeff Johnson01f2c232018-11-21 19:17:44 -08003753 if (QDF_STATUS_SUCCESS == sme_acquire_global_lock(&mac->sme)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003754 status =
Jeff Johnson01f2c232018-11-21 19:17:44 -08003755 sme_rrm_neighbor_report_request(mac, sessionId,
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303756 pRrmNeighborReq, callbackInfo);
Jeff Johnson01f2c232018-11-21 19:17:44 -08003757 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003758 }
3759
3760 return status;
3761}
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003762
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003763#ifdef FEATURE_OEM_DATA_SUPPORT
Paul Zhangda2970b2019-06-23 18:16:38 +08003764QDF_STATUS sme_oem_req_cmd(mac_handle_t mac_handle,
3765 struct oem_data_req *oem_req)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003766{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303767 QDF_STATUS status = QDF_STATUS_SUCCESS;
Krishna Kumaar Natarajanc1fa17d2016-08-03 14:19:20 -07003768 struct oem_data_req *oem_data_req;
Krishna Kumaar Natarajanc5e06ac2016-06-30 16:49:19 -07003769 void *wma_handle;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003770
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07003771 SME_ENTER();
Krishna Kumaar Natarajanc5e06ac2016-06-30 16:49:19 -07003772 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
3773 if (!wma_handle) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07003774 sme_err("wma_handle is NULL");
Krishna Kumaar Natarajanc5e06ac2016-06-30 16:49:19 -07003775 return QDF_STATUS_E_FAILURE;
3776 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003777
Krishna Kumaar Natarajanc5e06ac2016-06-30 16:49:19 -07003778 oem_data_req = qdf_mem_malloc(sizeof(*oem_data_req));
Arif Hussain0ef77082018-10-10 16:42:53 -07003779 if (!oem_data_req)
Krishna Kumaar Natarajanc5e06ac2016-06-30 16:49:19 -07003780 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003781
Paul Zhangda2970b2019-06-23 18:16:38 +08003782 oem_data_req->data_len = oem_req->data_len;
Krishna Kumaar Natarajanc5e06ac2016-06-30 16:49:19 -07003783 oem_data_req->data = qdf_mem_malloc(oem_data_req->data_len);
Abhinav Kumar009f69f2019-06-05 21:43:31 +05303784 if (!oem_data_req->data) {
3785 qdf_mem_free(oem_data_req);
Krishna Kumaar Natarajanc5e06ac2016-06-30 16:49:19 -07003786 return QDF_STATUS_E_NOMEM;
Abhinav Kumar009f69f2019-06-05 21:43:31 +05303787 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003788
Paul Zhangda2970b2019-06-23 18:16:38 +08003789 qdf_mem_copy(oem_data_req->data, oem_req->data,
Krishna Kumaar Natarajanc5e06ac2016-06-30 16:49:19 -07003790 oem_data_req->data_len);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003791
Paul Zhangda2970b2019-06-23 18:16:38 +08003792 status = wma_start_oem_req_cmd(wma_handle, oem_data_req);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003793
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303794 if (!QDF_IS_STATUS_SUCCESS(status))
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07003795 sme_err("Post oem data request msg fail");
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303796 else
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07003797 sme_debug("OEM request(length: %d) sent to WMA",
3798 oem_data_req->data_len);
Krishna Kumaar Natarajanc5e06ac2016-06-30 16:49:19 -07003799
3800 if (oem_data_req->data_len)
3801 qdf_mem_free(oem_data_req->data);
3802 qdf_mem_free(oem_data_req);
3803
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07003804 SME_EXIT();
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003805 return status;
3806}
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003807#endif /*FEATURE_OEM_DATA_SUPPORT */
3808
Paul Zhangda2970b2019-06-23 18:16:38 +08003809#ifdef FEATURE_OEM_DATA
3810QDF_STATUS sme_oem_data_cmd(mac_handle_t mac_handle,
3811 struct oem_data *oem_data)
3812{
3813 QDF_STATUS status;
3814 void *wma_handle;
3815
3816 SME_ENTER();
3817 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
3818 if (!wma_handle) {
3819 sme_err("wma_handle is NULL");
3820 return QDF_STATUS_E_FAILURE;
3821 }
3822
3823 status = wma_start_oem_data_cmd(wma_handle, oem_data);
3824 if (!QDF_IS_STATUS_SUCCESS(status))
3825 sme_err("fail to call wma_start_oem_data_cmd.");
3826
3827 SME_EXIT();
3828 return status;
3829}
3830#endif
3831
gaurank kathpalia78af1932018-10-27 20:33:10 +05303832#define STA_NSS_CHAINS_SHIFT 0
3833#define SAP_NSS_CHAINS_SHIFT 3
3834#define P2P_GO_NSS_CHAINS_SHIFT 6
3835#define P2P_CLI_CHAINS_SHIFT 9
gaurank kathpalia651abcd2018-11-12 22:41:23 +05303836#define TDLS_NSS_CHAINS_SHIFT 12
gaurank kathpalia78af1932018-10-27 20:33:10 +05303837#define IBSS_NSS_CHAINS_SHIFT 15
3838#define P2P_DEV_NSS_CHAINS_SHIFT 18
3839#define OCB_NSS_CHAINS_SHIFT 21
3840#define NAN_NSS_CHAIN_SHIFT 24
3841#define NSS_CHAIN_MASK 0x7
3842#define GET_VDEV_NSS_CHAIN(x, y) (((x) >> (y)) & NSS_CHAIN_MASK)
3843
3844static uint8_t sme_get_nss_chain_shift(enum QDF_OPMODE device_mode)
3845{
3846 switch (device_mode) {
3847 case QDF_STA_MODE:
3848 return STA_NSS_CHAINS_SHIFT;
3849 case QDF_SAP_MODE:
3850 return SAP_NSS_CHAINS_SHIFT;
3851 case QDF_P2P_GO_MODE:
3852 return P2P_GO_NSS_CHAINS_SHIFT;
3853 case QDF_P2P_CLIENT_MODE:
3854 return P2P_CLI_CHAINS_SHIFT;
3855 case QDF_IBSS_MODE:
3856 return IBSS_NSS_CHAINS_SHIFT;
3857 case QDF_P2P_DEVICE_MODE:
3858 return P2P_DEV_NSS_CHAINS_SHIFT;
3859 case QDF_OCB_MODE:
3860 return OCB_NSS_CHAINS_SHIFT;
gaurank kathpalia651abcd2018-11-12 22:41:23 +05303861 case QDF_TDLS_MODE:
3862 return TDLS_NSS_CHAINS_SHIFT;
gaurank kathpalia78af1932018-10-27 20:33:10 +05303863
3864 default:
3865 sme_err("Device mode %d invalid", device_mode);
3866 return STA_NSS_CHAINS_SHIFT;
3867 }
3868}
3869
3870static void
gaurank kathpaliacbf12122018-11-18 14:52:11 +05303871sme_check_nss_chain_ini_param(struct wlan_mlme_nss_chains *vdev_ini_cfg,
3872 uint8_t rf_chains_supported,
3873 enum nss_chains_band_info band)
3874{
3875 vdev_ini_cfg->rx_nss[band] = QDF_MIN(vdev_ini_cfg->rx_nss[band],
3876 rf_chains_supported);
3877 vdev_ini_cfg->tx_nss[band] = QDF_MIN(vdev_ini_cfg->tx_nss[band],
3878 rf_chains_supported);
3879}
3880
3881static void
gaurank kathpalia24ed0f42018-11-13 15:37:49 +05303882sme_fill_nss_chain_params(struct mac_context *mac_ctx,
gaurank kathpalia78af1932018-10-27 20:33:10 +05303883 struct wlan_mlme_nss_chains *vdev_ini_cfg,
3884 enum QDF_OPMODE device_mode,
3885 enum nss_chains_band_info band,
3886 uint8_t rf_chains_supported)
3887{
3888 uint8_t nss_chain_shift;
3889 uint8_t max_supported_nss;
3890 struct wlan_mlme_nss_chains *nss_chains_ini_cfg =
3891 &mac_ctx->mlme_cfg->nss_chains_ini_cfg;
3892
3893 nss_chain_shift = sme_get_nss_chain_shift(device_mode);
3894 max_supported_nss = mac_ctx->mlme_cfg->vht_caps.vht_cap_info.enable2x2 ?
3895 MAX_VDEV_NSS : 1;
3896
Nachiket Kukaded4d40bc2019-01-21 17:54:12 +05303897 /*
3898 * If target supports Antenna sharing, set NSS to 1 for 2.4GHz band for
3899 * NDI vdev.
3900 */
3901 if (device_mode == QDF_NDI_MODE && mac_ctx->lteCoexAntShare &&
3902 band == NSS_CHAINS_BAND_2GHZ)
3903 max_supported_nss = NSS_1x1_MODE;
3904
gaurank kathpalia78af1932018-10-27 20:33:10 +05303905 /* If the fw doesn't support two chains, num rf chains can max be 1 */
3906 vdev_ini_cfg->num_rx_chains[band] =
3907 QDF_MIN(GET_VDEV_NSS_CHAIN(
3908 nss_chains_ini_cfg->num_rx_chains[band],
3909 nss_chain_shift), rf_chains_supported);
3910
3911 vdev_ini_cfg->num_tx_chains[band] =
3912 QDF_MIN(GET_VDEV_NSS_CHAIN(
3913 nss_chains_ini_cfg->num_tx_chains[band],
3914 nss_chain_shift), rf_chains_supported);
3915
3916 /* If 2x2 mode is disabled, then max rx, tx nss can be 1 */
3917 vdev_ini_cfg->rx_nss[band] =
3918 QDF_MIN(GET_VDEV_NSS_CHAIN(
3919 nss_chains_ini_cfg->rx_nss[band],
3920 nss_chain_shift), max_supported_nss);
3921
3922 vdev_ini_cfg->tx_nss[band] =
3923 QDF_MIN(GET_VDEV_NSS_CHAIN(
3924 nss_chains_ini_cfg->tx_nss[band],
3925 nss_chain_shift), max_supported_nss);
3926
3927 vdev_ini_cfg->num_tx_chains_11a =
3928 QDF_MIN(GET_VDEV_NSS_CHAIN(
3929 nss_chains_ini_cfg->num_tx_chains_11a,
3930 nss_chain_shift), rf_chains_supported);
3931
3932 /* If the fw doesn't support two chains, num rf chains can max be 1 */
3933 vdev_ini_cfg->num_tx_chains_11b =
3934 QDF_MIN(GET_VDEV_NSS_CHAIN(
3935 nss_chains_ini_cfg->num_tx_chains_11b,
3936 nss_chain_shift), rf_chains_supported);
3937
3938 vdev_ini_cfg->num_tx_chains_11g =
3939 QDF_MIN(GET_VDEV_NSS_CHAIN(
3940 nss_chains_ini_cfg->num_tx_chains_11g,
3941 nss_chain_shift), rf_chains_supported);
3942
3943 vdev_ini_cfg->disable_rx_mrc[band] =
3944 nss_chains_ini_cfg->disable_rx_mrc[band];
3945
3946 vdev_ini_cfg->disable_tx_mrc[band] =
3947 nss_chains_ini_cfg->disable_tx_mrc[band];
gaurank kathpaliacbf12122018-11-18 14:52:11 +05303948 /*
3949 * Check whether the rx/tx nss is greater than the number of rf chains
3950 * supported by FW, if so downgrade the nss to the number of chains
3951 * supported, as higher nss cannot be supported with less chains.
3952 */
3953 sme_check_nss_chain_ini_param(vdev_ini_cfg, rf_chains_supported,
3954 band);
3955
gaurank kathpalia78af1932018-10-27 20:33:10 +05303956}
3957
3958void sme_populate_nss_chain_params(mac_handle_t mac_handle,
3959 struct wlan_mlme_nss_chains *vdev_ini_cfg,
3960 enum QDF_OPMODE device_mode,
3961 uint8_t rf_chains_supported)
3962{
gaurank kathpalia24ed0f42018-11-13 15:37:49 +05303963 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
gaurank kathpalia78af1932018-10-27 20:33:10 +05303964 enum nss_chains_band_info band;
3965
gaurank kathpaliab414bce2018-11-09 18:44:46 +05303966 for (band = NSS_CHAINS_BAND_2GHZ; band < NSS_CHAINS_BAND_MAX; band++)
gaurank kathpalia78af1932018-10-27 20:33:10 +05303967 sme_fill_nss_chain_params(mac_ctx, vdev_ini_cfg,
3968 device_mode, band,
3969 rf_chains_supported);
3970}
3971
gaurank kathpaliab414bce2018-11-09 18:44:46 +05303972void
3973sme_store_nss_chains_cfg_in_vdev(struct wlan_objmgr_vdev *vdev,
3974 struct wlan_mlme_nss_chains *vdev_ini_cfg)
3975{
3976 struct wlan_mlme_nss_chains *ini_cfg;
3977 struct wlan_mlme_nss_chains *dynamic_cfg;
3978
3979 ini_cfg = mlme_get_ini_vdev_config(vdev);
3980 dynamic_cfg = mlme_get_dynamic_vdev_config(vdev);
3981
3982 if (!ini_cfg || !dynamic_cfg) {
3983 sme_err("Nss chains ini/dynamic config NULL vdev_id %d",
3984 vdev->vdev_objmgr.vdev_id);
3985 return;
3986 }
3987
3988 *ini_cfg = *vdev_ini_cfg;
3989 *dynamic_cfg = *vdev_ini_cfg;
3990}
3991
gaurank kathpalia2b32de02018-10-24 18:31:14 +05303992static void
3993sme_populate_user_config(struct wlan_mlme_nss_chains *dynamic_cfg,
3994 struct wlan_mlme_nss_chains *user_cfg,
3995 enum nss_chains_band_info band)
3996{
3997 if (!user_cfg->num_rx_chains[band])
3998 user_cfg->num_rx_chains[band] =
3999 dynamic_cfg->num_rx_chains[band];
4000
4001 if (!user_cfg->num_tx_chains[band])
4002 user_cfg->num_tx_chains[band] =
4003 dynamic_cfg->num_tx_chains[band];
4004
4005 if (!user_cfg->rx_nss[band])
4006 user_cfg->rx_nss[band] =
4007 dynamic_cfg->rx_nss[band];
4008
4009 if (!user_cfg->tx_nss[band])
4010 user_cfg->tx_nss[band] =
4011 dynamic_cfg->tx_nss[band];
4012
4013 if (!user_cfg->num_tx_chains_11a)
4014 user_cfg->num_tx_chains_11a =
4015 dynamic_cfg->num_tx_chains_11a;
4016
4017 if (!user_cfg->num_tx_chains_11b)
4018 user_cfg->num_tx_chains_11b =
4019 dynamic_cfg->num_tx_chains_11b;
4020
4021 if (!user_cfg->num_tx_chains_11g)
4022 user_cfg->num_tx_chains_11g =
4023 dynamic_cfg->num_tx_chains_11g;
4024
4025 if (!user_cfg->disable_rx_mrc[band])
4026 user_cfg->disable_rx_mrc[band] =
4027 dynamic_cfg->disable_rx_mrc[band];
4028
4029 if (!user_cfg->disable_tx_mrc[band])
4030 user_cfg->disable_tx_mrc[band] =
4031 dynamic_cfg->disable_tx_mrc[band];
4032}
4033
4034static QDF_STATUS
4035sme_validate_from_ini_config(struct wlan_mlme_nss_chains *user_cfg,
4036 struct wlan_mlme_nss_chains *ini_cfg,
4037 enum nss_chains_band_info band)
4038{
4039 if (user_cfg->num_rx_chains[band] >
4040 ini_cfg->num_rx_chains[band])
4041 return QDF_STATUS_E_FAILURE;
4042
4043 if (user_cfg->num_tx_chains[band] >
4044 ini_cfg->num_tx_chains[band])
4045 return QDF_STATUS_E_FAILURE;
4046
4047 if (user_cfg->rx_nss[band] >
4048 ini_cfg->rx_nss[band])
4049 return QDF_STATUS_E_FAILURE;
4050
4051 if (user_cfg->tx_nss[band] >
4052 ini_cfg->tx_nss[band])
4053 return QDF_STATUS_E_FAILURE;
4054
4055 if (user_cfg->num_tx_chains_11a >
4056 ini_cfg->num_tx_chains_11a)
4057 return QDF_STATUS_E_FAILURE;
4058
4059 if (user_cfg->num_tx_chains_11b >
4060 ini_cfg->num_tx_chains_11b)
4061 return QDF_STATUS_E_FAILURE;
4062
4063 if (user_cfg->num_tx_chains_11g >
4064 ini_cfg->num_tx_chains_11g)
4065 return QDF_STATUS_E_FAILURE;
4066
4067 return QDF_STATUS_SUCCESS;
4068}
4069
4070static QDF_STATUS
4071sme_validate_user_nss_chain_params(
4072 struct wlan_mlme_nss_chains *user_cfg,
4073 enum nss_chains_band_info band)
4074{
4075 /* Reject as 2x1 modes are not supported in chains yet */
4076
4077 if (user_cfg->num_tx_chains[band] >
4078 user_cfg->num_rx_chains[band])
4079 return QDF_STATUS_E_FAILURE;
4080
4081 /* Also if mode is 2x2, we cant have chains as 1x1, or 1x2, or 2x1 */
4082
4083 if (user_cfg->tx_nss[band] >
4084 user_cfg->num_tx_chains[band])
4085 user_cfg->num_tx_chains[band] =
4086 user_cfg->tx_nss[band];
4087
4088 if (user_cfg->rx_nss[band] >
4089 user_cfg->num_rx_chains[band])
4090 user_cfg->num_rx_chains[band] =
4091 user_cfg->rx_nss[band];
4092
4093 /*
4094 * It may happen that already chains are in 1x1 mode and nss too
4095 * is in 1x1 mode, but the tx 11a/b/g chains in user config comes
4096 * as 2x1, or 1x2 which cannot support respective mode, as tx chains
4097 * for respective band have max of 1x1 only, so these cannot exceed
4098 * respective band num tx chains.
4099 */
4100
4101 if (user_cfg->num_tx_chains_11a >
gaurank kathpaliab414bce2018-11-09 18:44:46 +05304102 user_cfg->num_tx_chains[NSS_CHAINS_BAND_5GHZ])
gaurank kathpalia2b32de02018-10-24 18:31:14 +05304103 user_cfg->num_tx_chains_11a =
gaurank kathpaliab414bce2018-11-09 18:44:46 +05304104 user_cfg->num_tx_chains[NSS_CHAINS_BAND_5GHZ];
gaurank kathpalia2b32de02018-10-24 18:31:14 +05304105
4106 if (user_cfg->num_tx_chains_11b >
gaurank kathpaliab414bce2018-11-09 18:44:46 +05304107 user_cfg->num_tx_chains[NSS_CHAINS_BAND_2GHZ])
gaurank kathpalia2b32de02018-10-24 18:31:14 +05304108 user_cfg->num_tx_chains_11b =
gaurank kathpaliab414bce2018-11-09 18:44:46 +05304109 user_cfg->num_tx_chains[NSS_CHAINS_BAND_2GHZ];
gaurank kathpalia2b32de02018-10-24 18:31:14 +05304110
4111 if (user_cfg->num_tx_chains_11g >
gaurank kathpaliab414bce2018-11-09 18:44:46 +05304112 user_cfg->num_tx_chains[NSS_CHAINS_BAND_2GHZ])
gaurank kathpalia2b32de02018-10-24 18:31:14 +05304113 user_cfg->num_tx_chains_11g =
gaurank kathpaliab414bce2018-11-09 18:44:46 +05304114 user_cfg->num_tx_chains[NSS_CHAINS_BAND_2GHZ];
gaurank kathpalia2b32de02018-10-24 18:31:14 +05304115
4116 return QDF_STATUS_SUCCESS;
4117}
4118
4119static QDF_STATUS
4120sme_validate_nss_chains_config(struct wlan_objmgr_vdev *vdev,
gaurank kathpaliadb87c0d2018-10-31 16:44:00 +05304121 struct wlan_mlme_nss_chains *user_cfg,
4122 struct wlan_mlme_nss_chains *dynamic_cfg)
gaurank kathpalia2b32de02018-10-24 18:31:14 +05304123{
4124 enum nss_chains_band_info band;
4125 struct wlan_mlme_nss_chains *ini_cfg;
gaurank kathpalia2b32de02018-10-24 18:31:14 +05304126 QDF_STATUS status;
4127
4128 ini_cfg = mlme_get_ini_vdev_config(vdev);
4129 if (!ini_cfg) {
4130 sme_err("nss chain ini config NULL");
4131 return QDF_STATUS_E_FAILURE;
4132 }
gaurank kathpalia2b32de02018-10-24 18:31:14 +05304133
gaurank kathpaliab414bce2018-11-09 18:44:46 +05304134 for (band = NSS_CHAINS_BAND_2GHZ; band < NSS_CHAINS_BAND_MAX; band++) {
gaurank kathpalia2b32de02018-10-24 18:31:14 +05304135 sme_populate_user_config(dynamic_cfg,
4136 user_cfg, band);
4137 status = sme_validate_from_ini_config(user_cfg,
4138 ini_cfg,
4139 band);
4140 if (QDF_IS_STATUS_ERROR(status)) {
4141 sme_err("Validation from ini config failed");
4142 return QDF_STATUS_E_FAILURE;
4143 }
4144 status = sme_validate_user_nss_chain_params(user_cfg,
4145 band);
4146 if (QDF_IS_STATUS_ERROR(status)) {
4147 sme_err("User cfg validation failed");
4148 return QDF_STATUS_E_FAILURE;
4149 }
4150 }
4151
4152 return QDF_STATUS_SUCCESS;
4153}
4154
gaurank kathpaliafa7ad0a2019-03-12 19:17:56 +05304155static bool
4156sme_is_nss_update_allowed(struct wlan_mlme_chain_cfg chain_cfg,
4157 uint8_t rx_nss, uint8_t tx_nss,
4158 enum nss_chains_band_info band)
4159{
4160 switch (band) {
4161 case NSS_CHAINS_BAND_2GHZ:
4162 if (rx_nss > chain_cfg.max_rx_chains_2g)
4163 return false;
4164 if (tx_nss > chain_cfg.max_tx_chains_2g)
4165 return false;
4166 break;
4167 case NSS_CHAINS_BAND_5GHZ:
4168 if (rx_nss > chain_cfg.max_rx_chains_5g)
4169 return false;
4170 if (tx_nss > chain_cfg.max_tx_chains_5g)
4171 return false;
4172 break;
4173 default:
4174 sme_err("Unknown Band nss change not allowed");
4175 return false;
4176 }
4177 return true;
4178}
4179
4180static void sme_modify_chains_in_mlme_cfg(mac_handle_t mac_handle,
4181 uint8_t rx_chains,
4182 uint8_t tx_chains,
4183 enum QDF_OPMODE vdev_op_mode,
4184 enum nss_chains_band_info band)
gaurank kathpalia6c4b50c2019-02-28 14:07:48 +05304185{
4186 uint8_t nss_shift;
4187 uint32_t nss_mask = 0x7;
4188 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
4189
4190 nss_shift = sme_get_nss_chain_shift(vdev_op_mode);
4191
gaurank kathpaliafa7ad0a2019-03-12 19:17:56 +05304192 mac_ctx->mlme_cfg->nss_chains_ini_cfg.num_rx_chains[band] &=
4193 ~(nss_mask << nss_shift);
4194 mac_ctx->mlme_cfg->nss_chains_ini_cfg.num_rx_chains[band] |=
4195 (rx_chains << nss_shift);
4196 mac_ctx->mlme_cfg->nss_chains_ini_cfg.num_tx_chains[band] &=
4197 ~(nss_mask << nss_shift);
4198 mac_ctx->mlme_cfg->nss_chains_ini_cfg.num_tx_chains[band] |=
4199 (tx_chains << nss_shift);
4200 sme_debug("rx chains %d tx chains %d changed for vdev mode %d for band %d",
4201 rx_chains, tx_chains, vdev_op_mode, band);
4202}
4203
4204static void
4205sme_modify_nss_in_mlme_cfg(mac_handle_t mac_handle,
4206 uint8_t rx_nss, uint8_t tx_nss,
4207 enum QDF_OPMODE vdev_op_mode,
4208 enum nss_chains_band_info band)
4209{
4210 uint8_t nss_shift;
4211 uint32_t nss_mask = 0x7;
4212 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
4213
4214 if (!sme_is_nss_update_allowed(mac_ctx->fw_chain_cfg, rx_nss, tx_nss,
4215 band)) {
4216 sme_debug("Nss modification failed, fw doesn't support this nss %d",
4217 rx_nss);
4218 return;
4219 }
4220
4221 nss_shift = sme_get_nss_chain_shift(vdev_op_mode);
4222
gaurank kathpalia6c4b50c2019-02-28 14:07:48 +05304223 mac_ctx->mlme_cfg->nss_chains_ini_cfg.rx_nss[band] &=
4224 ~(nss_mask << nss_shift);
4225 mac_ctx->mlme_cfg->nss_chains_ini_cfg.rx_nss[band] |=
4226 (rx_nss << nss_shift);
4227 mac_ctx->mlme_cfg->nss_chains_ini_cfg.tx_nss[band] &=
4228 ~(nss_mask << nss_shift);
4229 mac_ctx->mlme_cfg->nss_chains_ini_cfg.tx_nss[band] |=
4230 (tx_nss << nss_shift);
4231 sme_debug("rx nss %d tx nss %d changed for vdev mode %d for band %d",
4232 rx_nss, tx_nss, vdev_op_mode, band);
4233}
4234
4235void
gaurank kathpaliafa7ad0a2019-03-12 19:17:56 +05304236sme_modify_nss_chains_tgt_cfg(mac_handle_t mac_handle,
4237 enum QDF_OPMODE vdev_op_mode,
4238 enum nss_chains_band_info band)
4239{
4240 uint8_t ini_rx_nss;
4241 uint8_t ini_tx_nss;
4242 uint8_t max_supported_rx_nss = MAX_VDEV_NSS;
4243 uint8_t max_supported_tx_nss = MAX_VDEV_NSS;
4244 uint8_t ini_rx_chains;
4245 uint8_t ini_tx_chains;
4246 uint8_t max_supported_rx_chains = MAX_VDEV_CHAINS;
4247 uint8_t max_supported_tx_chains = MAX_VDEV_CHAINS;
4248
4249 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
4250 struct wlan_mlme_nss_chains *nss_chains_ini_cfg =
4251 &mac_ctx->mlme_cfg->nss_chains_ini_cfg;
4252 uint8_t nss_shift = sme_get_nss_chain_shift(vdev_op_mode);
4253 struct wlan_mlme_chain_cfg chain_cfg = mac_ctx->fw_chain_cfg;
4254
4255 ini_rx_nss = GET_VDEV_NSS_CHAIN(nss_chains_ini_cfg->rx_nss[band],
4256 nss_shift);
4257 ini_tx_nss = GET_VDEV_NSS_CHAIN(nss_chains_ini_cfg->tx_nss[band],
4258 nss_shift);
4259
4260 if (band == NSS_CHAINS_BAND_2GHZ) {
4261 max_supported_rx_nss = chain_cfg.max_rx_chains_2g;
4262 max_supported_tx_nss = chain_cfg.max_tx_chains_2g;
4263 } else if (band == NSS_CHAINS_BAND_5GHZ) {
4264 max_supported_rx_nss = chain_cfg.max_rx_chains_5g;
4265 max_supported_tx_nss = chain_cfg.max_tx_chains_5g;
4266 }
4267
4268 max_supported_rx_nss = QDF_MIN(ini_rx_nss, max_supported_rx_nss);
gaurank kathpalia23afef12019-04-04 12:39:59 +05304269 if (!max_supported_rx_nss)
4270 return;
4271
gaurank kathpaliafa7ad0a2019-03-12 19:17:56 +05304272 max_supported_tx_nss = QDF_MIN(ini_tx_nss, max_supported_tx_nss);
gaurank kathpalia23afef12019-04-04 12:39:59 +05304273 if (!max_supported_tx_nss)
4274 return;
gaurank kathpaliafa7ad0a2019-03-12 19:17:56 +05304275
4276 ini_rx_chains = GET_VDEV_NSS_CHAIN(nss_chains_ini_cfg->
4277 num_rx_chains[band],
4278 nss_shift);
4279 ini_tx_chains = GET_VDEV_NSS_CHAIN(nss_chains_ini_cfg->
4280 num_tx_chains[band],
4281 nss_shift);
4282
4283 if (band == NSS_CHAINS_BAND_2GHZ) {
4284 max_supported_rx_chains = chain_cfg.max_rx_chains_2g;
4285 max_supported_tx_chains = chain_cfg.max_tx_chains_2g;
4286 } else if (band == NSS_CHAINS_BAND_5GHZ) {
4287 max_supported_rx_chains = chain_cfg.max_rx_chains_5g;
4288 max_supported_tx_chains = chain_cfg.max_tx_chains_5g;
4289 }
4290
4291 max_supported_rx_chains = QDF_MIN(ini_rx_chains,
4292 max_supported_rx_chains);
gaurank kathpalia23afef12019-04-04 12:39:59 +05304293 if (!max_supported_rx_chains)
4294 return;
4295
gaurank kathpaliafa7ad0a2019-03-12 19:17:56 +05304296 max_supported_tx_chains = QDF_MIN(ini_tx_chains,
4297 max_supported_tx_chains);
gaurank kathpalia23afef12019-04-04 12:39:59 +05304298 if (!max_supported_tx_chains)
4299 return;
gaurank kathpaliafa7ad0a2019-03-12 19:17:56 +05304300
4301 sme_modify_chains_in_mlme_cfg(mac_handle, max_supported_rx_chains,
4302 max_supported_tx_chains, vdev_op_mode,
4303 band);
4304 sme_modify_nss_in_mlme_cfg(mac_handle, max_supported_rx_nss,
4305 max_supported_tx_nss, vdev_op_mode, band);
4306}
4307
4308void
4309sme_update_nss_in_mlme_cfg(mac_handle_t mac_handle,
4310 uint8_t rx_nss, uint8_t tx_nss,
4311 enum QDF_OPMODE vdev_op_mode,
4312 enum nss_chains_band_info band)
gaurank kathpalia6c4b50c2019-02-28 14:07:48 +05304313{
4314 /*
4315 * If device mode is P2P-DEVICE, then we want P2P to come in that
4316 * particular nss, then we should change the nss of P@P-CLI, and GO
4317 * and we are unaware that for what will be the device mode after
4318 * negotiation yet.
4319 */
4320
4321 if (vdev_op_mode == QDF_P2P_DEVICE_MODE ||
4322 vdev_op_mode == QDF_P2P_CLIENT_MODE ||
4323 vdev_op_mode == QDF_P2P_GO_MODE) {
gaurank kathpaliafa7ad0a2019-03-12 19:17:56 +05304324 sme_modify_nss_in_mlme_cfg(mac_handle, rx_nss, tx_nss,
4325 QDF_P2P_CLIENT_MODE, band);
4326 sme_modify_nss_in_mlme_cfg(mac_handle, rx_nss, tx_nss,
4327 QDF_P2P_GO_MODE, band);
4328 sme_modify_nss_in_mlme_cfg(mac_handle, rx_nss, tx_nss,
4329 QDF_P2P_DEVICE_MODE, band);
gaurank kathpalia6c4b50c2019-02-28 14:07:48 +05304330 } else
gaurank kathpaliafa7ad0a2019-03-12 19:17:56 +05304331 sme_modify_nss_in_mlme_cfg(mac_handle, rx_nss, tx_nss,
4332 vdev_op_mode, band);
gaurank kathpalia6c4b50c2019-02-28 14:07:48 +05304333}
4334
gaurank kathpalia2b32de02018-10-24 18:31:14 +05304335QDF_STATUS
4336sme_nss_chains_update(mac_handle_t mac_handle,
4337 struct wlan_mlme_nss_chains *user_cfg,
4338 uint8_t vdev_id)
4339{
gaurank kathpalia24ed0f42018-11-13 15:37:49 +05304340 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
gaurank kathpalia2b32de02018-10-24 18:31:14 +05304341 QDF_STATUS status;
gaurank kathpaliadb87c0d2018-10-31 16:44:00 +05304342 struct wlan_mlme_nss_chains *dynamic_cfg;
gaurank kathpalia2b32de02018-10-24 18:31:14 +05304343 struct wlan_objmgr_vdev *vdev =
4344 wlan_objmgr_get_vdev_by_id_from_psoc(mac_ctx->psoc,
4345 vdev_id,
4346 WLAN_LEGACY_SME_ID);
4347 if (!vdev) {
4348 sme_err("Got NULL vdev obj, returning");
4349 return QDF_STATUS_E_FAILURE;
4350 }
gaurank kathpaliadb87c0d2018-10-31 16:44:00 +05304351
gaurank kathpalia748c7272018-10-24 22:05:15 +05304352 status = sme_acquire_global_lock(&mac_ctx->sme);
4353 if (QDF_IS_STATUS_ERROR(status))
4354 goto release_ref;
4355
gaurank kathpaliadb87c0d2018-10-31 16:44:00 +05304356 dynamic_cfg = mlme_get_dynamic_vdev_config(vdev);
4357 if (!dynamic_cfg) {
4358 sme_err("nss chain dynamic config NULL");
4359 status = QDF_STATUS_E_FAILURE;
4360 goto release_lock;
4361 }
4362
4363 status = sme_validate_nss_chains_config(vdev, user_cfg,
4364 dynamic_cfg);
gaurank kathpalia2b32de02018-10-24 18:31:14 +05304365 if (QDF_IS_STATUS_ERROR(status))
gaurank kathpalia748c7272018-10-24 22:05:15 +05304366 goto release_lock;
gaurank kathpaliadb87c0d2018-10-31 16:44:00 +05304367
4368 if (!qdf_mem_cmp(dynamic_cfg, user_cfg,
4369 sizeof(struct wlan_mlme_nss_chains))) {
4370 sme_debug("current config same as user config");
4371 status = QDF_STATUS_SUCCESS;
4372 goto release_lock;
4373 }
gaurank kathpalia748c7272018-10-24 22:05:15 +05304374 sme_debug("User params verified, sending to fw vdev id %d", vdev_id);
gaurank kathpalia2b32de02018-10-24 18:31:14 +05304375
gaurank kathpalia748c7272018-10-24 22:05:15 +05304376 status = wma_vdev_nss_chain_params_send(vdev->vdev_objmgr.vdev_id,
4377 user_cfg);
4378 if (QDF_IS_STATUS_ERROR(status)) {
4379 sme_err("params sent failed to fw vdev id %d", vdev_id);
4380 goto release_lock;
4381 }
4382
gaurank kathpaliab414bce2018-11-09 18:44:46 +05304383 *dynamic_cfg = *user_cfg;
gaurank kathpaliadb87c0d2018-10-31 16:44:00 +05304384
gaurank kathpalia748c7272018-10-24 22:05:15 +05304385release_lock:
4386 sme_release_global_lock(&mac_ctx->sme);
4387
4388release_ref:
gaurank kathpalia2b32de02018-10-24 18:31:14 +05304389 wlan_objmgr_vdev_release_ref(vdev, WLAN_LEGACY_SME_ID);
4390 return status;
4391}
4392
Arun Kumar Khandavalli4f6a5bd2019-10-23 16:01:15 +05304393struct wlan_objmgr_vdev *sme_vdev_create(mac_handle_t mac_handle,
4394 struct wlan_vdev_create_params *vdev_params)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004395{
Arif Hussainee677012017-01-26 17:50:13 -08004396 QDF_STATUS status = QDF_STATUS_E_INVAL;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08004397 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Arun Kumar Khandavalliadd284b2019-10-23 12:27:39 +05304398 uint8_t vdev_id;
Arun Kumar Khandavalli4f6a5bd2019-10-23 16:01:15 +05304399 struct wlan_objmgr_vdev *vdev;
4400 struct vdev_mlme_obj *vdev_mlme;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004401
Arun Kumar Khandavalli4f6a5bd2019-10-23 16:01:15 +05304402 sme_debug("addr:%pM opmode:%d", vdev_params->macaddr,
4403 vdev_params->opmode);
Arun Kumar Khandavallic13afcd2019-09-27 12:22:11 +05304404
Arun Kumar Khandavalli4f6a5bd2019-10-23 16:01:15 +05304405 vdev = wlan_objmgr_vdev_obj_create(mac_ctx->pdev, vdev_params);
4406 if (!vdev) {
4407 sme_err("Failed to create vdev object");
4408 return NULL;
4409 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004410
Arun Kumar Khandavalli4f6a5bd2019-10-23 16:01:15 +05304411 if (wlan_objmgr_vdev_try_get_ref(vdev, WLAN_LEGACY_SME_ID) !=
4412 QDF_STATUS_SUCCESS) {
4413 wlan_objmgr_vdev_obj_delete(vdev);
4414 return NULL;
4415 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004416
Arun Kumar Khandavalli4f6a5bd2019-10-23 16:01:15 +05304417 vdev_mlme = wlan_vdev_mlme_get_cmpt_obj(vdev);
4418 if (!vdev_mlme) {
4419 sme_err("Failed to get vdev mlme obj!");
4420 QDF_BUG(0);
4421 goto vdev_obj_del;
4422 }
Dustin Brownd28772b2017-03-17 14:16:07 -07004423
Arun Kumar Khandavalli4f6a5bd2019-10-23 16:01:15 +05304424 vdev_id = wlan_vdev_get_id(vdev);
4425 status = wma_post_vdev_create_setup(vdev);
4426 if (QDF_IS_STATUS_ERROR(status)) {
4427 sme_err("Failed to setup wma for vdev: %d", vdev_id);
4428 goto vdev_obj_del;
4429 }
4430
4431 status = csr_setup_vdev_session(vdev_mlme);
4432 if (QDF_IS_STATUS_ERROR(status)) {
4433 sme_err("Failed to setup CSR layer for vdev: %d", vdev_id);
4434 goto cleanup_wma;
4435 }
4436
4437 status = mlme_vdev_self_peer_create(vdev);
4438 if (QDF_IS_STATUS_ERROR(status)) {
4439 sme_err("Failed to create vdev selfpeer for vdev:%d", vdev_id);
4440 goto csr_cleanup_vdev_session;
4441 }
4442 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
4443 TRACE_CODE_SME_RX_HDD_OPEN_SESSION,
Arun Kumar Khandavallic13afcd2019-09-27 12:22:11 +05304444 vdev_id, 0));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004445
Arun Kumar Khandavalli4f6a5bd2019-10-23 16:01:15 +05304446 return vdev;
4447
4448csr_cleanup_vdev_session:
4449 csr_cleanup_vdev_session(mac_ctx, vdev_id);
4450cleanup_wma:
4451 wma_cleanup_vdev(vdev);
4452vdev_obj_del:
4453 wlan_objmgr_vdev_obj_delete(vdev);
4454 wlan_objmgr_vdev_release_ref(vdev, WLAN_LEGACY_SME_ID);
4455 return NULL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004456}
4457
Arun Kumar Khandavalli4f6a5bd2019-10-23 16:01:15 +05304458QDF_STATUS sme_vdev_delete(mac_handle_t mac_handle,
4459 struct wlan_objmgr_vdev *vdev)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004460{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304461 QDF_STATUS status;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08004462 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Arun Kumar Khandavalli4f6a5bd2019-10-23 16:01:15 +05304463 uint8_t vdev_id = wlan_vdev_get_id(vdev);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004464
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05304465 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Abhishek Amburecbef1442019-06-10 17:15:00 +05304466 TRACE_CODE_SME_RX_HDD_CLOSE_SESSION, vdev_id, 0));
Jeff Johnson01f2c232018-11-21 19:17:44 -08004467 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304468 if (QDF_IS_STATUS_SUCCESS(status)) {
Abhishek Amburecbef1442019-06-10 17:15:00 +05304469 status = csr_roam_vdev_delete(mac, vdev_id, false);
Jeff Johnson01f2c232018-11-21 19:17:44 -08004470 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004471 }
4472
Arun Kumar Khandavalli4f6a5bd2019-10-23 16:01:15 +05304473 /* Release the reference acquired during vdev create */
4474 wlan_objmgr_vdev_release_ref(vdev, WLAN_LEGACY_SME_ID);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004475 return status;
4476}
4477
Jianmin Zhu387e65c2019-10-18 20:21:57 +08004478void sme_cleanup_session(mac_handle_t mac_handle, uint8_t vdev_id)
4479{
4480 QDF_STATUS status;
4481 struct mac_context *mac = MAC_CONTEXT(mac_handle);
4482
4483 status = sme_acquire_global_lock(&mac->sme);
4484 if (QDF_IS_STATUS_ERROR(status))
4485 return;
Arun Kumar Khandavalli4f6a5bd2019-10-23 16:01:15 +05304486 csr_cleanup_vdev_session(mac, vdev_id);
Jianmin Zhu387e65c2019-10-18 20:21:57 +08004487 sme_release_global_lock(&mac->sme);
4488}
4489
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05304490/*
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05304491 * sme_change_mcc_beacon_interval() -
4492 * To update P2P-GO beaconInterval. This function should be called after
4493 * disassociating all the station is done
4494 * This is an asynchronous API.
4495 *
4496 * @sessionId: Session Identifier
4497 * Return QDF_STATUS SUCCESS
4498 * FAILURE or RESOURCES
4499 * The API finished and failed.
4500 */
Archana Ramachandran2eb7a612017-03-23 22:58:42 -07004501QDF_STATUS sme_change_mcc_beacon_interval(uint8_t sessionId)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004502{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304503 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08004504 struct mac_context *mac_ctx = sme_get_mac_context();
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004505
Krunal Soni3fa80e22018-01-09 14:16:02 -08004506 if (!mac_ctx) {
4507 sme_err("mac_ctx is NULL");
4508 return status;
4509 }
Archana Ramachandran2eb7a612017-03-23 22:58:42 -07004510 status = sme_acquire_global_lock(&mac_ctx->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304511 if (QDF_IS_STATUS_SUCCESS(status)) {
Archana Ramachandran2eb7a612017-03-23 22:58:42 -07004512 status = csr_send_chng_mcc_beacon_interval(mac_ctx,
4513 sessionId);
4514 sme_release_global_lock(&mac_ctx->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004515 }
4516 return status;
4517}
4518
4519/**
4520 * sme_set_host_offload(): API to set the host offload feature.
Jeff Johnsonb460dd72018-11-08 10:26:51 -08004521 * @mac_handle: The handle returned by mac_open.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004522 * @sessionId: Session Identifier
4523 * @request: Pointer to the offload request.
4524 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304525 * Return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004526 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08004527QDF_STATUS sme_set_host_offload(mac_handle_t mac_handle, uint8_t sessionId,
Jeff Johnsond6fda812019-02-06 21:54:23 -08004528 struct sir_host_offload_req *request)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004529{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08004530 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304531 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004532
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05304533 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004534 TRACE_CODE_SME_RX_HDD_SET_HOSTOFFLOAD, sessionId, 0));
Jeff Johnson01f2c232018-11-21 19:17:44 -08004535 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304536 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004537#ifdef WLAN_NS_OFFLOAD
4538 if (SIR_IPV6_NS_OFFLOAD == request->offloadType) {
Jeff Johnsonb460dd72018-11-08 10:26:51 -08004539 status = sme_set_ps_ns_offload(mac_handle, request,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004540 sessionId);
4541 } else
4542#endif /* WLAN_NS_OFFLOAD */
4543 {
Jeff Johnsonb460dd72018-11-08 10:26:51 -08004544 status = sme_set_ps_host_offload(mac_handle, request,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004545 sessionId);
4546 }
Jeff Johnson01f2c232018-11-21 19:17:44 -08004547 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004548 }
4549
4550 return status;
4551}
4552
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05304553/*
4554 * sme_set_keep_alive() -
4555 * API to set the Keep Alive feature.
4556 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08004557 * mac_handle - The handle returned by mac_open.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05304558 * request - Pointer to the Keep Alive request.
4559 * Return QDF_STATUS
4560 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08004561QDF_STATUS sme_set_keep_alive(mac_handle_t mac_handle, uint8_t session_id,
Jeff Johnson562ccad2019-02-06 22:10:24 -08004562 struct keep_alive_req *request)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004563{
Jeff Johnson562ccad2019-02-06 22:10:24 -08004564 struct keep_alive_req *request_buf;
Rajeev Kumar37d478b2017-04-17 16:59:28 -07004565 struct scheduler_msg msg = {0};
Jeff Johnson0a8786a2018-12-02 10:49:01 -08004566 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Jeff Johnson01f2c232018-11-21 19:17:44 -08004567 struct csr_roam_session *pSession = CSR_GET_SESSION(mac, session_id);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004568
Abhishek Singhe4a1f882017-08-10 17:59:44 +05304569 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004570 FL("WMA_SET_KEEP_ALIVE message"));
4571
Jeff Johnson038efe72019-03-18 13:39:31 -07004572 if (!pSession) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05304573 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004574 FL("Session not Found"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304575 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004576 }
Jeff Johnson562ccad2019-02-06 22:10:24 -08004577 request_buf = qdf_mem_malloc(sizeof(*request_buf));
Arif Hussain0ef77082018-10-10 16:42:53 -07004578 if (!request_buf)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304579 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004580
Anurag Chouhanc5548422016-02-24 18:33:27 +05304581 qdf_copy_macaddr(&request->bssid, &pSession->connectedProfile.bssid);
Jeff Johnson562ccad2019-02-06 22:10:24 -08004582 qdf_mem_copy(request_buf, request, sizeof(*request_buf));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004583
Abhishek Singhe4a1f882017-08-10 17:59:44 +05304584 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004585 "buff TP %d input TP %d ", request_buf->timePeriod,
4586 request->timePeriod);
4587 request_buf->sessionId = session_id;
4588
4589 msg.type = WMA_SET_KEEP_ALIVE;
4590 msg.reserved = 0;
4591 msg.bodyptr = request_buf;
Sreelakshmi Konamki6a065362016-05-31 16:05:01 +05304592 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
4593 session_id, msg.type));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304594 if (QDF_STATUS_SUCCESS !=
gaurank kathpalia36b0c582018-08-28 17:45:43 +05304595 scheduler_post_message(QDF_MODULE_ID_SME,
4596 QDF_MODULE_ID_WMA,
4597 QDF_MODULE_ID_WMA, &msg)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05304598 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05304599 "Not able to post WMA_SET_KEEP_ALIVE message to WMA");
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304600 qdf_mem_free(request_buf);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304601 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004602 }
4603
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304604 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004605}
4606
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05304607/*
4608 * sme_get_operation_channel() -
4609 * API to get current channel on which STA is parked his function gives
4610 * channel information only of infra station or IBSS station
4611 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08004612 * mac_handle, pointer to memory location and sessionId
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05304613 * Returns QDF_STATUS_SUCCESS
4614 * QDF_STATUS_E_FAILURE
4615 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08004616QDF_STATUS sme_get_operation_channel(mac_handle_t mac_handle,
Jianmin Zhubc841052019-10-28 17:24:39 +08004617 uint32_t *chan_freq,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004618 uint8_t sessionId)
4619{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08004620 struct mac_context *mac = MAC_CONTEXT(mac_handle);
gaurank kathpalia14e2f912017-08-31 14:51:45 +05304621 struct csr_roam_session *pSession;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004622
Jeff Johnson01f2c232018-11-21 19:17:44 -08004623 if (CSR_IS_SESSION_VALID(mac, sessionId)) {
4624 pSession = CSR_GET_SESSION(mac, sessionId);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004625
4626 if ((pSession->connectedProfile.BSSType ==
4627 eCSR_BSS_TYPE_INFRASTRUCTURE)
4628 || (pSession->connectedProfile.BSSType ==
4629 eCSR_BSS_TYPE_IBSS)
4630 || (pSession->connectedProfile.BSSType ==
4631 eCSR_BSS_TYPE_INFRA_AP)
4632 || (pSession->connectedProfile.BSSType ==
4633 eCSR_BSS_TYPE_START_IBSS)) {
Jianmin Zhubc841052019-10-28 17:24:39 +08004634 *chan_freq = pSession->connectedProfile.op_freq;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304635 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004636 }
4637 }
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304638 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004639} /* sme_get_operation_channel ends here */
4640
Abhishek Singh7996eb72015-12-30 17:24:02 +05304641/**
4642 * sme_register_mgmt_frame_ind_callback() - Register a callback for
4643 * management frame indication to PE.
4644 *
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -08004645 * @mac_handle: Opaque handle to the global MAC context
Abhishek Singh7996eb72015-12-30 17:24:02 +05304646 * @callback: callback pointer to be registered
4647 *
4648 * This function is used to register a callback for management
4649 * frame indication to PE.
4650 *
4651 * Return: Success if msg is posted to PE else Failure.
4652 */
Jeff Johnsonc7309062018-11-09 20:59:42 -08004653QDF_STATUS sme_register_mgmt_frame_ind_callback(mac_handle_t mac_handle,
Abhishek Singh7996eb72015-12-30 17:24:02 +05304654 sir_mgmt_frame_ind_callback callback)
4655{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08004656 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Abhishek Singh7996eb72015-12-30 17:24:02 +05304657 struct sir_sme_mgmt_frame_cb_req *msg;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304658 QDF_STATUS status = QDF_STATUS_SUCCESS;
Abhishek Singh7996eb72015-12-30 17:24:02 +05304659
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304660 if (QDF_STATUS_SUCCESS ==
Abhishek Singh7996eb72015-12-30 17:24:02 +05304661 sme_acquire_global_lock(&mac_ctx->sme)) {
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304662 msg = qdf_mem_malloc(sizeof(*msg));
Arif Hussain0ef77082018-10-10 16:42:53 -07004663 if (!msg) {
Abhishek Singh7996eb72015-12-30 17:24:02 +05304664 sme_release_global_lock(&mac_ctx->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304665 return QDF_STATUS_E_NOMEM;
Abhishek Singh7996eb72015-12-30 17:24:02 +05304666 }
Abhishek Singh7996eb72015-12-30 17:24:02 +05304667 msg->message_type = eWNI_SME_REGISTER_MGMT_FRAME_CB;
4668 msg->length = sizeof(*msg);
4669
4670 msg->callback = callback;
Rajeev Kumard138ac52017-01-30 18:38:37 -08004671 status = umac_send_mb_message_to_mac(msg);
Abhishek Singh7996eb72015-12-30 17:24:02 +05304672 sme_release_global_lock(&mac_ctx->sme);
4673 return status;
4674 }
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304675 return QDF_STATUS_E_FAILURE;
Abhishek Singh7996eb72015-12-30 17:24:02 +05304676}
4677
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05304678/*
4679 * sme_RegisterMgtFrame() -
Jeff Johnson698eacd2018-05-12 17:00:03 -07004680 * To register management frame of specified type and subtype.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05304681 *
4682 * frameType - type of the frame that needs to be passed to HDD.
4683 * matchData - data which needs to be matched before passing frame
4684 * to HDD.
4685 * matchDataLen - Length of matched data.
4686 * Return QDF_STATUS
4687 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08004688QDF_STATUS sme_register_mgmt_frame(mac_handle_t mac_handle, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004689 uint16_t frameType, uint8_t *matchData,
4690 uint16_t matchLen)
4691{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304692 QDF_STATUS status = QDF_STATUS_SUCCESS;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08004693 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004694
Jeff Johnson01f2c232018-11-21 19:17:44 -08004695 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304696 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson78f7a182019-02-01 22:45:41 -08004697 struct register_mgmt_frame *pMsg;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004698 uint16_t len;
Jeff Johnson01f2c232018-11-21 19:17:44 -08004699 struct csr_roam_session *pSession = CSR_GET_SESSION(mac,
gaurank kathpalia14e2f912017-08-31 14:51:45 +05304700 sessionId);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004701
4702 if (!CSR_IS_SESSION_ANY(sessionId) && !pSession) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07004703 sme_err("Session %d not found", sessionId);
Jeff Johnson01f2c232018-11-21 19:17:44 -08004704 sme_release_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304705 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004706 }
4707
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05304708 if (!CSR_IS_SESSION_ANY(sessionId) &&
4709 !pSession->sessionActive) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05304710 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004711 "%s Invalid Sessionid", __func__);
Jeff Johnson01f2c232018-11-21 19:17:44 -08004712 sme_release_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304713 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004714 }
4715
Jeff Johnson78f7a182019-02-01 22:45:41 -08004716 len = sizeof(*pMsg) + matchLen;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004717
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304718 pMsg = qdf_mem_malloc(len);
Jeff Johnson038efe72019-03-18 13:39:31 -07004719 if (!pMsg)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304720 status = QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004721 else {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004722 pMsg->messageType = eWNI_SME_REGISTER_MGMT_FRAME_REQ;
4723 pMsg->length = len;
4724 pMsg->sessionId = sessionId;
4725 pMsg->registerFrame = true;
4726 pMsg->frameType = frameType;
4727 pMsg->matchLen = matchLen;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304728 qdf_mem_copy(pMsg->matchData, matchData, matchLen);
Rajeev Kumard138ac52017-01-30 18:38:37 -08004729 status = umac_send_mb_message_to_mac(pMsg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004730 }
Jeff Johnson01f2c232018-11-21 19:17:44 -08004731 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004732 }
4733 return status;
4734}
4735
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05304736/*
4737 * sme_DeregisterMgtFrame() -
Jeff Johnson698eacd2018-05-12 17:00:03 -07004738 * To De-register management frame of specified type and subtype.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05304739 *
4740 * frameType - type of the frame that needs to be passed to HDD.
4741 * matchData - data which needs to be matched before passing frame
4742 * to HDD.
4743 * matchDataLen - Length of matched data.
4744 * Return QDF_STATUS
4745 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08004746QDF_STATUS sme_deregister_mgmt_frame(mac_handle_t mac_handle, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004747 uint16_t frameType, uint8_t *matchData,
4748 uint16_t matchLen)
4749{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304750 QDF_STATUS status = QDF_STATUS_SUCCESS;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08004751 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004752
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05304753 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004754 TRACE_CODE_SME_RX_HDD_DEREGISTER_MGMTFR, sessionId,
4755 0));
Jeff Johnson01f2c232018-11-21 19:17:44 -08004756 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304757 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson78f7a182019-02-01 22:45:41 -08004758 struct register_mgmt_frame *pMsg;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004759 uint16_t len;
Jeff Johnson01f2c232018-11-21 19:17:44 -08004760 struct csr_roam_session *pSession = CSR_GET_SESSION(mac,
gaurank kathpalia14e2f912017-08-31 14:51:45 +05304761 sessionId);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004762
4763 if (!CSR_IS_SESSION_ANY(sessionId) && !pSession) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07004764 sme_err("Session %d not found", sessionId);
Jeff Johnson01f2c232018-11-21 19:17:44 -08004765 sme_release_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304766 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004767 }
4768
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05304769 if (!CSR_IS_SESSION_ANY(sessionId) &&
4770 !pSession->sessionActive) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05304771 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004772 "%s Invalid Sessionid", __func__);
Jeff Johnson01f2c232018-11-21 19:17:44 -08004773 sme_release_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304774 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004775 }
4776
Jeff Johnson78f7a182019-02-01 22:45:41 -08004777 len = sizeof(*pMsg) + matchLen;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004778
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304779 pMsg = qdf_mem_malloc(len);
Jeff Johnson038efe72019-03-18 13:39:31 -07004780 if (!pMsg)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304781 status = QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004782 else {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004783 pMsg->messageType = eWNI_SME_REGISTER_MGMT_FRAME_REQ;
4784 pMsg->length = len;
4785 pMsg->registerFrame = false;
4786 pMsg->frameType = frameType;
4787 pMsg->matchLen = matchLen;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304788 qdf_mem_copy(pMsg->matchData, matchData, matchLen);
Rajeev Kumard138ac52017-01-30 18:38:37 -08004789 status = umac_send_mb_message_to_mac(pMsg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004790 }
Jeff Johnson01f2c232018-11-21 19:17:44 -08004791 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004792 }
4793 return status;
4794}
4795
Padma, Santhosh Kumar22c462c2018-01-16 17:56:44 +05304796/**
4797 * sme_prepare_mgmt_tx() - Prepares mgmt frame
Jeff Johnsonc7309062018-11-09 20:59:42 -08004798 * @mac_handle: The handle returned by mac_open
Abhishek Singh345be412019-11-19 10:59:29 +05304799 * @vdev_id: vdev id
Padma, Santhosh Kumar22c462c2018-01-16 17:56:44 +05304800 * @buf: pointer to frame
4801 * @len: frame length
4802 *
4803 * Return: QDF_STATUS
4804 */
Jeff Johnsonc7309062018-11-09 20:59:42 -08004805static QDF_STATUS sme_prepare_mgmt_tx(mac_handle_t mac_handle,
Abhishek Singh345be412019-11-19 10:59:29 +05304806 uint8_t vdev_id,
Jeff Johnsonc7309062018-11-09 20:59:42 -08004807 const uint8_t *buf, uint32_t len)
Padma, Santhosh Kumar22c462c2018-01-16 17:56:44 +05304808{
4809 QDF_STATUS status = QDF_STATUS_SUCCESS;
4810 struct sir_mgmt_msg *msg;
4811 uint16_t msg_len;
4812 struct scheduler_msg sch_msg = {0};
4813
4814 sme_debug("prepares auth frame");
4815
4816 msg_len = sizeof(*msg) + len;
4817 msg = qdf_mem_malloc(msg_len);
Jeff Johnson038efe72019-03-18 13:39:31 -07004818 if (!msg) {
Padma, Santhosh Kumar22c462c2018-01-16 17:56:44 +05304819 status = QDF_STATUS_E_NOMEM;
4820 } else {
4821 msg->type = eWNI_SME_SEND_MGMT_FRAME_TX;
4822 msg->msg_len = msg_len;
Abhishek Singh345be412019-11-19 10:59:29 +05304823 msg->vdev_id = vdev_id;
Padma, Santhosh Kumar22c462c2018-01-16 17:56:44 +05304824 msg->data = (uint8_t *)msg + sizeof(*msg);
4825 qdf_mem_copy(msg->data, buf, len);
4826
4827 sch_msg.type = eWNI_SME_SEND_MGMT_FRAME_TX;
4828 sch_msg.bodyptr = msg;
gaurank kathpalia36b0c582018-08-28 17:45:43 +05304829 status = scheduler_post_message(QDF_MODULE_ID_SME,
4830 QDF_MODULE_ID_PE,
4831 QDF_MODULE_ID_PE, &sch_msg);
Padma, Santhosh Kumar22c462c2018-01-16 17:56:44 +05304832 }
4833 return status;
4834}
4835
Jeff Johnsonc7309062018-11-09 20:59:42 -08004836QDF_STATUS sme_send_mgmt_tx(mac_handle_t mac_handle, uint8_t session_id,
4837 const uint8_t *buf, uint32_t len)
Padma, Santhosh Kumar22c462c2018-01-16 17:56:44 +05304838{
4839 QDF_STATUS status = QDF_STATUS_SUCCESS;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08004840 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Padma, Santhosh Kumar22c462c2018-01-16 17:56:44 +05304841
Padma, Santhosh Kumar22c462c2018-01-16 17:56:44 +05304842 status = sme_acquire_global_lock(&mac->sme);
4843 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnsonc7309062018-11-09 20:59:42 -08004844 status = sme_prepare_mgmt_tx(mac_handle, session_id, buf, len);
Padma, Santhosh Kumar22c462c2018-01-16 17:56:44 +05304845 sme_release_global_lock(&mac->sme);
4846 }
4847
4848 return status;
4849}
4850
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004851#ifdef WLAN_FEATURE_EXTWOW_SUPPORT
Krishna Kumaar Natarajand9131902015-10-19 11:52:47 -07004852/**
4853 * sme_configure_ext_wow() - configure Extr WoW
Jeff Johnsonb460dd72018-11-08 10:26:51 -08004854 * @mac_handle - The handle returned by mac_open.
Krishna Kumaar Natarajand9131902015-10-19 11:52:47 -07004855 * @wlanExtParams - Depicts the wlan Ext params.
4856 * @callback - ext_wow callback to be registered.
4857 * @callback_context - ext_wow callback context
4858 *
4859 * SME will pass this request to lower mac to configure Extr WoW
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304860 * Return: QDF_STATUS
Krishna Kumaar Natarajand9131902015-10-19 11:52:47 -07004861 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08004862QDF_STATUS sme_configure_ext_wow(mac_handle_t mac_handle,
4863 tpSirExtWoWParams wlanExtParams,
4864 csr_readyToExtWoWCallback callback,
4865 void *callback_context)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004866{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304867 QDF_STATUS status = QDF_STATUS_SUCCESS;
4868 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08004869 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Rajeev Kumar37d478b2017-04-17 16:59:28 -07004870 struct scheduler_msg message = {0};
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304871 tpSirExtWoWParams MsgPtr = qdf_mem_malloc(sizeof(*MsgPtr));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004872
4873 if (!MsgPtr)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304874 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004875
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05304876 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004877 TRACE_CODE_SME_RX_HDD_CONFIG_EXTWOW, NO_SESSION, 0));
4878
Jeff Johnson01f2c232018-11-21 19:17:44 -08004879 mac->readyToExtWoWCallback = callback;
4880 mac->readyToExtWoWContext = callback_context;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004881
Jeff Johnson01f2c232018-11-21 19:17:44 -08004882 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304883 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004884
4885 /* serialize the req through MC thread */
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304886 qdf_mem_copy(MsgPtr, wlanExtParams, sizeof(*MsgPtr));
Rajeev Kumar8eaedf62017-01-21 11:03:13 -08004887 message.bodyptr = MsgPtr;
4888 message.type = WMA_WLAN_EXT_WOW;
gaurank kathpalia36b0c582018-08-28 17:45:43 +05304889 qdf_status = scheduler_post_message(QDF_MODULE_ID_SME,
4890 QDF_MODULE_ID_WMA,
4891 QDF_MODULE_ID_WMA,
4892 &message);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304893 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08004894 mac->readyToExtWoWCallback = NULL;
4895 mac->readyToExtWoWContext = NULL;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304896 qdf_mem_free(MsgPtr);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304897 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004898 }
Jeff Johnson01f2c232018-11-21 19:17:44 -08004899 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004900 } else {
Jeff Johnson01f2c232018-11-21 19:17:44 -08004901 mac->readyToExtWoWCallback = NULL;
4902 mac->readyToExtWoWContext = NULL;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304903 qdf_mem_free(MsgPtr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004904 }
4905
4906 return status;
4907}
4908
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05304909/*
4910 * sme_configure_app_type1_params() -
4911 * SME will pass this request to lower mac to configure Indoor WoW parameters.
4912 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08004913 * mac_handle - The handle returned by mac_open.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05304914 * wlanAppType1Params- Depicts the wlan App Type 1(Indoor) params
4915 * Return QDF_STATUS
4916 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08004917QDF_STATUS sme_configure_app_type1_params(mac_handle_t mac_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004918 tpSirAppType1Params wlanAppType1Params)
4919{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304920 QDF_STATUS status = QDF_STATUS_SUCCESS;
4921 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08004922 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Rajeev Kumar37d478b2017-04-17 16:59:28 -07004923 struct scheduler_msg message = {0};
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304924 tpSirAppType1Params MsgPtr = qdf_mem_malloc(sizeof(*MsgPtr));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004925
4926 if (!MsgPtr)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304927 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004928
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05304929 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004930 TRACE_CODE_SME_RX_HDD_CONFIG_APP_TYPE1, NO_SESSION,
4931 0));
4932
Jeff Johnson01f2c232018-11-21 19:17:44 -08004933 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304934 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004935 /* serialize the req through MC thread */
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304936 qdf_mem_copy(MsgPtr, wlanAppType1Params, sizeof(*MsgPtr));
Rajeev Kumar8eaedf62017-01-21 11:03:13 -08004937 message.bodyptr = MsgPtr;
4938 message.type = WMA_WLAN_SET_APP_TYPE1_PARAMS;
gaurank kathpalia36b0c582018-08-28 17:45:43 +05304939 qdf_status = scheduler_post_message(QDF_MODULE_ID_SME,
4940 QDF_MODULE_ID_WMA,
4941 QDF_MODULE_ID_WMA,
4942 &message);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304943 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304944 qdf_mem_free(MsgPtr);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304945 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004946 }
Jeff Johnson01f2c232018-11-21 19:17:44 -08004947 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004948 } else {
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304949 qdf_mem_free(MsgPtr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004950 }
4951
4952 return status;
4953}
4954
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05304955/*
4956 * sme_configure_app_type2_params() -
4957 * SME will pass this request to lower mac to configure Indoor WoW parameters.
4958 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08004959 * mac_handle - The handle returned by mac_open.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05304960 * wlanAppType2Params- Depicts the wlan App Type 2 (Outdoor) params
4961 * Return QDF_STATUS
4962 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08004963QDF_STATUS sme_configure_app_type2_params(mac_handle_t mac_handle,
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05304964 tpSirAppType2Params wlanAppType2Params)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004965{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304966 QDF_STATUS status = QDF_STATUS_SUCCESS;
4967 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08004968 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Rajeev Kumar37d478b2017-04-17 16:59:28 -07004969 struct scheduler_msg message = {0};
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304970 tpSirAppType2Params MsgPtr = qdf_mem_malloc(sizeof(*MsgPtr));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004971
4972 if (!MsgPtr)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304973 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004974
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05304975 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004976 TRACE_CODE_SME_RX_HDD_CONFIG_APP_TYPE2, NO_SESSION,
4977 0));
4978
Jeff Johnson01f2c232018-11-21 19:17:44 -08004979 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304980 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004981 /* serialize the req through MC thread */
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304982 qdf_mem_copy(MsgPtr, wlanAppType2Params, sizeof(*MsgPtr));
Rajeev Kumar8eaedf62017-01-21 11:03:13 -08004983 message.bodyptr = MsgPtr;
4984 message.type = WMA_WLAN_SET_APP_TYPE2_PARAMS;
gaurank kathpalia36b0c582018-08-28 17:45:43 +05304985 qdf_status = scheduler_post_message(QDF_MODULE_ID_SME,
4986 QDF_MODULE_ID_WMA,
4987 QDF_MODULE_ID_WMA,
4988 &message);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304989 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304990 qdf_mem_free(MsgPtr);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304991 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004992 }
Jeff Johnson01f2c232018-11-21 19:17:44 -08004993 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004994 } else {
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304995 qdf_mem_free(MsgPtr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004996 }
4997
4998 return status;
4999}
5000#endif
5001
Kiran Kumar Lokere229212a2019-08-20 19:03:30 -07005002uint32_t sme_get_beaconing_concurrent_operation_channel(mac_handle_t mac_handle,
5003 uint8_t vdev_id_to_skip)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005004{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305005 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08005006 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Kiran Kumar Lokere229212a2019-08-20 19:03:30 -07005007 uint32_t chan_freq = 0;
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05305008
Jeff Johnson01f2c232018-11-21 19:17:44 -08005009 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305010 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005011
Kiran Kumar Lokere229212a2019-08-20 19:03:30 -07005012 chan_freq = csr_get_beaconing_concurrent_channel(mac,
Abhishek Singhb1954c62019-02-14 10:18:28 +05305013 vdev_id_to_skip);
Kiran Kumar Lokere229212a2019-08-20 19:03:30 -07005014 sme_info("Other Concurrent Chan_freq: %d skipped vdev_id %d",
5015 chan_freq, vdev_id_to_skip);
Jeff Johnson01f2c232018-11-21 19:17:44 -08005016 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005017 }
5018
Kiran Kumar Lokere229212a2019-08-20 19:03:30 -07005019 return chan_freq;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005020}
5021
5022#ifdef FEATURE_WLAN_MCC_TO_SCC_SWITCH
Jeff Johnsonb460dd72018-11-08 10:26:51 -08005023uint16_t sme_check_concurrent_channel_overlap(mac_handle_t mac_handle,
Kiran Kumar Lokere229212a2019-08-20 19:03:30 -07005024 uint16_t sap_ch_freq,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005025 eCsrPhyMode sapPhyMode,
5026 uint8_t cc_switch_mode)
5027{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305028 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08005029 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Liangwei Dong10054b92019-11-29 18:44:14 +08005030 uint16_t intf_ch_freq = 0;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005031
Jeff Johnson01f2c232018-11-21 19:17:44 -08005032 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305033 if (QDF_IS_STATUS_SUCCESS(status)) {
Liangwei Dong10054b92019-11-29 18:44:14 +08005034 intf_ch_freq = csr_check_concurrent_channel_overlap(
5035 mac, sap_ch_freq, sapPhyMode, cc_switch_mode);
Jeff Johnson01f2c232018-11-21 19:17:44 -08005036 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005037 }
5038
Liangwei Dong10054b92019-11-29 18:44:14 +08005039 return intf_ch_freq;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005040}
5041#endif
5042
Arun Khandavalli4b55da72016-07-19 19:55:01 +05305043/**
Manikandan Mohandcc21ba2016-03-15 14:31:56 -07005044 * sme_set_tsfcb() - Set callback for TSF capture
Jeff Johnsonb460dd72018-11-08 10:26:51 -08005045 * @mac_handle: Handler return by mac_open
Manikandan Mohandcc21ba2016-03-15 14:31:56 -07005046 * @cb_fn: Callback function pointer
5047 * @db_ctx: Callback data
5048 *
5049 * Return: QDF_STATUS
5050 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08005051QDF_STATUS sme_set_tsfcb(mac_handle_t mac_handle,
Manikandan Mohandcc21ba2016-03-15 14:31:56 -07005052 int (*cb_fn)(void *cb_ctx, struct stsf *ptsf), void *cb_ctx)
5053{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08005054 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Manikandan Mohandcc21ba2016-03-15 14:31:56 -07005055 QDF_STATUS status;
5056
Manikandan Mohan976e7562016-03-15 16:33:31 -07005057 status = sme_acquire_global_lock(&mac->sme);
Manikandan Mohandcc21ba2016-03-15 14:31:56 -07005058 if (QDF_IS_STATUS_SUCCESS(status)) {
Manikandan Mohan976e7562016-03-15 16:33:31 -07005059 mac->sme.get_tsf_cb = cb_fn;
5060 mac->sme.get_tsf_cxt = cb_ctx;
5061 sme_release_global_lock(&mac->sme);
Manikandan Mohandcc21ba2016-03-15 14:31:56 -07005062 }
5063 return status;
5064}
5065
Arun Khandavalli4b55da72016-07-19 19:55:01 +05305066/**
5067 * sme_reset_tsfcb() - Reset callback for TSF capture
Jeff Johnsonb460dd72018-11-08 10:26:51 -08005068 * @mac_handle: Handler return by mac_open
Arun Khandavalli4b55da72016-07-19 19:55:01 +05305069 *
5070 * This function reset the tsf capture callback to SME
5071 *
5072 * Return: QDF_STATUS
5073 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08005074QDF_STATUS sme_reset_tsfcb(mac_handle_t mac_handle)
Arun Khandavalli4b55da72016-07-19 19:55:01 +05305075{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08005076 struct mac_context *mac;
Arun Khandavalli4b55da72016-07-19 19:55:01 +05305077 QDF_STATUS status;
5078
Jeff Johnsonb460dd72018-11-08 10:26:51 -08005079 if (!mac_handle) {
Arun Khandavalli4b55da72016-07-19 19:55:01 +05305080 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Jeff Johnsonb460dd72018-11-08 10:26:51 -08005081 FL("mac_handle is not valid"));
Arun Khandavalli4b55da72016-07-19 19:55:01 +05305082 return QDF_STATUS_E_INVAL;
5083 }
Jeff Johnsona0619e42018-11-28 17:43:00 -08005084 mac = MAC_CONTEXT(mac_handle);
Arun Khandavalli4b55da72016-07-19 19:55:01 +05305085
5086 status = sme_acquire_global_lock(&mac->sme);
5087 if (QDF_IS_STATUS_SUCCESS(status)) {
5088 mac->sme.get_tsf_cb = NULL;
5089 mac->sme.get_tsf_cxt = NULL;
5090 sme_release_global_lock(&mac->sme);
5091 }
5092 return status;
5093}
5094
yuanl2746f072018-09-21 19:19:16 +08005095#if defined(WLAN_FEATURE_TSF) && !defined(WLAN_FEATURE_TSF_PLUS_NOIRQ)
Manikandan Mohan976e7562016-03-15 16:33:31 -07005096/*
yuanl2746f072018-09-21 19:19:16 +08005097 * sme_set_tsf_gpio() - set gpio pin that be toggled when capture tsf
Jeff Johnsonb460dd72018-11-08 10:26:51 -08005098 * @mac_handle: Handler return by mac_open
Manikandan Mohan976e7562016-03-15 16:33:31 -07005099 * @pinvalue: gpio pin id
5100 *
5101 * Return: QDF_STATUS
5102 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08005103QDF_STATUS sme_set_tsf_gpio(mac_handle_t mac_handle, uint32_t pinvalue)
Manikandan Mohan976e7562016-03-15 16:33:31 -07005104{
5105 QDF_STATUS status;
Rajeev Kumar8eaedf62017-01-21 11:03:13 -08005106 struct scheduler_msg tsf_msg = {0};
Jeff Johnson0a8786a2018-12-02 10:49:01 -08005107 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Manikandan Mohan976e7562016-03-15 16:33:31 -07005108
5109 status = sme_acquire_global_lock(&mac->sme);
5110 if (QDF_IS_STATUS_SUCCESS(status)) {
5111 tsf_msg.type = WMA_TSF_GPIO_PIN;
5112 tsf_msg.reserved = 0;
5113 tsf_msg.bodyval = pinvalue;
5114
gaurank kathpalia36b0c582018-08-28 17:45:43 +05305115 status = scheduler_post_message(QDF_MODULE_ID_SME,
5116 QDF_MODULE_ID_WMA,
5117 QDF_MODULE_ID_WMA, &tsf_msg);
Manikandan Mohan976e7562016-03-15 16:33:31 -07005118 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07005119 sme_err("Unable to post WMA_TSF_GPIO_PIN");
Manikandan Mohan976e7562016-03-15 16:33:31 -07005120 status = QDF_STATUS_E_FAILURE;
5121 }
5122 sme_release_global_lock(&mac->sme);
5123 }
5124 return status;
5125}
5126#endif
5127
Will Huanga6af7e12019-10-31 17:40:06 +08005128QDF_STATUS sme_get_cfg_valid_channels(uint32_t *valid_ch_freq, uint32_t *len)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005129{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305130 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08005131 struct mac_context *mac_ctx = sme_get_mac_context();
gaurank kathpalia88f78ec2019-09-04 20:18:02 +05305132 uint32_t *valid_ch_freq_list;
5133 uint32_t i;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005134
Jeff Johnson038efe72019-03-18 13:39:31 -07005135 if (!mac_ctx) {
Tushnim Bhattacharyya0c4ad2d2017-03-09 15:59:03 -08005136 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
5137 FL("Invalid MAC context"));
5138 return QDF_STATUS_E_FAILURE;
5139 }
5140
gaurank kathpalia88f78ec2019-09-04 20:18:02 +05305141 valid_ch_freq_list = qdf_mem_malloc(CFG_VALID_CHANNEL_LIST_LEN *
5142 sizeof(uint32_t));
5143 if (!valid_ch_freq_list)
5144 return QDF_STATUS_E_NOMEM;
5145
Tushnim Bhattacharyya0c4ad2d2017-03-09 15:59:03 -08005146 status = sme_acquire_global_lock(&mac_ctx->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305147 if (QDF_IS_STATUS_SUCCESS(status)) {
Tushnim Bhattacharyya0c4ad2d2017-03-09 15:59:03 -08005148 status = csr_get_cfg_valid_channels(mac_ctx,
gaurank kathpalia88f78ec2019-09-04 20:18:02 +05305149 valid_ch_freq_list, len);
Tushnim Bhattacharyya0c4ad2d2017-03-09 15:59:03 -08005150 sme_release_global_lock(&mac_ctx->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005151 }
5152
gaurank kathpalia88f78ec2019-09-04 20:18:02 +05305153 for (i = 0; i < *len; i++)
Will Huanga6af7e12019-10-31 17:40:06 +08005154 valid_ch_freq[i] = valid_ch_freq_list[i];
gaurank kathpalia88f78ec2019-09-04 20:18:02 +05305155
5156 qdf_mem_free(valid_ch_freq_list);
5157
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005158 return status;
5159}
5160
Amar Singhalf0a94ad2017-11-27 15:20:00 -08005161static uint8_t *sme_reg_hint_to_str(const enum country_src src)
5162{
5163 switch (src) {
5164 case SOURCE_CORE:
5165 return "WORLD MODE";
5166
5167 case SOURCE_DRIVER:
5168 return "BDF file";
5169
5170 case SOURCE_USERSPACE:
5171 return "user-space";
5172
5173 case SOURCE_11D:
5174 return "802.11D IEs in beacons";
5175
5176 default:
5177 return "unknown";
5178 }
5179}
5180
Jeff Johnsonb460dd72018-11-08 10:26:51 -08005181void sme_set_cc_src(mac_handle_t mac_handle, enum country_src cc_src)
Amar Singhal6edf9732016-11-20 21:43:40 -08005182{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08005183 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Amar Singhal6edf9732016-11-20 21:43:40 -08005184
5185 mac_ctx->reg_hint_src = cc_src;
Amar Singhalf0a94ad2017-11-27 15:20:00 -08005186
5187 sme_debug("Country source is %s",
5188 sme_reg_hint_to_str(cc_src));
Amar Singhal6edf9732016-11-20 21:43:40 -08005189}
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005190
5191/**
Amar Singhal7f1f3ec2015-10-13 17:14:08 -07005192 * sme_handle_generic_change_country_code() - handles country ch req
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005193 * @mac_ctx: mac global context
5194 * @msg: request msg packet
5195 *
5196 * If Supplicant country code is priority than 11d is disabled.
5197 * If 11D is enabled, we update the country code after every scan.
5198 * Hence when Supplicant country code is priority, we don't need 11D info.
5199 * Country code from Supplicant is set as current country code.
5200 *
5201 * Return: status of operation
5202 */
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05305203static QDF_STATUS
Jeff Johnson0a8786a2018-12-02 10:49:01 -08005204sme_handle_generic_change_country_code(struct mac_context *mac_ctx,
Pragaspathi Thilagaraj469495b2019-05-30 00:18:31 +05305205 void *msg_buf)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005206{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305207 QDF_STATUS status = QDF_STATUS_SUCCESS;
Amar Singhal7f1f3ec2015-10-13 17:14:08 -07005208 v_REGDOMAIN_t reg_domain_id = 0;
Amar Singhalb6d0dc42016-10-19 09:45:05 -07005209 bool user_ctry_priority =
Bala Venkatesh46e29032018-11-14 18:24:55 +05305210 mac_ctx->mlme_cfg->sap_cfg.country_code_priority;
Pragaspathi Thilagaraj469495b2019-05-30 00:18:31 +05305211 tAniGenericChangeCountryCodeReq *msg = msg_buf;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005212
Amar Singhal6edf9732016-11-20 21:43:40 -08005213 if (SOURCE_11D != mac_ctx->reg_hint_src) {
5214 if (SOURCE_DRIVER != mac_ctx->reg_hint_src) {
5215 if (user_ctry_priority)
Abhinav Kumard4d6eb72018-12-04 20:30:37 +05305216 mac_ctx->mlme_cfg->gen.enabled_11d = false;
Amar Singhal6edf9732016-11-20 21:43:40 -08005217 else {
Abhinav Kumard4d6eb72018-12-04 20:30:37 +05305218 if (mac_ctx->mlme_cfg->gen.enabled_11d &&
5219 mac_ctx->scan.countryCode11d[0] != 0) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005220
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07005221 sme_debug("restore 11d");
Amar Singhalb6d0dc42016-10-19 09:45:05 -07005222
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05305223 status =
5224 csr_get_regulatory_domain_for_country(
Amar Singhal6edf9732016-11-20 21:43:40 -08005225 mac_ctx,
5226 mac_ctx->scan.countryCode11d,
5227 &reg_domain_id,
5228 SOURCE_11D);
5229 return QDF_STATUS_E_FAILURE;
5230 }
Amar Singhalb6d0dc42016-10-19 09:45:05 -07005231 }
5232 }
5233 } else {
5234 /* if kernel gets invalid country code; it
5235 * resets the country code to world
5236 */
5237 if (('0' != msg->countryCode[0]) ||
5238 ('0' != msg->countryCode[1]))
5239 qdf_mem_copy(mac_ctx->scan.countryCode11d,
5240 msg->countryCode,
Wu Gaoaa155142019-01-14 15:09:26 +08005241 CFG_COUNTRY_CODE_LEN);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005242 }
Amar Singhal7f1f3ec2015-10-13 17:14:08 -07005243
Amar Singhalb6d0dc42016-10-19 09:45:05 -07005244 qdf_mem_copy(mac_ctx->scan.countryCodeCurrent,
5245 msg->countryCode,
Wu Gaoaa155142019-01-14 15:09:26 +08005246 CFG_COUNTRY_CODE_LEN);
Amar Singhal9d5b1fe2016-10-16 20:16:05 -07005247
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005248 /* get the channels based on new cc */
5249 status = csr_get_channel_and_power_list(mac_ctx);
5250
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305251 if (status != QDF_STATUS_SUCCESS) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07005252 sme_err("fail to get Channels");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005253 return status;
5254 }
Amar Singhalb6d0dc42016-10-19 09:45:05 -07005255
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005256 /* reset info based on new cc, and we are done */
5257 csr_apply_channel_power_info_wrapper(mac_ctx);
5258
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005259 csr_scan_filter_results(mac_ctx);
Amar Singhalb6d0dc42016-10-19 09:45:05 -07005260
5261 /* scans after the country is set by User hints or
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005262 * Country IE
5263 */
5264 mac_ctx->scan.curScanType = eSIR_ACTIVE_SCAN;
Amar Singhal9d5b1fe2016-10-16 20:16:05 -07005265
Amar Singhal6edf9732016-11-20 21:43:40 -08005266 mac_ctx->reg_hint_src = SOURCE_UNKNOWN;
5267
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005268 sme_disconnect_connected_sessions(mac_ctx);
Amar Singhalb6d0dc42016-10-19 09:45:05 -07005269
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305270 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005271}
5272
Jeff Johnsonc7309062018-11-09 20:59:42 -08005273QDF_STATUS sme_update_channel_list(mac_handle_t mac_handle)
Mukul Sharmaecf8e092017-12-19 22:36:31 +05305274{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08005275 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Jeff Johnson330c0bf2018-06-01 15:13:12 -07005276 QDF_STATUS status;
Mukul Sharmaecf8e092017-12-19 22:36:31 +05305277
5278 status = sme_acquire_global_lock(&mac_ctx->sme);
5279 if (QDF_IS_STATUS_SUCCESS(status)) {
5280 /* Update umac channel (enable/disable) from cds channels */
5281 status = csr_get_channel_and_power_list(mac_ctx);
5282 if (status != QDF_STATUS_SUCCESS) {
5283 sme_err("fail to get Channels");
5284 sme_release_global_lock(&mac_ctx->sme);
5285 return status;
5286 }
5287
5288 csr_apply_channel_power_info_wrapper(mac_ctx);
5289 csr_scan_filter_results(mac_ctx);
5290 sme_disconnect_connected_sessions(mac_ctx);
5291 sme_release_global_lock(&mac_ctx->sme);
5292 }
5293
5294 return status;
5295}
5296
bingsb1444b32019-10-29 11:21:01 +08005297/**
5298 * sme_search_in_base_ch_freq_lst() - is given ch_freq in base ch freq
5299 * @mac_ctx: mac global context
5300 * @chan_freq: current channel freq
5301 *
5302 * Return: true if given ch_freq is in base ch freq
5303 */
5304static bool sme_search_in_base_ch_freq_lst(
5305 struct mac_context *mac_ctx, uint32_t chan_freq)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005306{
5307 uint8_t i;
gaurank kathpalia14e2f912017-08-31 14:51:45 +05305308 struct csr_channel *ch_lst_info;
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05305309
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005310 ch_lst_info = &mac_ctx->scan.base_channels;
5311 for (i = 0; i < ch_lst_info->numChannels; i++) {
bingsb1444b32019-10-29 11:21:01 +08005312 if (ch_lst_info->channel_freq_list[i] == chan_freq)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005313 return true;
5314 }
5315
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005316 return false;
5317}
bingsb1444b32019-10-29 11:21:01 +08005318
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005319/**
5320 * sme_disconnect_connected_sessions() - Disconnect STA and P2P client session
5321 * if channel is not supported
5322 * @mac_ctx: mac global context
5323 *
5324 * If new country code does not support the channel on which STA/P2P client
5325 * is connetced, it sends the disconnect to the AP/P2P GO
5326 *
5327 * Return: void
5328 */
Jeff Johnson0a8786a2018-12-02 10:49:01 -08005329static void sme_disconnect_connected_sessions(struct mac_context *mac_ctx)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005330{
5331 uint8_t session_id, found = false;
bingsb1444b32019-10-29 11:21:01 +08005332 uint32_t chan_freq;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005333
Dustin Brownad06be62019-02-04 14:52:56 -08005334 for (session_id = 0; session_id < WLAN_MAX_VDEVS; session_id++) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005335 if (!csr_is_session_client_and_connected(mac_ctx, session_id))
5336 continue;
5337 found = false;
5338 /* Session is connected.Check the channel */
bingsb1444b32019-10-29 11:21:01 +08005339 chan_freq = csr_get_infra_operation_chan_freq(
5340 mac_ctx, session_id);
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07005341 sme_debug("Current Operating channel : %d, session :%d",
bingsb1444b32019-10-29 11:21:01 +08005342 chan_freq, session_id);
5343 found = sme_search_in_base_ch_freq_lst(mac_ctx, chan_freq);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005344 if (!found) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07005345 sme_debug("Disconnect Session: %d", session_id);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005346 csr_roam_disconnect(mac_ctx, session_id,
5347 eCSR_DISCONNECT_REASON_UNSPECIFIED);
5348 }
5349 }
5350}
5351
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005352#ifdef WLAN_FEATURE_PACKET_FILTERING
Jeff Johnsonb460dd72018-11-08 10:26:51 -08005353QDF_STATUS sme_8023_multicast_list(mac_handle_t mac_handle, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005354 tpSirRcvFltMcAddrList pMulticastAddrs)
5355{
5356 tpSirRcvFltMcAddrList request_buf;
Rajeev Kumar37d478b2017-04-17 16:59:28 -07005357 struct scheduler_msg msg = {0};
Jeff Johnson0a8786a2018-12-02 10:49:01 -08005358 struct mac_context *mac = MAC_CONTEXT(mac_handle);
gaurank kathpalia14e2f912017-08-31 14:51:45 +05305359 struct csr_roam_session *pSession = NULL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005360
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05305361 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
5362 "%s: ulMulticastAddrCnt: %d, multicastAddr[0]: %pK", __func__,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005363 pMulticastAddrs->ulMulticastAddrCnt,
Srinivas Girigowda98530492015-11-20 17:39:24 -08005364 pMulticastAddrs->multicastAddr[0].bytes);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005365
Ravi Joshi4f447cb2016-07-19 13:42:01 -07005366 /* Find the connected Infra / P2P_client connected session */
Jeff Johnson01f2c232018-11-21 19:17:44 -08005367 pSession = CSR_GET_SESSION(mac, sessionId);
5368 if (!CSR_IS_SESSION_VALID(mac, sessionId) ||
5369 (!csr_is_conn_state_infra(mac, sessionId) &&
5370 !csr_is_ndi_started(mac, sessionId))) {
Abhishek Singh5d8d7332017-08-10 15:15:24 +05305371 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Srinivas Girigowdaf2599dd2015-11-16 18:20:46 -08005372 "%s: Unable to find the session Id: %d", __func__,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005373 sessionId);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305374 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005375 }
5376
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305377 request_buf = qdf_mem_malloc(sizeof(tSirRcvFltMcAddrList));
Arif Hussain0ef77082018-10-10 16:42:53 -07005378 if (!request_buf)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305379 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005380
Jeff Johnson01f2c232018-11-21 19:17:44 -08005381 if (!csr_is_conn_state_connected_infra(mac, sessionId) &&
5382 !csr_is_ndi_started(mac, sessionId)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05305383 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Ravi Joshi4f447cb2016-07-19 13:42:01 -07005384 "%s: Request ignored, session %d is not connected or started",
5385 __func__, sessionId);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305386 qdf_mem_free(request_buf);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305387 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005388 }
5389
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305390 qdf_mem_copy(request_buf, pMulticastAddrs,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005391 sizeof(tSirRcvFltMcAddrList));
5392
Pragaspathi Thilagaraj7fb14222019-06-17 23:26:58 +05305393 qdf_copy_macaddr(&request_buf->self_macaddr, &pSession->self_mac_addr);
Anurag Chouhanc5548422016-02-24 18:33:27 +05305394 qdf_copy_macaddr(&request_buf->bssid,
Srinivas Girigowda98530492015-11-20 17:39:24 -08005395 &pSession->connectedProfile.bssid);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005396
5397 msg.type = WMA_8023_MULTICAST_LIST_REQ;
5398 msg.reserved = 0;
5399 msg.bodyptr = request_buf;
Sreelakshmi Konamki6a065362016-05-31 16:05:01 +05305400 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
5401 sessionId, msg.type));
gaurank kathpalia36b0c582018-08-28 17:45:43 +05305402 if (QDF_STATUS_SUCCESS != scheduler_post_message(QDF_MODULE_ID_SME,
5403 QDF_MODULE_ID_WMA,
5404 QDF_MODULE_ID_WMA,
5405 &msg)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05305406 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05305407 "%s: Not able to post WMA_8023_MULTICAST_LIST message to WMA",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005408 __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305409 qdf_mem_free(request_buf);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305410 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005411 }
5412
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305413 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005414}
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005415#endif /* WLAN_FEATURE_PACKET_FILTERING */
5416
wadesonga8940a22019-11-11 16:58:16 +08005417bool sme_is_channel_valid(mac_handle_t mac_handle, uint32_t chan_freq)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005418{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305419 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005420 bool valid = false;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08005421 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005422
Jeff Johnson01f2c232018-11-21 19:17:44 -08005423 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305424 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005425
wadesonga8940a22019-11-11 16:58:16 +08005426 valid = csr_roam_is_channel_valid(mac, chan_freq);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005427
Jeff Johnson01f2c232018-11-21 19:17:44 -08005428 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005429 }
5430
5431 return valid;
5432}
5433
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05305434/*
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05305435 * sme_set_max_tx_power_per_band() -
5436 * Set the Maximum Transmit Power specific to band dynamically.
5437 * Note: this setting will not persist over reboots.
5438 *
5439 * band
5440 * power to set in dB
5441 * Return QDF_STATUS
5442 */
Varun Reddy Yeturua48bc412017-11-17 15:33:35 -08005443QDF_STATUS sme_set_max_tx_power_per_band(enum band_info band, int8_t dB)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005444{
Rajeev Kumar37d478b2017-04-17 16:59:28 -07005445 struct scheduler_msg msg = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005446 tpMaxTxPowerPerBandParams pMaxTxPowerPerBandParams = NULL;
5447
5448 pMaxTxPowerPerBandParams =
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305449 qdf_mem_malloc(sizeof(tMaxTxPowerPerBandParams));
Arif Hussain0ef77082018-10-10 16:42:53 -07005450 if (!pMaxTxPowerPerBandParams)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305451 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005452
5453 pMaxTxPowerPerBandParams->power = dB;
5454 pMaxTxPowerPerBandParams->bandInfo = band;
5455
5456 msg.type = WMA_SET_MAX_TX_POWER_PER_BAND_REQ;
5457 msg.reserved = 0;
5458 msg.bodyptr = pMaxTxPowerPerBandParams;
Sreelakshmi Konamki6a065362016-05-31 16:05:01 +05305459 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
5460 NO_SESSION, msg.type));
gaurank kathpalia36b0c582018-08-28 17:45:43 +05305461 if (QDF_STATUS_SUCCESS != scheduler_post_message(QDF_MODULE_ID_SME,
5462 QDF_MODULE_ID_WMA,
5463 QDF_MODULE_ID_WMA,
5464 &msg)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05305465 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005466 "%s:Not able to post WMA_SET_MAX_TX_POWER_PER_BAND_REQ",
5467 __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305468 qdf_mem_free(pMaxTxPowerPerBandParams);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305469 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005470 }
5471
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305472 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005473}
5474
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05305475/*
5476 * sme_set_max_tx_power() -
5477 * Set the Maximum Transmit Power dynamically. Note: this setting will
5478 * not persist over reboots.
5479 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08005480 * mac_handle
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05305481 * pBssid BSSID to set the power cap for
5482 * pBssid pSelfMacAddress self MAC Address
5483 * pBssid power to set in dB
5484 * Return QDF_STATUS
5485 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08005486QDF_STATUS sme_set_max_tx_power(mac_handle_t mac_handle,
5487 struct qdf_mac_addr pBssid,
Anurag Chouhan6d760662016-02-20 16:05:43 +05305488 struct qdf_mac_addr pSelfMacAddress, int8_t dB)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005489{
Rajeev Kumar37d478b2017-04-17 16:59:28 -07005490 struct scheduler_msg msg = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005491 tpMaxTxPowerParams pMaxTxParams = NULL;
5492
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05305493 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005494 TRACE_CODE_SME_RX_HDD_SET_MAXTXPOW, NO_SESSION, 0));
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305495 pMaxTxParams = qdf_mem_malloc(sizeof(tMaxTxPowerParams));
Arif Hussain0ef77082018-10-10 16:42:53 -07005496 if (!pMaxTxParams)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305497 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005498
Anurag Chouhanc5548422016-02-24 18:33:27 +05305499 qdf_copy_macaddr(&pMaxTxParams->bssId, &pBssid);
5500 qdf_copy_macaddr(&pMaxTxParams->selfStaMacAddr, &pSelfMacAddress);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005501 pMaxTxParams->power = dB;
5502
5503 msg.type = WMA_SET_MAX_TX_POWER_REQ;
5504 msg.reserved = 0;
5505 msg.bodyptr = pMaxTxParams;
5506
gaurank kathpalia36b0c582018-08-28 17:45:43 +05305507 if (QDF_STATUS_SUCCESS != scheduler_post_message(QDF_MODULE_ID_SME,
5508 QDF_MODULE_ID_WMA,
5509 QDF_MODULE_ID_WMA,
5510 &msg)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05305511 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005512 "%s: Not able to post WMA_SET_MAX_TX_POWER_REQ message to WMA",
5513 __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305514 qdf_mem_free(pMaxTxParams);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305515 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005516 }
5517
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305518 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005519}
5520
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05305521/*
5522 * sme_set_custom_mac_addr() -
5523 * Set the customer Mac Address.
5524 *
5525 * customMacAddr customer MAC Address
5526 * Return QDF_STATUS
5527 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305528QDF_STATUS sme_set_custom_mac_addr(tSirMacAddr customMacAddr)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005529{
Rajeev Kumar37d478b2017-04-17 16:59:28 -07005530 struct scheduler_msg msg = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005531 tSirMacAddr *pBaseMacAddr;
5532
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305533 pBaseMacAddr = qdf_mem_malloc(sizeof(tSirMacAddr));
Arif Hussain0ef77082018-10-10 16:42:53 -07005534 if (!pBaseMacAddr)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305535 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005536
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305537 qdf_mem_copy(*pBaseMacAddr, customMacAddr, sizeof(tSirMacAddr));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005538
5539 msg.type = SIR_HAL_SET_BASE_MACADDR_IND;
5540 msg.reserved = 0;
5541 msg.bodyptr = pBaseMacAddr;
5542
gaurank kathpalia36b0c582018-08-28 17:45:43 +05305543 if (QDF_STATUS_SUCCESS != scheduler_post_message(QDF_MODULE_ID_SME,
5544 QDF_MODULE_ID_WMA,
5545 QDF_MODULE_ID_WMA,
5546 &msg)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05305547 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05305548 "Not able to post SIR_HAL_SET_BASE_MACADDR_IND message to WMA");
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305549 qdf_mem_free(pBaseMacAddr);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305550 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005551 }
5552
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305553 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005554}
5555
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05305556/*
5557 * sme_set_tx_power() -
5558 * Set Transmit Power dynamically.
5559 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08005560 * mac_handle
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05305561 * sessionId Target Session ID
5562 * BSSID
5563 * dev_mode dev_mode such as station, P2PGO, SAP
5564 * dBm power to set
5565 * Return QDF_STATUS
5566 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08005567QDF_STATUS sme_set_tx_power(mac_handle_t mac_handle, uint8_t sessionId,
Anurag Chouhan6d760662016-02-20 16:05:43 +05305568 struct qdf_mac_addr pBSSId,
Jeff Johnsonc1e62782017-11-09 09:50:17 -08005569 enum QDF_OPMODE dev_mode, int dBm)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005570{
Rajeev Kumar37d478b2017-04-17 16:59:28 -07005571 struct scheduler_msg msg = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005572 tpMaxTxPowerParams pTxParams = NULL;
5573 int8_t power = (int8_t) dBm;
5574
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05305575 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005576 TRACE_CODE_SME_RX_HDD_SET_TXPOW, sessionId, 0));
5577
5578 /* make sure there is no overflow */
5579 if ((int)power != dBm) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05305580 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005581 "%s: error, invalid power = %d", __func__, dBm);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305582 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005583 }
5584
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305585 pTxParams = qdf_mem_malloc(sizeof(tMaxTxPowerParams));
Arif Hussain0ef77082018-10-10 16:42:53 -07005586 if (!pTxParams)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305587 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005588
Anurag Chouhanc5548422016-02-24 18:33:27 +05305589 qdf_copy_macaddr(&pTxParams->bssId, &pBSSId);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005590 pTxParams->power = power; /* unit is dBm */
5591 pTxParams->dev_mode = dev_mode;
5592 msg.type = WMA_SET_TX_POWER_REQ;
5593 msg.reserved = 0;
5594 msg.bodyptr = pTxParams;
5595
gaurank kathpalia36b0c582018-08-28 17:45:43 +05305596 if (QDF_STATUS_SUCCESS != scheduler_post_message(QDF_MODULE_ID_SME,
5597 QDF_MODULE_ID_WMA,
5598 QDF_MODULE_ID_WMA,
5599 &msg)) {
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305600 qdf_mem_free(pTxParams);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305601 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005602 }
5603
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305604 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005605}
5606
Jeff Johnsonc7309062018-11-09 20:59:42 -08005607QDF_STATUS sme_update_session_param(mac_handle_t mac_handle, uint8_t session_id,
5608 uint32_t param_type, uint32_t param_val)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005609{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305610 QDF_STATUS status = QDF_STATUS_SUCCESS;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08005611 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005612 uint16_t len;
5613
Selvaraj, Sridhar7231c5f2016-09-28 12:42:33 +05305614 status = sme_acquire_global_lock(&mac_ctx->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305615 if (QDF_IS_STATUS_SUCCESS(status)) {
Selvaraj, Sridhar7231c5f2016-09-28 12:42:33 +05305616 struct sir_update_session_param *msg;
gaurank kathpalia14e2f912017-08-31 14:51:45 +05305617 struct csr_roam_session *session = CSR_GET_SESSION(mac_ctx,
5618 session_id);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005619
Selvaraj, Sridhar7231c5f2016-09-28 12:42:33 +05305620 if (!session) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07005621 sme_err("Session: %d not found", session_id);
Selvaraj, Sridhar7231c5f2016-09-28 12:42:33 +05305622 sme_release_global_lock(&mac_ctx->sme);
5623 return status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005624 }
5625
Selvaraj, Sridhar5b5a0652017-05-04 11:23:07 +05305626 if (param_type == SIR_PARAM_IGNORE_ASSOC_DISALLOWED)
5627 mac_ctx->ignore_assoc_disallowed = param_val;
5628
Selvaraj, Sridhar7231c5f2016-09-28 12:42:33 +05305629 if (!session->sessionActive)
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05305630 QDF_ASSERT(0);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005631
Selvaraj, Sridhar7231c5f2016-09-28 12:42:33 +05305632 len = sizeof(*msg);
5633 msg = qdf_mem_malloc(len);
5634 if (!msg)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305635 status = QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005636 else {
Selvaraj, Sridhar7231c5f2016-09-28 12:42:33 +05305637 msg->message_type = eWNI_SME_SESSION_UPDATE_PARAM;
5638 msg->length = len;
Abhishek Singhefe21e62019-09-20 10:03:24 +05305639 msg->vdev_id = session_id;
Selvaraj, Sridhar7231c5f2016-09-28 12:42:33 +05305640 msg->param_type = param_type;
5641 msg->param_val = param_val;
Rajeev Kumard138ac52017-01-30 18:38:37 -08005642 status = umac_send_mb_message_to_mac(msg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005643 }
Selvaraj, Sridhar7231c5f2016-09-28 12:42:33 +05305644 sme_release_global_lock(&mac_ctx->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005645 }
5646 return status;
5647}
5648
Jeff Johnsonb460dd72018-11-08 10:26:51 -08005649QDF_STATUS sme_update_roam_scan_n_probes(mac_handle_t mac_handle,
Srinivas Dasaria5a42fa2019-09-20 12:47:15 +05305650 uint8_t vdev_id,
5651 const uint8_t probes)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005652{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08005653 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Srinivas Dasaria5a42fa2019-09-20 12:47:15 +05305654 QDF_STATUS status;
5655 tCsrNeighborRoamControlInfo *neighbor_roam_info;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005656
Srinivas Dasaria5a42fa2019-09-20 12:47:15 +05305657 if (vdev_id >= WLAN_MAX_VDEVS) {
5658 sme_err("Invalid vdev_id: %d", vdev_id);
5659 return QDF_STATUS_E_INVAL;
5660 }
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05305661 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005662 TRACE_CODE_SME_RX_HDD_UPDATE_ROAM_SCAN_N_PROBES,
Srinivas Dasaria5a42fa2019-09-20 12:47:15 +05305663 vdev_id, 0));
Jeff Johnson01f2c232018-11-21 19:17:44 -08005664 status = sme_acquire_global_lock(&mac->sme);
Srinivas Dasaria5a42fa2019-09-20 12:47:15 +05305665 if (QDF_IS_STATUS_ERROR(status)) {
5666 sme_err("Failed to acquire sme lock; status: %d", status);
5667 return status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005668 }
Srinivas Dasaria5a42fa2019-09-20 12:47:15 +05305669 neighbor_roam_info = &mac->roam.neighborRoamInfo[vdev_id];
5670 sme_debug("gRoamScanNProbes is changed from %u to %u",
5671 neighbor_roam_info->cfgParams.roam_scan_n_probes, probes);
5672 neighbor_roam_info->cfgParams.roam_scan_n_probes = probes;
5673
5674 if (mac->mlme_cfg->lfr.roam_scan_offload_enabled)
Abhinav Kumar523ca372019-08-30 16:28:19 +05305675 csr_roam_update_cfg(mac, vdev_id, REASON_NPROBES_CHANGED);
Srinivas Dasaria5a42fa2019-09-20 12:47:15 +05305676 sme_release_global_lock(&mac->sme);
5677
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005678 return status;
5679}
5680
Srinivas Dasari7bedcd12019-09-20 12:43:11 +05305681QDF_STATUS
5682sme_update_roam_scan_home_away_time(mac_handle_t mac_handle, uint8_t vdev_id,
5683 const uint16_t roam_scan_home_away_time,
5684 const bool send_offload_cmd)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005685{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08005686 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Srinivas Dasari7bedcd12019-09-20 12:43:11 +05305687 QDF_STATUS status;
5688 tCsrNeighborRoamControlInfo *neighbor_roam_info;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005689
Srinivas Dasari7bedcd12019-09-20 12:43:11 +05305690 if (vdev_id >= WLAN_MAX_VDEVS) {
5691 sme_err("Invalid vdev_id: %d", vdev_id);
5692 return QDF_STATUS_E_INVAL;
5693 }
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05305694 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005695 TRACE_CODE_SME_RX_HDD_UPDATE_ROAM_SCAN_HOME_AWAY_TIME,
Srinivas Dasari7bedcd12019-09-20 12:43:11 +05305696 vdev_id, 0));
Vignesh Viswanathan4e65e8e2018-05-01 12:04:16 +05305697
Srinivas Dasari7bedcd12019-09-20 12:43:11 +05305698 status = sme_acquire_global_lock(&mac->sme);
5699 if (QDF_IS_STATUS_ERROR(status)) {
5700 sme_err("Failed to acquire sme lock; status: %d", status);
5701 return status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005702 }
Srinivas Dasari7bedcd12019-09-20 12:43:11 +05305703 neighbor_roam_info = &mac->roam.neighborRoamInfo[vdev_id];
5704
5705 if (neighbor_roam_info->cfgParams.roam_scan_home_away_time ==
5706 roam_scan_home_away_time) {
5707 sme_debug("Not updated as current value is :%u",
5708 roam_scan_home_away_time);
5709 sme_release_global_lock(&mac->sme);
5710 return QDF_STATUS_SUCCESS;
5711 }
5712
5713 sme_debug("gRoamScanHomeAwayTime is changed from %d to %d",
5714 neighbor_roam_info->cfgParams.roam_scan_home_away_time,
5715 roam_scan_home_away_time);
5716 neighbor_roam_info->cfgParams.roam_scan_home_away_time =
5717 roam_scan_home_away_time;
5718 if (mac->mlme_cfg->lfr.roam_scan_offload_enabled && send_offload_cmd)
Abhinav Kumar523ca372019-08-30 16:28:19 +05305719 csr_roam_update_cfg(mac, vdev_id,
5720 REASON_HOME_AWAY_TIME_CHANGED);
Srinivas Dasari7bedcd12019-09-20 12:43:11 +05305721 sme_release_global_lock(&mac->sme);
5722
5723 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005724}
5725
Abhishek Singh518323d2015-10-19 17:42:01 +05305726/**
5727 * sme_ext_change_channel()- function to post send ECSA
5728 * action frame to csr.
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -08005729 * @mac_handle: Opaque handle to the global MAC context
Liangwei Dongc1956bd2020-01-07 19:50:57 +08005730 * @channel freq: new channel freq to switch
Abhishek Singh518323d2015-10-19 17:42:01 +05305731 * @session_id: senssion it should be sent on.
5732 *
5733 * This function is called to post ECSA frame to csr.
5734 *
5735 * Return: success if msg is sent else return failure
5736 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08005737QDF_STATUS sme_ext_change_channel(mac_handle_t mac_handle, uint32_t channel,
Abhishek Singh518323d2015-10-19 17:42:01 +05305738 uint8_t session_id)
5739{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305740 QDF_STATUS status = QDF_STATUS_SUCCESS;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08005741 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Abhishek Singh518323d2015-10-19 17:42:01 +05305742 uint8_t channel_state;
5743
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07005744 sme_err("Set Channel: %d", channel);
Abhishek Singh518323d2015-10-19 17:42:01 +05305745 channel_state =
Kiran Kumar Lokerea3de2262017-04-12 12:15:04 -07005746 wlan_reg_get_channel_state(mac_ctx->pdev, channel);
Abhishek Singh518323d2015-10-19 17:42:01 +05305747
5748 if (CHANNEL_STATE_DISABLE == channel_state) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07005749 sme_err("Invalid channel: %d", channel);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305750 return QDF_STATUS_E_INVAL;
Abhishek Singh518323d2015-10-19 17:42:01 +05305751 }
5752
5753 status = sme_acquire_global_lock(&mac_ctx->sme);
5754
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305755 if (QDF_STATUS_SUCCESS == status) {
Abhishek Singh518323d2015-10-19 17:42:01 +05305756 /* update the channel list to the firmware */
5757 status = csr_send_ext_change_channel(mac_ctx,
5758 channel, session_id);
5759 sme_release_global_lock(&mac_ctx->sme);
5760 }
5761
5762 return status;
5763}
5764
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05305765/*
5766 * sme_get_roam_intra_band() -
5767 * get Intra band roaming
5768 *
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -08005769 * mac_handle: Opaque handle to the global MAC context
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05305770 * Return Success or failure
5771 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08005772bool sme_get_roam_intra_band(mac_handle_t mac_handle)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005773{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08005774 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05305775
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05305776 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005777 TRACE_CODE_SME_RX_HDD_GET_ROAMIBAND, NO_SESSION, 0));
Wu Gao51a63562018-11-08 16:29:10 +08005778
5779 return mac->mlme_cfg->lfr.roam_intra_band;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005780}
5781
Srinivas Dasaria5a42fa2019-09-20 12:47:15 +05305782QDF_STATUS sme_get_roam_scan_n_probes(mac_handle_t mac_handle, uint8_t vdev_id,
5783 uint8_t *roam_scan_n_probes)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005784{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08005785 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Srinivas Dasaria5a42fa2019-09-20 12:47:15 +05305786 QDF_STATUS status;
5787 tCsrNeighborRoamControlInfo *neighbor_roam_info;
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05305788
Srinivas Dasaria5a42fa2019-09-20 12:47:15 +05305789 if (vdev_id >= WLAN_MAX_VDEVS) {
5790 sme_err("Invalid vdev_id: %d", vdev_id);
5791 return QDF_STATUS_E_INVAL;
5792 }
5793
5794 status = sme_acquire_global_lock(&mac->sme);
5795 if (QDF_IS_STATUS_ERROR(status)) {
5796 sme_err("Failed to acquire sme lock; status: %d", status);
5797 return status;
5798 }
5799 neighbor_roam_info = &mac->roam.neighborRoamInfo[vdev_id];
5800 *roam_scan_n_probes = neighbor_roam_info->cfgParams.roam_scan_n_probes;
5801 sme_release_global_lock(&mac->sme);
5802
5803 return status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005804}
5805
Srinivas Dasari7bedcd12019-09-20 12:43:11 +05305806QDF_STATUS sme_get_roam_scan_home_away_time(mac_handle_t mac_handle,
5807 uint8_t vdev_id,
5808 uint16_t *roam_scan_home_away_time)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005809{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08005810 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Srinivas Dasari7bedcd12019-09-20 12:43:11 +05305811 QDF_STATUS status;
5812 tCsrNeighborRoamControlInfo *neighbor_roam_info;
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05305813
Srinivas Dasari7bedcd12019-09-20 12:43:11 +05305814 if (vdev_id >= WLAN_MAX_VDEVS) {
5815 sme_err("Invalid vdev_id: %d", vdev_id);
5816 return QDF_STATUS_E_INVAL;
5817 }
5818
5819 status = sme_acquire_global_lock(&mac->sme);
5820 if (QDF_IS_STATUS_ERROR(status)) {
5821 sme_err("Failed to acquire sme lock; status: %d", status);
5822 return status;
5823 }
5824 neighbor_roam_info = &mac->roam.neighborRoamInfo[vdev_id];
5825 *roam_scan_home_away_time =
5826 neighbor_roam_info->cfgParams.roam_scan_home_away_time;
5827 sme_release_global_lock(&mac->sme);
5828
5829 return status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005830}
5831
Srinivas Dasari7f48ac02019-09-16 17:44:43 +05305832QDF_STATUS sme_update_roam_rssi_diff(mac_handle_t mac_handle, uint8_t vdev_id,
5833 uint8_t roam_rssi_diff)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005834{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08005835 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Srinivas Dasari7f48ac02019-09-16 17:44:43 +05305836 QDF_STATUS status;
5837 tCsrNeighborRoamControlInfo *neighbor_roam_info;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005838
Srinivas Dasari7f48ac02019-09-16 17:44:43 +05305839 if (vdev_id >= WLAN_MAX_VDEVS) {
5840 sme_err("Invalid sme vdev id: %d", vdev_id);
Naveen Rawatc36f7eb2016-11-10 20:01:03 -08005841 return QDF_STATUS_E_INVAL;
5842 }
5843
Jeff Johnson01f2c232018-11-21 19:17:44 -08005844 status = sme_acquire_global_lock(&mac->sme);
Srinivas Dasari7f48ac02019-09-16 17:44:43 +05305845 if (QDF_IS_STATUS_ERROR(status))
5846 return status;
5847 neighbor_roam_info = &mac->roam.neighborRoamInfo[vdev_id];
5848 sme_debug("LFR runtime successfully set roam rssi diff to %d - old value is %d - roam state is %s",
5849 roam_rssi_diff,
5850 neighbor_roam_info->cfgParams.roam_rssi_diff,
5851 mac_trace_get_neighbour_roam_state(
5852 neighbor_roam_info->neighborRoamState));
Vignesh Viswanathan4e65e8e2018-05-01 12:04:16 +05305853
Srinivas Dasari7f48ac02019-09-16 17:44:43 +05305854 neighbor_roam_info->cfgParams.roam_rssi_diff = roam_rssi_diff;
5855 if (mac->mlme_cfg->lfr.roam_scan_offload_enabled)
Abhinav Kumar523ca372019-08-30 16:28:19 +05305856 csr_roam_update_cfg(mac, vdev_id,
5857 REASON_RSSI_DIFF_CHANGED);
Vignesh Viswanathan4e65e8e2018-05-01 12:04:16 +05305858
Srinivas Dasari7f48ac02019-09-16 17:44:43 +05305859 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005860 return status;
5861}
5862
Pragaspathi Thilagaraj6695ba92019-04-04 17:59:47 +05305863void sme_update_session_assoc_ie(mac_handle_t mac_handle,
5864 uint8_t vdev_id,
5865 struct csr_roam_profile *src_profile)
5866{
5867 struct mac_context *mac = MAC_CONTEXT(mac_handle);
5868 struct csr_roam_session *session = CSR_GET_SESSION(mac, vdev_id);
5869
5870 if (!session) {
5871 sme_err("Session: %d not found", vdev_id);
5872 return;
5873 }
5874
5875 qdf_mem_free(session->pAddIEAssoc);
5876 session->pAddIEAssoc = NULL;
5877 session->nAddIEAssocLength = 0;
5878
5879 if (!src_profile->nAddIEAssocLength) {
5880 sme_debug("Assoc IE len 0");
5881 return;
5882 }
5883
5884 session->pAddIEAssoc = qdf_mem_malloc(src_profile->nAddIEAssocLength);
5885 if (!session->pAddIEAssoc)
5886 return;
5887
5888 session->nAddIEAssocLength = src_profile->nAddIEAssocLength;
5889 qdf_mem_copy(session->pAddIEAssoc, src_profile->pAddIEAssoc,
5890 src_profile->nAddIEAssocLength);
5891}
5892
5893QDF_STATUS sme_send_rso_connect_params(mac_handle_t mac_handle,
5894 uint8_t vdev_id,
5895 struct csr_roam_profile *src_profile)
Vignesh Viswanathanc6d1e1c2017-09-18 12:32:49 +05305896{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08005897 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Vignesh Viswanathanc6d1e1c2017-09-18 12:32:49 +05305898 QDF_STATUS status = QDF_STATUS_SUCCESS;
5899 tpCsrNeighborRoamControlInfo neighbor_roam_info =
Pragaspathi Thilagaraj6695ba92019-04-04 17:59:47 +05305900 &mac->roam.neighborRoamInfo[vdev_id];
Vignesh Viswanathanc6d1e1c2017-09-18 12:32:49 +05305901
Pragaspathi Thilagaraj6695ba92019-04-04 17:59:47 +05305902 if (vdev_id >= WLAN_MAX_VDEVS) {
5903 sme_err("Invalid sme vdev id: %d", vdev_id);
Vignesh Viswanathanc6d1e1c2017-09-18 12:32:49 +05305904 return QDF_STATUS_E_INVAL;
5905 }
5906
5907 if (!src_profile) {
5908 sme_err("src roam profile NULL");
5909 return QDF_STATUS_E_INVAL;
5910 }
5911
Wu Gao51a63562018-11-08 16:29:10 +08005912 if (!mac->mlme_cfg->lfr.lfr_enabled ||
Vignesh Viswanathanc6d1e1c2017-09-18 12:32:49 +05305913 (neighbor_roam_info->neighborRoamState !=
5914 eCSR_NEIGHBOR_ROAM_STATE_CONNECTED)) {
5915 sme_info("Fast roam is disabled or not connected(%d)",
Pragaspathi Thilagaraj6695ba92019-04-04 17:59:47 +05305916 neighbor_roam_info->neighborRoamState);
Vignesh Viswanathanc6d1e1c2017-09-18 12:32:49 +05305917 return QDF_STATUS_E_PERM;
5918 }
5919
Jianmin Zhubf845932018-12-17 11:52:50 +08005920 if (csr_is_roam_offload_enabled(mac)) {
Vignesh Viswanathan4e65e8e2018-05-01 12:04:16 +05305921 status = sme_acquire_global_lock(&mac->sme);
5922 if (QDF_IS_STATUS_SUCCESS(status)) {
5923 sme_debug("Updating fils config to fw");
Abhinav Kumar523ca372019-08-30 16:28:19 +05305924 csr_roam_update_cfg(mac, vdev_id,
5925 REASON_FILS_PARAMS_CHANGED);
Vignesh Viswanathan4e65e8e2018-05-01 12:04:16 +05305926 sme_release_global_lock(&mac->sme);
5927 } else {
5928 sme_err("Failed to acquire SME lock");
5929 }
Vignesh Viswanathanc6d1e1c2017-09-18 12:32:49 +05305930 } else {
5931 sme_info("LFR3 not enabled");
5932 return QDF_STATUS_E_INVAL;
5933 }
5934
5935 return status;
5936}
5937
Pragaspathi Thilagaraj6695ba92019-04-04 17:59:47 +05305938#ifdef WLAN_FEATURE_FILS_SK
5939QDF_STATUS sme_update_fils_config(mac_handle_t mac_handle, uint8_t vdev_id,
5940 struct csr_roam_profile *src_profile)
5941{
5942 QDF_STATUS status = QDF_STATUS_SUCCESS;
5943 struct mac_context *mac = MAC_CONTEXT(mac_handle);
5944
5945 csr_update_fils_config(mac, vdev_id, src_profile);
5946
5947 return status;
5948}
5949
5950void sme_send_hlp_ie_info(mac_handle_t mac_handle, uint8_t vdev_id,
Jeff Johnson66ee8a92018-03-17 15:24:26 -07005951 struct csr_roam_profile *profile, uint32_t if_addr)
Vignesh Viswanathanc6d1e1c2017-09-18 12:32:49 +05305952{
5953 int i;
5954 struct scheduler_msg msg;
5955 QDF_STATUS status;
5956 struct hlp_params *params;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08005957 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Pragaspathi Thilagaraj6695ba92019-04-04 17:59:47 +05305958 struct csr_roam_session *session = CSR_GET_SESSION(mac, vdev_id);
Vignesh Viswanathanc6d1e1c2017-09-18 12:32:49 +05305959 tpCsrNeighborRoamControlInfo neighbor_roam_info =
Pragaspathi Thilagaraj6695ba92019-04-04 17:59:47 +05305960 &mac->roam.neighborRoamInfo[vdev_id];
Vignesh Viswanathanc6d1e1c2017-09-18 12:32:49 +05305961
5962 if (!session) {
5963 sme_err("session NULL");
5964 return;
5965 }
5966
Wu Gao51a63562018-11-08 16:29:10 +08005967 if (!mac->mlme_cfg->lfr.lfr_enabled ||
Vignesh Viswanathanc6d1e1c2017-09-18 12:32:49 +05305968 (neighbor_roam_info->neighborRoamState !=
5969 eCSR_NEIGHBOR_ROAM_STATE_CONNECTED)) {
5970 sme_debug("Fast roam is disabled or not connected(%d)",
5971 neighbor_roam_info->neighborRoamState);
5972 return;
5973 }
5974
5975 params = qdf_mem_malloc(sizeof(*params));
Arif Hussain0ef77082018-10-10 16:42:53 -07005976 if (!params)
Vignesh Viswanathanc6d1e1c2017-09-18 12:32:49 +05305977 return;
Arif Hussain0ef77082018-10-10 16:42:53 -07005978
Vignesh Viswanathanc6d1e1c2017-09-18 12:32:49 +05305979 if ((profile->hlp_ie_len +
Srinivas Girigowdad1e45b82019-04-15 15:08:28 -07005980 QDF_IPV4_ADDR_SIZE) > FILS_MAX_HLP_DATA_LEN) {
Vignesh Viswanathanc6d1e1c2017-09-18 12:32:49 +05305981 sme_err("HLP IE len exceeds %d",
5982 profile->hlp_ie_len);
5983 qdf_mem_free(params);
5984 return;
5985 }
5986
Pragaspathi Thilagaraj6695ba92019-04-04 17:59:47 +05305987 params->vdev_id = vdev_id;
Srinivas Girigowdad1e45b82019-04-15 15:08:28 -07005988 params->hlp_ie_len = profile->hlp_ie_len + QDF_IPV4_ADDR_SIZE;
Vignesh Viswanathanc6d1e1c2017-09-18 12:32:49 +05305989
Srinivas Girigowdad1e45b82019-04-15 15:08:28 -07005990 for (i = 0; i < QDF_IPV4_ADDR_SIZE; i++)
Vignesh Viswanathanc6d1e1c2017-09-18 12:32:49 +05305991 params->hlp_ie[i] = (if_addr >> (i * 8)) & 0xFF;
5992
Srinivas Girigowdad1e45b82019-04-15 15:08:28 -07005993 qdf_mem_copy(params->hlp_ie + QDF_IPV4_ADDR_SIZE,
Vignesh Viswanathanc6d1e1c2017-09-18 12:32:49 +05305994 profile->hlp_ie, profile->hlp_ie_len);
5995
5996 msg.type = SIR_HAL_HLP_IE_INFO;
5997 msg.reserved = 0;
5998 msg.bodyptr = params;
5999 status = sme_acquire_global_lock(&mac->sme);
6000 if (status != QDF_STATUS_SUCCESS) {
6001 sme_err("sme lock acquire fails");
6002 qdf_mem_free(params);
6003 return;
6004 }
6005
6006 if (!QDF_IS_STATUS_SUCCESS
gaurank kathpalia36b0c582018-08-28 17:45:43 +05306007 (scheduler_post_message(QDF_MODULE_ID_SME,
6008 QDF_MODULE_ID_WMA,
6009 QDF_MODULE_ID_WMA, &msg))) {
Vignesh Viswanathanc6d1e1c2017-09-18 12:32:49 +05306010 sme_err("Not able to post WMA_HLP_IE_INFO message to HAL");
6011 sme_release_global_lock(&mac->sme);
6012 qdf_mem_free(params);
6013 return;
6014 }
6015
6016 sme_release_global_lock(&mac->sme);
6017}
6018
Jeff Johnson172237b2017-11-07 15:32:59 -08006019void sme_free_join_rsp_fils_params(struct csr_roam_info *roam_info)
Vignesh Viswanathanc6d1e1c2017-09-18 12:32:49 +05306020{
6021 struct fils_join_rsp_params *roam_fils_params;
6022
6023 if (!roam_info) {
Arun Kumar Khandavallida60bb12020-01-20 11:58:58 +05306024 sme_debug("FILS Roam Info NULL");
Vignesh Viswanathanc6d1e1c2017-09-18 12:32:49 +05306025 return;
6026 }
6027
6028 roam_fils_params = roam_info->fils_join_rsp;
6029 if (!roam_fils_params) {
Arun Kumar Khandavallida60bb12020-01-20 11:58:58 +05306030 sme_debug("FILS Roam Param NULL");
Vignesh Viswanathanc6d1e1c2017-09-18 12:32:49 +05306031 return;
6032 }
6033
6034 if (roam_fils_params->fils_pmk)
6035 qdf_mem_free(roam_fils_params->fils_pmk);
6036
6037 qdf_mem_free(roam_fils_params);
6038
6039 roam_info->fils_join_rsp = NULL;
6040}
6041
6042#else
Pragaspathi Thilagaraj6695ba92019-04-04 17:59:47 +05306043inline void sme_send_hlp_ie_info(mac_handle_t mac_handle, uint8_t vdev_id,
Jeff Johnson66ee8a92018-03-17 15:24:26 -07006044 struct csr_roam_profile *profile, uint32_t if_addr)
Vignesh Viswanathanc6d1e1c2017-09-18 12:32:49 +05306045{}
6046#endif
6047
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306048/*
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306049 * sme_update_wes_mode() -
6050 * Update WES Mode
6051 * This function is called through dynamic setConfig callback function
6052 * to configure isWESModeEnabled
6053 *
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -08006054 * mac_handle: Opaque handle to the global MAC context
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306055 * isWESModeEnabled - WES mode
6056 * sessionId - Session Identifier
6057 * Return QDF_STATUS_SUCCESS - SME update isWESModeEnabled config successfully.
6058 * Other status means SME is failed to update isWESModeEnabled.
6059 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006060
Jeff Johnsonb460dd72018-11-08 10:26:51 -08006061QDF_STATUS sme_update_wes_mode(mac_handle_t mac_handle, bool isWESModeEnabled,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006062 uint8_t sessionId)
6063{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08006064 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306065 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006066
Dustin Brownad06be62019-02-04 14:52:56 -08006067 if (sessionId >= WLAN_MAX_VDEVS) {
Naveen Rawatc36f7eb2016-11-10 20:01:03 -08006068 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
6069 FL("Invalid sme session id: %d"), sessionId);
6070 return QDF_STATUS_E_INVAL;
6071 }
6072
Jeff Johnson01f2c232018-11-21 19:17:44 -08006073 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306074 if (QDF_IS_STATUS_SUCCESS(status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05306075 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006076 "LFR runtime successfully set WES Mode to %d - old value is %d - roam state is %s",
6077 isWESModeEnabled,
Wu Gao51a63562018-11-08 16:29:10 +08006078 mac->mlme_cfg->lfr.wes_mode_enabled,
Jeff Johnson01f2c232018-11-21 19:17:44 -08006079 mac_trace_get_neighbour_roam_state(mac->roam.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006080 neighborRoamInfo
6081 [sessionId].
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306082 neighborRoamState));
Wu Gao51a63562018-11-08 16:29:10 +08006083 mac->mlme_cfg->lfr.wes_mode_enabled = isWESModeEnabled;
Jeff Johnson01f2c232018-11-21 19:17:44 -08006084 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006085 }
6086
6087 return status;
6088}
6089
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306090/*
6091 * sme_set_roam_scan_control() -
6092 * Set roam scan control
6093 * This function is called to set roam scan control
6094 * if roam scan control is set to 0, roaming scan cache is cleared
6095 * any value other than 0 is treated as invalid value
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -08006096 * mac_handle: Opaque handle to the global MAC context
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306097 * sessionId - Session Identifier
6098 * Return QDF_STATUS_SUCCESS - SME update config successfully.
6099 * Other status means SME failure to update
6100 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08006101QDF_STATUS sme_set_roam_scan_control(mac_handle_t mac_handle, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006102 bool roamScanControl)
6103{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08006104 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306105 QDF_STATUS status = QDF_STATUS_SUCCESS;
Srinivas Dasarib78334d2019-08-12 12:25:37 +05306106 tCsrChannelInfo *specific_channel_info;
6107 tCsrNeighborRoamControlInfo *neighbor_roam_info;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006108
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05306109 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006110 TRACE_CODE_SME_RX_HDD_SET_SCANCTRL, NO_SESSION, 0));
Naveen Rawatc36f7eb2016-11-10 20:01:03 -08006111
Dustin Brownad06be62019-02-04 14:52:56 -08006112 if (sessionId >= WLAN_MAX_VDEVS) {
Naveen Rawatc36f7eb2016-11-10 20:01:03 -08006113 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
6114 FL("Invalid sme session id: %d"), sessionId);
6115 return QDF_STATUS_E_INVAL;
6116 }
6117
Jeff Johnson01f2c232018-11-21 19:17:44 -08006118 status = sme_acquire_global_lock(&mac->sme);
Srinivas Dasarib78334d2019-08-12 12:25:37 +05306119 if (QDF_IS_STATUS_ERROR(status))
6120 return status;
6121 neighbor_roam_info = &mac->roam.neighborRoamInfo[sessionId];
6122 sme_debug("LFR runtime successfully set roam scan control to %d - old value is %d - roam state is %s",
6123 roamScanControl,
6124 mac->roam.configParam.nRoamScanControl,
6125 mac_trace_get_neighbour_roam_state(
6126 neighbor_roam_info->neighborRoamState));
6127 if (!roamScanControl && mac->roam.configParam.nRoamScanControl) {
6128 /**
6129 * Clear the specific channel info cache when roamScanControl
6130 * is set to 0. If any preffered channel list is configured,
6131 * that will be sent to firmware for further roam scans.
6132 */
6133 sme_debug("LFR runtime successfully cleared roam scan cache");
6134 specific_channel_info =
6135 &neighbor_roam_info->cfgParams.specific_chan_info;
6136 csr_flush_cfg_bg_scan_roam_channel_list(specific_channel_info);
Abhishek Ambure6523bc72019-12-02 19:40:53 +05306137 if (mac->mlme_cfg->lfr.roam_scan_offload_enabled) {
6138 /** Clear the static channel in FW by REASON_FLUSH_CHANNEL_LIST
6139 * and then append channel list with dynamic channels in the FW
6140 * using REASON_CHANNEL_LIST_CHANGED.
6141 */
Abhinav Kumar523ca372019-08-30 16:28:19 +05306142 csr_roam_update_cfg(mac, sessionId,
6143 REASON_FLUSH_CHANNEL_LIST);
Abhishek Ambure6523bc72019-12-02 19:40:53 +05306144
6145 csr_roam_update_cfg(mac, sessionId,
6146 REASON_CHANNEL_LIST_CHANGED);
6147 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006148 }
Srinivas Dasarib78334d2019-08-12 12:25:37 +05306149 mac->roam.configParam.nRoamScanControl = roamScanControl;
6150 sme_release_global_lock(&mac->sme);
6151
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006152 return status;
6153}
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006154
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306155/*
6156 * sme_update_is_fast_roam_ini_feature_enabled() - enable/disable LFR
6157 * support at runtime
6158 * It is used at in the REG_DYNAMIC_VARIABLE macro definition of
6159 * isFastRoamIniFeatureEnabled.
6160 * This is a synchronous call
6161 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08006162 * mac_handle - The handle returned by mac_open.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306163 * sessionId - Session Identifier
6164 * Return QDF_STATUS_SUCCESS - SME update isFastRoamIniFeatureEnabled config
6165 * successfully.
6166 * Other status means SME is failed to update isFastRoamIniFeatureEnabled.
6167 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08006168QDF_STATUS sme_update_is_fast_roam_ini_feature_enabled(mac_handle_t mac_handle,
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306169 uint8_t sessionId, const bool isFastRoamIniFeatureEnabled)
6170{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08006171 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006172
Wu Gao51a63562018-11-08 16:29:10 +08006173 if (mac->mlme_cfg->lfr.lfr_enabled ==
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006174 isFastRoamIniFeatureEnabled) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05306175 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006176 "%s: FastRoam is already enabled or disabled, nothing to do (returning) old(%d) new(%d)",
6177 __func__,
Wu Gao51a63562018-11-08 16:29:10 +08006178 mac->mlme_cfg->lfr.lfr_enabled,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006179 isFastRoamIniFeatureEnabled);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306180 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006181 }
6182
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05306183 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006184 "%s: FastRoamEnabled is changed from %d to %d", __func__,
Wu Gao51a63562018-11-08 16:29:10 +08006185 mac->mlme_cfg->lfr.lfr_enabled,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006186 isFastRoamIniFeatureEnabled);
Wu Gao51a63562018-11-08 16:29:10 +08006187 mac->mlme_cfg->lfr.lfr_enabled = isFastRoamIniFeatureEnabled;
Jeff Johnson01f2c232018-11-21 19:17:44 -08006188 csr_neighbor_roam_update_fast_roaming_enabled(mac, sessionId,
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306189 isFastRoamIniFeatureEnabled);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006190
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306191 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006192}
6193
Mukul Sharma69c44cd2016-09-12 18:33:57 +05306194/**
6195 * sme_config_fast_roaming() - enable/disable LFR support at runtime
Jeff Johnsonc7309062018-11-09 20:59:42 -08006196 * @mac_handle - The handle returned by macOpen.
Mukul Sharma69c44cd2016-09-12 18:33:57 +05306197 * @session_id - Session Identifier
6198 * @is_fast_roam_enabled - flag to enable/disable roaming
6199 *
6200 * When Supplicant issues enabled/disable fast roaming on the basis
6201 * of the Bssid modification in network block (e.g. AutoJoin mode N/W block)
6202 *
6203 * Return: QDF_STATUS
6204 */
6205
Jeff Johnsonc7309062018-11-09 20:59:42 -08006206QDF_STATUS sme_config_fast_roaming(mac_handle_t mac_handle, uint8_t session_id,
Mukul Sharma69c44cd2016-09-12 18:33:57 +05306207 const bool is_fast_roam_enabled)
6208{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08006209 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Abhinav Kumar523ca372019-08-30 16:28:19 +05306210 enum roam_offload_state state;
Mukul Sharma69c44cd2016-09-12 18:33:57 +05306211 QDF_STATUS status;
6212
Varun Reddy Yeturue5a35d12017-10-20 11:26:57 -07006213 /*
Abhinav Kumar523ca372019-08-30 16:28:19 +05306214 * supplicant_disabled_roaming flag is altered when supplicant sends
6215 * vendor command to enable/disable roaming after association.
Arif Hussaina48a9c02017-01-31 14:37:45 -08006216 *
6217 * This request from wpa_supplicant will be skipped in this function
Varun Reddy Yeturue5a35d12017-10-20 11:26:57 -07006218 * if roaming is disabled using driver command or INI and
6219 * supplicant_disabled_roaming flag remains set. So make sure to set
6220 * supplicant_disabled_roaming flag as per wpa_supplicant even if roam
6221 * request from wpa_supplicant ignored.
Arif Hussaina48a9c02017-01-31 14:37:45 -08006222 */
Wu Gao51a63562018-11-08 16:29:10 +08006223 if (!mac_ctx->mlme_cfg->lfr.lfr_enabled) {
Abhinav Kumar523ca372019-08-30 16:28:19 +05306224 sme_debug("ROAM: Fast roam is disabled through ini");
Mukul Sharma69c44cd2016-09-12 18:33:57 +05306225 if (!is_fast_roam_enabled)
6226 return QDF_STATUS_SUCCESS;
6227 return QDF_STATUS_E_FAILURE;
6228 }
Sreelakshmi Konamkibda5bbf2016-09-12 18:38:10 +05306229
Abhinav Kumar523ca372019-08-30 16:28:19 +05306230 mlme_set_supplicant_disabled_roaming(mac_ctx->psoc, session_id,
6231 !is_fast_roam_enabled);
6232
6233 state = (is_fast_roam_enabled) ? ROAM_RSO_STARTED : ROAM_RSO_STOPPED;
6234 status = csr_post_roam_state_change(mac_ctx, session_id, state,
6235 REASON_SUPPLICANT_DISABLED_ROAMING);
Mukul Sharma69c44cd2016-09-12 18:33:57 +05306236 if (!QDF_IS_STATUS_SUCCESS(status)) {
Abhinav Kumar523ca372019-08-30 16:28:19 +05306237 sme_err("ROAM: update fast roaming failed. status: %d", status);
Mukul Sharma69c44cd2016-09-12 18:33:57 +05306238 return QDF_STATUS_E_FAILURE;
6239 }
6240
6241 return QDF_STATUS_SUCCESS;
6242}
6243
Kiran Kumar Lokere7d6e4c92018-09-19 13:45:47 -07006244#ifdef FEATURE_WLAN_ESE
6245int sme_add_key_krk(mac_handle_t mac_handle, uint8_t session_id,
6246 const uint8_t *key, const int key_len)
6247{
6248 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
6249 struct csr_roam_session *session;
6250
6251 if (key_len < SIR_KRK_KEY_LEN) {
6252 sme_warn("Invalid KRK keylength [= %d]", key_len);
6253 return -EINVAL;
6254 }
6255
6256 if (!CSR_IS_SESSION_VALID(mac_ctx, session_id)) {
6257 sme_err("incorrect session/vdev ID");
6258 return -EINVAL;
6259 }
6260
6261 session = CSR_GET_SESSION(mac_ctx, session_id);
6262
6263 qdf_mem_copy(session->eseCckmInfo.krk, key, SIR_KRK_KEY_LEN);
6264 session->eseCckmInfo.reassoc_req_num = 1;
6265 session->eseCckmInfo.krk_plumbed = true;
6266
6267 return 0;
6268}
Pragaspathi Thilagaraj974c27e2019-03-02 22:26:05 +05306269#endif
Kiran Kumar Lokere7d6e4c92018-09-19 13:45:47 -07006270
Pragaspathi Thilagaraj974c27e2019-03-02 22:26:05 +05306271#if defined(FEATURE_WLAN_ESE) && defined(WLAN_FEATURE_ROAM_OFFLOAD)
Kiran Kumar Lokere7d6e4c92018-09-19 13:45:47 -07006272int sme_add_key_btk(mac_handle_t mac_handle, uint8_t session_id,
6273 const uint8_t *key, const int key_len)
6274{
6275 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
6276 struct csr_roam_session *session;
6277
6278 if (key_len < SIR_BTK_KEY_LEN) {
6279 sme_warn("Invalid BTK keylength [= %d]", key_len);
6280 return -EINVAL;
6281 }
6282
6283 if (!CSR_IS_SESSION_VALID(mac_ctx, session_id)) {
6284 sme_err("incorrect session/vdev ID");
6285 return -EINVAL;
6286 }
6287
6288 session = CSR_GET_SESSION(mac_ctx, session_id);
6289
6290 qdf_mem_copy(session->eseCckmInfo.btk, key, SIR_BTK_KEY_LEN);
6291 /*
6292 * KRK and BTK are updated by upper layer back to back. Send
6293 * updated KRK and BTK together to FW here.
6294 */
Abhinav Kumar523ca372019-08-30 16:28:19 +05306295 csr_roam_update_cfg(mac_ctx, session_id, REASON_ROAM_PSK_PMK_CHANGED);
Kiran Kumar Lokere7d6e4c92018-09-19 13:45:47 -07006296
6297 return 0;
6298}
6299#endif
6300
Varun Reddy Yeturu66899fe2017-07-11 14:00:12 -07006301/**
6302 * sme_stop_roaming() - Stop roaming for a given sessionId
6303 * This is a synchronous call
6304 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08006305 * @mac_handle - The handle returned by mac_open
Varun Reddy Yeturu66899fe2017-07-11 14:00:12 -07006306 * @sessionId - Session Identifier
6307 *
6308 * Return QDF_STATUS_SUCCESS on success
6309 * Other status on failure
6310 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08006311QDF_STATUS sme_stop_roaming(mac_handle_t mac_handle, uint8_t session_id,
Abhinav Kumar523ca372019-08-30 16:28:19 +05306312 uint8_t reason, uint32_t requestor)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006313{
Jeff Johnsonc09caa42018-06-07 22:58:55 -07006314 QDF_STATUS status;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08006315 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Varun Reddy Yeturue5a35d12017-10-20 11:26:57 -07006316 struct csr_roam_session *session;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006317
Varun Reddy Yeturue5a35d12017-10-20 11:26:57 -07006318 session = CSR_GET_SESSION(mac_ctx, session_id);
Abhishek Singh1f217ec2017-12-22 11:48:27 +05306319
Abhinav Kumar523ca372019-08-30 16:28:19 +05306320 if (!session) {
6321 sme_err("ROAM: incorrect vdev ID %d", session_id);
6322 return QDF_STATUS_E_FAILURE;
Padma, Santhosh Kumar86747ec2018-05-29 18:28:29 +05306323 }
6324
Abhinav Kumar523ca372019-08-30 16:28:19 +05306325 if (reason == REASON_DRIVER_DISABLED && requestor) {
6326 mlme_set_operations_bitmap(mac_ctx->psoc, session_id, requestor,
6327 false);
Varun Reddy Yeturue5a35d12017-10-20 11:26:57 -07006328 }
Naveen Rawat5c35ae42017-04-18 15:35:07 -07006329
Abhinav Kumar523ca372019-08-30 16:28:19 +05306330 status = csr_post_roam_state_change(mac_ctx, session_id,
6331 ROAM_RSO_STOPPED,
6332 REASON_DRIVER_DISABLED);
Naveen Rawat5c35ae42017-04-18 15:35:07 -07006333
Abhinav Kumar523ca372019-08-30 16:28:19 +05306334 return status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006335}
6336
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306337/*
6338 * sme_start_roaming() - Start roaming for a given sessionId
6339 * This is a synchronous call
6340 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08006341 * mac_handle - The handle returned by mac_open
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306342 * sessionId - Session Identifier
6343 * Return QDF_STATUS_SUCCESS on success
6344 * Other status on failure
6345 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08006346QDF_STATUS sme_start_roaming(mac_handle_t mac_handle, uint8_t sessionId,
Abhinav Kumar523ca372019-08-30 16:28:19 +05306347 uint8_t reason, uint32_t requestor)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006348{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08006349 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306350 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006351
Abhinav Kumar523ca372019-08-30 16:28:19 +05306352 if (reason == REASON_DRIVER_ENABLED && requestor) {
6353 mlme_set_operations_bitmap(mac->psoc, sessionId, requestor,
6354 true);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006355 }
6356
Abhinav Kumar523ca372019-08-30 16:28:19 +05306357 status = sme_acquire_global_lock(&mac->sme);
6358
6359 if (QDF_IS_STATUS_ERROR(status))
6360 return QDF_STATUS_E_FAILURE;
6361
6362 status = csr_post_roam_state_change(mac, sessionId, ROAM_RSO_STARTED,
6363 REASON_DRIVER_ENABLED);
6364
6365 sme_release_global_lock(&mac->sme);
6366
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006367 return status;
6368}
6369
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306370/*
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306371 * sme_set_roam_opportunistic_scan_threshold_diff() -
6372 * Update Opportunistic Scan threshold diff
6373 * This function is called through dynamic setConfig callback function
6374 * to configure nOpportunisticThresholdDiff
6375 *
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -08006376 * mac_handle: Opaque handle to the global MAC context
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306377 * sessionId - Session Identifier
6378 * nOpportunisticThresholdDiff - Opportunistic Scan threshold diff
6379 * Return QDF_STATUS_SUCCESS - SME update nOpportunisticThresholdDiff config
6380 * successfully.
6381 * else SME is failed to update nOpportunisticThresholdDiff.
6382 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08006383QDF_STATUS sme_set_roam_opportunistic_scan_threshold_diff(
6384 mac_handle_t mac_handle,
6385 uint8_t sessionId,
6386 const uint8_t nOpportunisticThresholdDiff)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006387{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08006388 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306389 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006390
Jeff Johnson01f2c232018-11-21 19:17:44 -08006391 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306392 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08006393 status = csr_neighbor_roam_update_config(mac, sessionId,
Varun Reddy Yeturuff4feb02016-04-20 12:26:11 -07006394 nOpportunisticThresholdDiff,
6395 REASON_OPPORTUNISTIC_THRESH_DIFF_CHANGED);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306396 if (QDF_IS_STATUS_SUCCESS(status)) {
Wu Gao51a63562018-11-08 16:29:10 +08006397 mac->mlme_cfg->lfr.opportunistic_scan_threshold_diff =
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006398 nOpportunisticThresholdDiff;
6399 }
Jeff Johnson01f2c232018-11-21 19:17:44 -08006400 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006401 }
6402 return status;
6403}
6404
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306405/*
6406 * sme_get_roam_opportunistic_scan_threshold_diff()
6407 * gets Opportunistic Scan threshold diff
6408 * This is a synchronous call
6409 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08006410 * mac_handle - The handle returned by mac_open
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306411 * Return uint8_t - nOpportunisticThresholdDiff
6412 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08006413uint8_t sme_get_roam_opportunistic_scan_threshold_diff(mac_handle_t mac_handle)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006414{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08006415 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306416
Wu Gao51a63562018-11-08 16:29:10 +08006417 return mac->mlme_cfg->lfr.opportunistic_scan_threshold_diff;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006418}
6419
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306420/*
6421 * sme_set_roam_rescan_rssi_diff() - Update roam rescan rssi diff
6422 * This function is called through dynamic setConfig callback function
6423 * to configure nRoamRescanRssiDiff
6424 *
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -08006425 * mac_handle: Opaque handle to the global MAC context
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306426 * sessionId - Session Identifier
6427 * nRoamRescanRssiDiff - roam rescan rssi diff
6428 * Return QDF_STATUS_SUCCESS - SME update nRoamRescanRssiDiff config
6429 * successfully.
6430 * else SME is failed to update nRoamRescanRssiDiff.
6431 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08006432QDF_STATUS sme_set_roam_rescan_rssi_diff(mac_handle_t mac_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006433 uint8_t sessionId,
6434 const uint8_t nRoamRescanRssiDiff)
6435{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08006436 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306437 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006438
Jeff Johnson01f2c232018-11-21 19:17:44 -08006439 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306440 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08006441 status = csr_neighbor_roam_update_config(mac, sessionId,
Varun Reddy Yeturuff4feb02016-04-20 12:26:11 -07006442 nRoamRescanRssiDiff,
6443 REASON_ROAM_RESCAN_RSSI_DIFF_CHANGED);
Wu Gao51a63562018-11-08 16:29:10 +08006444 if (QDF_IS_STATUS_SUCCESS(status))
6445 mac->mlme_cfg->lfr.roam_rescan_rssi_diff =
6446 nRoamRescanRssiDiff;
6447
Jeff Johnson01f2c232018-11-21 19:17:44 -08006448 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006449 }
6450 return status;
6451}
6452
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306453/*
6454 * sme_get_roam_rescan_rssi_diff()
6455 * gets roam rescan rssi diff
6456 * This is a synchronous call
6457 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08006458 * mac_handle - The handle returned by mac_open
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306459 * Return int8_t - nRoamRescanRssiDiff
6460 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08006461uint8_t sme_get_roam_rescan_rssi_diff(mac_handle_t mac_handle)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006462{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08006463 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306464
Wu Gao51a63562018-11-08 16:29:10 +08006465 return mac->mlme_cfg->lfr.roam_rescan_rssi_diff;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006466}
6467
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306468/*
6469 * sme_set_roam_bmiss_first_bcnt() -
6470 * Update Roam count for first beacon miss
6471 * This function is called through dynamic setConfig callback function
6472 * to configure nRoamBmissFirstBcnt
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -08006473 * mac_handle: Opaque handle to the global MAC context
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306474 * sessionId - Session Identifier
6475 * nRoamBmissFirstBcnt - Roam first bmiss count
6476 * Return QDF_STATUS_SUCCESS - SME update nRoamBmissFirstBcnt
6477 * successfully.
6478 * else SME is failed to update nRoamBmissFirstBcnt
6479 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08006480QDF_STATUS sme_set_roam_bmiss_first_bcnt(mac_handle_t mac_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006481 uint8_t sessionId,
6482 const uint8_t nRoamBmissFirstBcnt)
6483{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08006484 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306485 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006486
Jeff Johnson01f2c232018-11-21 19:17:44 -08006487 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306488 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08006489 status = csr_neighbor_roam_update_config(mac, sessionId,
Varun Reddy Yeturuff4feb02016-04-20 12:26:11 -07006490 nRoamBmissFirstBcnt,
6491 REASON_ROAM_BMISS_FIRST_BCNT_CHANGED);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306492 if (QDF_IS_STATUS_SUCCESS(status)) {
Wu Gao51a63562018-11-08 16:29:10 +08006493 mac->mlme_cfg->lfr.roam_bmiss_first_bcnt =
6494 nRoamBmissFirstBcnt;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006495 }
Jeff Johnson01f2c232018-11-21 19:17:44 -08006496 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006497 }
6498 return status;
6499}
6500
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306501/*
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306502 * sme_set_roam_bmiss_final_bcnt() -
6503 * Update Roam count for final beacon miss
6504 * This function is called through dynamic setConfig callback function
6505 * to configure nRoamBmissFinalBcnt
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -08006506 * mac_handle: Opaque handle to the global MAC context
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306507 * sessionId - Session Identifier
6508 * nRoamBmissFinalBcnt - Roam final bmiss count
6509 * Return QDF_STATUS_SUCCESS - SME update nRoamBmissFinalBcnt
6510 * successfully.
6511 * else SME is failed to update nRoamBmissFinalBcnt
6512 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08006513QDF_STATUS sme_set_roam_bmiss_final_bcnt(mac_handle_t mac_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006514 uint8_t sessionId,
6515 const uint8_t nRoamBmissFinalBcnt)
6516{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08006517 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306518 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006519
Jeff Johnson01f2c232018-11-21 19:17:44 -08006520 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306521 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08006522 status = csr_neighbor_roam_update_config(mac, sessionId,
Varun Reddy Yeturuff4feb02016-04-20 12:26:11 -07006523 nRoamBmissFinalBcnt,
6524 REASON_ROAM_BMISS_FINAL_BCNT_CHANGED);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306525 if (QDF_IS_STATUS_SUCCESS(status)) {
Wu Gao51a63562018-11-08 16:29:10 +08006526 mac->mlme_cfg->lfr.roam_bmiss_final_bcnt =
6527 nRoamBmissFinalBcnt;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006528 }
Jeff Johnson01f2c232018-11-21 19:17:44 -08006529 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006530 }
6531 return status;
6532}
6533
Srinivas Dasari9249a982019-09-16 14:56:27 +05306534QDF_STATUS
6535sme_set_neighbor_lookup_rssi_threshold(mac_handle_t mac_handle,
6536 uint8_t vdev_id,
6537 uint8_t neighbor_lookup_rssi_threshold)
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306538{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08006539 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Srinivas Dasari9249a982019-09-16 14:56:27 +05306540 QDF_STATUS status;
6541
6542 if (vdev_id >= WLAN_MAX_VDEVS) {
6543 sme_err("Invalid vdev_id: %u", vdev_id);
6544 return QDF_STATUS_E_INVAL;
6545 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006546
Jeff Johnson01f2c232018-11-21 19:17:44 -08006547 status = sme_acquire_global_lock(&mac->sme);
Srinivas Dasari9249a982019-09-16 14:56:27 +05306548 if (QDF_IS_STATUS_ERROR(status))
6549 return status;
6550 csr_neighbor_roam_update_config(mac, vdev_id,
6551 neighbor_lookup_rssi_threshold,
6552 REASON_LOOKUP_THRESH_CHANGED);
6553 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006554 return status;
6555}
6556
Srinivas Dasari9249a982019-09-16 14:56:27 +05306557QDF_STATUS sme_get_neighbor_lookup_rssi_threshold(mac_handle_t mac_handle,
6558 uint8_t vdev_id,
6559 uint8_t *lookup_threshold)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006560{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08006561 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Srinivas Dasari9249a982019-09-16 14:56:27 +05306562 tCsrNeighborRoamControlInfo *neighbor_roam_info;
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306563
Srinivas Dasari9249a982019-09-16 14:56:27 +05306564 if (vdev_id >= WLAN_MAX_VDEVS) {
6565 sme_err("Invalid vdev_id: %d", vdev_id);
6566 return QDF_STATUS_E_INVAL;
6567 }
6568 neighbor_roam_info = &mac->roam.neighborRoamInfo[vdev_id];
6569
6570 *lookup_threshold =
6571 neighbor_roam_info->cfgParams.neighborLookupThreshold;
6572
6573 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006574}
6575
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306576/*
6577 * sme_set_neighbor_scan_refresh_period() - set neighbor scan results
6578 * refresh period
6579 * This is a synchronous call
6580 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08006581 * mac_handle - The handle returned by mac_open.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306582 * sessionId - Session Identifier
6583 * Return QDF_STATUS_SUCCESS - SME update config successful.
6584 * Other status means SME is failed to update
6585 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08006586QDF_STATUS sme_set_neighbor_scan_refresh_period(mac_handle_t mac_handle,
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306587 uint8_t sessionId, uint16_t neighborScanResultsRefreshPeriod)
6588{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08006589 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306590 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006591 tpCsrNeighborRoamControlInfo pNeighborRoamInfo = NULL;
6592
Dustin Brownad06be62019-02-04 14:52:56 -08006593 if (sessionId >= WLAN_MAX_VDEVS) {
Naveen Rawatc36f7eb2016-11-10 20:01:03 -08006594 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
6595 FL("Invalid sme session id: %d"), sessionId);
6596 return QDF_STATUS_E_INVAL;
6597 }
6598
Jeff Johnson01f2c232018-11-21 19:17:44 -08006599 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306600 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08006601 pNeighborRoamInfo = &mac->roam.neighborRoamInfo[sessionId];
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05306602 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006603 "LFR runtime successfully set roam scan refresh period to %d- old value is %d - roam state is %s",
6604 neighborScanResultsRefreshPeriod,
Wu Gao51a63562018-11-08 16:29:10 +08006605 mac->mlme_cfg->lfr.
6606 neighbor_scan_results_refresh_period,
Jeff Johnson01f2c232018-11-21 19:17:44 -08006607 mac_trace_get_neighbour_roam_state(mac->roam.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006608 neighborRoamInfo
6609 [sessionId].
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306610 neighborRoamState));
Wu Gao51a63562018-11-08 16:29:10 +08006611 mac->mlme_cfg->lfr.neighbor_scan_results_refresh_period =
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006612 neighborScanResultsRefreshPeriod;
6613 pNeighborRoamInfo->cfgParams.neighborResultsRefreshPeriod =
6614 neighborScanResultsRefreshPeriod;
6615
Abhinav Kumar523ca372019-08-30 16:28:19 +05306616 if (mac->mlme_cfg->lfr.roam_scan_offload_enabled)
6617 csr_roam_update_cfg(mac, sessionId,
6618 REASON_NEIGHBOR_SCAN_REFRESH_PERIOD_CHANGED);
6619
Jeff Johnson01f2c232018-11-21 19:17:44 -08006620 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006621 }
Vignesh Viswanathan4e65e8e2018-05-01 12:04:16 +05306622
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006623 return status;
6624}
6625
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306626/*
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306627 * sme_get_neighbor_scan_refresh_period() - get neighbor scan results
6628 * refresh period
6629 * This is a synchronous call
6630 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08006631 * \param mac_handle - The handle returned by mac_open.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306632 * \return uint16_t - Neighbor scan results refresh period value
6633 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08006634uint16_t sme_get_neighbor_scan_refresh_period(mac_handle_t mac_handle)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006635{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08006636 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306637
Wu Gao51a63562018-11-08 16:29:10 +08006638 return mac->mlme_cfg->lfr.neighbor_scan_results_refresh_period;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006639}
6640
Srinivas Dasari240d3272019-09-20 12:00:57 +05306641uint16_t sme_get_empty_scan_refresh_period_global(mac_handle_t mac_handle)
6642{
6643 struct mac_context *mac = MAC_CONTEXT(mac_handle);
6644
6645 return mac->mlme_cfg->lfr.empty_scan_refresh_period;
6646}
6647
Srinivas Dasari456aa702019-09-17 14:19:50 +05306648QDF_STATUS sme_get_empty_scan_refresh_period(mac_handle_t mac_handle,
6649 uint8_t vdev_id,
6650 uint16_t *refresh_threshold)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006651{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08006652 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Srinivas Dasari456aa702019-09-17 14:19:50 +05306653 tCsrNeighborRoamControlInfo *neighbor_roam_info;
6654 QDF_STATUS status;
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306655
Srinivas Dasari456aa702019-09-17 14:19:50 +05306656 if (vdev_id >= WLAN_MAX_VDEVS) {
6657 sme_err("Invalid vdev_id: %d", vdev_id);
6658 return QDF_STATUS_E_INVAL;
6659 }
6660 status = sme_acquire_global_lock(&mac->sme);
6661 if (QDF_IS_STATUS_ERROR(status))
6662 return status;
6663 neighbor_roam_info = &mac->roam.neighborRoamInfo[vdev_id];
6664
6665 *refresh_threshold =
6666 neighbor_roam_info->cfgParams.emptyScanRefreshPeriod;
6667 sme_release_global_lock(&mac->sme);
6668
6669 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006670}
6671
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306672/*
6673 * sme_update_empty_scan_refresh_period
Jeff Johnson96259452019-02-26 20:38:17 -08006674 * Update empty_scan_refresh_period
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306675 * This function is called through dynamic setConfig callback function
Jeff Johnson96259452019-02-26 20:38:17 -08006676 * to configure empty_scan_refresh_period
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306677 * Usage: adb shell iwpriv wlan0 setConfig
Jeff Johnson96259452019-02-26 20:38:17 -08006678 * empty_scan_refresh_period=[0 .. 60]
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306679 *
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -08006680 * mac_handle: Opaque handle to the global MAC context
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306681 * sessionId - Session Identifier
Jeff Johnson96259452019-02-26 20:38:17 -08006682 * empty_scan_refresh_period - scan period following empty scan results.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306683 * Return Success or failure
6684 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006685
Jeff Johnsonb460dd72018-11-08 10:26:51 -08006686QDF_STATUS sme_update_empty_scan_refresh_period(mac_handle_t mac_handle,
6687 uint8_t sessionId, uint16_t
Jeff Johnson96259452019-02-26 20:38:17 -08006688 empty_scan_refresh_period)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006689{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08006690 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306691 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006692 tpCsrNeighborRoamControlInfo pNeighborRoamInfo = NULL;
6693
Dustin Brownad06be62019-02-04 14:52:56 -08006694 if (sessionId >= WLAN_MAX_VDEVS) {
Naveen Rawatc36f7eb2016-11-10 20:01:03 -08006695 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
6696 FL("Invalid sme session id: %d"), sessionId);
6697 return QDF_STATUS_E_INVAL;
6698 }
6699
Jeff Johnson01f2c232018-11-21 19:17:44 -08006700 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306701 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08006702 pNeighborRoamInfo = &mac->roam.neighborRoamInfo[sessionId];
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05306703 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006704 "LFR runtime successfully set roam scan period to %d -old value is %d - roam state is %s",
Jeff Johnson96259452019-02-26 20:38:17 -08006705 empty_scan_refresh_period,
Srinivas Dasari456aa702019-09-17 14:19:50 +05306706 pNeighborRoamInfo->cfgParams.emptyScanRefreshPeriod,
Jeff Johnson01f2c232018-11-21 19:17:44 -08006707 mac_trace_get_neighbour_roam_state(mac->roam.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006708 neighborRoamInfo
6709 [sessionId].
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306710 neighborRoamState));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006711 pNeighborRoamInfo->cfgParams.emptyScanRefreshPeriod =
Jeff Johnson96259452019-02-26 20:38:17 -08006712 empty_scan_refresh_period;
Vignesh Viswanathan4e65e8e2018-05-01 12:04:16 +05306713
Abhinav Kumar523ca372019-08-30 16:28:19 +05306714 if (mac->mlme_cfg->lfr.roam_scan_offload_enabled)
6715 csr_roam_update_cfg(mac, sessionId,
6716 REASON_EMPTY_SCAN_REF_PERIOD_CHANGED);
6717
Jeff Johnson01f2c232018-11-21 19:17:44 -08006718 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006719 }
Vignesh Viswanathan4e65e8e2018-05-01 12:04:16 +05306720
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006721 return status;
6722}
6723
Srinivas Dasari0628e842019-08-22 01:17:38 +05306724QDF_STATUS sme_update_full_roam_scan_period(mac_handle_t mac_handle,
6725 uint8_t vdev_id,
6726 uint32_t full_roam_scan_period)
6727{
6728 struct mac_context *mac = MAC_CONTEXT(mac_handle);
6729 QDF_STATUS status;
6730 tpCsrNeighborRoamControlInfo neighbor_roam_info;
6731
6732 if (vdev_id >= WLAN_MAX_VDEVS) {
6733 sme_err("Invalid vdev_id: %d", vdev_id);
6734 return QDF_STATUS_E_INVAL;
6735 }
6736
6737 status = sme_acquire_global_lock(&mac->sme);
6738 if (QDF_IS_STATUS_ERROR(status))
6739 return status;
6740
6741 neighbor_roam_info = &mac->roam.neighborRoamInfo[vdev_id];
6742 sme_debug("LFR runtime successfully set full roam scan period to %d -old value is %d - roam state is %s",
6743 full_roam_scan_period,
6744 neighbor_roam_info->cfgParams.full_roam_scan_period,
6745 mac_trace_get_neighbour_roam_state(
6746 neighbor_roam_info->neighborRoamState));
6747 neighbor_roam_info->cfgParams.full_roam_scan_period =
6748 full_roam_scan_period;
Abhinav Kumar523ca372019-08-30 16:28:19 +05306749 if (mac->mlme_cfg->lfr.roam_scan_offload_enabled)
6750 csr_roam_update_cfg(mac, vdev_id,
6751 REASON_ROAM_FULL_SCAN_PERIOD_CHANGED);
6752
Srinivas Dasari0628e842019-08-22 01:17:38 +05306753 sme_release_global_lock(&mac->sme);
6754
6755 return status;
6756}
6757
Srinivas Dasari5fb81902019-08-22 01:39:42 +05306758QDF_STATUS
6759sme_modify_roam_cand_sel_criteria(mac_handle_t mac_handle,
6760 uint8_t vdev_id,
6761 bool enable_scoring_for_roam)
6762{
6763 struct mac_context *mac = MAC_CONTEXT(mac_handle);
6764 QDF_STATUS status;
6765 tpCsrNeighborRoamControlInfo neighbor_roam_info;
6766
6767 if (vdev_id >= WLAN_MAX_VDEVS) {
6768 sme_err("Invalid vdev_id: %d", vdev_id);
6769 return QDF_STATUS_E_INVAL;
6770 }
6771
6772 status = sme_acquire_global_lock(&mac->sme);
6773 if (QDF_IS_STATUS_ERROR(status))
6774 return status;
6775
6776 if (!mac->mlme_cfg->lfr.roam_scan_offload_enabled) {
6777 status = QDF_STATUS_E_INVAL;
6778 goto out;
6779 }
6780
6781 neighbor_roam_info = &mac->roam.neighborRoamInfo[vdev_id];
6782 neighbor_roam_info->cfgParams.enable_scoring_for_roam =
6783 enable_scoring_for_roam;
Abhinav Kumar523ca372019-08-30 16:28:19 +05306784 status = csr_roam_update_cfg(mac, vdev_id,
6785 REASON_SCORING_CRITERIA_CHANGED);
Srinivas Dasari5fb81902019-08-22 01:39:42 +05306786out:
6787 sme_release_global_lock(&mac->sme);
6788
6789 return status;
6790}
6791
Srinivas Dasari1ec74522019-09-19 14:16:29 +05306792/**
6793 * sme_restore_default_roaming_params() - Restore neighbor roam config
6794 * @mac: mac context
6795 * @roam_info: Neighbor roam info pointer to be populated
6796 *
6797 * Restore neighbor roam info request params with lfr config params
6798 *
6799 * Return: None
6800 */
6801static void
6802sme_restore_default_roaming_params(struct mac_context *mac,
6803 tCsrNeighborRoamControlInfo *roam_info)
6804{
6805 sme_debug("%s default roam scoring",
6806 mac->mlme_cfg->scoring.enable_scoring_for_roam ?
6807 "Enable" : "Disable");
6808
6809 roam_info->cfgParams.enable_scoring_for_roam =
6810 mac->mlme_cfg->scoring.enable_scoring_for_roam;
6811 roam_info->cfgParams.emptyScanRefreshPeriod =
6812 mac->mlme_cfg->lfr.empty_scan_refresh_period;
6813 roam_info->cfgParams.full_roam_scan_period =
6814 mac->mlme_cfg->lfr.roam_full_scan_period;
6815 roam_info->cfgParams.maxChannelScanTime =
6816 mac->mlme_cfg->lfr.neighbor_scan_max_chan_time;
6817 roam_info->cfgParams.neighborScanPeriod =
6818 mac->mlme_cfg->lfr.neighbor_scan_timer_period;
6819 roam_info->cfgParams.neighborLookupThreshold =
6820 mac->mlme_cfg->lfr.neighbor_lookup_rssi_threshold;
6821 roam_info->cfgParams.roam_rssi_diff =
6822 mac->mlme_cfg->lfr.roam_rssi_diff;
6823 roam_info->cfgParams.maxChannelScanTime =
6824 mac->mlme_cfg->lfr.neighbor_scan_max_chan_time;
6825 roam_info->cfgParams.roam_scan_home_away_time =
6826 mac->mlme_cfg->lfr.roam_scan_home_away_time;
6827 roam_info->cfgParams.roam_scan_n_probes =
6828 mac->mlme_cfg->lfr.roam_scan_n_probes;
Srinivas Dasari3a769ca2019-09-18 00:00:49 +05306829 roam_info->cfgParams.roam_scan_inactivity_time =
6830 mac->mlme_cfg->lfr.roam_scan_inactivity_time;
6831 roam_info->cfgParams.roam_inactive_data_packet_count =
6832 mac->mlme_cfg->lfr.roam_inactive_data_packet_count;
6833 roam_info->cfgParams.roam_scan_period_after_inactivity =
6834 mac->mlme_cfg->lfr.roam_scan_period_after_inactivity;
Srinivas Dasari1ec74522019-09-19 14:16:29 +05306835}
6836
Srinivas Dasarib6798ec2019-08-21 12:07:22 +05306837QDF_STATUS sme_roam_control_restore_default_config(mac_handle_t mac_handle,
6838 uint8_t vdev_id)
6839{
6840 struct mac_context *mac = MAC_CONTEXT(mac_handle);
6841 QDF_STATUS status;
6842 tpCsrNeighborRoamControlInfo neighbor_roam_info;
Srinivas Dasari1ec74522019-09-19 14:16:29 +05306843 tCsrChannelInfo *chan_info;
Srinivas Dasarib6798ec2019-08-21 12:07:22 +05306844
6845 if (vdev_id >= WLAN_MAX_VDEVS) {
6846 sme_err("Invalid vdev_id: %d", vdev_id);
6847 return QDF_STATUS_E_INVAL;
6848 }
6849
6850 status = sme_acquire_global_lock(&mac->sme);
6851 if (QDF_IS_STATUS_ERROR(status))
6852 return status;
6853
6854 if (!mac->mlme_cfg->lfr.roam_scan_offload_enabled) {
6855 sme_err("roam_scan_offload_enabled is not supported");
6856 status = QDF_STATUS_E_INVAL;
6857 goto out;
6858 }
6859
Srinivas Dasari1ec74522019-09-19 14:16:29 +05306860 sme_debug("Cleanup roam scan control");
6861 mac->roam.configParam.nRoamScanControl = false;
Srinivas Dasarib6798ec2019-08-21 12:07:22 +05306862
6863 neighbor_roam_info = &mac->roam.neighborRoamInfo[vdev_id];
6864
Srinivas Dasari1ec74522019-09-19 14:16:29 +05306865 sme_debug("Cleanup Preferred frequency list");
6866 chan_info = &neighbor_roam_info->cfgParams.pref_chan_info;
6867 csr_flush_cfg_bg_scan_roam_channel_list(chan_info);
Srinivas Dasarib6798ec2019-08-21 12:07:22 +05306868
Srinivas Dasari1ec74522019-09-19 14:16:29 +05306869 sme_debug("Cleanup specific frequency list");
6870 chan_info = &neighbor_roam_info->cfgParams.specific_chan_info;
6871 csr_flush_cfg_bg_scan_roam_channel_list(chan_info);
Srinivas Dasarib6798ec2019-08-21 12:07:22 +05306872
Srinivas Dasari1ec74522019-09-19 14:16:29 +05306873 sme_debug("Cleanup roam control config related lfr params");
6874 mlme_reinit_control_config_lfr_params(mac->psoc, &mac->mlme_cfg->lfr);
Srinivas Dasarib6798ec2019-08-21 12:07:22 +05306875
Srinivas Dasari1ec74522019-09-19 14:16:29 +05306876 sme_restore_default_roaming_params(mac, neighbor_roam_info);
Srinivas Dasarib6798ec2019-08-21 12:07:22 +05306877
Srinivas Dasaria73e5f52020-01-08 21:33:39 +05306878 /* Flush static and dynamic channels in ROAM scan list in firmware */
6879 csr_roam_update_cfg(mac, vdev_id, REASON_FLUSH_CHANNEL_LIST);
Abhinav Kumar523ca372019-08-30 16:28:19 +05306880 csr_roam_update_cfg(mac, vdev_id, REASON_SCORING_CRITERIA_CHANGED);
Srinivas Dasaria73e5f52020-01-08 21:33:39 +05306881
Srinivas Dasarib6798ec2019-08-21 12:07:22 +05306882out:
6883 sme_release_global_lock(&mac->sme);
6884
6885 return status;
6886}
6887
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306888/*
6889 * sme_set_neighbor_scan_min_chan_time() -
6890 * Update nNeighborScanMinChanTime
6891 * This function is called through dynamic setConfig callback function
6892 * to configure gNeighborScanChannelMinTime
6893 * Usage: adb shell iwpriv wlan0 setConfig
6894 * gNeighborScanChannelMinTime=[0 .. 60]
6895 *
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -08006896 * mac_handle: Opaque handle to the global MAC context
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306897 * nNeighborScanMinChanTime - Channel minimum dwell time
6898 * sessionId - Session Identifier
6899 * Return Success or failure
6900 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08006901QDF_STATUS sme_set_neighbor_scan_min_chan_time(mac_handle_t mac_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006902 const uint16_t
6903 nNeighborScanMinChanTime,
6904 uint8_t sessionId)
6905{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08006906 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306907 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006908
Dustin Brownad06be62019-02-04 14:52:56 -08006909 if (sessionId >= WLAN_MAX_VDEVS) {
Naveen Rawatc36f7eb2016-11-10 20:01:03 -08006910 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
6911 FL("Invalid sme session id: %d"), sessionId);
6912 return QDF_STATUS_E_INVAL;
6913 }
6914
Jeff Johnson01f2c232018-11-21 19:17:44 -08006915 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306916 if (QDF_IS_STATUS_SUCCESS(status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05306917 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006918 "LFR runtime successfully set channel min dwell time to %d - old value is %d - roam state is %s",
6919 nNeighborScanMinChanTime,
Wu Gao51a63562018-11-08 16:29:10 +08006920 mac->mlme_cfg->lfr.neighbor_scan_min_chan_time,
Jeff Johnson01f2c232018-11-21 19:17:44 -08006921 mac_trace_get_neighbour_roam_state(mac->roam.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006922 neighborRoamInfo
6923 [sessionId].
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306924 neighborRoamState));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006925
Wu Gao51a63562018-11-08 16:29:10 +08006926 mac->mlme_cfg->lfr.neighbor_scan_min_chan_time =
6927 nNeighborScanMinChanTime;
Jeff Johnson01f2c232018-11-21 19:17:44 -08006928 mac->roam.neighborRoamInfo[sessionId].cfgParams.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006929 minChannelScanTime = nNeighborScanMinChanTime;
Jeff Johnson01f2c232018-11-21 19:17:44 -08006930 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006931 }
6932
6933 return status;
6934}
6935
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306936/*
6937 * sme_set_neighbor_scan_max_chan_time() -
6938 * Update nNeighborScanMaxChanTime
6939 * This function is called through dynamic setConfig callback function
6940 * to configure gNeighborScanChannelMaxTime
6941 * Usage: adb shell iwpriv wlan0 setConfig
6942 * gNeighborScanChannelMaxTime=[0 .. 60]
6943 *
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -08006944 * mac_handle: Opaque handle to the global MAC context
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306945 * sessionId - Session Identifier
6946 * nNeighborScanMinChanTime - Channel maximum dwell time
6947 * Return Success or failure
6948 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08006949QDF_STATUS sme_set_neighbor_scan_max_chan_time(mac_handle_t mac_handle,
6950 uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006951 const uint16_t
6952 nNeighborScanMaxChanTime)
6953{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08006954 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306955 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006956 tpCsrNeighborRoamControlInfo pNeighborRoamInfo = NULL;
6957
Dustin Brownad06be62019-02-04 14:52:56 -08006958 if (sessionId >= WLAN_MAX_VDEVS) {
Naveen Rawatc36f7eb2016-11-10 20:01:03 -08006959 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
6960 FL("Invalid sme session id: %d"), sessionId);
6961 return QDF_STATUS_E_INVAL;
6962 }
6963
Jeff Johnson01f2c232018-11-21 19:17:44 -08006964 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306965 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08006966 pNeighborRoamInfo = &mac->roam.neighborRoamInfo[sessionId];
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05306967 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006968 "LFR runtime successfully set channel max dwell time to %d - old value is %d - roam state is %s",
6969 nNeighborScanMaxChanTime,
Srinivas Dasarie41d01d2019-09-17 15:31:38 +05306970 pNeighborRoamInfo->cfgParams.maxChannelScanTime,
Jeff Johnson01f2c232018-11-21 19:17:44 -08006971 mac_trace_get_neighbour_roam_state(mac->roam.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006972 neighborRoamInfo
6973 [sessionId].
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306974 neighborRoamState));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006975 pNeighborRoamInfo->cfgParams.maxChannelScanTime =
6976 nNeighborScanMaxChanTime;
Abhinav Kumar523ca372019-08-30 16:28:19 +05306977 if (mac->mlme_cfg->lfr.roam_scan_offload_enabled)
6978 csr_roam_update_cfg(mac, sessionId,
6979 REASON_SCAN_CH_TIME_CHANGED);
6980
Jeff Johnson01f2c232018-11-21 19:17:44 -08006981 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006982 }
Vignesh Viswanathan4e65e8e2018-05-01 12:04:16 +05306983
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006984 return status;
6985}
6986
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306987/*
6988 * sme_get_neighbor_scan_min_chan_time() -
6989 * get neighbor scan min channel time
6990 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08006991 * mac_handle - The handle returned by mac_open.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306992 * sessionId - Session Identifier
6993 * Return uint16_t - channel min time value
6994 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08006995uint16_t sme_get_neighbor_scan_min_chan_time(mac_handle_t mac_handle,
Jeff Johnson1f2dabc2018-11-07 15:33:01 -08006996 uint8_t sessionId)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006997{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08006998 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Naveen Rawatc36f7eb2016-11-10 20:01:03 -08006999
Dustin Brownad06be62019-02-04 14:52:56 -08007000 if (sessionId >= WLAN_MAX_VDEVS) {
Naveen Rawatc36f7eb2016-11-10 20:01:03 -08007001 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
7002 FL("Invalid sme session id: %d"), sessionId);
7003 return 0;
7004 }
7005
Jeff Johnson01f2c232018-11-21 19:17:44 -08007006 return mac->roam.neighborRoamInfo[sessionId].cfgParams.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007007 minChannelScanTime;
7008}
7009
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307010/*
7011 * sme_get_neighbor_roam_state() -
7012 * get neighbor roam state
7013 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007014 * mac_handle - The handle returned by mac_open.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307015 * sessionId - Session Identifier
7016 * Return uint32_t - neighbor roam state
7017 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007018uint32_t sme_get_neighbor_roam_state(mac_handle_t mac_handle, uint8_t sessionId)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007019{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08007020 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Naveen Rawatc36f7eb2016-11-10 20:01:03 -08007021
Dustin Brownad06be62019-02-04 14:52:56 -08007022 if (sessionId >= WLAN_MAX_VDEVS) {
Naveen Rawatc36f7eb2016-11-10 20:01:03 -08007023 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
7024 FL("Invalid sme session id: %d"), sessionId);
7025 return 0;
7026 }
7027
Jeff Johnson01f2c232018-11-21 19:17:44 -08007028 return mac->roam.neighborRoamInfo[sessionId].neighborRoamState;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007029}
7030
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307031/*
7032 * sme_get_current_roam_state() -
7033 * get current roam state
7034 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007035 * mac_handle - The handle returned by mac_open.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307036 * sessionId - Session Identifier
7037 * Return uint32_t - current roam state
7038 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007039uint32_t sme_get_current_roam_state(mac_handle_t mac_handle, uint8_t sessionId)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007040{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08007041 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307042
Jeff Johnson01f2c232018-11-21 19:17:44 -08007043 return mac->roam.curState[sessionId];
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007044}
7045
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307046/*
7047 * sme_get_current_roam_sub_state() -
7048 * \brief get neighbor roam sub state
7049 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007050 * mac_handle - The handle returned by mac_open.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307051 * sessionId - Session Identifier
7052 * Return uint32_t - current roam sub state
7053 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007054uint32_t sme_get_current_roam_sub_state(mac_handle_t mac_handle,
7055 uint8_t sessionId)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007056{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08007057 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307058
Jeff Johnson01f2c232018-11-21 19:17:44 -08007059 return mac->roam.curSubState[sessionId];
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007060}
7061
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307062/*
7063 * sme_get_lim_sme_state() -
7064 * get Lim Sme state
7065 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007066 * mac_handle - The handle returned by mac_open.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307067 * Return uint32_t - Lim Sme state
7068 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007069uint32_t sme_get_lim_sme_state(mac_handle_t mac_handle)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007070{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08007071 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307072
Jeff Johnson01f2c232018-11-21 19:17:44 -08007073 return mac->lim.gLimSmeState;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007074}
7075
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307076/*
7077 * sme_get_lim_mlm_state() -
7078 * get Lim Mlm state
7079 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007080 * mac_handle - The handle returned by mac_open.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307081 * Return uint32_t - Lim Mlm state
7082 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007083uint32_t sme_get_lim_mlm_state(mac_handle_t mac_handle)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007084{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08007085 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307086
Jeff Johnson01f2c232018-11-21 19:17:44 -08007087 return mac->lim.gLimMlmState;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007088}
7089
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307090/*
7091 * sme_is_lim_session_valid() -
7092 * is Lim session valid
7093 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007094 * mac_handle - The handle returned by mac_open.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307095 * sessionId - Session Identifier
7096 * Return bool - true or false
7097 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007098bool sme_is_lim_session_valid(mac_handle_t mac_handle, uint8_t sessionId)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007099{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08007100 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Hanumantha Reddy Pothula589fd702015-11-17 15:25:16 +05307101
Jeff Johnson01f2c232018-11-21 19:17:44 -08007102 if (sessionId > mac->lim.maxBssId)
Hanumantha Reddy Pothula589fd702015-11-17 15:25:16 +05307103 return false;
7104
Jeff Johnson01f2c232018-11-21 19:17:44 -08007105 return mac->lim.gpSession[sessionId].valid;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007106}
7107
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307108/*
7109 * sme_get_lim_sme_session_state() -
7110 * get Lim Sme session state
7111 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007112 * mac_handle - The handle returned by mac_open.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307113 * sessionId - Session Identifier
7114 * Return uint32_t - Lim Sme session state
7115 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007116uint32_t sme_get_lim_sme_session_state(mac_handle_t mac_handle,
7117 uint8_t sessionId)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007118{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08007119 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307120
Jeff Johnson01f2c232018-11-21 19:17:44 -08007121 return mac->lim.gpSession[sessionId].limSmeState;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007122}
7123
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307124/*
7125 * sme_get_lim_mlm_session_state() -
7126 * \brief get Lim Mlm session state
7127 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007128 * mac_handle - The handle returned by mac_open.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307129 * sessionId - Session Identifier
7130 * Return uint32_t - Lim Mlm session state
7131 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007132uint32_t sme_get_lim_mlm_session_state(mac_handle_t mac_handle,
7133 uint8_t sessionId)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007134{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08007135 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307136
Jeff Johnson01f2c232018-11-21 19:17:44 -08007137 return mac->lim.gpSession[sessionId].limMlmState;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007138}
7139
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307140/*
7141 * sme_get_neighbor_scan_max_chan_time() -
7142 * get neighbor scan max channel time
7143 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007144 * mac_handle - The handle returned by mac_open.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307145 * sessionId - Session Identifier
7146 * Return uint16_t - channel max time value
7147 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007148uint16_t sme_get_neighbor_scan_max_chan_time(mac_handle_t mac_handle,
Jeff Johnson1f2dabc2018-11-07 15:33:01 -08007149 uint8_t sessionId)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007150{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08007151 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Naveen Rawatc36f7eb2016-11-10 20:01:03 -08007152
Dustin Brownad06be62019-02-04 14:52:56 -08007153 if (sessionId >= WLAN_MAX_VDEVS) {
Naveen Rawatc36f7eb2016-11-10 20:01:03 -08007154 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
7155 FL("Invalid sme session id: %d"), sessionId);
7156 return 0;
7157 }
7158
Jeff Johnson01f2c232018-11-21 19:17:44 -08007159 return mac->roam.neighborRoamInfo[sessionId].cfgParams.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007160 maxChannelScanTime;
7161}
7162
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307163/*
7164 * sme_set_neighbor_scan_period() -
7165 * Update nNeighborScanPeriod
7166 * This function is called through dynamic setConfig callback function
7167 * to configure nNeighborScanPeriod
7168 * Usage: adb shell iwpriv wlan0 setConfig
7169 * nNeighborScanPeriod=[0 .. 1000]
7170 *
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -08007171 * mac_handle: Opaque handle to the global MAC context
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307172 * sessionId - Session Identifier
7173 * nNeighborScanPeriod - neighbor scan period
7174 * Return Success or failure
7175 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007176QDF_STATUS sme_set_neighbor_scan_period(mac_handle_t mac_handle,
7177 uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007178 const uint16_t nNeighborScanPeriod)
7179{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08007180 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307181 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007182 tpCsrNeighborRoamControlInfo pNeighborRoamInfo = NULL;
7183
Dustin Brownad06be62019-02-04 14:52:56 -08007184 if (sessionId >= WLAN_MAX_VDEVS) {
Naveen Rawatc36f7eb2016-11-10 20:01:03 -08007185 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
7186 FL("Invalid sme session id: %d"), sessionId);
7187 return QDF_STATUS_E_INVAL;
7188 }
7189
Jeff Johnson01f2c232018-11-21 19:17:44 -08007190 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307191 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08007192 pNeighborRoamInfo = &mac->roam.neighborRoamInfo[sessionId];
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05307193 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307194 "LFR runtime successfully set neighbor scan period to %d - old value is %d - roam state is %s",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007195 nNeighborScanPeriod,
Srinivas Dasarie41d01d2019-09-17 15:31:38 +05307196 pNeighborRoamInfo->cfgParams.neighborScanPeriod,
Jeff Johnson01f2c232018-11-21 19:17:44 -08007197 mac_trace_get_neighbour_roam_state(mac->roam.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007198 neighborRoamInfo
7199 [sessionId].
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307200 neighborRoamState));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007201 pNeighborRoamInfo->cfgParams.neighborScanPeriod =
7202 nNeighborScanPeriod;
Vignesh Viswanathan4e65e8e2018-05-01 12:04:16 +05307203
Abhinav Kumar523ca372019-08-30 16:28:19 +05307204 if (mac->mlme_cfg->lfr.roam_scan_offload_enabled)
7205 csr_roam_update_cfg(mac, sessionId,
7206 REASON_SCAN_HOME_TIME_CHANGED);
7207
Jeff Johnson01f2c232018-11-21 19:17:44 -08007208 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007209 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007210
7211 return status;
7212}
7213
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307214/*
7215 * sme_get_neighbor_scan_period() -
7216 * get neighbor scan period
7217 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007218 * mac_handle - The handle returned by mac_open.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307219 * sessionId - Session Identifier
7220 * Return uint16_t - neighbor scan period
7221 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007222uint16_t sme_get_neighbor_scan_period(mac_handle_t mac_handle,
7223 uint8_t sessionId)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007224{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08007225 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Naveen Rawatc36f7eb2016-11-10 20:01:03 -08007226
Dustin Brownad06be62019-02-04 14:52:56 -08007227 if (sessionId >= WLAN_MAX_VDEVS) {
Naveen Rawatc36f7eb2016-11-10 20:01:03 -08007228 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
7229 FL("Invalid sme session id: %d"), sessionId);
7230 return 0;
7231 }
7232
Jeff Johnson01f2c232018-11-21 19:17:44 -08007233 return mac->roam.neighborRoamInfo[sessionId].cfgParams.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007234 neighborScanPeriod;
7235}
7236
Srinivas Dasari7f48ac02019-09-16 17:44:43 +05307237QDF_STATUS sme_get_roam_rssi_diff(mac_handle_t mac_handle, uint8_t vdev_id,
7238 uint8_t *rssi_diff)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007239{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08007240 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Srinivas Dasari7f48ac02019-09-16 17:44:43 +05307241 tCsrNeighborRoamControlInfo *neighbor_roam_info;
7242 QDF_STATUS status;
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307243
Srinivas Dasari7f48ac02019-09-16 17:44:43 +05307244 if (vdev_id >= WLAN_MAX_VDEVS) {
7245 sme_err("Invalid vdev_id: %d", vdev_id);
7246 return QDF_STATUS_E_INVAL;
7247 }
7248 status = sme_acquire_global_lock(&mac->sme);
7249 if (QDF_IS_STATUS_ERROR(status))
7250 return status;
7251 neighbor_roam_info = &mac->roam.neighborRoamInfo[vdev_id];
7252 *rssi_diff = neighbor_roam_info->cfgParams.roam_rssi_diff;
7253 sme_release_global_lock(&mac->sme);
7254
7255 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007256}
7257
Srinivas Dasari25d77b22019-08-07 16:21:48 +05307258void sme_dump_freq_list(tCsrChannelInfo *chan_info)
7259{
7260 uint8_t *channel_list;
7261 uint8_t i = 0, j = 0;
7262 uint32_t buflen = CFG_VALID_CHANNEL_LIST_LEN * 4;
7263
7264 channel_list = qdf_mem_malloc(buflen);
7265 if (!channel_list)
7266 return;
7267
7268 if (chan_info->freq_list) {
7269 for (i = 0; i < chan_info->numOfChannels; i++) {
7270 if (j < buflen)
7271 j += snprintf(channel_list + j, buflen - j,
7272 "%d ", chan_info->freq_list[i]);
7273 else
7274 break;
7275 }
7276 }
7277
7278 sme_debug("No.of frequencies: %u, frequency list: %s", i, channel_list);
7279 qdf_mem_free(channel_list);
7280}
7281
7282static bool sme_validate_freq_list(mac_handle_t mac_handle,
7283 uint32_t *freq_list,
7284 uint8_t num_channels)
7285{
7286 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
7287 uint8_t i = 0, j;
7288 bool found;
7289 struct csr_channel *ch_lst_info = &mac_ctx->scan.base_channels;
7290
7291 if (!freq_list || !num_channels) {
7292 sme_err("Freq list empty %pK or num_channels is 0", freq_list);
7293 return false;
7294 }
7295
7296 while (i < num_channels) {
7297 found = false;
7298 for (j = 0; j < ch_lst_info->numChannels; j++) {
Tushnim Bhattacharyya42299b82019-09-01 18:03:54 -07007299 if (ch_lst_info->channel_freq_list[j] == freq_list[i]) {
Srinivas Dasari25d77b22019-08-07 16:21:48 +05307300 found = true;
7301 break;
7302 }
7303 }
7304
7305 if (!found) {
7306 sme_debug("Invalid frequency %u", freq_list[i]);
7307 return false;
7308 }
7309
7310 i++;
7311 }
7312
7313 return true;
7314}
7315
7316/**
7317 * sme_update_roam_scan_channel_list() - to update scan channel list
7318 * @mac_handle: Opaque handle to the global MAC context
7319 * @vdev_id: vdev identifier
7320 * @chan_info: Channel information to be updated to.
7321 * @freq_list: Frequency list to be updated from.
7322 * @num_chan: Number of channels
7323 *
7324 * Updates the chan_info by flushing the current frequency list and update
7325 * the same with freq_list.
7326 *
7327 * Return: QDF_STATUS
7328 */
7329static QDF_STATUS
7330sme_update_roam_scan_channel_list(mac_handle_t mac_handle, uint8_t vdev_id,
7331 tCsrChannelInfo *chan_info,
7332 uint32_t *freq_list, uint8_t num_chan)
7333{
7334 QDF_STATUS status = QDF_STATUS_SUCCESS;
7335 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Srinivas Dasari25d77b22019-08-07 16:21:48 +05307336
7337 if (chan_info->numOfChannels) {
7338 sme_debug("Current channels:");
7339 sme_dump_freq_list(chan_info);
7340 }
7341 csr_flush_cfg_bg_scan_roam_channel_list(chan_info);
Liangwei Dong075afa72019-10-30 12:58:22 +08007342 csr_create_bg_scan_roam_channel_list(mac, chan_info, freq_list,
Srinivas Dasari25d77b22019-08-07 16:21:48 +05307343 num_chan);
7344 sme_debug("New channels:");
7345 sme_dump_freq_list(chan_info);
7346 sme_debug("Updated roam scan channels - roam state is %d",
7347 mac->roam.neighborRoamInfo[vdev_id].neighborRoamState);
7348
7349 if (mac->mlme_cfg->lfr.roam_scan_offload_enabled)
Abhinav Kumar523ca372019-08-30 16:28:19 +05307350 status = csr_roam_update_cfg(mac, vdev_id,
7351 REASON_CHANNEL_LIST_CHANGED);
7352
Srinivas Dasari25d77b22019-08-07 16:21:48 +05307353 return status;
7354}
7355
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007356/**
7357 * sme_change_roam_scan_channel_list() - to change scan channel list
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -08007358 * @mac_handle: Opaque handle to the global MAC context
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007359 * @sessionId: sme session id
Liangwei Dong075afa72019-10-30 12:58:22 +08007360 * @channel_freq_list: Output channel list
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007361 * @numChannels: Output number of channels
7362 *
7363 * This routine is called to Change roam scan channel list.
7364 * This is a synchronous call
7365 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307366 * Return: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007367 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007368QDF_STATUS sme_change_roam_scan_channel_list(mac_handle_t mac_handle,
Jeff Johnson1f2dabc2018-11-07 15:33:01 -08007369 uint8_t sessionId,
Liangwei Dong075afa72019-10-30 12:58:22 +08007370 uint32_t *channel_freq_list,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007371 uint8_t numChannels)
7372{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08007373 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307374 QDF_STATUS status = QDF_STATUS_SUCCESS;
Naveen Rawatc36f7eb2016-11-10 20:01:03 -08007375 tpCsrNeighborRoamControlInfo pNeighborRoamInfo = NULL;
Liangwei Dong075afa72019-10-30 12:58:22 +08007376 uint8_t oldChannelList[CFG_VALID_CHANNEL_LIST_LEN * 5] = { 0 };
7377 uint8_t newChannelList[CFG_VALID_CHANNEL_LIST_LEN * 5] = { 0 };
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007378 uint8_t i = 0, j = 0;
7379 tCsrChannelInfo *chan_info;
7380
Dustin Brownad06be62019-02-04 14:52:56 -08007381 if (sessionId >= WLAN_MAX_VDEVS) {
Naveen Rawatc36f7eb2016-11-10 20:01:03 -08007382 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
7383 FL("Invalid sme session id: %d"), sessionId);
7384 return QDF_STATUS_E_INVAL;
7385 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007386
Jeff Johnson01f2c232018-11-21 19:17:44 -08007387 pNeighborRoamInfo = &mac->roam.neighborRoamInfo[sessionId];
7388 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307389 if (!QDF_IS_STATUS_SUCCESS(status)) {
Vignesh Viswanathan4e65e8e2018-05-01 12:04:16 +05307390 sme_err("Failed to acquire SME lock");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007391 return status;
7392 }
Srinivas Dasarib78334d2019-08-12 12:25:37 +05307393 chan_info = &pNeighborRoamInfo->cfgParams.specific_chan_info;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007394
Liangwei Dong4d8c7622019-07-31 17:31:55 +08007395 if (chan_info->freq_list) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007396 for (i = 0; i < chan_info->numOfChannels; i++) {
7397 if (j < sizeof(oldChannelList))
7398 j += snprintf(oldChannelList + j,
7399 sizeof(oldChannelList) -
Liangwei Dong075afa72019-10-30 12:58:22 +08007400 j, " %d",
Liangwei Dong4d8c7622019-07-31 17:31:55 +08007401 chan_info->freq_list[i]);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007402 else
7403 break;
7404 }
7405 }
Srinivas Dasarib78334d2019-08-12 12:25:37 +05307406 csr_flush_cfg_bg_scan_roam_channel_list(chan_info);
Liangwei Dong075afa72019-10-30 12:58:22 +08007407 csr_create_bg_scan_roam_channel_list(mac, chan_info, channel_freq_list,
Srinivas Dasarib78334d2019-08-12 12:25:37 +05307408 numChannels);
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007409 sme_set_roam_scan_control(mac_handle, sessionId, 1);
Liangwei Dong4d8c7622019-07-31 17:31:55 +08007410 if (chan_info->freq_list) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007411 j = 0;
7412 for (i = 0; i < chan_info->numOfChannels; i++) {
7413 if (j < sizeof(newChannelList))
7414 j += snprintf(newChannelList + j,
7415 sizeof(newChannelList) -
Liangwei Dong4d8c7622019-07-31 17:31:55 +08007416 j, " %d", chan_info->freq_list[i]);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007417 else
7418 break;
7419 }
7420 }
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05307421 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307422 "LFR runtime successfully set roam scan channels to %s - old value is %s - roam state is %d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007423 newChannelList, oldChannelList,
Jeff Johnson01f2c232018-11-21 19:17:44 -08007424 mac->roam.neighborRoamInfo[sessionId].neighborRoamState);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007425
Wu Gao51a63562018-11-08 16:29:10 +08007426 if (mac->mlme_cfg->lfr.roam_scan_offload_enabled)
Abhinav Kumar523ca372019-08-30 16:28:19 +05307427 csr_roam_update_cfg(mac, sessionId,
7428 REASON_CHANNEL_LIST_CHANGED);
Vignesh Viswanathan4e65e8e2018-05-01 12:04:16 +05307429
Jeff Johnson01f2c232018-11-21 19:17:44 -08007430 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007431 return status;
7432}
7433
Srinivas Dasari25d77b22019-08-07 16:21:48 +05307434QDF_STATUS
7435sme_update_roam_scan_freq_list(mac_handle_t mac_handle, uint8_t vdev_id,
7436 uint32_t *freq_list, uint8_t num_chan,
7437 uint32_t freq_list_type)
7438{
7439 struct mac_context *mac = MAC_CONTEXT(mac_handle);
7440 QDF_STATUS status;
7441 tpCsrNeighborRoamControlInfo neighbor_roam_info;
7442 tCsrChannelInfo *channel_info;
7443
7444 if (vdev_id >= WLAN_MAX_VDEVS) {
7445 sme_err("Invalid vdev_id: %d", vdev_id);
7446 return QDF_STATUS_E_INVAL;
7447 }
7448
7449 if (!sme_validate_freq_list(mac_handle, freq_list, num_chan)) {
7450 sme_err("List contains invalid channel(s)");
7451 return QDF_STATUS_E_INVAL;
7452 }
7453
7454 status = sme_acquire_global_lock(&mac->sme);
7455 if (QDF_IS_STATUS_ERROR(status)) {
7456 sme_err("Failed to acquire SME lock");
7457 return status;
7458 }
7459
7460 neighbor_roam_info = &mac->roam.neighborRoamInfo[vdev_id];
Abhishek Ambure843ece92020-01-28 14:21:39 +05307461 if (neighbor_roam_info->cfgParams.specific_chan_info.numOfChannels) {
7462 sme_err("Specific channel list is already configured");
7463 sme_release_global_lock(&mac->sme);
7464 return QDF_STATUS_E_INVAL;
7465 }
7466
Srinivas Dasari25d77b22019-08-07 16:21:48 +05307467 if (freq_list_type == QCA_PREFERRED_SCAN_FREQ_LIST) {
7468 sme_debug("Preferred frequency list: ");
7469 channel_info = &neighbor_roam_info->cfgParams.pref_chan_info;
7470 } else {
7471 goto out;
7472 }
7473
7474 status = sme_update_roam_scan_channel_list(mac_handle, vdev_id,
7475 channel_info, freq_list,
7476 num_chan);
7477out:
7478 sme_release_global_lock(&mac->sme);
7479
7480 return status;
7481}
7482
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007483/**
7484 * sme_get_roam_scan_channel_list() - To get roam scan channel list
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -08007485 * @mac_handle: Opaque handle to the global MAC context
Jianmin Zhu203d7532019-10-28 17:17:05 +08007486 * @freq_list: Output channel freq list
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007487 * @pNumChannels: Output number of channels
7488 * @sessionId: Session Identifier
7489 *
7490 * To get roam scan channel list This is a synchronous call
7491 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307492 * Return: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007493 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007494QDF_STATUS sme_get_roam_scan_channel_list(mac_handle_t mac_handle,
Jianmin Zhu203d7532019-10-28 17:17:05 +08007495 uint32_t *freq_list, uint8_t *pNumChannels,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007496 uint8_t sessionId)
7497{
7498 int i = 0;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08007499 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Naveen Rawatc36f7eb2016-11-10 20:01:03 -08007500 tpCsrNeighborRoamControlInfo pNeighborRoamInfo = NULL;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307501 QDF_STATUS status = QDF_STATUS_SUCCESS;
Abhishek Ambure82302fc2020-01-27 17:35:58 +05307502 tCsrChannelInfo *chan_info;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007503
Dustin Brownad06be62019-02-04 14:52:56 -08007504 if (sessionId >= WLAN_MAX_VDEVS) {
Naveen Rawatc36f7eb2016-11-10 20:01:03 -08007505 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
7506 FL("Invalid sme session id: %d"), sessionId);
7507 return QDF_STATUS_E_INVAL;
7508 }
7509
Jeff Johnson01f2c232018-11-21 19:17:44 -08007510 pNeighborRoamInfo = &mac->roam.neighborRoamInfo[sessionId];
7511 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307512 if (!QDF_IS_STATUS_SUCCESS(status))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007513 return status;
Abhishek Ambure82302fc2020-01-27 17:35:58 +05307514
7515 chan_info = &pNeighborRoamInfo->cfgParams.specific_chan_info;
7516 if (!chan_info->numOfChannels) {
7517 chan_info = &pNeighborRoamInfo->cfgParams.pref_chan_info;
7518 if (!chan_info->numOfChannels) {
7519 sme_err("Roam Scan channel list is NOT yet initialized");
7520 *pNumChannels = 0;
7521 sme_release_global_lock(&mac->sme);
7522 return status;
7523 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007524 }
7525
Abhishek Ambure82302fc2020-01-27 17:35:58 +05307526 *pNumChannels = chan_info->numOfChannels;
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307527 for (i = 0; i < (*pNumChannels); i++)
Abhishek Ambure82302fc2020-01-27 17:35:58 +05307528 freq_list[i] = chan_info->freq_list[i];
Jianmin Zhu203d7532019-10-28 17:17:05 +08007529 freq_list[i] = '\0';
Jeff Johnson01f2c232018-11-21 19:17:44 -08007530 sme_release_global_lock(&mac->sme);
Jianmin Zhu203d7532019-10-28 17:17:05 +08007531
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007532 return status;
7533}
7534
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307535/*
7536 * sme_get_is_ese_feature_enabled() - get ESE feature enabled or not
7537 * This is a synchronuous call
7538 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007539 * mac_handle - The handle returned by mac_open.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307540 * Return true (1) - if the ESE feature is enabled
7541 * false (0) - if feature is disabled (compile or runtime)
7542 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007543bool sme_get_is_ese_feature_enabled(mac_handle_t mac_handle)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007544{
7545#ifdef FEATURE_WLAN_ESE
Jeff Johnson0a8786a2018-12-02 10:49:01 -08007546 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307547
Jeff Johnson01f2c232018-11-21 19:17:44 -08007548 return csr_roam_is_ese_ini_feature_enabled(mac);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007549#else
7550 return false;
7551#endif
7552}
7553
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307554/*
7555 * sme_get_wes_mode() - get WES Mode
7556 * This is a synchronous call
7557 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007558 * mac_handle - The handle returned by mac_open
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307559 * Return uint8_t - WES Mode Enabled(1)/Disabled(0)
7560 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007561bool sme_get_wes_mode(mac_handle_t mac_handle)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007562{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08007563 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307564
Wu Gao51a63562018-11-08 16:29:10 +08007565 return mac->mlme_cfg->lfr.wes_mode_enabled;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007566}
7567
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307568/*
7569 * sme_get_roam_scan_control() - get scan control
7570 * This is a synchronous call
7571 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007572 * mac_handle - The handle returned by mac_open.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307573 * Return bool - Enabled(1)/Disabled(0)
7574 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007575bool sme_get_roam_scan_control(mac_handle_t mac_handle)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007576{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08007577 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307578
Jeff Johnson01f2c232018-11-21 19:17:44 -08007579 return mac->roam.configParam.nRoamScanControl;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007580}
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007581
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307582/*
7583 * sme_get_is_lfr_feature_enabled() - get LFR feature enabled or not
7584 * This is a synchronuous call
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007585 * mac_handle - The handle returned by mac_open.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307586 * Return true (1) - if the feature is enabled
7587 * false (0) - if feature is disabled (compile or runtime)
7588 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007589bool sme_get_is_lfr_feature_enabled(mac_handle_t mac_handle)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007590{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08007591 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307592
Wu Gao51a63562018-11-08 16:29:10 +08007593 return mac->mlme_cfg->lfr.lfr_enabled;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007594}
7595
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307596/*
7597 * sme_get_is_ft_feature_enabled() - get FT feature enabled or not
7598 * This is a synchronuous call
7599 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007600 * mac_handle - The handle returned by mac_open.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307601 * Return true (1) - if the feature is enabled
7602 * false (0) - if feature is disabled (compile or runtime)
7603 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007604bool sme_get_is_ft_feature_enabled(mac_handle_t mac_handle)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007605{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08007606 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307607
Wu Gao51a63562018-11-08 16:29:10 +08007608 return mac->mlme_cfg->lfr.fast_transition_enabled;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007609}
7610
Krishna Kumaar Natarajand0bbb3c2017-03-13 17:04:58 -07007611/**
7612 * sme_is_feature_supported_by_fw() - check if feature is supported by FW
7613 * @feature: enum value of requested feature.
7614 *
7615 * Retrun: 1 if supported; 0 otherwise
7616 */
7617bool sme_is_feature_supported_by_fw(enum cap_bitmap feature)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007618{
Krishna Kumaar Natarajand0bbb3c2017-03-13 17:04:58 -07007619 return IS_FEATURE_SUPPORTED_BY_FW(feature);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007620}
7621
Jeff Johnsone943bca2019-02-08 22:45:17 -08007622QDF_STATUS sme_get_link_speed(mac_handle_t mac_handle,
7623 struct link_speed_info *req,
7624 void *context,
7625 sme_link_speed_cb cb)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007626{
Jeff Johnsone943bca2019-02-08 22:45:17 -08007627 QDF_STATUS status;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08007628 struct mac_context *mac;
Mukul Sharmac3886aa2017-05-04 17:53:22 +05307629 void *wma_handle;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007630
Jeff Johnsone943bca2019-02-08 22:45:17 -08007631 if (!mac_handle || !cb || !req) {
Jeff Johnsona5317a62017-01-26 08:51:25 -08007632 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
7633 FL("Invalid parameter"));
7634 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007635 }
Jeff Johnsona5317a62017-01-26 08:51:25 -08007636
Mukul Sharmac3886aa2017-05-04 17:53:22 +05307637 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
7638 if (!wma_handle) {
7639 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
7640 "wma handle is NULL");
7641 return QDF_STATUS_E_FAILURE;
7642 }
7643
Jeff Johnsona0619e42018-11-28 17:43:00 -08007644 mac = MAC_CONTEXT(mac_handle);
Jeff Johnson01f2c232018-11-21 19:17:44 -08007645 status = sme_acquire_global_lock(&mac->sme);
Jeff Johnsona5317a62017-01-26 08:51:25 -08007646 if (QDF_STATUS_SUCCESS != status) {
Srinivas Girigowda2c263352017-03-17 17:49:53 -07007647 sme_err("Failed to acquire global lock");
Jeff Johnsona5317a62017-01-26 08:51:25 -08007648 return QDF_STATUS_E_FAILURE;
7649 }
7650
Jeff Johnsone943bca2019-02-08 22:45:17 -08007651 mac->sme.link_speed_context = context;
7652 mac->sme.link_speed_cb = cb;
7653 status = wma_get_link_speed(wma_handle, req);
Jeff Johnson01f2c232018-11-21 19:17:44 -08007654 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007655 return status;
7656}
7657
Jeff Johnsonc7309062018-11-09 20:59:42 -08007658QDF_STATUS sme_get_peer_info_ext(mac_handle_t mac_handle,
Will Huang558f8082017-05-31 16:22:24 +08007659 struct sir_peer_info_ext_req *req,
7660 void *context,
7661 void (*callbackfn)(struct sir_peer_info_ext_resp *param,
7662 void *pcontext))
7663{
7664 QDF_STATUS status;
7665 QDF_STATUS qdf_status;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08007666 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Rajeev Kumar658e8492017-12-13 11:35:41 -08007667 struct scheduler_msg message = {0};
Will Huang558f8082017-05-31 16:22:24 +08007668
7669 status = sme_acquire_global_lock(&mac->sme);
7670 if (QDF_STATUS_SUCCESS == status) {
Jeff Johnson038efe72019-03-18 13:39:31 -07007671 if (!callbackfn) {
Will Huang558f8082017-05-31 16:22:24 +08007672 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
7673 "%s: Indication Call back is NULL",
7674 __func__);
7675 sme_release_global_lock(&mac->sme);
7676 return QDF_STATUS_E_FAILURE;
7677 }
7678
7679 mac->sme.pget_peer_info_ext_ind_cb = callbackfn;
7680 mac->sme.pget_peer_info_ext_cb_context = context;
7681
7682 /* serialize the req through MC thread */
7683 message.bodyptr =
7684 qdf_mem_malloc(sizeof(struct sir_peer_info_ext_req));
Arif Hussain0ef77082018-10-10 16:42:53 -07007685 if (!message.bodyptr) {
Will Huang558f8082017-05-31 16:22:24 +08007686 sme_release_global_lock(&mac->sme);
7687 return QDF_STATUS_E_NOMEM;
7688 }
7689 qdf_mem_copy(message.bodyptr,
7690 req,
7691 sizeof(struct sir_peer_info_ext_req));
7692 message.type = WMA_GET_PEER_INFO_EXT;
gaurank kathpalia36b0c582018-08-28 17:45:43 +05307693 qdf_status = scheduler_post_message(QDF_MODULE_ID_SME,
7694 QDF_MODULE_ID_WMA,
7695 QDF_MODULE_ID_WMA,
7696 &message);
Will Huang558f8082017-05-31 16:22:24 +08007697 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
7698 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
7699 "%s: Post get rssi msg fail", __func__);
7700 qdf_mem_free(message.bodyptr);
7701 status = QDF_STATUS_E_FAILURE;
7702 }
7703 sme_release_global_lock(&mac->sme);
7704 }
7705 return status;
7706}
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007707
guangde4853c402019-05-06 15:54:04 +08007708QDF_STATUS sme_get_isolation(mac_handle_t mac_handle, void *context,
7709 sme_get_isolation_cb callbackfn)
7710{
7711 QDF_STATUS status;
7712 struct mac_context *mac = MAC_CONTEXT(mac_handle);
7713 struct scheduler_msg message = {0};
7714
7715 if (!callbackfn) {
7716 sme_err("Indication Call back is NULL");
7717 return QDF_STATUS_E_FAILURE;
7718 }
7719 status = sme_acquire_global_lock(&mac->sme);
7720 if (QDF_IS_STATUS_ERROR(status))
7721 return status;
7722 mac->sme.get_isolation_cb = callbackfn;
7723 mac->sme.get_isolation_cb_context = context;
7724 message.bodyptr = NULL;
7725 message.type = WMA_GET_ISOLATION;
7726 status = scheduler_post_message(QDF_MODULE_ID_SME,
7727 QDF_MODULE_ID_WMA,
7728 QDF_MODULE_ID_WMA,
7729 &message);
7730 if (!QDF_IS_STATUS_SUCCESS(status)) {
7731 sme_err("failed to post WMA_GET_ISOLATION");
7732 status = QDF_STATUS_E_FAILURE;
7733 }
7734 sme_release_global_lock(&mac->sme);
7735 return status;
7736}
7737
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007738/*convert the ini value to the ENUM used in csr and MAC for CB state*/
7739ePhyChanBondState sme_get_cb_phy_state_from_cb_ini_value(uint32_t cb_ini_value)
7740{
7741 return csr_convert_cb_ini_value_to_phy_cb_state(cb_ini_value);
7742}
7743
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007744void sme_set_curr_device_mode(mac_handle_t mac_handle,
Jeff Johnson5a6a0c92019-02-17 16:12:02 -08007745 enum QDF_OPMODE curr_device_mode)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007746{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08007747 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307748
Jeff Johnson5a6a0c92019-02-17 16:12:02 -08007749 mac->sme.curr_device_mode = curr_device_mode;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007750}
7751
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307752/*
7753 * sme_handoff_request() - a wrapper function to Request a handoff from CSR.
7754 * This is a synchronous call
7755 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007756 * mac_handle - The handle returned by mac_open
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307757 * sessionId - Session Identifier
7758 * pHandoffInfo - info provided by HDD with the handoff request (namely:
7759 * BSSID, channel etc.)
7760 * Return QDF_STATUS_SUCCESS - SME passed the request to CSR successfully.
7761 * Other status means SME is failed to send the request.
7762 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007763
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007764QDF_STATUS sme_handoff_request(mac_handle_t mac_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007765 uint8_t sessionId,
7766 tCsrHandoffRequest *pHandoffInfo)
7767{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08007768 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307769 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007770
Jeff Johnson01f2c232018-11-21 19:17:44 -08007771 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307772 if (QDF_IS_STATUS_SUCCESS(status)) {
Abhishek Singhe4a1f882017-08-10 17:59:44 +05307773 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007774 "%s: invoked", __func__);
Jeff Johnson01f2c232018-11-21 19:17:44 -08007775 status = csr_handoff_request(mac, sessionId, pHandoffInfo);
7776 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007777 }
7778
7779 return status;
7780}
7781
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007782/**
7783 * sme_add_periodic_tx_ptrn() - Add Periodic TX Pattern
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -08007784 * @mac_handle: Opaque handle to the global MAC context
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007785 * @addPeriodicTxPtrnParams: request message
7786 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307787 * Return: QDF_STATUS enumeration
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007788 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307789QDF_STATUS
Jeff Johnsonc7309062018-11-09 20:59:42 -08007790sme_add_periodic_tx_ptrn(mac_handle_t mac_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007791 struct sSirAddPeriodicTxPtrn *addPeriodicTxPtrnParams)
7792{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307793 QDF_STATUS status = QDF_STATUS_SUCCESS;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08007794 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007795 struct sSirAddPeriodicTxPtrn *req_msg;
Rajeev Kumar37d478b2017-04-17 16:59:28 -07007796 struct scheduler_msg msg = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007797
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07007798 SME_ENTER();
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007799
Anurag Chouhan600c3a02016-03-01 10:33:54 +05307800 req_msg = qdf_mem_malloc(sizeof(*req_msg));
Arif Hussain0ef77082018-10-10 16:42:53 -07007801 if (!req_msg)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307802 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007803
7804 *req_msg = *addPeriodicTxPtrnParams;
7805
7806 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307807 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07007808 sme_err("sme_acquire_global_lock failed!(status=%d)",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007809 status);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05307810 qdf_mem_free(req_msg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007811 return status;
7812 }
7813
7814 /* Serialize the req through MC thread */
7815 msg.bodyptr = req_msg;
7816 msg.type = WMA_ADD_PERIODIC_TX_PTRN_IND;
Sreelakshmi Konamki6a065362016-05-31 16:05:01 +05307817 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
7818 NO_SESSION, msg.type));
gaurank kathpalia36b0c582018-08-28 17:45:43 +05307819 status = scheduler_post_message(QDF_MODULE_ID_SME,
7820 QDF_MODULE_ID_WMA,
7821 QDF_MODULE_ID_WMA, &msg);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307822 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07007823 sme_err("scheduler_post_msg failed!(err=%d)",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007824 status);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05307825 qdf_mem_free(req_msg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007826 }
7827 sme_release_global_lock(&mac->sme);
7828 return status;
7829}
7830
7831/**
7832 * sme_del_periodic_tx_ptrn() - Delete Periodic TX Pattern
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -08007833 * @mac_handle: Opaque handle to the global MAC context
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007834 * @delPeriodicTxPtrnParams: request message
7835 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307836 * Return: QDF_STATUS enumeration
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007837 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307838QDF_STATUS
Jeff Johnsonc7309062018-11-09 20:59:42 -08007839sme_del_periodic_tx_ptrn(mac_handle_t mac_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007840 struct sSirDelPeriodicTxPtrn *delPeriodicTxPtrnParams)
7841{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307842 QDF_STATUS status = QDF_STATUS_SUCCESS;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08007843 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007844 struct sSirDelPeriodicTxPtrn *req_msg;
Rajeev Kumar37d478b2017-04-17 16:59:28 -07007845 struct scheduler_msg msg = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007846
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07007847 SME_ENTER();
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007848
Anurag Chouhan600c3a02016-03-01 10:33:54 +05307849 req_msg = qdf_mem_malloc(sizeof(*req_msg));
Arif Hussain0ef77082018-10-10 16:42:53 -07007850 if (!req_msg)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307851 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007852
7853 *req_msg = *delPeriodicTxPtrnParams;
7854
7855 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307856 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07007857 sme_err("sme_acquire_global_lock failed!(status=%d)",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007858 status);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05307859 qdf_mem_free(req_msg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007860 return status;
7861 }
7862
7863 /* Serialize the req through MC thread */
7864 msg.bodyptr = req_msg;
7865 msg.type = WMA_DEL_PERIODIC_TX_PTRN_IND;
Sreelakshmi Konamki6a065362016-05-31 16:05:01 +05307866 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
7867 NO_SESSION, msg.type));
gaurank kathpalia36b0c582018-08-28 17:45:43 +05307868 status = scheduler_post_message(QDF_MODULE_ID_SME,
7869 QDF_MODULE_ID_WMA,
7870 QDF_MODULE_ID_WMA, &msg);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307871 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07007872 sme_err("scheduler_post_msg failed!(err=%d)",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007873 status);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05307874 qdf_mem_free(req_msg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007875 }
7876 sme_release_global_lock(&mac->sme);
7877 return status;
7878}
7879
Rachit Kankaneee1735c2018-08-02 13:19:34 +05307880#ifdef FEATURE_WLAN_RMC
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307881/*
7882 * sme_enable_rmc() - enables RMC
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -08007883 * @mac_handle: Opaque handle to the global MAC context
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307884 * @sessionId : Session ID
7885 *
7886 * Return: QDF_STATUS
7887 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007888QDF_STATUS sme_enable_rmc(mac_handle_t mac_handle, uint32_t sessionId)
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08007889{
7890 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08007891 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Rajeev Kumar37d478b2017-04-17 16:59:28 -07007892 struct scheduler_msg message = {0};
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08007893 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
7894
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07007895 SME_ENTER();
7896
Jeff Johnson01f2c232018-11-21 19:17:44 -08007897 status = sme_acquire_global_lock(&mac->sme);
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08007898 if (QDF_IS_STATUS_SUCCESS(status)) {
Rajeev Kumar8eaedf62017-01-21 11:03:13 -08007899 message.bodyptr = NULL;
7900 message.type = WMA_RMC_ENABLE_IND;
gaurank kathpalia36b0c582018-08-28 17:45:43 +05307901 qdf_status = scheduler_post_message(QDF_MODULE_ID_SME,
7902 QDF_MODULE_ID_WMA,
7903 QDF_MODULE_ID_WMA,
7904 &message);
Madhvapathi Sriram3e6627a2018-12-19 12:54:49 +05307905 if (!QDF_IS_STATUS_SUCCESS(qdf_status))
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08007906 status = QDF_STATUS_E_FAILURE;
Madhvapathi Sriram3e6627a2018-12-19 12:54:49 +05307907
Jeff Johnson01f2c232018-11-21 19:17:44 -08007908 sme_release_global_lock(&mac->sme);
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08007909 }
7910 return status;
7911}
7912
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307913/*
7914 * sme_disable_rmc() - disables RMC
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -08007915 * @mac_handle: Opaque handle to the global MAC context
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307916 * @sessionId : Session ID
7917 *
7918 * Return: QDF_STATUS
7919 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007920QDF_STATUS sme_disable_rmc(mac_handle_t mac_handle, uint32_t sessionId)
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08007921{
7922 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08007923 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Rajeev Kumar37d478b2017-04-17 16:59:28 -07007924 struct scheduler_msg message = {0};
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08007925 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
7926
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07007927 SME_ENTER();
7928
Jeff Johnson01f2c232018-11-21 19:17:44 -08007929 status = sme_acquire_global_lock(&mac->sme);
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08007930 if (QDF_IS_STATUS_SUCCESS(status)) {
Rajeev Kumar8eaedf62017-01-21 11:03:13 -08007931 message.bodyptr = NULL;
7932 message.type = WMA_RMC_DISABLE_IND;
gaurank kathpalia36b0c582018-08-28 17:45:43 +05307933 qdf_status = scheduler_post_message(QDF_MODULE_ID_SME,
7934 QDF_MODULE_ID_WMA,
7935 QDF_MODULE_ID_WMA,
7936 &message);
Madhvapathi Sriram3e6627a2018-12-19 12:54:49 +05307937 if (!QDF_IS_STATUS_SUCCESS(qdf_status))
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08007938 status = QDF_STATUS_E_FAILURE;
Madhvapathi Sriram3e6627a2018-12-19 12:54:49 +05307939
Jeff Johnson01f2c232018-11-21 19:17:44 -08007940 sme_release_global_lock(&mac->sme);
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08007941 }
7942 return status;
7943}
7944
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307945/*
7946 * sme_send_rmc_action_period() - sends RMC action period param to target
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -08007947 * @mac_handle: Opaque handle to the global MAC context
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307948 * @sessionId : Session ID
7949 *
7950 * Return: QDF_STATUS
7951 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007952QDF_STATUS sme_send_rmc_action_period(mac_handle_t mac_handle,
7953 uint32_t sessionId)
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08007954{
7955 QDF_STATUS status = QDF_STATUS_SUCCESS;
7956 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08007957 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Rajeev Kumar37d478b2017-04-17 16:59:28 -07007958 struct scheduler_msg message = {0};
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08007959
Jeff Johnson01f2c232018-11-21 19:17:44 -08007960 status = sme_acquire_global_lock(&mac->sme);
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08007961 if (QDF_STATUS_SUCCESS == status) {
Rajeev Kumar8eaedf62017-01-21 11:03:13 -08007962 message.bodyptr = NULL;
7963 message.type = WMA_RMC_ACTION_PERIOD_IND;
gaurank kathpalia36b0c582018-08-28 17:45:43 +05307964 qdf_status = scheduler_post_message(QDF_MODULE_ID_SME,
7965 QDF_MODULE_ID_WMA,
7966 QDF_MODULE_ID_WMA,
7967 &message);
Madhvapathi Sriram3e6627a2018-12-19 12:54:49 +05307968 if (!QDF_IS_STATUS_SUCCESS(qdf_status))
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08007969 status = QDF_STATUS_E_FAILURE;
Madhvapathi Sriram3e6627a2018-12-19 12:54:49 +05307970
Jeff Johnson01f2c232018-11-21 19:17:44 -08007971 sme_release_global_lock(&mac->sme);
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08007972 }
7973
7974 return status;
7975}
Rachit Kankaneee1735c2018-08-02 13:19:34 +05307976#endif /* FEATURE_WLAN_RMC */
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08007977
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307978/*
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307979 * sme_send_cesium_enable_ind() -
7980 * Used to send proprietary cesium enable indication to fw
7981 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007982 * mac_handle
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307983 * sessionId
7984 * Return QDF_STATUS
7985 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007986QDF_STATUS sme_send_cesium_enable_ind(mac_handle_t mac_handle,
7987 uint32_t sessionId)
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08007988{
7989 QDF_STATUS status = QDF_STATUS_SUCCESS;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08007990 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Rajeev Kumar37d478b2017-04-17 16:59:28 -07007991 struct scheduler_msg message = {0};
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08007992
Jeff Johnson01f2c232018-11-21 19:17:44 -08007993 status = sme_acquire_global_lock(&mac->sme);
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08007994 if (QDF_STATUS_SUCCESS == status) {
Rajeev Kumar8eaedf62017-01-21 11:03:13 -08007995 message.bodyptr = NULL;
7996 message.type = WMA_IBSS_CESIUM_ENABLE_IND;
Madhvapathi Sriram3e6627a2018-12-19 12:54:49 +05307997 status = scheduler_post_message(QDF_MODULE_ID_SME,
7998 QDF_MODULE_ID_WMA,
7999 QDF_MODULE_ID_WMA,
8000 &message);
Jeff Johnson01f2c232018-11-21 19:17:44 -08008001 sme_release_global_lock(&mac->sme);
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08008002 }
8003
8004 return status;
8005}
8006
Jeff Johnsonc7309062018-11-09 20:59:42 -08008007QDF_STATUS sme_set_wlm_latency_level(mac_handle_t mac_handle,
8008 uint16_t session_id,
Paul Zhang99fe8842017-12-08 14:43:46 +08008009 uint16_t latency_level)
8010{
8011 QDF_STATUS status;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08008012 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Paul Zhang99fe8842017-12-08 14:43:46 +08008013 struct wlm_latency_level_param params;
8014 void *wma = cds_get_context(QDF_MODULE_ID_WMA);
8015
Bala Venkatesh7cf5b662018-05-10 15:18:53 +05308016 if (!wma)
8017 return QDF_STATUS_E_FAILURE;
8018
Yeshwanth Sriram Guntuka334aa8d2018-08-20 16:49:15 +05308019 if (!mac_ctx->mlme_cfg->wlm_config.latency_enable) {
Paul Zhang99fe8842017-12-08 14:43:46 +08008020 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
8021 "%s: WLM latency level setting is disabled",
8022 __func__);
8023 return QDF_STATUS_E_FAILURE;
8024 }
Krunal Soni3fa80e22018-01-09 14:16:02 -08008025 if (!wma) {
8026 sme_err("wma is NULL");
8027 return QDF_STATUS_E_FAILURE;
8028 }
Paul Zhang99fe8842017-12-08 14:43:46 +08008029
8030 params.wlm_latency_level = latency_level;
8031 params.wlm_latency_flags =
Yeshwanth Sriram Guntuka334aa8d2018-08-20 16:49:15 +05308032 mac_ctx->mlme_cfg->wlm_config.latency_flags[latency_level];
Paul Zhang99fe8842017-12-08 14:43:46 +08008033 params.vdev_id = session_id;
8034
8035 status = wma_set_wlm_latency_level(wma, &params);
Paul Zhang99fe8842017-12-08 14:43:46 +08008036
8037 return status;
8038}
8039
Jeff Johnsonb460dd72018-11-08 10:26:51 -08008040void sme_get_command_q_status(mac_handle_t mac_handle)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008041{
8042 tSmeCmd *pTempCmd = NULL;
8043 tListElem *pEntry;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08008044 struct mac_context *mac;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008045
Madhvapathi Sriram3e6627a2018-12-19 12:54:49 +05308046 if (!mac_handle)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008047 return;
Madhvapathi Sriram3e6627a2018-12-19 12:54:49 +05308048
8049 mac = MAC_CONTEXT(mac_handle);
8050
Jeff Johnson01f2c232018-11-21 19:17:44 -08008051 pEntry = csr_nonscan_active_ll_peek_head(mac, LL_ACCESS_LOCK);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05308052 if (pEntry)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008053 pTempCmd = GET_BASE_ADDR(pEntry, tSmeCmd, Link);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05308054
Kabilan Kannan33fcd682018-03-08 14:29:46 -08008055 sme_err("WLAN_BUG_RCA: Currently smeCmdActiveList has command (0x%X)",
Madhvapathi Sriram3e6627a2018-12-19 12:54:49 +05308056 (pTempCmd) ? pTempCmd->command : eSmeNoCommand);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008057 if (pTempCmd) {
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05308058 if (eSmeCsrCommandMask & pTempCmd->command)
8059 /* CSR command is stuck. See what the reason code is
8060 * for that command
8061 */
Jeff Johnson01f2c232018-11-21 19:17:44 -08008062 dump_csr_command_info(mac, pTempCmd);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008063 } /* if(pTempCmd) */
8064
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07008065 sme_err("Currently smeCmdPendingList has %d commands",
Abhishek Singhf554e7a2019-11-25 14:18:50 +05308066 wlan_serialization_get_pending_list_count(mac->psoc, false));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008067
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008068}
Kiran Kumar Lokere1aa9c9a2016-10-05 18:50:59 -07008069
Agrawal Ashishb141b092016-09-02 19:59:26 +05308070#ifdef WLAN_FEATURE_DSRC
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008071/**
Naveen Rawatb4d37622015-11-13 16:15:25 -08008072 * sme_ocb_gen_timing_advert_frame() - generate TA frame and populate the buffer
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -08008073 * @mac_handle: Opaque handle to the global MAC context
Naveen Rawatb4d37622015-11-13 16:15:25 -08008074 * @self_addr: the self MAC address
8075 * @buf: the buffer that will contain the frame
8076 * @timestamp_offset: return for the offset of the timestamp field
8077 * @time_value_offset: return for the time_value field in the TA IE
8078 *
8079 * Return: the length of the buffer.
8080 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08008081int sme_ocb_gen_timing_advert_frame(mac_handle_t mac_handle,
Naveen Rawatb4d37622015-11-13 16:15:25 -08008082 tSirMacAddr self_addr, uint8_t **buf,
8083 uint32_t *timestamp_offset,
8084 uint32_t *time_value_offset)
8085{
8086 int template_length;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08008087 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Naveen Rawatb4d37622015-11-13 16:15:25 -08008088
8089 template_length = sch_gen_timing_advert_frame(mac_ctx, self_addr, buf,
8090 timestamp_offset,
8091 time_value_offset);
8092 return template_length;
8093}
Agrawal Ashishb141b092016-09-02 19:59:26 +05308094#endif
Arun Khandavalli4b55da72016-07-19 19:55:01 +05308095
Jeff Johnsonb460dd72018-11-08 10:26:51 -08008096QDF_STATUS sme_notify_modem_power_state(mac_handle_t mac_handle, uint32_t value)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008097{
Rajeev Kumar37d478b2017-04-17 16:59:28 -07008098 struct scheduler_msg msg = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008099 tpSirModemPowerStateInd request_buf;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08008100 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008101
Jeff Johnson038efe72019-03-18 13:39:31 -07008102 if (!mac)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308103 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008104
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308105 request_buf = qdf_mem_malloc(sizeof(tSirModemPowerStateInd));
Arif Hussain0ef77082018-10-10 16:42:53 -07008106 if (!request_buf)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308107 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008108
8109 request_buf->param = value;
8110
8111 msg.type = WMA_MODEM_POWER_STATE_IND;
8112 msg.reserved = 0;
8113 msg.bodyptr = request_buf;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308114 if (!QDF_IS_STATUS_SUCCESS
gaurank kathpalia36b0c582018-08-28 17:45:43 +05308115 (scheduler_post_message(QDF_MODULE_ID_SME,
8116 QDF_MODULE_ID_WMA,
8117 QDF_MODULE_ID_WMA, &msg))) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308118 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05308119 "%s: Not able to post WMA_MODEM_POWER_STATE_IND message to WMA",
8120 __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308121 qdf_mem_free(request_buf);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308122 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008123 }
8124
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308125 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008126}
8127
8128#ifdef QCA_HT_2040_COEX
Yeshwanth Sriram Guntuka3f262102019-07-16 15:41:08 +05308129QDF_STATUS sme_notify_ht2040_mode(mac_handle_t mac_handle,
Anurag Chouhan6d760662016-02-20 16:05:43 +05308130 struct qdf_mac_addr macAddrSTA,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008131 uint8_t sessionId,
8132 uint8_t channel_type)
8133{
Rajeev Kumar37d478b2017-04-17 16:59:28 -07008134 struct scheduler_msg msg = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008135 tUpdateVHTOpMode *pHtOpMode = NULL;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08008136 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008137
Jeff Johnson038efe72019-03-18 13:39:31 -07008138 if (!mac)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308139 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008140
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308141 pHtOpMode = qdf_mem_malloc(sizeof(tUpdateVHTOpMode));
Arif Hussain0ef77082018-10-10 16:42:53 -07008142 if (!pHtOpMode)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308143 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008144
8145 switch (channel_type) {
8146 case eHT_CHAN_HT20:
8147 pHtOpMode->opMode = eHT_CHANNEL_WIDTH_20MHZ;
8148 break;
8149
8150 case eHT_CHAN_HT40MINUS:
8151 case eHT_CHAN_HT40PLUS:
8152 pHtOpMode->opMode = eHT_CHANNEL_WIDTH_40MHZ;
8153 break;
8154
8155 default:
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308156 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008157 "%s: Invalid OP mode", __func__);
Abhinav Kumar009f69f2019-06-05 21:43:31 +05308158 qdf_mem_free(pHtOpMode);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308159 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008160 }
8161
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308162 qdf_mem_copy(pHtOpMode->peer_mac, macAddrSTA.bytes,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008163 sizeof(tSirMacAddr));
8164 pHtOpMode->smesessionId = sessionId;
8165
8166 msg.type = WMA_UPDATE_OP_MODE;
8167 msg.reserved = 0;
8168 msg.bodyptr = pHtOpMode;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308169 if (!QDF_IS_STATUS_SUCCESS
gaurank kathpalia36b0c582018-08-28 17:45:43 +05308170 (scheduler_post_message(QDF_MODULE_ID_SME,
8171 QDF_MODULE_ID_WMA,
8172 QDF_MODULE_ID_WMA, &msg))) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308173 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05308174 "%s: Not able to post WMA_UPDATE_OP_MODE message to WMA",
8175 __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308176 qdf_mem_free(pHtOpMode);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308177 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008178 }
8179
Abhishek Singhe4a1f882017-08-10 17:59:44 +05308180 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Yeshwanth Sriram Guntuka3f262102019-07-16 15:41:08 +05308181 "%s: Notified FW about OP mode: %d",
8182 __func__, pHtOpMode->opMode);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008183
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308184 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008185}
8186
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05308187/*
8188 * sme_set_ht2040_mode() -
8189 * To update HT Operation beacon IE.
8190 *
8191 * Return QDF_STATUS SUCCESS
8192 * FAILURE or RESOURCES
8193 * The API finished and failed.
8194 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08008195QDF_STATUS sme_set_ht2040_mode(mac_handle_t mac_handle, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008196 uint8_t channel_type, bool obssEnabled)
8197{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308198 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08008199 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008200 ePhyChanBondState cbMode;
Jeff Johnson01f2c232018-11-21 19:17:44 -08008201 struct csr_roam_session *session = CSR_GET_SESSION(mac, sessionId);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008202
Jeff Johnson01f2c232018-11-21 19:17:44 -08008203 if (!CSR_IS_SESSION_VALID(mac, sessionId)) {
Abhishek Singh9d5f4582017-10-11 17:59:48 +05308204 sme_err("Session not valid for session id %d", sessionId);
8205 return QDF_STATUS_E_INVAL;
8206 }
Jeff Johnson01f2c232018-11-21 19:17:44 -08008207 session = CSR_GET_SESSION(mac, sessionId);
Abhishek Singh9d5f4582017-10-11 17:59:48 +05308208 sme_debug("Update HT operation beacon IE, channel_type=%d cur cbmode %d",
8209 channel_type, session->bssParams.cbMode);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008210
8211 switch (channel_type) {
8212 case eHT_CHAN_HT20:
Abhishek Singh9d5f4582017-10-11 17:59:48 +05308213 if (!session->bssParams.cbMode)
8214 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008215 cbMode = PHY_SINGLE_CHANNEL_CENTERED;
8216 break;
8217 case eHT_CHAN_HT40MINUS:
Abhishek Singh9d5f4582017-10-11 17:59:48 +05308218 if (session->bssParams.cbMode)
8219 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008220 cbMode = PHY_DOUBLE_CHANNEL_HIGH_PRIMARY;
8221 break;
8222 case eHT_CHAN_HT40PLUS:
Abhishek Singh9d5f4582017-10-11 17:59:48 +05308223 if (session->bssParams.cbMode)
8224 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008225 cbMode = PHY_DOUBLE_CHANNEL_LOW_PRIMARY;
8226 break;
8227 default:
Abhishek Singh9d5f4582017-10-11 17:59:48 +05308228 sme_err("Error!!! Invalid HT20/40 mode !");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308229 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008230 }
Abhishek Singh9d5f4582017-10-11 17:59:48 +05308231 session->bssParams.cbMode = cbMode;
Jeff Johnson01f2c232018-11-21 19:17:44 -08008232 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308233 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08008234 status = csr_set_ht2040_mode(mac, sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008235 cbMode, obssEnabled);
Jeff Johnson01f2c232018-11-21 19:17:44 -08008236 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008237 }
8238 return status;
8239}
8240
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008241#endif
8242
8243/*
8244 * SME API to enable/disable idle mode powersave
8245 * This should be called only if powersave offload
8246 * is enabled
8247 */
Arunk Khandavalli847969d2017-09-25 15:15:36 +05308248QDF_STATUS sme_set_idle_powersave_config(bool value)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008249{
Anurag Chouhan6d760662016-02-20 16:05:43 +05308250 void *wmaContext = cds_get_context(QDF_MODULE_ID_WMA);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008251
Jeff Johnson038efe72019-03-18 13:39:31 -07008252 if (!wmaContext) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308253 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008254 "%s: wmaContext is NULL", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308255 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008256 }
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308257 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008258 " Idle Ps Set Value %d", value);
8259
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308260 if (QDF_STATUS_SUCCESS != wma_set_idle_ps_config(wmaContext, value)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308261 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008262 " Failed to Set Idle Ps Value %d", value);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308263 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008264 }
Arunk Khandavalli847969d2017-09-25 15:15:36 +05308265
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308266 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008267}
8268
Jeff Johnsonb460dd72018-11-08 10:26:51 -08008269int16_t sme_get_ht_config(mac_handle_t mac_handle, uint8_t session_id,
8270 uint16_t ht_capab)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008271{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08008272 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Jeff Johnson01f2c232018-11-21 19:17:44 -08008273 struct csr_roam_session *pSession = CSR_GET_SESSION(mac, session_id);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008274
Jeff Johnson038efe72019-03-18 13:39:31 -07008275 if (!pSession) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308276 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008277 "%s: pSession is NULL", __func__);
8278 return -EIO;
8279 }
8280 switch (ht_capab) {
8281 case WNI_CFG_HT_CAP_INFO_ADVANCE_CODING:
Jeff Johnsonbe119e62019-02-02 12:30:26 -08008282 return pSession->ht_config.ht_rx_ldpc;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008283 case WNI_CFG_HT_CAP_INFO_TX_STBC:
Jeff Johnsonbe119e62019-02-02 12:30:26 -08008284 return pSession->ht_config.ht_tx_stbc;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008285 case WNI_CFG_HT_CAP_INFO_RX_STBC:
Jeff Johnsonbe119e62019-02-02 12:30:26 -08008286 return pSession->ht_config.ht_rx_stbc;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008287 case WNI_CFG_HT_CAP_INFO_SHORT_GI_20MHZ:
Jeff Johnsonbe119e62019-02-02 12:30:26 -08008288 return pSession->ht_config.ht_sgi20;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008289 case WNI_CFG_HT_CAP_INFO_SHORT_GI_40MHZ:
Jeff Johnsonbe119e62019-02-02 12:30:26 -08008290 return pSession->ht_config.ht_sgi40;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008291 default:
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308292 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008293 "invalid ht capability");
8294 return -EIO;
8295 }
8296}
8297
Jeff Johnsonb460dd72018-11-08 10:26:51 -08008298int sme_update_ht_config(mac_handle_t mac_handle, uint8_t sessionId,
8299 uint16_t htCapab, int value)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008300{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08008301 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Jeff Johnson01f2c232018-11-21 19:17:44 -08008302 struct csr_roam_session *pSession = CSR_GET_SESSION(mac, sessionId);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008303
Jeff Johnson038efe72019-03-18 13:39:31 -07008304 if (!pSession) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308305 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008306 "%s: pSession is NULL", __func__);
8307 return -EIO;
8308 }
8309
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308310 if (QDF_STATUS_SUCCESS != wma_set_htconfig(sessionId, htCapab, value)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308311 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008312 "Failed to set ht capability in target");
8313 return -EIO;
8314 }
8315
8316 switch (htCapab) {
8317 case WNI_CFG_HT_CAP_INFO_ADVANCE_CODING:
Jeff Johnsonbe119e62019-02-02 12:30:26 -08008318 pSession->ht_config.ht_rx_ldpc = value;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008319 break;
8320 case WNI_CFG_HT_CAP_INFO_TX_STBC:
Jeff Johnsonbe119e62019-02-02 12:30:26 -08008321 pSession->ht_config.ht_tx_stbc = value;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008322 break;
8323 case WNI_CFG_HT_CAP_INFO_RX_STBC:
Jeff Johnsonbe119e62019-02-02 12:30:26 -08008324 pSession->ht_config.ht_rx_stbc = value;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008325 break;
8326 case WNI_CFG_HT_CAP_INFO_SHORT_GI_20MHZ:
Krishna Kumaar Natarajana5c5aad2016-12-05 14:12:13 -08008327 value = value ? 1 : 0; /* HT SGI can be only 1 or 0 */
Jeff Johnsonbe119e62019-02-02 12:30:26 -08008328 pSession->ht_config.ht_sgi20 = value;
Sandeep Puligilla607f34a2016-05-25 14:37:47 -07008329 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008330 case WNI_CFG_HT_CAP_INFO_SHORT_GI_40MHZ:
Krishna Kumaar Natarajana5c5aad2016-12-05 14:12:13 -08008331 value = value ? 1 : 0; /* HT SGI can be only 1 or 0 */
Jeff Johnsonbe119e62019-02-02 12:30:26 -08008332 pSession->ht_config.ht_sgi40 = value;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008333 break;
8334 }
8335
Jeff Johnson01f2c232018-11-21 19:17:44 -08008336 csr_roam_update_config(mac, sessionId, htCapab, value);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008337 return 0;
8338}
8339
Jeff Johnsonc7309062018-11-09 20:59:42 -08008340int sme_set_addba_accept(mac_handle_t mac_handle, uint8_t session_id, int value)
Kiran Kumar Lokere08195ef2018-01-17 19:25:15 -08008341{
8342 struct sme_addba_accept *addba_accept;
8343 struct scheduler_msg msg = {0};
8344 QDF_STATUS status;
8345
8346 addba_accept = qdf_mem_malloc(sizeof(*addba_accept));
Arif Hussain0ef77082018-10-10 16:42:53 -07008347 if (!addba_accept)
Kiran Kumar Lokere08195ef2018-01-17 19:25:15 -08008348 return -EIO;
Arif Hussain0ef77082018-10-10 16:42:53 -07008349
Kiran Kumar Lokere08195ef2018-01-17 19:25:15 -08008350 addba_accept->session_id = session_id;
8351 addba_accept->addba_accept = value;
8352 qdf_mem_zero(&msg, sizeof(msg));
8353 msg.type = eWNI_SME_SET_ADDBA_ACCEPT;
8354 msg.reserved = 0;
8355 msg.bodyptr = addba_accept;
gaurank kathpalia36b0c582018-08-28 17:45:43 +05308356 status = scheduler_post_message(QDF_MODULE_ID_SME,
8357 QDF_MODULE_ID_PE,
8358 QDF_MODULE_ID_PE, &msg);
Kiran Kumar Lokere08195ef2018-01-17 19:25:15 -08008359 if (status != QDF_STATUS_SUCCESS) {
8360 sme_err("Not able to post addba reject");
8361 qdf_mem_free(addba_accept);
8362 return -EIO;
8363 }
8364 return 0;
8365}
Kiran Kumar Lokerebc87bec2018-02-27 20:06:42 -08008366
Jeff Johnsonc7309062018-11-09 20:59:42 -08008367int sme_set_ba_buff_size(mac_handle_t mac_handle, uint8_t session_id,
8368 uint16_t buff_size)
Kiran Kumar Lokerebc87bec2018-02-27 20:06:42 -08008369{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08008370 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Kiran Kumar Lokerebc87bec2018-02-27 20:06:42 -08008371 if (!buff_size) {
8372 sme_err("invalid buff size %d", buff_size);
8373 return -EINVAL;
8374 }
8375 mac_ctx->usr_cfg_ba_buff_size = buff_size;
8376 sme_debug("addba buff size is set to %d",
8377 mac_ctx->usr_cfg_ba_buff_size);
8378
8379 return 0;
8380}
8381
8382#define DEFAULT_BA_BUFF_SIZE 64
Jeff Johnsonc7309062018-11-09 20:59:42 -08008383int sme_send_addba_req(mac_handle_t mac_handle, uint8_t session_id, uint8_t tid,
8384 uint16_t buff_size)
Kiran Kumar Lokerebc87bec2018-02-27 20:06:42 -08008385{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08008386 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Kiran Kumar Lokerebc87bec2018-02-27 20:06:42 -08008387 uint16_t ba_buff = 0;
8388 QDF_STATUS status;
8389 struct scheduler_msg msg = {0};
8390 struct send_add_ba_req *send_ba_req;
8391 struct csr_roam_session *csr_session = NULL;
8392
8393 if (!csr_is_conn_state_connected_infra(mac_ctx, session_id)) {
8394 sme_err("STA not infra/connected state session_id: %d",
8395 session_id);
8396 return -EINVAL;
8397 }
8398 csr_session = CSR_GET_SESSION(mac_ctx, session_id);
8399 if (!csr_session) {
8400 sme_err("CSR session is NULL");
8401 return -EINVAL;
8402 }
8403 send_ba_req = qdf_mem_malloc(sizeof(*send_ba_req));
Arif Hussain0ef77082018-10-10 16:42:53 -07008404 if (!send_ba_req)
Kiran Kumar Lokerebc87bec2018-02-27 20:06:42 -08008405 return -EIO;
Arif Hussain0ef77082018-10-10 16:42:53 -07008406
Kiran Kumar Lokerebc87bec2018-02-27 20:06:42 -08008407 qdf_mem_copy(send_ba_req->mac_addr,
8408 csr_session->connectedProfile.bssid.bytes,
8409 QDF_MAC_ADDR_SIZE);
8410 ba_buff = buff_size;
8411 if (!buff_size) {
8412 if (mac_ctx->usr_cfg_ba_buff_size)
8413 ba_buff = mac_ctx->usr_cfg_ba_buff_size;
8414 else
8415 ba_buff = DEFAULT_BA_BUFF_SIZE;
8416 }
8417 send_ba_req->param.vdev_id = session_id;
8418 send_ba_req->param.tidno = tid;
8419 send_ba_req->param.buffersize = ba_buff;
8420 msg.type = WMA_SEND_ADDBA_REQ;
8421 msg.bodyptr = send_ba_req;
gaurank kathpalia36b0c582018-08-28 17:45:43 +05308422 status = scheduler_post_message(QDF_MODULE_ID_SME,
8423 QDF_MODULE_ID_WMA,
8424 QDF_MODULE_ID_WMA, &msg);
Kiran Kumar Lokerebc87bec2018-02-27 20:06:42 -08008425 if (QDF_STATUS_SUCCESS != status) {
Kiran Kumar Lokerebc87bec2018-02-27 20:06:42 -08008426 qdf_mem_free(send_ba_req);
8427 return -EIO;
8428 }
8429 sme_debug("ADDBA_REQ sent to FW: tid %d buff_size %d", tid, ba_buff);
8430
8431 return 0;
8432}
8433
Jeff Johnsonc7309062018-11-09 20:59:42 -08008434int sme_set_no_ack_policy(mac_handle_t mac_handle, uint8_t session_id,
8435 uint8_t val, uint8_t ac)
Kiran Kumar Lokere3324f632018-03-01 21:43:21 -08008436{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08008437 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Kiran Kumar Lokere3324f632018-03-01 21:43:21 -08008438 uint8_t i, set_val;
Arif Hussaineb8ba362018-03-07 19:15:13 -08008439 struct scheduler_msg msg = {0};
8440 QDF_STATUS status;
Kiran Kumar Lokere3324f632018-03-01 21:43:21 -08008441
Srinivas Girigowda5b86fbd2019-03-21 14:54:14 -07008442 if (ac > QCA_WLAN_AC_ALL) {
Kiran Kumar Lokere3324f632018-03-01 21:43:21 -08008443 sme_err("invalid ac val %d", ac);
8444 return -EINVAL;
8445 }
8446 if (val)
8447 set_val = 1;
8448 else
8449 set_val = 0;
Srinivas Girigowda5b86fbd2019-03-21 14:54:14 -07008450 if (ac == QCA_WLAN_AC_ALL) {
Kiran Kumar Lokere3324f632018-03-01 21:43:21 -08008451 for (i = 0; i < ac; i++)
8452 mac_ctx->no_ack_policy_cfg[i] = set_val;
8453 } else {
8454 mac_ctx->no_ack_policy_cfg[ac] = set_val;
8455 }
8456 sme_debug("no ack is set to %d for ac %d", set_val, ac);
Arif Hussaineb8ba362018-03-07 19:15:13 -08008457 qdf_mem_zero(&msg, sizeof(msg));
8458 msg.type = eWNI_SME_UPDATE_EDCA_PROFILE;
8459 msg.reserved = 0;
8460 msg.bodyval = session_id;
gaurank kathpalia36b0c582018-08-28 17:45:43 +05308461 status = scheduler_post_message(QDF_MODULE_ID_SME,
8462 QDF_MODULE_ID_PE,
8463 QDF_MODULE_ID_PE, &msg);
Arif Hussaineb8ba362018-03-07 19:15:13 -08008464 if (status != QDF_STATUS_SUCCESS) {
8465 sme_err("Not able to post update edca profile");
8466 return -EIO;
8467 }
Kiran Kumar Lokere3324f632018-03-01 21:43:21 -08008468
8469 return 0;
8470}
8471
Jeff Johnsonc7309062018-11-09 20:59:42 -08008472int sme_set_auto_rate_he_ltf(mac_handle_t mac_handle, uint8_t session_id,
8473 uint8_t cfg_val)
Kiran Kumar Lokerea006a302018-03-07 20:58:13 -08008474{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08008475 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Kiran Kumar Lokerea006a302018-03-07 20:58:13 -08008476 uint32_t set_val;
8477 uint32_t bit_mask = 0;
8478 int status;
8479
8480 if (cfg_val > QCA_WLAN_HE_LTF_4X) {
8481 sme_err("invalid HE LTF cfg %d", cfg_val);
8482 return -EINVAL;
8483 }
8484
8485 /*set the corresponding HE LTF cfg BIT*/
8486 if (cfg_val == QCA_WLAN_HE_LTF_AUTO)
8487 bit_mask = HE_LTF_ALL;
8488 else
8489 bit_mask = (1 << (cfg_val - 1));
8490
8491 set_val = mac_ctx->he_sgi_ltf_cfg_bit_mask;
8492
8493 SET_AUTO_RATE_HE_LTF_VAL(set_val, bit_mask);
8494
8495 mac_ctx->he_sgi_ltf_cfg_bit_mask = set_val;
8496 status = wma_cli_set_command(session_id,
8497 WMI_VDEV_PARAM_AUTORATE_MISC_CFG,
8498 set_val, VDEV_CMD);
8499 if (status) {
8500 sme_err("failed to set he_ltf_sgi");
8501 return status;
8502 }
8503
8504 sme_debug("HE SGI_LTF is set to 0x%08X",
8505 mac_ctx->he_sgi_ltf_cfg_bit_mask);
8506
8507 return 0;
8508}
8509
Jeff Johnsonc7309062018-11-09 20:59:42 -08008510int sme_set_auto_rate_he_sgi(mac_handle_t mac_handle, uint8_t session_id,
8511 uint8_t cfg_val)
Kiran Kumar Lokerea006a302018-03-07 20:58:13 -08008512{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08008513 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Kiran Kumar Lokerea006a302018-03-07 20:58:13 -08008514 uint32_t set_val;
8515 uint32_t sgi_bit_mask = 0;
8516 int status;
8517
8518 if ((cfg_val > AUTO_RATE_GI_3200NS) ||
8519 (cfg_val < AUTO_RATE_GI_400NS)) {
8520 sme_err("invalid auto rate GI cfg %d", cfg_val);
8521 return -EINVAL;
8522 }
8523
8524 sgi_bit_mask = (1 << cfg_val);
8525
8526 set_val = mac_ctx->he_sgi_ltf_cfg_bit_mask;
8527 SET_AUTO_RATE_SGI_VAL(set_val, sgi_bit_mask);
8528
8529 mac_ctx->he_sgi_ltf_cfg_bit_mask = set_val;
8530 status = wma_cli_set_command(session_id,
8531 WMI_VDEV_PARAM_AUTORATE_MISC_CFG,
8532 set_val, VDEV_CMD);
8533 if (status) {
8534 sme_err("failed to set he_ltf_sgi");
8535 return status;
8536 }
8537
8538 sme_debug("auto rate HE SGI_LTF is set to 0x%08X",
8539 mac_ctx->he_sgi_ltf_cfg_bit_mask);
8540
8541 return 0;
8542}
8543
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008544#define HT20_SHORT_GI_MCS7_RATE 722
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05308545/*
8546 * sme_send_rate_update_ind() -
8547 * API to Update rate
8548 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08008549 * mac_handle - The handle returned by mac_open
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05308550 * rateUpdateParams - Pointer to rate update params
8551 * Return QDF_STATUS
8552 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08008553QDF_STATUS sme_send_rate_update_ind(mac_handle_t mac_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008554 tSirRateUpdateInd *rateUpdateParams)
8555{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08008556 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308557 QDF_STATUS status;
Rajeev Kumar37d478b2017-04-17 16:59:28 -07008558 struct scheduler_msg msg = {0};
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308559 tSirRateUpdateInd *rate_upd = qdf_mem_malloc(sizeof(tSirRateUpdateInd));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008560
Arif Hussain0ef77082018-10-10 16:42:53 -07008561 if (!rate_upd)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308562 return QDF_STATUS_E_FAILURE;
Arif Hussain0ef77082018-10-10 16:42:53 -07008563
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008564 *rate_upd = *rateUpdateParams;
8565
8566 if (rate_upd->mcastDataRate24GHz == HT20_SHORT_GI_MCS7_RATE)
8567 rate_upd->mcastDataRate24GHzTxFlag =
Naveen Rawatea1564b2018-05-17 15:56:11 -07008568 TX_RATE_HT20 | TX_RATE_SGI;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008569 else if (rate_upd->reliableMcastDataRate ==
8570 HT20_SHORT_GI_MCS7_RATE)
8571 rate_upd->reliableMcastDataRateTxFlag =
Naveen Rawatea1564b2018-05-17 15:56:11 -07008572 TX_RATE_HT20 | TX_RATE_SGI;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008573
Jeff Johnson01f2c232018-11-21 19:17:44 -08008574 status = sme_acquire_global_lock(&mac->sme);
Abhinav Kumar009f69f2019-06-05 21:43:31 +05308575 if (QDF_IS_STATUS_ERROR(status)) {
8576 qdf_mem_free(rate_upd);
8577 return status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008578 }
8579
Abhinav Kumar009f69f2019-06-05 21:43:31 +05308580 msg.type = WMA_RATE_UPDATE_IND;
8581 msg.bodyptr = rate_upd;
8582 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
8583 NO_SESSION, msg.type));
8584
8585 status = scheduler_post_message(QDF_MODULE_ID_SME, QDF_MODULE_ID_WMA,
8586 QDF_MODULE_ID_WMA, &msg);
8587 if (QDF_IS_STATUS_ERROR(status)) {
8588 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
8589 "%s: Not able to post WMA_RATE_UPDATE_IND to WMA!",
8590 __func__);
8591 qdf_mem_free(rate_upd);
8592 status = QDF_STATUS_E_FAILURE;
8593 }
8594
8595 sme_release_global_lock(&mac->sme);
8596
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008597 return status;
8598}
8599
8600/**
Kondabattini, Ganeshe4f18e02016-09-13 13:01:22 +05308601 * sme_update_access_policy_vendor_ie() - update vendor ie and access policy.
Jeff Johnsonc7309062018-11-09 20:59:42 -08008602 * @mac_handle: Pointer to the mac context
Abhishek Singh345be412019-11-19 10:59:29 +05308603 * @vdev_id: vdev_id
Kondabattini, Ganeshe4f18e02016-09-13 13:01:22 +05308604 * @vendor_ie: vendor ie
8605 * @access_policy: vendor ie access policy
8606 *
8607 * This function updates the vendor ie and access policy to lim.
8608 *
8609 * Return: success or failure.
8610 */
Jeff Johnsonc7309062018-11-09 20:59:42 -08008611QDF_STATUS sme_update_access_policy_vendor_ie(mac_handle_t mac_handle,
Abhishek Singh345be412019-11-19 10:59:29 +05308612 uint8_t vdev_id,
Jeff Johnsonc7309062018-11-09 20:59:42 -08008613 uint8_t *vendor_ie,
8614 int access_policy)
Kondabattini, Ganeshe4f18e02016-09-13 13:01:22 +05308615{
8616 struct sme_update_access_policy_vendor_ie *msg;
8617 uint16_t msg_len;
8618 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Kondabattini, Ganeshe4f18e02016-09-13 13:01:22 +05308619
8620 msg_len = sizeof(*msg);
8621
8622 msg = qdf_mem_malloc(msg_len);
8623 if (!msg) {
Srinivas Girigowda09625b02018-09-10 15:28:09 -07008624 return QDF_STATUS_E_NOMEM;
Kondabattini, Ganeshe4f18e02016-09-13 13:01:22 +05308625 }
8626
Kondabattini, Ganeshe4f18e02016-09-13 13:01:22 +05308627 msg->msg_type = (uint16_t)eWNI_SME_UPDATE_ACCESS_POLICY_VENDOR_IE;
8628 msg->length = (uint16_t)msg_len;
8629
8630 qdf_mem_copy(&msg->ie[0], vendor_ie, sizeof(msg->ie));
8631
Abhishek Singh345be412019-11-19 10:59:29 +05308632 msg->vdev_id = vdev_id;
Kondabattini, Ganeshe4f18e02016-09-13 13:01:22 +05308633 msg->access_policy = access_policy;
8634
Abhishek Singh345be412019-11-19 10:59:29 +05308635 sme_debug("vdev_id: %hu, access_policy: %d", vdev_id, access_policy);
Rajeev Kumard138ac52017-01-30 18:38:37 -08008636 status = umac_send_mb_message_to_mac(msg);
Kondabattini, Ganeshe4f18e02016-09-13 13:01:22 +05308637
8638 return status;
8639}
8640
8641/**
Agrawal, Ashish4e5fa1c2016-09-21 19:03:43 +05308642 * sme_update_sta_inactivity_timeout(): Update sta_inactivity_timeout to FW
Jeff Johnsonc7309062018-11-09 20:59:42 -08008643 * @mac_handle: Handle returned by mac_open
Agrawal, Ashish4e5fa1c2016-09-21 19:03:43 +05308644 * @session_id: Session ID on which sta_inactivity_timeout needs
8645 * to be updated to FW
8646 * @sta_inactivity_timeout: sta inactivity timeout.
8647 *
8648 * If a station does not send anything in sta_inactivity_timeout seconds, an
8649 * empty data frame is sent to it in order to verify whether it is
8650 * still in range. If this frame is not ACKed, the station will be
8651 * disassociated and then deauthenticated.
8652 *
8653 * Return: QDF_STATUS_SUCCESS or non-zero on failure.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05308654 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08008655QDF_STATUS sme_update_sta_inactivity_timeout(mac_handle_t mac_handle,
Agrawal, Ashish4e5fa1c2016-09-21 19:03:43 +05308656 struct sme_sta_inactivity_timeout *sta_inactivity_timer)
8657{
8658 struct sme_sta_inactivity_timeout *inactivity_time;
8659 void *wma_handle;
8660
8661 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
8662 inactivity_time = qdf_mem_malloc(sizeof(*inactivity_time));
Arif Hussain0ef77082018-10-10 16:42:53 -07008663 if (!inactivity_time)
Agrawal, Ashish4e5fa1c2016-09-21 19:03:43 +05308664 return QDF_STATUS_E_FAILURE;
Arif Hussain0ef77082018-10-10 16:42:53 -07008665
Abhishek Singhe4a1f882017-08-10 17:59:44 +05308666 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Agrawal, Ashish4e5fa1c2016-09-21 19:03:43 +05308667 FL("sta_inactivity_timeout: %d"),
8668 sta_inactivity_timer->sta_inactivity_timeout);
8669 inactivity_time->session_id = sta_inactivity_timer->session_id;
8670 inactivity_time->sta_inactivity_timeout =
8671 sta_inactivity_timer->sta_inactivity_timeout;
8672
gaurank kathpalia45685492019-06-06 15:38:32 +05308673 wma_update_sta_inactivity_timeout(wma_handle, inactivity_time);
8674 qdf_mem_free(inactivity_time);
Agrawal, Ashish4e5fa1c2016-09-21 19:03:43 +05308675 return QDF_STATUS_SUCCESS;
8676}
8677
bingse063e4f2019-10-31 18:26:46 +08008678QDF_STATUS sme_get_reg_info(mac_handle_t mac_handle, uint32_t chan_freq,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008679 uint32_t *regInfo1, uint32_t *regInfo2)
8680{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08008681 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308682 QDF_STATUS status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008683 uint8_t i;
8684 bool found = false;
8685
Jeff Johnson01f2c232018-11-21 19:17:44 -08008686 status = sme_acquire_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008687 *regInfo1 = 0;
8688 *regInfo2 = 0;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308689 if (!QDF_IS_STATUS_SUCCESS(status))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008690 return status;
8691
Wu Gao0821b0d2019-01-11 17:31:11 +08008692 for (i = 0; i < CFG_VALID_CHANNEL_LIST_LEN; i++) {
bingse063e4f2019-10-31 18:26:46 +08008693 if (mac->scan.defaultPowerTable[i].center_freq == chan_freq) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008694 SME_SET_CHANNEL_REG_POWER(*regInfo1,
Jeff Johnson01f2c232018-11-21 19:17:44 -08008695 mac->scan.defaultPowerTable[i].tx_power);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008696
8697 SME_SET_CHANNEL_MAX_TX_POWER(*regInfo2,
Jeff Johnson01f2c232018-11-21 19:17:44 -08008698 mac->scan.defaultPowerTable[i].tx_power);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008699 found = true;
8700 break;
8701 }
8702 }
8703 if (!found)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308704 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008705
Jeff Johnson01f2c232018-11-21 19:17:44 -08008706 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008707 return status;
8708}
8709
8710#ifdef FEATURE_WLAN_AUTO_SHUTDOWN
Jeff Johnsonb460dd72018-11-08 10:26:51 -08008711QDF_STATUS sme_set_auto_shutdown_cb(mac_handle_t mac_handle,
Jeff Johnsoneb7bbed2019-02-17 10:34:24 -08008712 void (*callback_fn)(void))
Jeff Johnsonb460dd72018-11-08 10:26:51 -08008713{
Jeff Johnsoneb7bbed2019-02-17 10:34:24 -08008714 QDF_STATUS status;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08008715 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008716
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308717 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008718 "%s: Plug in Auto shutdown event callback", __func__);
8719
Jeff Johnson01f2c232018-11-21 19:17:44 -08008720 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308721 if (QDF_STATUS_SUCCESS == status) {
Jeff Johnson038efe72019-03-18 13:39:31 -07008722 if (callback_fn)
Jeff Johnsoneb7bbed2019-02-17 10:34:24 -08008723 mac->sme.auto_shutdown_cb = callback_fn;
Jeff Johnson01f2c232018-11-21 19:17:44 -08008724 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008725 }
8726
8727 return status;
8728}
8729
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05308730/*
8731 * sme_set_auto_shutdown_timer() -
8732 * API to set auto shutdown timer value in FW.
8733 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08008734 * mac_handle - The handle returned by mac_open
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05308735 * timer_val - The auto shutdown timer value to be set
8736 * Return Configuration message posting status, SUCCESS or Fail
8737 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08008738QDF_STATUS sme_set_auto_shutdown_timer(mac_handle_t mac_handle,
8739 uint32_t timer_val)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008740{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308741 QDF_STATUS status = QDF_STATUS_SUCCESS;
8742 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08008743 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Jeff Johnsona9ade7d2019-02-17 10:08:17 -08008744 struct auto_shutdown_cmd *auto_sh_cmd;
Rajeev Kumar37d478b2017-04-17 16:59:28 -07008745 struct scheduler_msg message = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008746
Jeff Johnson01f2c232018-11-21 19:17:44 -08008747 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308748 if (QDF_STATUS_SUCCESS == status) {
Jeff Johnsona9ade7d2019-02-17 10:08:17 -08008749 auto_sh_cmd = qdf_mem_malloc(sizeof(*auto_sh_cmd));
Arif Hussain0ef77082018-10-10 16:42:53 -07008750 if (!auto_sh_cmd) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08008751 sme_release_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308752 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008753 }
8754
8755 auto_sh_cmd->timer_val = timer_val;
8756
8757 /* serialize the req through MC thread */
Rajeev Kumar8eaedf62017-01-21 11:03:13 -08008758 message.bodyptr = auto_sh_cmd;
8759 message.type = WMA_SET_AUTO_SHUTDOWN_TIMER_REQ;
gaurank kathpalia36b0c582018-08-28 17:45:43 +05308760 qdf_status = scheduler_post_message(QDF_MODULE_ID_SME,
8761 QDF_MODULE_ID_WMA,
8762 QDF_MODULE_ID_WMA,
8763 &message);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308764 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308765 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008766 "%s: Post Auto shutdown MSG fail", __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308767 qdf_mem_free(auto_sh_cmd);
Jeff Johnson01f2c232018-11-21 19:17:44 -08008768 sme_release_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308769 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008770 }
Abhishek Singhe4a1f882017-08-10 17:59:44 +05308771 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008772 "%s: Posted Auto shutdown MSG", __func__);
Jeff Johnson01f2c232018-11-21 19:17:44 -08008773 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008774 }
8775
8776 return status;
8777}
8778#endif
8779
Nirav Shaheb017be2018-02-15 11:20:58 +05308780#ifdef FEATURE_WLAN_CH_AVOID
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05308781/*
8782 * sme_ch_avoid_update_req() -
8783 * API to request channel avoidance update from FW.
8784 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08008785 * mac_handle - The handle returned by mac_open
Jeff Johnsonc5927de2018-05-11 09:12:53 -07008786 * update_type - The update_type parameter of this request call
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05308787 * Return Configuration message posting status, SUCCESS or Fail
8788 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08008789QDF_STATUS sme_ch_avoid_update_req(mac_handle_t mac_handle)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008790{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308791 QDF_STATUS status = QDF_STATUS_SUCCESS;
8792 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08008793 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008794 tSirChAvoidUpdateReq *cauReq;
Rajeev Kumar37d478b2017-04-17 16:59:28 -07008795 struct scheduler_msg message = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008796
Jeff Johnson01f2c232018-11-21 19:17:44 -08008797 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308798 if (QDF_STATUS_SUCCESS == status) {
Arif Hussain0ef77082018-10-10 16:42:53 -07008799 cauReq = qdf_mem_malloc(sizeof(tSirChAvoidUpdateReq));
8800 if (!cauReq) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08008801 sme_release_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308802 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008803 }
8804
8805 cauReq->reserved_param = 0;
8806
8807 /* serialize the req through MC thread */
Rajeev Kumar8eaedf62017-01-21 11:03:13 -08008808 message.bodyptr = cauReq;
8809 message.type = WMA_CH_AVOID_UPDATE_REQ;
gaurank kathpalia36b0c582018-08-28 17:45:43 +05308810 qdf_status = scheduler_post_message(QDF_MODULE_ID_SME,
8811 QDF_MODULE_ID_WMA,
8812 QDF_MODULE_ID_WMA,
8813 &message);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308814 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308815 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008816 "%s: Post Ch Avoid Update MSG fail",
8817 __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308818 qdf_mem_free(cauReq);
Jeff Johnson01f2c232018-11-21 19:17:44 -08008819 sme_release_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308820 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008821 }
Abhishek Singhe4a1f882017-08-10 17:59:44 +05308822 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008823 "%s: Posted Ch Avoid Update MSG", __func__);
Jeff Johnson01f2c232018-11-21 19:17:44 -08008824 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008825 }
8826
8827 return status;
8828}
Nirav Shaheb017be2018-02-15 11:20:58 +05308829#endif
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008830
8831/**
8832 * sme_set_miracast() - Function to set miracast value to UMAC
Jeff Johnsonc7309062018-11-09 20:59:42 -08008833 * @mac_handle: Handle returned by macOpen
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008834 * @filter_type: 0-Disabled, 1-Source, 2-sink
8835 *
8836 * This function passes down the value of miracast set by
8837 * framework to UMAC
8838 *
8839 * Return: Configuration message posting status, SUCCESS or Fail
8840 *
8841 */
Jeff Johnsonc7309062018-11-09 20:59:42 -08008842QDF_STATUS sme_set_miracast(mac_handle_t mac_handle, uint8_t filter_type)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008843{
Rajeev Kumar37d478b2017-04-17 16:59:28 -07008844 struct scheduler_msg msg = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008845 uint32_t *val;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08008846 struct mac_context *mac_ptr = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008847
Arif Hussain0ef77082018-10-10 16:42:53 -07008848 if (!mac_ptr) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308849 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008850 "%s: Invalid pointer", __func__);
Arif Hussain0ef77082018-10-10 16:42:53 -07008851 return QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008852 }
8853
Arif Hussain0ef77082018-10-10 16:42:53 -07008854 val = qdf_mem_malloc(sizeof(*val));
8855 if (!val)
8856 return QDF_STATUS_E_NOMEM;
8857
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008858 *val = filter_type;
8859
8860 msg.type = SIR_HAL_SET_MIRACAST;
8861 msg.reserved = 0;
8862 msg.bodyptr = val;
8863
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308864 if (!QDF_IS_STATUS_SUCCESS(
gaurank kathpalia36b0c582018-08-28 17:45:43 +05308865 scheduler_post_message(QDF_MODULE_ID_SME,
8866 QDF_MODULE_ID_WMA,
8867 QDF_MODULE_ID_WMA,
8868 &msg))) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308869 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008870 "%s: Not able to post WDA_SET_MAS_ENABLE_DISABLE to WMA!",
8871 __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308872 qdf_mem_free(val);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308873 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008874 }
8875
8876 mac_ptr->sme.miracast_value = filter_type;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308877 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008878}
8879
8880/**
8881 * sme_set_mas() - Function to set MAS value to UMAC
8882 * @val: 1-Enable, 0-Disable
8883 *
8884 * This function passes down the value of MAS to the UMAC. A
8885 * value of 1 will enable MAS and a value of 0 will disable MAS
8886 *
8887 * Return: Configuration message posting status, SUCCESS or Fail
8888 *
8889 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308890QDF_STATUS sme_set_mas(uint32_t val)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008891{
Rajeev Kumar37d478b2017-04-17 16:59:28 -07008892 struct scheduler_msg msg = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008893 uint32_t *ptr_val;
8894
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308895 ptr_val = qdf_mem_malloc(sizeof(*ptr_val));
Arif Hussain0ef77082018-10-10 16:42:53 -07008896 if (!ptr_val)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308897 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008898
8899 *ptr_val = val;
8900
8901 msg.type = SIR_HAL_SET_MAS;
8902 msg.reserved = 0;
8903 msg.bodyptr = ptr_val;
8904
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308905 if (!QDF_IS_STATUS_SUCCESS(
gaurank kathpalia36b0c582018-08-28 17:45:43 +05308906 scheduler_post_message(QDF_MODULE_ID_SME,
8907 QDF_MODULE_ID_WMA,
8908 QDF_MODULE_ID_WMA,
8909 &msg))) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308910 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008911 "%s: Not able to post WDA_SET_MAS_ENABLE_DISABLE to WMA!",
8912 __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308913 qdf_mem_free(ptr_val);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308914 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008915 }
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308916 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008917}
8918
Kiran Kumar Lokere999e58c2016-01-07 02:18:39 -08008919/**
8920 * sme_roam_channel_change_req() - Channel change to new target channel
Jeff Johnsonb460dd72018-11-08 10:26:51 -08008921 * @mac_handle: handle returned by mac_open
Kiran Kumar Lokere999e58c2016-01-07 02:18:39 -08008922 * @bssid: mac address of BSS
8923 * @ch_params: target channel information
8924 * @profile: CSR profile
8925 *
8926 * API to Indicate Channel change to new target channel
8927 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308928 * Return: QDF_STATUS
Kiran Kumar Lokere999e58c2016-01-07 02:18:39 -08008929 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08008930QDF_STATUS sme_roam_channel_change_req(mac_handle_t mac_handle,
Amar Singhale4f28ee2015-10-21 14:36:56 -07008931 struct qdf_mac_addr bssid,
Amar Singhal5cccafe2017-02-15 12:42:58 -08008932 struct ch_params *ch_params,
Jeff Johnson66ee8a92018-03-17 15:24:26 -07008933 struct csr_roam_profile *profile)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008934{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308935 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08008936 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008937
Jeff Johnson01f2c232018-11-21 19:17:44 -08008938 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308939 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008940
Jeff Johnson01f2c232018-11-21 19:17:44 -08008941 status = csr_roam_channel_change_req(mac, bssid, ch_params,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008942 profile);
Jeff Johnson01f2c232018-11-21 19:17:44 -08008943 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008944 }
8945 return status;
8946}
8947
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05308948/*
8949 * sme_process_channel_change_resp() -
8950 * API to Indicate Channel change response message to SAP.
8951 *
8952 * Return QDF_STATUS
8953 */
Jeff Johnson0a8786a2018-12-02 10:49:01 -08008954static QDF_STATUS sme_process_channel_change_resp(struct mac_context *mac,
Pragaspathi Thilagaraj469495b2019-05-30 00:18:31 +05308955 uint16_t msg_type, void *msg_buf)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008956{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308957 QDF_STATUS status = QDF_STATUS_SUCCESS;
Min Liu3621ede2018-11-07 18:36:00 +08008958 struct csr_roam_info *roam_info;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008959 eCsrRoamResult roamResult;
Jianmin Zhue9fbc3f2019-09-18 09:55:16 +08008960 uint8_t session_id;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008961
Min Liu3621ede2018-11-07 18:36:00 +08008962 roam_info = qdf_mem_malloc(sizeof(*roam_info));
8963 if (!roam_info)
8964 return QDF_STATUS_E_NOMEM;
8965
8966 roam_info->channelChangeRespEvent =
Jianmin Zhue9fbc3f2019-09-18 09:55:16 +08008967 (struct sSirChanChangeResponse *)msg_buf;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008968
Jianmin Zhue9fbc3f2019-09-18 09:55:16 +08008969 session_id = roam_info->channelChangeRespEvent->sessionId;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008970
Jianmin Zhue9fbc3f2019-09-18 09:55:16 +08008971 if (roam_info->channelChangeRespEvent->channelChangeStatus ==
8972 QDF_STATUS_SUCCESS) {
8973 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
8974 "sapdfs: Received success eWNI_SME_CHANNEL_CHANGE_RSP for sessionId[%d]",
8975 session_id);
8976 roamResult = eCSR_ROAM_RESULT_CHANNEL_CHANGE_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008977 } else {
Jianmin Zhue9fbc3f2019-09-18 09:55:16 +08008978 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
8979 "sapdfs: Received failure eWNI_SME_CHANNEL_CHANGE_RSP for sessionId[%d]",
8980 session_id);
8981 roamResult = eCSR_ROAM_RESULT_CHANNEL_CHANGE_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008982 }
Jianmin Zhue9fbc3f2019-09-18 09:55:16 +08008983
8984 csr_roam_call_callback(mac, session_id, roam_info, 0,
8985 eCSR_ROAM_SET_CHANNEL_RSP, roamResult);
8986
Min Liu3621ede2018-11-07 18:36:00 +08008987 qdf_mem_free(roam_info);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008988
8989 return status;
8990}
8991
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05308992/*
8993 * sme_roam_start_beacon_req() -
8994 * API to Indicate LIM to start Beacon Tx after SAP CAC Wait is completed.
8995 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08008996 * mac_handle - The handle returned by mac_open
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05308997 * sessionId - session ID
8998 * dfsCacWaitStatus - CAC WAIT status flag
8999 * Return QDF_STATUS
9000 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08009001QDF_STATUS sme_roam_start_beacon_req(mac_handle_t mac_handle,
Jeff Johnson1f2dabc2018-11-07 15:33:01 -08009002 struct qdf_mac_addr bssid,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009003 uint8_t dfsCacWaitStatus)
9004{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309005 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08009006 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05309007
Jeff Johnson01f2c232018-11-21 19:17:44 -08009008 status = sme_acquire_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009009
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309010 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08009011 status = csr_roam_start_beacon_req(mac, bssid,
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05309012 dfsCacWaitStatus);
Jeff Johnson01f2c232018-11-21 19:17:44 -08009013 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009014 }
9015 return status;
9016}
9017
Jeff Johnson0a8786a2018-12-02 10:49:01 -08009018QDF_STATUS sme_csa_restart(struct mac_context *mac_ctx, uint8_t session_id)
Abhishek Singh20a8e442018-09-12 15:50:44 +05309019{
9020 QDF_STATUS status = QDF_STATUS_E_FAILURE;
9021
9022 status = sme_acquire_global_lock(&mac_ctx->sme);
9023 if (QDF_IS_STATUS_SUCCESS(status)) {
9024 status = csr_csa_restart(mac_ctx, session_id);
9025 sme_release_global_lock(&mac_ctx->sme);
9026 }
9027
9028 return status;
9029}
Abhishek Singh20a8e442018-09-12 15:50:44 +05309030
Jeff Johnsonb460dd72018-11-08 10:26:51 -08009031QDF_STATUS sme_roam_csa_ie_request(mac_handle_t mac_handle,
9032 struct qdf_mac_addr bssid,
Tushnim Bhattacharyyafaa9c012019-10-28 15:18:36 -07009033 uint32_t target_chan_freq, uint8_t csaIeReqd,
Jeff Johnsonb460dd72018-11-08 10:26:51 -08009034 struct ch_params *ch_params)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009035{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309036 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08009037 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05309038
Jeff Johnson01f2c232018-11-21 19:17:44 -08009039 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309040 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08009041 status = csr_roam_send_chan_sw_ie_request(mac, bssid,
Tushnim Bhattacharyyafaa9c012019-10-28 15:18:36 -07009042 target_chan_freq, csaIeReqd, ch_params);
Jeff Johnson01f2c232018-11-21 19:17:44 -08009043 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009044 }
9045 return status;
9046}
9047
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05309048/*
9049 * sme_init_thermal_info() -
9050 * SME API to initialize the thermal mitigation parameters
9051 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08009052 * mac_handle
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05309053 * thermalParam : thermal mitigation parameters
9054 * Return QDF_STATUS
9055 */
Manikandan Mohan9045e2e2018-11-26 16:44:19 -08009056QDF_STATUS sme_init_thermal_info(mac_handle_t mac_handle)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009057{
9058 t_thermal_mgmt *pWmaParam;
Rajeev Kumar37d478b2017-04-17 16:59:28 -07009059 struct scheduler_msg msg = {0};
Jeff Johnson0a8786a2018-12-02 10:49:01 -08009060 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Manikandan Mohan9045e2e2018-11-26 16:44:19 -08009061 struct wlan_fwol_thermal_temp thermal_temp = {0};
9062 QDF_STATUS status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009063
Arif Hussain0ef77082018-10-10 16:42:53 -07009064 pWmaParam = qdf_mem_malloc(sizeof(t_thermal_mgmt));
9065 if (!pWmaParam)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309066 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009067
Manikandan Mohan9045e2e2018-11-26 16:44:19 -08009068 status = ucfg_fwol_get_thermal_temp(mac->psoc, &thermal_temp);
9069 if (QDF_IS_STATUS_ERROR(status))
9070 return qdf_status_to_os_return(status);
9071
9072 pWmaParam->thermalMgmtEnabled = thermal_temp.thermal_mitigation_enable;
9073 pWmaParam->throttlePeriod = thermal_temp.throttle_period;
Poddar, Siddarth83905022016-04-16 17:56:08 -07009074
9075 pWmaParam->throttle_duty_cycle_tbl[0] =
Manikandan Mohan9045e2e2018-11-26 16:44:19 -08009076 thermal_temp.throttle_dutycycle_level[0];
Poddar, Siddarth83905022016-04-16 17:56:08 -07009077 pWmaParam->throttle_duty_cycle_tbl[1] =
Manikandan Mohan9045e2e2018-11-26 16:44:19 -08009078 thermal_temp.throttle_dutycycle_level[1];
Poddar, Siddarth83905022016-04-16 17:56:08 -07009079 pWmaParam->throttle_duty_cycle_tbl[2] =
Manikandan Mohan9045e2e2018-11-26 16:44:19 -08009080 thermal_temp.throttle_dutycycle_level[2];
Poddar, Siddarth83905022016-04-16 17:56:08 -07009081 pWmaParam->throttle_duty_cycle_tbl[3] =
Manikandan Mohan9045e2e2018-11-26 16:44:19 -08009082 thermal_temp.throttle_dutycycle_level[3];
Poddar, Siddarth83905022016-04-16 17:56:08 -07009083
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009084 pWmaParam->thermalLevels[0].minTempThreshold =
Manikandan Mohan9045e2e2018-11-26 16:44:19 -08009085 thermal_temp.thermal_temp_min_level[0];
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009086 pWmaParam->thermalLevels[0].maxTempThreshold =
Manikandan Mohan9045e2e2018-11-26 16:44:19 -08009087 thermal_temp.thermal_temp_max_level[0];
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009088 pWmaParam->thermalLevels[1].minTempThreshold =
Manikandan Mohan9045e2e2018-11-26 16:44:19 -08009089 thermal_temp.thermal_temp_min_level[1];
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009090 pWmaParam->thermalLevels[1].maxTempThreshold =
Manikandan Mohan9045e2e2018-11-26 16:44:19 -08009091 thermal_temp.thermal_temp_max_level[1];
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009092 pWmaParam->thermalLevels[2].minTempThreshold =
Manikandan Mohan9045e2e2018-11-26 16:44:19 -08009093 thermal_temp.thermal_temp_min_level[2];
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009094 pWmaParam->thermalLevels[2].maxTempThreshold =
Manikandan Mohan9045e2e2018-11-26 16:44:19 -08009095 thermal_temp.thermal_temp_max_level[2];
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009096 pWmaParam->thermalLevels[3].minTempThreshold =
Manikandan Mohan9045e2e2018-11-26 16:44:19 -08009097 thermal_temp.thermal_temp_min_level[3];
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009098 pWmaParam->thermalLevels[3].maxTempThreshold =
Manikandan Mohan9045e2e2018-11-26 16:44:19 -08009099 thermal_temp.thermal_temp_max_level[3];
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009100
Jeff Johnson01f2c232018-11-21 19:17:44 -08009101 if (QDF_STATUS_SUCCESS == sme_acquire_global_lock(&mac->sme)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009102 msg.type = WMA_INIT_THERMAL_INFO_CMD;
9103 msg.bodyptr = pWmaParam;
9104
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309105 if (!QDF_IS_STATUS_SUCCESS
gaurank kathpalia36b0c582018-08-28 17:45:43 +05309106 (scheduler_post_message(QDF_MODULE_ID_SME,
9107 QDF_MODULE_ID_WMA,
9108 QDF_MODULE_ID_WMA,
9109 &msg))) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05309110 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009111 "%s: Not able to post WMA_SET_THERMAL_INFO_CMD to WMA!",
9112 __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05309113 qdf_mem_free(pWmaParam);
Jeff Johnson01f2c232018-11-21 19:17:44 -08009114 sme_release_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309115 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009116 }
Jeff Johnson01f2c232018-11-21 19:17:44 -08009117 sme_release_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309118 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009119 }
Anurag Chouhan600c3a02016-03-01 10:33:54 +05309120 qdf_mem_free(pWmaParam);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309121 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009122}
9123
9124/**
9125 * sme_add_set_thermal_level_callback() - Plug in set thermal level callback
Jeff Johnsonc7309062018-11-09 20:59:42 -08009126 * @mac_handle: Handle returned by macOpen
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009127 * @callback: sme_set_thermal_level_callback
9128 *
9129 * Plug in set thermal level callback
9130 *
9131 * Return: none
9132 */
Jeff Johnsonc7309062018-11-09 20:59:42 -08009133void sme_add_set_thermal_level_callback(mac_handle_t mac_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009134 sme_set_thermal_level_callback callback)
9135{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08009136 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009137
Jeff Johnson01f2c232018-11-21 19:17:44 -08009138 mac->sme.set_thermal_level_cb = callback;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009139}
9140
9141/**
9142 * sme_set_thermal_level() - SME API to set the thermal mitigation level
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -08009143 * @mac_handle: Opaque handle to the global MAC context
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009144 * @level: Thermal mitigation level
9145 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309146 * Return: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009147 */
Jeff Johnsonc7309062018-11-09 20:59:42 -08009148QDF_STATUS sme_set_thermal_level(mac_handle_t mac_handle, uint8_t level)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009149{
Rajeev Kumar37d478b2017-04-17 16:59:28 -07009150 struct scheduler_msg msg = {0};
Jeff Johnson0a8786a2018-12-02 10:49:01 -08009151 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309152 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009153
Jeff Johnson01f2c232018-11-21 19:17:44 -08009154 if (QDF_STATUS_SUCCESS == sme_acquire_global_lock(&mac->sme)) {
hangtian127c9532019-01-12 13:29:07 +08009155 qdf_mem_zero(&msg, sizeof(msg));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009156 msg.type = WMA_SET_THERMAL_LEVEL;
9157 msg.bodyval = level;
9158
gaurank kathpalia36b0c582018-08-28 17:45:43 +05309159 qdf_status = scheduler_post_message(QDF_MODULE_ID_SME,
9160 QDF_MODULE_ID_WMA,
9161 QDF_MODULE_ID_WMA, &msg);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309162 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05309163 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009164 "%s: Not able to post WMA_SET_THERMAL_LEVEL to WMA!",
9165 __func__);
Jeff Johnson01f2c232018-11-21 19:17:44 -08009166 sme_release_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309167 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009168 }
Jeff Johnson01f2c232018-11-21 19:17:44 -08009169 sme_release_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309170 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009171 }
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309172 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009173}
9174
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05309175/*
9176 * sme_txpower_limit() -
9177 * SME API to set txpower limits
9178 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08009179 * mac_handle
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05309180 * psmetx : power limits for 2g/5g
9181 * Return QDF_STATUS
9182 */
Jeff Johnson19ce8d02019-02-08 22:56:23 -08009183QDF_STATUS sme_txpower_limit(mac_handle_t mac_handle,
9184 struct tx_power_limit *psmetx)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009185{
Abhinav Kumar009f69f2019-06-05 21:43:31 +05309186 QDF_STATUS status;
Rajeev Kumar37d478b2017-04-17 16:59:28 -07009187 struct scheduler_msg message = {0};
Jeff Johnson0a8786a2018-12-02 10:49:01 -08009188 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Jeff Johnson19ce8d02019-02-08 22:56:23 -08009189 struct tx_power_limit *tx_power_limit;
Prashanth Bhatta75fa9a12016-01-11 18:30:08 -08009190
Anurag Chouhan600c3a02016-03-01 10:33:54 +05309191 tx_power_limit = qdf_mem_malloc(sizeof(*tx_power_limit));
Arif Hussain0ef77082018-10-10 16:42:53 -07009192 if (!tx_power_limit)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309193 return QDF_STATUS_E_FAILURE;
Prashanth Bhatta75fa9a12016-01-11 18:30:08 -08009194
9195 *tx_power_limit = *psmetx;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009196
Jeff Johnson01f2c232018-11-21 19:17:44 -08009197 status = sme_acquire_global_lock(&mac->sme);
Abhinav Kumar009f69f2019-06-05 21:43:31 +05309198 if (QDF_IS_STATUS_ERROR(status)) {
9199 qdf_mem_free(tx_power_limit);
9200 return status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009201 }
Abhinav Kumar009f69f2019-06-05 21:43:31 +05309202
9203 message.type = WMA_TX_POWER_LIMIT;
9204 message.bodyptr = tx_power_limit;
9205 status = scheduler_post_message(QDF_MODULE_ID_SME, QDF_MODULE_ID_WMA,
9206 QDF_MODULE_ID_WMA, &message);
9207 if (QDF_IS_STATUS_ERROR(status)) {
9208 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
9209 "%s: not able to post WMA_TX_POWER_LIMIT",
9210 __func__);
9211 status = QDF_STATUS_E_FAILURE;
9212 qdf_mem_free(tx_power_limit);
9213 }
9214
9215 sme_release_global_lock(&mac->sme);
9216
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009217 return status;
9218}
9219
Jeff Johnsonb460dd72018-11-08 10:26:51 -08009220QDF_STATUS sme_update_connect_debug(mac_handle_t mac_handle, uint32_t set_value)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009221{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309222 QDF_STATUS status = QDF_STATUS_SUCCESS;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08009223 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05309224
Jeff Johnson01f2c232018-11-21 19:17:44 -08009225 mac->mlme_cfg->gen.debug_packet_log = set_value;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009226 return status;
9227}
9228
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05309229/*
9230 * sme_ap_disable_intra_bss_fwd() -
9231 * SME will send message to WMA to set Intra BSS in txrx
9232 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08009233 * mac_handle - The handle returned by mac_open
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05309234 * sessionId - session id ( vdev id)
9235 * disablefwd - bool value that indicate disable intrabss fwd disable
9236 * Return QDF_STATUS
9237 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08009238QDF_STATUS sme_ap_disable_intra_bss_fwd(mac_handle_t mac_handle,
9239 uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009240 bool disablefwd)
9241{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08009242 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309243 int status = QDF_STATUS_SUCCESS;
9244 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Rajeev Kumar37d478b2017-04-17 16:59:28 -07009245 struct scheduler_msg message = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009246 tpDisableIntraBssFwd pSapDisableIntraFwd = NULL;
9247
9248 /* Prepare the request to send to SME. */
Anurag Chouhan600c3a02016-03-01 10:33:54 +05309249 pSapDisableIntraFwd = qdf_mem_malloc(sizeof(tDisableIntraBssFwd));
Jeff Johnson038efe72019-03-18 13:39:31 -07009250 if (!pSapDisableIntraFwd) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07009251 sme_err("Memory Allocation Failure!!!");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309252 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009253 }
9254
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009255 pSapDisableIntraFwd->sessionId = sessionId;
9256 pSapDisableIntraFwd->disableintrabssfwd = disablefwd;
9257
Jeff Johnson01f2c232018-11-21 19:17:44 -08009258 status = sme_acquire_global_lock(&mac->sme);
gaurank kathpalia45685492019-06-06 15:38:32 +05309259
9260 if (QDF_IS_STATUS_ERROR(status)) {
9261 qdf_mem_free(pSapDisableIntraFwd);
9262 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009263 }
gaurank kathpalia45685492019-06-06 15:38:32 +05309264 /* serialize the req through MC thread */
9265 message.bodyptr = pSapDisableIntraFwd;
9266 message.type = WMA_SET_SAP_INTRABSS_DIS;
9267 qdf_status = scheduler_post_message(QDF_MODULE_ID_SME,
9268 QDF_MODULE_ID_WMA,
9269 QDF_MODULE_ID_WMA,
9270 &message);
9271 if (QDF_IS_STATUS_ERROR(status)) {
9272 status = QDF_STATUS_E_FAILURE;
9273 qdf_mem_free(pSapDisableIntraFwd);
9274 }
9275 sme_release_global_lock(&mac->sme);
9276
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009277 return status;
9278}
9279
9280#ifdef WLAN_FEATURE_STATS_EXT
9281
Jeff Johnson45843652018-07-04 12:47:34 -07009282void sme_stats_ext_register_callback(mac_handle_t mac_handle,
9283 stats_ext_cb callback)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009284{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08009285 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009286
Jeff Johnson45843652018-07-04 12:47:34 -07009287 if (!mac) {
9288 sme_err("Invalid mac context");
Arun Khandavalli4b55da72016-07-19 19:55:01 +05309289 return;
9290 }
9291
Jeff Johnson45843652018-07-04 12:47:34 -07009292 mac->sme.stats_ext_cb = callback;
Arun Khandavalli4b55da72016-07-19 19:55:01 +05309293}
9294
Jeff Johnson45843652018-07-04 12:47:34 -07009295void sme_stats_ext_deregister_callback(mac_handle_t mac_handle)
9296{
9297 sme_stats_ext_register_callback(mac_handle, NULL);
9298}
9299
9300void sme_stats_ext2_register_callback(mac_handle_t mac_handle,
9301 stats_ext2_cb callback)
9302{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08009303 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Jeff Johnson45843652018-07-04 12:47:34 -07009304
9305 if (!mac) {
9306 sme_err("Invalid mac context");
9307 return;
9308 }
9309
9310 mac->sme.stats_ext2_cb = callback;
9311}
Arun Khandavalli4b55da72016-07-19 19:55:01 +05309312
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05309313/*
9314 * sme_stats_ext_request() -
9315 * Function called when HDD receives STATS EXT vendor command from userspace
9316 *
9317 * sessionID - vdevID for the stats ext request
9318 * input - Stats Ext Request structure ptr
9319 * Return QDF_STATUS
9320 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309321QDF_STATUS sme_stats_ext_request(uint8_t session_id, tpStatsExtRequestReq input)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009322{
Rajeev Kumar37d478b2017-04-17 16:59:28 -07009323 struct scheduler_msg msg = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009324 tpStatsExtRequest data;
9325 size_t data_len;
9326
9327 data_len = sizeof(tStatsExtRequest) + input->request_data_len;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05309328 data = qdf_mem_malloc(data_len);
Arif Hussain0ef77082018-10-10 16:42:53 -07009329 if (!data)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309330 return QDF_STATUS_E_NOMEM;
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05309331
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009332 data->vdev_id = session_id;
9333 data->request_data_len = input->request_data_len;
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05309334 if (input->request_data_len)
Anurag Chouhan600c3a02016-03-01 10:33:54 +05309335 qdf_mem_copy(data->request_data,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009336 input->request_data, input->request_data_len);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009337
9338 msg.type = WMA_STATS_EXT_REQUEST;
9339 msg.reserved = 0;
9340 msg.bodyptr = data;
9341
gaurank kathpalia36b0c582018-08-28 17:45:43 +05309342 if (QDF_STATUS_SUCCESS != scheduler_post_message(QDF_MODULE_ID_SME,
9343 QDF_MODULE_ID_WMA,
9344 QDF_MODULE_ID_WMA,
9345 &msg)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05309346 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009347 "%s: Not able to post WMA_STATS_EXT_REQUEST message to WMA",
9348 __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05309349 qdf_mem_free(data);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309350 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009351 }
9352
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309353 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009354}
9355
Jeff Johnsonfdecd512018-06-10 09:18:32 -07009356/**
9357 * sme_stats_ext_event() - eWNI_SME_STATS_EXT_EVENT processor
9358 * @mac: Global MAC context
9359 * @msg: "stats ext" message
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009360
Jeff Johnsonfdecd512018-06-10 09:18:32 -07009361 * This callback function called when SME received eWNI_SME_STATS_EXT_EVENT
9362 * response from WMA
9363 *
9364 * Return: QDF_STATUS
9365 */
Jeff Johnson0a8786a2018-12-02 10:49:01 -08009366static QDF_STATUS sme_stats_ext_event(struct mac_context *mac,
Jeff Johnson45843652018-07-04 12:47:34 -07009367 struct stats_ext_event *msg)
Jeff Johnsonfdecd512018-06-10 09:18:32 -07009368{
9369 if (!msg) {
9370 sme_err("Null msg");
9371 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009372 }
9373
Jeff Johnson45843652018-07-04 12:47:34 -07009374 if (mac->sme.stats_ext_cb)
9375 mac->sme.stats_ext_cb(mac->hdd_handle, msg);
Jeff Johnsonfdecd512018-06-10 09:18:32 -07009376
9377 return QDF_STATUS_SUCCESS;
9378}
9379
9380#else
9381
Jeff Johnson0a8786a2018-12-02 10:49:01 -08009382static QDF_STATUS sme_stats_ext_event(struct mac_context *mac,
Jeff Johnson45843652018-07-04 12:47:34 -07009383 struct stats_ext_event *msg)
Jeff Johnsonfdecd512018-06-10 09:18:32 -07009384{
9385 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009386}
9387
9388#endif
9389
Qun Zhangef655622019-02-25 10:48:10 +08009390#ifdef FEATURE_FW_STATE
9391QDF_STATUS sme_get_fw_state(mac_handle_t mac_handle,
9392 fw_state_callback callback,
9393 void *context)
9394{
9395 QDF_STATUS status;
9396 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
9397 tp_wma_handle wma_handle;
9398
9399 SME_ENTER();
9400
9401 mac_ctx->sme.fw_state_cb = callback;
9402 mac_ctx->sme.fw_state_context = context;
9403 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
9404 status = wma_get_fw_state(wma_handle);
9405
9406 SME_EXIT();
9407 return status;
9408}
9409
9410/**
9411 * sme_fw_state_resp() - eWNI_SME_FW_STATUS_IND processor
9412 * @mac: Global MAC context
9413
9414 * This callback function called when SME received eWNI_SME_FW_STATUS_IND
9415 * response from WMA
9416 *
9417 * Return: QDF_STATUS
9418 */
9419static QDF_STATUS sme_fw_state_resp(struct mac_context *mac)
9420{
9421 if (mac->sme.fw_state_cb)
9422 mac->sme.fw_state_cb(mac->sme.fw_state_context);
9423 mac->sme.fw_state_cb = NULL;
9424 mac->sme.fw_state_context = NULL;
9425
9426 return QDF_STATUS_SUCCESS;
9427}
9428
9429#else /* FEATURE_FW_STATE */
9430static QDF_STATUS sme_fw_state_resp(struct mac_context *mac)
9431{
9432 return QDF_STATUS_SUCCESS;
9433}
9434
9435#endif /* FEATURE_FW_STATE */
9436
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05309437/*
9438 * sme_update_dfs_scan_mode() -
9439 * Update DFS roam scan mode
9440 * This function is called through dynamic setConfig callback function
9441 * to configure allowDFSChannelRoam.
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -08009442 * mac_handle: Opaque handle to the global MAC context
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05309443 * sessionId - Session Identifier
9444 * allowDFSChannelRoam - DFS roaming scan mode 0 (disable),
9445 * 1 (passive), 2 (active)
9446 * Return QDF_STATUS_SUCCESS - SME update DFS roaming scan config
9447 * successfully.
9448 * Other status means SME failed to update DFS roaming scan config.
9449 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08009450QDF_STATUS sme_update_dfs_scan_mode(mac_handle_t mac_handle, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009451 uint8_t allowDFSChannelRoam)
9452{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08009453 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309454 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009455
Dustin Brownad06be62019-02-04 14:52:56 -08009456 if (sessionId >= WLAN_MAX_VDEVS) {
Naveen Rawatc36f7eb2016-11-10 20:01:03 -08009457 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
9458 FL("Invalid sme session id: %d"), sessionId);
9459 return QDF_STATUS_E_INVAL;
9460 }
9461
Jeff Johnson01f2c232018-11-21 19:17:44 -08009462 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309463 if (QDF_IS_STATUS_SUCCESS(status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05309464 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05309465 "LFR runtime successfully set AllowDFSChannelRoam Mode to %d - old value is %d - roam state is %s",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009466 allowDFSChannelRoam,
Wu Gao51a63562018-11-08 16:29:10 +08009467 mac->mlme_cfg->lfr.roaming_dfs_channel,
Jeff Johnson01f2c232018-11-21 19:17:44 -08009468 mac_trace_get_neighbour_roam_state(mac->roam.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009469 neighborRoamInfo
9470 [sessionId].
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05309471 neighborRoamState));
Wu Gao51a63562018-11-08 16:29:10 +08009472 mac->mlme_cfg->lfr.roaming_dfs_channel =
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009473 allowDFSChannelRoam;
Abhinav Kumar523ca372019-08-30 16:28:19 +05309474 if (mac->mlme_cfg->lfr.roam_scan_offload_enabled)
9475 csr_roam_update_cfg(mac, sessionId,
9476 REASON_ROAM_DFS_SCAN_MODE_CHANGED);
9477
Jeff Johnson01f2c232018-11-21 19:17:44 -08009478 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009479 }
Vignesh Viswanathan4e65e8e2018-05-01 12:04:16 +05309480
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009481
9482 return status;
9483}
9484
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05309485/*
9486 * sme_get_dfs_scan_mode() - get DFS roam scan mode
9487 * This is a synchronous call
9488 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08009489 * mac_handle - The handle returned by mac_open.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05309490 * Return DFS roaming scan mode 0 (disable), 1 (passive), 2 (active)
9491 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08009492uint8_t sme_get_dfs_scan_mode(mac_handle_t mac_handle)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009493{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08009494 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05309495
Wu Gao51a63562018-11-08 16:29:10 +08009496 return mac->mlme_cfg->lfr.roaming_dfs_channel;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009497}
9498
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05309499/*
9500 * sme_modify_add_ie() -
9501 * This function sends msg to updates the additional IE buffers in PE
9502 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08009503 * mac_handle - global structure
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05309504 * pModifyIE - pointer to tModifyIE structure
9505 * updateType - type of buffer
9506 * Return Success or failure
9507 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08009508QDF_STATUS sme_modify_add_ie(mac_handle_t mac_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009509 tSirModifyIE *pModifyIE, eUpdateIEsType updateType)
9510{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309511 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08009512 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05309513
Jeff Johnson01f2c232018-11-21 19:17:44 -08009514 status = sme_acquire_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009515
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309516 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08009517 status = csr_roam_modify_add_ies(mac, pModifyIE, updateType);
9518 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009519 }
9520 return status;
9521}
9522
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05309523/*
9524 * sme_update_add_ie() -
9525 * This function sends msg to updates the additional IE buffers in PE
9526 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08009527 * mac_handle - global structure
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05309528 * pUpdateIE - pointer to structure tUpdateIE
9529 * updateType - type of buffer
9530 * Return Success or failure
9531 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08009532QDF_STATUS sme_update_add_ie(mac_handle_t mac_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009533 tSirUpdateIE *pUpdateIE, eUpdateIEsType updateType)
9534{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309535 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08009536 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05309537
Jeff Johnson01f2c232018-11-21 19:17:44 -08009538 status = sme_acquire_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009539
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309540 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08009541 status = csr_roam_update_add_ies(mac, pUpdateIE, updateType);
9542 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009543 }
9544 return status;
9545}
9546
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009547/**
9548 * sme_update_dsc_pto_up_mapping()
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -08009549 * @mac_handle: Opaque handle to the global MAC context
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009550 * @dscpmapping: pointer to DSCP mapping structure
9551 * @sessionId: SME session id
9552 *
9553 * This routine is called to update dscp mapping
9554 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309555 * Return: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009556 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08009557QDF_STATUS sme_update_dsc_pto_up_mapping(mac_handle_t mac_handle,
Abhishek Singh12be60f2017-08-11 13:52:42 +05309558 enum sme_qos_wmmuptype *dscpmapping,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009559 uint8_t sessionId)
9560{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08009561 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309562 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009563 uint8_t i, j, peSessionId;
gaurank kathpalia14e2f912017-08-31 14:51:45 +05309564 struct csr_roam_session *pCsrSession = NULL;
Jeff Johnson59104482018-11-18 21:30:19 -08009565 struct pe_session *pSession = NULL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009566
Jeff Johnson01f2c232018-11-21 19:17:44 -08009567 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309568 if (!QDF_IS_STATUS_SUCCESS(status))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009569 return status;
Jeff Johnson01f2c232018-11-21 19:17:44 -08009570 pCsrSession = CSR_GET_SESSION(mac, sessionId);
Jeff Johnson038efe72019-03-18 13:39:31 -07009571 if (!pCsrSession) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05309572 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009573 FL("Session lookup fails for CSR session"));
Jeff Johnson01f2c232018-11-21 19:17:44 -08009574 sme_release_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309575 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009576 }
Jeff Johnson01f2c232018-11-21 19:17:44 -08009577 if (!CSR_IS_SESSION_VALID(mac, sessionId)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05309578 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009579 FL("Invalid session Id %u"), sessionId);
Jeff Johnson01f2c232018-11-21 19:17:44 -08009580 sme_release_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309581 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009582 }
9583
Jeff Johnson01f2c232018-11-21 19:17:44 -08009584 pSession = pe_find_session_by_bssid(mac,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009585 pCsrSession->connectedProfile.bssid.bytes,
9586 &peSessionId);
9587
Jeff Johnson038efe72019-03-18 13:39:31 -07009588 if (!pSession) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05309589 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009590 FL(" Session lookup fails for BSSID"));
Jeff Johnson01f2c232018-11-21 19:17:44 -08009591 sme_release_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309592 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009593 }
9594
9595 if (!pSession->QosMapSet.present) {
Srinivas Girigowda2b5d47c2017-03-29 00:28:46 -07009596 sme_debug("QOS Mapping IE not present");
Jeff Johnson01f2c232018-11-21 19:17:44 -08009597 sme_release_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309598 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009599 }
Abhishek Ambure3d18b4c2019-12-05 20:27:55 +05309600
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009601 for (i = 0; i < SME_QOS_WMM_UP_MAX; i++) {
9602 for (j = pSession->QosMapSet.dscp_range[i][0];
Abhishek Ambure3d18b4c2019-12-05 20:27:55 +05309603 j <= pSession->QosMapSet.dscp_range[i][1] &&
9604 j <= WLAN_MAX_DSCP; j++)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009605 dscpmapping[j] = i;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009606 }
9607 for (i = 0; i < pSession->QosMapSet.num_dscp_exceptions; i++)
Abhishek Ambure3d18b4c2019-12-05 20:27:55 +05309608 if (pSession->QosMapSet.dscp_exceptions[i][0] <= WLAN_MAX_DSCP)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009609 dscpmapping[pSession->QosMapSet.dscp_exceptions[i][0]] =
9610 pSession->QosMapSet.dscp_exceptions[i][1];
9611
Jeff Johnson01f2c232018-11-21 19:17:44 -08009612 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009613 return status;
9614}
9615
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05309616/*
9617 * sme_abort_roam_scan() -
9618 * API to abort current roam scan cycle by roam scan offload module.
9619 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08009620 * mac_handle - The handle returned by mac_open.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05309621 * sessionId - Session Identifier
9622 * Return QDF_STATUS
9623 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009624
Jeff Johnsonb460dd72018-11-08 10:26:51 -08009625QDF_STATUS sme_abort_roam_scan(mac_handle_t mac_handle, uint8_t sessionId)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009626{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309627 QDF_STATUS status = QDF_STATUS_SUCCESS;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08009628 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009629
Wu Gao51a63562018-11-08 16:29:10 +08009630 if (mac->mlme_cfg->lfr.roam_scan_offload_enabled) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009631 /* acquire the lock for the sme object */
Jeff Johnson01f2c232018-11-21 19:17:44 -08009632 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309633 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08009634 csr_roam_offload_scan(mac, sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009635 ROAM_SCAN_OFFLOAD_ABORT_SCAN,
9636 REASON_ROAM_ABORT_ROAM_SCAN);
9637 /* release the lock for the sme object */
Jeff Johnson01f2c232018-11-21 19:17:44 -08009638 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009639 }
9640 }
9641
9642 return status;
9643}
9644
Jeff Johnsonb460dd72018-11-08 10:26:51 -08009645QDF_STATUS sme_get_valid_channels_by_band(mac_handle_t mac_handle,
Will Huanga6af7e12019-10-31 17:40:06 +08009646 uint8_t wifi_band,
9647 uint32_t *valid_chan_list,
9648 uint8_t *valid_chan_len)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009649{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309650 QDF_STATUS status = QDF_STATUS_SUCCESS;
Will Huanga6af7e12019-10-31 17:40:06 +08009651 uint32_t chan_freq_list[CFG_VALID_CHANNEL_LIST_LEN] = { 0 };
9652 uint8_t num_channels = 0;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009653 uint8_t i = 0;
Will Huanga6af7e12019-10-31 17:40:06 +08009654 uint32_t valid_channels = CFG_VALID_CHANNEL_LIST_LEN;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08009655 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009656
Will Huanga6af7e12019-10-31 17:40:06 +08009657 if (!valid_chan_list || !valid_chan_len) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07009658 sme_err("Output channel list/NumChannels is NULL");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309659 return QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009660 }
9661
Will Huanga6af7e12019-10-31 17:40:06 +08009662 if (wifi_band >= WIFI_BAND_MAX) {
9663 sme_err("Invalid wifi Band: %d", wifi_band);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309664 return QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009665 }
9666
Will Huanga6af7e12019-10-31 17:40:06 +08009667 status = sme_get_cfg_valid_channels(&chan_freq_list[0],
9668 &valid_channels);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309669 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07009670 sme_err("Fail to get valid channel list (err=%d)", status);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009671 return status;
9672 }
9673
Will Huanga6af7e12019-10-31 17:40:06 +08009674 switch (wifi_band) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009675 case WIFI_BAND_UNSPECIFIED:
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07009676 sme_debug("Unspec Band, return all %d valid channels",
Will Huanga6af7e12019-10-31 17:40:06 +08009677 valid_channels);
9678 num_channels = valid_channels;
9679 for (i = 0; i < valid_channels; i++)
9680 valid_chan_list[i] = chan_freq_list[i];
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009681 break;
9682
9683 case WIFI_BAND_BG:
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07009684 sme_debug("WIFI_BAND_BG (2.4 GHz)");
Will Huanga6af7e12019-10-31 17:40:06 +08009685 for (i = 0; i < valid_channels; i++) {
9686 if (WLAN_REG_IS_24GHZ_CH_FREQ(chan_freq_list[i]))
9687 valid_chan_list[num_channels++] =
9688 chan_freq_list[i];
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009689 }
9690 break;
9691
9692 case WIFI_BAND_A:
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07009693 sme_debug("WIFI_BAND_A (5 GHz without DFS)");
Will Huanga6af7e12019-10-31 17:40:06 +08009694 for (i = 0; i < valid_channels; i++) {
9695 if (WLAN_REG_IS_5GHZ_CH_FREQ(chan_freq_list[i]) &&
9696 !wlan_reg_is_dfs_for_freq(mac_ctx->pdev,
9697 chan_freq_list[i]))
9698 valid_chan_list[num_channels++] =
9699 chan_freq_list[i];
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009700 }
9701 break;
9702
9703 case WIFI_BAND_ABG:
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07009704 sme_debug("WIFI_BAND_ABG (2.4 GHz + 5 GHz; no DFS)");
Will Huanga6af7e12019-10-31 17:40:06 +08009705 for (i = 0; i < valid_channels; i++) {
9706 if ((WLAN_REG_IS_24GHZ_CH_FREQ(chan_freq_list[i]) ||
9707 WLAN_REG_IS_5GHZ_CH_FREQ(chan_freq_list[i])) &&
9708 !wlan_reg_is_dfs_for_freq(mac_ctx->pdev,
9709 chan_freq_list[i]))
9710 valid_chan_list[num_channels++] =
9711 chan_freq_list[i];
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009712 }
9713 break;
9714
9715 case WIFI_BAND_A_DFS_ONLY:
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07009716 sme_debug("WIFI_BAND_A_DFS (5 GHz DFS only)");
Will Huanga6af7e12019-10-31 17:40:06 +08009717 for (i = 0; i < valid_channels; i++) {
9718 if (WLAN_REG_IS_5GHZ_CH_FREQ(chan_freq_list[i]) &&
9719 wlan_reg_is_dfs_for_freq(mac_ctx->pdev,
9720 chan_freq_list[i]))
9721 valid_chan_list[num_channels++] =
9722 chan_freq_list[i];
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009723 }
9724 break;
9725
9726 case WIFI_BAND_A_WITH_DFS:
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07009727 sme_debug("WIFI_BAND_A_WITH_DFS (5 GHz with DFS)");
Will Huanga6af7e12019-10-31 17:40:06 +08009728 for (i = 0; i < valid_channels; i++) {
9729 if (WLAN_REG_IS_5GHZ_CH_FREQ(chan_freq_list[i]))
9730 valid_chan_list[num_channels++] =
9731 chan_freq_list[i];
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009732 }
9733 break;
9734
9735 case WIFI_BAND_ABG_WITH_DFS:
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07009736 sme_debug("WIFI_BAND_ABG_WITH_DFS (2.4 GHz+5 GHz with DFS)");
Will Huanga6af7e12019-10-31 17:40:06 +08009737 for (i = 0; i < valid_channels; i++) {
9738 if (WLAN_REG_IS_24GHZ_CH_FREQ(chan_freq_list[i]) ||
9739 WLAN_REG_IS_5GHZ_CH_FREQ(chan_freq_list[i]))
9740 valid_chan_list[num_channels++] =
9741 chan_freq_list[i];
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009742 }
9743 break;
9744
9745 default:
Will Huanga6af7e12019-10-31 17:40:06 +08009746 sme_err("Unknown wifi Band: %d", wifi_band);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309747 return QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009748 }
Will Huanga6af7e12019-10-31 17:40:06 +08009749 *valid_chan_len = num_channels;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009750
9751 return status;
9752}
9753
Ashish Kumar Dhanotiya1a720e72019-09-06 15:42:05 +05309754#ifdef FEATURE_WLAN_EXTSCAN
9755
Jeff Johnsonfed9a732018-07-18 12:18:03 -07009756QDF_STATUS
9757sme_ext_scan_get_capabilities(mac_handle_t mac_handle,
9758 struct extscan_capabilities_params *params)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009759{
Jeff Johnsonfed9a732018-07-18 12:18:03 -07009760 QDF_STATUS status;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08009761 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Rajeev Kumar37d478b2017-04-17 16:59:28 -07009762 struct scheduler_msg message = {0};
Jeff Johnsonfed9a732018-07-18 12:18:03 -07009763 struct extscan_capabilities_params *bodyptr;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009764
Jeff Johnsonfed9a732018-07-18 12:18:03 -07009765 /* per contract must make a copy of the params when messaging */
9766 bodyptr = qdf_mem_malloc(sizeof(*bodyptr));
9767 if (!bodyptr)
9768 return QDF_STATUS_E_NOMEM;
9769 *bodyptr = *params;
9770
9771 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309772 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009773 /* Serialize the req through MC thread */
Jeff Johnsonfed9a732018-07-18 12:18:03 -07009774 message.bodyptr = bodyptr;
Rajeev Kumar8eaedf62017-01-21 11:03:13 -08009775 message.type = WMA_EXTSCAN_GET_CAPABILITIES_REQ;
Jeff Johnsonfed9a732018-07-18 12:18:03 -07009776 qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
9777 NO_SESSION, message.type);
9778 status = scheduler_post_message(QDF_MODULE_ID_SME,
9779 QDF_MODULE_ID_WMA,
9780 QDF_MODULE_ID_WMA,
9781 &message);
9782 sme_release_global_lock(&mac->sme);
9783 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009784
Jeff Johnsonfed9a732018-07-18 12:18:03 -07009785 if (QDF_IS_STATUS_ERROR(status)) {
9786 sme_err("failure: %d", status);
9787 qdf_mem_free(bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009788 }
9789 return status;
9790}
9791
Jeff Johnsondab58602018-07-14 15:30:24 -07009792QDF_STATUS
9793sme_ext_scan_start(mac_handle_t mac_handle,
9794 struct wifi_scan_cmd_req_params *params)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009795{
Jeff Johnsondab58602018-07-14 15:30:24 -07009796 QDF_STATUS status;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08009797 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Rajeev Kumar37d478b2017-04-17 16:59:28 -07009798 struct scheduler_msg message = {0};
Jeff Johnsondab58602018-07-14 15:30:24 -07009799 struct wifi_scan_cmd_req_params *bodyptr;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009800
Jeff Johnsondab58602018-07-14 15:30:24 -07009801 /* per contract must make a copy of the params when messaging */
9802 bodyptr = qdf_mem_malloc(sizeof(*bodyptr));
9803 if (!bodyptr)
9804 return QDF_STATUS_E_NOMEM;
9805 *bodyptr = *params;
9806
9807 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309808 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009809 /* Serialize the req through MC thread */
Jeff Johnsondab58602018-07-14 15:30:24 -07009810 message.bodyptr = bodyptr;
Rajeev Kumar8eaedf62017-01-21 11:03:13 -08009811 message.type = WMA_EXTSCAN_START_REQ;
Jeff Johnsondab58602018-07-14 15:30:24 -07009812 qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
9813 NO_SESSION, message.type);
9814 status = scheduler_post_message(QDF_MODULE_ID_SME,
9815 QDF_MODULE_ID_WMA,
9816 QDF_MODULE_ID_WMA,
9817 &message);
9818 sme_release_global_lock(&mac->sme);
9819 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009820
Jeff Johnsondab58602018-07-14 15:30:24 -07009821 if (QDF_IS_STATUS_ERROR(status)) {
9822 sme_err("failure: %d", status);
9823 qdf_mem_free(bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009824 }
9825 return status;
9826}
9827
Jeff Johnson7272ea72018-07-15 17:22:27 -07009828QDF_STATUS sme_ext_scan_stop(mac_handle_t mac_handle,
9829 struct extscan_stop_req_params *params)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009830{
Jeff Johnson7272ea72018-07-15 17:22:27 -07009831 QDF_STATUS status;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08009832 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Rajeev Kumar37d478b2017-04-17 16:59:28 -07009833 struct scheduler_msg message = {0};
Jeff Johnson7272ea72018-07-15 17:22:27 -07009834 struct extscan_stop_req_params *bodyptr;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009835
Jeff Johnson7272ea72018-07-15 17:22:27 -07009836 /* per contract must make a copy of the params when messaging */
9837 bodyptr = qdf_mem_malloc(sizeof(*bodyptr));
9838 if (!bodyptr)
9839 return QDF_STATUS_E_NOMEM;
9840 *bodyptr = *params;
9841
9842 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309843 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009844 /* Serialize the req through MC thread */
Jeff Johnson7272ea72018-07-15 17:22:27 -07009845 message.bodyptr = bodyptr;
Rajeev Kumar8eaedf62017-01-21 11:03:13 -08009846 message.type = WMA_EXTSCAN_STOP_REQ;
Jeff Johnson7272ea72018-07-15 17:22:27 -07009847 qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
9848 NO_SESSION, message.type);
9849 status = scheduler_post_message(QDF_MODULE_ID_SME,
9850 QDF_MODULE_ID_WMA,
9851 QDF_MODULE_ID_WMA,
9852 &message);
9853 sme_release_global_lock(&mac->sme);
9854 }
9855
9856 if (QDF_IS_STATUS_ERROR(status)) {
9857 sme_err("failure: %d", status);
9858 qdf_mem_free(bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009859 }
9860 return status;
9861}
9862
Jeff Johnson1148cb02018-07-13 23:14:32 -07009863QDF_STATUS
9864sme_set_bss_hotlist(mac_handle_t mac_handle,
9865 struct extscan_bssid_hotlist_set_params *params)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009866{
Jeff Johnson1148cb02018-07-13 23:14:32 -07009867 QDF_STATUS status;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08009868 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Rajeev Kumar37d478b2017-04-17 16:59:28 -07009869 struct scheduler_msg message = {0};
Jeff Johnson1148cb02018-07-13 23:14:32 -07009870 struct extscan_bssid_hotlist_set_params *bodyptr;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009871
Jeff Johnson1148cb02018-07-13 23:14:32 -07009872 /* per contract must make a copy of the params when messaging */
9873 bodyptr = qdf_mem_malloc(sizeof(*bodyptr));
Arif Hussain0ef77082018-10-10 16:42:53 -07009874 if (!bodyptr)
Jeff Johnson1148cb02018-07-13 23:14:32 -07009875 return QDF_STATUS_E_NOMEM;
Arif Hussain0ef77082018-10-10 16:42:53 -07009876
Jeff Johnson1148cb02018-07-13 23:14:32 -07009877 *bodyptr = *params;
9878
9879 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309880 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009881 /* Serialize the req through MC thread */
Jeff Johnson1148cb02018-07-13 23:14:32 -07009882 message.bodyptr = bodyptr;
Rajeev Kumar8eaedf62017-01-21 11:03:13 -08009883 message.type = WMA_EXTSCAN_SET_BSSID_HOTLIST_REQ;
Jeff Johnson1148cb02018-07-13 23:14:32 -07009884 qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
9885 NO_SESSION, message.type);
gaurank kathpalia36b0c582018-08-28 17:45:43 +05309886 status = scheduler_post_message(QDF_MODULE_ID_SME,
9887 QDF_MODULE_ID_WMA,
9888 QDF_MODULE_ID_WMA, &message);
Jeff Johnson1148cb02018-07-13 23:14:32 -07009889 sme_release_global_lock(&mac->sme);
9890 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009891
Jeff Johnson1148cb02018-07-13 23:14:32 -07009892 if (QDF_IS_STATUS_ERROR(status)) {
9893 sme_err("failure: %d", status);
9894 qdf_mem_free(bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009895 }
9896 return status;
9897}
9898
Jeff Johnson9743eb72018-07-14 10:30:04 -07009899QDF_STATUS
9900sme_reset_bss_hotlist(mac_handle_t mac_handle,
9901 struct extscan_bssid_hotlist_reset_params *params)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009902{
Jeff Johnson9743eb72018-07-14 10:30:04 -07009903 QDF_STATUS status;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08009904 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Rajeev Kumar37d478b2017-04-17 16:59:28 -07009905 struct scheduler_msg message = {0};
Jeff Johnson9743eb72018-07-14 10:30:04 -07009906 struct extscan_bssid_hotlist_reset_params *bodyptr;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009907
Jeff Johnson9743eb72018-07-14 10:30:04 -07009908 /* per contract must make a copy of the params when messaging */
9909 bodyptr = qdf_mem_malloc(sizeof(*bodyptr));
Arif Hussain0ef77082018-10-10 16:42:53 -07009910 if (!bodyptr)
Jeff Johnson9743eb72018-07-14 10:30:04 -07009911 return QDF_STATUS_E_NOMEM;
Arif Hussain0ef77082018-10-10 16:42:53 -07009912
Jeff Johnson9743eb72018-07-14 10:30:04 -07009913 *bodyptr = *params;
9914
9915 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309916 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009917 /* Serialize the req through MC thread */
Jeff Johnson9743eb72018-07-14 10:30:04 -07009918 message.bodyptr = bodyptr;
Rajeev Kumar8eaedf62017-01-21 11:03:13 -08009919 message.type = WMA_EXTSCAN_RESET_BSSID_HOTLIST_REQ;
Sreelakshmi Konamki6a065362016-05-31 16:05:01 +05309920 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
Rajeev Kumar8eaedf62017-01-21 11:03:13 -08009921 NO_SESSION, message.type));
gaurank kathpalia36b0c582018-08-28 17:45:43 +05309922 status = scheduler_post_message(QDF_MODULE_ID_SME,
9923 QDF_MODULE_ID_WMA,
9924 QDF_MODULE_ID_WMA, &message);
Jeff Johnson9743eb72018-07-14 10:30:04 -07009925 sme_release_global_lock(&mac->sme);
9926 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009927
Jeff Johnson9743eb72018-07-14 10:30:04 -07009928 if (QDF_IS_STATUS_ERROR(status)) {
9929 sme_err("failure: %d", status);
9930 qdf_mem_free(bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009931 }
9932 return status;
9933}
9934
Jeff Johnsonb43ed032018-07-16 06:59:21 -07009935QDF_STATUS
9936sme_set_significant_change(mac_handle_t mac_handle,
9937 struct extscan_set_sig_changereq_params *params)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009938{
Jeff Johnsonb43ed032018-07-16 06:59:21 -07009939 QDF_STATUS status;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08009940 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Rajeev Kumar37d478b2017-04-17 16:59:28 -07009941 struct scheduler_msg message = {0};
Jeff Johnsonb43ed032018-07-16 06:59:21 -07009942 struct extscan_set_sig_changereq_params *bodyptr;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009943
Jeff Johnsonb43ed032018-07-16 06:59:21 -07009944 /* per contract must make a copy of the params when messaging */
9945 bodyptr = qdf_mem_malloc(sizeof(*bodyptr));
Arif Hussain0ef77082018-10-10 16:42:53 -07009946 if (!bodyptr)
Jeff Johnsonb43ed032018-07-16 06:59:21 -07009947 return QDF_STATUS_E_NOMEM;
Arif Hussain0ef77082018-10-10 16:42:53 -07009948
Jeff Johnsonb43ed032018-07-16 06:59:21 -07009949 *bodyptr = *params;
9950
9951 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309952 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009953 /* Serialize the req through MC thread */
Jeff Johnsonb43ed032018-07-16 06:59:21 -07009954 message.bodyptr = bodyptr;
Rajeev Kumar8eaedf62017-01-21 11:03:13 -08009955 message.type = WMA_EXTSCAN_SET_SIGNF_CHANGE_REQ;
gaurank kathpalia36b0c582018-08-28 17:45:43 +05309956 status = scheduler_post_message(QDF_MODULE_ID_SME,
9957 QDF_MODULE_ID_WMA,
9958 QDF_MODULE_ID_WMA,
9959 &message);
Jeff Johnsonb43ed032018-07-16 06:59:21 -07009960 sme_release_global_lock(&mac->sme);
9961 }
Jeff Johnsonb43ed032018-07-16 06:59:21 -07009962 if (QDF_IS_STATUS_ERROR(status)) {
9963 sme_err("failure: %d", status);
9964 qdf_mem_free(bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009965 }
9966 return status;
9967}
9968
Jeff Johnson0c8dbc32018-07-16 22:10:48 -07009969QDF_STATUS
9970sme_reset_significant_change(mac_handle_t mac_handle,
9971 struct extscan_capabilities_reset_params *params)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009972{
Jeff Johnson0c8dbc32018-07-16 22:10:48 -07009973 QDF_STATUS status;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08009974 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Rajeev Kumar37d478b2017-04-17 16:59:28 -07009975 struct scheduler_msg message = {0};
Jeff Johnson0c8dbc32018-07-16 22:10:48 -07009976 struct extscan_capabilities_reset_params *bodyptr;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009977
Jeff Johnson0c8dbc32018-07-16 22:10:48 -07009978 /* per contract must make a copy of the params when messaging */
9979 bodyptr = qdf_mem_malloc(sizeof(*bodyptr));
Arif Hussain0ef77082018-10-10 16:42:53 -07009980 if (!bodyptr)
Jeff Johnson0c8dbc32018-07-16 22:10:48 -07009981 return QDF_STATUS_E_NOMEM;
Arif Hussain0ef77082018-10-10 16:42:53 -07009982
Jeff Johnson0c8dbc32018-07-16 22:10:48 -07009983 *bodyptr = *params;
9984
9985 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309986 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009987 /* Serialize the req through MC thread */
Jeff Johnson0c8dbc32018-07-16 22:10:48 -07009988 message.bodyptr = bodyptr;
Rajeev Kumar8eaedf62017-01-21 11:03:13 -08009989 message.type = WMA_EXTSCAN_RESET_SIGNF_CHANGE_REQ;
Sreelakshmi Konamki6a065362016-05-31 16:05:01 +05309990 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
Rajeev Kumar8eaedf62017-01-21 11:03:13 -08009991 NO_SESSION, message.type));
gaurank kathpalia36b0c582018-08-28 17:45:43 +05309992 status = scheduler_post_message(QDF_MODULE_ID_SME,
9993 QDF_MODULE_ID_WMA,
9994 QDF_MODULE_ID_WMA,
9995 &message);
Jeff Johnson0c8dbc32018-07-16 22:10:48 -07009996 sme_release_global_lock(&mac->sme);
9997 }
Jeff Johnson0c8dbc32018-07-16 22:10:48 -07009998 if (QDF_IS_STATUS_ERROR(status)) {
9999 sme_err("failure: %d", status);
10000 qdf_mem_free(bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010001 }
gaurank kathpalia36b0c582018-08-28 17:45:43 +053010002
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010003 return status;
10004}
10005
Jeff Johnson2ba60092018-07-17 08:19:37 -070010006QDF_STATUS
10007sme_get_cached_results(mac_handle_t mac_handle,
10008 struct extscan_cached_result_params *params)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010009{
Jeff Johnson2ba60092018-07-17 08:19:37 -070010010 QDF_STATUS status;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080010011 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Rajeev Kumar37d478b2017-04-17 16:59:28 -070010012 struct scheduler_msg message = {0};
Jeff Johnson2ba60092018-07-17 08:19:37 -070010013 struct extscan_cached_result_params *bodyptr;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010014
Jeff Johnson2ba60092018-07-17 08:19:37 -070010015 /* per contract must make a copy of the params when messaging */
10016 bodyptr = qdf_mem_malloc(sizeof(*bodyptr));
10017 if (!bodyptr)
10018 return QDF_STATUS_E_NOMEM;
10019 *bodyptr = *params;
10020
10021 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010022 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010023 /* Serialize the req through MC thread */
Jeff Johnson2ba60092018-07-17 08:19:37 -070010024 message.bodyptr = bodyptr;
Rajeev Kumar8eaedf62017-01-21 11:03:13 -080010025 message.type = WMA_EXTSCAN_GET_CACHED_RESULTS_REQ;
Jeff Johnson2ba60092018-07-17 08:19:37 -070010026 qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
10027 NO_SESSION, message.type);
10028 status = scheduler_post_message(QDF_MODULE_ID_SME,
10029 QDF_MODULE_ID_WMA,
10030 QDF_MODULE_ID_WMA,
10031 &message);
10032 sme_release_global_lock(&mac->sme);
10033 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010034
Jeff Johnson2ba60092018-07-17 08:19:37 -070010035 if (QDF_IS_STATUS_ERROR(status)) {
10036 sme_err("failure: %d", status);
10037 qdf_mem_free(bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010038 }
10039 return status;
10040}
10041
Jeff Johnson360135b2018-07-18 20:51:47 -070010042QDF_STATUS sme_set_epno_list(mac_handle_t mac_handle,
10043 struct wifi_enhanced_pno_params *params)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010044{
Jeff Johnson360135b2018-07-18 20:51:47 -070010045 QDF_STATUS status;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080010046 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Rajeev Kumar37d478b2017-04-17 16:59:28 -070010047 struct scheduler_msg message = {0};
Jeff Johnson360135b2018-07-18 20:51:47 -070010048 struct wifi_enhanced_pno_params *req_msg;
10049 int len;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010050
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070010051 SME_ENTER();
Jeff Johnson360135b2018-07-18 20:51:47 -070010052
10053 /* per contract must make a copy of the params when messaging */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010054 len = sizeof(*req_msg) +
Jeff Johnson360135b2018-07-18 20:51:47 -070010055 (params->num_networks * sizeof(req_msg->networks[0]));
Mukul Sharmae8c919f2016-10-02 20:35:15 +053010056
Anurag Chouhan600c3a02016-03-01 10:33:54 +053010057 req_msg = qdf_mem_malloc(len);
Arif Hussain0ef77082018-10-10 16:42:53 -070010058 if (!req_msg)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010059 return QDF_STATUS_E_NOMEM;
Jeff Johnson360135b2018-07-18 20:51:47 -070010060 qdf_mem_copy(req_msg, params, len);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010061
10062 status = sme_acquire_global_lock(&mac->sme);
Vignesh Viswanathancbb5b952017-08-02 14:32:49 +053010063 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070010064 sme_err("sme_acquire_global_lock failed!(status=%d)",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010065 status);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053010066 qdf_mem_free(req_msg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010067 return status;
10068 }
10069
10070 /* Serialize the req through MC thread */
Rajeev Kumar8eaedf62017-01-21 11:03:13 -080010071 message.bodyptr = req_msg;
10072 message.type = WMA_SET_EPNO_LIST_REQ;
gaurank kathpalia36b0c582018-08-28 17:45:43 +053010073 status = scheduler_post_message(QDF_MODULE_ID_SME,
10074 QDF_MODULE_ID_WMA,
10075 QDF_MODULE_ID_WMA, &message);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010076 if (!QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson360135b2018-07-18 20:51:47 -070010077 sme_err("scheduler_post_msg failed!(err=%d)", status);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053010078 qdf_mem_free(req_msg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010079 }
10080 sme_release_global_lock(&mac->sme);
Jeff Johnson360135b2018-07-18 20:51:47 -070010081
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010082 return status;
10083}
10084
Jeff Johnson2a7f1012018-07-19 07:21:06 -070010085QDF_STATUS sme_set_passpoint_list(mac_handle_t mac_handle,
10086 struct wifi_passpoint_req_param *params)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010087{
Jeff Johnson2a7f1012018-07-19 07:21:06 -070010088 QDF_STATUS status;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080010089 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Rajeev Kumar37d478b2017-04-17 16:59:28 -070010090 struct scheduler_msg message = {0};
Jeff Johnson2a7f1012018-07-19 07:21:06 -070010091 struct wifi_passpoint_req_param *req_msg;
10092 int len;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010093
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070010094 SME_ENTER();
Jeff Johnson2a7f1012018-07-19 07:21:06 -070010095
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010096 len = sizeof(*req_msg) +
Jeff Johnson2a7f1012018-07-19 07:21:06 -070010097 (params->num_networks * sizeof(params->networks[0]));
Anurag Chouhan600c3a02016-03-01 10:33:54 +053010098 req_msg = qdf_mem_malloc(len);
Arif Hussain0ef77082018-10-10 16:42:53 -070010099 if (!req_msg)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010100 return QDF_STATUS_E_NOMEM;
Jeff Johnson2a7f1012018-07-19 07:21:06 -070010101 qdf_mem_copy(req_msg, params, len);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010102
10103 status = sme_acquire_global_lock(&mac->sme);
Vignesh Viswanathancbb5b952017-08-02 14:32:49 +053010104 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070010105 sme_err("sme_acquire_global_lock failed!(status=%d)",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010106 status);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053010107 qdf_mem_free(req_msg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010108 return status;
10109 }
10110
10111 /* Serialize the req through MC thread */
Rajeev Kumar8eaedf62017-01-21 11:03:13 -080010112 message.bodyptr = req_msg;
10113 message.type = WMA_SET_PASSPOINT_LIST_REQ;
gaurank kathpalia36b0c582018-08-28 17:45:43 +053010114 status = scheduler_post_message(QDF_MODULE_ID_SME,
10115 QDF_MODULE_ID_WMA,
10116 QDF_MODULE_ID_WMA, &message);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010117 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070010118 sme_err("scheduler_post_msg failed!(err=%d)",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010119 status);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053010120 qdf_mem_free(req_msg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010121 }
10122 sme_release_global_lock(&mac->sme);
10123 return status;
10124}
10125
Jeff Johnson2a7f1012018-07-19 07:21:06 -070010126QDF_STATUS sme_reset_passpoint_list(mac_handle_t mac_handle,
10127 struct wifi_passpoint_req_param *params)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010128{
Jeff Johnson2a7f1012018-07-19 07:21:06 -070010129 QDF_STATUS status;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080010130 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Rajeev Kumar37d478b2017-04-17 16:59:28 -070010131 struct scheduler_msg message = {0};
Jeff Johnson2a7f1012018-07-19 07:21:06 -070010132 struct wifi_passpoint_req_param *req_msg;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010133
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070010134 SME_ENTER();
Jeff Johnson2a7f1012018-07-19 07:21:06 -070010135
Anurag Chouhan600c3a02016-03-01 10:33:54 +053010136 req_msg = qdf_mem_malloc(sizeof(*req_msg));
Arif Hussain0ef77082018-10-10 16:42:53 -070010137 if (!req_msg)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010138 return QDF_STATUS_E_NOMEM;
Jeff Johnson2a7f1012018-07-19 07:21:06 -070010139 *req_msg = *params;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010140
10141 status = sme_acquire_global_lock(&mac->sme);
Vignesh Viswanathancbb5b952017-08-02 14:32:49 +053010142 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070010143 sme_err("sme_acquire_global_lock failed!(status=%d)",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010144 status);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053010145 qdf_mem_free(req_msg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010146 return status;
10147 }
10148
10149 /* Serialize the req through MC thread */
Rajeev Kumar8eaedf62017-01-21 11:03:13 -080010150 message.bodyptr = req_msg;
10151 message.type = WMA_RESET_PASSPOINT_LIST_REQ;
gaurank kathpalia36b0c582018-08-28 17:45:43 +053010152 status = scheduler_post_message(QDF_MODULE_ID_SME,
10153 QDF_MODULE_ID_WMA,
10154 QDF_MODULE_ID_WMA, &message);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010155 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070010156 sme_err("scheduler_post_msg failed!(err=%d)",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010157 status);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053010158 qdf_mem_free(req_msg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010159 }
10160 sme_release_global_lock(&mac->sme);
10161 return status;
10162}
10163
Jeff Johnson17b12392018-07-03 22:21:15 -070010164QDF_STATUS sme_ext_scan_register_callback(mac_handle_t mac_handle,
10165 ext_scan_ind_cb ext_scan_ind_cb)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010166{
Jeff Johnson17b12392018-07-03 22:21:15 -070010167 QDF_STATUS status;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080010168 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010169
Jeff Johnson17b12392018-07-03 22:21:15 -070010170 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010171 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson17b12392018-07-03 22:21:15 -070010172 mac->sme.ext_scan_ind_cb = ext_scan_ind_cb;
10173 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010174 }
10175 return status;
10176}
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010177#endif /* FEATURE_WLAN_EXTSCAN */
10178
Wen Gong7952fbd2018-04-18 11:27:23 +080010179/**
10180 * sme_send_wisa_params(): Pass WISA mode to WMA
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -080010181 * @mac_handle: Opaque handle to the global MAC context
Wen Gong7952fbd2018-04-18 11:27:23 +080010182 * @wisa_params: pointer to WISA params struct
10183 * @sessionId: SME session id
10184 *
10185 * Pass WISA params to WMA
10186 *
10187 * Return: QDF_STATUS
10188 */
Jeff Johnsonc7309062018-11-09 20:59:42 -080010189QDF_STATUS sme_set_wisa_params(mac_handle_t mac_handle,
10190 struct sir_wisa_params *wisa_params)
Wen Gong7952fbd2018-04-18 11:27:23 +080010191{
10192 QDF_STATUS status = QDF_STATUS_SUCCESS;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080010193 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Wen Gong7952fbd2018-04-18 11:27:23 +080010194 struct scheduler_msg message = {0};
10195 struct sir_wisa_params *cds_msg_wisa_params;
10196
10197 cds_msg_wisa_params = qdf_mem_malloc(sizeof(struct sir_wisa_params));
10198 if (!cds_msg_wisa_params)
10199 return QDF_STATUS_E_NOMEM;
10200
10201 *cds_msg_wisa_params = *wisa_params;
10202 status = sme_acquire_global_lock(&mac->sme);
gaurank kathpalia45685492019-06-06 15:38:32 +053010203
10204 if (QDF_IS_STATUS_ERROR(status)) {
10205 qdf_mem_free(cds_msg_wisa_params);
10206 return QDF_STATUS_E_FAILURE;
Wen Gong7952fbd2018-04-18 11:27:23 +080010207 }
gaurank kathpalia45685492019-06-06 15:38:32 +053010208 message.bodyptr = cds_msg_wisa_params;
10209 message.type = WMA_SET_WISA_PARAMS;
10210 status = scheduler_post_message(QDF_MODULE_ID_SME,
10211 QDF_MODULE_ID_WMA,
10212 QDF_MODULE_ID_WMA, &message);
10213 if (QDF_IS_STATUS_ERROR(status))
10214 qdf_mem_free(cds_msg_wisa_params);
10215 sme_release_global_lock(&mac->sme);
Wen Gong7952fbd2018-04-18 11:27:23 +080010216 return status;
10217}
10218
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010219#ifdef WLAN_FEATURE_LINK_LAYER_STATS
10220
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053010221/*
10222 * sme_ll_stats_clear_req() -
10223 * SME API to clear Link Layer Statistics
10224 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -080010225 * mac_handle
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053010226 * pclearStatsReq: Link Layer clear stats request params structure
10227 * Return QDF_STATUS
10228 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -080010229QDF_STATUS sme_ll_stats_clear_req(mac_handle_t mac_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010230 tSirLLStatsClearReq *pclearStatsReq)
10231{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010232 QDF_STATUS status = QDF_STATUS_SUCCESS;
10233 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080010234 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Rajeev Kumar37d478b2017-04-17 16:59:28 -070010235 struct scheduler_msg message = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010236 tSirLLStatsClearReq *clear_stats_req;
10237
Abhishek Singhe4a1f882017-08-10 17:59:44 +053010238 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010239 "staId = %u", pclearStatsReq->staId);
Abhishek Singhe4a1f882017-08-10 17:59:44 +053010240 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010241 "statsClearReqMask = 0x%X",
10242 pclearStatsReq->statsClearReqMask);
Abhishek Singhe4a1f882017-08-10 17:59:44 +053010243 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010244 "stopReq = %u", pclearStatsReq->stopReq);
Jeff Johnsonb460dd72018-11-08 10:26:51 -080010245 if (!sme_is_session_id_valid(mac_handle, pclearStatsReq->staId)) {
Deepak Dhamdhere6adc08e2017-07-27 09:33:22 -070010246 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
10247 "%s: invalid staId %d",
10248 __func__, pclearStatsReq->staId);
10249 return QDF_STATUS_E_INVAL;
10250 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010251
Anurag Chouhan600c3a02016-03-01 10:33:54 +053010252 clear_stats_req = qdf_mem_malloc(sizeof(*clear_stats_req));
Arif Hussain0ef77082018-10-10 16:42:53 -070010253 if (!clear_stats_req)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010254 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010255
10256 *clear_stats_req = *pclearStatsReq;
10257
Jeff Johnson01f2c232018-11-21 19:17:44 -080010258 if (QDF_STATUS_SUCCESS == sme_acquire_global_lock(&mac->sme)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010259 /* Serialize the req through MC thread */
Rajeev Kumar8eaedf62017-01-21 11:03:13 -080010260 message.bodyptr = clear_stats_req;
10261 message.type = WMA_LINK_LAYER_STATS_CLEAR_REQ;
Sreelakshmi Konamki6a065362016-05-31 16:05:01 +053010262 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
Rajeev Kumar8eaedf62017-01-21 11:03:13 -080010263 NO_SESSION, message.type));
gaurank kathpalia36b0c582018-08-28 17:45:43 +053010264 qdf_status = scheduler_post_message(QDF_MODULE_ID_SME,
10265 QDF_MODULE_ID_WMA,
10266 QDF_MODULE_ID_WMA,
10267 &message);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010268 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053010269 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010270 "%s: not able to post WMA_LL_STATS_CLEAR_REQ",
10271 __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053010272 qdf_mem_free(clear_stats_req);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010273 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010274 }
Jeff Johnson01f2c232018-11-21 19:17:44 -080010275 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010276 } else {
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053010277 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
10278 "%s: sme_acquire_global_lock error", __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053010279 qdf_mem_free(clear_stats_req);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010280 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010281 }
10282
10283 return status;
10284}
10285
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053010286/*
10287 * sme_ll_stats_set_req() -
10288 * SME API to set the Link Layer Statistics
10289 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -080010290 * mac_handle
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053010291 * psetStatsReq: Link Layer set stats request params structure
10292 * Return QDF_STATUS
10293 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -080010294QDF_STATUS sme_ll_stats_set_req(mac_handle_t mac_handle, tSirLLStatsSetReq
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053010295 *psetStatsReq)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010296{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010297 QDF_STATUS status = QDF_STATUS_SUCCESS;
10298 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080010299 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Rajeev Kumar37d478b2017-04-17 16:59:28 -070010300 struct scheduler_msg message = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010301 tSirLLStatsSetReq *set_stats_req;
10302
Abhishek Singhe4a1f882017-08-10 17:59:44 +053010303 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010304 "%s: MPDU Size = %u", __func__,
10305 psetStatsReq->mpduSizeThreshold);
Abhishek Singhe4a1f882017-08-10 17:59:44 +053010306 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010307 " Aggressive Stats Collections = %u",
10308 psetStatsReq->aggressiveStatisticsGathering);
10309
Anurag Chouhan600c3a02016-03-01 10:33:54 +053010310 set_stats_req = qdf_mem_malloc(sizeof(*set_stats_req));
Arif Hussain0ef77082018-10-10 16:42:53 -070010311 if (!set_stats_req)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010312 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010313
10314 *set_stats_req = *psetStatsReq;
10315
Jeff Johnson01f2c232018-11-21 19:17:44 -080010316 if (QDF_STATUS_SUCCESS == sme_acquire_global_lock(&mac->sme)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010317 /* Serialize the req through MC thread */
Rajeev Kumar8eaedf62017-01-21 11:03:13 -080010318 message.bodyptr = set_stats_req;
10319 message.type = WMA_LINK_LAYER_STATS_SET_REQ;
Sreelakshmi Konamki6a065362016-05-31 16:05:01 +053010320 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
Rajeev Kumar8eaedf62017-01-21 11:03:13 -080010321 NO_SESSION, message.type));
gaurank kathpalia36b0c582018-08-28 17:45:43 +053010322 qdf_status = scheduler_post_message(QDF_MODULE_ID_SME,
10323 QDF_MODULE_ID_WMA,
10324 QDF_MODULE_ID_WMA,
10325 &message);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010326 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053010327 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010328 "%s: not able to post WMA_LL_STATS_SET_REQ",
10329 __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053010330 qdf_mem_free(set_stats_req);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010331 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010332 }
Jeff Johnson01f2c232018-11-21 19:17:44 -080010333 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010334 } else {
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053010335 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
10336 "%s: sme_acquire_global_lock error", __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053010337 qdf_mem_free(set_stats_req);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010338 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010339 }
10340
10341 return status;
10342}
10343
Dundi Ravitejae232cf12018-05-16 18:34:34 +053010344QDF_STATUS sme_ll_stats_get_req(mac_handle_t mac_handle,
10345 tSirLLStatsGetReq *get_stats_req,
10346 void *context)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010347{
Dundi Ravitejae232cf12018-05-16 18:34:34 +053010348 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080010349 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Rajeev Kumar37d478b2017-04-17 16:59:28 -070010350 struct scheduler_msg message = {0};
Dundi Ravitejae232cf12018-05-16 18:34:34 +053010351 tSirLLStatsGetReq *ll_stats_get_req;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010352
Dundi Ravitejae232cf12018-05-16 18:34:34 +053010353 ll_stats_get_req = qdf_mem_malloc(sizeof(*ll_stats_get_req));
Arif Hussain0ef77082018-10-10 16:42:53 -070010354 if (!ll_stats_get_req)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010355 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010356
Dundi Ravitejae232cf12018-05-16 18:34:34 +053010357 *ll_stats_get_req = *get_stats_req;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010358
Dundi Ravitejae232cf12018-05-16 18:34:34 +053010359 mac->sme.ll_stats_context = context;
10360 if (sme_acquire_global_lock(&mac->sme) == QDF_STATUS_SUCCESS) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010361 /* Serialize the req through MC thread */
Dundi Ravitejae232cf12018-05-16 18:34:34 +053010362 message.bodyptr = ll_stats_get_req;
Rajeev Kumar8eaedf62017-01-21 11:03:13 -080010363 message.type = WMA_LINK_LAYER_STATS_GET_REQ;
Dundi Ravitejae232cf12018-05-16 18:34:34 +053010364 qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
10365 NO_SESSION, message.type);
gaurank kathpalia36b0c582018-08-28 17:45:43 +053010366 status = scheduler_post_message(QDF_MODULE_ID_SME,
10367 QDF_MODULE_ID_WMA,
10368 QDF_MODULE_ID_WMA, &message);
Dundi Ravitejae232cf12018-05-16 18:34:34 +053010369 if (!QDF_IS_STATUS_SUCCESS(status)) {
10370 sme_err("Not able to post WMA_LL_STATS_GET_REQ");
10371 qdf_mem_free(ll_stats_get_req);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010372 }
Dundi Ravitejae232cf12018-05-16 18:34:34 +053010373 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010374 } else {
Dundi Ravitejae232cf12018-05-16 18:34:34 +053010375 sme_err("sme_acquire_global_lock error");
10376 qdf_mem_free(ll_stats_get_req);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010377 }
10378
10379 return status;
10380}
10381
Jeff Johnson959f3692018-07-03 17:30:40 -070010382QDF_STATUS sme_set_link_layer_stats_ind_cb(mac_handle_t mac_handle,
10383 link_layer_stats_cb callback)
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053010384{
Jeff Johnson959f3692018-07-03 17:30:40 -070010385 QDF_STATUS status;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080010386 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010387
Jeff Johnson959f3692018-07-03 17:30:40 -070010388 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010389 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson959f3692018-07-03 17:30:40 -070010390 mac->sme.link_layer_stats_cb = callback;
10391 sme_release_global_lock(&mac->sme);
10392 } else {
10393 sme_err("sme_acquire_global_lock error");
10394 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010395
10396 return status;
10397}
10398
Arun Khandavalli4b55da72016-07-19 19:55:01 +053010399/**
Zhang Qiana6e9c102016-12-22 16:47:24 +080010400 * sme_set_link_layer_ext_cb() - Register callback for link layer statistics
Jeff Johnsonc7309062018-11-09 20:59:42 -080010401 * @mac_handle: Mac global handle
Zhang Qiana6e9c102016-12-22 16:47:24 +080010402 * @ll_stats_ext_cb: HDD callback which needs to be invoked after getting
10403 * status notification from FW
10404 *
Jeff Johnsonc7309062018-11-09 20:59:42 -080010405 * Return: QDF_STATUS
Zhang Qiana6e9c102016-12-22 16:47:24 +080010406 */
Jeff Johnsonc7309062018-11-09 20:59:42 -080010407QDF_STATUS
10408sme_set_link_layer_ext_cb(mac_handle_t mac_handle,
10409 void (*ll_stats_ext_cb)(hdd_handle_t callback_ctx,
10410 tSirLLStatsResults *rsp))
Zhang Qiana6e9c102016-12-22 16:47:24 +080010411{
10412 QDF_STATUS status;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080010413 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Zhang Qiana6e9c102016-12-22 16:47:24 +080010414
10415 status = sme_acquire_global_lock(&mac->sme);
10416 if (status == QDF_STATUS_SUCCESS) {
10417 mac->sme.link_layer_stats_ext_cb = ll_stats_ext_cb;
10418 sme_release_global_lock(&mac->sme);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053010419 } else
Zhang Qiana6e9c102016-12-22 16:47:24 +080010420 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
10421 "%s: sme_qcquire_global_lock error", __func__);
Zhang Qiana6e9c102016-12-22 16:47:24 +080010422 return status;
10423}
10424
10425/**
Arun Khandavalli4b55da72016-07-19 19:55:01 +053010426 * sme_reset_link_layer_stats_ind_cb() - SME API to reset link layer stats
10427 * indication
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -080010428 * @mac_handle: Opaque handle to the global MAC context
Arun Khandavalli4b55da72016-07-19 19:55:01 +053010429 *
10430 * This function reset's the link layer stats indication
10431 *
10432 * Return: QDF_STATUS Enumeration
10433 */
10434
Jeff Johnsonb460dd72018-11-08 10:26:51 -080010435QDF_STATUS sme_reset_link_layer_stats_ind_cb(mac_handle_t mac_handle)
Arun Khandavalli4b55da72016-07-19 19:55:01 +053010436{
10437 QDF_STATUS status;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080010438 struct mac_context *pmac;
Arun Khandavalli4b55da72016-07-19 19:55:01 +053010439
Jeff Johnsonb460dd72018-11-08 10:26:51 -080010440 if (!mac_handle) {
Arun Khandavalli4b55da72016-07-19 19:55:01 +053010441 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Jeff Johnsonb460dd72018-11-08 10:26:51 -080010442 FL("mac_handle is not valid"));
Arun Khandavalli4b55da72016-07-19 19:55:01 +053010443 return QDF_STATUS_E_INVAL;
10444 }
Jeff Johnsona0619e42018-11-28 17:43:00 -080010445 pmac = MAC_CONTEXT(mac_handle);
Arun Khandavalli4b55da72016-07-19 19:55:01 +053010446
10447 status = sme_acquire_global_lock(&pmac->sme);
10448 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson959f3692018-07-03 17:30:40 -070010449 pmac->sme.link_layer_stats_cb = NULL;
Arun Khandavalli4b55da72016-07-19 19:55:01 +053010450 sme_release_global_lock(&pmac->sme);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053010451 } else
10452 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
10453 "%s: sme_acquire_global_lock error", __func__);
Arun Khandavalli4b55da72016-07-19 19:55:01 +053010454
10455 return status;
10456}
10457
Zhang Qian73c348a2017-03-13 16:15:55 +080010458/**
10459 * sme_ll_stats_set_thresh - set threshold for mac counters
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -080010460 * @mac_handle: Opaque handle to the global MAC context
Zhang Qian73c348a2017-03-13 16:15:55 +080010461 * @threshold, threshold for mac counters
10462 *
10463 * Return: QDF_STATUS Enumeration
10464 */
Jeff Johnsonc7309062018-11-09 20:59:42 -080010465QDF_STATUS sme_ll_stats_set_thresh(mac_handle_t mac_handle,
Zhang Qian73c348a2017-03-13 16:15:55 +080010466 struct sir_ll_ext_stats_threshold *threshold)
10467{
10468 QDF_STATUS status;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080010469 struct mac_context *mac;
Rajeev Kumar658e8492017-12-13 11:35:41 -080010470 struct scheduler_msg message = {0};
Zhang Qian73c348a2017-03-13 16:15:55 +080010471 struct sir_ll_ext_stats_threshold *thresh;
10472
10473 if (!threshold) {
10474 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
10475 FL("threshold is not valid"));
10476 return QDF_STATUS_E_INVAL;
10477 }
10478
Jeff Johnsonc7309062018-11-09 20:59:42 -080010479 if (!mac_handle) {
Zhang Qian73c348a2017-03-13 16:15:55 +080010480 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Jeff Johnsonc7309062018-11-09 20:59:42 -080010481 FL("mac_handle is not valid"));
Zhang Qian73c348a2017-03-13 16:15:55 +080010482 return QDF_STATUS_E_INVAL;
10483 }
Jeff Johnsona0619e42018-11-28 17:43:00 -080010484 mac = MAC_CONTEXT(mac_handle);
Zhang Qian73c348a2017-03-13 16:15:55 +080010485
10486 thresh = qdf_mem_malloc(sizeof(*thresh));
Arif Hussain0ef77082018-10-10 16:42:53 -070010487 if (!thresh)
Zhang Qian73c348a2017-03-13 16:15:55 +080010488 return QDF_STATUS_E_NOMEM;
Arif Hussain0ef77082018-10-10 16:42:53 -070010489
Zhang Qian73c348a2017-03-13 16:15:55 +080010490 *thresh = *threshold;
10491
10492 status = sme_acquire_global_lock(&mac->sme);
10493 if (QDF_IS_STATUS_SUCCESS(status)) {
10494 /* Serialize the req through MC thread */
10495 message.bodyptr = thresh;
10496 message.type = WDA_LINK_LAYER_STATS_SET_THRESHOLD;
10497 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
10498 NO_SESSION, message.type));
gaurank kathpalia36b0c582018-08-28 17:45:43 +053010499 status = scheduler_post_message(QDF_MODULE_ID_SME,
10500 QDF_MODULE_ID_WMA,
10501 QDF_MODULE_ID_WMA, &message);
Zhang Qian73c348a2017-03-13 16:15:55 +080010502 if (!QDF_IS_STATUS_SUCCESS(status)) {
10503 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
10504 "%s: not able to post WDA_LL_STATS_GET_REQ",
10505 __func__);
10506 qdf_mem_free(thresh);
10507 }
10508 sme_release_global_lock(&mac->sme);
10509 } else {
10510 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
10511 FL("sme_acquire_global_lock error"));
10512 qdf_mem_free(thresh);
10513 }
10514 return status;
10515}
Arun Khandavalli4b55da72016-07-19 19:55:01 +053010516
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010517#endif /* WLAN_FEATURE_LINK_LAYER_STATS */
10518
Sridhar Selvarajdc400d22016-10-18 17:18:03 +053010519#ifdef WLAN_POWER_DEBUGFS
10520/**
10521 * sme_power_debug_stats_req() - SME API to collect Power debug stats
10522 * @callback_fn: Pointer to the callback function for Power stats event
10523 * @power_stats_context: Pointer to context
10524 *
10525 * Return: QDF_STATUS
10526 */
Jeff Johnsonc7309062018-11-09 20:59:42 -080010527QDF_STATUS sme_power_debug_stats_req(
10528 mac_handle_t mac_handle,
10529 void (*callback_fn)(struct power_stats_response *response,
10530 void *context),
10531 void *power_stats_context)
Sridhar Selvarajdc400d22016-10-18 17:18:03 +053010532{
10533 QDF_STATUS status = QDF_STATUS_SUCCESS;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080010534 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Rajeev Kumar37d478b2017-04-17 16:59:28 -070010535 struct scheduler_msg msg = {0};
Sridhar Selvarajdc400d22016-10-18 17:18:03 +053010536
10537 status = sme_acquire_global_lock(&mac_ctx->sme);
10538 if (QDF_IS_STATUS_SUCCESS(status)) {
10539 if (!callback_fn) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070010540 sme_err("Indication callback did not registered");
Sridhar Selvarajdc400d22016-10-18 17:18:03 +053010541 sme_release_global_lock(&mac_ctx->sme);
10542 return QDF_STATUS_E_FAILURE;
10543 }
10544
10545 mac_ctx->sme.power_debug_stats_context = power_stats_context;
10546 mac_ctx->sme.power_stats_resp_callback = callback_fn;
10547 msg.bodyptr = NULL;
10548 msg.type = WMA_POWER_DEBUG_STATS_REQ;
gaurank kathpalia36b0c582018-08-28 17:45:43 +053010549 status = scheduler_post_message(QDF_MODULE_ID_SME,
10550 QDF_MODULE_ID_WMA,
10551 QDF_MODULE_ID_WMA, &msg);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053010552 if (!QDF_IS_STATUS_SUCCESS(status))
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070010553 sme_err("not able to post WDA_POWER_DEBUG_STATS_REQ");
Sridhar Selvarajdc400d22016-10-18 17:18:03 +053010554 sme_release_global_lock(&mac_ctx->sme);
10555 }
10556 return status;
10557}
10558#endif
10559
Arunk Khandavallica56d4b2018-11-29 15:46:00 +053010560#ifdef WLAN_FEATURE_BEACON_RECEPTION_STATS
10561QDF_STATUS sme_beacon_debug_stats_req(
10562 mac_handle_t mac_handle, uint32_t vdev_id,
10563 void (*callback_fn)(struct bcn_reception_stats_rsp
10564 *response, void *context),
10565 void *beacon_stats_context)
10566{
10567 QDF_STATUS status;
10568 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
10569 uint32_t *val;
10570 struct scheduler_msg msg = {0};
10571
10572 status = sme_acquire_global_lock(&mac_ctx->sme);
10573 if (QDF_IS_STATUS_SUCCESS(status)) {
10574 if (!callback_fn) {
10575 sme_err("Indication callback did not registered");
10576 sme_release_global_lock(&mac_ctx->sme);
10577 return QDF_STATUS_E_FAILURE;
10578 }
10579
Sourav Mohapatrac55bdf32018-12-13 16:16:50 +053010580 if (!mac_ctx->bcn_reception_stats &&
10581 !mac_ctx->mlme_cfg->gen.enable_beacon_reception_stats) {
10582 sme_err("Beacon Reception stats not supported");
Arunk Khandavallica56d4b2018-11-29 15:46:00 +053010583 sme_release_global_lock(&mac_ctx->sme);
10584 return QDF_STATUS_E_NOSUPPORT;
10585 }
10586
10587 val = qdf_mem_malloc(sizeof(*val));
10588 if (!val) {
10589 sme_release_global_lock(&mac_ctx->sme);
10590 return QDF_STATUS_E_NOMEM;
10591 }
10592
10593 *val = vdev_id;
10594 mac_ctx->sme.beacon_stats_context = beacon_stats_context;
10595 mac_ctx->sme.beacon_stats_resp_callback = callback_fn;
10596 msg.bodyptr = val;
10597 msg.type = WMA_BEACON_DEBUG_STATS_REQ;
10598 status = scheduler_post_message(QDF_MODULE_ID_SME,
10599 QDF_MODULE_ID_WMA,
10600 QDF_MODULE_ID_WMA, &msg);
10601 if (!QDF_IS_STATUS_SUCCESS(status)) {
10602 sme_err("not able to post WMA_BEACON_DEBUG_STATS_REQ");
10603 qdf_mem_free(val);
10604 }
10605 sme_release_global_lock(&mac_ctx->sme);
10606 }
10607 return status;
10608}
10609#endif
10610
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010611#ifdef WLAN_FEATURE_ROAM_OFFLOAD
Deepak Dhamdheref2a7d8b2016-08-19 16:17:38 -070010612/**
10613 * sme_update_roam_key_mgmt_offload_enabled() - enable/disable key mgmt offload
10614 * This is a synchronous call
Jeff Johnsond5fb2db2018-11-08 14:20:28 -080010615 * @mac_handle: The handle returned by mac_open.
Deepak Dhamdheref2a7d8b2016-08-19 16:17:38 -070010616 * @session_id: Session Identifier
10617 * @key_mgmt_offload_enabled: key mgmt enable/disable flag
Deepak Dhamdhere828f1892017-02-09 11:51:19 -080010618 * @pmkid_modes: PMKID modes of PMKSA caching and OKC
Deepak Dhamdheref2a7d8b2016-08-19 16:17:38 -070010619 * Return: QDF_STATUS_SUCCESS - SME updated config successfully.
10620 * Other status means SME is failed to update.
10621 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010622
Jeff Johnsond5fb2db2018-11-08 14:20:28 -080010623QDF_STATUS sme_update_roam_key_mgmt_offload_enabled(mac_handle_t mac_handle,
Deepak Dhamdhere828f1892017-02-09 11:51:19 -080010624 uint8_t session_id,
10625 bool key_mgmt_offload_enabled,
10626 struct pmkid_mode_bits *pmkid_modes)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010627{
Jeff Johnson0a8786a2018-12-02 10:49:01 -080010628 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010629 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010630
Deepak Dhamdheref2a7d8b2016-08-19 16:17:38 -070010631 status = sme_acquire_global_lock(&mac_ctx->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010632 if (QDF_IS_STATUS_SUCCESS(status)) {
Deepak Dhamdheref2a7d8b2016-08-19 16:17:38 -070010633 if (CSR_IS_SESSION_VALID(mac_ctx, session_id)) {
Abhishek Singhe4a1f882017-08-10 17:59:44 +053010634 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Deepak Dhamdheref2a7d8b2016-08-19 16:17:38 -070010635 "%s: LFR3: key_mgmt_offload_enabled changed to %d",
10636 __func__, key_mgmt_offload_enabled);
10637 status = csr_roam_set_key_mgmt_offload(mac_ctx,
10638 session_id,
10639 key_mgmt_offload_enabled,
Deepak Dhamdhere828f1892017-02-09 11:51:19 -080010640 pmkid_modes);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053010641 } else
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010642 status = QDF_STATUS_E_INVAL;
Deepak Dhamdheref2a7d8b2016-08-19 16:17:38 -070010643 sme_release_global_lock(&mac_ctx->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010644 }
10645
10646 return status;
10647}
Prashanth Bhattabfc25292015-11-05 11:16:21 -080010648#endif
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010649
Jeff Johnson3f3ad252019-02-17 20:44:11 -080010650/**
10651 * sme_get_temperature() - SME API to get the pdev temperature
10652 * @mac_handle: Handle to global MAC context
10653 * @cb_context: temperature callback context
10654 * @cb: callback function with response (temperature)
10655 * Return: QDF_STATUS
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053010656 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -080010657QDF_STATUS sme_get_temperature(mac_handle_t mac_handle,
Jeff Johnson3f3ad252019-02-17 20:44:11 -080010658 void *cb_context,
10659 void (*cb)(int temperature,
10660 void *context))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010661{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010662 QDF_STATUS status = QDF_STATUS_SUCCESS;
10663 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080010664 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Rajeev Kumar37d478b2017-04-17 16:59:28 -070010665 struct scheduler_msg message = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010666
Jeff Johnson01f2c232018-11-21 19:17:44 -080010667 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010668 if (QDF_STATUS_SUCCESS == status) {
Jeff Johnson3f3ad252019-02-17 20:44:11 -080010669 if ((!cb) &&
10670 (!mac->sme.temperature_cb)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053010671 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053010672 "Indication Call back did not registered");
Jeff Johnson01f2c232018-11-21 19:17:44 -080010673 sme_release_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010674 return QDF_STATUS_E_FAILURE;
Jeff Johnson3f3ad252019-02-17 20:44:11 -080010675 } else if (cb) {
10676 mac->sme.temperature_cb_context = cb_context;
10677 mac->sme.temperature_cb = cb;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010678 }
10679 /* serialize the req through MC thread */
Rajeev Kumar8eaedf62017-01-21 11:03:13 -080010680 message.bodyptr = NULL;
10681 message.type = WMA_GET_TEMPERATURE_REQ;
gaurank kathpalia36b0c582018-08-28 17:45:43 +053010682 qdf_status = scheduler_post_message(QDF_MODULE_ID_SME,
10683 QDF_MODULE_ID_WMA,
10684 QDF_MODULE_ID_WMA,
10685 &message);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010686 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053010687 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010688 FL("Post Get Temperature msg fail"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010689 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010690 }
Jeff Johnson01f2c232018-11-21 19:17:44 -080010691 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010692 }
10693 return status;
10694}
10695
Jeff Johnsonc7309062018-11-09 20:59:42 -080010696QDF_STATUS sme_set_scanning_mac_oui(mac_handle_t mac_handle,
Jeff Johnson9d45f332019-01-29 08:42:00 -080010697 struct scan_mac_oui *scan_mac_oui)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010698{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010699 QDF_STATUS status = QDF_STATUS_SUCCESS;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080010700 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Rajeev Kumar37d478b2017-04-17 16:59:28 -070010701 struct scheduler_msg message = {0};
Jeff Johnson9d45f332019-01-29 08:42:00 -080010702 struct scan_mac_oui *bodyptr;
10703
10704 /* per contract must make a copy of the params when messaging */
10705 bodyptr = qdf_mem_malloc(sizeof(*bodyptr));
10706 if (!bodyptr)
10707 return QDF_STATUS_E_NOMEM;
10708 *bodyptr = *scan_mac_oui;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010709
Jeff Johnson01f2c232018-11-21 19:17:44 -080010710 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010711 if (QDF_STATUS_SUCCESS == status) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010712 /* Serialize the req through MC thread */
Jeff Johnson9d45f332019-01-29 08:42:00 -080010713 message.bodyptr = bodyptr;
Rajeev Kumar8eaedf62017-01-21 11:03:13 -080010714 message.type = WMA_SET_SCAN_MAC_OUI_REQ;
Jeff Johnson9d45f332019-01-29 08:42:00 -080010715 status = scheduler_post_message(QDF_MODULE_ID_SME,
10716 QDF_MODULE_ID_WMA,
10717 QDF_MODULE_ID_WMA,
10718 &message);
Jeff Johnson01f2c232018-11-21 19:17:44 -080010719 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010720 }
Jeff Johnson9d45f332019-01-29 08:42:00 -080010721
10722 if (QDF_IS_STATUS_ERROR(status)) {
10723 sme_err("failure: %d", status);
10724 qdf_mem_free(bodyptr);
10725 }
10726
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010727 return status;
10728}
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010729
10730#ifdef DHCP_SERVER_OFFLOAD
Jeff Johnson8bfc29e2019-02-15 07:58:15 -080010731QDF_STATUS
10732sme_set_dhcp_srv_offload(mac_handle_t mac_handle,
10733 struct dhcp_offload_info_params *dhcp_srv_info)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010734{
Rajeev Kumar37d478b2017-04-17 16:59:28 -070010735 struct scheduler_msg message = {0};
Jeff Johnson8bfc29e2019-02-15 07:58:15 -080010736 struct dhcp_offload_info_params *payload;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010737 QDF_STATUS status = QDF_STATUS_SUCCESS;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080010738 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010739
Jeff Johnson8bfc29e2019-02-15 07:58:15 -080010740 payload = qdf_mem_malloc(sizeof(*payload));
10741 if (!payload)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010742 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010743
Jeff Johnson8bfc29e2019-02-15 07:58:15 -080010744 *payload = *dhcp_srv_info;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010745
Jeff Johnson01f2c232018-11-21 19:17:44 -080010746 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010747 if (QDF_STATUS_SUCCESS == status) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010748 /* serialize the req through MC thread */
Rajeev Kumar8eaedf62017-01-21 11:03:13 -080010749 message.type = WMA_SET_DHCP_SERVER_OFFLOAD_CMD;
Jeff Johnson8bfc29e2019-02-15 07:58:15 -080010750 message.bodyptr = payload;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010751
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010752 if (!QDF_IS_STATUS_SUCCESS
gaurank kathpalia36b0c582018-08-28 17:45:43 +053010753 (scheduler_post_message(QDF_MODULE_ID_SME,
10754 QDF_MODULE_ID_WMA,
10755 QDF_MODULE_ID_WMA,
10756 &message))) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053010757 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Varun Reddy Yeturu7b2a6572017-06-15 11:07:28 -070010758 "%s:WMA_SET_DHCP_SERVER_OFFLOAD_CMD failed",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010759 __func__);
Jeff Johnson8bfc29e2019-02-15 07:58:15 -080010760 qdf_mem_free(payload);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010761 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010762 }
Jeff Johnson01f2c232018-11-21 19:17:44 -080010763 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010764 } else {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053010765 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010766 "%s: sme_acquire_global_lock error!", __func__);
Jeff Johnson8bfc29e2019-02-15 07:58:15 -080010767 qdf_mem_free(payload);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010768 }
10769
10770 return status;
10771}
10772#endif /* DHCP_SERVER_OFFLOAD */
10773
Krunal Soniaadaa272017-10-04 16:42:55 -070010774QDF_STATUS sme_send_unit_test_cmd(uint32_t vdev_id, uint32_t module_id,
10775 uint32_t arg_count, uint32_t *arg)
10776{
10777 return wma_form_unit_test_cmd_and_send(vdev_id, module_id,
10778 arg_count, arg);
10779}
10780
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010781#ifdef WLAN_FEATURE_GPIO_LED_FLASHING
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053010782/*
10783 * sme_set_led_flashing() -
10784 * API to set the Led flashing parameters.
10785 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -080010786 * mac_handle - The handle returned by mac_open.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053010787 * x0, x1 - led flashing parameters
10788 * Return QDF_STATUS
10789 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -080010790QDF_STATUS sme_set_led_flashing(mac_handle_t mac_handle, uint8_t type,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010791 uint32_t x0, uint32_t x1)
10792{
Jeff Johnson5a6b6602017-10-04 14:44:30 -070010793 QDF_STATUS status;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080010794 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Rajeev Kumar37d478b2017-04-17 16:59:28 -070010795 struct scheduler_msg message = {0};
Jeff Johnson5a6b6602017-10-04 14:44:30 -070010796 struct flashing_req_params *ledflashing;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010797
Anurag Chouhan600c3a02016-03-01 10:33:54 +053010798 ledflashing = qdf_mem_malloc(sizeof(*ledflashing));
Arif Hussain0ef77082018-10-10 16:42:53 -070010799 if (!ledflashing)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010800 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010801
Jeff Johnson5a6b6602017-10-04 14:44:30 -070010802 ledflashing->req_id = 0;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010803 ledflashing->pattern_id = type;
10804 ledflashing->led_x0 = x0;
10805 ledflashing->led_x1 = x1;
10806
Jeff Johnson01f2c232018-11-21 19:17:44 -080010807 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010808 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010809 /* Serialize the req through MC thread */
Rajeev Kumar8eaedf62017-01-21 11:03:13 -080010810 message.bodyptr = ledflashing;
10811 message.type = WMA_LED_FLASHING_REQ;
gaurank kathpalia36b0c582018-08-28 17:45:43 +053010812 status = scheduler_post_message(QDF_MODULE_ID_SME,
10813 QDF_MODULE_ID_WMA,
10814 QDF_MODULE_ID_WMA, &message);
Jeff Johnson01f2c232018-11-21 19:17:44 -080010815 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010816 }
Jeff Johnson5a6b6602017-10-04 14:44:30 -070010817 if (!QDF_IS_STATUS_SUCCESS(status))
10818 qdf_mem_free(ledflashing);
10819
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010820 return status;
10821}
10822#endif
10823
10824/**
Min Liu5eaf7242018-03-13 17:32:15 +080010825 * sme_enable_dfS_chan_scan() - set DFS channel scan enable/disable
Jeff Johnsonb460dd72018-11-08 10:26:51 -080010826 * @mac_handle: corestack handler
Min Liu5eaf7242018-03-13 17:32:15 +080010827 * @dfs_flag: flag indicating dfs channel enable/disable
10828 * Return: QDF_STATUS
10829 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -080010830QDF_STATUS sme_enable_dfs_chan_scan(mac_handle_t mac_handle, uint8_t dfs_flag)
Min Liu5eaf7242018-03-13 17:32:15 +080010831{
10832 QDF_STATUS status = QDF_STATUS_SUCCESS;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080010833 struct mac_context *mac;
Min Liu5eaf7242018-03-13 17:32:15 +080010834
Jeff Johnsonb460dd72018-11-08 10:26:51 -080010835 if (!mac_handle) {
Jeff Johnsonc7309062018-11-09 20:59:42 -080010836 sme_err("mac_handle is NULL");
Min Liu5eaf7242018-03-13 17:32:15 +080010837 return QDF_STATUS_E_INVAL;
10838 }
10839
Jeff Johnsona0619e42018-11-28 17:43:00 -080010840 mac = MAC_CONTEXT(mac_handle);
Min Liu5eaf7242018-03-13 17:32:15 +080010841
10842 mac->scan.fEnableDFSChnlScan = dfs_flag;
10843
10844 return status;
10845}
10846
Edhar, Mahesh Kumardf2ec122015-11-16 11:33:16 +053010847#ifdef FEATURE_WLAN_MCC_TO_SCC_SWITCH
10848/**
10849 * sme_validate_sap_channel_switch() - validate target channel switch w.r.t
10850 * concurreny rules set to avoid channel interference.
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -080010851 * @mac_handle: Opaque handle to the global MAC context
Edhar, Mahesh Kumardf2ec122015-11-16 11:33:16 +053010852 * @sap_ch - channel to switch
10853 * @sap_phy_mode - phy mode of SAP
10854 * @cc_switch_mode - concurreny switch mode
10855 * @session_id - sme session id.
10856 *
10857 * Return: true if there is no channel interference else return false
10858 */
Jeff Johnsonc7309062018-11-09 20:59:42 -080010859bool sme_validate_sap_channel_switch(mac_handle_t mac_handle,
Tushnim Bhattacharyyafaa9c012019-10-28 15:18:36 -070010860 uint32_t sap_ch_freq,
Jeff Johnsonc7309062018-11-09 20:59:42 -080010861 eCsrPhyMode sap_phy_mode,
10862 uint8_t cc_switch_mode,
10863 uint8_t session_id)
Edhar, Mahesh Kumardf2ec122015-11-16 11:33:16 +053010864{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010865 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080010866 struct mac_context *mac = MAC_CONTEXT(mac_handle);
gaurank kathpalia14e2f912017-08-31 14:51:45 +053010867 struct csr_roam_session *session = CSR_GET_SESSION(mac, session_id);
Liangwei Dong10054b92019-11-29 18:44:14 +080010868 uint16_t intf_channel_freq = 0;
Edhar, Mahesh Kumardf2ec122015-11-16 11:33:16 +053010869
10870 if (!session)
10871 return false;
10872
10873 session->ch_switch_in_progress = true;
10874 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010875 if (QDF_IS_STATUS_SUCCESS(status)) {
Liangwei Dong10054b92019-11-29 18:44:14 +080010876 intf_channel_freq = csr_check_concurrent_channel_overlap(
10877 mac, sap_ch_freq, sap_phy_mode, cc_switch_mode);
Edhar, Mahesh Kumardf2ec122015-11-16 11:33:16 +053010878 sme_release_global_lock(&mac->sme);
10879 } else {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053010880 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Edhar, Mahesh Kumardf2ec122015-11-16 11:33:16 +053010881 FL("sme_acquire_global_lock error!"));
10882 session->ch_switch_in_progress = false;
10883 return false;
10884 }
10885
10886 session->ch_switch_in_progress = false;
Liangwei Dong10054b92019-11-29 18:44:14 +080010887 return (intf_channel_freq == 0) ? true : false;
Edhar, Mahesh Kumardf2ec122015-11-16 11:33:16 +053010888}
10889#endif
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010890
10891/**
10892 * sme_configure_stats_avg_factor() - function to config avg. stats factor
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -080010893 * @mac_handle: Opaque handle to the global MAC context
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010894 * @session_id: session ID
10895 * @stats_avg_factor: average stats factor
10896 *
10897 * This function configures the stats avg factor in firmware
10898 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010899 * Return: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010900 */
Jeff Johnsonc7309062018-11-09 20:59:42 -080010901QDF_STATUS sme_configure_stats_avg_factor(mac_handle_t mac_handle,
10902 uint8_t session_id,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010903 uint16_t stats_avg_factor)
10904{
Rajeev Kumar37d478b2017-04-17 16:59:28 -070010905 struct scheduler_msg msg = {0};
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010906 QDF_STATUS status = QDF_STATUS_SUCCESS;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080010907 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010908 struct sir_stats_avg_factor *stats_factor;
10909
Anurag Chouhan600c3a02016-03-01 10:33:54 +053010910 stats_factor = qdf_mem_malloc(sizeof(*stats_factor));
Arif Hussain0ef77082018-10-10 16:42:53 -070010911 if (!stats_factor)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010912 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010913
10914 status = sme_acquire_global_lock(&mac->sme);
10915
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010916 if (QDF_STATUS_SUCCESS == status) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010917
10918 stats_factor->vdev_id = session_id;
10919 stats_factor->stats_avg_factor = stats_avg_factor;
10920
10921 /* serialize the req through MC thread */
10922 msg.type = SIR_HAL_CONFIG_STATS_FACTOR;
10923 msg.bodyptr = stats_factor;
10924
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010925 if (!QDF_IS_STATUS_SUCCESS(
gaurank kathpalia36b0c582018-08-28 17:45:43 +053010926 scheduler_post_message(QDF_MODULE_ID_SME,
10927 QDF_MODULE_ID_WMA,
10928 QDF_MODULE_ID_WMA, &msg))) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053010929 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010930 "%s: Not able to post SIR_HAL_CONFIG_STATS_FACTOR to WMA!",
10931 __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053010932 qdf_mem_free(stats_factor);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010933 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010934 }
10935 sme_release_global_lock(&mac->sme);
10936 } else {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053010937 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010938 "%s: sme_acquire_global_lock error!",
10939 __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053010940 qdf_mem_free(stats_factor);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010941 }
10942
10943 return status;
10944}
10945
10946/**
10947 * sme_configure_guard_time() - function to configure guard time
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -080010948 * @mac_handle: Opaque handle to the global MAC context
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010949 * @session_id: session id
10950 * @guard_time: guard time
10951 *
10952 * This function configures the guard time in firmware
10953 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010954 * Return: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010955 */
Jeff Johnsonc7309062018-11-09 20:59:42 -080010956QDF_STATUS sme_configure_guard_time(mac_handle_t mac_handle, uint8_t session_id,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010957 uint32_t guard_time)
10958{
Rajeev Kumar37d478b2017-04-17 16:59:28 -070010959 struct scheduler_msg msg = {0};
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010960 QDF_STATUS status = QDF_STATUS_SUCCESS;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080010961 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010962 struct sir_guard_time_request *g_time;
10963
Anurag Chouhan600c3a02016-03-01 10:33:54 +053010964 g_time = qdf_mem_malloc(sizeof(*g_time));
Arif Hussain0ef77082018-10-10 16:42:53 -070010965 if (!g_time)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010966 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010967
10968 status = sme_acquire_global_lock(&mac->sme);
10969
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010970 if (QDF_STATUS_SUCCESS == status) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010971
10972 g_time->vdev_id = session_id;
10973 g_time->guard_time = guard_time;
10974
10975 /* serialize the req through MC thread */
10976 msg.type = SIR_HAL_CONFIG_GUARD_TIME;
10977 msg.bodyptr = g_time;
10978
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010979 if (!QDF_IS_STATUS_SUCCESS(
gaurank kathpalia36b0c582018-08-28 17:45:43 +053010980 scheduler_post_message(QDF_MODULE_ID_SME,
10981 QDF_MODULE_ID_WMA,
10982 QDF_MODULE_ID_WMA, &msg))) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053010983 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010984 "%s: Not able to post SIR_HAL_CONFIG_GUARD_TIME to WMA!",
10985 __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053010986 qdf_mem_free(g_time);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010987 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010988 }
10989 sme_release_global_lock(&mac->sme);
10990 } else {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053010991 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010992 "%s: sme_acquire_global_lock error!",
10993 __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053010994 qdf_mem_free(g_time);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010995 }
10996
10997 return status;
10998}
10999
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011000/*
11001 * sme_wifi_start_logger() - Send the start/stop logging command to WMA
11002 * to either start/stop logging
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -080011003 * @mac_handle: Opaque handle to the global MAC context
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011004 * @start_log: Structure containing the wifi start logger params
11005 *
11006 * This function sends the start/stop logging command to WMA
11007 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011008 * Return: QDF_STATUS_SUCCESS on successful posting
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011009 */
Jeff Johnsonc7309062018-11-09 20:59:42 -080011010QDF_STATUS sme_wifi_start_logger(mac_handle_t mac_handle,
11011 struct sir_wifi_start_log start_log)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011012{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011013 QDF_STATUS status = QDF_STATUS_SUCCESS;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080011014 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Rajeev Kumar37d478b2017-04-17 16:59:28 -070011015 struct scheduler_msg message = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011016 struct sir_wifi_start_log *req_msg;
11017 uint32_t len;
11018
11019 len = sizeof(*req_msg);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053011020 req_msg = qdf_mem_malloc(len);
Arif Hussain0ef77082018-10-10 16:42:53 -070011021 if (!req_msg)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011022 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011023
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011024 req_msg->verbose_level = start_log.verbose_level;
Poddar, Siddartheefe3482016-09-21 18:12:59 +053011025 req_msg->is_iwpriv_command = start_log.is_iwpriv_command;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011026 req_msg->ring_id = start_log.ring_id;
Srinivas Girigowdac34f11d2016-02-25 16:02:42 -080011027 req_msg->ini_triggered = start_log.ini_triggered;
11028 req_msg->user_triggered = start_log.user_triggered;
Poddar, Siddarth176c4362016-10-03 12:25:00 +053011029 req_msg->size = start_log.size;
Poddar, Siddarthab99a272017-04-10 12:53:26 +053011030 req_msg->is_pktlog_buff_clear = start_log.is_pktlog_buff_clear;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011031
11032 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011033 if (status != QDF_STATUS_SUCCESS) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070011034 sme_err("sme_acquire_global_lock failed(status=%d)", status);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053011035 qdf_mem_free(req_msg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011036 return status;
11037 }
11038
11039 /* Serialize the req through MC thread */
Rajeev Kumar8eaedf62017-01-21 11:03:13 -080011040 message.bodyptr = req_msg;
11041 message.type = SIR_HAL_START_STOP_LOGGING;
gaurank kathpalia36b0c582018-08-28 17:45:43 +053011042 status = scheduler_post_message(QDF_MODULE_ID_SME,
11043 QDF_MODULE_ID_WMA,
11044 QDF_MODULE_ID_WMA, &message);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011045 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070011046 sme_err("scheduler_post_msg failed!(err=%d)", status);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053011047 qdf_mem_free(req_msg);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011048 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011049 }
11050 sme_release_global_lock(&mac->sme);
11051
11052 return status;
11053}
11054
11055/**
11056 * sme_neighbor_middle_of_roaming() - Function to know if
11057 * STA is in the middle of roaming states
Jeff Johnsonc7309062018-11-09 20:59:42 -080011058 * @mac_handle: Handle returned by macOpen
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011059 * @sessionId: sessionId of the STA session
11060 *
11061 * This function is a wrapper to call
11062 * csr_neighbor_middle_of_roaming to know STA is in the
11063 * middle of roaming states
11064 *
11065 * Return: True or False
11066 *
11067 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -080011068bool sme_neighbor_middle_of_roaming(mac_handle_t mac_handle, uint8_t sessionId)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011069{
Jeff Johnson0a8786a2018-12-02 10:49:01 -080011070 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Sandeep Puligillaca631612016-11-08 11:53:52 -080011071 bool val = false;
11072
11073 if (CSR_IS_SESSION_VALID(mac_ctx, sessionId))
11074 val = csr_neighbor_middle_of_roaming(mac_ctx, sessionId);
11075 else
Rajeev Kumar9176ca42018-05-03 09:20:40 -070011076 sme_debug("Invalid Session: %d", sessionId);
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070011077
Sandeep Puligillaca631612016-11-08 11:53:52 -080011078 return val;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011079}
11080
Jeff Johnsonc7309062018-11-09 20:59:42 -080011081bool sme_is_any_session_in_middle_of_roaming(mac_handle_t mac_handle)
Padma, Santhosh Kumar86747ec2018-05-29 18:28:29 +053011082{
Jeff Johnson0a8786a2018-12-02 10:49:01 -080011083 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Padma, Santhosh Kumar86747ec2018-05-29 18:28:29 +053011084 uint8_t session_id;
11085
Dustin Brownad06be62019-02-04 14:52:56 -080011086 for (session_id = 0; session_id < WLAN_MAX_VDEVS; session_id++) {
Padma, Santhosh Kumar86747ec2018-05-29 18:28:29 +053011087 if (CSR_IS_SESSION_VALID(mac_ctx, session_id) &&
11088 csr_neighbor_middle_of_roaming(mac_ctx, session_id))
11089 return true;
11090 }
11091
11092 return false;
11093}
11094
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011095/*
11096 * sme_send_flush_logs_cmd_to_fw() - Flush FW logs
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011097 *
11098 * This function is used to send the command that will
11099 * be used to flush the logs in the firmware
11100 *
Deepak Dhamdhere0f076bd2016-06-02 11:29:21 -070011101 * Return: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011102 */
Jeff Johnson40894142018-11-17 12:05:54 -080011103QDF_STATUS sme_send_flush_logs_cmd_to_fw(void)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011104{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011105 QDF_STATUS status;
Rajeev Kumar37d478b2017-04-17 16:59:28 -070011106 struct scheduler_msg message = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011107
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011108 /* Serialize the req through MC thread */
11109 message.bodyptr = NULL;
11110 message.type = SIR_HAL_FLUSH_LOG_TO_FW;
gaurank kathpalia36b0c582018-08-28 17:45:43 +053011111 status = scheduler_post_message(QDF_MODULE_ID_SME,
11112 QDF_MODULE_ID_WMA,
11113 QDF_MODULE_ID_WMA, &message);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011114 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070011115 sme_err("scheduler_post_msg failed!(err=%d)", status);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011116 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011117 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011118 return status;
11119}
11120
Sourav Mohapatraa3cf12a2019-08-19 15:40:49 +053011121QDF_STATUS sme_enable_uapsd_for_ac(sme_ac_enum_type ac, uint8_t tid,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011122 uint8_t pri, uint32_t srvc_int,
11123 uint32_t sus_int,
Abhishek Singh12be60f2017-08-11 13:52:42 +053011124 enum sme_qos_wmm_dir_type dir,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011125 uint8_t psb, uint32_t sessionId,
11126 uint32_t delay_interval)
11127{
11128 void *wma_handle;
11129 t_wma_trigger_uapsd_params uapsd_params;
11130 enum uapsd_ac access_category;
11131
11132 if (!psb) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053011133 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011134 "No need to configure auto trigger:psb is 0");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011135 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011136 }
11137
Anurag Chouhan6d760662016-02-20 16:05:43 +053011138 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011139 if (!wma_handle) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053011140 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011141 "wma_handle is NULL");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011142 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011143 }
11144
11145 switch (ac) {
11146 case SME_AC_BK:
11147 access_category = UAPSD_BK;
11148 break;
11149 case SME_AC_BE:
11150 access_category = UAPSD_BE;
11151 break;
11152 case SME_AC_VI:
11153 access_category = UAPSD_VI;
11154 break;
11155 case SME_AC_VO:
11156 access_category = UAPSD_VO;
11157 break;
11158 default:
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011159 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011160 }
11161
11162 uapsd_params.wmm_ac = access_category;
11163 uapsd_params.user_priority = pri;
11164 uapsd_params.service_interval = srvc_int;
11165 uapsd_params.delay_interval = delay_interval;
11166 uapsd_params.suspend_interval = sus_int;
11167
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011168 if (QDF_STATUS_SUCCESS !=
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011169 wma_trigger_uapsd_params(wma_handle, sessionId, &uapsd_params)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053011170 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011171 "Failed to Trigger Uapsd params for sessionId %d",
11172 sessionId);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011173 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011174 }
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011175 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011176}
11177
Sourav Mohapatraa3cf12a2019-08-19 15:40:49 +053011178QDF_STATUS sme_disable_uapsd_for_ac(sme_ac_enum_type ac, uint32_t sessionId)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011179{
11180 void *wma_handle;
11181 enum uapsd_ac access_category;
11182
11183 switch (ac) {
11184 case SME_AC_BK:
11185 access_category = UAPSD_BK;
11186 break;
11187 case SME_AC_BE:
11188 access_category = UAPSD_BE;
11189 break;
11190 case SME_AC_VI:
11191 access_category = UAPSD_VI;
11192 break;
11193 case SME_AC_VO:
11194 access_category = UAPSD_VO;
11195 break;
11196 default:
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011197 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011198 }
11199
Anurag Chouhan6d760662016-02-20 16:05:43 +053011200 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011201 if (!wma_handle) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053011202 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011203 "wma handle is NULL");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011204 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011205 }
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011206 if (QDF_STATUS_SUCCESS !=
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011207 wma_disable_uapsd_per_ac(wma_handle, sessionId, access_category)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053011208 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011209 "Failed to disable uapsd for ac %d for sessionId %d",
11210 ac, sessionId);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011211 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011212 }
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011213 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011214}
11215
11216/**
11217 * sme_update_nss() - SME API to change the number for spatial streams
11218 * (1 or 2)
Jeff Johnsonc7309062018-11-09 20:59:42 -080011219 * @mac_handle: Handle returned by mac open
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011220 * @nss: Number of spatial streams
11221 *
11222 * This function is used to update the number of spatial streams supported.
11223 *
11224 * Return: Success upon successfully changing nss else failure
11225 *
11226 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -080011227QDF_STATUS sme_update_nss(mac_handle_t mac_handle, uint8_t nss)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011228{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011229 QDF_STATUS status;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080011230 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Vignesh Viswanathan21c58cb2018-05-24 15:53:58 +053011231 uint32_t i;
11232 struct mlme_ht_capabilities_info *ht_cap_info;
gaurank kathpalia14e2f912017-08-31 14:51:45 +053011233 struct csr_roam_session *csr_session;
Abhinav Kumard4d6eb72018-12-04 20:30:37 +053011234 struct mlme_vht_capabilities_info *vht_cap_info;
Abhinav Kumarb074f2f2018-09-15 15:32:11 +053011235
Abhinav Kumard4d6eb72018-12-04 20:30:37 +053011236 vht_cap_info = &mac_ctx->mlme_cfg->vht_caps.vht_cap_info;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011237
11238 status = sme_acquire_global_lock(&mac_ctx->sme);
11239
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011240 if (QDF_STATUS_SUCCESS == status) {
Abhinav Kumard4d6eb72018-12-04 20:30:37 +053011241 vht_cap_info->enable2x2 = (nss == 1) ? 0 : 1;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011242
11243 /* get the HT capability info*/
Vignesh Viswanathan21c58cb2018-05-24 15:53:58 +053011244 ht_cap_info = &mac_ctx->mlme_cfg->ht_caps.ht_cap_info;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011245
Dustin Brownad06be62019-02-04 14:52:56 -080011246 for (i = 0; i < WLAN_MAX_VDEVS; i++) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011247 if (CSR_IS_SESSION_VALID(mac_ctx, i)) {
11248 csr_session = &mac_ctx->roam.roamSession[i];
Jeff Johnsonbe119e62019-02-02 12:30:26 -080011249 csr_session->ht_config.ht_tx_stbc =
Vignesh Viswanathan78182502018-08-06 15:13:30 +053011250 ht_cap_info->tx_stbc;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011251 }
11252 }
11253
11254 sme_release_global_lock(&mac_ctx->sme);
11255 }
11256 return status;
11257}
11258
11259/**
Archana Ramachandran5041b252016-04-25 14:29:25 -070011260 * sme_update_user_configured_nss() - sets the nss based on user request
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -080011261 * @mac_handle: Opaque handle to the global MAC context
Archana Ramachandran5041b252016-04-25 14:29:25 -070011262 * @nss: number of streams
11263 *
11264 * Return: None
11265 */
Jeff Johnsonc7309062018-11-09 20:59:42 -080011266void sme_update_user_configured_nss(mac_handle_t mac_handle, uint8_t nss)
Archana Ramachandran5041b252016-04-25 14:29:25 -070011267{
Jeff Johnson0a8786a2018-12-02 10:49:01 -080011268 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Archana Ramachandran5041b252016-04-25 14:29:25 -070011269
11270 mac_ctx->user_configured_nss = nss;
11271}
11272
Jeff Johnsonc7309062018-11-09 20:59:42 -080011273int sme_update_tx_bfee_supp(mac_handle_t mac_handle, uint8_t session_id,
Kiran Kumar Lokere6c7f3fa2018-05-14 18:12:27 -070011274 uint8_t cfg_val)
11275{
Jeff Johnson0a8786a2018-12-02 10:49:01 -080011276 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Jeff Johnsonc18469b2018-06-11 06:48:59 -070011277
Abhinav Kumarb074f2f2018-09-15 15:32:11 +053011278 mac_ctx->mlme_cfg->vht_caps.vht_cap_info.su_bformee = cfg_val;
Kiran Kumar Lokere6c7f3fa2018-05-14 18:12:27 -070011279
Jeff Johnsonc7309062018-11-09 20:59:42 -080011280 return sme_update_he_tx_bfee_supp(mac_handle, session_id, cfg_val);
Kiran Kumar Lokere6c7f3fa2018-05-14 18:12:27 -070011281}
Kiran Kumar Lokeref3044852018-06-27 14:14:24 -070011282
Jeff Johnsonc7309062018-11-09 20:59:42 -080011283int sme_update_tx_bfee_nsts(mac_handle_t mac_handle, uint8_t session_id,
Kiran Kumar Lokeref3044852018-06-27 14:14:24 -070011284 uint8_t usr_cfg_val, uint8_t nsts_val)
11285{
Jeff Johnson0a8786a2018-12-02 10:49:01 -080011286 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Kiran Kumar Lokeref3044852018-06-27 14:14:24 -070011287 uint8_t nsts_set_val;
Abhinav Kumard4d6eb72018-12-04 20:30:37 +053011288 struct mlme_vht_capabilities_info *vht_cap_info;
Kiran Kumar Lokeref3044852018-06-27 14:14:24 -070011289
Abhinav Kumard4d6eb72018-12-04 20:30:37 +053011290 vht_cap_info = &mac_ctx->mlme_cfg->vht_caps.vht_cap_info;
Kiran Kumar Lokeref3044852018-06-27 14:14:24 -070011291 mac_ctx->usr_cfg_tx_bfee_nsts = usr_cfg_val;
11292 if (usr_cfg_val)
11293 nsts_set_val = usr_cfg_val;
11294 else
11295 nsts_set_val = nsts_val;
Dustin Brown48f27fe2018-10-09 12:47:57 -070011296
Abhinav Kumard4d6eb72018-12-04 20:30:37 +053011297 vht_cap_info->tx_bfee_ant_supp = nsts_set_val;
Kiran Kumar Lokeref3044852018-06-27 14:14:24 -070011298
Kiran Kumar Lokere86e85592018-07-18 15:34:24 -070011299 if (usr_cfg_val)
11300 sme_set_he_tx_bf_cbf_rates(session_id);
11301
Jeff Johnsonc7309062018-11-09 20:59:42 -080011302 return sme_update_he_tx_bfee_nsts(mac_handle, session_id, nsts_set_val);
Kiran Kumar Lokeref3044852018-06-27 14:14:24 -070011303}
Kiran Kumar Lokere44a29432018-01-24 16:10:30 -080011304#ifdef WLAN_FEATURE_11AX
Jinwei Chenffaa4672018-08-30 16:55:09 +080011305void sme_update_tgt_he_cap(mac_handle_t mac_handle,
11306 struct wma_tgt_cfg *cfg,
11307 tDot11fIEhe_cap *he_cap_ini)
Jinwei Chen998a1a02018-06-20 17:20:34 +080011308{
Jeff Johnson0a8786a2018-12-02 10:49:01 -080011309 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Jinwei Chen998a1a02018-06-20 17:20:34 +080011310
11311 qdf_mem_copy(&mac_ctx->he_cap_2g,
Jinwei Chenef742dc2018-06-27 12:57:50 +080011312 &cfg->he_cap_2g,
11313 sizeof(tDot11fIEhe_cap));
Jinwei Chen998a1a02018-06-20 17:20:34 +080011314
11315 qdf_mem_copy(&mac_ctx->he_cap_5g,
Jinwei Chenef742dc2018-06-27 12:57:50 +080011316 &cfg->he_cap_5g,
11317 sizeof(tDot11fIEhe_cap));
Jinwei Chenffaa4672018-08-30 16:55:09 +080011318
11319 /* modify HE Caps field according to INI setting */
11320 mac_ctx->he_cap_2g.bfee_sts_lt_80 =
11321 QDF_MIN(cfg->he_cap_2g.bfee_sts_lt_80,
11322 he_cap_ini->bfee_sts_lt_80);
11323
11324 mac_ctx->he_cap_5g.bfee_sts_lt_80 =
11325 QDF_MIN(cfg->he_cap_5g.bfee_sts_lt_80,
11326 he_cap_ini->bfee_sts_lt_80);
Jinwei Chen998a1a02018-06-20 17:20:34 +080011327}
11328
Jeff Johnsonc7309062018-11-09 20:59:42 -080011329void sme_update_he_cap_nss(mac_handle_t mac_handle, uint8_t session_id,
11330 uint8_t nss)
Kiran Kumar Lokere44a29432018-01-24 16:10:30 -080011331{
Jeff Johnson0a8786a2018-12-02 10:49:01 -080011332 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Kiran Kumar Lokere44a29432018-01-24 16:10:30 -080011333 struct csr_roam_session *csr_session;
11334 uint32_t tx_mcs_map = 0;
11335 uint32_t rx_mcs_map = 0;
Kiran Kumar Lokere8dba1892018-07-24 17:09:52 -070011336 uint32_t mcs_map = 0;
Kiran Kumar Lokere44a29432018-01-24 16:10:30 -080011337
11338 if (!nss || (nss > 2)) {
11339 sme_err("invalid Nss value %d", nss);
11340 }
11341 csr_session = CSR_GET_SESSION(mac_ctx, session_id);
Kiran Kumar Lokere1ba55bf2019-06-03 14:18:40 -070011342 if (!csr_session) {
11343 sme_err("No session for id %d", session_id);
11344 return;
11345 }
Bala Venkatesh6d537092018-09-25 10:38:36 +053011346 rx_mcs_map =
11347 mac_ctx->mlme_cfg->he_caps.dot11_he_cap.rx_he_mcs_map_lt_80;
11348 tx_mcs_map =
11349 mac_ctx->mlme_cfg->he_caps.dot11_he_cap.tx_he_mcs_map_lt_80;
Kiran Kumar Lokere8dba1892018-07-24 17:09:52 -070011350 mcs_map = rx_mcs_map & 0x3;
Bala Venkatesh6d537092018-09-25 10:38:36 +053011351
Kiran Kumar Lokere44a29432018-01-24 16:10:30 -080011352 if (nss == 1) {
11353 tx_mcs_map = HE_SET_MCS_4_NSS(tx_mcs_map, HE_MCS_DISABLE, 2);
11354 rx_mcs_map = HE_SET_MCS_4_NSS(rx_mcs_map, HE_MCS_DISABLE, 2);
11355 } else {
Kiran Kumar Lokere8dba1892018-07-24 17:09:52 -070011356 tx_mcs_map = HE_SET_MCS_4_NSS(tx_mcs_map, mcs_map, 2);
11357 rx_mcs_map = HE_SET_MCS_4_NSS(rx_mcs_map, mcs_map, 2);
Kiran Kumar Lokere44a29432018-01-24 16:10:30 -080011358 }
11359 sme_info("new HE Nss MCS MAP: Rx 0x%0X, Tx: 0x%0X",
11360 rx_mcs_map, tx_mcs_map);
Bala Venkatesh6d537092018-09-25 10:38:36 +053011361 if (cfg_in_range(CFG_HE_RX_MCS_MAP_LT_80, rx_mcs_map))
11362 mac_ctx->mlme_cfg->he_caps.dot11_he_cap.rx_he_mcs_map_lt_80 =
11363 rx_mcs_map;
11364 if (cfg_in_range(CFG_HE_TX_MCS_MAP_LT_80, tx_mcs_map))
11365 mac_ctx->mlme_cfg->he_caps.dot11_he_cap.tx_he_mcs_map_lt_80 =
11366 tx_mcs_map;
Kiran Kumar Lokere44a29432018-01-24 16:10:30 -080011367 csr_update_session_he_cap(mac_ctx, csr_session);
11368
11369}
Kiran Kumar Lokere96246e52018-01-24 16:44:35 -080011370
Jeff Johnsonc7309062018-11-09 20:59:42 -080011371int sme_update_he_mcs(mac_handle_t mac_handle, uint8_t session_id,
11372 uint16_t he_mcs)
Kiran Kumar Lokere96246e52018-01-24 16:44:35 -080011373{
Jeff Johnson0a8786a2018-12-02 10:49:01 -080011374 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Kiran Kumar Lokere96246e52018-01-24 16:44:35 -080011375 struct csr_roam_session *csr_session;
11376 uint16_t mcs_val = 0;
11377 uint16_t mcs_map = HE_MCS_ALL_DISABLED;
Kiran Kumar Lokere96246e52018-01-24 16:44:35 -080011378
11379 csr_session = CSR_GET_SESSION(mac_ctx, session_id);
11380 if (!csr_session) {
11381 sme_err("No session for id %d", session_id);
11382 return -EINVAL;
11383 }
11384 if ((he_mcs & 0x3) == HE_MCS_DISABLE) {
11385 sme_err("Invalid HE MCS 0x%0x, can't disable 0-7 for 1ss",
11386 he_mcs);
11387 return -EINVAL;
11388 }
11389 mcs_val = he_mcs & 0x3;
11390 switch (he_mcs) {
11391 case HE_80_MCS0_7:
11392 case HE_80_MCS0_9:
11393 case HE_80_MCS0_11:
Abhinav Kumarb074f2f2018-09-15 15:32:11 +053011394 if (mac_ctx->mlme_cfg->vht_caps.vht_cap_info.enable2x2) {
Kiran Kumar Lokere96246e52018-01-24 16:44:35 -080011395 mcs_map = HE_SET_MCS_4_NSS(mcs_map, mcs_val, 1);
11396 mcs_map = HE_SET_MCS_4_NSS(mcs_map, mcs_val, 2);
11397 } else {
11398 mcs_map = HE_SET_MCS_4_NSS(mcs_map, mcs_val, 1);
11399 }
Bala Venkatesh6d537092018-09-25 10:38:36 +053011400 if (cfg_in_range(CFG_HE_TX_MCS_MAP_LT_80, mcs_map))
11401 mac_ctx->mlme_cfg->he_caps.dot11_he_cap.
11402 tx_he_mcs_map_lt_80 = mcs_map;
11403 if (cfg_in_range(CFG_HE_RX_MCS_MAP_LT_80, mcs_map))
11404 mac_ctx->mlme_cfg->he_caps.dot11_he_cap.
11405 rx_he_mcs_map_lt_80 = mcs_map;
Kiran Kumar Lokere96246e52018-01-24 16:44:35 -080011406 break;
11407
11408 case HE_160_MCS0_7:
11409 case HE_160_MCS0_9:
11410 case HE_160_MCS0_11:
11411 mcs_map = HE_SET_MCS_4_NSS(mcs_map, mcs_val, 1);
Bala Venkatesh6d537092018-09-25 10:38:36 +053011412 if (cfg_in_range(CFG_HE_TX_MCS_MAP_160, mcs_map))
11413 qdf_mem_copy(mac_ctx->mlme_cfg->he_caps.dot11_he_cap.
11414 tx_he_mcs_map_160, &mcs_map,
11415 sizeof(uint16_t));
11416 if (cfg_in_range(CFG_HE_RX_MCS_MAP_160, mcs_map))
11417 qdf_mem_copy(mac_ctx->mlme_cfg->he_caps.dot11_he_cap.
11418 rx_he_mcs_map_160, &mcs_map,
11419 sizeof(uint16_t));
Kiran Kumar Lokere96246e52018-01-24 16:44:35 -080011420 break;
11421
11422 case HE_80p80_MCS0_7:
11423 case HE_80p80_MCS0_9:
11424 case HE_80p80_MCS0_11:
11425 mcs_map = HE_SET_MCS_4_NSS(mcs_map, mcs_val, 1);
Bala Venkatesh6d537092018-09-25 10:38:36 +053011426 if (cfg_in_range(CFG_HE_TX_MCS_MAP_80_80, mcs_map))
11427 qdf_mem_copy(mac_ctx->mlme_cfg->he_caps.dot11_he_cap.
11428 tx_he_mcs_map_80_80, &mcs_map,
11429 sizeof(uint16_t));
11430 if (cfg_in_range(CFG_HE_RX_MCS_MAP_80_80, mcs_map))
11431 qdf_mem_copy(mac_ctx->mlme_cfg->he_caps.dot11_he_cap.
11432 rx_he_mcs_map_80_80, &mcs_map,
11433 sizeof(uint16_t));
Kiran Kumar Lokere96246e52018-01-24 16:44:35 -080011434 break;
11435
11436 default:
11437 sme_err("Invalid HE MCS 0x%0x", he_mcs);
11438 return -EINVAL;
11439 }
11440 sme_info("new HE MCS 0x%0x", mcs_map);
Kiran Kumar Lokere96246e52018-01-24 16:44:35 -080011441 csr_update_session_he_cap(mac_ctx, csr_session);
11442
11443 return 0;
11444}
Kiran Kumar Lokere13dedac2018-02-05 19:51:59 -080011445
Jeff Johnsonc7309062018-11-09 20:59:42 -080011446void sme_set_usr_cfg_mu_edca(mac_handle_t mac_handle, bool val)
Kiran Kumar Lokeref54b8552018-07-10 00:53:38 -070011447{
Jeff Johnson0a8786a2018-12-02 10:49:01 -080011448 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Kiran Kumar Lokeref54b8552018-07-10 00:53:38 -070011449
11450 mac_ctx->usr_cfg_mu_edca_params = val;
11451}
11452
Jeff Johnsonc7309062018-11-09 20:59:42 -080011453int sme_update_mu_edca_params(mac_handle_t mac_handle, uint8_t session_id)
Kiran Kumar Lokerefba20632018-07-05 16:51:27 -070011454{
11455 struct scheduler_msg msg = {0};
11456 QDF_STATUS status;
11457
11458 qdf_mem_zero(&msg, sizeof(msg));
11459 msg.type = WNI_SME_UPDATE_MU_EDCA_PARAMS;
11460 msg.reserved = 0;
11461 msg.bodyval = session_id;
gaurank kathpalia36b0c582018-08-28 17:45:43 +053011462 status = scheduler_post_message(QDF_MODULE_ID_SME,
11463 QDF_MODULE_ID_PE,
11464 QDF_MODULE_ID_PE, &msg);
Kiran Kumar Lokerefba20632018-07-05 16:51:27 -070011465 if (status != QDF_STATUS_SUCCESS) {
11466 sme_err("Not able to post update edca profile");
11467 return -EIO;
11468 }
11469
11470 return 0;
11471}
Jeff Johnsonc7309062018-11-09 20:59:42 -080011472
11473void sme_set_he_mu_edca_def_cfg(mac_handle_t mac_handle)
Kiran Kumar Lokerefba20632018-07-05 16:51:27 -070011474{
Jeff Johnson0a8786a2018-12-02 10:49:01 -080011475 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Kiran Kumar Lokerefba20632018-07-05 16:51:27 -070011476 uint8_t i;
11477
Kiran Kumar Lokere8dba1892018-07-24 17:09:52 -070011478 sme_debug("Set MU EDCA params to default");
Srinivas Girigowda5b86fbd2019-03-21 14:54:14 -070011479 for (i = 0; i < QCA_WLAN_AC_ALL; i++) {
Kiran Kumar Lokerefba20632018-07-05 16:51:27 -070011480 mac_ctx->usr_mu_edca_params[i].aci.aifsn = MU_EDCA_DEF_AIFSN;
11481 mac_ctx->usr_mu_edca_params[i].aci.aci = i;
11482 mac_ctx->usr_mu_edca_params[i].cw.max = MU_EDCA_DEF_CW_MAX;
11483 mac_ctx->usr_mu_edca_params[i].cw.min = MU_EDCA_DEF_CW_MIN;
11484 mac_ctx->usr_mu_edca_params[i].mu_edca_timer =
11485 MU_EDCA_DEF_TIMER;
11486 }
11487}
11488
Jeff Johnsonc7309062018-11-09 20:59:42 -080011489int sme_update_he_tx_bfee_supp(mac_handle_t mac_handle, uint8_t session_id,
Kiran Kumar Lokere6c7f3fa2018-05-14 18:12:27 -070011490 uint8_t cfg_val)
11491{
Jeff Johnson0a8786a2018-12-02 10:49:01 -080011492 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Bala Venkatesh6d537092018-09-25 10:38:36 +053011493 struct csr_roam_session *session;
11494
11495 session = CSR_GET_SESSION(mac_ctx, session_id);
11496
11497 if (!session) {
11498 sme_err("No session for id %d", session_id);
11499 return -EINVAL;
11500 }
11501 if (cfg_val <= 1)
11502 mac_ctx->mlme_cfg->he_caps.dot11_he_cap.su_beamformee = cfg_val;
11503 else
11504 return -EINVAL;
11505
11506 csr_update_session_he_cap(mac_ctx, session);
11507 return 0;
Kiran Kumar Lokere6c7f3fa2018-05-14 18:12:27 -070011508}
11509
Jeff Johnsonc7309062018-11-09 20:59:42 -080011510int sme_update_he_trigger_frm_mac_pad(mac_handle_t mac_handle,
11511 uint8_t session_id,
Kiran Kumar Lokeref54b8552018-07-10 00:53:38 -070011512 uint8_t cfg_val)
11513{
Jeff Johnson0a8786a2018-12-02 10:49:01 -080011514 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Bala Venkatesh6d537092018-09-25 10:38:36 +053011515 struct csr_roam_session *session;
11516
11517 session = CSR_GET_SESSION(mac_ctx, session_id);
11518
11519 if (!session) {
11520 sme_err("No session for id %d", session_id);
11521 return -EINVAL;
11522 }
11523 if (cfg_in_range(CFG_HE_TRIG_PAD, cfg_val))
11524 mac_ctx->mlme_cfg->he_caps.dot11_he_cap.trigger_frm_mac_pad =
11525 cfg_val;
11526 else
11527 return -EINVAL;
11528
11529 csr_update_session_he_cap(mac_ctx, session);
11530 return 0;
11531
Kiran Kumar Lokeref54b8552018-07-10 00:53:38 -070011532}
11533
Jeff Johnsonc7309062018-11-09 20:59:42 -080011534int sme_update_he_om_ctrl_supp(mac_handle_t mac_handle, uint8_t session_id,
Kiran Kumar Lokeref1a96f42018-08-29 18:53:47 -070011535 uint8_t cfg_val)
11536{
Bala Venkatesh2fae18a2018-11-14 12:32:45 +053011537
Jeff Johnson0a8786a2018-12-02 10:49:01 -080011538 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Bala Venkatesh2fae18a2018-11-14 12:32:45 +053011539 struct csr_roam_session *session;
11540
11541 session = CSR_GET_SESSION(mac_ctx, session_id);
11542
11543 if (!session) {
11544 sme_err("No session for id %d", session_id);
11545 return -EINVAL;
11546 }
Harprit Chhabada89780bf2019-03-06 14:01:38 -080011547 mac_ctx->mlme_cfg->he_caps.dot11_he_cap.omi_a_ctrl = cfg_val;
Bala Venkatesh2fae18a2018-11-14 12:32:45 +053011548
11549 csr_update_session_he_cap(mac_ctx, session);
11550 return 0;
Kiran Kumar Lokeref1a96f42018-08-29 18:53:47 -070011551}
11552
Kiran Kumar Lokereacd107d2019-01-09 15:02:11 -080011553int sme_update_he_htc_he_supp(mac_handle_t mac_handle, uint8_t session_id,
11554 bool cfg_val)
Kiran Kumar Lokere94634152018-09-24 19:08:35 -070011555{
Kiran Kumar Lokereacd107d2019-01-09 15:02:11 -080011556
Jeff Johnson0a8786a2018-12-02 10:49:01 -080011557 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Kiran Kumar Lokereacd107d2019-01-09 15:02:11 -080011558 struct csr_roam_session *session;
11559
11560 session = CSR_GET_SESSION(mac_ctx, session_id);
Kiran Kumar Lokere94634152018-09-24 19:08:35 -070011561
11562 if (!session) {
Kiran Kumar Lokereacd107d2019-01-09 15:02:11 -080011563 sme_err("No session for id %d", session_id);
Kiran Kumar Lokere94634152018-09-24 19:08:35 -070011564 return -EINVAL;
11565 }
Kiran Kumar Lokereacd107d2019-01-09 15:02:11 -080011566
11567 mac_ctx->mlme_cfg->he_caps.dot11_he_cap.htc_he = cfg_val;
11568 csr_update_session_he_cap(mac_ctx, session);
11569
11570 return 0;
11571}
11572
11573static QDF_STATUS
11574sme_validate_session_for_cap_update(struct mac_context *mac_ctx,
11575 uint8_t session_id,
11576 struct csr_roam_session *session)
11577{
11578 if (!session) {
11579 sme_err("Session does not exist, Session_id: %d", session_id);
11580 return QDF_STATUS_E_INVAL;
11581 }
Kiran Kumar Lokere94634152018-09-24 19:08:35 -070011582 if (!csr_is_conn_state_connected_infra(mac_ctx, session_id)) {
11583 sme_info("STA is not connected, Session_id: %d", session_id);
Kiran Kumar Lokereacd107d2019-01-09 15:02:11 -080011584 return QDF_STATUS_E_INVAL;
11585 }
11586
11587 return QDF_STATUS_SUCCESS;
11588}
11589
11590int sme_send_he_om_ctrl_update(mac_handle_t mac_handle, uint8_t session_id)
11591{
11592 QDF_STATUS status = QDF_STATUS_SUCCESS;
11593 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
11594 struct omi_ctrl_tx omi_data = {0};
11595 void *wma_handle;
11596 struct csr_roam_session *session = CSR_GET_SESSION(mac_ctx, session_id);
11597 uint32_t param_val = 0;
11598
11599 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
11600 if (!wma_handle) {
11601 sme_err("wma handle is NULL");
11602 return -EIO;
11603 }
11604
11605 status = sme_validate_session_for_cap_update(mac_ctx, session_id,
11606 session);
11607 if (QDF_IS_STATUS_ERROR(status))
Kiran Kumar Lokere94634152018-09-24 19:08:35 -070011608 return -EINVAL;
Kiran Kumar Lokereacd107d2019-01-09 15:02:11 -080011609
11610 omi_data.a_ctrl_id = A_CTRL_ID_OMI;
11611
11612 if (mac_ctx->he_om_ctrl_cfg_nss_set)
11613 omi_data.rx_nss = mac_ctx->he_om_ctrl_cfg_nss;
11614 else
11615 omi_data.rx_nss = session->nss - 1;
11616
11617 if (mac_ctx->he_om_ctrl_cfg_tx_nsts_set)
11618 omi_data.tx_nsts = mac_ctx->he_om_ctrl_cfg_tx_nsts;
11619 else
11620 omi_data.tx_nsts = session->nss - 1;
11621
11622 if (mac_ctx->he_om_ctrl_cfg_bw_set)
11623 omi_data.ch_bw = mac_ctx->he_om_ctrl_cfg_bw;
11624 else
11625 omi_data.ch_bw = session->connectedProfile.vht_channel_width;
11626
11627 omi_data.ul_mu_dis = mac_ctx->he_om_ctrl_cfg_ul_mu_dis;
Kiran Kumar Lokere49e3aff2019-02-06 17:00:48 -080011628 omi_data.ul_mu_data_dis = mac_ctx->he_om_ctrl_ul_mu_data_dis;
Kiran Kumar Lokereacd107d2019-01-09 15:02:11 -080011629 omi_data.omi_in_vht = 0x1;
11630 omi_data.omi_in_he = 0x1;
11631
11632 sme_info("OMI: BW %d TxNSTS %d RxNSS %d ULMU %d, OMI_VHT %d, OMI_HE %d",
11633 omi_data.ch_bw, omi_data.tx_nsts, omi_data.rx_nss,
11634 omi_data.ul_mu_dis, omi_data.omi_in_vht, omi_data.omi_in_he);
11635 qdf_mem_copy(&param_val, &omi_data, sizeof(omi_data));
Srinivas Girigowdacb7b8b82019-04-10 14:27:47 -070011636 sme_debug("param val %08X, bssid:"QDF_MAC_ADDR_STR, param_val,
Srinivas Girigowda34fbba02019-04-08 12:07:44 -070011637 QDF_MAC_ADDR_ARRAY(session->connectedProfile.bssid.bytes));
Kiran Kumar Lokereacd107d2019-01-09 15:02:11 -080011638 status = wma_set_peer_param(wma_handle,
11639 session->connectedProfile.bssid.bytes,
11640 WMI_PEER_PARAM_XMIT_OMI,
11641 param_val, session_id);
Kiran Kumar Lokere94634152018-09-24 19:08:35 -070011642 if (QDF_STATUS_SUCCESS != status) {
Kiran Kumar Lokereacd107d2019-01-09 15:02:11 -080011643 sme_err("set_peer_param_cmd returned %d", status);
Kiran Kumar Lokere94634152018-09-24 19:08:35 -070011644 return -EIO;
11645 }
11646
11647 return 0;
11648}
11649
Kiran Kumar Lokereacd107d2019-01-09 15:02:11 -080011650int sme_set_he_om_ctrl_param(mac_handle_t mac_handle, uint8_t session_id,
11651 enum qca_wlan_vendor_attr_he_omi_tx param,
11652 uint8_t cfg_val)
Kiran Kumar Lokere94634152018-09-24 19:08:35 -070011653{
Kiran Kumar Lokere94634152018-09-24 19:08:35 -070011654 QDF_STATUS status;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080011655 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Kiran Kumar Lokere94634152018-09-24 19:08:35 -070011656 struct csr_roam_session *session = CSR_GET_SESSION(mac_ctx, session_id);
11657
Kiran Kumar Lokereacd107d2019-01-09 15:02:11 -080011658 status = sme_validate_session_for_cap_update(mac_ctx, session_id,
11659 session);
11660 if (QDF_IS_STATUS_ERROR(status))
Kiran Kumar Lokere94634152018-09-24 19:08:35 -070011661 return -EINVAL;
Kiran Kumar Lokere94634152018-09-24 19:08:35 -070011662
Kiran Kumar Lokereacd107d2019-01-09 15:02:11 -080011663 switch(param) {
11664 case QCA_WLAN_VENDOR_ATTR_HE_OMI_ULMU_DISABLE:
11665 sme_debug("Set OM ctrl UL MU dis to %d", cfg_val);
11666 mac_ctx->he_om_ctrl_cfg_ul_mu_dis = cfg_val;
11667 break;
11668 case QCA_WLAN_VENDOR_ATTR_HE_OMI_RX_NSS:
11669 if ((cfg_val + 1) > session->nss) {
11670 sme_debug("OMI Nss %d is > connected Nss %d",
11671 cfg_val, session->nss);
11672 mac_ctx->he_om_ctrl_cfg_nss_set = false;
11673 return 0;
11674 }
11675 sme_debug("Set OM ctrl Rx Nss cfg to %d", cfg_val);
11676 mac_ctx->he_om_ctrl_cfg_nss_set = true;
11677 mac_ctx->he_om_ctrl_cfg_nss = cfg_val;
11678 break;
11679 case QCA_WLAN_VENDOR_ATTR_HE_OMI_CH_BW:
11680 if (cfg_val >
11681 session->connectedProfile.vht_channel_width) {
11682 sme_info("OMI BW %d is > connected BW %d",
11683 cfg_val,
11684 session->connectedProfile.
11685 vht_channel_width);
11686 mac_ctx->he_om_ctrl_cfg_bw_set = false;
11687 return 0;
11688 }
11689 sme_debug("Set OM ctrl BW cfg to %d", cfg_val);
11690 mac_ctx->he_om_ctrl_cfg_bw_set = true;
11691 mac_ctx->he_om_ctrl_cfg_bw = cfg_val;
11692 break;
11693 case QCA_WLAN_VENDOR_ATTR_HE_OMI_TX_NSTS:
11694 if ((cfg_val + 1) > session->nss) {
11695 sme_debug("OMI NSTS %d is > connected Nss %d",
11696 cfg_val, session->nss);
11697 mac_ctx->he_om_ctrl_cfg_tx_nsts_set = false;
11698 return 0;
11699 }
11700 sme_debug("Set OM ctrl tx nsts cfg to %d", cfg_val);
11701 mac_ctx->he_om_ctrl_cfg_tx_nsts_set = true;
11702 mac_ctx->he_om_ctrl_cfg_tx_nsts = cfg_val;
11703 break;
Kiran Kumar Lokere49e3aff2019-02-06 17:00:48 -080011704 case QCA_WLAN_VENDOR_ATTR_HE_OMI_ULMU_DATA_DISABLE:
11705 sme_debug("Set OM ctrl UL MU data dis to %d", cfg_val);
11706 mac_ctx->he_om_ctrl_ul_mu_data_dis = cfg_val;
11707 break;
Kiran Kumar Lokereacd107d2019-01-09 15:02:11 -080011708 default:
11709 sme_debug("Invalid OMI param %d", param);
11710 return -EINVAL;
Kiran Kumar Lokere94634152018-09-24 19:08:35 -070011711 }
11712
11713 return 0;
11714}
11715
Jeff Johnsonc7309062018-11-09 20:59:42 -080011716void sme_reset_he_om_ctrl(mac_handle_t mac_handle)
Kiran Kumar Lokere94634152018-09-24 19:08:35 -070011717{
Jeff Johnson0a8786a2018-12-02 10:49:01 -080011718 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Kiran Kumar Lokere94634152018-09-24 19:08:35 -070011719
11720 mac_ctx->he_om_ctrl_cfg_bw_set = false;
11721 mac_ctx->he_om_ctrl_cfg_nss_set = false;
11722 mac_ctx->he_om_ctrl_cfg_bw = 0;
11723 mac_ctx->he_om_ctrl_cfg_nss = 0;
Kiran Kumar Lokereacd107d2019-01-09 15:02:11 -080011724 mac_ctx->he_om_ctrl_cfg_ul_mu_dis = false;
11725 mac_ctx->he_om_ctrl_cfg_tx_nsts_set = false;
11726 mac_ctx->he_om_ctrl_cfg_tx_nsts = 0;
Kiran Kumar Lokere49e3aff2019-02-06 17:00:48 -080011727 mac_ctx->he_om_ctrl_ul_mu_data_dis = false;
Kiran Kumar Lokere94634152018-09-24 19:08:35 -070011728}
11729
Kiran Kumar Lokereee205772018-09-27 00:27:27 -070011730int sme_config_action_tx_in_tb_ppdu(mac_handle_t mac_handle, uint8_t session_id,
11731 uint8_t cfg_val)
11732{
11733 QDF_STATUS status;
11734 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
11735 struct scheduler_msg msg = {0};
11736 struct sir_cfg_action_frm_tb_ppdu *cfg_msg;
11737
11738 if (!csr_is_conn_state_connected_infra(mac_ctx, session_id)) {
11739 sme_info("STA not in connected state Session_id: %d",
11740 session_id);
11741 return -EINVAL;
11742 }
11743
11744 cfg_msg = qdf_mem_malloc(sizeof(*cfg_msg));
11745
11746 if (!cfg_msg)
11747 return -EIO;
11748
11749 cfg_msg->type = WNI_SME_CFG_ACTION_FRM_HE_TB_PPDU;
Abhishek Singhefe21e62019-09-20 10:03:24 +053011750 cfg_msg->vdev_id = session_id;
Kiran Kumar Lokereee205772018-09-27 00:27:27 -070011751 cfg_msg->cfg = cfg_val;
11752
11753 msg.bodyptr = cfg_msg;
11754 msg.type = WNI_SME_CFG_ACTION_FRM_HE_TB_PPDU;
11755 status = scheduler_post_message(QDF_MODULE_ID_SME, QDF_MODULE_ID_PE,
11756 QDF_MODULE_ID_PE, &msg);
11757 if (QDF_STATUS_SUCCESS != status) {
11758 sme_err("Failed to send CFG_ACTION_FRAME_IN_TB_PPDU to PE %d",
11759 status);
11760 qdf_mem_free(cfg_msg);
11761 return -EIO;
11762 }
11763
11764 return 0;
11765}
11766
Jeff Johnsonc7309062018-11-09 20:59:42 -080011767int sme_update_he_tx_bfee_nsts(mac_handle_t mac_handle, uint8_t session_id,
Kiran Kumar Lokeref3044852018-06-27 14:14:24 -070011768 uint8_t cfg_val)
11769{
Jeff Johnson0a8786a2018-12-02 10:49:01 -080011770 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Bala Venkatesh6d537092018-09-25 10:38:36 +053011771 struct csr_roam_session *session;
11772
11773 session = CSR_GET_SESSION(mac_ctx, session_id);
11774
11775 if (!session) {
11776 sme_err("No session for id %d", session_id);
11777 return -EINVAL;
11778 }
11779 if (cfg_in_range(CFG_HE_BFEE_STS_LT80, cfg_val))
11780 mac_ctx->mlme_cfg->he_caps.dot11_he_cap.bfee_sts_lt_80 =
11781 cfg_val;
11782 else
11783 return -EINVAL;
11784
11785 csr_update_session_he_cap(mac_ctx, session);
11786 return 0;
Kiran Kumar Lokeref3044852018-06-27 14:14:24 -070011787}
11788
Kiran Kumar Lokere86e85592018-07-18 15:34:24 -070011789void sme_set_he_tx_bf_cbf_rates(uint8_t session_id)
11790{
11791 uint32_t tx_bf_cbf_rates_5g[] = {91, 1, 0, 3, 2, 4, 0};
11792 uint32_t tx_bf_cbf_rates_2g[] = {91, 1, 1, 3, 1, 3, 0};
11793 QDF_STATUS status;
11794
11795 status = wma_form_unit_test_cmd_and_send(session_id, 0x48, 7,
11796 tx_bf_cbf_rates_5g);
11797 if (QDF_STATUS_SUCCESS != status)
11798 sme_err("send_unit_test_cmd returned %d", status);
11799
11800 status = wma_form_unit_test_cmd_and_send(session_id, 0x48, 7,
11801 tx_bf_cbf_rates_2g);
11802 if (QDF_STATUS_SUCCESS != status)
11803 sme_err("send_unit_test_cmd returned %d", status);
11804}
11805
Kiran Kumar Lokereefdbd0b2018-09-25 18:53:46 -070011806void sme_config_su_ppdu_queue(uint8_t session_id, bool enable)
11807{
11808 uint32_t su_ppdu_enable[] = {69, 1, 1, 1};
11809 uint32_t su_ppdu_disable[] = {69, 1, 1, 0};
11810 QDF_STATUS status;
11811
11812 if (enable) {
11813 sme_debug("Send Tx SU PPDU queue ENABLE cmd to FW");
11814 status = wma_form_unit_test_cmd_and_send(session_id, 0x48, 4,
11815 su_ppdu_enable);
11816 } else {
11817 sme_debug("Send Tx SU PPDU queue DISABLE cmd to FW");
11818 status = wma_form_unit_test_cmd_and_send(session_id, 0x48, 4,
11819 su_ppdu_disable);
11820 }
11821 if (QDF_STATUS_SUCCESS != status)
11822 sme_err("send_unit_test_cmd returned %d", status);
11823}
11824
Jeff Johnsonc7309062018-11-09 20:59:42 -080011825int sme_update_he_tx_stbc_cap(mac_handle_t mac_handle, uint8_t session_id,
11826 int value)
Kiran Kumar Lokere13dedac2018-02-05 19:51:59 -080011827{
Jeff Johnson0a8786a2018-12-02 10:49:01 -080011828 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Bala Venkatesh6d537092018-09-25 10:38:36 +053011829 struct csr_roam_session *session;
Kiran Kumar Lokere5cc2f0d2018-02-08 17:10:05 -080011830 uint32_t he_cap_val = 0;
11831
11832 he_cap_val = value ? 1 : 0;
Bala Venkatesh6d537092018-09-25 10:38:36 +053011833 session = CSR_GET_SESSION(mac_ctx, session_id);
Kiran Kumar Lokere13dedac2018-02-05 19:51:59 -080011834
Bala Venkatesh6d537092018-09-25 10:38:36 +053011835 if (!session) {
11836 sme_err("No session for id %d", session_id);
11837 return -EINVAL;
11838 }
11839 if (he_cap_val <= 1)
Kiran Kumar Lokere9cab5252019-02-04 14:38:08 -080011840 mac_ctx->mlme_cfg->he_caps.dot11_he_cap.tb_ppdu_tx_stbc_lt_80mhz
11841 = he_cap_val;
Bala Venkatesh6d537092018-09-25 10:38:36 +053011842 else
11843 return -EINVAL;
11844 if (he_cap_val <= 1)
Kiran Kumar Lokere9cab5252019-02-04 14:38:08 -080011845 mac_ctx->mlme_cfg->he_caps.dot11_he_cap.tb_ppdu_tx_stbc_gt_80mhz
11846 = he_cap_val;
Bala Venkatesh6d537092018-09-25 10:38:36 +053011847 else
11848 return -EINVAL;
11849 csr_update_session_he_cap(mac_ctx, session);
11850 return 0;
Kiran Kumar Lokere13dedac2018-02-05 19:51:59 -080011851}
11852
Jeff Johnsonc7309062018-11-09 20:59:42 -080011853int sme_update_he_rx_stbc_cap(mac_handle_t mac_handle, uint8_t session_id,
11854 int value)
Kiran Kumar Lokere13dedac2018-02-05 19:51:59 -080011855{
Jeff Johnson0a8786a2018-12-02 10:49:01 -080011856 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Bala Venkatesh6d537092018-09-25 10:38:36 +053011857 struct csr_roam_session *session;
Kiran Kumar Lokere5cc2f0d2018-02-08 17:10:05 -080011858 uint32_t he_cap_val = 0;
11859
11860 he_cap_val = value ? 1 : 0;
Bala Venkatesh6d537092018-09-25 10:38:36 +053011861 session = CSR_GET_SESSION(mac_ctx, session_id);
Kiran Kumar Lokere13dedac2018-02-05 19:51:59 -080011862
Bala Venkatesh6d537092018-09-25 10:38:36 +053011863 if (!session) {
11864 sme_err("No session for id %d", session_id);
11865 return -EINVAL;
11866 }
11867 if (he_cap_val <= 1)
11868 mac_ctx->mlme_cfg->he_caps.dot11_he_cap.rx_stbc_lt_80mhz =
11869 he_cap_val;
11870 else
11871 return -EINVAL;
11872 if (he_cap_val <= 1)
11873 mac_ctx->mlme_cfg->he_caps.dot11_he_cap.rx_stbc_gt_80mhz =
11874 he_cap_val;
11875 else
11876 return -EINVAL;
11877 csr_update_session_he_cap(mac_ctx, session);
11878 return 0;
Kiran Kumar Lokere5cc2f0d2018-02-08 17:10:05 -080011879}
11880
Jeff Johnsonc7309062018-11-09 20:59:42 -080011881int sme_update_he_frag_supp(mac_handle_t mac_handle, uint8_t session_id,
11882 uint16_t he_frag)
Kiran Kumar Lokere5cc2f0d2018-02-08 17:10:05 -080011883{
Jeff Johnson0a8786a2018-12-02 10:49:01 -080011884 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Bala Venkatesh6d537092018-09-25 10:38:36 +053011885 struct csr_roam_session *session;
11886
11887 session = CSR_GET_SESSION(mac_ctx, session_id);
11888
11889 if (!session) {
11890 sme_err("No session for id %d", session_id);
11891 return -EINVAL;
11892 }
11893 if (cfg_in_range(CFG_HE_FRAGMENTATION, he_frag))
11894 mac_ctx->mlme_cfg->he_caps.dot11_he_cap.fragmentation = he_frag;
11895 else
11896 return -EINVAL;
11897
11898 csr_update_session_he_cap(mac_ctx, session);
11899 return 0;
11900
Kiran Kumar Lokere13dedac2018-02-05 19:51:59 -080011901}
Kiran Kumar Lokeree43a4582018-05-08 19:54:03 -070011902
Jeff Johnsonc7309062018-11-09 20:59:42 -080011903int sme_update_he_ldpc_supp(mac_handle_t mac_handle, uint8_t session_id,
Kiran Kumar Lokeree43a4582018-05-08 19:54:03 -070011904 uint16_t he_ldpc)
11905{
Jeff Johnson0a8786a2018-12-02 10:49:01 -080011906 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Bala Venkatesh6d537092018-09-25 10:38:36 +053011907 struct csr_roam_session *session;
11908
11909 session = CSR_GET_SESSION(mac_ctx, session_id);
11910
11911 if (!session) {
11912 sme_err("No session for id %d", session_id);
11913 return -EINVAL;
11914 }
11915 if (he_ldpc <= 1)
11916 mac_ctx->mlme_cfg->he_caps.dot11_he_cap.ldpc_coding = he_ldpc;
11917 else
11918 return -EINVAL;
11919
11920 csr_update_session_he_cap(mac_ctx, session);
11921 return 0;
11922
Kiran Kumar Lokeree43a4582018-05-08 19:54:03 -070011923}
Arif Hussain1f58cbb2019-03-14 17:06:56 -070011924
11925int sme_update_he_twt_req_support(mac_handle_t mac_handle, uint8_t session_id,
11926 uint8_t cfg_val)
11927{
11928 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
11929 struct csr_roam_session *session;
11930
11931 session = CSR_GET_SESSION(mac_ctx, session_id);
11932
11933 if (!session) {
11934 sme_err("No session for id %d", session_id);
11935 return -EINVAL;
11936 }
11937 mac_ctx->mlme_cfg->he_caps.dot11_he_cap.twt_request = cfg_val;
11938
11939 csr_update_session_he_cap(mac_ctx, session);
11940
11941 return 0;
11942}
Kiran Kumar Lokere44a29432018-01-24 16:10:30 -080011943#endif
11944
Archana Ramachandran5041b252016-04-25 14:29:25 -070011945/**
Anurag Chouhan3920c0f2017-09-11 17:10:56 +053011946 * sme_set_nud_debug_stats_cb() - set nud debug stats callback
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -080011947 * @mac_handle: Opaque handle to the global MAC context
Anurag Chouhan3920c0f2017-09-11 17:10:56 +053011948 * @cb: callback function pointer
Dundi Raviteja3bcf3a82018-05-22 13:24:18 +053011949 * @context: callback context
Anurag Chouhan3920c0f2017-09-11 17:10:56 +053011950 *
11951 * This function stores nud debug stats callback function.
11952 *
11953 * Return: QDF_STATUS enumeration.
11954 */
Jeff Johnsonc7309062018-11-09 20:59:42 -080011955QDF_STATUS sme_set_nud_debug_stats_cb(mac_handle_t mac_handle,
Dundi Raviteja3bcf3a82018-05-22 13:24:18 +053011956 void (*cb)(void *, struct rsp_stats *, void *),
11957 void *context)
Anurag Chouhan3920c0f2017-09-11 17:10:56 +053011958{
11959 QDF_STATUS status = QDF_STATUS_SUCCESS;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080011960 struct mac_context *mac;
Anurag Chouhan3920c0f2017-09-11 17:10:56 +053011961
Jeff Johnsonc7309062018-11-09 20:59:42 -080011962 if (!mac_handle) {
Anurag Chouhan3920c0f2017-09-11 17:10:56 +053011963 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Jeff Johnsonc7309062018-11-09 20:59:42 -080011964 FL("mac_handle is not valid"));
Anurag Chouhan3920c0f2017-09-11 17:10:56 +053011965 return QDF_STATUS_E_INVAL;
11966 }
Jeff Johnsona0619e42018-11-28 17:43:00 -080011967 mac = MAC_CONTEXT(mac_handle);
Anurag Chouhan3920c0f2017-09-11 17:10:56 +053011968
11969 status = sme_acquire_global_lock(&mac->sme);
11970 if (!QDF_IS_STATUS_SUCCESS(status)) {
11971 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
11972 FL("sme_acquire_global_lock failed!(status=%d)"),
11973 status);
11974 return status;
11975 }
11976
11977 mac->sme.get_arp_stats_cb = cb;
Dundi Raviteja3bcf3a82018-05-22 13:24:18 +053011978 mac->sme.get_arp_stats_context = context;
Anurag Chouhan3920c0f2017-09-11 17:10:56 +053011979 sme_release_global_lock(&mac->sme);
11980 return status;
11981}
11982
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011983/**
11984 * sme_is_any_session_in_connected_state() - SME wrapper API to
11985 * check if any session is in connected state or not.
11986 *
Jeff Johnsonc7309062018-11-09 20:59:42 -080011987 * @mac_handle: Handle returned by mac open
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011988 *
11989 * This function is used to check if any valid sme session is in
11990 * connected state or not.
11991 *
11992 * Return: true if any session is connected, else false.
11993 *
11994 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -080011995bool sme_is_any_session_in_connected_state(mac_handle_t mac_handle)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011996{
Jeff Johnson0a8786a2018-12-02 10:49:01 -080011997 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011998 QDF_STATUS status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011999 bool ret = false;
12000
12001 status = sme_acquire_global_lock(&mac_ctx->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012002 if (QDF_STATUS_SUCCESS == status) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012003 ret = csr_is_any_session_in_connect_state(mac_ctx);
12004 sme_release_global_lock(&mac_ctx->sme);
12005 }
12006 return ret;
12007}
12008
Jeff Johnsonb7fa2562018-07-02 08:36:17 -070012009QDF_STATUS sme_set_chip_pwr_save_fail_cb(mac_handle_t mac_handle,
12010 pwr_save_fail_cb cb)
12011{
12012 QDF_STATUS status;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080012013 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Ravi Kumar Bokka05c14e52017-03-27 14:48:23 +053012014
12015 status = sme_acquire_global_lock(&mac->sme);
12016 if (status != QDF_STATUS_SUCCESS) {
12017 sme_err("sme_AcquireGlobalLock failed!(status=%d)", status);
12018 return status;
12019 }
12020 mac->sme.chip_power_save_fail_cb = cb;
12021 sme_release_global_lock(&mac->sme);
12022 return status;
12023}
12024
Qiwei Caie689a262018-07-26 15:50:22 +080012025#ifdef FEATURE_RSSI_MONITOR
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012026/**
12027 * sme_set_rssi_monitoring() - set rssi monitoring
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -080012028 * @mac_handle: Opaque handle to the global MAC context
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012029 * @input: request message
12030 *
12031 * This function constructs the vos message and fill in message type,
12032 * bodyptr with @input and posts it to WDA queue.
12033 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012034 * Return: QDF_STATUS enumeration
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012035 */
Jeff Johnsonc7309062018-11-09 20:59:42 -080012036QDF_STATUS sme_set_rssi_monitoring(mac_handle_t mac_handle,
Jeff Johnson4c6d40f2019-02-22 20:49:56 -080012037 struct rssi_monitor_param *input)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012038{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012039 QDF_STATUS status = QDF_STATUS_SUCCESS;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080012040 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Rajeev Kumar37d478b2017-04-17 16:59:28 -070012041 struct scheduler_msg message = {0};
Jeff Johnson4c6d40f2019-02-22 20:49:56 -080012042 struct rssi_monitor_param *req_msg;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012043
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070012044 SME_ENTER();
Anurag Chouhan600c3a02016-03-01 10:33:54 +053012045 req_msg = qdf_mem_malloc(sizeof(*req_msg));
Arif Hussain0ef77082018-10-10 16:42:53 -070012046 if (!req_msg)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012047 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012048
12049 *req_msg = *input;
12050
12051 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012052 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070012053 sme_err("sme_acquire_global_lock failed!(status=%d)", status);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053012054 qdf_mem_free(req_msg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012055 return status;
12056 }
12057
12058 /* Serialize the req through MC thread */
Rajeev Kumar8eaedf62017-01-21 11:03:13 -080012059 message.bodyptr = req_msg;
12060 message.type = WMA_SET_RSSI_MONITOR_REQ;
gaurank kathpalia36b0c582018-08-28 17:45:43 +053012061 status = scheduler_post_message(QDF_MODULE_ID_SME,
12062 QDF_MODULE_ID_WMA,
12063 QDF_MODULE_ID_WMA, &message);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012064 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070012065 sme_err("scheduler_post_msg failed!(err=%d)", status);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053012066 qdf_mem_free(req_msg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012067 }
12068 sme_release_global_lock(&mac->sme);
12069
12070 return status;
12071}
12072
Qiwei Caie689a262018-07-26 15:50:22 +080012073QDF_STATUS sme_set_rssi_threshold_breached_cb(mac_handle_t mac_handle,
12074 rssi_threshold_breached_cb cb)
12075{
12076 QDF_STATUS status;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080012077 struct mac_context *mac;
Qiwei Caie689a262018-07-26 15:50:22 +080012078
12079 mac = MAC_CONTEXT(mac_handle);
12080 if (!mac) {
12081 sme_err("Invalid mac context");
12082 return QDF_STATUS_E_INVAL;
12083 }
12084
12085 status = sme_acquire_global_lock(&mac->sme);
12086 if (!QDF_IS_STATUS_SUCCESS(status)) {
12087 sme_err("sme_acquire_global_lock failed!(status=%d)",
12088 status);
12089 return status;
12090 }
12091
12092 mac->sme.rssi_threshold_breached_cb = cb;
12093 sme_release_global_lock(&mac->sme);
12094 return status;
12095}
12096#endif /* FEATURE_RSSI_MONITOR */
12097
12098QDF_STATUS sme_reset_rssi_threshold_breached_cb(mac_handle_t mac_handle)
12099{
12100 return sme_set_rssi_threshold_breached_cb(mac_handle, NULL);
12101}
12102
bings2e8c62b2019-10-29 18:57:33 +080012103/**
12104 * sme_get_connected_roaming_vdev_band_mask() - get connected vdev band mask
12105 *
12106 * Return: reg wifi band mask
12107 */
12108static uint32_t sme_get_connected_roaming_vdev_band_mask(void)
Varun Reddy Yeturu951de5d2018-09-10 21:36:22 -070012109{
bings2e8c62b2019-10-29 18:57:33 +080012110 uint32_t band_mask = REG_BAND_MASK_ALL;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080012111 struct mac_context *mac = sme_get_mac_context();
Varun Reddy Yeturu951de5d2018-09-10 21:36:22 -070012112 struct csr_roam_session *session;
bings2e8c62b2019-10-29 18:57:33 +080012113 uint8_t session_id;
Varun Reddy Yeturu951de5d2018-09-10 21:36:22 -070012114
12115 if (!mac) {
12116 sme_debug("MAC Context is NULL");
bings2e8c62b2019-10-29 18:57:33 +080012117 return band_mask;
Varun Reddy Yeturu951de5d2018-09-10 21:36:22 -070012118 }
12119 session_id = csr_get_roam_enabled_sta_sessionid(mac);
Srinivas Girigowdad8697d42019-03-08 15:34:39 -080012120 if (session_id != WLAN_UMAC_VDEV_ID_MAX) {
Varun Reddy Yeturu951de5d2018-09-10 21:36:22 -070012121 session = CSR_GET_SESSION(mac, session_id);
bings2e8c62b2019-10-29 18:57:33 +080012122 band_mask = BIT(wlan_reg_freq_to_band(
12123 session->connectedProfile.op_freq));
12124 return band_mask;
Varun Reddy Yeturu951de5d2018-09-10 21:36:22 -070012125 }
12126
bings2e8c62b2019-10-29 18:57:33 +080012127 return band_mask;
Varun Reddy Yeturu951de5d2018-09-10 21:36:22 -070012128}
12129
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012130/*
Manishekar Chandrasekaran7009f252016-04-21 19:14:15 +053012131 * sme_pdev_set_pcl() - Send WMI_PDEV_SET_PCL_CMDID to the WMA
Jeff Johnsonc7309062018-11-09 20:59:42 -080012132 * @mac_handle: Handle returned by macOpen
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012133 * @msg: PCL channel list and length structure
12134 *
Manishekar Chandrasekaran7009f252016-04-21 19:14:15 +053012135 * Sends the command to WMA to send WMI_PDEV_SET_PCL_CMDID to FW
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012136 * Return: QDF_STATUS_SUCCESS on successful posting
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012137 */
Krunal Soni8a090df2018-05-03 15:02:54 -070012138QDF_STATUS sme_pdev_set_pcl(struct policy_mgr_pcl_list *msg)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012139{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012140 QDF_STATUS status = QDF_STATUS_SUCCESS;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080012141 struct mac_context *mac = sme_get_mac_context();
Rajeev Kumar37d478b2017-04-17 16:59:28 -070012142 struct scheduler_msg message = {0};
Varun Reddy Yeturu951de5d2018-09-10 21:36:22 -070012143 struct set_pcl_req *req_msg;
12144 uint32_t i;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012145
Krunal Soni3fa80e22018-01-09 14:16:02 -080012146 if (!mac) {
12147 sme_err("mac is NULL");
12148 return QDF_STATUS_E_FAILURE;
12149 }
Krunal Soni8a090df2018-05-03 15:02:54 -070012150
12151 if (!msg) {
12152 sme_err("msg is NULL");
12153 return QDF_STATUS_E_FAILURE;
12154 }
12155
Varun Reddy Yeturu951de5d2018-09-10 21:36:22 -070012156 req_msg = qdf_mem_malloc(sizeof(*req_msg));
Arif Hussain0ef77082018-10-10 16:42:53 -070012157 if (!req_msg)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012158 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012159
bings2e8c62b2019-10-29 18:57:33 +080012160 req_msg->band_mask = REG_BAND_MASK_ALL;
Varun Reddy Yeturu951de5d2018-09-10 21:36:22 -070012161 if (CSR_IS_ROAM_INTRA_BAND_ENABLED(mac)) {
bings2e8c62b2019-10-29 18:57:33 +080012162 req_msg->band_mask = sme_get_connected_roaming_vdev_band_mask();
12163 sme_debug("Connected STA band mask%d", req_msg->band_mask);
Varun Reddy Yeturu951de5d2018-09-10 21:36:22 -070012164 }
Krunal Soni8a090df2018-05-03 15:02:54 -070012165 for (i = 0; i < msg->pcl_len; i++) {
Wu Gao882a1c92019-10-29 13:52:29 +080012166 req_msg->chan_weights.pcl_list[i] = msg->pcl_list[i];
Varun Reddy Yeturu951de5d2018-09-10 21:36:22 -070012167 req_msg->chan_weights.weight_list[i] = msg->weight_list[i];
Manishekar Chandrasekaran7009f252016-04-21 19:14:15 +053012168 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012169
Varun Reddy Yeturu951de5d2018-09-10 21:36:22 -070012170 req_msg->chan_weights.pcl_len = msg->pcl_len;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012171
12172 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012173 if (status != QDF_STATUS_SUCCESS) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070012174 sme_err("sme_acquire_global_lock failed!(status=%d)", status);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053012175 qdf_mem_free(req_msg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012176 return status;
12177 }
12178
12179 /* Serialize the req through MC thread */
Rajeev Kumar8eaedf62017-01-21 11:03:13 -080012180 message.bodyptr = req_msg;
12181 message.type = SIR_HAL_PDEV_SET_PCL_TO_FW;
gaurank kathpalia36b0c582018-08-28 17:45:43 +053012182 status = scheduler_post_message(QDF_MODULE_ID_SME,
12183 QDF_MODULE_ID_WMA,
12184 QDF_MODULE_ID_WMA, &message);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012185 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070012186 sme_err("scheduler_post_msg failed!(err=%d)", status);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053012187 qdf_mem_free(req_msg);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012188 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012189 }
12190 sme_release_global_lock(&mac->sme);
12191
12192 return status;
12193}
12194
12195/*
Manishekar Chandrasekarand9640342016-04-27 12:28:26 +053012196 * sme_pdev_set_hw_mode() - Send WMI_PDEV_SET_HW_MODE_CMDID to the WMA
Jeff Johnsonc7309062018-11-09 20:59:42 -080012197 * @mac_handle: Handle returned by macOpen
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012198 * @msg: HW mode structure containing hw mode and callback details
12199 *
Manishekar Chandrasekarand9640342016-04-27 12:28:26 +053012200 * Sends the command to CSR to send WMI_PDEV_SET_HW_MODE_CMDID to FW
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012201 * Return: QDF_STATUS_SUCCESS on successful posting
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012202 */
Tushnim Bhattacharyya0c4ad2d2017-03-09 15:59:03 -080012203QDF_STATUS sme_pdev_set_hw_mode(struct policy_mgr_hw_mode msg)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012204{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012205 QDF_STATUS status = QDF_STATUS_SUCCESS;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080012206 struct mac_context *mac = sme_get_mac_context();
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012207 tSmeCmd *cmd = NULL;
12208
Krunal Soni3fa80e22018-01-09 14:16:02 -080012209 if (!mac) {
12210 sme_err("mac is NULL");
12211 return QDF_STATUS_E_FAILURE;
12212 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012213 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012214 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070012215 sme_err("Failed to acquire lock");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012216 return QDF_STATUS_E_RESOURCES;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012217 }
12218
Krunal Soni78618d92017-02-14 21:46:31 -080012219 cmd = csr_get_command_buffer(mac);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012220 if (!cmd) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070012221 sme_err("Get command buffer failed");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012222 sme_release_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012223 return QDF_STATUS_E_NULL_VALUE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012224 }
12225
12226 cmd->command = e_sme_command_set_hw_mode;
Abhishek Singhf37d49f2019-11-25 16:00:18 +053012227 cmd->vdev_id = msg.session_id;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012228 cmd->u.set_hw_mode_cmd.hw_mode_index = msg.hw_mode_index;
12229 cmd->u.set_hw_mode_cmd.set_hw_mode_cb = msg.set_hw_mode_cb;
Chandrasekaran, Manishekaref70c0d2015-10-20 19:54:55 +053012230 cmd->u.set_hw_mode_cmd.reason = msg.reason;
12231 cmd->u.set_hw_mode_cmd.session_id = msg.session_id;
Tushnim Bhattacharyyaeab33dd2017-11-15 15:20:02 -080012232 cmd->u.set_hw_mode_cmd.next_action = msg.next_action;
gaurank kathpalia570f0af2019-12-19 19:42:44 +053012233 cmd->u.set_hw_mode_cmd.action = msg.action;
Tushnim Bhattacharyya0c4ad2d2017-03-09 15:59:03 -080012234 cmd->u.set_hw_mode_cmd.context = msg.context;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012235
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070012236 sme_debug("Queuing set hw mode to CSR, session: %d reason: %d",
Chandrasekaran, Manishekarce2172e2016-02-18 16:12:43 +053012237 cmd->u.set_hw_mode_cmd.session_id,
12238 cmd->u.set_hw_mode_cmd.reason);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012239 csr_queue_sme_command(mac, cmd, false);
12240
12241 sme_release_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012242 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012243}
12244
12245/**
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012246 * sme_nss_update_request() - Send beacon templete update to FW with new
12247 * nss value
Jeff Johnsonc7309062018-11-09 20:59:42 -080012248 * @mac_handle: Handle returned by macOpen
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012249 * @vdev_id: the session id
12250 * @new_nss: the new nss value
Liangwei Dong8c65f232019-10-23 15:42:59 +080012251 * @ch_width: channel width, optional value
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012252 * @cback: hdd callback
12253 * @next_action: next action to happen at policy mgr after beacon update
Liangwei Dong1ba99482018-10-19 02:57:29 -040012254 * @original_vdev_id: original request hwmode change vdev id
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012255 *
12256 * Sends the command to CSR to send to PE
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012257 * Return: QDF_STATUS_SUCCESS on successful posting
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012258 */
Tushnim Bhattacharyya0c4ad2d2017-03-09 15:59:03 -080012259QDF_STATUS sme_nss_update_request(uint32_t vdev_id,
Liangwei Dong8c65f232019-10-23 15:42:59 +080012260 uint8_t new_nss, uint8_t ch_width,
12261 policy_mgr_nss_update_cback cback,
Tushnim Bhattacharyya0c4ad2d2017-03-09 15:59:03 -080012262 uint8_t next_action, struct wlan_objmgr_psoc *psoc,
Liangwei Dong1ba99482018-10-19 02:57:29 -040012263 enum policy_mgr_conn_update_reason reason,
12264 uint32_t original_vdev_id)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012265{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012266 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080012267 struct mac_context *mac = sme_get_mac_context();
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012268 tSmeCmd *cmd = NULL;
12269
Krunal Soni3fa80e22018-01-09 14:16:02 -080012270 if (!mac) {
12271 sme_err("mac is null");
12272 return status;
12273 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012274 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012275 if (QDF_IS_STATUS_SUCCESS(status)) {
Krunal Soni78618d92017-02-14 21:46:31 -080012276 cmd = csr_get_command_buffer(mac);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012277 if (!cmd) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070012278 sme_err("Get command buffer failed");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012279 sme_release_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012280 return QDF_STATUS_E_NULL_VALUE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012281 }
12282 cmd->command = e_sme_command_nss_update;
12283 /* Sessionized modules may require this info */
Abhishek Singhf37d49f2019-11-25 16:00:18 +053012284 cmd->vdev_id = vdev_id;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012285 cmd->u.nss_update_cmd.new_nss = new_nss;
Liangwei Dong8c65f232019-10-23 15:42:59 +080012286 cmd->u.nss_update_cmd.ch_width = ch_width;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012287 cmd->u.nss_update_cmd.session_id = vdev_id;
12288 cmd->u.nss_update_cmd.nss_update_cb = cback;
Tushnim Bhattacharyya0c4ad2d2017-03-09 15:59:03 -080012289 cmd->u.nss_update_cmd.context = psoc;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012290 cmd->u.nss_update_cmd.next_action = next_action;
Chandrasekaran, Manishekarce2172e2016-02-18 16:12:43 +053012291 cmd->u.nss_update_cmd.reason = reason;
Liangwei Dong1ba99482018-10-19 02:57:29 -040012292 cmd->u.nss_update_cmd.original_vdev_id = original_vdev_id;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012293
Liangwei Dong1ba99482018-10-19 02:57:29 -040012294 sme_debug("Queuing e_sme_command_nss_update to CSR:vdev (%d %d) ss %d r %d",
12295 vdev_id, original_vdev_id, new_nss, reason);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012296 csr_queue_sme_command(mac, cmd, false);
12297 sme_release_global_lock(&mac->sme);
12298 }
12299 return status;
12300}
12301
12302/**
12303 * sme_soc_set_dual_mac_config() - Set dual mac configurations
Jeff Johnsonc7309062018-11-09 20:59:42 -080012304 * @mac_handle: Handle returned by macOpen
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012305 * @msg: Structure containing the dual mac config parameters
12306 *
12307 * Queues configuration information to CSR to configure
12308 * WLAN firmware for the dual MAC features
12309 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012310 * Return: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012311 */
Tushnim Bhattacharyya0c4ad2d2017-03-09 15:59:03 -080012312QDF_STATUS sme_soc_set_dual_mac_config(struct policy_mgr_dual_mac_config msg)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012313{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012314 QDF_STATUS status = QDF_STATUS_SUCCESS;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080012315 struct mac_context *mac = sme_get_mac_context();
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012316 tSmeCmd *cmd;
12317
Krunal Soni3fa80e22018-01-09 14:16:02 -080012318 if (!mac) {
12319 sme_err("mac is null");
12320 return QDF_STATUS_E_FAILURE;
12321 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012322 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012323 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070012324 sme_err("Failed to acquire lock");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012325 return QDF_STATUS_E_RESOURCES;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012326 }
12327
Krunal Soni78618d92017-02-14 21:46:31 -080012328 cmd = csr_get_command_buffer(mac);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012329 if (!cmd) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070012330 sme_err("Get command buffer failed");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012331 sme_release_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012332 return QDF_STATUS_E_NULL_VALUE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012333 }
12334
12335 cmd->command = e_sme_command_set_dual_mac_config;
12336 cmd->u.set_dual_mac_cmd.scan_config = msg.scan_config;
12337 cmd->u.set_dual_mac_cmd.fw_mode_config = msg.fw_mode_config;
12338 cmd->u.set_dual_mac_cmd.set_dual_mac_cb = msg.set_dual_mac_cb;
12339
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070012340 sme_debug("set_dual_mac_config scan_config: %x fw_mode_config: %x",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012341 cmd->u.set_dual_mac_cmd.scan_config,
12342 cmd->u.set_dual_mac_cmd.fw_mode_config);
12343 csr_queue_sme_command(mac, cmd, false);
12344
12345 sme_release_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012346 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012347}
12348
Ravi Joshi9e891ba2015-11-09 19:03:46 -080012349#ifdef FEATURE_LFR_SUBNET_DETECTION
12350/**
12351 * sme_gateway_param_update() - to update gateway parameters with WMA
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -080012352 * @mac_handle: Opaque handle to the global MAC context
Ravi Joshi9e891ba2015-11-09 19:03:46 -080012353 * @gw_params: request parameters from HDD
12354 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012355 * Return: QDF_STATUS
Ravi Joshi9e891ba2015-11-09 19:03:46 -080012356 *
12357 * This routine will update gateway parameters to WMA
12358 */
Jeff Johnsonc7309062018-11-09 20:59:42 -080012359QDF_STATUS sme_gateway_param_update(mac_handle_t mac_handle,
Jeff Johnson38d0ce62019-02-22 17:05:14 -080012360 struct gateway_update_req_param *gw_params)
Ravi Joshi9e891ba2015-11-09 19:03:46 -080012361{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012362 QDF_STATUS qdf_status;
Rajeev Kumar37d478b2017-04-17 16:59:28 -070012363 struct scheduler_msg message = {0};
Jeff Johnson38d0ce62019-02-22 17:05:14 -080012364 struct gateway_update_req_param *request_buf;
Ravi Joshi9e891ba2015-11-09 19:03:46 -080012365
Anurag Chouhan600c3a02016-03-01 10:33:54 +053012366 request_buf = qdf_mem_malloc(sizeof(*request_buf));
Arif Hussain0ef77082018-10-10 16:42:53 -070012367 if (!request_buf)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012368 return QDF_STATUS_E_NOMEM;
Ravi Joshi9e891ba2015-11-09 19:03:46 -080012369
12370 *request_buf = *gw_params;
12371
Rajeev Kumar8eaedf62017-01-21 11:03:13 -080012372 message.type = WMA_GW_PARAM_UPDATE_REQ;
12373 message.reserved = 0;
12374 message.bodyptr = request_buf;
gaurank kathpalia36b0c582018-08-28 17:45:43 +053012375 qdf_status = scheduler_post_message(QDF_MODULE_ID_SME,
12376 QDF_MODULE_ID_WMA,
12377 QDF_MODULE_ID_WMA, &message);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012378 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053012379 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053012380 "Not able to post WMA_GW_PARAM_UPDATE_REQ message to HAL");
Anurag Chouhan600c3a02016-03-01 10:33:54 +053012381 qdf_mem_free(request_buf);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012382 return QDF_STATUS_E_FAILURE;
Ravi Joshi9e891ba2015-11-09 19:03:46 -080012383 }
12384
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012385 return QDF_STATUS_SUCCESS;
Ravi Joshi9e891ba2015-11-09 19:03:46 -080012386}
12387#endif /* FEATURE_LFR_SUBNET_DETECTION */
12388
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012389/**
Archana Ramachandrana20ef812015-11-13 16:12:13 -080012390 * sme_soc_set_antenna_mode() - set antenna mode
Jeff Johnsonc7309062018-11-09 20:59:42 -080012391 * @mac_handle: Handle returned by macOpen
Archana Ramachandrana20ef812015-11-13 16:12:13 -080012392 * @msg: Structure containing the antenna mode parameters
12393 *
12394 * Send the command to CSR to send
12395 * WMI_SOC_SET_ANTENNA_MODE_CMDID to FW
12396 *
12397 * Return: QDF_STATUS
12398 */
Jeff Johnsonc7309062018-11-09 20:59:42 -080012399QDF_STATUS sme_soc_set_antenna_mode(mac_handle_t mac_handle,
12400 struct sir_antenna_mode_param *msg)
Archana Ramachandrana20ef812015-11-13 16:12:13 -080012401{
12402 QDF_STATUS status = QDF_STATUS_SUCCESS;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080012403 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Archana Ramachandrana20ef812015-11-13 16:12:13 -080012404 tSmeCmd *cmd;
12405
Jeff Johnson038efe72019-03-18 13:39:31 -070012406 if (!msg) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070012407 sme_err("antenna mode mesg is NULL");
Archana Ramachandrana20ef812015-11-13 16:12:13 -080012408 return QDF_STATUS_E_FAILURE;
12409 }
12410
12411 status = sme_acquire_global_lock(&mac->sme);
12412 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070012413 sme_err("Failed to acquire lock");
Archana Ramachandrana20ef812015-11-13 16:12:13 -080012414 return QDF_STATUS_E_RESOURCES;
12415 }
12416
Krunal Soni78618d92017-02-14 21:46:31 -080012417 cmd = csr_get_command_buffer(mac);
Archana Ramachandrana20ef812015-11-13 16:12:13 -080012418 if (!cmd) {
12419 sme_release_global_lock(&mac->sme);
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070012420 sme_err("Get command buffer failed");
Archana Ramachandrana20ef812015-11-13 16:12:13 -080012421 return QDF_STATUS_E_NULL_VALUE;
12422 }
12423
12424 cmd->command = e_sme_command_set_antenna_mode;
12425 cmd->u.set_antenna_mode_cmd = *msg;
12426
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070012427 sme_debug("Antenna mode rx_chains: %d tx_chains: %d",
Archana Ramachandrana20ef812015-11-13 16:12:13 -080012428 cmd->u.set_antenna_mode_cmd.num_rx_chains,
12429 cmd->u.set_antenna_mode_cmd.num_tx_chains);
12430
12431 csr_queue_sme_command(mac, cmd, false);
12432 sme_release_global_lock(&mac->sme);
12433
12434 return QDF_STATUS_SUCCESS;
12435}
12436
12437/**
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012438 * sme_set_peer_authorized() - call peer authorized callback
12439 * @peer_addr: peer mac address
12440 * @auth_cb: auth callback
12441 * @vdev_id: vdev id
12442 *
Anurag Chouhanf04e84f2016-03-03 10:12:12 +053012443 * Return: QDF Status
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012444 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012445QDF_STATUS sme_set_peer_authorized(uint8_t *peer_addr,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012446 sme_peer_authorized_fp auth_cb,
12447 uint32_t vdev_id)
12448{
12449 void *wma_handle;
12450
Anurag Chouhan6d760662016-02-20 16:05:43 +053012451 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012452 if (!wma_handle) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053012453 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012454 "wma handle is NULL");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012455 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012456 }
12457
12458 wma_set_peer_authorized_cb(wma_handle, auth_cb);
12459 return wma_set_peer_param(wma_handle, peer_addr, WMI_PEER_AUTHORIZE,
12460 1, vdev_id);
12461}
12462
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012463/**
Jeff Johnson01f2c232018-11-21 19:17:44 -080012464 * sme_setdef_dot11mode() - Updates mac with default dot11mode
Jeff Johnsonc7309062018-11-09 20:59:42 -080012465 * @mac_handle: Global MAC pointer
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012466 *
12467 * Return: NULL.
12468 */
Jeff Johnsonc7309062018-11-09 20:59:42 -080012469void sme_setdef_dot11mode(mac_handle_t mac_handle)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012470{
Jeff Johnson0a8786a2018-12-02 10:49:01 -080012471 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053012472
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012473 csr_set_default_dot11_mode(mac_ctx);
12474}
12475
12476/**
Krishna Kumaar Natarajan052c6e62015-09-28 15:32:55 -070012477 * sme_update_tgt_services() - update the target services config.
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -080012478 * @mac_handle: Opaque handle to the global MAC context.
Krishna Kumaar Natarajan052c6e62015-09-28 15:32:55 -070012479 * @cfg: wma_tgt_services parameters.
12480 *
12481 * update the target services config.
12482 *
12483 * Return: None.
12484 */
Jeff Johnsonc7309062018-11-09 20:59:42 -080012485void sme_update_tgt_services(mac_handle_t mac_handle,
12486 struct wma_tgt_services *cfg)
Krishna Kumaar Natarajan052c6e62015-09-28 15:32:55 -070012487{
Jeff Johnson0a8786a2018-12-02 10:49:01 -080012488 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Krishna Kumaar Natarajan052c6e62015-09-28 15:32:55 -070012489
Liangwei Dong0da14262018-07-03 03:30:23 -040012490 mac_ctx->obss_scan_offload = cfg->obss_scan_offload;
12491 sme_debug("obss_scan_offload: %d", mac_ctx->obss_scan_offload);
Krunal Sonie6a1cda2017-09-27 15:23:02 -070012492 mac_ctx->lteCoexAntShare = cfg->lte_coex_ant_share;
gaurank kathpalia7633dfc2019-09-13 20:04:58 +053012493 mac_ctx->mlme_cfg->gen.as_enabled = cfg->lte_coex_ant_share;
Krishna Kumaar Natarajan052c6e62015-09-28 15:32:55 -070012494 mac_ctx->beacon_offload = cfg->beacon_offload;
mukul sharma72c8b222015-09-04 17:02:01 +053012495 mac_ctx->pmf_offload = cfg->pmf_offload;
Abhishek Singhe4a1f882017-08-10 17:59:44 +053012496 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
mukul sharma72c8b222015-09-04 17:02:01 +053012497 FL("mac_ctx->pmf_offload: %d"), mac_ctx->pmf_offload);
Vignesh Viswanathan731186f2017-09-18 13:47:37 +053012498 mac_ctx->is_fils_roaming_supported =
12499 cfg->is_fils_roaming_supported;
Vignesh Viswanathan694e28e2018-01-18 20:53:57 +053012500 mac_ctx->is_11k_offload_supported =
12501 cfg->is_11k_offload_supported;
12502 sme_debug("pmf_offload: %d fils_roam support %d 11k_offload %d",
12503 mac_ctx->pmf_offload, mac_ctx->is_fils_roaming_supported,
12504 mac_ctx->is_11k_offload_supported);
Arunk Khandavallica56d4b2018-11-29 15:46:00 +053012505 mac_ctx->bcn_reception_stats = cfg->bcn_reception_stats;
Krishna Kumaar Natarajan052c6e62015-09-28 15:32:55 -070012506}
Masti, Narayanraddic4a7ab82015-11-25 15:41:10 +053012507
Chandrasekaran, Manishekar2859de42016-02-11 16:17:38 +053012508/**
12509 * sme_is_session_id_valid() - Check if the session id is valid
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -080012510 * @mac_handle: Opaque handle to the global MAC context
Chandrasekaran, Manishekar2859de42016-02-11 16:17:38 +053012511 * @session_id: Session id
12512 *
12513 * Checks if the session id is valid or not
12514 *
12515 * Return: True is the session id is valid, false otherwise
12516 */
Jeff Johnsonc7309062018-11-09 20:59:42 -080012517bool sme_is_session_id_valid(mac_handle_t mac_handle, uint32_t session_id)
Chandrasekaran, Manishekar2859de42016-02-11 16:17:38 +053012518{
Jeff Johnson0a8786a2018-12-02 10:49:01 -080012519 struct mac_context *mac;
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053012520
Jeff Johnson038efe72019-03-18 13:39:31 -070012521 if (mac_handle) {
Jeff Johnsona0619e42018-11-28 17:43:00 -080012522 mac = MAC_CONTEXT(mac_handle);
Pragaspathi Thilagarajb11dbe42018-07-23 16:42:17 +053012523 } else {
Chandrasekaran, Manishekard3cb4772016-02-22 22:21:10 +053012524 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
12525 "%s: null mac pointer", __func__);
Chandrasekaran, Manishekar2859de42016-02-11 16:17:38 +053012526 return false;
12527 }
12528
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053012529 if (CSR_IS_SESSION_VALID(mac, session_id))
Chandrasekaran, Manishekar2859de42016-02-11 16:17:38 +053012530 return true;
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053012531
12532 return false;
Chandrasekaran, Manishekar2859de42016-02-11 16:17:38 +053012533}
12534
Masti, Narayanraddic4a7ab82015-11-25 15:41:10 +053012535#ifdef FEATURE_WLAN_TDLS
12536
12537/**
12538 * sme_get_opclass() - determine operating class
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -080012539 * @mac_handle: Opaque handle to the global MAC context
Masti, Narayanraddic4a7ab82015-11-25 15:41:10 +053012540 * @channel: channel id
12541 * @bw_offset: bandwidth offset
12542 * @opclass: pointer to operating class
12543 *
12544 * Function will determine operating class from regdm_get_opclass_from_channel
12545 *
12546 * Return: none
12547 */
Jeff Johnsonc7309062018-11-09 20:59:42 -080012548void sme_get_opclass(mac_handle_t mac_handle, uint8_t channel,
12549 uint8_t bw_offset, uint8_t *opclass)
Masti, Narayanraddic4a7ab82015-11-25 15:41:10 +053012550{
Jeff Johnson0a8786a2018-12-02 10:49:01 -080012551 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Masti, Narayanraddic4a7ab82015-11-25 15:41:10 +053012552
12553 /* redgm opclass table contains opclass for 40MHz low primary,
12554 * 40MHz high primary and 20MHz. No support for 80MHz yet. So
12555 * first we will check if bit for 40MHz is set and if so find
12556 * matching opclass either with low primary or high primary
12557 * (a channel would never be in both) and then search for opclass
12558 * matching 20MHz, else for any BW.
12559 */
12560 if (bw_offset & (1 << BW_40_OFFSET_BIT)) {
Kiran Kumar Lokerea3de2262017-04-12 12:15:04 -070012561 *opclass = wlan_reg_dmn_get_opclass_from_channel(
Masti, Narayanraddic4a7ab82015-11-25 15:41:10 +053012562 mac_ctx->scan.countryCodeCurrent,
12563 channel, BW40_LOW_PRIMARY);
12564 if (!(*opclass)) {
Kiran Kumar Lokerea3de2262017-04-12 12:15:04 -070012565 *opclass = wlan_reg_dmn_get_opclass_from_channel(
Masti, Narayanraddic4a7ab82015-11-25 15:41:10 +053012566 mac_ctx->scan.countryCodeCurrent,
12567 channel, BW40_HIGH_PRIMARY);
12568 }
12569 } else if (bw_offset & (1 << BW_20_OFFSET_BIT)) {
Kiran Kumar Lokerea3de2262017-04-12 12:15:04 -070012570 *opclass = wlan_reg_dmn_get_opclass_from_channel(
Masti, Narayanraddic4a7ab82015-11-25 15:41:10 +053012571 mac_ctx->scan.countryCodeCurrent,
12572 channel, BW20);
12573 } else {
Kiran Kumar Lokerea3de2262017-04-12 12:15:04 -070012574 *opclass = wlan_reg_dmn_get_opclass_from_channel(
Masti, Narayanraddic4a7ab82015-11-25 15:41:10 +053012575 mac_ctx->scan.countryCodeCurrent,
12576 channel, BWALL);
12577 }
12578}
12579#endif
Ryan Hsu3c8f79f2015-12-02 16:45:09 -080012580
Sandeep Puligillae0875662016-02-12 16:09:21 -080012581/**
Anurag Chouhanbf5e0e22016-09-12 12:54:09 +053012582 * sme_set_fw_test() - set fw test
12583 * @fw_test: fw test param
12584 *
12585 * Return: Return QDF_STATUS, otherwise appropriate failure code
12586 */
12587QDF_STATUS sme_set_fw_test(struct set_fwtest_params *fw_test)
12588{
12589 void *wma_handle;
12590
12591 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
12592 if (!wma_handle) {
12593 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
12594 "wma handle is NULL");
12595 return QDF_STATUS_E_FAILURE;
12596 }
Bala Venkateshe45f03d2019-03-25 16:00:42 +053012597
12598 return wma_process_fw_test_cmd(wma_handle, fw_test);
Anurag Chouhanbf5e0e22016-09-12 12:54:09 +053012599}
12600
12601/**
Sandeep Puligillae0875662016-02-12 16:09:21 -080012602 * sme_ht40_stop_obss_scan() - ht40 obss stop scan
Jeff Johnsonc7309062018-11-09 20:59:42 -080012603 * @mac_handle: mac handel
Sandeep Puligillae0875662016-02-12 16:09:21 -080012604 * @vdev_id: vdev identifier
12605 *
12606 * Return: Return QDF_STATUS, otherwise appropriate failure code
12607 */
Jeff Johnsonc7309062018-11-09 20:59:42 -080012608QDF_STATUS sme_ht40_stop_obss_scan(mac_handle_t mac_handle, uint32_t vdev_id)
Sandeep Puligillae0875662016-02-12 16:09:21 -080012609{
12610 void *wma_handle;
12611
12612 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
12613 if (!wma_handle) {
12614 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
12615 "wma handle is NULL");
12616 return QDF_STATUS_E_FAILURE;
12617 }
12618 wma_ht40_stop_obss_scan(wma_handle, vdev_id);
12619 return QDF_STATUS_SUCCESS;
12620}
Archana Ramachandran20d2e232016-02-11 16:58:40 -080012621
12622/**
12623 * sme_update_mimo_power_save() - Update MIMO power save
12624 * configuration
Jeff Johnsonc7309062018-11-09 20:59:42 -080012625 * @mac_handle: The handle returned by macOpen
Archana Ramachandran20d2e232016-02-11 16:58:40 -080012626 * @is_ht_smps_enabled: enable/disable ht smps
12627 * @ht_smps_mode: smps mode disabled/static/dynamic
Archana Ramachandranfec24812016-02-16 16:31:56 -080012628 * @send_smps_action: flag to send smps force mode command
12629 * to FW
Archana Ramachandran20d2e232016-02-11 16:58:40 -080012630 *
12631 * Return: QDF_STATUS if SME update mimo power save
Jeff Johnson698eacd2018-05-12 17:00:03 -070012632 * configuration success else failure status
Archana Ramachandran20d2e232016-02-11 16:58:40 -080012633 */
Jeff Johnsonc7309062018-11-09 20:59:42 -080012634QDF_STATUS sme_update_mimo_power_save(mac_handle_t mac_handle,
Archana Ramachandran20d2e232016-02-11 16:58:40 -080012635 uint8_t is_ht_smps_enabled,
Archana Ramachandranfec24812016-02-16 16:31:56 -080012636 uint8_t ht_smps_mode,
12637 bool send_smps_action)
Archana Ramachandran20d2e232016-02-11 16:58:40 -080012638{
Jeff Johnson0a8786a2018-12-02 10:49:01 -080012639 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Archana Ramachandranfec24812016-02-16 16:31:56 -080012640
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070012641 sme_debug("SMPS enable: %d mode: %d send action: %d",
Archana Ramachandranfec24812016-02-16 16:31:56 -080012642 is_ht_smps_enabled, ht_smps_mode,
12643 send_smps_action);
Vignesh Viswanathanddc89e52018-11-02 18:43:42 +053012644 mac_ctx->mlme_cfg->ht_caps.enable_smps =
Archana Ramachandran20d2e232016-02-11 16:58:40 -080012645 is_ht_smps_enabled;
Vignesh Viswanathanddc89e52018-11-02 18:43:42 +053012646 mac_ctx->mlme_cfg->ht_caps.smps = ht_smps_mode;
Archana Ramachandranfec24812016-02-16 16:31:56 -080012647 mac_ctx->roam.configParam.send_smps_action =
12648 send_smps_action;
Archana Ramachandran20d2e232016-02-11 16:58:40 -080012649
12650 return QDF_STATUS_SUCCESS;
12651}
12652
Abhinav Kumardbbfd2c2019-05-07 12:22:06 +053012653#ifdef WLAN_BCN_RECV_FEATURE
12654QDF_STATUS sme_handle_bcn_recv_start(mac_handle_t mac_handle,
Abhinav Kumare85ae552019-06-05 19:02:14 +053012655 uint32_t vdev_id, uint32_t nth_value,
12656 bool do_not_resume)
Abhinav Kumardbbfd2c2019-05-07 12:22:06 +053012657{
12658 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
12659 struct csr_roam_session *session;
12660 QDF_STATUS status;
Abhinav Kumar8475bc32019-06-05 15:35:56 +053012661 int ret;
Abhinav Kumardbbfd2c2019-05-07 12:22:06 +053012662
Abhinav Kumardbbfd2c2019-05-07 12:22:06 +053012663 session = CSR_GET_SESSION(mac_ctx, vdev_id);
12664 if (!session) {
12665 sme_err("vdev_id %d not found", vdev_id);
12666 return QDF_STATUS_E_FAILURE;
12667 }
12668
Abhinav Kumar668bd122019-06-01 18:52:11 +053012669 if (!CSR_IS_SESSION_VALID(mac_ctx, vdev_id)) {
12670 sme_err("CSR session not valid: %d", vdev_id);
12671 return QDF_STATUS_E_FAILURE;
12672 }
12673
Abhinav Kumardbbfd2c2019-05-07 12:22:06 +053012674 status = sme_acquire_global_lock(&mac_ctx->sme);
12675 if (QDF_IS_STATUS_SUCCESS(status)) {
12676 if (session->is_bcn_recv_start) {
12677 sme_release_global_lock(&mac_ctx->sme);
12678 sme_err("Beacon receive already started");
12679 return QDF_STATUS_SUCCESS;
12680 }
12681 session->is_bcn_recv_start = true;
Abhinav Kumare85ae552019-06-05 19:02:14 +053012682 session->beacon_report_do_not_resume = do_not_resume;
Abhinav Kumardbbfd2c2019-05-07 12:22:06 +053012683 sme_release_global_lock(&mac_ctx->sme);
Abhinav Kumar8475bc32019-06-05 15:35:56 +053012684 }
Abhinav Kumardbbfd2c2019-05-07 12:22:06 +053012685
Abhinav Kumar8475bc32019-06-05 15:35:56 +053012686 /*
12687 * Allows fw to send beacons of connected AP to driver.
12688 * MSB set : means fw do not wakeup host in wow mode
12689 * LSB set: Value of beacon report period (say n), Means fw sends nth
12690 * beacons of connected AP to HOST
12691 */
12692 ret = sme_cli_set_command(vdev_id,
12693 WMI_VDEV_PARAM_NTH_BEACON_TO_HOST,
12694 nth_value, VDEV_CMD);
12695 if (ret) {
12696 status = sme_acquire_global_lock(&mac_ctx->sme);
12697 if (QDF_IS_STATUS_SUCCESS(status)) {
12698 session->is_bcn_recv_start = false;
Abhinav Kumare85ae552019-06-05 19:02:14 +053012699 session->beacon_report_do_not_resume = false;
Abhinav Kumar8475bc32019-06-05 15:35:56 +053012700 sme_release_global_lock(&mac_ctx->sme);
Abhinav Kumardbbfd2c2019-05-07 12:22:06 +053012701 }
Abhinav Kumar8475bc32019-06-05 15:35:56 +053012702 sme_err("WMI_VDEV_PARAM_NTH_BEACON_TO_HOST %d", ret);
12703 status = qdf_status_from_os_return(ret);
Abhinav Kumardbbfd2c2019-05-07 12:22:06 +053012704 }
12705
12706 return status;
12707}
Abhinav Kumar39222152019-05-13 23:53:40 +053012708
12709void sme_stop_beacon_report(mac_handle_t mac_handle, uint32_t session_id)
12710{
12711 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
12712 struct csr_roam_session *session;
12713 QDF_STATUS status;
Abhinav Kumar8475bc32019-06-05 15:35:56 +053012714 int ret;
Abhinav Kumar39222152019-05-13 23:53:40 +053012715
Abhinav Kumar39222152019-05-13 23:53:40 +053012716 session = CSR_GET_SESSION(mac_ctx, session_id);
12717 if (!session) {
12718 sme_err("vdev_id %d not found", session_id);
12719 return;
12720 }
Abhinav Kumare85ae552019-06-05 19:02:14 +053012721
Abhinav Kumar8475bc32019-06-05 15:35:56 +053012722 ret = sme_cli_set_command(session_id,
12723 WMI_VDEV_PARAM_NTH_BEACON_TO_HOST, 0,
12724 VDEV_CMD);
12725 if (ret)
12726 sme_err("WMI_VDEV_PARAM_NTH_BEACON_TO_HOST command failed to FW");
Abhinav Kumar39222152019-05-13 23:53:40 +053012727 status = sme_acquire_global_lock(&mac_ctx->sme);
12728 if (QDF_IS_STATUS_SUCCESS(status)) {
12729 session->is_bcn_recv_start = false;
Abhinav Kumare85ae552019-06-05 19:02:14 +053012730 session->beacon_report_do_not_resume = false;
Abhinav Kumar39222152019-05-13 23:53:40 +053012731 sme_release_global_lock(&mac_ctx->sme);
12732 }
12733}
12734
12735bool sme_is_beacon_report_started(mac_handle_t mac_handle, uint32_t session_id)
12736{
12737 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
12738 struct csr_roam_session *session;
12739
Abhinav Kumare85ae552019-06-05 19:02:14 +053012740 session = CSR_GET_SESSION(mac_ctx, session_id);
12741 if (!session) {
12742 sme_err("vdev_id %d not found", session_id);
12743 return false;
12744 }
12745
Abhinav Kumar39222152019-05-13 23:53:40 +053012746 if (!CSR_IS_SESSION_VALID(mac_ctx, session_id)) {
12747 sme_err("CSR session not valid: %d", session_id);
12748 return false;
12749 }
12750
Abhinav Kumare85ae552019-06-05 19:02:14 +053012751 return session->is_bcn_recv_start;
12752}
12753
12754bool sme_is_beacon_reporting_do_not_resume(mac_handle_t mac_handle,
12755 uint32_t session_id)
12756{
12757 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
12758 struct csr_roam_session *session;
12759
Abhinav Kumar39222152019-05-13 23:53:40 +053012760 session = CSR_GET_SESSION(mac_ctx, session_id);
12761 if (!session) {
12762 sme_err("vdev_id %d not found", session_id);
12763 return false;
12764 }
12765
Abhinav Kumare85ae552019-06-05 19:02:14 +053012766 if (!CSR_IS_SESSION_VALID(mac_ctx, session_id)) {
12767 sme_err("CSR session not valid: %d", session_id);
12768 return false;
12769 }
12770
12771 return session->beacon_report_do_not_resume;
Abhinav Kumar39222152019-05-13 23:53:40 +053012772}
Abhinav Kumardbbfd2c2019-05-07 12:22:06 +053012773#endif
12774
Archana Ramachandran20d2e232016-02-11 16:58:40 -080012775/**
Gupta, Kapil4cb1d7d2016-04-16 18:16:25 -070012776 * sme_add_beacon_filter() - set the beacon filter configuration
Jeff Johnsonc7309062018-11-09 20:59:42 -080012777 * @mac_handle: The handle returned by macOpen
Gupta, Kapil4cb1d7d2016-04-16 18:16:25 -070012778 * @session_id: session id
12779 * @ie_map: bitwise array of IEs
12780 *
12781 * Return: Return QDF_STATUS, otherwise appropriate failure code
12782 */
Jeff Johnsonc7309062018-11-09 20:59:42 -080012783QDF_STATUS sme_add_beacon_filter(mac_handle_t mac_handle,
Gupta, Kapil4cb1d7d2016-04-16 18:16:25 -070012784 uint32_t session_id,
12785 uint32_t *ie_map)
12786{
Rajeev Kumar37d478b2017-04-17 16:59:28 -070012787 struct scheduler_msg message = {0};
Gupta, Kapil4cb1d7d2016-04-16 18:16:25 -070012788 QDF_STATUS qdf_status;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080012789 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Gupta, Kapil4cb1d7d2016-04-16 18:16:25 -070012790 struct beacon_filter_param *filter_param;
12791
12792 if (!CSR_IS_SESSION_VALID(mac_ctx, session_id)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070012793 sme_err("CSR session not valid: %d", session_id);
Gupta, Kapil4cb1d7d2016-04-16 18:16:25 -070012794 return QDF_STATUS_E_FAILURE;
12795 }
12796
12797 filter_param = qdf_mem_malloc(sizeof(*filter_param));
Arif Hussain0ef77082018-10-10 16:42:53 -070012798 if (!filter_param)
Gupta, Kapil4cb1d7d2016-04-16 18:16:25 -070012799 return QDF_STATUS_E_FAILURE;
Gupta, Kapil4cb1d7d2016-04-16 18:16:25 -070012800
12801 filter_param->vdev_id = session_id;
12802
12803 qdf_mem_copy(filter_param->ie_map, ie_map,
12804 BCN_FLT_MAX_ELEMS_IE_LIST * sizeof(uint32_t));
12805
12806 message.type = WMA_ADD_BCN_FILTER_CMDID;
12807 message.bodyptr = filter_param;
gaurank kathpalia36b0c582018-08-28 17:45:43 +053012808 qdf_status = scheduler_post_message(QDF_MODULE_ID_SME,
12809 QDF_MODULE_ID_WMA,
12810 QDF_MODULE_ID_WMA,
12811 &message);
Gupta, Kapil4cb1d7d2016-04-16 18:16:25 -070012812 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
12813 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
12814 "%s: Not able to post msg to WDA!",
12815 __func__);
12816
12817 qdf_mem_free(filter_param);
12818 }
12819 return qdf_status;
12820}
12821
12822/**
12823 * sme_remove_beacon_filter() - set the beacon filter configuration
Jeff Johnsonc7309062018-11-09 20:59:42 -080012824 * @mac_handle: The handle returned by macOpen
Gupta, Kapil4cb1d7d2016-04-16 18:16:25 -070012825 * @session_id: session id
12826 *
12827 * Return: Return QDF_STATUS, otherwise appropriate failure code
12828 */
Jeff Johnsonc7309062018-11-09 20:59:42 -080012829QDF_STATUS sme_remove_beacon_filter(mac_handle_t mac_handle,
12830 uint32_t session_id)
Gupta, Kapil4cb1d7d2016-04-16 18:16:25 -070012831{
Rajeev Kumar37d478b2017-04-17 16:59:28 -070012832 struct scheduler_msg message = {0};
Gupta, Kapil4cb1d7d2016-04-16 18:16:25 -070012833 QDF_STATUS qdf_status;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080012834 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Gupta, Kapil4cb1d7d2016-04-16 18:16:25 -070012835 struct beacon_filter_param *filter_param;
12836
12837 if (!CSR_IS_SESSION_VALID(mac_ctx, session_id)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070012838 sme_err("CSR session not valid: %d", session_id);
Gupta, Kapil4cb1d7d2016-04-16 18:16:25 -070012839 return QDF_STATUS_E_FAILURE;
12840 }
12841
12842 filter_param = qdf_mem_malloc(sizeof(*filter_param));
Arif Hussain0ef77082018-10-10 16:42:53 -070012843 if (!filter_param)
Gupta, Kapil4cb1d7d2016-04-16 18:16:25 -070012844 return QDF_STATUS_E_FAILURE;
Gupta, Kapil4cb1d7d2016-04-16 18:16:25 -070012845
12846 filter_param->vdev_id = session_id;
12847
12848 message.type = WMA_REMOVE_BCN_FILTER_CMDID;
12849 message.bodyptr = filter_param;
gaurank kathpalia36b0c582018-08-28 17:45:43 +053012850 qdf_status = scheduler_post_message(QDF_MODULE_ID_SME,
12851 QDF_MODULE_ID_WMA,
12852 QDF_MODULE_ID_WMA,
12853 &message);
Gupta, Kapil4cb1d7d2016-04-16 18:16:25 -070012854 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
12855 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
12856 "%s: Not able to post msg to WDA!",
12857 __func__);
12858
12859 qdf_mem_free(filter_param);
12860 }
12861 return qdf_status;
12862}
Arun Khandavalli2476ef52016-04-26 20:19:43 +053012863
Arun Khandavalli2476ef52016-04-26 20:19:43 +053012864/**
Kondabattini, Ganesh3f2d02c2016-09-13 12:23:47 +053012865 * sme_send_disassoc_req_frame - send disassoc req
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -080012866 * @mac_handle: Opaque handle to the global MAC context
Kondabattini, Ganesh3f2d02c2016-09-13 12:23:47 +053012867 * @session_id: session id
12868 * @peer_mac: peer mac address
12869 * @reason: reason for disassociation
12870 * wait_for_ack: wait for acknowledgment
12871 *
12872 * function to send disassoc request to lim
12873 *
12874 * return: none
12875 */
Jeff Johnsonc7309062018-11-09 20:59:42 -080012876void sme_send_disassoc_req_frame(mac_handle_t mac_handle, uint8_t session_id,
12877 uint8_t *peer_mac, uint16_t reason,
12878 uint8_t wait_for_ack)
Kondabattini, Ganesh3f2d02c2016-09-13 12:23:47 +053012879{
12880 struct sme_send_disassoc_frm_req *msg;
12881 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Kondabattini, Ganesh3f2d02c2016-09-13 12:23:47 +053012882
Jeff Johnson0e1e7682019-02-20 13:36:04 -080012883 msg = qdf_mem_malloc(sizeof(*msg));
Arif Hussain0ef77082018-10-10 16:42:53 -070012884 if (!msg)
Kondabattini, Ganesh3f2d02c2016-09-13 12:23:47 +053012885 return;
12886
Jeff Johnson0e1e7682019-02-20 13:36:04 -080012887 msg->msg_type = eWNI_SME_SEND_DISASSOC_FRAME;
12888 msg->length = sizeof(*msg);
Abhishek Singhefe21e62019-09-20 10:03:24 +053012889 msg->vdev_id = session_id;
Jeff Johnson0e1e7682019-02-20 13:36:04 -080012890 qdf_mem_copy(msg->peer_mac, peer_mac, QDF_MAC_ADDR_SIZE);
12891 msg->reason = reason;
12892 msg->wait_for_ack = wait_for_ack;
Kondabattini, Ganesh3f2d02c2016-09-13 12:23:47 +053012893
Rajeev Kumard138ac52017-01-30 18:38:37 -080012894 qdf_status = umac_send_mb_message_to_mac(msg);
Jeff Johnson0e1e7682019-02-20 13:36:04 -080012895 if (QDF_IS_STATUS_ERROR(qdf_status))
12896 sme_err("umac_send_mb_message_to_mac failed, %d",
12897 qdf_status);
Kondabattini, Ganesh3f2d02c2016-09-13 12:23:47 +053012898}
12899
Nachiket Kukade177b5b02018-05-22 20:52:17 +053012900#ifdef FEATURE_WLAN_APF
Jeff Johnsonc7309062018-11-09 20:59:42 -080012901QDF_STATUS sme_get_apf_capabilities(mac_handle_t mac_handle,
Nachiket Kukade177b5b02018-05-22 20:52:17 +053012902 apf_get_offload_cb callback,
12903 void *context)
Arun Khandavalli2476ef52016-04-26 20:19:43 +053012904{
12905 QDF_STATUS status = QDF_STATUS_SUCCESS;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080012906 struct mac_context * mac_ctx = MAC_CONTEXT(mac_handle);
Rajeev Kumar37d478b2017-04-17 16:59:28 -070012907 struct scheduler_msg cds_msg = {0};
Arun Khandavalli2476ef52016-04-26 20:19:43 +053012908
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070012909 SME_ENTER();
Arun Khandavalli2476ef52016-04-26 20:19:43 +053012910
12911 status = sme_acquire_global_lock(&mac_ctx->sme);
12912 if (QDF_STATUS_SUCCESS == status) {
12913 /* Serialize the req through MC thread */
Nachiket Kukadee547a482018-05-22 16:43:30 +053012914 mac_ctx->sme.apf_get_offload_cb = callback;
12915 mac_ctx->sme.apf_get_offload_context = context;
Arun Khandavalli2476ef52016-04-26 20:19:43 +053012916 cds_msg.bodyptr = NULL;
Nachiket Kukadee547a482018-05-22 16:43:30 +053012917 cds_msg.type = WDA_APF_GET_CAPABILITIES_REQ;
gaurank kathpalia36b0c582018-08-28 17:45:43 +053012918 status = scheduler_post_message(QDF_MODULE_ID_SME,
12919 QDF_MODULE_ID_WMA,
12920 QDF_MODULE_ID_WMA, &cds_msg);
Arun Khandavalli2476ef52016-04-26 20:19:43 +053012921 if (!QDF_IS_STATUS_SUCCESS(status)) {
12922 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Nachiket Kukadee547a482018-05-22 16:43:30 +053012923 FL("Post apf get offload msg fail"));
Arun Khandavalli2476ef52016-04-26 20:19:43 +053012924 status = QDF_STATUS_E_FAILURE;
12925 }
12926 sme_release_global_lock(&mac_ctx->sme);
Arun Khandavalli2476ef52016-04-26 20:19:43 +053012927 }
Madhvapathi Sriram3e6627a2018-12-19 12:54:49 +053012928
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070012929 SME_EXIT();
Arun Khandavalli2476ef52016-04-26 20:19:43 +053012930 return status;
12931}
12932
Jeff Johnsonc7309062018-11-09 20:59:42 -080012933QDF_STATUS sme_set_apf_instructions(mac_handle_t mac_handle,
Nachiket Kukadee547a482018-05-22 16:43:30 +053012934 struct sir_apf_set_offload *req)
Arun Khandavalli2476ef52016-04-26 20:19:43 +053012935{
Nachiket Kukade4f686582018-11-19 19:18:27 +053012936 void *wma_handle;
Arun Khandavalli2476ef52016-04-26 20:19:43 +053012937
Nachiket Kukade4f686582018-11-19 19:18:27 +053012938 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
12939 if (!wma_handle) {
Arun Khandavalli2476ef52016-04-26 20:19:43 +053012940 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Nachiket Kukade4f686582018-11-19 19:18:27 +053012941 "wma handle is NULL");
12942 return QDF_STATUS_E_FAILURE;
Arun Khandavalli2476ef52016-04-26 20:19:43 +053012943 }
Nachiket Kukade4f686582018-11-19 19:18:27 +053012944
12945 return wma_set_apf_instructions(wma_handle, req);
Arun Khandavalli2476ef52016-04-26 20:19:43 +053012946}
12947
Jeff Johnsonc7309062018-11-09 20:59:42 -080012948QDF_STATUS sme_set_apf_enable_disable(mac_handle_t mac_handle, uint8_t vdev_id,
Nachiket Kukade177b5b02018-05-22 20:52:17 +053012949 bool apf_enable)
12950{
12951 void *wma_handle;
12952
12953 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
12954 if (!wma_handle) {
12955 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
12956 "wma handle is NULL");
12957 return QDF_STATUS_E_FAILURE;
12958 }
12959
12960 return wma_send_apf_enable_cmd(wma_handle, vdev_id, apf_enable);
12961}
12962
12963QDF_STATUS
Jeff Johnsonc7309062018-11-09 20:59:42 -080012964sme_apf_write_work_memory(mac_handle_t mac_handle,
Nachiket Kukade177b5b02018-05-22 20:52:17 +053012965 struct wmi_apf_write_memory_params *write_params)
12966{
12967 void *wma_handle;
12968
12969 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
12970 if (!wma_handle) {
12971 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
12972 "wma handle is NULL");
12973 return QDF_STATUS_E_FAILURE;
12974 }
12975
12976 return wma_send_apf_write_work_memory_cmd(wma_handle, write_params);
12977}
12978
12979QDF_STATUS
Jeff Johnsonc7309062018-11-09 20:59:42 -080012980sme_apf_read_work_memory(mac_handle_t mac_handle,
Nachiket Kukade177b5b02018-05-22 20:52:17 +053012981 struct wmi_apf_read_memory_params *read_params,
12982 apf_read_mem_cb callback)
12983{
12984 QDF_STATUS status = QDF_STATUS_SUCCESS;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080012985 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Nachiket Kukade177b5b02018-05-22 20:52:17 +053012986 void *wma_handle;
12987
12988 status = sme_acquire_global_lock(&mac->sme);
12989 if (QDF_IS_STATUS_SUCCESS(status)) {
12990 mac->sme.apf_read_mem_cb = callback;
12991 sme_release_global_lock(&mac->sme);
12992 } else {
12993 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
12994 FL("sme_acquire_global_lock failed"));
12995 }
12996
12997 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
12998 if (!wma_handle) {
12999 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
13000 "wma handle is NULL");
13001 return QDF_STATUS_E_FAILURE;
13002 }
13003
13004 return wma_send_apf_read_work_memory_cmd(wma_handle, read_params);
13005}
13006#endif /* FEATURE_WLAN_APF */
13007
Arun Khandavalli2476ef52016-04-26 20:19:43 +053013008/**
Abhishek Singh1c676222016-05-09 14:20:28 +053013009 * sme_get_wni_dot11_mode() - return configured wni dot11mode
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -080013010 * @mac_handle: Opaque handle to the global MAC context
Abhishek Singh1c676222016-05-09 14:20:28 +053013011 *
13012 * Return: wni dot11 mode.
13013 */
Jeff Johnsonc7309062018-11-09 20:59:42 -080013014uint32_t sme_get_wni_dot11_mode(mac_handle_t mac_handle)
Abhishek Singh1c676222016-05-09 14:20:28 +053013015{
Jeff Johnson0a8786a2018-12-02 10:49:01 -080013016 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Abhishek Singh1c676222016-05-09 14:20:28 +053013017
13018 return csr_translate_to_wni_cfg_dot11_mode(mac_ctx,
13019 mac_ctx->roam.configParam.uCfgDot11Mode);
13020}
13021
13022/**
Manjunathappa Prakash59f861d2016-04-21 10:33:31 -070013023 * sme_create_mon_session() - post message to create PE session for monitormode
13024 * operation
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -080013025 * @mac_handle: Opaque handle to the global MAC context
Manjunathappa Prakash59f861d2016-04-21 10:33:31 -070013026 * @bssid: pointer to bssid
Rajeev Kumar Sirasanagandlae3b59912018-08-24 15:53:31 +053013027 * @vdev_id: sme session id
Manjunathappa Prakash59f861d2016-04-21 10:33:31 -070013028 *
13029 * Return: QDF_STATUS_SUCCESS on success, non-zero error code on failure.
13030 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -080013031QDF_STATUS sme_create_mon_session(mac_handle_t mac_handle, tSirMacAddr bss_id,
Rajeev Kumar Sirasanagandlae3b59912018-08-24 15:53:31 +053013032 uint8_t vdev_id)
Manjunathappa Prakash59f861d2016-04-21 10:33:31 -070013033{
13034 QDF_STATUS status = QDF_STATUS_E_FAILURE;
13035 struct sir_create_session *msg;
13036
13037 msg = qdf_mem_malloc(sizeof(*msg));
chenguo92af4bf2018-10-25 13:54:58 +080013038 if (msg) {
Manjunathappa Prakash59f861d2016-04-21 10:33:31 -070013039 msg->type = eWNI_SME_MON_INIT_SESSION;
Rajeev Kumar Sirasanagandlae3b59912018-08-24 15:53:31 +053013040 msg->vdev_id = vdev_id;
Manjunathappa Prakash59f861d2016-04-21 10:33:31 -070013041 msg->msg_len = sizeof(*msg);
13042 qdf_mem_copy(msg->bss_id.bytes, bss_id, QDF_MAC_ADDR_SIZE);
Rajeev Kumard138ac52017-01-30 18:38:37 -080013043 status = umac_send_mb_message_to_mac(msg);
Manjunathappa Prakash59f861d2016-04-21 10:33:31 -070013044 }
13045 return status;
13046}
Gupta, Kapil96c7f2f2016-04-25 19:13:41 +053013047
Jinwei Chenbdd977f2019-06-14 15:09:30 +080013048QDF_STATUS sme_delete_mon_session(mac_handle_t mac_handle, uint8_t vdev_id)
13049{
13050 QDF_STATUS status = QDF_STATUS_E_FAILURE;
13051 struct sir_delete_session *msg;
13052
13053 msg = qdf_mem_malloc(sizeof(*msg));
13054 if (msg) {
13055 msg->type = eWNI_SME_MON_DEINIT_SESSION;
13056 msg->vdev_id = vdev_id;
13057 msg->msg_len = sizeof(*msg);
13058 status = umac_send_mb_message_to_mac(msg);
13059 }
13060
13061 return status;
13062}
13063
Jeff Johnsonb460dd72018-11-08 10:26:51 -080013064void sme_set_chan_info_callback(mac_handle_t mac_handle,
Kapil Gupta4f0c0c12017-02-07 15:21:15 +053013065 void (*callback)(struct scan_chan_info *chan_info))
13066{
Jeff Johnson0a8786a2018-12-02 10:49:01 -080013067 struct mac_context *mac;
Kapil Gupta4f0c0c12017-02-07 15:21:15 +053013068
Jeff Johnson038efe72019-03-18 13:39:31 -070013069 if (!mac_handle) {
Kapil Gupta4f0c0c12017-02-07 15:21:15 +053013070 QDF_ASSERT(0);
13071 return;
13072 }
Jeff Johnsona0619e42018-11-28 17:43:00 -080013073 mac = MAC_CONTEXT(mac_handle);
Kapil Gupta4f0c0c12017-02-07 15:21:15 +053013074 mac->chan_info_cb = callback;
13075}
13076
Gupta, Kapil96c7f2f2016-04-25 19:13:41 +053013077/**
Naveen Rawata410c5a2016-09-19 14:22:33 -070013078 * sme_set_vdev_ies_per_band() - sends the per band IEs to vdev
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -080013079 * @mac_handle: Opaque handle to the global MAC context
Naveen Rawata410c5a2016-09-19 14:22:33 -070013080 * @vdev_id: vdev_id for which IE is targeted
13081 *
13082 * Return: None
13083 */
Jeff Johnsonc7309062018-11-09 20:59:42 -080013084void sme_set_vdev_ies_per_band(mac_handle_t mac_handle, uint8_t vdev_id)
Naveen Rawata410c5a2016-09-19 14:22:33 -070013085{
Naveen Rawata410c5a2016-09-19 14:22:33 -070013086 struct sir_set_vdev_ies_per_band *p_msg;
13087 QDF_STATUS status = QDF_STATUS_E_FAILURE;
13088
13089 p_msg = qdf_mem_malloc(sizeof(*p_msg));
Arif Hussain0ef77082018-10-10 16:42:53 -070013090 if (!p_msg)
Naveen Rawata410c5a2016-09-19 14:22:33 -070013091 return;
Naveen Rawata410c5a2016-09-19 14:22:33 -070013092
13093 p_msg->vdev_id = vdev_id;
13094 p_msg->msg_type = eWNI_SME_SET_VDEV_IES_PER_BAND;
13095 p_msg->len = sizeof(*p_msg);
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070013096 sme_debug("sending eWNI_SME_SET_VDEV_IES_PER_BAND: vdev_id: %d",
Naveen Rawata410c5a2016-09-19 14:22:33 -070013097 vdev_id);
Rajeev Kumard138ac52017-01-30 18:38:37 -080013098 status = umac_send_mb_message_to_mac(p_msg);
Naveen Rawata410c5a2016-09-19 14:22:33 -070013099 if (QDF_STATUS_SUCCESS != status)
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070013100 sme_err("Send eWNI_SME_SET_VDEV_IES_PER_BAND fail");
Naveen Rawata410c5a2016-09-19 14:22:33 -070013101}
13102
Kiran Kumar Lokere666bf852016-05-02 12:23:02 -070013103/**
13104 * sme_set_pdev_ht_vht_ies() - sends the set pdev IE req
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -080013105 * @mac_handle: Opaque handle to the global MAC context
Kiran Kumar Lokere666bf852016-05-02 12:23:02 -070013106 * @enable2x2: 1x1 or 2x2 mode.
13107 *
13108 * Sends the set pdev IE req with Nss value.
13109 *
13110 * Return: None
13111 */
Jeff Johnsonc7309062018-11-09 20:59:42 -080013112void sme_set_pdev_ht_vht_ies(mac_handle_t mac_handle, bool enable2x2)
Kiran Kumar Lokere666bf852016-05-02 12:23:02 -070013113{
Jeff Johnson0a8786a2018-12-02 10:49:01 -080013114 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Kiran Kumar Lokere666bf852016-05-02 12:23:02 -070013115 struct sir_set_ht_vht_cfg *ht_vht_cfg;
13116 QDF_STATUS status = QDF_STATUS_E_FAILURE;
13117
Kiran Kumar Lokere666bf852016-05-02 12:23:02 -070013118 if (!((mac_ctx->roam.configParam.uCfgDot11Mode ==
13119 eCSR_CFG_DOT11_MODE_AUTO) ||
13120 (mac_ctx->roam.configParam.uCfgDot11Mode ==
13121 eCSR_CFG_DOT11_MODE_11N) ||
13122 (mac_ctx->roam.configParam.uCfgDot11Mode ==
13123 eCSR_CFG_DOT11_MODE_11N_ONLY) ||
13124 (mac_ctx->roam.configParam.uCfgDot11Mode ==
13125 eCSR_CFG_DOT11_MODE_11AC) ||
13126 (mac_ctx->roam.configParam.uCfgDot11Mode ==
13127 eCSR_CFG_DOT11_MODE_11AC_ONLY)))
13128 return;
13129
13130 status = sme_acquire_global_lock(&mac_ctx->sme);
13131 if (QDF_STATUS_SUCCESS == status) {
13132 ht_vht_cfg = qdf_mem_malloc(sizeof(*ht_vht_cfg));
Arif Hussain0ef77082018-10-10 16:42:53 -070013133 if (!ht_vht_cfg) {
Kiran Kumar Lokere666bf852016-05-02 12:23:02 -070013134 sme_release_global_lock(&mac_ctx->sme);
13135 return;
13136 }
13137
13138 ht_vht_cfg->pdev_id = 0;
13139 if (enable2x2)
13140 ht_vht_cfg->nss = 2;
13141 else
13142 ht_vht_cfg->nss = 1;
13143 ht_vht_cfg->dot11mode =
13144 (uint8_t)csr_translate_to_wni_cfg_dot11_mode(mac_ctx,
13145 mac_ctx->roam.configParam.uCfgDot11Mode);
13146
13147 ht_vht_cfg->msg_type = eWNI_SME_PDEV_SET_HT_VHT_IE;
13148 ht_vht_cfg->len = sizeof(*ht_vht_cfg);
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070013149 sme_debug("SET_HT_VHT_IE with nss: %d, dot11mode: %d",
13150 ht_vht_cfg->nss,
13151 ht_vht_cfg->dot11mode);
Rajeev Kumard138ac52017-01-30 18:38:37 -080013152 status = umac_send_mb_message_to_mac(ht_vht_cfg);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053013153 if (QDF_STATUS_SUCCESS != status)
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070013154 sme_err("Send SME_PDEV_SET_HT_VHT_IE fail");
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053013155
Kiran Kumar Lokere666bf852016-05-02 12:23:02 -070013156 sme_release_global_lock(&mac_ctx->sme);
13157 }
Kiran Kumar Lokere666bf852016-05-02 12:23:02 -070013158}
13159
Jeff Johnsonc7309062018-11-09 20:59:42 -080013160void sme_update_vdev_type_nss(mac_handle_t mac_handle, uint8_t max_supp_nss,
gaurank kathpalia651abcd2018-11-12 22:41:23 +053013161 enum nss_chains_band_info band)
Kiran Kumar Lokere666bf852016-05-02 12:23:02 -070013162{
Jeff Johnson0a8786a2018-12-02 10:49:01 -080013163 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Kiran Kumar Lokere666bf852016-05-02 12:23:02 -070013164 struct vdev_type_nss *vdev_nss;
13165
gaurank kathpalia651abcd2018-11-12 22:41:23 +053013166 struct wlan_mlme_nss_chains *nss_chains_ini_cfg =
13167 &mac_ctx->mlme_cfg->nss_chains_ini_cfg;
13168
13169 if (band == NSS_CHAINS_BAND_5GHZ)
Kiran Kumar Lokere666bf852016-05-02 12:23:02 -070013170 vdev_nss = &mac_ctx->vdev_type_nss_5g;
13171 else
13172 vdev_nss = &mac_ctx->vdev_type_nss_2g;
13173
gaurank kathpalia651abcd2018-11-12 22:41:23 +053013174 vdev_nss->sta = QDF_MIN(max_supp_nss, GET_VDEV_NSS_CHAIN(
13175 nss_chains_ini_cfg->
gaurank kathpalia42911082019-01-22 17:39:49 +053013176 rx_nss[band],
gaurank kathpalia651abcd2018-11-12 22:41:23 +053013177 STA_NSS_CHAINS_SHIFT));
13178 vdev_nss->sap = QDF_MIN(max_supp_nss, GET_VDEV_NSS_CHAIN(
13179 nss_chains_ini_cfg->
gaurank kathpalia42911082019-01-22 17:39:49 +053013180 rx_nss[band],
gaurank kathpalia651abcd2018-11-12 22:41:23 +053013181 SAP_NSS_CHAINS_SHIFT));
13182 vdev_nss->p2p_go = QDF_MIN(max_supp_nss, GET_VDEV_NSS_CHAIN(
13183 nss_chains_ini_cfg->
gaurank kathpalia42911082019-01-22 17:39:49 +053013184 rx_nss[band],
gaurank kathpalia651abcd2018-11-12 22:41:23 +053013185 P2P_GO_NSS_CHAINS_SHIFT));
13186 vdev_nss->p2p_cli = QDF_MIN(max_supp_nss, GET_VDEV_NSS_CHAIN(
13187 nss_chains_ini_cfg->
gaurank kathpalia42911082019-01-22 17:39:49 +053013188 rx_nss[band],
gaurank kathpalia651abcd2018-11-12 22:41:23 +053013189 P2P_CLI_CHAINS_SHIFT));
13190 vdev_nss->p2p_dev = QDF_MIN(max_supp_nss, GET_VDEV_NSS_CHAIN(
13191 nss_chains_ini_cfg->
gaurank kathpalia42911082019-01-22 17:39:49 +053013192 rx_nss[band],
gaurank kathpalia651abcd2018-11-12 22:41:23 +053013193 P2P_DEV_NSS_CHAINS_SHIFT));
13194 vdev_nss->ibss = QDF_MIN(max_supp_nss, GET_VDEV_NSS_CHAIN(
13195 nss_chains_ini_cfg->
gaurank kathpalia42911082019-01-22 17:39:49 +053013196 rx_nss[band],
gaurank kathpalia651abcd2018-11-12 22:41:23 +053013197 IBSS_NSS_CHAINS_SHIFT));
13198 vdev_nss->tdls = QDF_MIN(max_supp_nss, GET_VDEV_NSS_CHAIN(
13199 nss_chains_ini_cfg->
gaurank kathpalia42911082019-01-22 17:39:49 +053013200 rx_nss[band],
gaurank kathpalia651abcd2018-11-12 22:41:23 +053013201 TDLS_NSS_CHAINS_SHIFT));
13202 vdev_nss->ocb = QDF_MIN(max_supp_nss, GET_VDEV_NSS_CHAIN(
13203 nss_chains_ini_cfg->
gaurank kathpalia42911082019-01-22 17:39:49 +053013204 rx_nss[band],
gaurank kathpalia651abcd2018-11-12 22:41:23 +053013205 OCB_NSS_CHAINS_SHIFT));
Nachiket Kukadecf941602018-12-12 14:32:35 +053013206 vdev_nss->nan = QDF_MIN(max_supp_nss, GET_VDEV_NSS_CHAIN(
13207 nss_chains_ini_cfg->
gaurank kathpalia42911082019-01-22 17:39:49 +053013208 rx_nss[band],
Nachiket Kukadecf941602018-12-12 14:32:35 +053013209 NAN_NSS_CHAIN_SHIFT));
Nachiket Kukade413c5fa2019-02-19 17:57:19 +053013210 vdev_nss->ndi = QDF_MIN(max_supp_nss, GET_VDEV_NSS_CHAIN(
13211 nss_chains_ini_cfg->
13212 rx_nss[band],
13213 NAN_NSS_CHAIN_SHIFT));
Kiran Kumar Lokere666bf852016-05-02 12:23:02 -070013214
Nachiket Kukadecf941602018-12-12 14:32:35 +053013215 sme_debug("band %d NSS:sta %d sap %d cli %d go %d dev %d ibss %d tdls %d ocb %d nan %d",
13216 band, vdev_nss->sta, vdev_nss->sap, vdev_nss->p2p_cli,
13217 vdev_nss->p2p_go, vdev_nss->p2p_dev, vdev_nss->ibss,
13218 vdev_nss->tdls, vdev_nss->ocb, vdev_nss->nan);
Kiran Kumar Lokere666bf852016-05-02 12:23:02 -070013219}
Peng Xu8fdaa492016-06-22 10:20:47 -070013220
Kiran Kumar Lokeree6476b22017-10-16 23:40:32 -070013221#ifdef WLAN_FEATURE_11AX_BSS_COLOR
13222#define MAX_BSS_COLOR_VAL 63
13223#define MIN_BSS_COLOR_VAL 1
13224
Jeff Johnsonc7309062018-11-09 20:59:42 -080013225QDF_STATUS sme_set_he_bss_color(mac_handle_t mac_handle, uint8_t session_id,
13226 uint8_t bss_color)
Kiran Kumar Lokeree6476b22017-10-16 23:40:32 -070013227
13228{
13229 struct sir_set_he_bss_color *bss_color_msg;
13230 uint8_t len;
13231
Jeff Johnsonc7309062018-11-09 20:59:42 -080013232 if (!mac_handle) {
13233 sme_err("Invalid mac_handle pointer");
Kiran Kumar Lokeree6476b22017-10-16 23:40:32 -070013234 return QDF_STATUS_E_FAULT;
13235 }
13236
13237 sme_debug("Set HE bss_color %d", bss_color);
13238
13239 if (bss_color < MIN_BSS_COLOR_VAL || bss_color > MAX_BSS_COLOR_VAL) {
13240 sme_debug("Invalid HE bss_color %d", bss_color);
13241 return QDF_STATUS_E_INVAL;
13242 }
13243 len = sizeof(*bss_color_msg);
13244 bss_color_msg = qdf_mem_malloc(len);
Arif Hussain0ef77082018-10-10 16:42:53 -070013245 if (!bss_color_msg)
Kiran Kumar Lokeree6476b22017-10-16 23:40:32 -070013246 return QDF_STATUS_E_NOMEM;
Arif Hussain0ef77082018-10-10 16:42:53 -070013247
Kiran Kumar Lokeree6476b22017-10-16 23:40:32 -070013248 bss_color_msg->message_type = eWNI_SME_SET_HE_BSS_COLOR;
13249 bss_color_msg->length = len;
Abhishek Singhefe21e62019-09-20 10:03:24 +053013250 bss_color_msg->vdev_id = session_id;
Kiran Kumar Lokeree6476b22017-10-16 23:40:32 -070013251 bss_color_msg->bss_color = bss_color;
13252 return umac_send_mb_message_to_mac(bss_color_msg);
13253}
13254#endif
13255
Rachit Kankane026e77a2018-07-31 16:21:09 +053013256#ifdef FEATURE_P2P_LISTEN_OFFLOAD
Nitesh Shahdb5ea0d2017-03-22 15:17:47 +053013257/**
Peng Xu8fdaa492016-06-22 10:20:47 -070013258 * sme_register_p2p_lo_event() - Register for the p2p lo event
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -080013259 * @mac_handle: Opaque handle to the global MAC context
Peng Xu8fdaa492016-06-22 10:20:47 -070013260 * @context: the context of the call
13261 * @callback: the callback to hdd
13262 *
13263 * This function registers the callback function for P2P listen
13264 * offload stop event.
13265 *
13266 * Return: none
13267 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -080013268void sme_register_p2p_lo_event(mac_handle_t mac_handle, void *context,
Jeff Johnsonf7e36d62018-07-04 21:14:02 -070013269 p2p_lo_callback callback)
Peng Xu8fdaa492016-06-22 10:20:47 -070013270{
Jeff Johnson0a8786a2018-12-02 10:49:01 -080013271 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Peng Xu8fdaa492016-06-22 10:20:47 -070013272 QDF_STATUS status = QDF_STATUS_E_FAILURE;
13273
Jeff Johnson01f2c232018-11-21 19:17:44 -080013274 status = sme_acquire_global_lock(&mac->sme);
13275 mac->sme.p2p_lo_event_callback = callback;
13276 mac->sme.p2p_lo_event_context = context;
13277 sme_release_global_lock(&mac->sme);
Peng Xu8fdaa492016-06-22 10:20:47 -070013278}
Rachit Kankane026e77a2018-07-31 16:21:09 +053013279#endif
Manjeet Singhf82ed072016-07-08 11:40:00 +053013280
13281/**
13282 * sme_process_mac_pwr_dbg_cmd() - enable mac pwr debugging
Jeff Johnsonc7309062018-11-09 20:59:42 -080013283 * @mac_handle: The handle returned by macOpen
Manjeet Singhf82ed072016-07-08 11:40:00 +053013284 * @session_id: session id
13285 * @dbg_args: args for mac pwr debug command
13286 * Return: Return QDF_STATUS, otherwise appropriate failure code
13287 */
Jeff Johnsonc7309062018-11-09 20:59:42 -080013288QDF_STATUS sme_process_mac_pwr_dbg_cmd(mac_handle_t mac_handle,
13289 uint32_t session_id,
13290 struct sir_mac_pwr_dbg_cmd *dbg_args)
Manjeet Singhf82ed072016-07-08 11:40:00 +053013291{
Rajeev Kumar37d478b2017-04-17 16:59:28 -070013292 struct scheduler_msg message = {0};
Jeff Johnson0a8786a2018-12-02 10:49:01 -080013293 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Manjeet Singhf82ed072016-07-08 11:40:00 +053013294 struct sir_mac_pwr_dbg_cmd *req;
13295 int i;
13296
13297 if (!CSR_IS_SESSION_VALID(mac_ctx, session_id)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070013298 sme_err("CSR session not valid: %d", session_id);
Manjeet Singhf82ed072016-07-08 11:40:00 +053013299 return QDF_STATUS_E_FAILURE;
13300 }
13301
13302 req = qdf_mem_malloc(sizeof(*req));
Arif Hussain0ef77082018-10-10 16:42:53 -070013303 if (!req)
Manjeet Singhf82ed072016-07-08 11:40:00 +053013304 return QDF_STATUS_E_FAILURE;
Arif Hussain0ef77082018-10-10 16:42:53 -070013305
Manjeet Singhf82ed072016-07-08 11:40:00 +053013306 req->module_id = dbg_args->module_id;
13307 req->pdev_id = dbg_args->pdev_id;
13308 req->num_args = dbg_args->num_args;
13309 for (i = 0; i < req->num_args; i++)
13310 req->args[i] = dbg_args->args[i];
13311
13312 message.type = SIR_HAL_POWER_DBG_CMD;
13313 message.bodyptr = req;
13314
gaurank kathpalia36b0c582018-08-28 17:45:43 +053013315 if (!QDF_IS_STATUS_SUCCESS(scheduler_post_message(QDF_MODULE_ID_SME,
13316 QDF_MODULE_ID_WMA,
13317 QDF_MODULE_ID_WMA,
13318 &message))) {
Manjeet Singhf82ed072016-07-08 11:40:00 +053013319 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
13320 "%s: Not able to post msg to WDA!",
13321 __func__);
13322 qdf_mem_free(req);
13323 }
13324 return QDF_STATUS_SUCCESS;
13325}
Tushnim Bhattacharyyaf44a9d82016-07-05 10:52:06 -070013326/**
13327 * sme_get_vdev_type_nss() - gets the nss per vdev type
Tushnim Bhattacharyyaf44a9d82016-07-05 10:52:06 -070013328 * @dev_mode: connection type.
13329 * @nss2g: Pointer to the 2G Nss parameter.
13330 * @nss5g: Pointer to the 5G Nss parameter.
13331 *
13332 * Fills the 2G and 5G Nss values based on connection type.
13333 *
13334 * Return: None
13335 */
Jeff Johnsonc1e62782017-11-09 09:50:17 -080013336void sme_get_vdev_type_nss(enum QDF_OPMODE dev_mode,
13337 uint8_t *nss_2g, uint8_t *nss_5g)
Tushnim Bhattacharyyaf44a9d82016-07-05 10:52:06 -070013338{
Arun Kumar Khandavalli4f6a5bd2019-10-23 16:01:15 +053013339 csr_get_vdev_type_nss(dev_mode, nss_2g, nss_5g);
Tushnim Bhattacharyyaf44a9d82016-07-05 10:52:06 -070013340}
Agrawal Ashish21ba2572016-09-03 16:40:10 +053013341
13342/**
13343 * sme_update_sta_roam_policy() - update sta roam policy for
13344 * unsafe and DFS channels.
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -080013345 * @mac_handle: Opaque handle to the global MAC context
Agrawal Ashish21ba2572016-09-03 16:40:10 +053013346 * @dfs_mode: dfs mode which tell if dfs channel needs to be
13347 * skipped or not
13348 * @skip_unsafe_channels: Param to tell if driver needs to
13349 * skip unsafe channels or not.
Abhishek Singh345be412019-11-19 10:59:29 +053013350 * @vdev_id: vdev_id
Agrawal, Ashish9f84c402016-11-30 16:19:44 +053013351 * @sap_operating_band: Band on which SAP is operating
Agrawal Ashish21ba2572016-09-03 16:40:10 +053013352 *
13353 * sme_update_sta_roam_policy update sta rome policies to csr
13354 * this function will call csrUpdateChannelList as well
13355 * to include/exclude DFS channels and unsafe channels.
13356 *
13357 * Return: eHAL_STATUS_SUCCESS or non-zero on failure.
13358 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -080013359QDF_STATUS sme_update_sta_roam_policy(mac_handle_t mac_handle,
Jeff Johnsonc7309062018-11-09 20:59:42 -080013360 enum sta_roam_policy_dfs_mode dfs_mode,
13361 bool skip_unsafe_channels,
Abhishek Singh345be412019-11-19 10:59:29 +053013362 uint8_t vdev_id,
Jeff Johnsonc7309062018-11-09 20:59:42 -080013363 uint8_t sap_operating_band)
Agrawal Ashish21ba2572016-09-03 16:40:10 +053013364{
Jeff Johnson0a8786a2018-12-02 10:49:01 -080013365 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Agrawal Ashish21ba2572016-09-03 16:40:10 +053013366 QDF_STATUS status = QDF_STATUS_SUCCESS;
Jeff Johnson46b4f0e2019-03-08 10:48:35 -080013367 struct sme_config_params *sme_config;
Agrawal Ashish21ba2572016-09-03 16:40:10 +053013368
13369 if (!mac_ctx) {
13370 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_FATAL,
13371 "%s: mac_ctx is null", __func__);
13372 return QDF_STATUS_E_FAILURE;
13373 }
Agrawal Ashish21ba2572016-09-03 16:40:10 +053013374
Sridhar Selvaraj48c47092017-07-31 18:18:14 +053013375 sme_config = qdf_mem_malloc(sizeof(*sme_config));
Arif Hussain0ef77082018-10-10 16:42:53 -070013376 if (!sme_config)
Sridhar Selvaraj48c47092017-07-31 18:18:14 +053013377 return QDF_STATUS_E_FAILURE;
Arif Hussain0ef77082018-10-10 16:42:53 -070013378
Sridhar Selvaraj48c47092017-07-31 18:18:14 +053013379 qdf_mem_zero(sme_config, sizeof(*sme_config));
Jeff Johnsonb460dd72018-11-08 10:26:51 -080013380 sme_get_config_param(mac_handle, sme_config);
Sridhar Selvaraj48c47092017-07-31 18:18:14 +053013381
Jeff Johnsone94ccd02019-04-02 15:02:56 -070013382 sme_config->csr_config.sta_roam_policy_params.dfs_mode =
Agrawal Ashish21ba2572016-09-03 16:40:10 +053013383 dfs_mode;
Jeff Johnsone94ccd02019-04-02 15:02:56 -070013384 sme_config->csr_config.sta_roam_policy_params.skip_unsafe_channels =
Agrawal Ashish21ba2572016-09-03 16:40:10 +053013385 skip_unsafe_channels;
Jeff Johnsone94ccd02019-04-02 15:02:56 -070013386 sme_config->csr_config.sta_roam_policy_params.sap_operating_band =
Agrawal, Ashish9f84c402016-11-30 16:19:44 +053013387 sap_operating_band;
Agrawal Ashish21ba2572016-09-03 16:40:10 +053013388
Jeff Johnsonb460dd72018-11-08 10:26:51 -080013389 sme_update_config(mac_handle, sme_config);
Agrawal Ashish21ba2572016-09-03 16:40:10 +053013390
13391 status = csr_update_channel_list(mac_ctx);
13392 if (QDF_STATUS_SUCCESS != status) {
13393 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
13394 FL("failed to update the supported channel list"));
13395 }
Vignesh Viswanathan4e65e8e2018-05-01 12:04:16 +053013396
Wu Gao51a63562018-11-08 16:29:10 +080013397 if (mac_ctx->mlme_cfg->lfr.roam_scan_offload_enabled) {
Vignesh Viswanathan4e65e8e2018-05-01 12:04:16 +053013398 status = sme_acquire_global_lock(&mac_ctx->sme);
13399 if (QDF_IS_STATUS_SUCCESS(status)) {
Abhishek Singh345be412019-11-19 10:59:29 +053013400 csr_roam_update_cfg(mac_ctx, vdev_id,
Abhinav Kumar523ca372019-08-30 16:28:19 +053013401 REASON_ROAM_SCAN_STA_ROAM_POLICY_CHANGED);
Vignesh Viswanathan4e65e8e2018-05-01 12:04:16 +053013402 sme_release_global_lock(&mac_ctx->sme);
Vignesh Viswanathan4e65e8e2018-05-01 12:04:16 +053013403 }
13404 }
Sridhar Selvaraj48c47092017-07-31 18:18:14 +053013405 qdf_mem_free(sme_config);
Selvaraj, Sridharebda0f22016-08-29 16:05:23 +053013406 return status;
13407}
13408
13409/**
13410 * sme_enable_disable_chanavoidind_event - configure ca event ind
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -080013411 * @mac_handle: Opaque handle to the global MAC context
Selvaraj, Sridharebda0f22016-08-29 16:05:23 +053013412 * @set_value: enable/disable
13413 *
13414 * function to enable/disable chan avoidance indication
13415 *
13416 * Return: QDF_STATUS
13417 */
Jeff Johnsonc7309062018-11-09 20:59:42 -080013418QDF_STATUS sme_enable_disable_chanavoidind_event(mac_handle_t mac_handle,
13419 uint8_t set_value)
Selvaraj, Sridharebda0f22016-08-29 16:05:23 +053013420{
13421 QDF_STATUS status;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080013422 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Rajeev Kumar37d478b2017-04-17 16:59:28 -070013423 struct scheduler_msg msg = {0};
Selvaraj, Sridharebda0f22016-08-29 16:05:23 +053013424
Vignesh Viswanathana1f3a1a2018-10-04 13:10:46 +053013425 if (!mac_ctx->mlme_cfg->gen.optimize_ca_event) {
Arun Kumar Khandavallida60bb12020-01-20 11:58:58 +053013426 sme_debug("optimize_ca_event not enabled in ini");
Vignesh Viswanathana1f3a1a2018-10-04 13:10:46 +053013427 return QDF_STATUS_E_NOSUPPORT;
13428 }
13429
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070013430 sme_debug("set_value: %d", set_value);
Selvaraj, Sridharebda0f22016-08-29 16:05:23 +053013431 status = sme_acquire_global_lock(&mac_ctx->sme);
13432 if (QDF_STATUS_SUCCESS == status) {
Rajeev Kumar8eaedf62017-01-21 11:03:13 -080013433 qdf_mem_zero(&msg, sizeof(struct scheduler_msg));
Selvaraj, Sridharebda0f22016-08-29 16:05:23 +053013434 msg.type = WMA_SEND_FREQ_RANGE_CONTROL_IND;
13435 msg.bodyval = set_value;
gaurank kathpalia36b0c582018-08-28 17:45:43 +053013436 status = scheduler_post_message(QDF_MODULE_ID_SME,
13437 QDF_MODULE_ID_WMA,
13438 QDF_MODULE_ID_WMA, &msg);
Selvaraj, Sridharebda0f22016-08-29 16:05:23 +053013439 sme_release_global_lock(&mac_ctx->sme);
13440 return status;
13441 }
Deepak Dhamdhereb106ae52016-08-10 20:55:30 +053013442 return status;
13443}
Agrawal Ashish21ba2572016-09-03 16:40:10 +053013444
Deepak Dhamdhereb106ae52016-08-10 20:55:30 +053013445/*
13446 * sme_set_default_scan_ie() - API to send default scan IE to LIM
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -080013447 * @mac_handle: Opaque handle to the global MAC context
Deepak Dhamdhereb106ae52016-08-10 20:55:30 +053013448 * @session_id: current session ID
13449 * @ie_data: Pointer to Scan IE data
13450 * @ie_len: Length of @ie_data
13451 *
13452 * Return: QDF_STATUS
13453 */
Jeff Johnsonc7309062018-11-09 20:59:42 -080013454QDF_STATUS sme_set_default_scan_ie(mac_handle_t mac_handle, uint16_t session_id,
13455 uint8_t *ie_data, uint16_t ie_len)
Deepak Dhamdhereb106ae52016-08-10 20:55:30 +053013456{
13457 QDF_STATUS status;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080013458 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Deepak Dhamdhereb106ae52016-08-10 20:55:30 +053013459 struct hdd_default_scan_ie *set_ie_params;
13460
Rajeev Kumar5d17dd52017-12-19 16:17:42 -080013461 if (!ie_data)
13462 return QDF_STATUS_E_INVAL;
13463
Deepak Dhamdhereb106ae52016-08-10 20:55:30 +053013464 status = sme_acquire_global_lock(&mac_ctx->sme);
13465 if (QDF_IS_STATUS_SUCCESS(status)) {
13466 set_ie_params = qdf_mem_malloc(sizeof(*set_ie_params));
13467 if (!set_ie_params)
13468 status = QDF_STATUS_E_NOMEM;
13469 else {
13470 set_ie_params->message_type = eWNI_SME_DEFAULT_SCAN_IE;
13471 set_ie_params->length = sizeof(*set_ie_params);
Abhishek Singhefe21e62019-09-20 10:03:24 +053013472 set_ie_params->vdev_id = session_id;
Deepak Dhamdhereb106ae52016-08-10 20:55:30 +053013473 set_ie_params->ie_len = ie_len;
13474 qdf_mem_copy(set_ie_params->ie_data, ie_data, ie_len);
Rajeev Kumard138ac52017-01-30 18:38:37 -080013475 status = umac_send_mb_message_to_mac(set_ie_params);
Deepak Dhamdhereb106ae52016-08-10 20:55:30 +053013476 }
13477 sme_release_global_lock(&mac_ctx->sme);
13478 }
Agrawal Ashish21ba2572016-09-03 16:40:10 +053013479 return status;
13480}
Padma, Santhosh Kumard7cc0792016-06-28 18:54:12 +053013481
Jeff Johnsonc7309062018-11-09 20:59:42 -080013482QDF_STATUS sme_get_sar_power_limits(mac_handle_t mac_handle,
Jeff Johnsonf0e54b02017-12-18 15:22:25 -080013483 wma_sar_cb callback, void *context)
13484{
13485 void *wma_handle;
13486
13487 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
13488 if (!wma_handle) {
13489 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
13490 "wma handle is NULL");
13491 return QDF_STATUS_E_FAILURE;
13492 }
13493
13494 return wma_get_sar_limit(wma_handle, callback, context);
13495}
13496
Jeff Johnsonc7309062018-11-09 20:59:42 -080013497QDF_STATUS sme_set_sar_power_limits(mac_handle_t mac_handle,
Kabilan Kannan3c0a7352016-12-02 18:49:38 -080013498 struct sar_limit_cmd_params *sar_limit_cmd)
13499{
13500 void *wma_handle;
13501
13502 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
13503 if (!wma_handle) {
13504 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
13505 "wma handle is NULL");
13506 return QDF_STATUS_E_FAILURE;
13507 }
13508
13509 return wma_set_sar_limit(wma_handle, sar_limit_cmd);
13510}
13511
Dundi Raviteja3b637092018-09-12 13:42:50 +053013512QDF_STATUS sme_send_coex_config_cmd(struct coex_config_params *coex_cfg_params)
13513{
13514 void *wma_handle;
13515
13516 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
13517 if (!wma_handle) {
13518 sme_err("wma handle is NULL");
13519 return QDF_STATUS_E_FAILURE;
13520 }
13521 return wma_send_coex_config_cmd(wma_handle, coex_cfg_params);
13522}
13523
Jeff Johnson6136fb92017-03-30 15:21:49 -070013524#ifdef WLAN_FEATURE_FIPS
Jeff Johnsonc7309062018-11-09 20:59:42 -080013525QDF_STATUS sme_fips_request(mac_handle_t mac_handle, struct fips_params *param,
Jeff Johnson6136fb92017-03-30 15:21:49 -070013526 wma_fips_cb callback, void *context)
13527{
13528 void *wma_handle;
13529
13530 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
13531 if (!wma_handle) {
13532 sme_err("wma handle is NULL");
13533 return QDF_STATUS_E_FAILURE;
13534 }
13535
13536 return wma_fips_request(wma_handle, param, callback, context);
13537}
13538#endif
13539
Jeff Johnsonb460dd72018-11-08 10:26:51 -080013540QDF_STATUS sme_set_cts2self_for_p2p_go(mac_handle_t mac_handle)
Agrawal Ashishb2d1a452016-05-05 12:23:58 +053013541{
Agrawal Ashishb2d1a452016-05-05 12:23:58 +053013542 void *wma_handle;
13543
13544 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
13545 if (!wma_handle) {
13546 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
13547 "wma_handle is NULL");
13548 return QDF_STATUS_E_FAILURE;
13549 }
Agrawal Ashishb2d1a452016-05-05 12:23:58 +053013550 if (QDF_STATUS_SUCCESS !=
13551 wma_set_cts2self_for_p2p_go(wma_handle, true)) {
13552 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
13553 "%s: Failed to set cts2self for p2p GO to firmware",
13554 __func__);
13555 return QDF_STATUS_E_FAILURE;
13556 }
13557 return QDF_STATUS_SUCCESS;
13558}
Yingying Tang95409972016-10-20 15:16:15 +080013559
Agrawal, Ashish35b251d2016-09-08 19:21:03 +053013560/**
13561 * sme_update_tx_fail_cnt_threshold() - update tx fail count Threshold
Jeff Johnsonb460dd72018-11-08 10:26:51 -080013562 * @mac_handle: Handle returned by mac_open
Agrawal, Ashish35b251d2016-09-08 19:21:03 +053013563 * @session_id: Session ID on which tx fail count needs to be updated to FW
13564 * @tx_fail_count: Count for tx fail threshold after which FW will disconnect
13565 *
13566 * This function is used to set tx fail count threshold to firmware.
13567 * firmware will issue disocnnect with peer device once this threshold is
13568 * reached.
13569 *
13570 * Return: Return QDF_STATUS, otherwise appropriate failure code
13571 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -080013572QDF_STATUS sme_update_tx_fail_cnt_threshold(mac_handle_t mac_handle,
Jeff Johnsonc7309062018-11-09 20:59:42 -080013573 uint8_t session_id,
13574 uint32_t tx_fail_count)
Agrawal, Ashish35b251d2016-09-08 19:21:03 +053013575{
Agrawal, Ashish35b251d2016-09-08 19:21:03 +053013576 QDF_STATUS status = QDF_STATUS_E_FAILURE;
13577 struct sme_tx_fail_cnt_threshold *tx_fail_cnt;
Rajeev Kumar37d478b2017-04-17 16:59:28 -070013578 struct scheduler_msg msg = {0};
Agrawal, Ashish35b251d2016-09-08 19:21:03 +053013579
13580 tx_fail_cnt = qdf_mem_malloc(sizeof(*tx_fail_cnt));
Arif Hussain0ef77082018-10-10 16:42:53 -070013581 if (!tx_fail_cnt)
Agrawal, Ashish35b251d2016-09-08 19:21:03 +053013582 return QDF_STATUS_E_FAILURE;
Arif Hussain0ef77082018-10-10 16:42:53 -070013583
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070013584 sme_debug("session_id: %d tx_fail_count: %d",
13585 session_id, tx_fail_count);
Agrawal, Ashish35b251d2016-09-08 19:21:03 +053013586 tx_fail_cnt->session_id = session_id;
13587 tx_fail_cnt->tx_fail_cnt_threshold = tx_fail_count;
13588
Rajeev Kumar8eaedf62017-01-21 11:03:13 -080013589 qdf_mem_zero(&msg, sizeof(struct scheduler_msg));
Agrawal, Ashish35b251d2016-09-08 19:21:03 +053013590 msg.type = SIR_HAL_UPDATE_TX_FAIL_CNT_TH;
13591 msg.reserved = 0;
13592 msg.bodyptr = tx_fail_cnt;
gaurank kathpalia36b0c582018-08-28 17:45:43 +053013593 status = scheduler_post_message(QDF_MODULE_ID_SME,
13594 QDF_MODULE_ID_WMA,
13595 QDF_MODULE_ID_WMA, &msg);
Agrawal, Ashish35b251d2016-09-08 19:21:03 +053013596
13597 if (!QDF_IS_STATUS_SUCCESS(status)) {
13598 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053013599 FL("Not able to post Tx fail count message to WDA"));
Agrawal, Ashish35b251d2016-09-08 19:21:03 +053013600 qdf_mem_free(tx_fail_cnt);
13601 }
Sreelakshmi Konamki58c72432016-11-09 17:06:44 +053013602 return status;
13603}
Agrawal, Ashish35b251d2016-09-08 19:21:03 +053013604
Jeff Johnsondc198ec2018-07-04 17:39:53 -070013605QDF_STATUS sme_set_lost_link_info_cb(mac_handle_t mac_handle,
13606 lost_link_info_cb cb)
Sreelakshmi Konamki58c72432016-11-09 17:06:44 +053013607{
Jeff Johnsondc198ec2018-07-04 17:39:53 -070013608 QDF_STATUS status;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080013609 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Sreelakshmi Konamki58c72432016-11-09 17:06:44 +053013610
13611 status = sme_acquire_global_lock(&mac->sme);
13612 if (QDF_IS_STATUS_SUCCESS(status)) {
13613 mac->sme.lost_link_info_cb = cb;
13614 sme_release_global_lock(&mac->sme);
Sreelakshmi Konamki58c72432016-11-09 17:06:44 +053013615 }
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053013616
Agrawal, Ashish35b251d2016-09-08 19:21:03 +053013617 return status;
13618}
Yingying Tang95409972016-10-20 15:16:15 +080013619
yeshwanth sriram guntukaa1ba9a22017-02-28 16:17:32 +053013620#ifdef FEATURE_WLAN_ESE
Jeff Johnson172237b2017-11-07 15:32:59 -080013621bool sme_roam_is_ese_assoc(struct csr_roam_info *roam_info)
yeshwanth sriram guntukaa1ba9a22017-02-28 16:17:32 +053013622{
13623 return roam_info->isESEAssoc;
13624}
Manjeet Singh2f785062017-03-08 18:14:18 +053013625#endif
yeshwanth sriram guntukaa1ba9a22017-02-28 16:17:32 +053013626
Jeff Johnsond5fb2db2018-11-08 14:20:28 -080013627bool sme_neighbor_roam_is11r_assoc(mac_handle_t mac_handle, uint8_t session_id)
yeshwanth sriram guntukaa1ba9a22017-02-28 16:17:32 +053013628{
Jeff Johnson0a8786a2018-12-02 10:49:01 -080013629 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053013630
yeshwanth sriram guntukaa1ba9a22017-02-28 16:17:32 +053013631 return csr_neighbor_roam_is11r_assoc(mac_ctx, session_id);
13632}
Yingying Tang95409972016-10-20 15:16:15 +080013633
13634#ifdef WLAN_FEATURE_WOW_PULSE
13635/**
13636 * sme_set_wow_pulse() - set wow pulse info
13637 * @wow_pulse_set_info: wow_pulse_mode structure pointer
13638 *
13639 * Return: QDF_STATUS
13640 */
13641QDF_STATUS sme_set_wow_pulse(struct wow_pulse_mode *wow_pulse_set_info)
13642{
Rajeev Kumar37d478b2017-04-17 16:59:28 -070013643 struct scheduler_msg message = {0};
Yingying Tang95409972016-10-20 15:16:15 +080013644 QDF_STATUS status;
13645 struct wow_pulse_mode *wow_pulse_set_cmd;
13646
13647 if (!wow_pulse_set_info) {
13648 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
13649 "%s: invalid wow_pulse_set_info pointer", __func__);
13650 return QDF_STATUS_E_FAILURE;
13651 }
13652
13653 wow_pulse_set_cmd = qdf_mem_malloc(sizeof(*wow_pulse_set_cmd));
Arif Hussain0ef77082018-10-10 16:42:53 -070013654 if (!wow_pulse_set_cmd)
Yingying Tang95409972016-10-20 15:16:15 +080013655 return QDF_STATUS_E_NOMEM;
Yingying Tang95409972016-10-20 15:16:15 +080013656
13657 *wow_pulse_set_cmd = *wow_pulse_set_info;
13658
13659 message.type = WMA_SET_WOW_PULSE_CMD;
13660 message.bodyptr = wow_pulse_set_cmd;
gaurank kathpalia36b0c582018-08-28 17:45:43 +053013661 status = scheduler_post_message(QDF_MODULE_ID_SME,
13662 QDF_MODULE_ID_WMA,
13663 QDF_MODULE_ID_WMA,
Yingying Tang95409972016-10-20 15:16:15 +080013664 &message);
13665 if (!QDF_IS_STATUS_SUCCESS(status)) {
13666 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
13667 "%s: Not able to post msg to WDA!",
13668 __func__);
13669 qdf_mem_free(wow_pulse_set_cmd);
13670 status = QDF_STATUS_E_FAILURE;
13671 }
13672
13673 return status;
13674}
13675#endif
Naveen Rawat664a7cb2017-01-19 17:58:14 -080013676
13677/**
13678 * sme_prepare_beacon_from_bss_descp() - prepares beacon frame by populating
13679 * different fields and IEs from bss descriptor.
13680 * @frame_buf: frame buffer to populate
13681 * @bss_descp: bss descriptor
13682 * @bssid: bssid of the beacon frame to populate
13683 * @ie_len: length of IE fields
13684 *
13685 * Return: None
13686 */
13687static void sme_prepare_beacon_from_bss_descp(uint8_t *frame_buf,
Pragaspathi Thilagaraj1112c962019-05-23 23:45:38 +053013688 struct bss_description *bss_descp,
Naveen Rawat664a7cb2017-01-19 17:58:14 -080013689 const tSirMacAddr bssid,
Naveen Rawat6dabf4e2017-02-08 15:55:49 -080013690 uint32_t ie_len)
Naveen Rawat664a7cb2017-01-19 17:58:14 -080013691{
13692 tDot11fBeacon1 *bcn_fixed;
13693 tpSirMacMgmtHdr mac_hdr = (tpSirMacMgmtHdr)frame_buf;
13694
13695 /* populate mac header first to indicate beacon */
13696 mac_hdr->fc.protVer = SIR_MAC_PROTOCOL_VERSION;
13697 mac_hdr->fc.type = SIR_MAC_MGMT_FRAME;
13698 mac_hdr->fc.subType = SIR_MAC_MGMT_BEACON;
13699 qdf_mem_copy((uint8_t *) mac_hdr->da,
13700 (uint8_t *) "\xFF\xFF\xFF\xFF\xFF\xFF",
13701 sizeof(struct qdf_mac_addr));
13702 qdf_mem_copy((uint8_t *) mac_hdr->sa, bssid,
13703 sizeof(struct qdf_mac_addr));
13704 qdf_mem_copy((uint8_t *) mac_hdr->bssId, bssid,
13705 sizeof(struct qdf_mac_addr));
13706
13707 /* now populate fixed params */
13708 bcn_fixed = (tDot11fBeacon1 *)(frame_buf + SIR_MAC_HDR_LEN_3A);
13709 /* populate timestamp */
13710 qdf_mem_copy(&bcn_fixed->TimeStamp.timestamp, &bss_descp->timeStamp,
13711 sizeof(bss_descp->timeStamp));
13712 /* populate beacon interval */
13713 bcn_fixed->BeaconInterval.interval = bss_descp->beaconInterval;
13714 /* populate capability */
13715 qdf_mem_copy(&bcn_fixed->Capabilities, &bss_descp->capabilityInfo,
13716 sizeof(bss_descp->capabilityInfo));
13717
13718 /* copy IEs now */
13719 qdf_mem_copy(frame_buf + SIR_MAC_HDR_LEN_3A
13720 + SIR_MAC_B_PR_SSID_OFFSET,
13721 &bss_descp->ieFields, ie_len);
13722}
13723
Jeff Johnsonc7309062018-11-09 20:59:42 -080013724QDF_STATUS sme_get_rssi_snr_by_bssid(mac_handle_t mac_handle,
13725 struct csr_roam_profile *profile,
13726 const uint8_t *bssid,
13727 int8_t *rssi, int8_t *snr)
Hanumanth Reddy Pothula90051782017-05-04 22:14:43 +053013728{
Pragaspathi Thilagaraj1112c962019-05-23 23:45:38 +053013729 struct bss_description *bss_descp;
Abhishek Amburec5151392019-10-14 12:15:24 +053013730 struct scan_filter *scan_filter;
Hanumanth Reddy Pothula90051782017-05-04 22:14:43 +053013731 struct scan_result_list *bss_list;
13732 tScanResultHandle result_handle = NULL;
13733 QDF_STATUS status = QDF_STATUS_SUCCESS;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080013734 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Hanumanth Reddy Pothula90051782017-05-04 22:14:43 +053013735
Abhishek Amburec5151392019-10-14 12:15:24 +053013736 scan_filter = qdf_mem_malloc(sizeof(*scan_filter));
Arif Hussain0ef77082018-10-10 16:42:53 -070013737 if (!scan_filter) {
Hanumanth Reddy Pothula90051782017-05-04 22:14:43 +053013738 status = QDF_STATUS_E_NOMEM;
Abhishek Amburec5151392019-10-14 12:15:24 +053013739 goto exit;
Hanumanth Reddy Pothula90051782017-05-04 22:14:43 +053013740 }
13741
Abhishek Amburec5151392019-10-14 12:15:24 +053013742 status = csr_roam_get_scan_filter_from_profile(mac_ctx,
13743 profile, scan_filter,
13744 false);
Hanumanth Reddy Pothula90051782017-05-04 22:14:43 +053013745 if (QDF_STATUS_SUCCESS != status) {
13746 sme_err("prepare_filter failed");
Abhishek Amburec5151392019-10-14 12:15:24 +053013747 qdf_mem_free(scan_filter);
13748 goto exit;
Hanumanth Reddy Pothula90051782017-05-04 22:14:43 +053013749 }
13750
13751 /* update filter to get scan result with just target BSSID */
Abhishek Amburec5151392019-10-14 12:15:24 +053013752 scan_filter->num_of_bssid = 1;
13753 qdf_mem_copy(scan_filter->bssid_list[0].bytes,
Hanumanth Reddy Pothula90051782017-05-04 22:14:43 +053013754 bssid, sizeof(struct qdf_mac_addr));
13755
13756 status = csr_scan_get_result(mac_ctx, scan_filter, &result_handle);
Abhishek Amburec5151392019-10-14 12:15:24 +053013757 qdf_mem_free(scan_filter);
Hanumanth Reddy Pothula90051782017-05-04 22:14:43 +053013758 if (QDF_STATUS_SUCCESS != status) {
Jianmin Zhucc6b3d02019-03-07 14:19:34 +080013759 sme_debug("parse_scan_result failed");
Abhishek Amburec5151392019-10-14 12:15:24 +053013760 goto exit;
Hanumanth Reddy Pothula90051782017-05-04 22:14:43 +053013761 }
13762
13763 bss_list = (struct scan_result_list *)result_handle;
13764 bss_descp = csr_get_fst_bssdescr_ptr(bss_list);
13765 if (!bss_descp) {
13766 sme_err("unable to fetch bss descriptor");
13767 status = QDF_STATUS_E_FAULT;
Abhishek Amburec5151392019-10-14 12:15:24 +053013768 goto exit;
Hanumanth Reddy Pothula90051782017-05-04 22:14:43 +053013769 }
13770
13771 sme_debug("snr: %d, rssi: %d, raw_rssi: %d",
13772 bss_descp->sinr, bss_descp->rssi, bss_descp->rssi_raw);
13773
13774 if (rssi)
13775 *rssi = bss_descp->rssi;
13776 if (snr)
13777 *snr = bss_descp->sinr;
13778
Abhishek Amburec5151392019-10-14 12:15:24 +053013779exit:
Hanumanth Reddy Pothula90051782017-05-04 22:14:43 +053013780 if (result_handle)
13781 csr_scan_result_purge(mac_ctx, result_handle);
13782
13783 return status;
13784}
13785
Jeff Johnsonc7309062018-11-09 20:59:42 -080013786QDF_STATUS sme_get_beacon_frm(mac_handle_t mac_handle,
Jeff Johnson1f2dabc2018-11-07 15:33:01 -080013787 struct csr_roam_profile *profile,
Jeff Johnson66ee8a92018-03-17 15:24:26 -070013788 const tSirMacAddr bssid,
13789 uint8_t **frame_buf, uint32_t *frame_len,
Manikandan Mohan0ba7e552019-10-23 17:38:35 -070013790 uint32_t *ch_freq)
Naveen Rawat664a7cb2017-01-19 17:58:14 -080013791{
13792 QDF_STATUS status = QDF_STATUS_SUCCESS;
Naveen Rawat56b4de82017-02-17 14:38:49 -080013793 tScanResultHandle result_handle = NULL;
Abhishek Amburec5151392019-10-14 12:15:24 +053013794 struct scan_filter *scan_filter;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080013795 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Pragaspathi Thilagaraj1112c962019-05-23 23:45:38 +053013796 struct bss_description *bss_descp;
Yeshwanth Sriram Guntuka36c09902017-09-26 11:34:26 +053013797 struct scan_result_list *bss_list;
Naveen Rawat664a7cb2017-01-19 17:58:14 -080013798 uint32_t ie_len;
13799
Abhishek Amburec5151392019-10-14 12:15:24 +053013800 scan_filter = qdf_mem_malloc(sizeof(*scan_filter));
Arif Hussain0ef77082018-10-10 16:42:53 -070013801 if (!scan_filter) {
Naveen Rawat664a7cb2017-01-19 17:58:14 -080013802 status = QDF_STATUS_E_NOMEM;
Abhishek Amburec5151392019-10-14 12:15:24 +053013803 goto exit;
Naveen Rawat664a7cb2017-01-19 17:58:14 -080013804 }
Abhishek Amburec5151392019-10-14 12:15:24 +053013805 status = csr_roam_get_scan_filter_from_profile(mac_ctx,
13806 profile, scan_filter,
13807 false);
Naveen Rawat664a7cb2017-01-19 17:58:14 -080013808 if (QDF_IS_STATUS_ERROR(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070013809 sme_err("prepare_filter failed");
Selvaraj, Sridhar64b0a9c2017-05-11 16:50:15 +053013810 status = QDF_STATUS_E_FAULT;
Abhishek Amburec5151392019-10-14 12:15:24 +053013811 qdf_mem_free(scan_filter);
13812 goto exit;
Naveen Rawat664a7cb2017-01-19 17:58:14 -080013813 }
13814
13815 /* update filter to get scan result with just target BSSID */
Abhishek Amburec5151392019-10-14 12:15:24 +053013816 scan_filter->num_of_bssid = 1;
13817 qdf_mem_copy(scan_filter->bssid_list[0].bytes,
Naveen Rawat664a7cb2017-01-19 17:58:14 -080013818 bssid, sizeof(struct qdf_mac_addr));
13819
13820 status = csr_scan_get_result(mac_ctx, scan_filter, &result_handle);
Abhishek Amburec5151392019-10-14 12:15:24 +053013821 qdf_mem_free(scan_filter);
Naveen Rawat664a7cb2017-01-19 17:58:14 -080013822 if (QDF_STATUS_SUCCESS != status) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070013823 sme_err("parse_scan_result failed");
Selvaraj, Sridhar64b0a9c2017-05-11 16:50:15 +053013824 status = QDF_STATUS_E_FAULT;
Abhishek Amburec5151392019-10-14 12:15:24 +053013825 goto exit;
Naveen Rawat664a7cb2017-01-19 17:58:14 -080013826 }
13827
Yeshwanth Sriram Guntuka36c09902017-09-26 11:34:26 +053013828 bss_list = (struct scan_result_list *)result_handle;
Naveen Rawat664a7cb2017-01-19 17:58:14 -080013829 bss_descp = csr_get_fst_bssdescr_ptr(bss_list);
Naveen Rawatae0aaa82017-02-17 14:41:19 -080013830 if (!bss_descp) {
Srinivas Girigowda2c263352017-03-17 17:49:53 -070013831 sme_err("unable to fetch bss descriptor");
Naveen Rawatae0aaa82017-02-17 14:41:19 -080013832 status = QDF_STATUS_E_FAULT;
Abhishek Amburec5151392019-10-14 12:15:24 +053013833 goto exit;
Naveen Rawatae0aaa82017-02-17 14:41:19 -080013834 }
Naveen Rawat664a7cb2017-01-19 17:58:14 -080013835
Naveen Rawat81f058c2017-06-02 16:02:39 -070013836 /**
13837 * Length of BSS descriptor is without length of
13838 * length itself and length of pointer that holds ieFields.
13839 *
Pragaspathi Thilagaraj1112c962019-05-23 23:45:38 +053013840 * struct bss_description
Naveen Rawat81f058c2017-06-02 16:02:39 -070013841 * +--------+---------------------------------+---------------+
13842 * | length | other fields | pointer to IEs|
13843 * +--------+---------------------------------+---------------+
13844 * ^
13845 * ieFields
Naveen Rawat664a7cb2017-01-19 17:58:14 -080013846 */
Naveen Rawat81f058c2017-06-02 16:02:39 -070013847 ie_len = bss_descp->length + sizeof(bss_descp->length)
Pragaspathi Thilagaraj1112c962019-05-23 23:45:38 +053013848 - (uint16_t)(offsetof(struct bss_description, ieFields[0]));
Will Huang65d64252019-07-16 17:57:42 +080013849 sme_debug("found bss_descriptor ie_len: %d frequency %d",
13850 ie_len, bss_descp->chan_freq);
Naveen Rawat664a7cb2017-01-19 17:58:14 -080013851
13852 /* include mac header and fixed params along with IEs in frame */
13853 *frame_len = SIR_MAC_HDR_LEN_3A + SIR_MAC_B_PR_SSID_OFFSET + ie_len;
13854 *frame_buf = qdf_mem_malloc(*frame_len);
Arif Hussain0ef77082018-10-10 16:42:53 -070013855 if (!*frame_buf) {
Naveen Rawat664a7cb2017-01-19 17:58:14 -080013856 status = QDF_STATUS_E_NOMEM;
Abhishek Amburec5151392019-10-14 12:15:24 +053013857 goto exit;
Naveen Rawat664a7cb2017-01-19 17:58:14 -080013858 }
13859
13860 sme_prepare_beacon_from_bss_descp(*frame_buf, bss_descp, bssid, ie_len);
13861
Manikandan Mohan0ba7e552019-10-23 17:38:35 -070013862 if (!*ch_freq)
13863 *ch_freq = bss_descp->chan_freq;
Abhishek Amburec5151392019-10-14 12:15:24 +053013864exit:
Arif Hussainfdb25e22017-02-05 17:38:16 -080013865 if (result_handle)
13866 csr_scan_result_purge(mac_ctx, result_handle);
Naveen Rawat664a7cb2017-01-19 17:58:14 -080013867
Naveen Rawatae0aaa82017-02-17 14:41:19 -080013868 return status;
Naveen Rawat664a7cb2017-01-19 17:58:14 -080013869}
13870
Paul Zhangc3fc0a82018-01-09 16:38:20 +080013871#ifdef WLAN_FEATURE_ROAM_OFFLOAD
gaurank kathpalia7ef72182019-05-29 19:41:25 +053013872QDF_STATUS sme_roam_invoke_nud_fail(mac_handle_t mac_handle, uint8_t vdev_id)
Naveen Rawat4195c5e2017-05-22 17:07:45 -070013873{
gaurank kathpalia7ef72182019-05-29 19:41:25 +053013874 struct wma_roam_invoke_cmd *roam_invoke_params;
Naveen Rawat4195c5e2017-05-22 17:07:45 -070013875 struct scheduler_msg msg = {0};
gaurank kathpalia7ef72182019-05-29 19:41:25 +053013876 QDF_STATUS status;
13877 struct wlan_objmgr_vdev *vdev;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080013878 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
gaurank kathpalia7ef72182019-05-29 19:41:25 +053013879 struct mlme_roam_after_data_stall *vdev_roam_params;
Abhinav Kumareab25932018-07-13 11:48:43 +053013880 struct csr_roam_session *session;
Abhinav Kumar523ca372019-08-30 16:28:19 +053013881 bool control_bitmap;
Naveen Rawat4195c5e2017-05-22 17:07:45 -070013882
gaurank kathpalia7ef72182019-05-29 19:41:25 +053013883 if (!mac_ctx->mlme_cfg->gen.data_stall_recovery_fw_support) {
13884 sme_debug("FW does not support data stall recovery, aborting roam invoke");
13885 return QDF_STATUS_E_NOSUPPORT;
13886 }
13887
Abhinav Kumareab25932018-07-13 11:48:43 +053013888 session = CSR_GET_SESSION(mac_ctx, vdev_id);
Abhinav Kumar523ca372019-08-30 16:28:19 +053013889 if (!session) {
Abhinav Kumareab25932018-07-13 11:48:43 +053013890 sme_err("session %d not found", vdev_id);
13891 return QDF_STATUS_E_FAILURE;
13892 }
13893
Abhinav Kumar523ca372019-08-30 16:28:19 +053013894 control_bitmap = mlme_get_operations_bitmap(mac_ctx->psoc, vdev_id);
13895 if (control_bitmap ||
13896 !MLME_IS_ROAM_INITIALIZED(mac_ctx->psoc, vdev_id)) {
13897 sme_debug("ROAM: RSO Disabled internaly: vdev[%d] bitmap[0x%x]",
13898 vdev_id, control_bitmap);
Abhinav Kumareab25932018-07-13 11:48:43 +053013899 return QDF_STATUS_E_FAILURE;
13900 }
Arif Hussain0ef77082018-10-10 16:42:53 -070013901
gaurank kathpalia7ef72182019-05-29 19:41:25 +053013902 vdev = wlan_objmgr_get_vdev_by_id_from_psoc(mac_ctx->psoc, vdev_id,
13903 WLAN_LEGACY_SME_ID);
13904
13905 if (!vdev) {
13906 sme_err("vdev is NULL, aborting roam invoke");
13907 return QDF_STATUS_E_NULL_VALUE;
13908 }
13909
13910 vdev_roam_params = mlme_get_roam_invoke_params(vdev);
13911
13912 if (!vdev_roam_params) {
13913 sme_err("Invalid vdev roam params, aborting roam invoke");
13914 wlan_objmgr_vdev_release_ref(vdev, WLAN_LEGACY_SME_ID);
13915 return QDF_STATUS_E_NULL_VALUE;
13916 }
13917
13918 if (vdev_roam_params->roam_invoke_in_progress) {
13919 sme_debug("Roaming in progress set by source = %d, aborting this roam invoke",
13920 vdev_roam_params->source);
13921 wlan_objmgr_vdev_release_ref(vdev, WLAN_LEGACY_SME_ID);
13922 return QDF_STATUS_E_BUSY;
13923 }
13924
13925 roam_invoke_params = qdf_mem_malloc(sizeof(*roam_invoke_params));
13926 if (!roam_invoke_params) {
13927 wlan_objmgr_vdev_release_ref(vdev, WLAN_LEGACY_SME_ID);
13928 return QDF_STATUS_E_NOMEM;
13929 }
13930 roam_invoke_params->vdev_id = vdev_id;
13931 /* Set forced roaming as true so that FW scans all ch, and connect */
13932 roam_invoke_params->forced_roaming = true;
13933
13934 msg.type = eWNI_SME_ROAM_INVOKE;
13935 msg.reserved = 0;
13936 msg.bodyptr = roam_invoke_params;
13937 status = scheduler_post_message(QDF_MODULE_ID_SME,
13938 QDF_MODULE_ID_PE,
13939 QDF_MODULE_ID_PE, &msg);
13940 if (QDF_IS_STATUS_ERROR(status)) {
13941 sme_err("Not able to post ROAM_INVOKE_CMD message to PE");
13942 qdf_mem_free(roam_invoke_params);
13943 } else {
13944 vdev_roam_params->roam_invoke_in_progress = true;
13945 vdev_roam_params->source = CONNECTION_MGR_INITIATED;
13946 sme_debug("Trigger roaming for vdev id %d source = CONNECTION_MGR_INITIATED",
13947 session->sessionId);
13948 }
13949 wlan_objmgr_vdev_release_ref(vdev, WLAN_LEGACY_SME_ID);
13950
13951 return status;
13952}
13953
13954QDF_STATUS sme_fast_reassoc(mac_handle_t mac_handle,
13955 struct csr_roam_profile *profile,
Manikandan Mohan0ba7e552019-10-23 17:38:35 -070013956 const tSirMacAddr bssid, uint32_t ch_freq,
Abhinav Kumarc0716d42020-01-23 18:19:36 +053013957 uint8_t vdev_id,
13958 const tSirMacAddr connected_bssid)
gaurank kathpalia7ef72182019-05-29 19:41:25 +053013959{
Abhinav Kumarc0716d42020-01-23 18:19:36 +053013960 QDF_STATUS status = QDF_STATUS_E_FAILURE;
13961 struct mac_context *mac = MAC_CONTEXT(mac_handle);
gaurank kathpalia7ef72182019-05-29 19:41:25 +053013962
Abhinav Kumarc0716d42020-01-23 18:19:36 +053013963 if (!mac)
gaurank kathpalia7ef72182019-05-29 19:41:25 +053013964 return QDF_STATUS_E_FAILURE;
Abhinav Kumarc0716d42020-01-23 18:19:36 +053013965
13966 if (!CSR_IS_SESSION_VALID(mac, vdev_id)) {
13967 sme_err("Invalid vdev_id: %d", vdev_id);
13968 return QDF_STATUS_E_INVAL;
gaurank kathpalia7ef72182019-05-29 19:41:25 +053013969 }
13970
Abhinav Kumarc0716d42020-01-23 18:19:36 +053013971 if (QDF_IS_STATUS_ERROR(sme_acquire_global_lock(&mac->sme)))
gaurank kathpalia7ef72182019-05-29 19:41:25 +053013972 return QDF_STATUS_E_FAILURE;
gaurank kathpalia7ef72182019-05-29 19:41:25 +053013973
Abhinav Kumarc0716d42020-01-23 18:19:36 +053013974 status = csr_fast_reassoc(mac_handle, profile, bssid, ch_freq, vdev_id,
13975 connected_bssid);
gaurank kathpalia7ef72182019-05-29 19:41:25 +053013976
Abhinav Kumarc0716d42020-01-23 18:19:36 +053013977 sme_release_global_lock(&mac->sme);
gaurank kathpalia7ef72182019-05-29 19:41:25 +053013978
Naveen Rawat4195c5e2017-05-22 17:07:45 -070013979 return status;
13980}
Abhinav Kumarc0716d42020-01-23 18:19:36 +053013981
Paul Zhangc3fc0a82018-01-09 16:38:20 +080013982#endif
Naveen Rawat4195c5e2017-05-22 17:07:45 -070013983
Jeff Johnsonc7309062018-11-09 20:59:42 -080013984QDF_STATUS sme_set_del_pmkid_cache(mac_handle_t mac_handle, uint8_t session_id,
Vignesh Viswanathanc6d1e1c2017-09-18 12:32:49 +053013985 tPmkidCacheInfo *pmk_cache_info,
13986 bool is_add)
13987{
13988 struct wmi_unified_pmk_cache *pmk_cache;
13989 struct scheduler_msg msg;
13990
13991 pmk_cache = qdf_mem_malloc(sizeof(*pmk_cache));
Arif Hussain0ef77082018-10-10 16:42:53 -070013992 if (!pmk_cache)
Vignesh Viswanathanc6d1e1c2017-09-18 12:32:49 +053013993 return QDF_STATUS_E_NOMEM;
Vignesh Viswanathanc6d1e1c2017-09-18 12:32:49 +053013994
hangtian127c9532019-01-12 13:29:07 +080013995 qdf_mem_zero(pmk_cache, sizeof(*pmk_cache));
Vignesh Viswanathane8a26b22017-10-11 20:38:47 +053013996
Jeff Johnson622aad62018-12-07 15:05:37 -080013997 pmk_cache->vdev_id = session_id;
Vignesh Viswanathanc6d1e1c2017-09-18 12:32:49 +053013998
Pragaspathi Thilagaraj1c17ee92019-08-05 21:55:19 +053013999 if (!pmk_cache_info) {
14000 pmk_cache->is_flush_all = true;
Vignesh Viswanathane8a26b22017-10-11 20:38:47 +053014001 goto send_flush_cmd;
Pragaspathi Thilagaraj1c17ee92019-08-05 21:55:19 +053014002 }
Vignesh Viswanathane8a26b22017-10-11 20:38:47 +053014003
Vignesh Viswanathanc6d1e1c2017-09-18 12:32:49 +053014004 if (!pmk_cache_info->ssid_len) {
14005 pmk_cache->cat_flag = WMI_PMK_CACHE_CAT_FLAG_BSSID;
14006 WMI_CHAR_ARRAY_TO_MAC_ADDR(pmk_cache_info->BSSID.bytes,
14007 &pmk_cache->bssid);
14008 } else {
14009 pmk_cache->cat_flag = WMI_PMK_CACHE_CAT_FLAG_SSID_CACHE_ID;
14010 pmk_cache->ssid.length = pmk_cache_info->ssid_len;
14011 qdf_mem_copy(pmk_cache->ssid.mac_ssid,
14012 pmk_cache_info->ssid,
14013 pmk_cache->ssid.length);
14014 }
14015 pmk_cache->cache_id = (uint32_t) (pmk_cache_info->cache_id[0] << 8 |
14016 pmk_cache_info->cache_id[1]);
14017
14018 if (is_add)
14019 pmk_cache->action_flag = WMI_PMK_CACHE_ACTION_FLAG_ADD_ENTRY;
14020 else
14021 pmk_cache->action_flag = WMI_PMK_CACHE_ACTION_FLAG_DEL_ENTRY;
14022
Srinivas Girigowdaff8f5ef2019-03-26 17:20:55 -070014023 pmk_cache->pmkid_len = PMKID_LEN;
Vignesh Viswanathanc6d1e1c2017-09-18 12:32:49 +053014024 qdf_mem_copy(pmk_cache->pmkid, pmk_cache_info->PMKID,
Srinivas Girigowdaff8f5ef2019-03-26 17:20:55 -070014025 PMKID_LEN);
Vignesh Viswanathanc6d1e1c2017-09-18 12:32:49 +053014026
14027 pmk_cache->pmk_len = pmk_cache_info->pmk_len;
14028 qdf_mem_copy(pmk_cache->pmk, pmk_cache_info->pmk,
14029 pmk_cache->pmk_len);
14030
Vignesh Viswanathane8a26b22017-10-11 20:38:47 +053014031send_flush_cmd:
Vignesh Viswanathanc6d1e1c2017-09-18 12:32:49 +053014032 msg.type = SIR_HAL_SET_DEL_PMKID_CACHE;
14033 msg.reserved = 0;
14034 msg.bodyptr = pmk_cache;
14035 if (QDF_STATUS_SUCCESS !=
gaurank kathpalia36b0c582018-08-28 17:45:43 +053014036 scheduler_post_message(QDF_MODULE_ID_SME,
14037 QDF_MODULE_ID_WMA,
14038 QDF_MODULE_ID_WMA, &msg)) {
Vignesh Viswanathanc6d1e1c2017-09-18 12:32:49 +053014039 sme_err("Not able to post message to WDA");
Ashish Kumar Dhanotiya36510832019-02-20 22:13:25 +053014040 if (pmk_cache) {
14041 qdf_mem_zero(pmk_cache, sizeof(*pmk_cache));
14042 qdf_mem_free(pmk_cache);
14043 }
Vignesh Viswanathanc6d1e1c2017-09-18 12:32:49 +053014044 return QDF_STATUS_E_FAILURE;
14045 }
14046
14047 return QDF_STATUS_SUCCESS;
14048}
14049
Anurag Chouhan3920c0f2017-09-11 17:10:56 +053014050/* ARP DEBUG STATS */
14051
14052/**
14053 * sme_set_nud_debug_stats() - sme api to set nud debug stats
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -080014054 * @mac_handle: Opaque handle to the global MAC context
Anurag Chouhan3920c0f2017-09-11 17:10:56 +053014055 * @set_stats_param: pointer to set stats param
14056 *
14057 * Return: Return QDF_STATUS.
14058 */
Jeff Johnsonc7309062018-11-09 20:59:42 -080014059QDF_STATUS sme_set_nud_debug_stats(mac_handle_t mac_handle,
Anurag Chouhan3920c0f2017-09-11 17:10:56 +053014060 struct set_arp_stats_params
14061 *set_stats_param)
14062{
14063 struct set_arp_stats_params *arp_set_param;
14064 struct scheduler_msg msg;
14065
14066 arp_set_param = qdf_mem_malloc(sizeof(*arp_set_param));
Arif Hussain0ef77082018-10-10 16:42:53 -070014067 if (!arp_set_param)
Anurag Chouhan3920c0f2017-09-11 17:10:56 +053014068 return QDF_STATUS_E_NOMEM;
Anurag Chouhan3920c0f2017-09-11 17:10:56 +053014069
14070 qdf_mem_copy(arp_set_param, set_stats_param, sizeof(*arp_set_param));
14071
14072 msg.type = WMA_SET_ARP_STATS_REQ;
14073 msg.reserved = 0;
14074 msg.bodyptr = arp_set_param;
14075
14076 if (QDF_STATUS_SUCCESS !=
gaurank kathpalia36b0c582018-08-28 17:45:43 +053014077 scheduler_post_message(QDF_MODULE_ID_SME,
14078 QDF_MODULE_ID_WMA,
14079 QDF_MODULE_ID_WMA, &msg)) {
Anurag Chouhan3920c0f2017-09-11 17:10:56 +053014080 sme_err("Not able to post message to WDA");
14081 qdf_mem_free(arp_set_param);
14082 return QDF_STATUS_E_FAILURE;
14083 }
14084
14085 return QDF_STATUS_SUCCESS;
14086}
14087
14088/**
14089 * sme_get_nud_debug_stats() - sme api to get nud debug stats
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -080014090 * @mac_handle: Opaque handle to the global MAC context
Anurag Chouhan3920c0f2017-09-11 17:10:56 +053014091 * @get_stats_param: pointer to set stats param
14092 *
14093 * Return: Return QDF_STATUS.
14094 */
Jeff Johnsonc7309062018-11-09 20:59:42 -080014095QDF_STATUS sme_get_nud_debug_stats(mac_handle_t mac_handle,
Anurag Chouhan3920c0f2017-09-11 17:10:56 +053014096 struct get_arp_stats_params
14097 *get_stats_param)
14098{
14099 struct get_arp_stats_params *arp_get_param;
14100 struct scheduler_msg msg;
14101
14102 arp_get_param = qdf_mem_malloc(sizeof(*arp_get_param));
Arif Hussain0ef77082018-10-10 16:42:53 -070014103 if (!arp_get_param)
Anurag Chouhan3920c0f2017-09-11 17:10:56 +053014104 return QDF_STATUS_E_NOMEM;
Anurag Chouhan3920c0f2017-09-11 17:10:56 +053014105
14106 qdf_mem_copy(arp_get_param, get_stats_param, sizeof(*arp_get_param));
14107
14108 msg.type = WMA_GET_ARP_STATS_REQ;
14109 msg.reserved = 0;
14110 msg.bodyptr = arp_get_param;
14111
14112 if (QDF_STATUS_SUCCESS !=
gaurank kathpalia36b0c582018-08-28 17:45:43 +053014113 scheduler_post_message(QDF_MODULE_ID_SME,
14114 QDF_MODULE_ID_WMA,
14115 QDF_MODULE_ID_WMA, &msg)) {
Anurag Chouhan3920c0f2017-09-11 17:10:56 +053014116 sme_err("Not able to post message to WDA");
14117 qdf_mem_free(arp_get_param);
14118 return QDF_STATUS_E_FAILURE;
14119 }
14120
14121 return QDF_STATUS_SUCCESS;
14122}
14123
Krishna Kumaar Natarajanf1581df2017-02-21 13:42:08 -080014124QDF_STATUS sme_set_peer_param(uint8_t *peer_addr, uint32_t param_id,
14125 uint32_t param_value, uint32_t vdev_id)
14126{
14127 void *wma_handle;
14128
14129 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
14130 if (!wma_handle) {
Srinivas Girigowda2c263352017-03-17 17:49:53 -070014131 sme_err("wma handle is NULL");
Krishna Kumaar Natarajanf1581df2017-02-21 13:42:08 -080014132 return QDF_STATUS_E_FAILURE;
14133 }
14134
14135 return wma_set_peer_param(wma_handle, peer_addr, param_id,
14136 param_value, vdev_id);
14137}
Tushnim Bhattacharyya9e81b4c2017-02-15 17:11:14 -080014138
Jeff Johnsonb460dd72018-11-08 10:26:51 -080014139QDF_STATUS sme_register_set_connection_info_cb(mac_handle_t mac_handle,
Tushnim Bhattacharyya0c4ad2d2017-03-09 15:59:03 -080014140 bool (*set_connection_info_cb)(bool),
14141 bool (*get_connection_info_cb)(uint8_t *session_id,
14142 enum scan_reject_states *reason))
Tushnim Bhattacharyya9e81b4c2017-02-15 17:11:14 -080014143{
14144 QDF_STATUS status = QDF_STATUS_SUCCESS;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080014145 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Tushnim Bhattacharyya9e81b4c2017-02-15 17:11:14 -080014146
Jeff Johnson01f2c232018-11-21 19:17:44 -080014147 status = sme_acquire_global_lock(&mac->sme);
Tushnim Bhattacharyya9e81b4c2017-02-15 17:11:14 -080014148 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson01f2c232018-11-21 19:17:44 -080014149 mac->sme.set_connection_info_cb = set_connection_info_cb;
14150 mac->sme.get_connection_info_cb = get_connection_info_cb;
14151 sme_release_global_lock(&mac->sme);
Tushnim Bhattacharyya9e81b4c2017-02-15 17:11:14 -080014152 }
14153 return status;
14154}
Sreelakshmi Konamki88a2a412017-04-14 15:11:55 +053014155
Jeff Johnson43975142018-07-04 15:33:47 -070014156QDF_STATUS sme_rso_cmd_status_cb(mac_handle_t mac_handle,
14157 rso_cmd_status_cb cb)
Sreelakshmi Konamki88a2a412017-04-14 15:11:55 +053014158{
14159 QDF_STATUS status = QDF_STATUS_SUCCESS;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080014160 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Sreelakshmi Konamki88a2a412017-04-14 15:11:55 +053014161
14162 mac->sme.rso_cmd_status_cb = cb;
Srinivas Girigowda2c263352017-03-17 17:49:53 -070014163 sme_debug("Registered RSO command status callback");
Sreelakshmi Konamki88a2a412017-04-14 15:11:55 +053014164 return status;
14165}
Kiran Kumar Lokerea3de2262017-04-12 12:15:04 -070014166
Jeff Johnsonc7309062018-11-09 20:59:42 -080014167QDF_STATUS sme_set_dbs_scan_selection_config(mac_handle_t mac_handle,
Nitesh Shahf9a09ff2017-05-22 15:46:25 +053014168 struct wmi_dbs_scan_sel_params *params)
14169{
14170 struct scheduler_msg message = {0};
14171 QDF_STATUS status;
14172 struct wmi_dbs_scan_sel_params *dbs_scan_params;
14173 uint32_t i;
14174
14175 if (0 == params->num_clients) {
14176 sme_err("Num of clients is 0");
14177 return QDF_STATUS_E_FAILURE;
14178 }
14179
14180 dbs_scan_params = qdf_mem_malloc(sizeof(*dbs_scan_params));
Arif Hussain0ef77082018-10-10 16:42:53 -070014181 if (!dbs_scan_params)
Nitesh Shahf9a09ff2017-05-22 15:46:25 +053014182 return QDF_STATUS_E_NOMEM;
Nitesh Shahf9a09ff2017-05-22 15:46:25 +053014183
14184 dbs_scan_params->num_clients = params->num_clients;
14185 dbs_scan_params->pdev_id = params->pdev_id;
14186 for (i = 0; i < params->num_clients; i++) {
14187 dbs_scan_params->module_id[i] = params->module_id[i];
14188 dbs_scan_params->num_dbs_scans[i] = params->num_dbs_scans[i];
14189 dbs_scan_params->num_non_dbs_scans[i] =
14190 params->num_non_dbs_scans[i];
14191 }
14192 message.type = WMA_SET_DBS_SCAN_SEL_CONF_PARAMS;
14193 message.bodyptr = dbs_scan_params;
gaurank kathpalia36b0c582018-08-28 17:45:43 +053014194 status = scheduler_post_message(QDF_MODULE_ID_SME,
14195 QDF_MODULE_ID_WMA,
14196 QDF_MODULE_ID_WMA, &message);
Nitesh Shahf9a09ff2017-05-22 15:46:25 +053014197 if (!QDF_IS_STATUS_SUCCESS(status)) {
14198 sme_err("Not able to post msg to WMA!");
14199 qdf_mem_free(dbs_scan_params);
14200 }
14201
14202 return status;
14203}
14204
Jeff Johnsonc7309062018-11-09 20:59:42 -080014205QDF_STATUS sme_get_rcpi(mac_handle_t mac_handle, struct sme_rcpi_req *rcpi)
Rajeev Kumar Sirasanagandla996e5292016-11-22 21:20:33 +053014206{
14207 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080014208 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Naveen Rawatb7be1ed2017-11-16 16:52:08 -080014209 struct scheduler_msg msg = {0};
Rajeev Kumar Sirasanagandla996e5292016-11-22 21:20:33 +053014210 struct sme_rcpi_req *rcpi_req;
14211
14212 rcpi_req = qdf_mem_malloc(sizeof(*rcpi_req));
Arif Hussain0ef77082018-10-10 16:42:53 -070014213 if (!rcpi_req)
Rajeev Kumar Sirasanagandla996e5292016-11-22 21:20:33 +053014214 return QDF_STATUS_E_NOMEM;
Arif Hussain0ef77082018-10-10 16:42:53 -070014215
Rajeev Kumar Sirasanagandla996e5292016-11-22 21:20:33 +053014216 qdf_mem_copy(rcpi_req, rcpi, sizeof(*rcpi_req));
14217
Jeff Johnson01f2c232018-11-21 19:17:44 -080014218 status = sme_acquire_global_lock(&mac->sme);
Rajeev Kumar Sirasanagandla996e5292016-11-22 21:20:33 +053014219 if (QDF_IS_STATUS_SUCCESS(status)) {
14220 msg.bodyptr = rcpi_req;
14221 msg.type = WMA_GET_RCPI_REQ;
gaurank kathpalia36b0c582018-08-28 17:45:43 +053014222 status = scheduler_post_message(QDF_MODULE_ID_SME,
14223 QDF_MODULE_ID_WMA,
14224 QDF_MODULE_ID_WMA, &msg);
Jeff Johnson01f2c232018-11-21 19:17:44 -080014225 sme_release_global_lock(&mac->sme);
Rajeev Kumar Sirasanagandla996e5292016-11-22 21:20:33 +053014226 if (!QDF_IS_STATUS_SUCCESS(status)) {
14227 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
14228 FL("post get rcpi req failed"));
14229 status = QDF_STATUS_E_FAILURE;
14230 qdf_mem_free(rcpi_req);
14231 }
14232 } else {
Rajeev Kumar Sirasanagandla996e5292016-11-22 21:20:33 +053014233 qdf_mem_free(rcpi_req);
14234 }
14235
14236 return status;
14237}
14238
Jeff Johnsonc7309062018-11-09 20:59:42 -080014239void sme_store_pdev(mac_handle_t mac_handle, struct wlan_objmgr_pdev *pdev)
Kiran Kumar Lokerea3de2262017-04-12 12:15:04 -070014240{
Jeff Johnson0a8786a2018-12-02 10:49:01 -080014241 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Kiran Kumar Lokerea3de2262017-04-12 12:15:04 -070014242 void *wma_handle;
14243 QDF_STATUS status;
14244
Kiran Kumar Lokeref089a3a2017-04-20 21:39:26 -070014245 status = wlan_objmgr_pdev_try_get_ref(pdev, WLAN_LEGACY_MAC_ID);
Kiran Kumar Lokerea3de2262017-04-12 12:15:04 -070014246 if (QDF_STATUS_SUCCESS != status) {
14247 mac_ctx->pdev = NULL;
14248 return;
14249 }
14250 mac_ctx->pdev = pdev;
14251 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
14252 if (!wma_handle) {
14253 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Kiran Kumar Lokeref089a3a2017-04-20 21:39:26 -070014254 FL("wma handle is NULL"));
Kiran Kumar Lokerea3de2262017-04-12 12:15:04 -070014255 return;
14256 }
14257 wma_store_pdev(wma_handle, pdev);
Kiran Kumar Lokere4ce40482018-08-30 16:31:00 -070014258 pdev->pdev_nif.pdev_fw_caps |= SUPPORTED_CRYPTO_CAPS;
Kiran Kumar Lokerea3de2262017-04-12 12:15:04 -070014259}
14260
Jeff Johnsonda2afa42018-07-04 10:25:42 -070014261QDF_STATUS sme_register_tx_queue_cb(mac_handle_t mac_handle,
14262 tx_queue_cb tx_queue_cb)
Varun Reddy Yeturu076eaa82018-01-16 12:16:14 -080014263{
14264 QDF_STATUS status;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080014265 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Varun Reddy Yeturu076eaa82018-01-16 12:16:14 -080014266
14267 status = sme_acquire_global_lock(&mac->sme);
14268 if (QDF_IS_STATUS_SUCCESS(status)) {
14269 mac->sme.tx_queue_cb = tx_queue_cb;
14270 sme_release_global_lock(&mac->sme);
14271 sme_debug("Tx queue callback set");
Varun Reddy Yeturu076eaa82018-01-16 12:16:14 -080014272 }
14273
14274 return status;
14275}
14276
Jeff Johnsonda2afa42018-07-04 10:25:42 -070014277QDF_STATUS sme_deregister_tx_queue_cb(mac_handle_t mac_handle)
Varun Reddy Yeturu076eaa82018-01-16 12:16:14 -080014278{
Jeff Johnsonda2afa42018-07-04 10:25:42 -070014279 return sme_register_tx_queue_cb(mac_handle, NULL);
Varun Reddy Yeturu076eaa82018-01-16 12:16:14 -080014280}
14281
Varun Reddy Yeturud33033f2018-06-11 10:58:30 -070014282#ifdef WLAN_SUPPORT_TWT
Jeff Johnson3a08ff92018-07-03 19:40:44 -070014283QDF_STATUS sme_register_twt_enable_complete_cb(mac_handle_t mac_handle,
14284 twt_enable_cb twt_enable_cb)
Varun Reddy Yeturu3c9f89c2018-04-18 19:10:34 -070014285{
14286 QDF_STATUS status;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080014287 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Varun Reddy Yeturu3c9f89c2018-04-18 19:10:34 -070014288
14289 status = sme_acquire_global_lock(&mac->sme);
14290 if (QDF_IS_STATUS_SUCCESS(status)) {
14291 mac->sme.twt_enable_cb = twt_enable_cb;
14292 sme_release_global_lock(&mac->sme);
14293 sme_debug("TWT: enable callback set");
Varun Reddy Yeturu3c9f89c2018-04-18 19:10:34 -070014294 }
14295
14296 return status;
14297}
14298
Jeff Johnson3a08ff92018-07-03 19:40:44 -070014299QDF_STATUS sme_register_twt_disable_complete_cb(mac_handle_t mac_handle,
14300 twt_disable_cb twt_disable_cb)
Varun Reddy Yeturu3c9f89c2018-04-18 19:10:34 -070014301{
14302 QDF_STATUS status;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080014303 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Varun Reddy Yeturu3c9f89c2018-04-18 19:10:34 -070014304
14305 status = sme_acquire_global_lock(&mac->sme);
14306 if (QDF_IS_STATUS_SUCCESS(status)) {
14307 mac->sme.twt_disable_cb = twt_disable_cb;
14308 sme_release_global_lock(&mac->sme);
14309 sme_debug("TWT: disable callback set");
Varun Reddy Yeturu3c9f89c2018-04-18 19:10:34 -070014310 }
14311
14312 return status;
14313}
14314
Jeff Johnson3a08ff92018-07-03 19:40:44 -070014315QDF_STATUS sme_deregister_twt_enable_complete_cb(mac_handle_t mac_handle)
Varun Reddy Yeturu3c9f89c2018-04-18 19:10:34 -070014316{
Jeff Johnson3a08ff92018-07-03 19:40:44 -070014317 return sme_register_twt_enable_complete_cb(mac_handle, NULL);
Varun Reddy Yeturu3c9f89c2018-04-18 19:10:34 -070014318}
14319
Jeff Johnson3a08ff92018-07-03 19:40:44 -070014320QDF_STATUS sme_deregister_twt_disable_complete_cb(mac_handle_t mac_handle)
Varun Reddy Yeturu3c9f89c2018-04-18 19:10:34 -070014321{
Jeff Johnson3a08ff92018-07-03 19:40:44 -070014322 return sme_register_twt_disable_complete_cb(mac_handle, NULL);
Varun Reddy Yeturu3c9f89c2018-04-18 19:10:34 -070014323}
14324#endif
14325
Ashish Kumar Dhanotiyab28338c2017-07-21 20:12:34 +053014326QDF_STATUS sme_set_smps_cfg(uint32_t vdev_id, uint32_t param_id,
14327 uint32_t param_val)
14328{
14329 return wma_configure_smps_params(vdev_id, param_id, param_val);
14330}
14331
Jeff Johnsonc7309062018-11-09 20:59:42 -080014332QDF_STATUS sme_set_reorder_timeout(mac_handle_t mac_handle,
14333 struct sir_set_rx_reorder_timeout_val *req)
lifeng66831662017-05-19 16:01:35 +080014334{
14335 QDF_STATUS status;
Zhang Qian1e7649e2018-06-04 13:07:18 +080014336 tp_wma_handle wma_handle;
lifeng66831662017-05-19 16:01:35 +080014337
Zhang Qian1e7649e2018-06-04 13:07:18 +080014338 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
14339 status = wma_set_rx_reorder_timeout_val(wma_handle, req);
lifeng66831662017-05-19 16:01:35 +080014340
14341 return status;
14342}
14343
Jeff Johnsonc7309062018-11-09 20:59:42 -080014344QDF_STATUS sme_set_rx_set_blocksize(mac_handle_t mac_handle,
14345 struct sir_peer_set_rx_blocksize *req)
lifeng66831662017-05-19 16:01:35 +080014346{
14347 QDF_STATUS status;
Zhang Qian1e7649e2018-06-04 13:07:18 +080014348 tp_wma_handle wma_handle;
lifeng66831662017-05-19 16:01:35 +080014349
Zhang Qian1e7649e2018-06-04 13:07:18 +080014350 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
14351 status = wma_set_rx_blocksize(wma_handle, req);
lifeng66831662017-05-19 16:01:35 +080014352
14353 return status;
14354}
Naveen Rawat247a8682017-06-05 15:00:31 -070014355
14356int sme_cli_set_command(int vdev_id, int param_id, int sval, int vpdev)
14357{
14358 return wma_cli_set_command(vdev_id, param_id, sval, vpdev);
14359}
Vidyullatha Kanchanapallybe0ebb32017-03-23 14:36:21 +053014360
Vignesh Viswanathana851d752018-10-03 19:44:38 +053014361int sme_set_enable_mem_deep_sleep(mac_handle_t mac_handle, int vdev_id)
14362{
Jeff Johnson0a8786a2018-12-02 10:49:01 -080014363 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Vignesh Viswanathana851d752018-10-03 19:44:38 +053014364
14365 return wma_cli_set_command(vdev_id, WMI_PDEV_PARAM_HYST_EN,
14366 mac_ctx->mlme_cfg->gen.memory_deep_sleep,
14367 PDEV_CMD);
14368}
14369
14370int sme_set_cck_tx_fir_override(mac_handle_t mac_handle, int vdev_id)
14371{
Jeff Johnson0a8786a2018-12-02 10:49:01 -080014372 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Vignesh Viswanathana851d752018-10-03 19:44:38 +053014373
14374 return wma_cli_set_command(vdev_id,
14375 WMI_PDEV_PARAM_ENABLE_CCK_TXFIR_OVERRIDE,
14376 mac_ctx->mlme_cfg->gen.cck_tx_fir_override,
14377 PDEV_CMD);
14378}
14379
Jeff Johnsond0b6c7e2018-07-04 14:53:06 -070014380QDF_STATUS sme_set_bt_activity_info_cb(mac_handle_t mac_handle,
14381 bt_activity_info_cb cb)
Vidyullatha Kanchanapallybe0ebb32017-03-23 14:36:21 +053014382{
14383 QDF_STATUS status;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080014384 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Vidyullatha Kanchanapallybe0ebb32017-03-23 14:36:21 +053014385
14386 status = sme_acquire_global_lock(&mac->sme);
14387 if (QDF_IS_STATUS_SUCCESS(status)) {
14388 mac->sme.bt_activity_info_cb = cb;
14389 sme_release_global_lock(&mac->sme);
14390 sme_debug("bt activity info callback set");
Vidyullatha Kanchanapallybe0ebb32017-03-23 14:36:21 +053014391 }
14392
14393 return status;
14394}
lifengd217d192017-05-09 19:44:16 +080014395
Jeff Johnsonc7309062018-11-09 20:59:42 -080014396QDF_STATUS sme_get_chain_rssi(mac_handle_t mac_handle,
lifengd217d192017-05-09 19:44:16 +080014397 struct get_chain_rssi_req_params *input,
14398 get_chain_rssi_callback callback,
14399 void *context)
14400{
14401 QDF_STATUS status = QDF_STATUS_SUCCESS;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080014402 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Zhang Qian1e7649e2018-06-04 13:07:18 +080014403 tp_wma_handle wma_handle;
lifengd217d192017-05-09 19:44:16 +080014404
14405 SME_ENTER();
14406
Jeff Johnson038efe72019-03-18 13:39:31 -070014407 if (!input) {
lifengd217d192017-05-09 19:44:16 +080014408 sme_err("Invalid req params");
14409 return QDF_STATUS_E_INVAL;
14410 }
14411
14412 mac_ctx->sme.get_chain_rssi_cb = callback;
14413 mac_ctx->sme.get_chain_rssi_context = context;
Zhang Qian1e7649e2018-06-04 13:07:18 +080014414 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
14415 wma_get_chain_rssi(wma_handle, input);
lifengd217d192017-05-09 19:44:16 +080014416
14417 SME_EXIT();
14418 return status;
14419}
Vignesh Viswanathan66c951d2017-09-06 12:23:42 +053014420
Jeff Johnson0a8786a2018-12-02 10:49:01 -080014421QDF_STATUS sme_process_msg_callback(struct mac_context *mac,
Jeff Johnson5f9ce2d2018-06-09 21:20:45 -070014422 struct scheduler_msg *msg)
Sandeep Puligilla1426d612017-04-12 18:22:06 -070014423{
14424 QDF_STATUS status = QDF_STATUS_E_FAILURE;
14425
Jeff Johnson038efe72019-03-18 13:39:31 -070014426 if (!msg) {
Sandeep Puligilla1426d612017-04-12 18:22:06 -070014427 sme_err("Empty message for SME Msg callback");
14428 return status;
14429 }
Jeff Johnson5f9ce2d2018-06-09 21:20:45 -070014430 status = sme_process_msg(mac, msg);
Sandeep Puligilla1426d612017-04-12 18:22:06 -070014431 return status;
14432}
14433
Jeff Johnsonc7309062018-11-09 20:59:42 -080014434void sme_display_disconnect_stats(mac_handle_t mac_handle, uint8_t session_id)
Vignesh Viswanathan66c951d2017-09-06 12:23:42 +053014435{
14436 struct csr_roam_session *session;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080014437 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Vignesh Viswanathan66c951d2017-09-06 12:23:42 +053014438
14439 if (!CSR_IS_SESSION_VALID(mac_ctx, session_id)) {
14440 sme_err("%s Invalid session id: %d", __func__, session_id);
14441 return;
14442 }
14443
14444 session = CSR_GET_SESSION(mac_ctx, session_id);
14445 if (!session) {
14446 sme_err("%s Failed to get session for id: %d",
14447 __func__, session_id);
14448 return;
14449 }
14450
Nirav Shahe6194ac2018-07-13 11:04:41 +053014451 sme_nofl_info("Total No. of Disconnections: %d",
14452 session->disconnect_stats.disconnection_cnt);
Vignesh Viswanathan66c951d2017-09-06 12:23:42 +053014453
Nirav Shahe6194ac2018-07-13 11:04:41 +053014454 sme_nofl_info("No. of Diconnects Triggered by Application: %d",
14455 session->disconnect_stats.disconnection_by_app);
Vignesh Viswanathan66c951d2017-09-06 12:23:42 +053014456
Nirav Shahe6194ac2018-07-13 11:04:41 +053014457 sme_nofl_info("No. of Disassoc Sent by Peer: %d",
14458 session->disconnect_stats.disassoc_by_peer);
Vignesh Viswanathan66c951d2017-09-06 12:23:42 +053014459
Nirav Shahe6194ac2018-07-13 11:04:41 +053014460 sme_nofl_info("No. of Deauth Sent by Peer: %d",
14461 session->disconnect_stats.deauth_by_peer);
Vignesh Viswanathan66c951d2017-09-06 12:23:42 +053014462
Nirav Shahe6194ac2018-07-13 11:04:41 +053014463 sme_nofl_info("No. of Disconnections due to Beacon Miss: %d",
14464 session->disconnect_stats.bmiss);
Vignesh Viswanathan66c951d2017-09-06 12:23:42 +053014465
Nirav Shahe6194ac2018-07-13 11:04:41 +053014466 sme_nofl_info("No. of Disconnections due to Peer Kickout: %d",
14467 session->disconnect_stats.peer_kickout);
Vignesh Viswanathan66c951d2017-09-06 12:23:42 +053014468}
Nachiket Kukadeaaf8a712017-07-27 19:15:36 +053014469
Rachit Kankanef6834c42018-08-02 18:47:50 +053014470#ifdef FEATURE_WLAN_DYNAMIC_CVM
Nachiket Kukade8983cf62017-10-12 18:14:48 +053014471 /**
14472 * sme_set_vc_mode_config() - Set voltage corner config to FW
14473 * @bitmap: Bitmap that referes to voltage corner config with
14474 * different phymode and bw configuration
14475 *
14476 * Return: QDF_STATUS
14477 */
14478QDF_STATUS sme_set_vc_mode_config(uint32_t vc_bitmap)
14479{
14480 void *wma_handle;
14481
14482 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
14483 if (!wma_handle) {
14484 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
14485 "wma_handle is NULL");
14486 return QDF_STATUS_E_FAILURE;
14487 }
14488 if (QDF_STATUS_SUCCESS !=
14489 wma_set_vc_mode_config(wma_handle, vc_bitmap)) {
14490 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
14491 "%s: Failed to set Voltage Control config to FW",
14492 __func__);
14493 return QDF_STATUS_E_FAILURE;
14494 }
14495 return QDF_STATUS_SUCCESS;
14496}
Rachit Kankanef6834c42018-08-02 18:47:50 +053014497#endif
Nachiket Kukade8983cf62017-10-12 18:14:48 +053014498
Nachiket Kukadeaaf8a712017-07-27 19:15:36 +053014499/**
14500 * sme_set_bmiss_bcnt() - set bmiss config parameters
14501 * @vdev_id: virtual device for the command
14502 * @first_cnt: bmiss first value
14503 * @final_cnt: bmiss final value
14504 *
14505 * Return: QDF_STATUS_SUCCESS or non-zero on failure
14506 */
14507QDF_STATUS sme_set_bmiss_bcnt(uint32_t vdev_id, uint32_t first_cnt,
14508 uint32_t final_cnt)
14509{
14510 return wma_config_bmiss_bcnt_params(vdev_id, first_cnt, final_cnt);
14511}
Ganesh Kondabattini479a8ae2017-10-03 16:49:24 +053014512
Jeff Johnsonc7309062018-11-09 20:59:42 -080014513QDF_STATUS sme_send_limit_off_channel_params(mac_handle_t mac_handle,
14514 uint8_t vdev_id,
14515 bool is_tos_active,
14516 uint32_t max_off_chan_time,
14517 uint32_t rest_time,
14518 bool skip_dfs_chan)
Ganesh Kondabattini479a8ae2017-10-03 16:49:24 +053014519{
14520 struct sir_limit_off_chan *cmd;
14521 struct scheduler_msg msg = {0};
14522
14523 cmd = qdf_mem_malloc(sizeof(*cmd));
Arif Hussain0ef77082018-10-10 16:42:53 -070014524 if (!cmd)
Ganesh Kondabattini479a8ae2017-10-03 16:49:24 +053014525 return QDF_STATUS_E_NOMEM;
Ganesh Kondabattini479a8ae2017-10-03 16:49:24 +053014526
14527 cmd->vdev_id = vdev_id;
14528 cmd->is_tos_active = is_tos_active;
14529 cmd->max_off_chan_time = max_off_chan_time;
14530 cmd->rest_time = rest_time;
14531 cmd->skip_dfs_chans = skip_dfs_chan;
14532
14533 msg.type = WMA_SET_LIMIT_OFF_CHAN;
14534 msg.reserved = 0;
14535 msg.bodyptr = cmd;
14536
gaurank kathpalia36b0c582018-08-28 17:45:43 +053014537 if (!QDF_IS_STATUS_SUCCESS(scheduler_post_message(QDF_MODULE_ID_SME,
14538 QDF_MODULE_ID_WMA,
14539 QDF_MODULE_ID_WMA,
14540 &msg))) {
Ganesh Kondabattini479a8ae2017-10-03 16:49:24 +053014541 sme_err("Not able to post WMA_SET_LIMIT_OFF_CHAN to WMA");
14542 qdf_mem_free(cmd);
14543 return QDF_STATUS_E_FAILURE;
14544 }
14545
14546 return QDF_STATUS_SUCCESS;
14547}
Vignesh Viswanathan9dd88d32017-11-22 14:22:03 +053014548
Jeff Johnsonc7309062018-11-09 20:59:42 -080014549uint32_t sme_unpack_rsn_ie(mac_handle_t mac_handle, uint8_t *buf,
Qiwei Caie689a262018-07-26 15:50:22 +080014550 uint8_t buf_len, tDot11fIERSN *rsn_ie,
14551 bool append_ie)
14552{
Jeff Johnson0a8786a2018-12-02 10:49:01 -080014553 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Qiwei Caie689a262018-07-26 15:50:22 +080014554
14555 return dot11f_unpack_ie_rsn(mac_ctx, buf, buf_len, rsn_ie, append_ie);
14556}
14557
Kiran Kumar Lokere89f01f02019-08-06 18:22:39 -070014558void sme_add_qcn_ie(mac_handle_t mac_handle, uint8_t *ie_data,
14559 uint16_t *ie_len)
14560{
14561 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Abhishek Singha25efe52019-09-06 20:37:19 +053014562 static const uint8_t qcn_ie[] = {WLAN_ELEMID_VENDOR, 8,
14563 0x8C, 0xFD, 0xF0, 0x1,
14564 QCN_IE_VERSION_SUBATTR_ID,
14565 QCN_IE_VERSION_SUBATTR_DATA_LEN,
14566 QCN_IE_VERSION_SUPPORTED,
14567 QCN_IE_SUBVERSION_SUPPORTED};
Kiran Kumar Lokere89f01f02019-08-06 18:22:39 -070014568
14569 if (!mac_ctx->mlme_cfg->sta.qcn_ie_support) {
14570 sme_debug("QCN IE is not supported");
14571 return;
14572 }
14573
14574 if (((*ie_len) + sizeof(qcn_ie)) > MAX_DEFAULT_SCAN_IE_LEN) {
14575 sme_err("IE buffer not enough for QCN IE");
14576 return;
14577 }
14578
14579 qdf_mem_copy(ie_data + (*ie_len), qcn_ie, sizeof(qcn_ie));
14580 (*ie_len) += sizeof(qcn_ie);
14581}
14582
Qiwei Caie689a262018-07-26 15:50:22 +080014583#ifdef FEATURE_BSS_TRANSITION
Vignesh Viswanathan9dd88d32017-11-22 14:22:03 +053014584/**
14585 * sme_get_status_for_candidate() - Get bss transition status for candidate
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -080014586 * @mac_handle: Opaque handle to the global MAC context
Vignesh Viswanathan9dd88d32017-11-22 14:22:03 +053014587 * @conn_bss_desc: connected bss descriptor
14588 * @bss_desc: candidate bss descriptor
14589 * @info: candiadate bss information
14590 * @trans_reason: transition reason code
14591 * @is_bt_in_progress: bt activity indicator
14592 *
14593 * Return : true if candidate is rejected and reject reason is filled
14594 * @info->status. Otherwise returns false.
14595 */
Jeff Johnsonc7309062018-11-09 20:59:42 -080014596static bool sme_get_status_for_candidate(mac_handle_t mac_handle,
Pragaspathi Thilagaraj1112c962019-05-23 23:45:38 +053014597 struct bss_description *conn_bss_desc,
14598 struct bss_description *bss_desc,
Jeff Johnsonc7309062018-11-09 20:59:42 -080014599 struct bss_candidate_info *info,
14600 uint8_t trans_reason,
14601 bool is_bt_in_progress)
Vignesh Viswanathan9dd88d32017-11-22 14:22:03 +053014602{
Jeff Johnson0a8786a2018-12-02 10:49:01 -080014603 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Pragaspathi Thilagarajcd6aef02018-09-11 20:30:23 +053014604 struct wlan_mlme_mbo *mbo_cfg;
14605 int8_t current_rssi_mcc_thres;
wadesong2225e562019-10-28 14:19:41 +080014606 uint32_t bss_chan_freq, conn_bss_chan_freq;
14607 bool bss_chan_safe, conn_bss_chan_safe;
Pragaspathi Thilagarajcd6aef02018-09-11 20:30:23 +053014608
14609 if (!(mac_ctx->mlme_cfg)) {
14610 pe_err("mlme cfg is NULL");
14611 return false;
14612 }
14613 mbo_cfg = &mac_ctx->mlme_cfg->mbo_cfg;
Vignesh Viswanathan9dd88d32017-11-22 14:22:03 +053014614
14615 /*
14616 * Low RSSI based rejection
14617 * If candidate rssi is less than mbo_candidate_rssi_thres and connected
14618 * bss rssi is greater than mbo_current_rssi_thres, then reject the
14619 * candidate with MBO reason code 4.
14620 */
Pragaspathi Thilagarajcd6aef02018-09-11 20:30:23 +053014621 if ((bss_desc->rssi < mbo_cfg->mbo_candidate_rssi_thres) &&
14622 (conn_bss_desc->rssi > mbo_cfg->mbo_current_rssi_thres)) {
Srinivas Girigowdacb7b8b82019-04-10 14:27:47 -070014623 sme_err("Candidate BSS "QDF_MAC_ADDR_STR" has LOW RSSI(%d), hence reject",
Srinivas Girigowda34fbba02019-04-08 12:07:44 -070014624 QDF_MAC_ADDR_ARRAY(bss_desc->bssId), bss_desc->rssi);
Vignesh Viswanathan9dd88d32017-11-22 14:22:03 +053014625 info->status = QCA_STATUS_REJECT_LOW_RSSI;
14626 return true;
14627 }
14628
14629 if (trans_reason == MBO_TRANSITION_REASON_LOAD_BALANCING ||
14630 trans_reason == MBO_TRANSITION_REASON_TRANSITIONING_TO_PREMIUM_AP) {
wadesong2225e562019-10-28 14:19:41 +080014631 bss_chan_freq = bss_desc->chan_freq;
14632 conn_bss_chan_freq = conn_bss_desc->chan_freq;
Vignesh Viswanathan9dd88d32017-11-22 14:22:03 +053014633 /*
14634 * MCC rejection
14635 * If moving to candidate's channel will result in MCC scenario
14636 * and the rssi of connected bss is greater than
14637 * mbo_current_rssi_mss_thres, then reject the candidate with
14638 * MBO reason code 3.
14639 */
Pragaspathi Thilagarajcd6aef02018-09-11 20:30:23 +053014640 current_rssi_mcc_thres = mbo_cfg->mbo_current_rssi_mcc_thres;
14641 if ((conn_bss_desc->rssi > current_rssi_mcc_thres) &&
wadesong2225e562019-10-28 14:19:41 +080014642 csr_is_mcc_channel(mac_ctx, bss_chan_freq)) {
Srinivas Girigowdacb7b8b82019-04-10 14:27:47 -070014643 sme_err("Candidate BSS "QDF_MAC_ADDR_STR" causes MCC, hence reject",
Srinivas Girigowda34fbba02019-04-08 12:07:44 -070014644 QDF_MAC_ADDR_ARRAY(bss_desc->bssId));
Vignesh Viswanathan9dd88d32017-11-22 14:22:03 +053014645 info->status =
14646 QCA_STATUS_REJECT_INSUFFICIENT_QOS_CAPACITY;
14647 return true;
14648 }
14649
14650 /*
14651 * BT coex rejection
14652 * If AP is trying to move the client from 5G to 2.4G and moving
14653 * to 2.4G will result in BT coex and candidate channel rssi is
14654 * less than mbo_candidate_rssi_btc_thres, then reject the
14655 * candidate with MBO reason code 2.
14656 */
wadesong2225e562019-10-28 14:19:41 +080014657 if (WLAN_REG_IS_5GHZ_CH_FREQ(conn_bss_chan_freq) &&
14658 WLAN_REG_IS_24GHZ_CH_FREQ(bss_chan_freq) &&
Vignesh Viswanathan9dd88d32017-11-22 14:22:03 +053014659 is_bt_in_progress &&
Pragaspathi Thilagarajcd6aef02018-09-11 20:30:23 +053014660 (bss_desc->rssi < mbo_cfg->mbo_candidate_rssi_btc_thres)) {
Srinivas Girigowdacb7b8b82019-04-10 14:27:47 -070014661 sme_err("Candidate BSS "QDF_MAC_ADDR_STR" causes BT coex, hence reject",
Srinivas Girigowda34fbba02019-04-08 12:07:44 -070014662 QDF_MAC_ADDR_ARRAY(bss_desc->bssId));
Vignesh Viswanathan9dd88d32017-11-22 14:22:03 +053014663 info->status =
14664 QCA_STATUS_REJECT_EXCESSIVE_DELAY_EXPECTED;
14665 return true;
14666 }
14667
14668 /*
14669 * LTE coex rejection
14670 * If moving to candidate's channel can cause LTE coex, then
14671 * reject the candidate with MBO reason code 5.
14672 */
wadesong2225e562019-10-28 14:19:41 +080014673 conn_bss_chan_safe = policy_mgr_is_safe_channel(
14674 mac_ctx->psoc, conn_bss_chan_freq);
14675 bss_chan_safe = policy_mgr_is_safe_channel(
14676 mac_ctx->psoc, bss_chan_freq);
14677
14678 if (conn_bss_chan_safe && !bss_chan_safe) {
Vignesh Viswanathan9dd88d32017-11-22 14:22:03 +053014679 sme_err("High interference expected if transitioned to BSS "
Srinivas Girigowdacb7b8b82019-04-10 14:27:47 -070014680 QDF_MAC_ADDR_STR" hence reject",
Srinivas Girigowda34fbba02019-04-08 12:07:44 -070014681 QDF_MAC_ADDR_ARRAY(bss_desc->bssId));
Vignesh Viswanathan9dd88d32017-11-22 14:22:03 +053014682 info->status =
14683 QCA_STATUS_REJECT_HIGH_INTERFERENCE;
14684 return true;
14685 }
14686 }
14687
14688 return false;
14689}
14690
Jeff Johnson62737252018-11-17 10:59:43 -080014691QDF_STATUS sme_get_bss_transition_status(mac_handle_t mac_handle,
14692 uint8_t transition_reason,
14693 struct qdf_mac_addr *bssid,
14694 struct bss_candidate_info *info,
14695 uint16_t n_candidates,
14696 bool is_bt_in_progress)
Vignesh Viswanathan9dd88d32017-11-22 14:22:03 +053014697{
14698 QDF_STATUS status = QDF_STATUS_SUCCESS;
Pragaspathi Thilagaraj1112c962019-05-23 23:45:38 +053014699 struct bss_description *bss_desc, *conn_bss_desc;
Vignesh Viswanathan9dd88d32017-11-22 14:22:03 +053014700 tCsrScanResultInfo *res, *conn_res;
14701 uint16_t i;
14702
14703 if (!n_candidates || !info) {
14704 sme_err("No candidate info available");
14705 return QDF_STATUS_E_INVAL;
14706 }
14707
14708 conn_res = qdf_mem_malloc(sizeof(tCsrScanResultInfo));
Arif Hussain0ef77082018-10-10 16:42:53 -070014709 if (!conn_res)
Vignesh Viswanathan9dd88d32017-11-22 14:22:03 +053014710 return QDF_STATUS_E_NOMEM;
Vignesh Viswanathan9dd88d32017-11-22 14:22:03 +053014711
14712 res = qdf_mem_malloc(sizeof(tCsrScanResultInfo));
14713 if (!res) {
Vignesh Viswanathan9dd88d32017-11-22 14:22:03 +053014714 status = QDF_STATUS_E_NOMEM;
14715 goto free;
14716 }
14717
14718 /* Get the connected BSS descriptor */
Jeff Johnsonc7309062018-11-09 20:59:42 -080014719 status = sme_scan_get_result_for_bssid(mac_handle, bssid, conn_res);
Vignesh Viswanathan9dd88d32017-11-22 14:22:03 +053014720 if (!QDF_IS_STATUS_SUCCESS(status)) {
14721 sme_err("Failed to find connected BSS in scan list");
14722 goto free;
14723 }
14724 conn_bss_desc = &conn_res->BssDescriptor;
14725
14726 for (i = 0; i < n_candidates; i++) {
14727 /* Get candidate BSS descriptors */
Jeff Johnsonc7309062018-11-09 20:59:42 -080014728 status = sme_scan_get_result_for_bssid(mac_handle,
14729 &info[i].bssid,
Vignesh Viswanathan9dd88d32017-11-22 14:22:03 +053014730 res);
14731 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowdacb7b8b82019-04-10 14:27:47 -070014732 sme_err("BSS "QDF_MAC_ADDR_STR" not present in scan list",
Srinivas Girigowda34fbba02019-04-08 12:07:44 -070014733 QDF_MAC_ADDR_ARRAY(info[i].bssid.bytes));
Vignesh Viswanathan9dd88d32017-11-22 14:22:03 +053014734 info[i].status = QCA_STATUS_REJECT_UNKNOWN;
14735 continue;
14736 }
14737
14738 bss_desc = &res->BssDescriptor;
Jeff Johnsonc7309062018-11-09 20:59:42 -080014739 if (!sme_get_status_for_candidate(mac_handle, conn_bss_desc,
14740 bss_desc, &info[i],
14741 transition_reason,
14742 is_bt_in_progress)) {
Vignesh Viswanathan9dd88d32017-11-22 14:22:03 +053014743 /*
14744 * If status is not over written, it means it is a
14745 * candidate for accept.
14746 */
14747 info[i].status = QCA_STATUS_ACCEPT;
14748 }
14749 }
14750
14751 /* success */
14752 status = QDF_STATUS_SUCCESS;
14753
14754free:
14755 /* free allocated memory */
14756 if (conn_res)
14757 qdf_mem_free(conn_res);
14758 if (res)
14759 qdf_mem_free(res);
14760
14761 return status;
14762}
Qiwei Caie689a262018-07-26 15:50:22 +080014763#endif /* FEATURE_BSS_TRANSITION */
Vignesh Viswanathan9dd88d32017-11-22 14:22:03 +053014764
Jeff Johnsonc7309062018-11-09 20:59:42 -080014765bool sme_is_conn_state_connected(mac_handle_t mac_handle, uint8_t session_id)
Vignesh Viswanathan79f7e3f2018-09-30 23:56:10 +053014766{
Jeff Johnson0a8786a2018-12-02 10:49:01 -080014767 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Vignesh Viswanathan79f7e3f2018-09-30 23:56:10 +053014768
14769 return csr_is_conn_state_connected(mac_ctx, session_id);
14770}
14771
Yeshwanth Sriram Guntuka1669fc02019-09-04 16:03:44 +053014772void sme_enable_roaming_on_connected_sta(mac_handle_t mac_handle,
14773 uint8_t vdev_id)
Abhishek Singh1f217ec2017-12-22 11:48:27 +053014774{
Jeff Johnson0a8786a2018-12-02 10:49:01 -080014775 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Abhishek Singh1f217ec2017-12-22 11:48:27 +053014776 QDF_STATUS status;
14777
Abhishek Singh1f217ec2017-12-22 11:48:27 +053014778 status = sme_acquire_global_lock(&mac_ctx->sme);
Yeshwanth Sriram Guntuka1669fc02019-09-04 16:03:44 +053014779 if (QDF_IS_STATUS_ERROR(status))
14780 return;
14781
14782 csr_enable_roaming_on_connected_sta(mac_ctx, vdev_id);
14783 sme_release_global_lock(&mac_ctx->sme);
Sandeep Puligilla063a4342018-01-10 02:50:14 -080014784}
Abhishek Singh1f217ec2017-12-22 11:48:27 +053014785
Sandeep Puligilla063a4342018-01-10 02:50:14 -080014786int16_t sme_get_oper_chan_freq(struct wlan_objmgr_vdev *vdev)
14787{
bingsb1444b32019-10-29 11:21:01 +080014788 uint8_t vdev_id;
Sandeep Puligilla063a4342018-01-10 02:50:14 -080014789 struct csr_roam_session *session;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080014790 struct mac_context *mac_ctx;
Jeff Johnsonb460dd72018-11-08 10:26:51 -080014791 mac_handle_t mac_handle;
Sandeep Puligilla063a4342018-01-10 02:50:14 -080014792
Jeff Johnson038efe72019-03-18 13:39:31 -070014793 if (!vdev) {
Sandeep Puligilla063a4342018-01-10 02:50:14 -080014794 sme_err("Invalid vdev id is passed");
14795 return 0;
14796 }
14797
Jeff Johnsonb460dd72018-11-08 10:26:51 -080014798 mac_handle = cds_get_context(QDF_MODULE_ID_SME);
14799 if (!mac_handle) {
14800 sme_err("mac_handle is null");
Arif Hussaind15902c2018-03-02 00:08:29 -080014801 return 0;
14802 }
Jeff Johnsona0619e42018-11-28 17:43:00 -080014803 mac_ctx = MAC_CONTEXT(mac_handle);
Sandeep Puligilla063a4342018-01-10 02:50:14 -080014804 vdev_id = wlan_vdev_get_id(vdev);
14805 if (!CSR_IS_SESSION_VALID(mac_ctx, vdev_id)) {
14806 sme_err("Invalid vdev id is passed");
14807 return 0;
14808 }
14809
14810 session = CSR_GET_SESSION(mac_ctx, vdev_id);
Sandeep Puligilla063a4342018-01-10 02:50:14 -080014811
bingsb1444b32019-10-29 11:21:01 +080014812 return csr_get_infra_operation_chan_freq(mac_ctx, vdev_id);
Sandeep Puligilla063a4342018-01-10 02:50:14 -080014813}
14814
14815enum phy_ch_width sme_get_oper_ch_width(struct wlan_objmgr_vdev *vdev)
14816{
14817 uint8_t vdev_id;
14818 struct csr_roam_session *session;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080014819 struct mac_context *mac_ctx;
Jeff Johnsonb460dd72018-11-08 10:26:51 -080014820 mac_handle_t mac_handle;
Sandeep Puligilla063a4342018-01-10 02:50:14 -080014821 enum phy_ch_width ch_width = CH_WIDTH_20MHZ;
14822
Jeff Johnson038efe72019-03-18 13:39:31 -070014823 if (!vdev) {
Sandeep Puligilla063a4342018-01-10 02:50:14 -080014824 sme_err("Invalid vdev id is passed");
14825 return CH_WIDTH_INVALID;
14826 }
14827
Jeff Johnsonb460dd72018-11-08 10:26:51 -080014828 mac_handle = cds_get_context(QDF_MODULE_ID_SME);
14829 if (!mac_handle) {
14830 sme_err("mac_handle is null");
Arif Hussaind15902c2018-03-02 00:08:29 -080014831 return CH_WIDTH_INVALID;
14832 }
Jeff Johnsona0619e42018-11-28 17:43:00 -080014833 mac_ctx = MAC_CONTEXT(mac_handle);
Sandeep Puligilla063a4342018-01-10 02:50:14 -080014834 vdev_id = wlan_vdev_get_id(vdev);
14835 if (!CSR_IS_SESSION_VALID(mac_ctx, vdev_id)) {
14836 sme_err("Invalid vdev id is passed");
14837 return CH_WIDTH_INVALID;
14838 }
14839
14840 session = CSR_GET_SESSION(mac_ctx, vdev_id);
14841
14842 if (csr_is_conn_state_connected(mac_ctx, vdev_id))
14843 ch_width = session->connectedProfile.vht_channel_width;
14844
14845 return ch_width;
14846}
14847
14848int sme_get_sec20chan_freq_mhz(struct wlan_objmgr_vdev *vdev,
14849 uint16_t *sec20chan_freq)
14850{
14851 uint8_t vdev_id;
14852
14853 vdev_id = wlan_vdev_get_id(vdev);
14854 /* Need to extend */
14855 return 0;
Abhishek Singh1f217ec2017-12-22 11:48:27 +053014856}
14857
Padma, Santhosh Kumardd3f4852018-01-16 18:51:51 +053014858#ifdef WLAN_FEATURE_SAE
Srinivas Dasarie854ff02019-02-11 17:24:48 +053014859QDF_STATUS sme_handle_sae_msg(mac_handle_t mac_handle,
14860 uint8_t session_id,
14861 uint8_t sae_status,
Pragaspathi Thilagaraja97d4982019-07-18 01:18:44 +053014862 struct qdf_mac_addr peer_mac_addr,
14863 const uint8_t *pmkid)
Padma, Santhosh Kumardd3f4852018-01-16 18:51:51 +053014864{
14865 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080014866 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Padma, Santhosh Kumardd3f4852018-01-16 18:51:51 +053014867 struct sir_sae_msg *sae_msg;
14868 struct scheduler_msg sch_msg = {0};
Pragaspathi Thilagaraja97d4982019-07-18 01:18:44 +053014869 struct wmi_roam_auth_status_params *params;
Srinivas Dasaria7bc4ff2019-09-13 12:54:47 +053014870 struct csr_roam_session *csr_session;
Padma, Santhosh Kumardd3f4852018-01-16 18:51:51 +053014871
14872 qdf_status = sme_acquire_global_lock(&mac->sme);
Pragaspathi Thilagaraja97d4982019-07-18 01:18:44 +053014873 if (QDF_IS_STATUS_ERROR(qdf_status))
14874 return qdf_status;
14875
Srinivas Dasaria7bc4ff2019-09-13 12:54:47 +053014876 csr_session = CSR_GET_SESSION(mac, session_id);
14877 if (!csr_session) {
14878 sme_err("session %d not found", session_id);
14879 qdf_status = QDF_STATUS_E_FAILURE;
14880 goto error;
14881 }
14882
14883 /* Update the status to SME in below cases
14884 * 1. SAP mode: Always
14885 * 2. STA mode: When the device is not in joined state
14886 *
14887 * If the device is in joined state, send the status to WMA which
14888 * is meant for roaming.
14889 */
14890 if ((csr_session->pCurRoamProfile &&
14891 csr_session->pCurRoamProfile->csrPersona == QDF_SAP_MODE) ||
14892 !CSR_IS_ROAM_JOINED(mac, session_id)) {
Padma, Santhosh Kumardd3f4852018-01-16 18:51:51 +053014893 sae_msg = qdf_mem_malloc(sizeof(*sae_msg));
14894 if (!sae_msg) {
14895 qdf_status = QDF_STATUS_E_NOMEM;
Pragaspathi Thilagaraja97d4982019-07-18 01:18:44 +053014896 goto error;
Padma, Santhosh Kumardd3f4852018-01-16 18:51:51 +053014897 }
Pragaspathi Thilagaraja97d4982019-07-18 01:18:44 +053014898
14899 sae_msg->message_type = eWNI_SME_SEND_SAE_MSG;
14900 sae_msg->length = sizeof(*sae_msg);
Abhishek Singhefe21e62019-09-20 10:03:24 +053014901 sae_msg->vdev_id = session_id;
Pragaspathi Thilagaraja97d4982019-07-18 01:18:44 +053014902 sae_msg->sae_status = sae_status;
14903 qdf_mem_copy(sae_msg->peer_mac_addr,
14904 peer_mac_addr.bytes,
14905 QDF_MAC_ADDR_SIZE);
Abhishek Singhefe21e62019-09-20 10:03:24 +053014906 sme_debug("SAE: sae_status %d vdev_id %d Peer: "
Pragaspathi Thilagaraja97d4982019-07-18 01:18:44 +053014907 QDF_MAC_ADDR_STR, sae_msg->sae_status,
Abhishek Singhefe21e62019-09-20 10:03:24 +053014908 sae_msg->vdev_id,
Pragaspathi Thilagaraja97d4982019-07-18 01:18:44 +053014909 QDF_MAC_ADDR_ARRAY(sae_msg->peer_mac_addr));
14910
14911 sch_msg.type = eWNI_SME_SEND_SAE_MSG;
14912 sch_msg.bodyptr = sae_msg;
14913
14914 qdf_status = scheduler_post_message(QDF_MODULE_ID_SME,
14915 QDF_MODULE_ID_PE,
14916 QDF_MODULE_ID_PE,
14917 &sch_msg);
14918 if (QDF_IS_STATUS_ERROR(qdf_status)) {
14919 qdf_mem_free(sae_msg);
14920 goto error;
14921 }
14922 } else {
14923 /*
14924 * For WPA3 SAE roaming, external auth offload is enabled. The
14925 * firmware will send preauth start event after candidate
14926 * selection. The supplicant will perform the SAE authentication
14927 * and will send the auth status, PMKID in the external auth
14928 * cmd.
14929 *
14930 * csr roam state is CSR_ROAM_STATE_JOINED. So this SAE
14931 * external auth event is for wpa3 roam pre-auth offload.
14932 *
14933 * Post the preauth status to WMA.
14934 */
14935 params = qdf_mem_malloc(sizeof(*params));
14936 if (!params) {
14937 qdf_status = QDF_STATUS_E_NOMEM;
14938 goto error;
14939 }
14940
14941 params->vdev_id = session_id;
14942 params->preauth_status = sae_status;
14943 qdf_copy_macaddr(&params->bssid, &peer_mac_addr);
14944
14945 qdf_mem_zero(params->pmkid, PMKID_LEN);
14946 if (pmkid)
14947 qdf_mem_copy(params->pmkid, pmkid, PMKID_LEN);
14948
14949 sch_msg.type = WMA_ROAM_PRE_AUTH_STATUS;
14950 sch_msg.bodyptr = params;
14951
14952 qdf_status = scheduler_post_message(QDF_MODULE_ID_SME,
14953 QDF_MODULE_ID_WMA,
14954 QDF_MODULE_ID_WMA,
14955 &sch_msg);
14956 if (QDF_IS_STATUS_ERROR(qdf_status)) {
14957 sme_err("WMA_ROAM_PRE_AUTH_STATUS cmd posting failed");
14958 qdf_mem_free(params);
14959 }
Padma, Santhosh Kumardd3f4852018-01-16 18:51:51 +053014960 }
Pragaspathi Thilagaraja97d4982019-07-18 01:18:44 +053014961error:
14962 sme_release_global_lock(&mac->sme);
Padma, Santhosh Kumardd3f4852018-01-16 18:51:51 +053014963
14964 return qdf_status;
14965}
14966#endif
Vignesh Viswanathan0a569292018-02-14 15:34:47 +053014967
Jeff Johnsonc7309062018-11-09 20:59:42 -080014968bool sme_is_sta_key_exchange_in_progress(mac_handle_t mac_handle,
14969 uint8_t session_id)
Vignesh Viswanathan0a569292018-02-14 15:34:47 +053014970{
Jeff Johnson0a8786a2018-12-02 10:49:01 -080014971 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Vignesh Viswanathan0a569292018-02-14 15:34:47 +053014972
14973 if (!CSR_IS_SESSION_VALID(mac_ctx, session_id)) {
14974 sme_err("Invalid session id: %d", session_id);
14975 return false;
14976 }
14977
14978 return CSR_IS_WAIT_FOR_KEY(mac_ctx, session_id);
14979}
Vignesh Viswanathana2f5ce582018-05-09 20:38:39 +053014980
Jeff Johnsonc7309062018-11-09 20:59:42 -080014981bool sme_validate_channel_list(mac_handle_t mac_handle,
Liangwei Dong075afa72019-10-30 12:58:22 +080014982 uint32_t *chan_freq_list,
Jeff Johnsonc7309062018-11-09 20:59:42 -080014983 uint8_t num_channels)
Vignesh Viswanathana2f5ce582018-05-09 20:38:39 +053014984{
Jeff Johnson0a8786a2018-12-02 10:49:01 -080014985 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Vignesh Viswanathana2f5ce582018-05-09 20:38:39 +053014986 uint8_t i = 0;
14987 uint8_t j;
14988 bool found;
14989 struct csr_channel *ch_lst_info = &mac_ctx->scan.base_channels;
14990
Liangwei Dong075afa72019-10-30 12:58:22 +080014991 if (!chan_freq_list || !num_channels) {
14992 sme_err("Chan list empty %pK or num_channels is 0",
14993 chan_freq_list);
Vignesh Viswanathana2f5ce582018-05-09 20:38:39 +053014994 return false;
14995 }
14996
14997 while (i < num_channels) {
14998 found = false;
14999 for (j = 0; j < ch_lst_info->numChannels; j++) {
Tushnim Bhattacharyya42299b82019-09-01 18:03:54 -070015000 if (ch_lst_info->channel_freq_list[j] ==
Liangwei Dong075afa72019-10-30 12:58:22 +080015001 chan_freq_list[i]) {
Vignesh Viswanathana2f5ce582018-05-09 20:38:39 +053015002 found = true;
15003 break;
15004 }
15005 }
15006
15007 if (!found) {
Liangwei Dong075afa72019-10-30 12:58:22 +080015008 sme_debug("Invalid channel %d", chan_freq_list[i]);
Vignesh Viswanathana2f5ce582018-05-09 20:38:39 +053015009 return false;
15010 }
15011
15012 i++;
15013 }
Arif Hussain0e246802018-05-01 18:13:44 -070015014
Vignesh Viswanathana2f5ce582018-05-09 20:38:39 +053015015 return true;
15016}
Arif Hussain0e246802018-05-01 18:13:44 -070015017
Jeff Johnsonc7309062018-11-09 20:59:42 -080015018void sme_set_amsdu(mac_handle_t mac_handle, bool enable)
Arif Hussain0e246802018-05-01 18:13:44 -070015019{
Jeff Johnson0a8786a2018-12-02 10:49:01 -080015020 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Arif Hussain0e246802018-05-01 18:13:44 -070015021 mac_ctx->is_usr_cfg_amsdu_enabled = enable;
15022}
Naveen Rawatfa2a1002018-05-17 16:06:37 -070015023
Kiran Kumar Lokere921b5a52019-02-24 21:53:20 -080015024#ifdef WLAN_FEATURE_11AX
15025void sme_set_he_testbed_def(mac_handle_t mac_handle, uint8_t vdev_id)
15026{
15027 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
15028 struct csr_roam_session *session;
15029
15030 session = CSR_GET_SESSION(mac_ctx, vdev_id);
15031
15032 if (!session) {
15033 sme_debug("No session for id %d", vdev_id);
15034 return;
15035 }
15036 sme_debug("set HE testbed defaults");
15037 mac_ctx->mlme_cfg->he_caps.dot11_he_cap.amsdu_in_ampdu = 0;
15038 mac_ctx->mlme_cfg->he_caps.dot11_he_cap.twt_request = 0;
15039 mac_ctx->mlme_cfg->he_caps.dot11_he_cap.omi_a_ctrl = 0;
15040 mac_ctx->mlme_cfg->he_caps.dot11_he_cap.he_ppdu_20_in_160_80p80Mhz = 0;
15041 mac_ctx->mlme_cfg->he_caps.dot11_he_cap.he_ppdu_20_in_40Mhz_2G = 0;
15042 mac_ctx->mlme_cfg->he_caps.dot11_he_cap.he_ppdu_80_in_160_80p80Mhz = 0;
15043 mac_ctx->mlme_cfg->he_caps.dot11_he_cap.dcm_enc_tx = 0;
15044 mac_ctx->mlme_cfg->he_caps.dot11_he_cap.dcm_enc_rx = 0;
Kiran Kumar Lokere2d53f9d2019-06-19 17:37:42 -070015045 mac_ctx->mlme_cfg->he_caps.dot11_he_cap.ul_mu = 0;
Kiran Kumar Lokere921b5a52019-02-24 21:53:20 -080015046 mac_ctx->mlme_cfg->he_caps.dot11_he_cap.max_nc = 0;
15047 mac_ctx->mlme_cfg->he_caps.dot11_he_cap.trigger_frm_mac_pad =
15048 QCA_WLAN_HE_16US_OF_PROCESS_TIME;
Kiran Kumar Lokere05a61852019-04-02 18:39:19 -070015049 mac_ctx->mlme_cfg->he_caps.dot11_he_cap.flex_twt_sched = 0;
15050 mac_ctx->mlme_cfg->he_caps.dot11_he_cap.ofdma_ra = 0;
15051 mac_ctx->mlme_cfg->he_caps.dot11_he_cap.he_4x_ltf_3200_gi_ndp = 0;
15052 mac_ctx->mlme_cfg->he_caps.dot11_he_cap.qtp = 0;
15053 mac_ctx->mlme_cfg->he_caps.dot11_he_cap.bsrp_ampdu_aggr = 0;
15054 mac_ctx->mlme_cfg->he_caps.dot11_he_cap.a_bqr = 0;
15055 mac_ctx->mlme_cfg->he_caps.dot11_he_cap.he_sub_ch_sel_tx_supp = 0;
15056 mac_ctx->mlme_cfg->he_caps.dot11_he_cap.ndp_feedback_supp = 0;
15057 mac_ctx->mlme_cfg->he_caps.dot11_he_cap.ops_supp = 0;
15058 mac_ctx->mlme_cfg->he_caps.dot11_he_cap.srp = 0;
15059 mac_ctx->mlme_cfg->he_caps.dot11_he_cap.power_boost = 0;
15060 mac_ctx->mlme_cfg->he_caps.dot11_he_cap.num_sounding_lt_80 = 0;
15061 mac_ctx->mlme_cfg->he_caps.dot11_he_cap.num_sounding_gt_80 = 0;
15062 mac_ctx->mlme_cfg->he_caps.dot11_he_cap.dl_mu_mimo_part_bw = 0;
15063 mac_ctx->mlme_cfg->he_caps.dot11_he_cap.non_trig_cqi_feedback = 0;
15064 mac_ctx->mlme_cfg->he_caps.dot11_he_cap.tx_1024_qam_lt_242_tone_ru = 0;
15065 mac_ctx->mlme_cfg->he_caps.dot11_he_cap.rx_1024_qam_lt_242_tone_ru = 0;
15066 mac_ctx->mlme_cfg->he_caps.dot11_he_cap.rx_full_bw_su_he_mu_compress_sigb = 0;
15067 mac_ctx->mlme_cfg->he_caps.dot11_he_cap.rx_full_bw_su_he_mu_non_cmpr_sigb = 0;
15068 mac_ctx->mlme_cfg->he_caps.dot11_he_cap.su_beamformer = 0;
15069 mac_ctx->mlme_cfg->he_caps.dot11_he_cap.multi_tid_aggr_rx_supp = 0;
15070 mac_ctx->mlme_cfg->he_caps.dot11_he_cap.multi_tid_aggr_tx_supp = 0;
15071 mac_ctx->mlme_cfg->he_caps.dot11_he_cap.he_dynamic_smps = 0;
15072 mac_ctx->mlme_cfg->he_caps.dot11_he_cap.punctured_sounding_supp = 0;
15073 mac_ctx->mlme_cfg->he_caps.dot11_he_cap.ht_vht_trg_frm_rx_supp = 0;
15074 mac_ctx->mlme_cfg->he_caps.dot11_he_cap.su_feedback_tone16 = 0;
15075 mac_ctx->mlme_cfg->he_caps.dot11_he_cap.mu_feedback_tone16 = 0;
15076 mac_ctx->mlme_cfg->he_caps.dot11_he_cap.codebook_su = 0;
15077 mac_ctx->mlme_cfg->he_caps.dot11_he_cap.codebook_mu = 0;
15078 mac_ctx->mlme_cfg->he_caps.dot11_he_cap.ul_2x996_tone_ru_supp = 0;
15079 mac_ctx->mlme_cfg->he_caps.dot11_he_cap.beamforming_feedback = 0;
15080 mac_ctx->mlme_cfg->he_caps.dot11_he_cap.he_er_su_ppdu = 0;
15081 mac_ctx->mlme_cfg->he_caps.dot11_he_cap.dl_mu_mimo_part_bw = 0;
Kiran Kumar Lokere921b5a52019-02-24 21:53:20 -080015082 csr_update_session_he_cap(mac_ctx, session);
15083}
15084
15085void sme_reset_he_caps(mac_handle_t mac_handle, uint8_t vdev_id)
15086{
15087 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
15088 struct csr_roam_session *session;
15089
15090 session = CSR_GET_SESSION(mac_ctx, vdev_id);
15091
15092 if (!session) {
15093 sme_err("No session for id %d", vdev_id);
15094 return;
15095 }
15096 sme_debug("reset HE caps");
15097 mac_ctx->mlme_cfg->he_caps.dot11_he_cap =
15098 mac_ctx->mlme_cfg->he_caps.he_cap_orig;
15099 csr_update_session_he_cap(mac_ctx, session);
15100}
15101#endif
15102
Jingxiang Gef1d81592019-10-20 12:03:22 +080015103uint8_t sme_get_mcs_idx(uint16_t raw_rate, enum tx_rate_info rate_flags,
15104 uint8_t *nss, uint8_t *dcm,
15105 enum txrate_gi *guard_interval,
15106 enum tx_rate_info *mcs_rate_flags)
Naveen Rawatfa2a1002018-05-17 16:06:37 -070015107{
Jingxiang Gef1d81592019-10-20 12:03:22 +080015108 return wma_get_mcs_idx(raw_rate, rate_flags,
15109 nss, dcm, guard_interval, mcs_rate_flags);
Naveen Rawatfa2a1002018-05-17 16:06:37 -070015110}
Chaoli Zhou75b062f2018-06-11 12:36:54 +080015111
Krunal Soni5e483782018-10-25 15:42:44 -070015112#ifdef FEATURE_WLAN_DIAG_SUPPORT_CSR
15113QDF_STATUS sme_get_sta_cxn_info(mac_handle_t mac_handle, uint32_t session_id,
15114 char *buf, uint32_t buf_sz)
15115{
15116 QDF_STATUS status;
15117 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
15118 struct tagCsrRoamConnectedProfile *conn_profile;
15119 struct csr_roam_session *session = CSR_GET_SESSION(mac_ctx, session_id);
15120
15121 status = sme_acquire_global_lock(&mac_ctx->sme);
15122 if (!QDF_IS_STATUS_SUCCESS(status))
15123 return status;
15124 if (!session || !session->pCurRoamProfile) {
15125 status = QDF_STATUS_E_FAILURE;
15126 goto end;
15127 }
15128 conn_profile = &session->connectedProfile;
15129 if (!conn_profile) {
15130 status = QDF_STATUS_E_FAILURE;
15131 goto end;
15132 }
15133 csr_get_sta_cxn_info(mac_ctx, session, conn_profile, buf, buf_sz);
15134end:
15135 sme_release_global_lock(&mac_ctx->sme);
15136
15137 return status;
15138}
15139#endif
Rajeev Kumar Sirasanagandla4f20b672018-03-12 13:52:50 +053015140QDF_STATUS
Jeff Johnsonc7309062018-11-09 20:59:42 -080015141sme_get_roam_scan_stats(mac_handle_t mac_handle,
15142 roam_scan_stats_cb cb, void *context,
Rajeev Kumar Sirasanagandla4f20b672018-03-12 13:52:50 +053015143 uint32_t vdev_id)
15144{
15145 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080015146 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Rajeev Kumar Sirasanagandla4f20b672018-03-12 13:52:50 +053015147 struct scheduler_msg msg = {0};
15148 struct sir_roam_scan_stats *req;
15149
15150 req = qdf_mem_malloc(sizeof(*req));
Arif Hussain0ef77082018-10-10 16:42:53 -070015151 if (!req)
Rajeev Kumar Sirasanagandla4f20b672018-03-12 13:52:50 +053015152 return QDF_STATUS_E_NOMEM;
Rajeev Kumar Sirasanagandla4f20b672018-03-12 13:52:50 +053015153
15154 req->vdev_id = vdev_id;
15155 req->cb = cb;
15156 req->context = context;
15157
15158 status = sme_acquire_global_lock(&mac->sme);
15159 if (QDF_IS_STATUS_SUCCESS(status)) {
15160 msg.bodyptr = req;
15161 msg.type = WMA_GET_ROAM_SCAN_STATS;
15162 msg.reserved = 0;
gaurank kathpalia36b0c582018-08-28 17:45:43 +053015163 status = scheduler_post_message(QDF_MODULE_ID_SME,
15164 QDF_MODULE_ID_WMA,
15165 QDF_MODULE_ID_WMA,
15166 &msg);
Rajeev Kumar Sirasanagandla4f20b672018-03-12 13:52:50 +053015167 sme_release_global_lock(&mac->sme);
15168 if (!QDF_IS_STATUS_SUCCESS(status)) {
15169 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
15170 FL("post roam scan stats req failed"));
15171 status = QDF_STATUS_E_FAILURE;
15172 qdf_mem_free(req);
15173 }
15174 } else {
Rajeev Kumar Sirasanagandla4f20b672018-03-12 13:52:50 +053015175 qdf_mem_free(req);
15176 }
15177
15178 return status;
15179}
Vignesh Viswanathan987f0bb2018-09-17 17:00:29 +053015180
Jeff Johnsonc7309062018-11-09 20:59:42 -080015181void sme_update_score_config(mac_handle_t mac_handle,
Vignesh Viswanathan987f0bb2018-09-17 17:00:29 +053015182 struct scoring_config *score_config)
15183{
Jeff Johnson0a8786a2018-12-02 10:49:01 -080015184 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Vignesh Viswanathan987f0bb2018-09-17 17:00:29 +053015185 struct wlan_mlme_scoring_cfg *mlme_scoring_cfg;
15186
15187 mlme_scoring_cfg = &mac_ctx->mlme_cfg->scoring;
15188
15189 score_config->weight_cfg.rssi_weightage =
15190 mlme_scoring_cfg->weight_cfg.rssi_weightage;
15191 score_config->weight_cfg.ht_caps_weightage =
15192 mlme_scoring_cfg->weight_cfg.ht_caps_weightage;
15193 score_config->weight_cfg.vht_caps_weightage =
15194 mlme_scoring_cfg->weight_cfg.vht_caps_weightage;
15195 score_config->weight_cfg.he_caps_weightage =
15196 mlme_scoring_cfg->weight_cfg.he_caps_weightage;
15197 score_config->weight_cfg.chan_width_weightage =
15198 mlme_scoring_cfg->weight_cfg.chan_width_weightage;
15199 score_config->weight_cfg.chan_band_weightage =
15200 mlme_scoring_cfg->weight_cfg.chan_band_weightage;
15201 score_config->weight_cfg.nss_weightage =
15202 mlme_scoring_cfg->weight_cfg.nss_weightage;
15203 score_config->weight_cfg.beamforming_cap_weightage =
15204 mlme_scoring_cfg->weight_cfg.beamforming_cap_weightage;
15205 score_config->weight_cfg.pcl_weightage =
15206 mlme_scoring_cfg->weight_cfg.pcl_weightage;
15207 score_config->weight_cfg.channel_congestion_weightage =
15208 mlme_scoring_cfg->weight_cfg.channel_congestion_weightage;
15209 score_config->weight_cfg.oce_wan_weightage =
15210 mlme_scoring_cfg->weight_cfg.oce_wan_weightage;
15211
15212 score_config->bandwidth_weight_per_index =
15213 mlme_scoring_cfg->bandwidth_weight_per_index;
15214 score_config->nss_weight_per_index =
15215 mlme_scoring_cfg->nss_weight_per_index;
15216 score_config->band_weight_per_index =
15217 mlme_scoring_cfg->band_weight_per_index;
15218
15219 score_config->rssi_score.best_rssi_threshold =
15220 mlme_scoring_cfg->rssi_score.best_rssi_threshold;
15221 score_config->rssi_score.good_rssi_threshold =
15222 mlme_scoring_cfg->rssi_score.good_rssi_threshold;
15223 score_config->rssi_score.bad_rssi_threshold =
15224 mlme_scoring_cfg->rssi_score.bad_rssi_threshold;
15225 score_config->rssi_score.good_rssi_pcnt =
15226 mlme_scoring_cfg->rssi_score.good_rssi_pcnt;
15227 score_config->rssi_score.bad_rssi_pcnt =
15228 mlme_scoring_cfg->rssi_score.bad_rssi_pcnt;
15229 score_config->rssi_score.good_rssi_bucket_size =
15230 mlme_scoring_cfg->rssi_score.good_rssi_bucket_size;
15231 score_config->rssi_score.bad_rssi_bucket_size =
15232 mlme_scoring_cfg->rssi_score.bad_rssi_bucket_size;
15233 score_config->rssi_score.rssi_pref_5g_rssi_thresh =
15234 mlme_scoring_cfg->rssi_score.rssi_pref_5g_rssi_thresh;
15235
15236 score_config->esp_qbss_scoring.num_slot =
15237 mlme_scoring_cfg->esp_qbss_scoring.num_slot;
15238 score_config->esp_qbss_scoring.score_pcnt3_to_0 =
15239 mlme_scoring_cfg->esp_qbss_scoring.score_pcnt3_to_0;
15240 score_config->esp_qbss_scoring.score_pcnt7_to_4 =
15241 mlme_scoring_cfg->esp_qbss_scoring.score_pcnt7_to_4;
15242 score_config->esp_qbss_scoring.score_pcnt11_to_8 =
15243 mlme_scoring_cfg->esp_qbss_scoring.score_pcnt11_to_8;
15244 score_config->esp_qbss_scoring.score_pcnt15_to_12 =
15245 mlme_scoring_cfg->esp_qbss_scoring.score_pcnt15_to_12;
15246
15247 score_config->oce_wan_scoring.num_slot =
15248 mlme_scoring_cfg->oce_wan_scoring.num_slot;
15249 score_config->oce_wan_scoring.score_pcnt3_to_0 =
15250 mlme_scoring_cfg->oce_wan_scoring.score_pcnt3_to_0;
15251 score_config->oce_wan_scoring.score_pcnt7_to_4 =
15252 mlme_scoring_cfg->oce_wan_scoring.score_pcnt7_to_4;
15253 score_config->oce_wan_scoring.score_pcnt11_to_8 =
15254 mlme_scoring_cfg->oce_wan_scoring.score_pcnt11_to_8;
15255 score_config->oce_wan_scoring.score_pcnt15_to_12 =
15256 mlme_scoring_cfg->oce_wan_scoring.score_pcnt15_to_12;
15257}
lifengfaa83cb2018-11-24 01:53:56 +080015258
15259void sme_enable_fw_module_log_level(mac_handle_t mac_handle, int vdev_id)
15260{
15261 QDF_STATUS status;
15262 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
15263 uint8_t *enable_fw_module_log_level;
15264 uint8_t enable_fw_module_log_level_num;
15265 uint8_t count = 0;
15266 uint32_t value = 0;
15267 int ret;
15268
15269 status = ucfg_fwol_get_enable_fw_module_log_level(
15270 mac_ctx->psoc, &enable_fw_module_log_level,
15271 &enable_fw_module_log_level_num);
15272 if (QDF_IS_STATUS_ERROR(status))
15273 return;
15274
15275 while (count < enable_fw_module_log_level_num) {
15276 /*
15277 * FW module log level input array looks like
15278 * below:
15279 * enable_fw_module_log_level = {<FW Module ID>,
15280 * <Log Level>,...}
15281 * For example:
15282 * enable_fw_module_log_level=
15283 * {1,0,2,1,3,2,4,3,5,4,6,5,7,6}
15284 * Above input array means :
15285 * For FW module ID 1 enable log level 0
15286 * For FW module ID 2 enable log level 1
15287 * For FW module ID 3 enable log level 2
15288 * For FW module ID 4 enable log level 3
15289 * For FW module ID 5 enable log level 4
15290 * For FW module ID 6 enable log level 5
15291 * For FW module ID 7 enable log level 6
15292 */
15293
15294 if ((enable_fw_module_log_level[count] > WLAN_MODULE_ID_MAX) ||
15295 (enable_fw_module_log_level[count + 1] > DBGLOG_LVL_MAX)) {
15296 sme_err("Module id %d or dbglog level %d input value is more than max",
15297 enable_fw_module_log_level[count],
15298 enable_fw_module_log_level[count + 1]);
wadesongeb865bb2019-01-09 19:01:06 +080015299 count += 2;
lifengfaa83cb2018-11-24 01:53:56 +080015300 continue;
15301 }
15302
15303 value = enable_fw_module_log_level[count] << 16;
15304 value |= enable_fw_module_log_level[count + 1];
15305 ret = sme_cli_set_command(vdev_id,
15306 WMI_DBGLOG_MOD_LOG_LEVEL,
15307 value, DBG_CMD);
15308 if (ret != 0)
15309 sme_err("Failed to enable FW module log level %d ret %d",
15310 value, ret);
15311
15312 count += 2;
15313 }
15314}
Visweswara Tanuku633976b2019-01-07 16:13:12 +053015315
15316#ifdef WLAN_FEATURE_MOTION_DETECTION
15317/**
Visweswara Tanuku41d21c02019-10-25 14:51:59 +053015318 * sme_set_md_bl_evt_cb - Register/set motion detection baseline callback
15319 * @mac_handle: mac handle
15320 * @callback_fn: callback function pointer
15321 * @hdd_ctx: hdd context
15322 *
15323 * Return: QDF_STATUS_SUCCESS or non-zero on failure
15324 */
15325QDF_STATUS sme_set_md_bl_evt_cb(
15326 mac_handle_t mac_handle,
15327 QDF_STATUS (*callback_fn)(void *ctx, struct sir_md_bl_evt *event),
15328 void *hdd_ctx
15329)
15330{
15331 struct mac_context *mac = MAC_CONTEXT(mac_handle);
15332 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
15333
15334 qdf_status = sme_acquire_global_lock(&mac->sme);
15335 if (QDF_IS_STATUS_SUCCESS(qdf_status)) {
15336 mac->sme.md_bl_evt_cb = callback_fn;
15337 mac->sme.md_ctx = hdd_ctx;
15338 sme_release_global_lock(&mac->sme);
15339 }
15340 return qdf_status;
15341}
15342
15343/**
Visweswara Tanuku633976b2019-01-07 16:13:12 +053015344 * sme_set_md_host_evt_cb - Register/set motion detection callback
15345 * @mac_handle: mac handle
15346 * @callback_fn: motion detection callback function pointer
15347 * @hdd_ctx: hdd context
15348 *
15349 * Return: QDF_STATUS_SUCCESS or non-zero on failure
15350 */
15351QDF_STATUS sme_set_md_host_evt_cb(
15352 mac_handle_t mac_handle,
15353 QDF_STATUS (*callback_fn)(void *ctx, struct sir_md_evt *event),
15354 void *hdd_ctx
15355)
15356{
15357 struct mac_context *mac = MAC_CONTEXT(mac_handle);
15358 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
15359
15360 qdf_status = sme_acquire_global_lock(&mac->sme);
15361 if (QDF_IS_STATUS_SUCCESS(qdf_status)) {
15362 mac->sme.md_host_evt_cb = callback_fn;
15363 mac->sme.md_ctx = hdd_ctx;
15364 sme_release_global_lock(&mac->sme);
15365 }
15366 return qdf_status;
15367}
15368
15369/**
15370 * sme_motion_det_config - Post motion detection configuration msg to scheduler
15371 * @mac_handle: mac handle
15372 * @motion_det_config: motion detection configuration
15373 *
15374 * Return: QDF_STATUS_SUCCESS or non-zero on failure
15375 */
15376QDF_STATUS sme_motion_det_config(mac_handle_t mac_handle,
15377 struct sme_motion_det_cfg *motion_det_config)
15378{
Visweswara Tanuku025f5862019-01-08 17:35:33 +053015379 struct scheduler_msg msg;
Visweswara Tanuku633976b2019-01-07 16:13:12 +053015380 struct sme_motion_det_cfg *motion_det_cfg;
15381 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
15382 struct mac_context *mac = MAC_CONTEXT(mac_handle);
15383
15384 qdf_status = sme_acquire_global_lock(&mac->sme);
15385 if (QDF_IS_STATUS_SUCCESS(qdf_status)) {
15386 motion_det_cfg =
15387 qdf_mem_malloc(sizeof(*motion_det_cfg));
15388 if (!motion_det_cfg) {
15389 sme_release_global_lock(&mac->sme);
15390 return QDF_STATUS_E_NOMEM;
15391 }
15392
15393 *motion_det_cfg = *motion_det_config;
15394
15395 qdf_mem_set(&msg, sizeof(msg), 0);
15396 msg.type = WMA_SET_MOTION_DET_CONFIG;
15397 msg.bodyptr = motion_det_cfg;
15398
15399 qdf_status = scheduler_post_message(QDF_MODULE_ID_SME,
15400 QDF_MODULE_ID_WMA,
15401 QDF_MODULE_ID_WMA,
15402 &msg);
15403 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
15404 qdf_mem_free(motion_det_cfg);
15405 qdf_status = QDF_STATUS_E_FAILURE;
15406 }
15407 sme_release_global_lock(&mac->sme);
15408 }
15409 return qdf_status;
15410}
15411
15412/**
15413 * sme_motion_det_enable - Post motion detection start/stop msg to scheduler
15414 * @mac_handle: mac handle
15415 * @motion_det_enable: motion detection start/stop
15416 *
15417 * Return: QDF_STATUS_SUCCESS or non-zero on failure
15418 */
15419QDF_STATUS sme_motion_det_enable(mac_handle_t mac_handle,
15420 struct sme_motion_det_en *motion_det_enable)
15421{
Visweswara Tanuku025f5862019-01-08 17:35:33 +053015422 struct scheduler_msg msg;
Visweswara Tanuku633976b2019-01-07 16:13:12 +053015423 struct sme_motion_det_en *motion_det_en;
15424 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
15425 struct mac_context *mac = MAC_CONTEXT(mac_handle);
15426
15427 qdf_status = sme_acquire_global_lock(&mac->sme);
15428 if (QDF_IS_STATUS_SUCCESS(qdf_status)) {
15429 motion_det_en = qdf_mem_malloc(sizeof(*motion_det_en));
15430 if (!motion_det_en) {
15431 sme_release_global_lock(&mac->sme);
15432 return QDF_STATUS_E_NOMEM;
15433 }
15434
15435 *motion_det_en = *motion_det_enable;
15436
15437 qdf_mem_set(&msg, sizeof(msg), 0);
15438 msg.type = WMA_SET_MOTION_DET_ENABLE;
15439 msg.bodyptr = motion_det_en;
15440
15441 qdf_status = scheduler_post_message(QDF_MODULE_ID_SME,
15442 QDF_MODULE_ID_WMA,
15443 QDF_MODULE_ID_WMA,
15444 &msg);
15445 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
15446 qdf_mem_free(motion_det_en);
15447 qdf_status = QDF_STATUS_E_FAILURE;
15448 }
15449 sme_release_global_lock(&mac->sme);
15450 }
15451 return qdf_status;
15452}
15453
15454/**
15455 * sme_motion_det_base_line_config - Post md baselining cfg msg to scheduler
15456 * @mac_handle: mac handle
15457 * @motion_det_base_line_config: motion detection baselining configuration
15458 *
15459 * Return: QDF_STATUS_SUCCESS or non-zero on failure
15460 */
15461QDF_STATUS sme_motion_det_base_line_config(
15462 mac_handle_t mac_handle,
15463 struct sme_motion_det_base_line_cfg *motion_det_base_line_config)
15464{
Visweswara Tanuku025f5862019-01-08 17:35:33 +053015465 struct scheduler_msg msg;
Visweswara Tanuku633976b2019-01-07 16:13:12 +053015466 struct sme_motion_det_base_line_cfg *motion_det_base_line_cfg;
15467 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
15468 struct mac_context *mac = MAC_CONTEXT(mac_handle);
15469
15470 qdf_status = sme_acquire_global_lock(&mac->sme);
15471 if (QDF_IS_STATUS_SUCCESS(qdf_status)) {
15472 motion_det_base_line_cfg =
15473 qdf_mem_malloc(sizeof(*motion_det_base_line_cfg));
15474
15475 if (!motion_det_base_line_cfg) {
15476 sme_release_global_lock(&mac->sme);
15477 return QDF_STATUS_E_NOMEM;
15478 }
15479
15480 *motion_det_base_line_cfg = *motion_det_base_line_config;
15481
Visweswara Tanuku025f5862019-01-08 17:35:33 +053015482 qdf_mem_set(&msg, sizeof(msg), 0);
Visweswara Tanuku633976b2019-01-07 16:13:12 +053015483 msg.type = WMA_SET_MOTION_DET_BASE_LINE_CONFIG;
15484 msg.bodyptr = motion_det_base_line_cfg;
15485
15486 qdf_status = scheduler_post_message(QDF_MODULE_ID_SME,
15487 QDF_MODULE_ID_WMA,
15488 QDF_MODULE_ID_WMA,
15489 &msg);
15490 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
15491 qdf_mem_free(motion_det_base_line_cfg);
15492 qdf_status = QDF_STATUS_E_FAILURE;
15493 }
15494 sme_release_global_lock(&mac->sme);
15495 }
15496 return qdf_status;
15497}
15498
15499/**
15500 * sme_motion_det_base_line_enable - Post md baselining enable msg to scheduler
15501 * @mac_handle: mac handle
15502 * @motion_det_base_line_enable: motion detection baselining start/stop
15503 *
15504 * Return: QDF_STATUS_SUCCESS or non-zero on failure
15505 */
15506QDF_STATUS sme_motion_det_base_line_enable(
15507 mac_handle_t mac_handle,
15508 struct sme_motion_det_base_line_en *motion_det_base_line_enable)
15509{
Visweswara Tanuku025f5862019-01-08 17:35:33 +053015510 struct scheduler_msg msg;
Visweswara Tanuku633976b2019-01-07 16:13:12 +053015511 struct sme_motion_det_base_line_en *motion_det_base_line_en;
15512 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
15513 struct mac_context *mac = MAC_CONTEXT(mac_handle);
15514
15515 qdf_status = sme_acquire_global_lock(&mac->sme);
15516 if (QDF_IS_STATUS_SUCCESS(qdf_status)) {
15517 motion_det_base_line_en =
15518 qdf_mem_malloc(sizeof(*motion_det_base_line_en));
15519
15520 if (!motion_det_base_line_en) {
15521 sme_release_global_lock(&mac->sme);
15522 return QDF_STATUS_E_NOMEM;
15523 }
15524
15525 *motion_det_base_line_en = *motion_det_base_line_enable;
15526
Visweswara Tanuku025f5862019-01-08 17:35:33 +053015527 qdf_mem_set(&msg, sizeof(msg), 0);
Visweswara Tanuku633976b2019-01-07 16:13:12 +053015528 msg.type = WMA_SET_MOTION_DET_BASE_LINE_ENABLE;
15529 msg.bodyptr = motion_det_base_line_en;
15530
15531 qdf_status = scheduler_post_message(QDF_MODULE_ID_SME,
15532 QDF_MODULE_ID_WMA,
15533 QDF_MODULE_ID_WMA,
15534 &msg);
15535 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
15536 qdf_mem_free(motion_det_base_line_en);
15537 qdf_status = QDF_STATUS_E_FAILURE;
15538 }
15539 sme_release_global_lock(&mac->sme);
15540 }
15541 return qdf_status;
15542}
15543#endif /* WLAN_FEATURE_MOTION_DETECTION */
Pankaj Singh50e40422020-01-09 15:29:35 +053015544
Visweswara Tanuku025f5862019-01-08 17:35:33 +053015545#ifdef FW_THERMAL_THROTTLE_SUPPORT
Pankaj Singh50e40422020-01-09 15:29:35 +053015546
Visweswara Tanuku025f5862019-01-08 17:35:33 +053015547/**
15548 * sme_set_thermal_throttle_cfg() - SME API to set the thermal throttle
15549 * configuration parameters
15550 * @mac_handle: Opaque handle to the global MAC context
15551 * @enable: Enable Throttle
15552 * @dc: duty cycle in msecs
15553 * @dc_off_percent: duty cycle off percentage
15554 * @prio: Disables the transmit queues in fw that have lower priority
15555 * than value defined by prio
15556 * @target_temp: Target temperature
15557 *
15558 * Return: QDF_STATUS
15559 */
15560QDF_STATUS sme_set_thermal_throttle_cfg(mac_handle_t mac_handle, bool enable,
15561 uint32_t dc, uint32_t dc_off_percent,
15562 uint32_t prio, uint32_t target_temp)
15563{
15564 struct scheduler_msg msg;
15565 struct mac_context *mac = MAC_CONTEXT(mac_handle);
15566 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
15567 struct thermal_mitigation_params *therm_cfg_params;
15568
15569 qdf_status = sme_acquire_global_lock(&mac->sme);
15570 if (QDF_STATUS_SUCCESS == qdf_status) {
15571 therm_cfg_params = qdf_mem_malloc(sizeof(*therm_cfg_params));
15572 if (!therm_cfg_params) {
15573 sme_release_global_lock(&mac->sme);
15574 return QDF_STATUS_E_NOMEM;
15575 }
15576
15577 therm_cfg_params->enable = enable;
15578 therm_cfg_params->dc = dc;
15579 therm_cfg_params->levelconf[0].dcoffpercent = dc_off_percent;
15580 therm_cfg_params->levelconf[0].priority = prio;
15581 therm_cfg_params->levelconf[0].tmplwm = target_temp;
Pankaj Singh50e40422020-01-09 15:29:35 +053015582 therm_cfg_params->num_thermal_conf = 1;
Visweswara Tanuku025f5862019-01-08 17:35:33 +053015583
15584 qdf_mem_set(&msg, sizeof(msg), 0);
15585 msg.type = WMA_SET_THERMAL_THROTTLE_CFG;
15586 msg.reserved = 0;
15587 msg.bodyptr = therm_cfg_params;
15588
15589 qdf_status = scheduler_post_message(QDF_MODULE_ID_SME,
15590 QDF_MODULE_ID_WMA,
15591 QDF_MODULE_ID_WMA, &msg);
15592 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
Pankaj Singh50e40422020-01-09 15:29:35 +053015593 sme_err("failed to schedule throttle config req %d",
15594 qdf_status);
Visweswara Tanuku025f5862019-01-08 17:35:33 +053015595 qdf_mem_free(therm_cfg_params);
15596 qdf_status = QDF_STATUS_E_FAILURE;
15597 }
15598 sme_release_global_lock(&mac->sme);
15599 }
15600 return qdf_status;
15601}
15602
15603/**
15604 * sme_set_thermal_mgmt() - SME API to set the thermal management params
15605 * @mac_handle: Opaque handle to the global MAC context
15606 * @lower_thresh_deg: Lower threshold value of Temperature
15607 * @higher_thresh_deg: Higher threshold value of Temperature
15608 *
15609 * Return: QDF_STATUS
15610 */
15611QDF_STATUS sme_set_thermal_mgmt(mac_handle_t mac_handle,
15612 uint16_t lower_thresh_deg,
15613 uint16_t higher_thresh_deg)
15614{
15615 struct scheduler_msg msg;
15616 struct mac_context *mac = MAC_CONTEXT(mac_handle);
15617 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
15618 t_thermal_cmd_params *therm_mgmt_cmd;
15619
15620 qdf_status = sme_acquire_global_lock(&mac->sme);
15621 if (QDF_STATUS_SUCCESS == qdf_status) {
15622 therm_mgmt_cmd = qdf_mem_malloc(sizeof(*therm_mgmt_cmd));
15623 if (!therm_mgmt_cmd) {
15624 sme_release_global_lock(&mac->sme);
15625 return QDF_STATUS_E_NOMEM;
15626 }
15627
15628 therm_mgmt_cmd->minTemp = lower_thresh_deg;
15629 therm_mgmt_cmd->maxTemp = higher_thresh_deg;
15630 therm_mgmt_cmd->thermalEnable = 1;
15631
15632 qdf_mem_set(&msg, sizeof(msg), 0);
15633 msg.type = WMA_SET_THERMAL_MGMT;
15634 msg.reserved = 0;
15635 msg.bodyptr = therm_mgmt_cmd;
15636
15637 qdf_status = scheduler_post_message(QDF_MODULE_ID_SME,
15638 QDF_MODULE_ID_WMA,
15639 QDF_MODULE_ID_WMA, &msg);
15640 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
15641 qdf_mem_free(therm_mgmt_cmd);
15642 qdf_status = QDF_STATUS_E_FAILURE;
15643 }
15644 sme_release_global_lock(&mac->sme);
15645 }
15646 return qdf_status;
15647}
15648#endif /* FW_THERMAL_THROTTLE_SUPPORT */
Abhinav Kumar338e57d2019-02-04 17:30:10 +053015649
15650QDF_STATUS sme_update_hidden_ssid_status_cb(mac_handle_t mac_handle,
15651 hidden_ssid_cb cb)
15652{
15653 QDF_STATUS status;
15654 struct mac_context *mac = MAC_CONTEXT(mac_handle);
15655
15656 status = sme_acquire_global_lock(&mac->sme);
15657 if (QDF_IS_STATUS_SUCCESS(status)) {
15658 mac->sme.hidden_ssid_cb = cb;
15659 sme_release_global_lock(&mac->sme);
15660 }
15661
15662 return status;
15663}
Min Liu0daa0982019-02-01 17:50:44 +080015664
15665QDF_STATUS sme_update_owe_info(struct mac_context *mac,
15666 struct assoc_ind *assoc_ind)
15667{
15668 QDF_STATUS status;
15669
15670 status = sme_acquire_global_lock(&mac->sme);
15671 if (QDF_IS_STATUS_SUCCESS(status)) {
15672 status = csr_update_owe_info(mac, assoc_ind);
15673 sme_release_global_lock(&mac->sme);
15674 }
15675
15676 return status;
15677}
Arun Kumar Khandavallideda5a82019-03-11 15:32:19 +053015678
15679#ifdef WLAN_MWS_INFO_DEBUGFS
15680QDF_STATUS
15681sme_get_mws_coex_info(mac_handle_t mac_handle, uint32_t vdev_id,
15682 uint32_t cmd_id, void (*callback_fn)(void *coex_info_data,
15683 void *context,
15684 wmi_mws_coex_cmd_id
15685 cmd_id),
15686 void *context)
15687{
15688 QDF_STATUS status = QDF_STATUS_E_FAILURE;
15689 struct mac_context *mac = MAC_CONTEXT(mac_handle);
15690 struct scheduler_msg msg = {0};
15691 struct sir_get_mws_coex_info *req;
15692
15693 req = qdf_mem_malloc(sizeof(*req));
15694 if (!req) {
15695 sme_err("Failed allocate memory for MWS coex info req");
15696 return QDF_STATUS_E_NOMEM;
15697 }
15698
15699 req->vdev_id = vdev_id;
15700 req->cmd_id = cmd_id;
15701 mac->sme.mws_coex_info_state_resp_callback = callback_fn;
15702 mac->sme.mws_coex_info_ctx = context;
15703 status = sme_acquire_global_lock(&mac->sme);
15704 if (QDF_IS_STATUS_SUCCESS(status)) {
15705 msg.bodyptr = req;
15706 msg.type = WMA_GET_MWS_COEX_INFO_REQ;
15707 status = scheduler_post_message(QDF_MODULE_ID_SME,
15708 QDF_MODULE_ID_WMA,
15709 QDF_MODULE_ID_WMA,
15710 &msg);
15711 sme_release_global_lock(&mac->sme);
15712 if (!QDF_IS_STATUS_SUCCESS(status)) {
15713 sme_err("post MWS coex info req failed");
15714 status = QDF_STATUS_E_FAILURE;
15715 qdf_mem_free(req);
15716 }
15717 } else {
15718 sme_err("sme_acquire_global_lock failed");
15719 qdf_mem_free(req);
15720 }
15721
15722 return status;
15723}
15724#endif /* WLAN_MWS_INFO_DEBUGFS */
Abhinav Kumar0ed614c2019-04-11 22:11:47 +053015725
15726#ifdef WLAN_BCN_RECV_FEATURE
15727/**
15728 * sme_scan_event_handler() - Scan complete event handler
15729 * @vdev: vdev obj manager
15730 * @event: scan event
15731 * @arg: arg of scan event
15732 *
15733 * This function is getting called after Host receive scan start
15734 *
15735 * Return: None
15736 */
15737static void sme_scan_event_handler(struct wlan_objmgr_vdev *vdev,
15738 struct scan_event *event,
15739 void *arg)
15740{
15741 struct mac_context *mac = arg;
Abhinav Kumard83a6892019-12-04 14:10:09 +053015742 uint8_t vdev_id;
Abhinav Kumar0ed614c2019-04-11 22:11:47 +053015743
15744 if (!mac) {
15745 sme_err("Invalid mac context");
15746 return;
15747 }
15748
Abhinav Kumard83a6892019-12-04 14:10:09 +053015749 if (!mac->sme.beacon_pause_cb)
Abhinav Kumar0ed614c2019-04-11 22:11:47 +053015750 return;
Abhinav Kumar0ed614c2019-04-11 22:11:47 +053015751
Abhinav Kumard83a6892019-12-04 14:10:09 +053015752 if (event->type != SCAN_EVENT_TYPE_STARTED)
15753 return;
Abhinav Kumar0ed614c2019-04-11 22:11:47 +053015754
Abhinav Kumard83a6892019-12-04 14:10:09 +053015755 for (vdev_id = 0 ; vdev_id < WLAN_MAX_VDEVS ; vdev_id++) {
15756 if (CSR_IS_SESSION_VALID(mac, vdev_id) &&
15757 sme_is_beacon_report_started(MAC_HANDLE(mac), vdev_id)) {
15758 sme_debug("Send pause ind for vdev_id : %d", vdev_id);
15759 mac->sme.beacon_pause_cb(mac->hdd_handle, vdev_id,
15760 event->type, false);
15761 }
Abhinav Kumar0ed614c2019-04-11 22:11:47 +053015762 }
15763}
15764
15765QDF_STATUS sme_register_bcn_recv_pause_ind_cb(mac_handle_t mac_handle,
15766 beacon_pause_cb cb)
15767{
15768 QDF_STATUS status;
15769 struct mac_context *mac = MAC_CONTEXT(mac_handle);
15770
15771 if (!mac) {
15772 sme_err("Invalid mac context");
15773 return QDF_STATUS_E_NOMEM;
15774 }
15775
Abhinav Kumar39222152019-05-13 23:53:40 +053015776 /* scan event de-registration */
15777 if (!cb) {
15778 ucfg_scan_unregister_event_handler(mac->pdev,
15779 sme_scan_event_handler, mac);
15780 return QDF_STATUS_SUCCESS;
15781 }
Abhinav Kumar0ed614c2019-04-11 22:11:47 +053015782 status = sme_acquire_global_lock(&mac->sme);
15783 if (QDF_IS_STATUS_SUCCESS(status)) {
15784 mac->sme.beacon_pause_cb = cb;
15785 sme_release_global_lock(&mac->sme);
15786 }
15787
15788 /* scan event registration */
15789 status = ucfg_scan_register_event_handler(mac->pdev,
15790 sme_scan_event_handler, mac);
15791 if (QDF_IS_STATUS_ERROR(status))
15792 sme_err("scan event register failed ");
15793
15794 return status;
15795}
15796#endif
Srinivas Dasari37e37312019-06-30 23:50:24 +053015797
15798QDF_STATUS sme_set_disconnect_ies(mac_handle_t mac_handle, uint8_t vdev_id,
15799 uint8_t *ie_data, uint16_t ie_len)
15800{
15801 struct mac_context *mac_ctx;
15802 struct wlan_objmgr_vdev *vdev;
15803 struct wlan_ies ie;
15804
15805 if (!ie_data || !ie_len) {
15806 sme_debug("Got NULL disconnect IEs");
15807 return QDF_STATUS_E_INVAL;
15808 }
15809
15810 mac_ctx = MAC_CONTEXT(mac_handle);
15811 vdev = wlan_objmgr_get_vdev_by_id_from_psoc(mac_ctx->psoc,
15812 vdev_id,
15813 WLAN_LEGACY_SME_ID);
15814 if (!vdev) {
15815 sme_err("Got NULL vdev obj, returning");
15816 return QDF_STATUS_E_FAILURE;
15817 }
15818
15819 ie.data = ie_data;
15820 ie.len = ie_len;
15821
15822 mlme_set_self_disconnect_ies(vdev, &ie);
15823
15824 wlan_objmgr_vdev_release_ref(vdev, WLAN_LEGACY_SME_ID);
15825 return QDF_STATUS_SUCCESS;
15826}
Jianmin Zhu5ce64f42019-07-15 19:20:09 +080015827
Jianmin Zhu5ce64f42019-07-15 19:20:09 +080015828void sme_chan_to_freq_list(
15829 struct wlan_objmgr_pdev *pdev,
15830 uint32_t *freq_list,
15831 const uint8_t *chan_list,
15832 uint32_t chan_list_len)
15833{
15834 uint32_t count;
15835
15836 for (count = 0; count < chan_list_len; count++)
15837 freq_list[count] =
15838 wlan_reg_chan_to_freq(pdev, (uint32_t)chan_list[count]);
15839}
Srinivas Dasarif4e1b122019-08-22 03:39:48 +053015840
Abhinav Kumar523ca372019-08-30 16:28:19 +053015841static QDF_STATUS sme_enable_roaming(struct mac_context *mac, uint32_t vdev_id,
15842 bool enable)
15843{
15844 struct csr_roam_session *session = CSR_GET_SESSION(mac, vdev_id);
15845 QDF_STATUS status;
15846 uint8_t reason = REASON_SUPPLICANT_DE_INIT_ROAMING;
15847
15848 if (!session) {
15849 sme_err("Roam session is NULL for vdev %d", vdev_id);
15850 return QDF_STATUS_E_FAILURE;
15851 }
15852
15853 status = sme_acquire_global_lock(&mac->sme);
15854 if (QDF_IS_STATUS_ERROR(status))
15855 return status;
15856
15857 if (enable)
15858 reason = REASON_SUPPLICANT_INIT_ROAMING;
15859
15860 csr_post_roam_state_change(mac, vdev_id,
15861 enable ? ROAM_RSO_STARTED : ROAM_DEINIT,
15862 reason);
15863
15864 sme_release_global_lock(&mac->sme);
15865
15866 return QDF_STATUS_SUCCESS;
15867}
15868
Srinivas Dasarif4e1b122019-08-22 03:39:48 +053015869QDF_STATUS sme_set_roam_triggers(mac_handle_t mac_handle,
15870 struct roam_triggers *triggers)
15871{
15872 QDF_STATUS status;
15873 struct mac_context *mac = MAC_CONTEXT(mac_handle);
15874 struct scheduler_msg message = {0};
15875 struct roam_triggers *roam_trigger_data;
15876
Abhinav Kumar523ca372019-08-30 16:28:19 +053015877 mlme_set_roam_trigger_bitmap(mac->psoc, triggers->vdev_id,
15878 triggers->trigger_bitmap);
15879 if (!triggers->trigger_bitmap)
15880 status = sme_enable_roaming(mac, triggers->vdev_id,
15881 false);
15882 else
15883 status = sme_enable_roaming(mac, triggers->vdev_id,
15884 true);
15885
15886 if (QDF_IS_STATUS_ERROR(status))
15887 return status;
15888
Srinivas Dasarif4e1b122019-08-22 03:39:48 +053015889 /* per contract must make a copy of the params when messaging */
15890 roam_trigger_data = qdf_mem_malloc(sizeof(*roam_trigger_data));
15891 if (!roam_trigger_data)
15892 return QDF_STATUS_E_NOMEM;
15893 *roam_trigger_data = *triggers;
15894
15895 status = sme_acquire_global_lock(&mac->sme);
15896 if (QDF_IS_STATUS_ERROR(status)) {
15897 qdf_mem_free(roam_trigger_data);
15898 return status;
15899 }
15900
15901 /* Serialize the req through MC thread */
15902 message.bodyptr = roam_trigger_data;
15903 message.type = SIR_HAL_SET_ROAM_TRIGGERS;
15904 status = scheduler_post_message(QDF_MODULE_ID_SME,
15905 QDF_MODULE_ID_WMA,
15906 QDF_MODULE_ID_WMA,
15907 &message);
15908 sme_release_global_lock(&mac->sme);
15909 if (QDF_IS_STATUS_ERROR(status)) {
15910 sme_err("failed to post ROAM_TRIGGERS msg");
15911 qdf_mem_free(roam_trigger_data);
15912 }
15913
15914 return status;
15915}
Srinivas Dasari391692d2019-08-21 08:40:53 +053015916
15917QDF_STATUS sme_set_roam_config_enable(mac_handle_t mac_handle,
15918 uint8_t vdev_id,
15919 uint8_t roam_control_enable)
15920{
15921 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Srinivas Dasari3a769ca2019-09-18 00:00:49 +053015922 tCsrNeighborRoamControlInfo *neighbor_roam_info;
15923 tCsrNeighborRoamCfgParams *cfg_params;
Srinivas Dasari391692d2019-08-21 08:40:53 +053015924 QDF_STATUS status;
15925
Srinivas Dasari3a769ca2019-09-18 00:00:49 +053015926 if (!mac->mlme_cfg->lfr.roam_scan_offload_enabled)
15927 return QDF_STATUS_E_INVAL;
15928
Srinivas Dasari391692d2019-08-21 08:40:53 +053015929 if (vdev_id >= WLAN_MAX_VDEVS) {
15930 sme_err("Invalid vdev_id: %d", vdev_id);
15931 return QDF_STATUS_E_INVAL;
15932 }
15933
15934 status = sme_acquire_global_lock(&mac->sme);
15935 if (QDF_IS_STATUS_ERROR(status)) {
15936 sme_err("Failed to acquire sme lock; status: %d", status);
15937 return status;
15938 }
Srinivas Dasari3a769ca2019-09-18 00:00:49 +053015939 neighbor_roam_info = &mac->roam.neighborRoamInfo[vdev_id];
15940
15941 neighbor_roam_info->roam_control_enable = !!roam_control_enable;
15942 if (roam_control_enable) {
15943 cfg_params = &neighbor_roam_info->cfgParams;
15944 cfg_params->roam_scan_period_after_inactivity = 0;
15945 cfg_params->roam_inactive_data_packet_count = 0;
15946 cfg_params->roam_scan_inactivity_time = 0;
15947
Abhinav Kumar523ca372019-08-30 16:28:19 +053015948 csr_roam_update_cfg(mac, vdev_id,
15949 REASON_ROAM_CONTROL_CONFIG_ENABLED);
Srinivas Dasari3a769ca2019-09-18 00:00:49 +053015950 }
Srinivas Dasari391692d2019-08-21 08:40:53 +053015951 sme_release_global_lock(&mac->sme);
15952
15953 return status;
15954}
Srinivas Dasari9ad9e252019-08-20 11:43:06 +053015955
15956QDF_STATUS sme_get_roam_config_status(mac_handle_t mac_handle,
15957 uint8_t vdev_id,
15958 uint8_t *config_status)
15959{
15960 struct mac_context *mac = MAC_CONTEXT(mac_handle);
15961 QDF_STATUS status;
15962
15963 if (vdev_id >= WLAN_MAX_VDEVS) {
15964 sme_err("Invalid vdev_id: %d", vdev_id);
15965 return QDF_STATUS_E_INVAL;
15966 }
15967
15968 status = sme_acquire_global_lock(&mac->sme);
15969 if (QDF_IS_STATUS_ERROR(status)) {
15970 sme_err("Failed to acquire sme lock; status: %d", status);
15971 return status;
15972 }
15973 *config_status =
15974 mac->roam.neighborRoamInfo[vdev_id].roam_control_enable;
15975 sme_release_global_lock(&mac->sme);
15976
15977 return status;
15978}
Srinivas Dasaria33fdd82019-08-21 16:15:22 +053015979
Srinivas Dasari240d3272019-09-20 12:00:57 +053015980uint16_t sme_get_full_roam_scan_period_global(mac_handle_t mac_handle)
15981{
15982 struct mac_context *mac = MAC_CONTEXT(mac_handle);
15983
15984 return mac->mlme_cfg->lfr.roam_full_scan_period;
15985}
15986
Srinivas Dasaria33fdd82019-08-21 16:15:22 +053015987QDF_STATUS
15988sme_get_full_roam_scan_period(mac_handle_t mac_handle, uint8_t vdev_id,
15989 uint32_t *full_roam_scan_period)
15990{
15991 struct mac_context *mac = MAC_CONTEXT(mac_handle);
15992 QDF_STATUS status;
15993 tpCsrNeighborRoamControlInfo neighbor_roam_info;
15994
15995 if (vdev_id >= WLAN_MAX_VDEVS) {
15996 sme_err("Invalid vdev_id: %d", vdev_id);
15997 return QDF_STATUS_E_INVAL;
15998 }
15999
16000 status = sme_acquire_global_lock(&mac->sme);
16001 if (QDF_IS_STATUS_ERROR(status)) {
16002 sme_err("Failed to acquire sme lock; status: %d", status);
16003 return status;
16004 }
16005 neighbor_roam_info = &mac->roam.neighborRoamInfo[vdev_id];
16006 *full_roam_scan_period =
16007 neighbor_roam_info->cfgParams.full_roam_scan_period;
16008 sme_release_global_lock(&mac->sme);
16009
16010 return status;
16011}
Arun Kumar Khandavalliadd284b2019-10-23 12:27:39 +053016012
16013QDF_STATUS sme_check_for_duplicate_session(mac_handle_t mac_handle,
16014 uint8_t *peer_addr)
16015{
16016 QDF_STATUS status = QDF_STATUS_E_INVAL;
Vevek Venkatesan2d88a6b2019-10-04 19:03:10 +053016017 bool peer_exist = false;
Arun Kumar Khandavalliadd284b2019-10-23 12:27:39 +053016018 void *soc = cds_get_context(QDF_MODULE_ID_SOC);
16019 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
16020
16021 if (!soc) {
16022 sme_err("Failed to get soc handle");
16023 return QDF_STATUS_E_INVAL;
16024 }
16025
Arun Kumar Khandavalliadd284b2019-10-23 12:27:39 +053016026 if (QDF_STATUS_SUCCESS != sme_acquire_global_lock(&mac_ctx->sme))
16027 return status;
16028
Vevek Venkatesan2d88a6b2019-10-04 19:03:10 +053016029 peer_exist = cdp_find_peer_exist(soc, OL_TXRX_PDEV_ID, peer_addr);
16030 if (peer_exist) {
gaurank kathpalia8197e352019-09-11 16:09:53 +053016031 sme_err("Peer exists with same MAC");
Arun Kumar Khandavalliadd284b2019-10-23 12:27:39 +053016032 status = QDF_STATUS_E_EXISTS;
16033 } else {
16034 status = QDF_STATUS_SUCCESS;
16035 }
16036 sme_release_global_lock(&mac_ctx->sme);
16037
16038 return status;
16039}
Sourav Mohapatra2a67b0e2019-10-15 17:59:59 +053016040
16041#ifdef FEATURE_ANI_LEVEL_REQUEST
16042QDF_STATUS sme_get_ani_level(mac_handle_t mac_handle, uint32_t *freqs,
16043 uint8_t num_freqs, void (*callback)(
16044 struct wmi_host_ani_level_event *ani, uint8_t num,
16045 void *context), void *context)
16046{
16047 QDF_STATUS status = QDF_STATUS_E_FAILURE;
16048 struct mac_context *mac = MAC_CONTEXT(mac_handle);
16049 void *wma_handle;
16050
16051 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
16052 if (!wma_handle) {
16053 sme_err("wma handle is NULL");
16054 return QDF_STATUS_E_FAILURE;
16055 }
16056
16057 mac->ani_params.ani_level_cb = callback;
16058 mac->ani_params.context = context;
16059
16060 status = wma_send_ani_level_request(wma_handle, freqs, num_freqs);
16061 return status;
16062}
16063#endif /* FEATURE_ANI_LEVEL_REQUEST */
Ashish Kumar Dhanotiyad8d7dea2019-10-24 14:34:56 +053016064
16065#ifdef FEATURE_OEM_DATA
16066QDF_STATUS sme_set_oem_data_event_handler_cb(
16067 mac_handle_t mac_handle,
16068 void (*oem_data_event_handler_cb)
16069 (const struct oem_data *oem_event_data))
16070{
16071 struct mac_context *mac = MAC_CONTEXT(mac_handle);
16072 QDF_STATUS qdf_status;
16073
16074 qdf_status = sme_acquire_global_lock(&mac->sme);
16075 if (QDF_IS_STATUS_SUCCESS(qdf_status)) {
16076 mac->sme.oem_data_event_handler_cb = oem_data_event_handler_cb;
16077 sme_release_global_lock(&mac->sme);
16078 }
16079 return qdf_status;
16080}
16081
16082void sme_reset_oem_data_event_handler_cb(mac_handle_t mac_handle)
16083{
16084 struct mac_context *pmac;
16085 QDF_STATUS qdf_status;
16086
16087 if (!mac_handle) {
16088 sme_err("mac_handle is not valid");
16089 return;
16090 }
16091 pmac = MAC_CONTEXT(mac_handle);
16092
16093 qdf_status = sme_acquire_global_lock(&pmac->sme);
16094 if (QDF_IS_STATUS_SUCCESS(qdf_status)) {
16095 pmac->sme.oem_data_event_handler_cb = NULL;
16096 sme_release_global_lock(&pmac->sme);
16097 }
16098}
16099#endif