blob: d7515344f116392c15b6303923806a152d34ec74 [file] [log] [blame]
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001/*
Harprit Chhabadadc5bc152018-12-21 15:37:46 -08002 * Copyright (c) 2012-2019 The Linux Foundation. All rights reserved.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003 *
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004 * Permission to use, copy, modify, and/or distribute this software for
5 * any purpose with or without fee is hereby granted, provided that the
6 * above copyright notice and this permission notice appear in all
7 * copies.
8 *
9 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
10 * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
11 * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
12 * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
13 * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
14 * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
15 * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
16 * PERFORMANCE OF THIS SOFTWARE.
17 */
18
19/*
Jeff Johnson360135b2018-07-18 20:51:47 -070020 * DOC: sme_api.c
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053021 *
22 * Definitions for SME APIs
23 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080024
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053025/* Include Files */
Srinivas Girigowda2c263352017-03-17 17:49:53 -070026#include <sir_common.h>
27#include <ani_global.h>
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080028#include "sme_api.h"
29#include "csr_inside_api.h"
30#include "sme_inside.h"
31#include "csr_internal.h"
32#include "wma_types.h"
33#include "wma_if.h"
gaurank kathpalia748c7272018-10-24 22:05:15 +053034#include "wma.h"
Jeff Johnson6136fb92017-03-30 15:21:49 -070035#include "wma_fips_api.h"
Qun Zhangef655622019-02-25 10:48:10 +080036#include "wma_fw_state.h"
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053037#include "qdf_trace.h"
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080038#include "sme_trace.h"
Anurag Chouhan6d760662016-02-20 16:05:43 +053039#include "qdf_types.h"
gaurank kathpalia78af1932018-10-27 20:33:10 +053040#include "qdf_util.h"
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053041#include "qdf_trace.h"
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080042#include "cds_utils.h"
43#include "sap_api.h"
44#include "mac_trace.h"
Naveen Rawat3b6068c2016-04-14 19:01:06 -070045#include "cds_regdomain.h"
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080046#include "sme_power_save_api.h"
47#include "wma.h"
Naveen Rawatb4d37622015-11-13 16:15:25 -080048#include "sch_api.h"
Deepak Dhamdhere0f076bd2016-06-02 11:29:21 -070049#include "sme_nan_datapath.h"
Agrawal Ashish21ba2572016-09-03 16:40:10 +053050#include "csr_api.h"
Kiran Kumar Lokerea3de2262017-04-12 12:15:04 -070051#include "wlan_reg_services_api.h"
Abhishek Singh158fe252017-03-23 11:09:34 +053052#include <wlan_scan_ucfg_api.h>
Kiran Kumar Lokereb1d412e2017-04-23 17:19:43 -070053#include "wlan_reg_ucfg_api.h"
Arif Hussainee677012017-01-26 17:50:13 -080054#include "ol_txrx.h"
Naveen Rawatd2657be2017-10-10 14:31:23 -070055#include "wifi_pos_api.h"
Vignesh Viswanathan9dd88d32017-11-22 14:22:03 +053056#include "net/cfg80211.h"
Sandeep Puligilla063a4342018-01-10 02:50:14 -080057#include <wlan_spectral_utils_api.h>
Vignesh Viswanathan21c58cb2018-05-24 15:53:58 +053058#include "wlan_mlme_public_struct.h"
gaurank kathpalia24ed0f42018-11-13 15:37:49 +053059#include "wlan_mlme_main.h"
Bala Venkatesh6d537092018-09-25 10:38:36 +053060#include "cfg_ucfg_api.h"
Manikandan Mohan9045e2e2018-11-26 16:44:19 -080061#include "wlan_fwol_ucfg_api.h"
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080062
Jeff Johnson0a8786a2018-12-02 10:49:01 -080063static QDF_STATUS init_sme_cmd_list(struct mac_context *mac);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080064
Jeff Johnson0a8786a2018-12-02 10:49:01 -080065static void sme_disconnect_connected_sessions(struct mac_context *mac);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080066
Jeff Johnson0a8786a2018-12-02 10:49:01 -080067static QDF_STATUS sme_handle_generic_change_country_code(struct mac_context *mac,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080068 void *pMsgBuf);
69
Jeff Johnson0a8786a2018-12-02 10:49:01 -080070static QDF_STATUS sme_process_nss_update_resp(struct mac_context *mac, uint8_t *msg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080071
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080072/* Channel Change Response Indication Handler */
Jeff Johnson0a8786a2018-12-02 10:49:01 -080073static QDF_STATUS sme_process_channel_change_resp(struct mac_context *mac,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080074 uint16_t msg_type, void *pMsgBuf);
75
Jeff Johnson0a8786a2018-12-02 10:49:01 -080076static QDF_STATUS sme_stats_ext_event(struct mac_context *mac,
Jeff Johnson45843652018-07-04 12:47:34 -070077 struct stats_ext_event *msg);
Jeff Johnsonfdecd512018-06-10 09:18:32 -070078
Qun Zhangef655622019-02-25 10:48:10 +080079static QDF_STATUS sme_fw_state_resp(struct mac_context *mac);
80
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080081/* Internal SME APIs */
Jeff Johnson50980e12019-02-17 11:38:30 -080082QDF_STATUS sme_acquire_global_lock(struct sme_context *sme)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080083{
Jeff Johnson50980e12019-02-17 11:38:30 -080084 if (!sme)
85 return QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080086
Jeff Johnson3e7a4932019-02-17 12:11:36 -080087 return qdf_mutex_acquire(&sme->sme_global_lock);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080088}
89
Jeff Johnson50980e12019-02-17 11:38:30 -080090QDF_STATUS sme_release_global_lock(struct sme_context *sme)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080091{
Jeff Johnson50980e12019-02-17 11:38:30 -080092 if (!sme)
93 return QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080094
Jeff Johnson3e7a4932019-02-17 12:11:36 -080095 return qdf_mutex_release(&sme->sme_global_lock);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080096}
97
Jeff Johnson0a8786a2018-12-02 10:49:01 -080098struct mac_context *sme_get_mac_context(void)
Archana Ramachandran2eb7a612017-03-23 22:58:42 -070099{
Jeff Johnson0a8786a2018-12-02 10:49:01 -0800100 struct mac_context *mac_ctx;
Jeff Johnsonb460dd72018-11-08 10:26:51 -0800101 mac_handle_t mac_handle;
Archana Ramachandran2eb7a612017-03-23 22:58:42 -0700102
Jeff Johnsonb460dd72018-11-08 10:26:51 -0800103 mac_handle = cds_get_context(QDF_MODULE_ID_SME);
Jeff Johnson038efe72019-03-18 13:39:31 -0700104 if (!mac_handle) {
Archana Ramachandran2eb7a612017-03-23 22:58:42 -0700105 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_FATAL,
Jeff Johnsonb460dd72018-11-08 10:26:51 -0800106 FL("invalid mac_handle"));
Archana Ramachandran2eb7a612017-03-23 22:58:42 -0700107 return NULL;
108 }
109
Jeff Johnsona0619e42018-11-28 17:43:00 -0800110 mac_ctx = MAC_CONTEXT(mac_handle);
Archana Ramachandran2eb7a612017-03-23 22:58:42 -0700111
112 return mac_ctx;
113}
114
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800115/**
116 * sme_process_set_hw_mode_resp() - Process set HW mode response
117 * @mac: Global MAC pointer
118 * @msg: HW mode response
119 *
120 * Processes the HW mode response and invokes the HDD callback
121 * to process further
122 */
Jeff Johnson0a8786a2018-12-02 10:49:01 -0800123static QDF_STATUS sme_process_set_hw_mode_resp(struct mac_context *mac, uint8_t *msg)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800124{
Krunal Sonia8270f52017-02-23 19:51:25 -0800125 tListElem *entry;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800126 tSmeCmd *command = NULL;
127 bool found;
Tushnim Bhattacharyyaeab33dd2017-11-15 15:20:02 -0800128 policy_mgr_pdev_set_hw_mode_cback callback = NULL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800129 struct sir_set_hw_mode_resp *param;
Tushnim Bhattacharyya3b99f4b2018-03-26 14:19:24 -0700130 enum policy_mgr_conn_update_reason reason;
gaurank kathpalia14e2f912017-08-31 14:51:45 +0530131 struct csr_roam_session *session;
Sandeep Puligillaa330c8c2017-03-09 18:03:21 -0800132 uint32_t session_id;
Sandeep Puligilla344d7252017-09-15 16:23:33 -0700133
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800134 param = (struct sir_set_hw_mode_resp *)msg;
135 if (!param) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -0700136 sme_err("HW mode resp param is NULL");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800137 /* Not returning. Need to check if active command list
138 * needs to be freed
139 */
140 }
141
Krunal Sonia8270f52017-02-23 19:51:25 -0800142 entry = csr_nonscan_active_ll_peek_head(mac, LL_ACCESS_LOCK);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800143 if (!entry) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -0700144 sme_err("No cmd found in active list");
Tushnim Bhattacharyya4a03db82017-11-10 17:58:28 -0800145 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800146 }
147
148 command = GET_BASE_ADDR(entry, tSmeCmd, Link);
149 if (!command) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -0700150 sme_err("Base address is NULL");
Tushnim Bhattacharyya4a03db82017-11-10 17:58:28 -0800151 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800152 }
153
154 if (e_sme_command_set_hw_mode != command->command) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -0700155 sme_err("Command mismatch!");
Tushnim Bhattacharyya4a03db82017-11-10 17:58:28 -0800156 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800157 }
158
159 callback = command->u.set_hw_mode_cmd.set_hw_mode_cb;
Chandrasekaran, Manishekaref70c0d2015-10-20 19:54:55 +0530160 reason = command->u.set_hw_mode_cmd.reason;
Sandeep Puligillaa330c8c2017-03-09 18:03:21 -0800161 session_id = command->u.set_hw_mode_cmd.session_id;
Chandrasekaran, Manishekarce2172e2016-02-18 16:12:43 +0530162
Srinivas Girigowda2da81e22017-03-16 21:22:19 -0700163 sme_debug("reason: %d session: %d",
Chandrasekaran, Manishekarce2172e2016-02-18 16:12:43 +0530164 command->u.set_hw_mode_cmd.reason,
165 command->u.set_hw_mode_cmd.session_id);
166
Chandrasekaran, Manishekar4dd215e2016-04-16 18:48:34 -0700167 if (!callback) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -0700168 sme_err("Callback does not exist");
Chandrasekaran, Manishekar4dd215e2016-04-16 18:48:34 -0700169 goto end;
170 }
171
172 if (!param) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -0700173 sme_err("Callback failed since HW mode params is NULL");
Chandrasekaran, Manishekar4dd215e2016-04-16 18:48:34 -0700174 goto end;
175 }
176
177 /* Irrespective of the reason for which the hw mode change request
178 * was issued, the policy manager connection table needs to be updated
179 * with the new vdev-mac id mapping, tx/rx spatial streams etc., if the
180 * set hw mode was successful.
181 */
182 callback(param->status,
183 param->cfgd_hw_mode_index,
184 param->num_vdev_mac_entries,
Tushnim Bhattacharyya0c4ad2d2017-03-09 15:59:03 -0800185 param->vdev_mac_map,
Tushnim Bhattacharyyaeab33dd2017-11-15 15:20:02 -0800186 command->u.set_hw_mode_cmd.next_action,
187 command->u.set_hw_mode_cmd.reason,
188 command->u.set_hw_mode_cmd.session_id,
Tushnim Bhattacharyya0c4ad2d2017-03-09 15:59:03 -0800189 command->u.set_hw_mode_cmd.context);
Krunal Soni3fa80e22018-01-09 14:16:02 -0800190 if (!CSR_IS_SESSION_VALID(mac, session_id)) {
191 sme_err("session %d is invalid", session_id);
192 goto end;
193 }
Sandeep Puligillaa330c8c2017-03-09 18:03:21 -0800194 session = CSR_GET_SESSION(mac, session_id);
Tushnim Bhattacharyya3b99f4b2018-03-26 14:19:24 -0700195 if (reason == POLICY_MGR_UPDATE_REASON_HIDDEN_STA) {
Chandrasekaran, Manishekar4dd215e2016-04-16 18:48:34 -0700196 /* In the case of hidden SSID, connection update
197 * (set hw mode) is done after the scan with reason
198 * code eCsrScanForSsid completes. The connect/failure
199 * needs to be handled after the response of set hw
200 * mode
201 */
Sandeep Puligillaa330c8c2017-03-09 18:03:21 -0800202 if (param->status == SET_HW_MODE_STATUS_OK) {
Srinivas Girigowda2c263352017-03-17 17:49:53 -0700203 sme_debug("search for ssid success");
Sandeep Puligillaa330c8c2017-03-09 18:03:21 -0800204 csr_scan_handle_search_for_ssid(mac,
205 session_id);
206 } else {
Srinivas Girigowda2c263352017-03-17 17:49:53 -0700207 sme_debug("search for ssid failure");
Sandeep Puligillaa330c8c2017-03-09 18:03:21 -0800208 csr_scan_handle_search_for_ssid_failure(mac,
209 session_id);
210 }
Deepak Dhamdhere6f7fbbe2017-02-28 13:35:52 -0800211 csr_saved_scan_cmd_free_fields(mac, session);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800212 }
Abhishek Singhbc4261f2019-03-14 13:21:57 +0530213 if (reason == POLICY_MGR_UPDATE_REASON_CHANNEL_SWITCH_STA) {
214 sme_debug(" Continue channel switch for STA");
215 csr_sta_continue_csa(mac, session_id);
216 }
Rajasekaran Kalidoss869bc4a2018-11-20 20:35:14 +0530217 if (reason == POLICY_MGR_UPDATE_REASON_LFR2_ROAM)
218 csr_continue_lfr2_connect(mac, session_id);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800219
Chandrasekaran, Manishekaref70c0d2015-10-20 19:54:55 +0530220end:
Krunal Soni72dba662017-02-15 20:13:17 -0800221 found = csr_nonscan_active_ll_remove_entry(mac, entry,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800222 LL_ACCESS_LOCK);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +0530223 if (found)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800224 /* Now put this command back on the avilable command list */
Krunal Soni78618d92017-02-14 21:46:31 -0800225 csr_release_command(mac, command);
Krunal Sonia8270f52017-02-23 19:51:25 -0800226
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530227 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800228}
229
230/**
231 * sme_process_hw_mode_trans_ind() - Process HW mode transition indication
232 * @mac: Global MAC pointer
233 * @msg: HW mode transition response
234 *
235 * Processes the HW mode transition indication and invoke the HDD callback
236 * to process further
237 */
Jeff Johnson0a8786a2018-12-02 10:49:01 -0800238static QDF_STATUS sme_process_hw_mode_trans_ind(struct mac_context *mac,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800239 uint8_t *msg)
240{
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800241 struct sir_hw_mode_trans_ind *param;
242
243 param = (struct sir_hw_mode_trans_ind *)msg;
244 if (!param) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -0700245 sme_err("HW mode trans ind param is NULL");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530246 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800247 }
248
Tushnim Bhattacharyya0c4ad2d2017-03-09 15:59:03 -0800249 policy_mgr_hw_mode_transition_cb(param->old_hw_mode_index,
Tushnim Bhattacharyya9e81b4c2017-02-15 17:11:14 -0800250 param->new_hw_mode_index,
251 param->num_vdev_mac_entries,
Tushnim Bhattacharyya0c4ad2d2017-03-09 15:59:03 -0800252 param->vdev_mac_map, mac->psoc);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800253
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530254 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800255}
256
Abhishek Singh0d0568a2018-11-22 15:01:51 +0530257void sme_purge_pdev_all_ser_cmd_list(mac_handle_t mac_handle)
258{
259 QDF_STATUS status;
Jeff Johnson0a8786a2018-12-02 10:49:01 -0800260 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Abhishek Singh0d0568a2018-11-22 15:01:51 +0530261
262 status = sme_acquire_global_lock(&mac_ctx->sme);
263 if (QDF_IS_STATUS_ERROR(status))
264 return;
265
266 csr_purge_pdev_all_ser_cmd_list(mac_ctx);
267 sme_release_global_lock(&mac_ctx->sme);
268}
269
Naveen Rawate7d86052015-11-13 12:01:43 -0800270/**
271 * free_sme_cmds() - This function frees memory allocated for SME commands
272 * @mac_ctx: Pointer to Global MAC structure
273 *
274 * This function frees memory allocated for SME commands
275 *
276 * @Return: void
277 */
Jeff Johnson0a8786a2018-12-02 10:49:01 -0800278static void free_sme_cmds(struct mac_context *mac_ctx)
Naveen Rawate7d86052015-11-13 12:01:43 -0800279{
280 uint32_t idx;
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +0530281
Jeff Johnson19353172019-02-17 12:53:46 -0800282 if (!mac_ctx->sme.sme_cmd_buf_addr)
Naveen Rawate7d86052015-11-13 12:01:43 -0800283 return;
284
Jeff Johnson2a84c532019-02-17 12:22:04 -0800285 for (idx = 0; idx < mac_ctx->sme.sme_cmd_count; idx++)
Jeff Johnson19353172019-02-17 12:53:46 -0800286 qdf_mem_free(mac_ctx->sme.sme_cmd_buf_addr[idx]);
Naveen Rawate7d86052015-11-13 12:01:43 -0800287
Jeff Johnson19353172019-02-17 12:53:46 -0800288 qdf_mem_free(mac_ctx->sme.sme_cmd_buf_addr);
289 mac_ctx->sme.sme_cmd_buf_addr = NULL;
Naveen Rawate7d86052015-11-13 12:01:43 -0800290}
291
Jeff Johnson0a8786a2018-12-02 10:49:01 -0800292static QDF_STATUS init_sme_cmd_list(struct mac_context *mac)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800293{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530294 QDF_STATUS status;
Jeff Johnson19353172019-02-17 12:53:46 -0800295 tSmeCmd *cmd;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800296 uint32_t cmd_idx;
Naveen Rawate7d86052015-11-13 12:01:43 -0800297 uint32_t sme_cmd_ptr_ary_sz;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800298
Jeff Johnson2a84c532019-02-17 12:22:04 -0800299 mac->sme.sme_cmd_count = SME_TOTAL_COMMAND;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800300
Jeff Johnsonea9f3d72019-02-17 13:27:55 -0800301 status = csr_ll_open(&mac->sme.sme_cmd_freelist);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530302 if (!QDF_IS_STATUS_SUCCESS(status))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800303 goto end;
304
Naveen Rawate7d86052015-11-13 12:01:43 -0800305 /* following pointer contains array of pointers for tSmeCmd* */
Jeff Johnson2a84c532019-02-17 12:22:04 -0800306 sme_cmd_ptr_ary_sz = sizeof(void *) * mac->sme.sme_cmd_count;
Jeff Johnson19353172019-02-17 12:53:46 -0800307 mac->sme.sme_cmd_buf_addr = qdf_mem_malloc(sme_cmd_ptr_ary_sz);
308 if (!mac->sme.sme_cmd_buf_addr) {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530309 status = QDF_STATUS_E_NOMEM;
Naveen Rawate7d86052015-11-13 12:01:43 -0800310 goto end;
311 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800312
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530313 status = QDF_STATUS_SUCCESS;
Jeff Johnson2a84c532019-02-17 12:22:04 -0800314 for (cmd_idx = 0; cmd_idx < mac->sme.sme_cmd_count; cmd_idx++) {
Naveen Rawate7d86052015-11-13 12:01:43 -0800315 /*
316 * Since total size of all commands together can be huge chunk
317 * of memory, allocate SME cmd individually. These SME CMDs are
318 * moved between pending and active queues. And these freeing of
319 * these queues just manipulates the list but does not actually
320 * frees SME CMD pointers. Hence store each SME CMD address in
Jeff Johnson19353172019-02-17 12:53:46 -0800321 * the array, sme.sme_cmd_buf_addr. This will later facilitate
Naveen Rawate7d86052015-11-13 12:01:43 -0800322 * freeing up of all SME CMDs with just a for loop.
323 */
Jeff Johnson19353172019-02-17 12:53:46 -0800324 cmd = qdf_mem_malloc(sizeof(*cmd));
325 if (!cmd) {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530326 status = QDF_STATUS_E_NOMEM;
Jeff Johnson01f2c232018-11-21 19:17:44 -0800327 free_sme_cmds(mac);
Naveen Rawate7d86052015-11-13 12:01:43 -0800328 goto end;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800329 }
Jeff Johnson19353172019-02-17 12:53:46 -0800330 mac->sme.sme_cmd_buf_addr[cmd_idx] = cmd;
Jeff Johnsonea9f3d72019-02-17 13:27:55 -0800331 csr_ll_insert_tail(&mac->sme.sme_cmd_freelist,
Jeff Johnson19353172019-02-17 12:53:46 -0800332 &cmd->Link, LL_ACCESS_LOCK);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800333 }
334
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800335end:
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530336 if (!QDF_IS_STATUS_SUCCESS(status))
Srinivas Girigowda2da81e22017-03-16 21:22:19 -0700337 sme_err("Failed to initialize sme command list: %d", status);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800338
339 return status;
340}
341
Jeff Johnson0a8786a2018-12-02 10:49:01 -0800342void sme_release_command(struct mac_context *mac_ctx, tSmeCmd *sme_cmd)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800343{
Krunal Sonia8270f52017-02-23 19:51:25 -0800344 sme_cmd->command = eSmeNoCommand;
Jeff Johnsonea9f3d72019-02-17 13:27:55 -0800345 csr_ll_insert_tail(&mac_ctx->sme.sme_cmd_freelist, &sme_cmd->Link,
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +0530346 LL_ACCESS_LOCK);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800347}
348
Jeff Johnson0a8786a2018-12-02 10:49:01 -0800349static QDF_STATUS free_sme_cmd_list(struct mac_context *mac)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800350{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530351 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800352
Jeff Johnsonea9f3d72019-02-17 13:27:55 -0800353 csr_ll_close(&mac->sme.sme_cmd_freelist);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800354
Jeff Johnson3e7a4932019-02-17 12:11:36 -0800355 status = sme_acquire_global_lock(&mac->sme);
Madhvapathi Sriram3e6627a2018-12-19 12:54:49 +0530356 if (status != QDF_STATUS_SUCCESS)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800357 goto done;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800358
Jeff Johnson01f2c232018-11-21 19:17:44 -0800359 free_sme_cmds(mac);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800360
Jeff Johnson3e7a4932019-02-17 12:11:36 -0800361 status = sme_release_global_lock(&mac->sme);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +0530362 if (status != QDF_STATUS_SUCCESS)
Srinivas Girigowda2da81e22017-03-16 21:22:19 -0700363 sme_err("Failed to release the lock status: %d", status);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800364done:
365 return status;
366}
367
Jeff Johnson0a8786a2018-12-02 10:49:01 -0800368static void dump_csr_command_info(struct mac_context *mac, tSmeCmd *pCmd)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800369{
370 switch (pCmd->command) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800371 case eSmeCommandRoam:
Srinivas Girigowda2da81e22017-03-16 21:22:19 -0700372 sme_debug("roam command reason is %d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800373 pCmd->u.roamCmd.roamReason);
374 break;
375
376 case eSmeCommandWmStatusChange:
Srinivas Girigowda2da81e22017-03-16 21:22:19 -0700377 sme_debug("WMStatusChange command type is %d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800378 pCmd->u.wmStatusChangeCmd.Type);
379 break;
380
Pragaspathi Thilagarajb37dad32018-07-01 16:48:01 +0530381 case e_sme_command_del_sta_session:
382 sme_debug("Issue del STA command for session:%d",
383 pCmd->sessionId);
384 break;
385
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800386 default:
Srinivas Girigowda2da81e22017-03-16 21:22:19 -0700387 sme_debug("default: Unhandled command %d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800388 pCmd->command);
389 break;
390 }
391}
392
Jeff Johnson0a8786a2018-12-02 10:49:01 -0800393tSmeCmd *sme_get_command_buffer(struct mac_context *mac)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800394{
395 tSmeCmd *pRetCmd = NULL, *pTempCmd = NULL;
396 tListElem *pEntry;
397 static int sme_command_queue_full;
398
Jeff Johnsonea9f3d72019-02-17 13:27:55 -0800399 pEntry = csr_ll_remove_head(&mac->sme.sme_cmd_freelist, LL_ACCESS_LOCK);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800400
Jeff Johnsonea9f3d72019-02-17 13:27:55 -0800401 /* If we can get another MS Msg buffer, then we are ok. Just
402 * link the entry onto the linked list. (We are using the
403 * linked list to keep track of the message buffers).
404 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800405 if (pEntry) {
406 pRetCmd = GET_BASE_ADDR(pEntry, tSmeCmd, Link);
407 /* reset when free list is available */
408 sme_command_queue_full = 0;
409 } else {
410 int idx = 1;
411
412 /* Cannot change pRetCmd here since it needs to return later. */
Jeff Johnson01f2c232018-11-21 19:17:44 -0800413 pEntry = csr_nonscan_active_ll_peek_head(mac, LL_ACCESS_LOCK);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +0530414 if (pEntry)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800415 pTempCmd = GET_BASE_ADDR(pEntry, tSmeCmd, Link);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +0530416
417 sme_err("Out of command buffer.... command (0x%X) stuck",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800418 (pTempCmd) ? pTempCmd->command : eSmeNoCommand);
419 if (pTempCmd) {
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +0530420 if (eSmeCsrCommandMask & pTempCmd->command)
421 /* CSR command is stuck. See what the reason
422 * code is for that command
423 */
Jeff Johnson01f2c232018-11-21 19:17:44 -0800424 dump_csr_command_info(mac, pTempCmd);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800425 } /* if(pTempCmd) */
426
427 /* dump what is in the pending queue */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800428 pEntry =
Jeff Johnson01f2c232018-11-21 19:17:44 -0800429 csr_nonscan_pending_ll_peek_head(mac,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800430 LL_ACCESS_NOLOCK);
431 while (pEntry && !sme_command_queue_full) {
432 pTempCmd = GET_BASE_ADDR(pEntry, tSmeCmd, Link);
433 /* Print only 1st five commands from pending queue. */
434 if (idx <= 5)
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +0530435 sme_err("Out of command buffer.... SME pending command #%d (0x%X)",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800436 idx, pTempCmd->command);
437 idx++;
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +0530438 if (eSmeCsrCommandMask & pTempCmd->command)
439 /* CSR command is stuck. See what the reason
440 * code is for that command
441 */
Jeff Johnson01f2c232018-11-21 19:17:44 -0800442 dump_csr_command_info(mac, pTempCmd);
443 pEntry = csr_nonscan_pending_ll_next(mac, pEntry,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800444 LL_ACCESS_NOLOCK);
445 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800446
Jeff Johnson01f2c232018-11-21 19:17:44 -0800447 if (mac->mlme_cfg->gen.fatal_event_trigger)
Abhishek Singh5ea86532016-04-27 14:10:53 +0530448 cds_flush_logs(WLAN_LOG_TYPE_FATAL,
449 WLAN_LOG_INDICATOR_HOST_DRIVER,
450 WLAN_LOG_REASON_SME_OUT_OF_CMD_BUF,
451 false,
Jeff Johnson01f2c232018-11-21 19:17:44 -0800452 mac->mlme_cfg->gen.self_recovery);
Abhishek Singh5ea86532016-04-27 14:10:53 +0530453 else
Anurag Chouhan4085ff72017-10-05 18:09:56 +0530454 cds_trigger_recovery(QDF_GET_MSG_BUFF_FAILURE);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800455 }
456
457 /* memset to zero */
458 if (pRetCmd) {
hangtian127c9532019-01-12 13:29:07 +0800459 qdf_mem_zero((uint8_t *)&pRetCmd->command,
460 sizeof(pRetCmd->command));
461 qdf_mem_zero((uint8_t *)&pRetCmd->sessionId,
462 sizeof(pRetCmd->sessionId));
463 qdf_mem_zero((uint8_t *)&pRetCmd->u, sizeof(pRetCmd->u));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800464 }
465
466 return pRetCmd;
467}
468
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800469/**
Krunal Sonia8270f52017-02-23 19:51:25 -0800470 * sme_ser_handle_active_cmd() - handle command activation callback from
471 * new serialization module
472 * @cmd: pointer to new serialization command
473 *
474 * This API is to handle command activation callback from new serialization
475 * callback
476 *
477 * Return: QDF_STATUS_SUCCESS
478 */
479static
480QDF_STATUS sme_ser_handle_active_cmd(struct wlan_serialization_command *cmd)
481{
482 tSmeCmd *sme_cmd;
Jeff Johnsonc7309062018-11-09 20:59:42 -0800483 mac_handle_t mac_handle;
Jeff Johnson0a8786a2018-12-02 10:49:01 -0800484 struct mac_context *mac_ctx;
Krunal Sonia8270f52017-02-23 19:51:25 -0800485 QDF_STATUS status = QDF_STATUS_SUCCESS;
486 bool do_continue;
487
488 if (!cmd) {
Srinivas Girigowda2c263352017-03-17 17:49:53 -0700489 sme_err("No serialization command found");
Krunal Sonia8270f52017-02-23 19:51:25 -0800490 return QDF_STATUS_E_FAILURE;
491 }
492
Jeff Johnsonc7309062018-11-09 20:59:42 -0800493 mac_handle = cds_get_context(QDF_MODULE_ID_SME);
Jeff Johnson038efe72019-03-18 13:39:31 -0700494 if (mac_handle) {
Jeff Johnsona0619e42018-11-28 17:43:00 -0800495 mac_ctx = MAC_CONTEXT(mac_handle);
Pragaspathi Thilagarajb11dbe42018-07-23 16:42:17 +0530496 } else {
Jeff Johnsonc7309062018-11-09 20:59:42 -0800497 sme_err("No mac_handle found");
Krunal Sonia8270f52017-02-23 19:51:25 -0800498 return QDF_STATUS_E_FAILURE;
499 }
500 sme_cmd = cmd->umac_cmd;
501 if (!sme_cmd) {
Srinivas Girigowda2c263352017-03-17 17:49:53 -0700502 sme_err("No SME command found");
Krunal Sonia8270f52017-02-23 19:51:25 -0800503 return QDF_STATUS_E_FAILURE;
504 }
505
506 switch (sme_cmd->command) {
507 case eSmeCommandRoam:
508 status = csr_roam_process_command(mac_ctx, sme_cmd);
509 break;
510 case eSmeCommandWmStatusChange:
511 csr_roam_process_wm_status_change_command(mac_ctx,
512 sme_cmd);
513 break;
Pragaspathi Thilagarajb37dad32018-07-01 16:48:01 +0530514 case e_sme_command_del_sta_session:
515 csr_process_del_sta_session_command(mac_ctx, sme_cmd);
516 break;
Krunal Sonia8270f52017-02-23 19:51:25 -0800517 case eSmeCommandAddTs:
518 case eSmeCommandDelTs:
519#ifndef WLAN_MDM_CODE_REDUCTION_OPT
520 do_continue = qos_process_command(mac_ctx, sme_cmd);
521 if (do_continue)
522 status = QDF_STATUS_E_FAILURE;
523#endif
524 break;
Krunal Sonia8270f52017-02-23 19:51:25 -0800525 case e_sme_command_set_hw_mode:
526 csr_process_set_hw_mode(mac_ctx, sme_cmd);
527 break;
528 case e_sme_command_nss_update:
529 csr_process_nss_update_req(mac_ctx, sme_cmd);
530 break;
531 case e_sme_command_set_dual_mac_config:
532 csr_process_set_dual_mac_config(mac_ctx, sme_cmd);
533 break;
534 case e_sme_command_set_antenna_mode:
535 csr_process_set_antenna_mode(mac_ctx, sme_cmd);
536 break;
537 default:
538 /* something is wrong */
Srinivas Girigowda2da81e22017-03-16 21:22:19 -0700539 sme_err("unknown command %d", sme_cmd->command);
Krunal Sonia8270f52017-02-23 19:51:25 -0800540 status = QDF_STATUS_E_FAILURE;
541 break;
542 }
Krunal Sonia8270f52017-02-23 19:51:25 -0800543 return status;
544}
545
Rajeev Kumar Sirasanagandla4477e7e2019-01-29 14:05:44 -0800546QDF_STATUS sme_ser_cmd_callback(struct wlan_serialization_command *cmd,
Krunal Sonia8270f52017-02-23 19:51:25 -0800547 enum wlan_serialization_cb_reason reason)
548{
Jeff Johnsonc7309062018-11-09 20:59:42 -0800549 mac_handle_t mac_handle;
Jeff Johnson0a8786a2018-12-02 10:49:01 -0800550 struct mac_context *mac_ctx;
Krunal Sonia8270f52017-02-23 19:51:25 -0800551 QDF_STATUS status = QDF_STATUS_SUCCESS;
552 tSmeCmd *sme_cmd;
553
Jeff Johnsonc7309062018-11-09 20:59:42 -0800554 mac_handle = cds_get_context(QDF_MODULE_ID_SME);
Jeff Johnson038efe72019-03-18 13:39:31 -0700555 if (mac_handle) {
Jeff Johnsona0619e42018-11-28 17:43:00 -0800556 mac_ctx = MAC_CONTEXT(mac_handle);
Pragaspathi Thilagarajb11dbe42018-07-23 16:42:17 +0530557 } else {
Jeff Johnsonc7309062018-11-09 20:59:42 -0800558 sme_err("mac_handle is null");
Krunal Sonia8270f52017-02-23 19:51:25 -0800559 return QDF_STATUS_E_FAILURE;
560 }
561 /*
562 * Do not acquire lock here as sme global lock is already acquired in
563 * caller or MC thread context
564 */
565 if (!cmd) {
Srinivas Girigowda2c263352017-03-17 17:49:53 -0700566 sme_err("serialization command is null");
Krunal Sonia8270f52017-02-23 19:51:25 -0800567 return QDF_STATUS_E_FAILURE;
568 }
569
570 switch (reason) {
571 case WLAN_SER_CB_ACTIVATE_CMD:
Srinivas Girigowda2c263352017-03-17 17:49:53 -0700572 sme_debug("WLAN_SER_CB_ACTIVATE_CMD callback");
Krunal Sonia8270f52017-02-23 19:51:25 -0800573 status = sme_ser_handle_active_cmd(cmd);
574 break;
575 case WLAN_SER_CB_CANCEL_CMD:
Srinivas Girigowda2c263352017-03-17 17:49:53 -0700576 sme_debug("WLAN_SER_CB_CANCEL_CMD callback");
Krunal Sonia8270f52017-02-23 19:51:25 -0800577 break;
578 case WLAN_SER_CB_RELEASE_MEM_CMD:
Srinivas Girigowda2c263352017-03-17 17:49:53 -0700579 sme_debug("WLAN_SER_CB_RELEASE_MEM_CMD callback");
Vignesh Viswanathan062b5162018-10-11 17:18:41 +0530580 if (cmd->vdev)
581 wlan_objmgr_vdev_release_ref(cmd->vdev,
582 WLAN_LEGACY_SME_ID);
Krunal Sonia8270f52017-02-23 19:51:25 -0800583 sme_cmd = cmd->umac_cmd;
584 csr_release_command_buffer(mac_ctx, sme_cmd);
585 break;
586 case WLAN_SER_CB_ACTIVE_CMD_TIMEOUT:
Srinivas Girigowda2c263352017-03-17 17:49:53 -0700587 sme_debug("WLAN_SER_CB_ACTIVE_CMD_TIMEOUT callback");
Krunal Sonia8270f52017-02-23 19:51:25 -0800588 break;
589 default:
Srinivas Girigowda2c263352017-03-17 17:49:53 -0700590 sme_debug("STOP: unknown reason code");
Krunal Sonia8270f52017-02-23 19:51:25 -0800591 return QDF_STATUS_E_FAILURE;
592 }
593 return status;
594}
595
Wen Gong3f003382018-05-14 14:26:37 +0800596#ifdef WLAN_FEATURE_MEMDUMP_ENABLE
Krunal Sonia8270f52017-02-23 19:51:25 -0800597/**
Padma, Santhosh Kumar9aba02f2016-08-11 16:30:25 +0530598 * sme_get_sessionid_from_activelist() - gets session id
599 * @mac: mac context
600 *
601 * This function is used to get session id from sme command
602 * active list
603 *
604 * Return: returns session id
605 */
Jeff Johnson0a8786a2018-12-02 10:49:01 -0800606static uint32_t sme_get_sessionid_from_activelist(struct mac_context *mac)
Padma, Santhosh Kumar9aba02f2016-08-11 16:30:25 +0530607{
608 tListElem *entry;
609 tSmeCmd *command;
Srinivas Girigowdad8697d42019-03-08 15:34:39 -0800610 uint32_t session_id = WLAN_UMAC_VDEV_ID_MAX;
Padma, Santhosh Kumar9aba02f2016-08-11 16:30:25 +0530611
Krunal Sonia8270f52017-02-23 19:51:25 -0800612 entry = csr_nonscan_active_ll_peek_head(mac, LL_ACCESS_LOCK);
Padma, Santhosh Kumar9aba02f2016-08-11 16:30:25 +0530613 if (entry) {
614 command = GET_BASE_ADDR(entry, tSmeCmd, Link);
615 session_id = command->sessionId;
616 }
617
618 return session_id;
619}
620
621/**
622 * sme_state_info_dump() - prints state information of sme layer
623 * @buf: buffer pointer
624 * @size: size of buffer to be filled
625 *
626 * This function is used to dump state information of sme layer
627 *
628 * Return: None
629 */
630static void sme_state_info_dump(char **buf_ptr, uint16_t *size)
631{
632 uint32_t session_id, active_session_id;
Jeff Johnsonc7309062018-11-09 20:59:42 -0800633 mac_handle_t mac_handle;
Jeff Johnson0a8786a2018-12-02 10:49:01 -0800634 struct mac_context *mac;
Padma, Santhosh Kumar9aba02f2016-08-11 16:30:25 +0530635 uint16_t len = 0;
636 char *buf = *buf_ptr;
637 eCsrConnectState connect_state;
638
Jeff Johnsonc7309062018-11-09 20:59:42 -0800639 mac_handle = cds_get_context(QDF_MODULE_ID_SME);
Jeff Johnson038efe72019-03-18 13:39:31 -0700640 if (!mac_handle) {
Padma, Santhosh Kumar9aba02f2016-08-11 16:30:25 +0530641 QDF_ASSERT(0);
642 return;
643 }
644
Jeff Johnsona0619e42018-11-28 17:43:00 -0800645 mac = MAC_CONTEXT(mac_handle);
Padma, Santhosh Kumar9aba02f2016-08-11 16:30:25 +0530646
647 active_session_id = sme_get_sessionid_from_activelist(mac);
Srinivas Girigowdad8697d42019-03-08 15:34:39 -0800648 if (active_session_id != WLAN_UMAC_VDEV_ID_MAX) {
Padma, Santhosh Kumar9aba02f2016-08-11 16:30:25 +0530649 len += qdf_scnprintf(buf + len, *size - len,
650 "\n active command sessionid %d", active_session_id);
651 }
652
Dustin Brownad06be62019-02-04 14:52:56 -0800653 for (session_id = 0; session_id < WLAN_MAX_VDEVS; session_id++) {
Padma, Santhosh Kumar9aba02f2016-08-11 16:30:25 +0530654 if (CSR_IS_SESSION_VALID(mac, session_id)) {
655 connect_state =
656 mac->roam.roamSession[session_id].connectState;
657 if ((eCSR_ASSOC_STATE_TYPE_INFRA_ASSOCIATED ==
658 connect_state)
659 || (eCSR_ASSOC_STATE_TYPE_INFRA_CONNECTED ==
660 connect_state)) {
661 len += qdf_scnprintf(buf + len, *size - len,
662 "\n NeighborRoamState: %d",
663 mac->roam.neighborRoamInfo[session_id].
664 neighborRoamState);
665 len += qdf_scnprintf(buf + len, *size - len,
666 "\n RoamState: %d", mac->roam.
667 curState[session_id]);
668 len += qdf_scnprintf(buf + len, *size - len,
669 "\n RoamSubState: %d", mac->roam.
670 curSubState[session_id]);
671 len += qdf_scnprintf(buf + len, *size - len,
672 "\n ConnectState: %d",
673 connect_state);
674 }
675 }
676 }
677
678 *size -= len;
679 *buf_ptr += len;
680}
681
682/**
683 * sme_register_debug_callback() - registration function sme layer
684 * to print sme state information
685 *
686 * Return: None
687 */
688static void sme_register_debug_callback(void)
689{
690 qdf_register_debug_callback(QDF_MODULE_ID_SME, &sme_state_info_dump);
691}
Wen Gong3f003382018-05-14 14:26:37 +0800692#else /* WLAN_FEATURE_MEMDUMP_ENABLE */
Wen Gongaa6d55d2018-04-26 16:33:21 +0800693static void sme_register_debug_callback(void)
694{
695}
Wen Gong3f003382018-05-14 14:26:37 +0800696#endif /* WLAN_FEATURE_MEMDUMP_ENABLE */
Padma, Santhosh Kumar9aba02f2016-08-11 16:30:25 +0530697
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800698/* Global APIs */
699
700/**
701 * sme_open() - Initialze all SME modules and put them at idle state
Jeff Johnsonb460dd72018-11-08 10:26:51 -0800702 * @mac_handle: The handle returned by mac_open
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800703 *
704 * The function initializes each module inside SME, PMC, CSR, etc. Upon
705 * successfully return, all modules are at idle state ready to start.
706 * smeOpen must be called before any other SME APIs can be involved.
707 * smeOpen must be called after mac_open.
708 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530709 * Return: QDF_STATUS_SUCCESS - SME is successfully initialized.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800710 * Other status means SME is failed to be initialized
711 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -0800712QDF_STATUS sme_open(mac_handle_t mac_handle)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800713{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530714 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -0800715 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800716
Jeff Johnson01f2c232018-11-21 19:17:44 -0800717 mac->sme.state = SME_STATE_STOP;
Jeff Johnson5a6a0c92019-02-17 16:12:02 -0800718 mac->sme.curr_device_mode = QDF_STA_MODE;
Anurag Chouhana37b5b72016-02-21 14:53:42 +0530719 if (!QDF_IS_STATUS_SUCCESS(qdf_mutex_create(
Jeff Johnson3e7a4932019-02-17 12:11:36 -0800720 &mac->sme.sme_global_lock))) {
Srinivas Girigowda09625b02018-09-10 15:28:09 -0700721 sme_err("Init lock failed");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530722 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800723 }
Jeff Johnson01f2c232018-11-21 19:17:44 -0800724 status = csr_open(mac);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530725 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -0700726 sme_err("csr_open failed, status: %d", status);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800727 return status;
728 }
729
Jeff Johnsonb460dd72018-11-08 10:26:51 -0800730 status = sme_ps_open(mac_handle);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530731 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -0700732 sme_err("sme_ps_open failed with status: %d", status);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800733 return status;
734 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800735
736#ifndef WLAN_MDM_CODE_REDUCTION_OPT
Jeff Johnson01f2c232018-11-21 19:17:44 -0800737 status = sme_qos_open(mac);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530738 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -0700739 sme_err("Qos open, status: %d", status);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800740 return status;
741 }
742#endif
Jeff Johnson01f2c232018-11-21 19:17:44 -0800743 status = init_sme_cmd_list(mac);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530744 if (!QDF_IS_STATUS_SUCCESS(status))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800745 return status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800746
Jeff Johnson01f2c232018-11-21 19:17:44 -0800747 status = rrm_open(mac);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530748 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -0700749 sme_err("rrm_open failed, status: %d", status);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800750 return status;
751 }
Jeff Johnson01f2c232018-11-21 19:17:44 -0800752 sme_trace_init(mac);
Padma, Santhosh Kumar9aba02f2016-08-11 16:30:25 +0530753 sme_register_debug_callback();
Krunal Soni33787902017-08-29 11:39:28 -0700754
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800755 return status;
756}
757
758/*
759 * sme_init_chan_list, triggers channel setup based on country code.
760 */
Jeff Johnsonc7309062018-11-09 20:59:42 -0800761QDF_STATUS sme_init_chan_list(mac_handle_t mac_handle, uint8_t *alpha2,
Amar Singhala297bfa2015-10-15 15:07:29 -0700762 enum country_src cc_src)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800763{
Jeff Johnson0a8786a2018-12-02 10:49:01 -0800764 struct mac_context *pmac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800765
Amar Singhala297bfa2015-10-15 15:07:29 -0700766 if ((cc_src == SOURCE_USERSPACE) &&
Bala Venkatesh46e29032018-11-14 18:24:55 +0530767 (pmac->mlme_cfg->sap_cfg.country_code_priority)) {
Abhinav Kumard4d6eb72018-12-04 20:30:37 +0530768 pmac->mlme_cfg->gen.enabled_11d = false;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800769 }
770
771 return csr_init_chan_list(pmac, alpha2);
772}
773
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +0530774/*
775 * sme_set11dinfo() - Set the 11d information about valid channels
776 * and there power using information from nvRAM
777 * This function is called only for AP.
778 *
779 * This is a synchronous call
780 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -0800781 * mac_handle - The handle returned by mac_open.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +0530782 * pSmeConfigParams - a pointer to a caller allocated object of
Jeff Johnson46b4f0e2019-03-08 10:48:35 -0800783 * struct sme_config_params.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +0530784 *
785 * Return QDF_STATUS_SUCCESS - SME update the config parameters successfully.
786 *
787 * Other status means SME is failed to update the config parameters.
788 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800789
Jeff Johnsonc7309062018-11-09 20:59:42 -0800790QDF_STATUS sme_set11dinfo(mac_handle_t mac_handle,
Jeff Johnson46b4f0e2019-03-08 10:48:35 -0800791 struct sme_config_params *pSmeConfigParams)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800792{
Jeff Johnson0a8786a2018-12-02 10:49:01 -0800793 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530794 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800795
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +0530796 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800797 TRACE_CODE_SME_RX_HDD_MSG_SET_11DINFO, NO_SESSION, 0));
Jeff Johnson038efe72019-03-18 13:39:31 -0700798 if (!pSmeConfigParams) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -0700799 sme_err("SME config params empty");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800800 return status;
801 }
802
Jeff Johnsonff26c612018-06-10 20:57:13 -0700803 status = csr_set_channels(mac_ctx, &pSmeConfigParams->csrConfig);
Srinivas Girigowda2da81e22017-03-16 21:22:19 -0700804 if (!QDF_IS_STATUS_SUCCESS(status))
805 sme_err("csr_set_channels failed with status: %d", status);
806
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800807 return status;
808}
809
Krunal Sonie3531942016-04-12 17:43:53 -0700810/**
811 * sme_update_fine_time_measurement_capab() - Update the FTM capabitlies from
812 * incoming val
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -0800813 * @mac_handle: Opaque handle to the global MAC context
Krunal Sonie3531942016-04-12 17:43:53 -0700814 * @val: New FTM capability value
815 *
816 * Return: None
817 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -0800818void sme_update_fine_time_measurement_capab(mac_handle_t mac_handle,
Jeff Johnson1f2dabc2018-11-07 15:33:01 -0800819 uint8_t session_id,
820 uint32_t val)
Krunal Sonie3531942016-04-12 17:43:53 -0700821{
Jeff Johnson0a8786a2018-12-02 10:49:01 -0800822 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Vignesh Viswanathan4e65e8e2018-05-01 12:04:16 +0530823 QDF_STATUS status;
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +0530824
Naveen Rawatd2657be2017-10-10 14:31:23 -0700825 ucfg_wifi_pos_set_ftm_cap(mac_ctx->psoc, val);
Krunal Sonie3531942016-04-12 17:43:53 -0700826
Selvaraj, Sridhar57bb4d02016-08-31 16:14:15 +0530827 if (!val) {
Krunal Sonie3531942016-04-12 17:43:53 -0700828 mac_ctx->rrm.rrmPEContext.rrmEnabledCaps.fine_time_meas_rpt = 0;
829 ((tpRRMCaps)mac_ctx->rrm.rrmSmeContext.
830 rrmConfig.rm_capability)->fine_time_meas_rpt = 0;
831 } else {
832 mac_ctx->rrm.rrmPEContext.rrmEnabledCaps.fine_time_meas_rpt = 1;
833 ((tpRRMCaps)mac_ctx->rrm.rrmSmeContext.
834 rrmConfig.rm_capability)->fine_time_meas_rpt = 1;
835 }
Selvaraj, Sridhar57bb4d02016-08-31 16:14:15 +0530836
837 /* Inform this RRM IE change to FW */
Vignesh Viswanathan4e65e8e2018-05-01 12:04:16 +0530838 status = sme_acquire_global_lock(&mac_ctx->sme);
839 if (QDF_IS_STATUS_SUCCESS(status)) {
840 csr_roam_offload_scan(mac_ctx, session_id,
Selvaraj, Sridhar57bb4d02016-08-31 16:14:15 +0530841 ROAM_SCAN_OFFLOAD_UPDATE_CFG,
842 REASON_CONNECT_IES_CHANGED);
Vignesh Viswanathan4e65e8e2018-05-01 12:04:16 +0530843 sme_release_global_lock(&mac_ctx->sme);
Vignesh Viswanathan4e65e8e2018-05-01 12:04:16 +0530844 }
Krunal Sonie3531942016-04-12 17:43:53 -0700845}
846
Manikandan Mohan06d38d82018-11-26 18:36:58 -0800847/**
848 * sme_update_neighbor_report_config() - Update CSR config for 11k params
849 * @mac_handle: Pointer to MAC context
850 * @csr_config: Pointer to CSR config data structure
851 *
852 * Return: None
853 */
854static void sme_update_neighbor_report_config(struct mac_context *mac,
855 tCsrConfigParam *csr_config)
856{
857 struct wlan_fwol_neighbor_report_cfg fwol_neighbor_report_cfg = {0};
858 QDF_STATUS status;
859
860 status = ucfg_fwol_get_neighbor_report_cfg(mac->psoc,
861 &fwol_neighbor_report_cfg);
862 if (!QDF_IS_STATUS_SUCCESS(status))
863 sme_err("Using defaults for 11K offload params: Error: %d",
864 status);
865
866 csr_config->offload_11k_enable_bitmask =
867 fwol_neighbor_report_cfg.enable_bitmask;
868 csr_config->neighbor_report_offload.params_bitmask =
869 fwol_neighbor_report_cfg.params_bitmask;
870 csr_config->neighbor_report_offload.time_offset =
871 fwol_neighbor_report_cfg.time_offset;
872 csr_config->neighbor_report_offload.low_rssi_offset =
873 fwol_neighbor_report_cfg.low_rssi_offset;
874 csr_config->neighbor_report_offload.bmiss_count_trigger =
875 fwol_neighbor_report_cfg.bmiss_count_trigger;
876 csr_config->neighbor_report_offload.per_threshold_offset =
877 fwol_neighbor_report_cfg.per_threshold_offset;
878 csr_config->neighbor_report_offload.neighbor_report_cache_timeout =
879 fwol_neighbor_report_cfg.cache_timeout;
880 csr_config->neighbor_report_offload.max_neighbor_report_req_cap =
881 fwol_neighbor_report_cfg.max_req_cap;
882}
883
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +0530884/*
885 * sme_update_config() - Change configurations for all SME moduels
886 * The function updates some configuration for modules in SME, CSR, etc
887 * during SMEs close open sequence.
888 * Modules inside SME apply the new configuration at the next transaction.
889 * This is a synchronous call
890 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -0800891 * mac_handle - The handle returned by mac_open.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +0530892 * pSmeConfigParams - a pointer to a caller allocated object of
Jeff Johnson46b4f0e2019-03-08 10:48:35 -0800893 * struct sme_config_params.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +0530894 * Return QDF_STATUS_SUCCESS - SME update the config parameters successfully.
895 * Other status means SME is failed to update the config parameters.
896 */
Jeff Johnson46b4f0e2019-03-08 10:48:35 -0800897QDF_STATUS sme_update_config(mac_handle_t mac_handle,
898 struct sme_config_params *pSmeConfigParams)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800899{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530900 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -0800901 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800902
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +0530903 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800904 TRACE_CODE_SME_RX_HDD_MSG_UPDATE_CONFIG, NO_SESSION,
905 0));
Jeff Johnson038efe72019-03-18 13:39:31 -0700906 if (!pSmeConfigParams) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -0700907 sme_err("SME config params empty");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800908 return status;
909 }
Manikandan Mohan06d38d82018-11-26 18:36:58 -0800910 sme_update_neighbor_report_config(mac, &pSmeConfigParams->csrConfig);
Jeff Johnson01f2c232018-11-21 19:17:44 -0800911 status = csr_change_default_config_param(mac, &pSmeConfigParams->
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +0530912 csrConfig);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800913
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +0530914 if (!QDF_IS_STATUS_SUCCESS(status))
Srinivas Girigowda2da81e22017-03-16 21:22:19 -0700915 sme_err("csr_change_default_config_param failed status: %d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800916 status);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800917
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +0530918 /* For SOC, CFG is set before start We don't want to apply global CFG
919 * in connect state because that may cause some side affect
920 */
Jeff Johnson01f2c232018-11-21 19:17:44 -0800921 if (csr_is_all_session_disconnected(mac))
922 csr_set_global_cfgs(mac);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800923
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800924 return status;
925}
926
927/**
Abhishek Singh158fe252017-03-23 11:09:34 +0530928 * sme_update_scan_roam_params() - Update the scan roaming params
929 * @mac_ctx: mac ctx
930 *
931 * Return: void.
932 */
Jeff Johnson0a8786a2018-12-02 10:49:01 -0800933static void sme_update_scan_roam_params(struct mac_context *mac_ctx)
Abhishek Singh158fe252017-03-23 11:09:34 +0530934{
935 struct roam_filter_params scan_params = {0};
936 struct roam_ext_params *roam_params_src;
937 uint8_t i;
938 QDF_STATUS status;
939
940 roam_params_src = &mac_ctx->roam.configParam.roam_params;
941
942 scan_params.num_bssid_avoid_list =
943 roam_params_src->num_bssid_avoid_list;
Abhishek Singh158fe252017-03-23 11:09:34 +0530944
945 if (scan_params.num_bssid_avoid_list >
946 MAX_AVOID_LIST_BSSID)
947 scan_params.num_bssid_avoid_list =
948 MAX_AVOID_LIST_BSSID;
949
950 for (i = 0; i < scan_params.num_bssid_avoid_list; i++) {
951 qdf_copy_macaddr(&scan_params.bssid_avoid_list[i],
952 &roam_params_src->bssid_avoid_list[i]);
953 }
954
955 status = ucfg_scan_update_roam_params(mac_ctx->psoc, &scan_params);
956 if (QDF_IS_STATUS_ERROR(status))
Srinivas Girigowda2c263352017-03-17 17:49:53 -0700957 sme_err("ailed to update scan roam params with status=%d",
Abhishek Singh158fe252017-03-23 11:09:34 +0530958 status);
959}
960
961/**
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800962 * sme_update_roam_params() - Store/Update the roaming params
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -0800963 * @mac_handle: Opaque handle to the global MAC context
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800964 * @session_id: SME Session ID
965 * @roam_params_src: The source buffer to copy
966 * @update_param: Type of parameter to be updated
967 *
968 * Return: Return the status of the updation.
969 */
Jeff Johnsonc7309062018-11-09 20:59:42 -0800970QDF_STATUS sme_update_roam_params(mac_handle_t mac_handle,
971 uint8_t session_id,
972 struct roam_ext_params *roam_params_src,
973 int update_param)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800974{
Jeff Johnson0a8786a2018-12-02 10:49:01 -0800975 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800976 struct roam_ext_params *roam_params_dst;
Vignesh Viswanathan4e65e8e2018-05-01 12:04:16 +0530977 QDF_STATUS status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800978 uint8_t i;
979
980 roam_params_dst = &mac_ctx->roam.configParam.roam_params;
981 switch (update_param) {
982 case REASON_ROAM_EXT_SCAN_PARAMS_CHANGED:
Wu Gaoca416ff2018-09-17 11:05:07 +0800983 mac_ctx->mlme_cfg->lfr.rssi_boost_threshold_5g =
Srinivas Girigowda72f30392017-07-13 18:55:09 -0700984 roam_params_src->raise_rssi_thresh_5g;
Wu Gaoca416ff2018-09-17 11:05:07 +0800985 mac_ctx->mlme_cfg->lfr.rssi_penalize_threshold_5g =
Srinivas Girigowda72f30392017-07-13 18:55:09 -0700986 roam_params_src->drop_rssi_thresh_5g;
Wu Gaoca416ff2018-09-17 11:05:07 +0800987 mac_ctx->mlme_cfg->lfr.rssi_boost_factor_5g =
Srinivas Girigowda72f30392017-07-13 18:55:09 -0700988 roam_params_src->raise_factor_5g;
Wu Gaoca416ff2018-09-17 11:05:07 +0800989 mac_ctx->mlme_cfg->lfr.rssi_penalize_factor_5g =
Srinivas Girigowda72f30392017-07-13 18:55:09 -0700990 roam_params_src->drop_factor_5g;
Wu Gaoca416ff2018-09-17 11:05:07 +0800991 mac_ctx->mlme_cfg->lfr.max_rssi_boost_5g =
Srinivas Girigowda72f30392017-07-13 18:55:09 -0700992 roam_params_src->max_raise_rssi_5g;
Wu Gaoca416ff2018-09-17 11:05:07 +0800993 mac_ctx->mlme_cfg->lfr.max_rssi_penalize_5g =
Srinivas Girigowda72f30392017-07-13 18:55:09 -0700994 roam_params_src->max_drop_rssi_5g;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800995 roam_params_dst->alert_rssi_threshold =
Srinivas Girigowda72f30392017-07-13 18:55:09 -0700996 roam_params_src->alert_rssi_threshold;
Wu Gaoca416ff2018-09-17 11:05:07 +0800997 mac_ctx->mlme_cfg->lfr.enable_5g_band_pref = true;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800998 break;
999 case REASON_ROAM_SET_SSID_ALLOWED:
hangtian127c9532019-01-12 13:29:07 +08001000 qdf_mem_zero(&roam_params_dst->ssid_allowed_list,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001001 sizeof(tSirMacSSid) * MAX_SSID_ALLOWED_LIST);
1002 roam_params_dst->num_ssid_allowed_list =
Srinivas Girigowda72f30392017-07-13 18:55:09 -07001003 roam_params_src->num_ssid_allowed_list;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001004 for (i = 0; i < roam_params_dst->num_ssid_allowed_list; i++) {
1005 roam_params_dst->ssid_allowed_list[i].length =
Srinivas Girigowda72f30392017-07-13 18:55:09 -07001006 roam_params_src->ssid_allowed_list[i].length;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05301007 qdf_mem_copy(roam_params_dst->ssid_allowed_list[i].ssId,
Srinivas Girigowda72f30392017-07-13 18:55:09 -07001008 roam_params_src->ssid_allowed_list[i].ssId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001009 roam_params_dst->ssid_allowed_list[i].length);
1010 }
1011 break;
1012 case REASON_ROAM_SET_FAVORED_BSSID:
hangtian127c9532019-01-12 13:29:07 +08001013 qdf_mem_zero(&roam_params_dst->bssid_favored,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001014 sizeof(tSirMacAddr) * MAX_BSSID_FAVORED);
1015 roam_params_dst->num_bssid_favored =
Srinivas Girigowda72f30392017-07-13 18:55:09 -07001016 roam_params_src->num_bssid_favored;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001017 for (i = 0; i < roam_params_dst->num_bssid_favored; i++) {
Anurag Chouhan600c3a02016-03-01 10:33:54 +05301018 qdf_mem_copy(&roam_params_dst->bssid_favored[i],
Srinivas Girigowda72f30392017-07-13 18:55:09 -07001019 &roam_params_src->bssid_favored[i],
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001020 sizeof(tSirMacAddr));
1021 roam_params_dst->bssid_favored_factor[i] =
Srinivas Girigowda72f30392017-07-13 18:55:09 -07001022 roam_params_src->bssid_favored_factor[i];
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001023 }
1024 break;
1025 case REASON_ROAM_SET_BLACKLIST_BSSID:
hangtian127c9532019-01-12 13:29:07 +08001026 qdf_mem_zero(&roam_params_dst->bssid_avoid_list,
Anurag Chouhan6d760662016-02-20 16:05:43 +05301027 QDF_MAC_ADDR_SIZE * MAX_BSSID_AVOID_LIST);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001028 roam_params_dst->num_bssid_avoid_list =
Srinivas Girigowda72f30392017-07-13 18:55:09 -07001029 roam_params_src->num_bssid_avoid_list;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001030 for (i = 0; i < roam_params_dst->num_bssid_avoid_list; i++) {
Anurag Chouhanc5548422016-02-24 18:33:27 +05301031 qdf_copy_macaddr(&roam_params_dst->bssid_avoid_list[i],
Srinivas Girigowda72f30392017-07-13 18:55:09 -07001032 &roam_params_src->bssid_avoid_list[i]);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001033 }
1034 break;
1035 case REASON_ROAM_GOOD_RSSI_CHANGED:
1036 roam_params_dst->good_rssi_roam =
Srinivas Girigowda72f30392017-07-13 18:55:09 -07001037 roam_params_src->good_rssi_roam;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001038 break;
1039 default:
1040 break;
1041 }
Vignesh Viswanathan4e65e8e2018-05-01 12:04:16 +05301042
1043 status = sme_acquire_global_lock(&mac_ctx->sme);
1044 if (QDF_IS_STATUS_SUCCESS(status)) {
1045 csr_roam_offload_scan(mac_ctx, session_id,
1046 ROAM_SCAN_OFFLOAD_UPDATE_CFG,
1047 update_param);
1048 sme_release_global_lock(&mac_ctx->sme);
Vignesh Viswanathan4e65e8e2018-05-01 12:04:16 +05301049 }
Abhishek Singh158fe252017-03-23 11:09:34 +05301050
1051 sme_update_scan_roam_params(mac_ctx);
1052
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001053 return 0;
1054}
1055
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001056#ifdef WLAN_FEATURE_EXTWOW_SUPPORT
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001057
Krishna Kumaar Natarajand9131902015-10-19 11:52:47 -07001058/**
1059 * sme_process_ready_to_ext_wow() - inform ready to ExtWoW indication.
Jeff Johnson9d7c99e2018-06-28 15:36:00 -07001060 * @mac: Global MAC context
1061 * @indication: ready to Ext WoW indication from lower layer
Krishna Kumaar Natarajand9131902015-10-19 11:52:47 -07001062 *
1063 * On getting ready to Ext WoW indication, this function calls callback
Jeff Johnson9d7c99e2018-06-28 15:36:00 -07001064 * registered (HDD callback) with SME to inform ready to ExtWoW indication.
Krishna Kumaar Natarajand9131902015-10-19 11:52:47 -07001065 *
1066 * Return: None
1067 */
Jeff Johnson0a8786a2018-12-02 10:49:01 -08001068static void sme_process_ready_to_ext_wow(struct mac_context *mac,
Jeff Johnson9d7c99e2018-06-28 15:36:00 -07001069 tpSirReadyToExtWoWInd indication)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001070{
Jeff Johnson9d7c99e2018-06-28 15:36:00 -07001071 if (!mac) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301072 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_FATAL,
Jeff Johnson9d7c99e2018-06-28 15:36:00 -07001073 "%s: mac is null", __func__);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001074 return;
1075 }
1076
Jeff Johnson038efe72019-03-18 13:39:31 -07001077 if (mac->readyToExtWoWCallback) {
Jeff Johnson9d7c99e2018-06-28 15:36:00 -07001078 mac->readyToExtWoWCallback(mac->readyToExtWoWContext,
1079 indication->status);
1080 mac->readyToExtWoWCallback = NULL;
1081 mac->readyToExtWoWContext = NULL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001082 }
1083
1084}
1085#endif
1086
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05301087/*
1088 * sme_hdd_ready_ind() - SME sends eWNI_SME_SYS_READY_IND to PE to inform
1089 * that the NIC is ready tio run.
1090 * The function is called by HDD at the end of initialization stage so PE/HAL
1091 * can enable the NIC to running state.
1092 * This is a synchronous call
1093 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08001094 * @mac_handle - The handle returned by mac_open.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05301095 * Return QDF_STATUS_SUCCESS - eWNI_SME_SYS_READY_IND is sent to PE
1096 * successfully.
1097 * Other status means SME failed to send the message to PE.
1098 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08001099QDF_STATUS sme_hdd_ready_ind(mac_handle_t mac_handle)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001100{
Jeff Johnson47e4b552019-02-01 23:12:25 -08001101 struct sme_ready_req *msg;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301102 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08001103 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001104
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301105 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001106 TRACE_CODE_SME_RX_HDD_MSG_HDDREADYIND, NO_SESSION, 0));
1107 do {
1108
Abhishek Singhde410b72017-05-22 15:25:39 +05301109 msg = qdf_mem_malloc(sizeof(*msg));
Arif Hussain0ef77082018-10-10 16:42:53 -07001110 if (!msg)
Abhishek Singhde410b72017-05-22 15:25:39 +05301111 return QDF_STATUS_E_NOMEM;
Arif Hussain0ef77082018-10-10 16:42:53 -07001112
Abhishek Singhde410b72017-05-22 15:25:39 +05301113 msg->messageType = eWNI_SME_SYS_READY_IND;
1114 msg->length = sizeof(*msg);
Abhishek Singhde410b72017-05-22 15:25:39 +05301115 msg->csr_roam_synch_cb = csr_roam_synch_callback;
Sandeep Puligilla1426d612017-04-12 18:22:06 -07001116 msg->sme_msg_cb = sme_process_msg_callback;
Vignesh Viswanathan3d478032018-08-02 20:18:53 +05301117 msg->stop_roaming_cb = sme_stop_roaming;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001118
Jeff Johnsonb460dd72018-11-08 10:26:51 -08001119 status = u_mac_post_ctrl_msg(mac_handle, (tSirMbMsg *)msg);
Jeff Johnsonc09caa42018-06-07 22:58:55 -07001120 if (QDF_IS_STATUS_ERROR(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07001121 sme_err("u_mac_post_ctrl_msg failed to send eWNI_SME_SYS_READY_IND");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001122 break;
1123 }
1124
Jeff Johnson01f2c232018-11-21 19:17:44 -08001125 status = csr_ready(mac);
Jeff Johnsonc09caa42018-06-07 22:58:55 -07001126 if (QDF_IS_STATUS_ERROR(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07001127 sme_err("csr_ready failed with status: %d", status);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001128 break;
1129 }
1130
Jeff Johnson01f2c232018-11-21 19:17:44 -08001131 mac->sme.state = SME_STATE_READY;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001132 } while (0);
1133
1134 return status;
1135}
1136
Tushnim Bhattacharyyac3c375e2017-08-04 23:39:55 -07001137QDF_STATUS sme_get_valid_channels(uint8_t *chan_list, uint32_t *list_len)
1138{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08001139 struct mac_context *mac_ctx = sme_get_mac_context();
Tushnim Bhattacharyyac3c375e2017-08-04 23:39:55 -07001140
Jeff Johnson038efe72019-03-18 13:39:31 -07001141 if (!mac_ctx) {
Tushnim Bhattacharyyac3c375e2017-08-04 23:39:55 -07001142 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
1143 FL("Invalid MAC context"));
1144 return QDF_STATUS_E_FAILURE;
1145 }
1146
Wu Gaof3cbeaf2019-01-15 18:26:25 +08001147 *list_len = (uint32_t)mac_ctx->mlme_cfg->reg.valid_channel_list_num;
1148 qdf_mem_copy(chan_list, mac_ctx->mlme_cfg->reg.valid_channel_list,
1149 *list_len);
1150
1151 return QDF_STATUS_SUCCESS;
Tushnim Bhattacharyyac3c375e2017-08-04 23:39:55 -07001152}
1153
Sandeep Puligilla8e89d572018-04-02 18:07:45 -07001154#ifdef WLAN_CONV_SPECTRAL_ENABLE
Jeff Johnson0a8786a2018-12-02 10:49:01 -08001155static QDF_STATUS sme_register_spectral_cb(struct mac_context *mac_ctx)
Sandeep Puligilla8e89d572018-04-02 18:07:45 -07001156{
1157 struct spectral_legacy_cbacks spectral_cb;
1158 QDF_STATUS status;
1159
1160 spectral_cb.vdev_get_chan_freq = sme_get_oper_chan_freq;
1161 spectral_cb.vdev_get_ch_width = sme_get_oper_ch_width;
1162 spectral_cb.vdev_get_sec20chan_freq_mhz = sme_get_sec20chan_freq_mhz;
1163 status = spectral_register_legacy_cb(mac_ctx->psoc, &spectral_cb);
1164
1165 return status;
1166}
1167#else
Jeff Johnson0a8786a2018-12-02 10:49:01 -08001168static QDF_STATUS sme_register_spectral_cb(struct mac_context *mac_ctx)
Sandeep Puligilla8e89d572018-04-02 18:07:45 -07001169{
1170 return QDF_STATUS_SUCCESS;
1171}
1172#endif
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05301173/*
1174 * sme_start() - Put all SME modules at ready state.
1175 * The function starts each module in SME, PMC, CSR, etc. . Upon
1176 * successfully return, all modules are ready to run.
1177 * This is a synchronous call
1178 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08001179 * mac_handle - The handle returned by mac_open.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05301180 * Return QDF_STATUS_SUCCESS - SME is ready.
1181 * Other status means SME is failed to start
1182 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08001183QDF_STATUS sme_start(mac_handle_t mac_handle)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001184{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301185 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08001186 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Tushnim Bhattacharyya91049632017-03-17 17:31:27 -07001187 struct policy_mgr_sme_cbacks sme_cbacks;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001188
1189 do {
Jeff Johnson01f2c232018-11-21 19:17:44 -08001190 status = csr_start(mac);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301191 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07001192 sme_err("csr_start failed status: %d", status);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001193 break;
1194 }
Tushnim Bhattacharyya91049632017-03-17 17:31:27 -07001195 sme_cbacks.sme_get_nss_for_vdev = sme_get_vdev_type_nss;
Tushnim Bhattacharyyac3c375e2017-08-04 23:39:55 -07001196 sme_cbacks.sme_get_valid_channels = sme_get_valid_channels;
Tushnim Bhattacharyya91049632017-03-17 17:31:27 -07001197 sme_cbacks.sme_nss_update_request = sme_nss_update_request;
1198 sme_cbacks.sme_pdev_set_hw_mode = sme_pdev_set_hw_mode;
1199 sme_cbacks.sme_pdev_set_pcl = sme_pdev_set_pcl;
1200 sme_cbacks.sme_soc_set_dual_mac_config =
1201 sme_soc_set_dual_mac_config;
Archana Ramachandran2eb7a612017-03-23 22:58:42 -07001202 sme_cbacks.sme_change_mcc_beacon_interval =
1203 sme_change_mcc_beacon_interval;
1204 sme_cbacks.sme_get_ap_channel_from_scan =
1205 sme_get_ap_channel_from_scan;
1206 sme_cbacks.sme_scan_result_purge = sme_scan_result_purge;
Jeff Johnson01f2c232018-11-21 19:17:44 -08001207 status = policy_mgr_register_sme_cb(mac->psoc, &sme_cbacks);
Tushnim Bhattacharyya91049632017-03-17 17:31:27 -07001208 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda2c263352017-03-17 17:49:53 -07001209 sme_err("Failed to register sme cb with Policy Manager: %d",
Tushnim Bhattacharyya91049632017-03-17 17:31:27 -07001210 status);
1211 break;
1212 }
Jeff Johnson01f2c232018-11-21 19:17:44 -08001213 sme_register_spectral_cb(mac);
1214 mac->sme.state = SME_STATE_START;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001215
Sandeep Puligilla66d09c42017-09-06 17:10:27 -07001216 /* START RRM */
Jeff Johnson01f2c232018-11-21 19:17:44 -08001217 status = rrm_start(mac);
Sandeep Puligilla66d09c42017-09-06 17:10:27 -07001218 if (!QDF_IS_STATUS_SUCCESS(status)) {
1219 sme_err("Failed to start RRM");
1220 break;
1221 }
1222 } while (0);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001223 return status;
1224}
1225
Jeff Johnson0a8786a2018-12-02 10:49:01 -08001226static QDF_STATUS dfs_msg_processor(struct mac_context *mac,
Arif Hussaincd151632017-02-11 16:57:19 -08001227 struct scheduler_msg *msg)
1228{
1229 QDF_STATUS status = QDF_STATUS_SUCCESS;
Min Liu3621ede2018-11-07 18:36:00 +08001230 struct csr_roam_info *roam_info;
Arif Hussaincd151632017-02-11 16:57:19 -08001231 tSirSmeCSAIeTxCompleteRsp *csa_ie_tx_complete_rsp;
1232 uint32_t session_id = 0;
1233 eRoamCmdStatus roam_status;
1234 eCsrRoamResult roam_result;
1235
Min Liu3621ede2018-11-07 18:36:00 +08001236 roam_info = qdf_mem_malloc(sizeof(*roam_info));
1237 if (!roam_info)
1238 return QDF_STATUS_E_NOMEM;
1239
Arif Hussaincd151632017-02-11 16:57:19 -08001240 switch (msg->type) {
1241 case eWNI_SME_DFS_RADAR_FOUND:
1242 {
1243 session_id = msg->bodyval;
1244 roam_status = eCSR_ROAM_DFS_RADAR_IND;
1245 roam_result = eCSR_ROAM_RESULT_DFS_RADAR_FOUND_IND;
Abhishek Singhe4a1f882017-08-10 17:59:44 +05301246 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Arif Hussaincd151632017-02-11 16:57:19 -08001247 "sapdfs: Radar indication event occurred");
1248 break;
1249 }
1250 case eWNI_SME_DFS_CSAIE_TX_COMPLETE_IND:
1251 {
1252 csa_ie_tx_complete_rsp =
1253 (tSirSmeCSAIeTxCompleteRsp *) msg->bodyptr;
1254 if (!csa_ie_tx_complete_rsp) {
1255 sme_err("eWNI_SME_DFS_CSAIE_TX_COMPLETE_IND null msg");
Min Liu3621ede2018-11-07 18:36:00 +08001256 qdf_mem_free(roam_info);
Arif Hussaincd151632017-02-11 16:57:19 -08001257 return QDF_STATUS_E_FAILURE;
1258 }
1259 session_id = csa_ie_tx_complete_rsp->sessionId;
1260 roam_status = eCSR_ROAM_DFS_CHAN_SW_NOTIFY;
1261 roam_result = eCSR_ROAM_RESULT_DFS_CHANSW_UPDATE_SUCCESS;
Abhishek Singhe4a1f882017-08-10 17:59:44 +05301262 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Arif Hussaincd151632017-02-11 16:57:19 -08001263 "eWNI_SME_DFS_CSAIE_TX_COMPLETE_IND session=%d",
1264 session_id);
1265 break;
1266 }
1267 case eWNI_SME_DFS_CAC_COMPLETE:
1268 {
1269 session_id = msg->bodyval;
1270 roam_status = eCSR_ROAM_CAC_COMPLETE_IND;
1271 roam_result = eCSR_ROAM_RESULT_CAC_END_IND;
Abhishek Singhe4a1f882017-08-10 17:59:44 +05301272 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Arif Hussaincd151632017-02-11 16:57:19 -08001273 "sapdfs: Received eWNI_SME_DFS_CAC_COMPLETE vdevid%d",
1274 session_id);
1275 break;
1276 }
Abhishek Singh20a8e442018-09-12 15:50:44 +05301277 case eWNI_SME_CSA_RESTART_RSP:
1278 {
1279 session_id = msg->bodyval;
1280 roam_status = 0;
1281 roam_result = eCSR_ROAM_RESULT_CSA_RESTART_RSP;
1282 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
1283 "sapdfs: Received eCSR_ROAM_RESULT_DFS_CHANSW_UPDATE_REQ vdevid%d",
1284 session_id);
1285 break;
1286 }
Arif Hussaincd151632017-02-11 16:57:19 -08001287 default:
1288 {
1289 sme_err("Invalid DFS message: 0x%x", msg->type);
Min Liu3621ede2018-11-07 18:36:00 +08001290 qdf_mem_free(roam_info);
Arif Hussaincd151632017-02-11 16:57:19 -08001291 status = QDF_STATUS_E_FAILURE;
1292 return status;
1293 }
1294 }
1295
1296 /* Indicate Radar Event to SAP */
Min Liu3621ede2018-11-07 18:36:00 +08001297 csr_roam_call_callback(mac, session_id, roam_info, 0,
Arif Hussaincd151632017-02-11 16:57:19 -08001298 roam_status, roam_result);
Min Liu3621ede2018-11-07 18:36:00 +08001299 qdf_mem_free(roam_info);
Arif Hussaincd151632017-02-11 16:57:19 -08001300 return status;
1301}
1302
1303
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001304#ifdef WLAN_FEATURE_11W
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05301305/*
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001306 * Handle the unprotected management frame indication from LIM and
1307 * forward it to HDD.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05301308 */
Jeff Johnson2ef47442018-06-09 23:43:40 -07001309static QDF_STATUS
Jeff Johnson0a8786a2018-12-02 10:49:01 -08001310sme_unprotected_mgmt_frm_ind(struct mac_context *mac,
Jeff Johnson2ef47442018-06-09 23:43:40 -07001311 tpSirSmeUnprotMgmtFrameInd pSmeMgmtFrm)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001312{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301313 QDF_STATUS status = QDF_STATUS_SUCCESS;
Min Liu3621ede2018-11-07 18:36:00 +08001314 struct csr_roam_info *roam_info;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001315 uint32_t SessionId = pSmeMgmtFrm->sessionId;
1316
Min Liu3621ede2018-11-07 18:36:00 +08001317 roam_info = qdf_mem_malloc(sizeof(*roam_info));
1318 if (!roam_info)
1319 return QDF_STATUS_E_NOMEM;
1320
1321 roam_info->nFrameLength = pSmeMgmtFrm->frameLen;
1322 roam_info->pbFrames = pSmeMgmtFrm->frameBuf;
1323 roam_info->frameType = pSmeMgmtFrm->frameType;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001324
1325 /* forward the mgmt frame to HDD */
Min Liu3621ede2018-11-07 18:36:00 +08001326 csr_roam_call_callback(mac, SessionId, roam_info, 0,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001327 eCSR_ROAM_UNPROT_MGMT_FRAME_IND, 0);
1328
Min Liu3621ede2018-11-07 18:36:00 +08001329 qdf_mem_free(roam_info);
1330
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001331 return status;
1332}
1333#endif
1334
Jeff Johnsonc7309062018-11-09 20:59:42 -08001335QDF_STATUS sme_update_new_channel_event(mac_handle_t mac_handle,
1336 uint8_t session_id)
Kapil Gupta8878ad92017-02-13 11:56:04 +05301337{
1338 QDF_STATUS status = QDF_STATUS_SUCCESS;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08001339 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Jeff Johnson172237b2017-11-07 15:32:59 -08001340 struct csr_roam_info *roamInfo;
Kapil Gupta8878ad92017-02-13 11:56:04 +05301341 eRoamCmdStatus roamStatus;
1342 eCsrRoamResult roamResult;
1343
1344 roamInfo = qdf_mem_malloc(sizeof(*roamInfo));
Arif Hussain0ef77082018-10-10 16:42:53 -07001345 if (!roamInfo)
Krunal Soni3fa80e22018-01-09 14:16:02 -08001346 return QDF_STATUS_E_FAILURE;
Kapil Gupta8878ad92017-02-13 11:56:04 +05301347
Arif Hussain0ef77082018-10-10 16:42:53 -07001348 roamInfo->dfs_event.sessionId = session_id;
Kapil Gupta8878ad92017-02-13 11:56:04 +05301349 roamStatus = eCSR_ROAM_CHANNEL_COMPLETE_IND;
1350 roamResult = eCSR_ROAM_RESULT_DFS_RADAR_FOUND_IND;
Abhishek Singhe4a1f882017-08-10 17:59:44 +05301351 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Kapil Gupta8878ad92017-02-13 11:56:04 +05301352 "sapdfs: Updated new channel event");
1353
1354 /* Indicate channel Event to SAP */
1355 csr_roam_call_callback(mac, session_id, roamInfo, 0,
1356 roamStatus, roamResult);
1357
1358 qdf_mem_free(roamInfo);
1359 return status;
1360}
1361
1362
Abhishek Singh518323d2015-10-19 17:42:01 +05301363/**
1364 * sme_extended_change_channel_ind()- function to indicate ECSA
1365 * action frame is received in lim to SAP
1366 * @mac_ctx: pointer to global mac structure
1367 * @msg_buf: contain new channel and session id.
1368 *
1369 * This function is called to post ECSA action frame
1370 * receive event to SAP.
1371 *
1372 * Return: success if msg indicated to SAP else return failure
1373 */
Jeff Johnson0a8786a2018-12-02 10:49:01 -08001374static QDF_STATUS sme_extended_change_channel_ind(struct mac_context *mac_ctx,
Abhishek Singh518323d2015-10-19 17:42:01 +05301375 void *msg_buf)
1376{
1377 struct sir_sme_ext_cng_chan_ind *ext_chan_ind;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301378 QDF_STATUS status = QDF_STATUS_SUCCESS;
Abhishek Singh518323d2015-10-19 17:42:01 +05301379 uint32_t session_id = 0;
Min Liu3621ede2018-11-07 18:36:00 +08001380 struct csr_roam_info *roam_info;
Abhishek Singh518323d2015-10-19 17:42:01 +05301381 eRoamCmdStatus roam_status;
1382 eCsrRoamResult roam_result;
1383
Abhishek Singh518323d2015-10-19 17:42:01 +05301384 ext_chan_ind = msg_buf;
Jeff Johnson038efe72019-03-18 13:39:31 -07001385 if (!ext_chan_ind) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07001386 sme_err("ext_chan_ind is NULL");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301387 return QDF_STATUS_E_FAILURE;
Abhishek Singh518323d2015-10-19 17:42:01 +05301388 }
Min Liu3621ede2018-11-07 18:36:00 +08001389 roam_info = qdf_mem_malloc(sizeof(*roam_info));
1390 if (!roam_info)
1391 return QDF_STATUS_E_NOMEM;
Abhishek Singh518323d2015-10-19 17:42:01 +05301392 session_id = ext_chan_ind->session_id;
Min Liu3621ede2018-11-07 18:36:00 +08001393 roam_info->target_channel = ext_chan_ind->new_channel;
Abhishek Singh518323d2015-10-19 17:42:01 +05301394 roam_status = eCSR_ROAM_EXT_CHG_CHNL_IND;
1395 roam_result = eCSR_ROAM_EXT_CHG_CHNL_UPDATE_IND;
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07001396 sme_debug("sapdfs: Received eWNI_SME_EXT_CHANGE_CHANNEL_IND for session id [%d]",
1397 session_id);
Abhishek Singh518323d2015-10-19 17:42:01 +05301398
1399 /* Indicate Ext Channel Change event to SAP */
Min Liu3621ede2018-11-07 18:36:00 +08001400 csr_roam_call_callback(mac_ctx, session_id, roam_info, 0,
1401 roam_status, roam_result);
1402 qdf_mem_free(roam_info);
Abhishek Singh518323d2015-10-19 17:42:01 +05301403 return status;
1404}
1405
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001406#ifdef FEATURE_WLAN_ESE
1407/**
1408 * sme_update_is_ese_feature_enabled() - enable/disable ESE support at runtime
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -08001409 * @mac_handle: Opaque handle to the global MAC context
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001410 * @sessionId: session id
1411 * @isEseIniFeatureEnabled: ese ini enabled
1412 *
1413 * It is used at in the REG_DYNAMIC_VARIABLE macro definition of
1414 * isEseIniFeatureEnabled. This is a synchronous call
1415 *
1416 * Return: QDF_STATUS enumeration
1417 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08001418QDF_STATUS sme_update_is_ese_feature_enabled(mac_handle_t mac_handle,
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001419 uint8_t sessionId, const bool isEseIniFeatureEnabled)
1420{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08001421 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Vignesh Viswanathan4e65e8e2018-05-01 12:04:16 +05301422 QDF_STATUS status;
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001423
Wu Gao51a63562018-11-08 16:29:10 +08001424 if (mac->mlme_cfg->lfr.ese_enabled ==
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001425 isEseIniFeatureEnabled) {
Abhishek Singhe4a1f882017-08-10 17:59:44 +05301426 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001427 "%s: ESE Mode is already enabled or disabled, nothing to do (returning) old(%d) new(%d)",
1428 __func__,
Wu Gao51a63562018-11-08 16:29:10 +08001429 mac->mlme_cfg->lfr.ese_enabled,
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001430 isEseIniFeatureEnabled);
1431 return QDF_STATUS_SUCCESS;
1432 }
1433
Abhishek Singhe4a1f882017-08-10 17:59:44 +05301434 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001435 "%s: EseEnabled is changed from %d to %d", __func__,
Wu Gao51a63562018-11-08 16:29:10 +08001436 mac->mlme_cfg->lfr.ese_enabled,
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001437 isEseIniFeatureEnabled);
Wu Gao51a63562018-11-08 16:29:10 +08001438 mac->mlme_cfg->lfr.ese_enabled = isEseIniFeatureEnabled;
Varun Reddy Yeturuff4feb02016-04-20 12:26:11 -07001439 csr_neighbor_roam_update_fast_roaming_enabled(
Jeff Johnson01f2c232018-11-21 19:17:44 -08001440 mac, sessionId, isEseIniFeatureEnabled);
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001441
1442 if (true == isEseIniFeatureEnabled)
Wu Gao51a63562018-11-08 16:29:10 +08001443 mac->mlme_cfg->lfr.fast_transition_enabled = true;
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001444
Wu Gao51a63562018-11-08 16:29:10 +08001445 if (mac->mlme_cfg->lfr.roam_scan_offload_enabled) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08001446 status = sme_acquire_global_lock(&mac->sme);
Vignesh Viswanathan4e65e8e2018-05-01 12:04:16 +05301447 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08001448 csr_roam_offload_scan(mac, sessionId,
Vignesh Viswanathan4e65e8e2018-05-01 12:04:16 +05301449 ROAM_SCAN_OFFLOAD_UPDATE_CFG,
1450 REASON_ESE_INI_CFG_CHANGED);
Jeff Johnson01f2c232018-11-21 19:17:44 -08001451 sme_release_global_lock(&mac->sme);
Vignesh Viswanathan4e65e8e2018-05-01 12:04:16 +05301452 } else {
Vignesh Viswanathan4e65e8e2018-05-01 12:04:16 +05301453 return status;
1454 }
1455 }
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001456 return QDF_STATUS_SUCCESS;
1457}
1458
Jeff Johnson36583f02019-02-26 08:02:11 -08001459QDF_STATUS sme_set_plm_request(mac_handle_t mac_handle,
1460 struct plm_req_params *req)
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001461{
1462 QDF_STATUS status;
1463 bool ret = false;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08001464 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Wu Gao0821b0d2019-01-11 17:31:11 +08001465 uint8_t ch_list[CFG_VALID_CHANNEL_LIST_LEN] = { 0 };
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001466 uint8_t count, valid_count = 0;
Rajeev Kumar37d478b2017-04-17 16:59:28 -07001467 struct scheduler_msg msg = {0};
Jeff Johnson36583f02019-02-26 08:02:11 -08001468 struct csr_roam_session *session;
1469 struct plm_req_params *body;
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001470
Jeff Johnson01f2c232018-11-21 19:17:44 -08001471 status = sme_acquire_global_lock(&mac->sme);
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001472 if (!QDF_IS_STATUS_SUCCESS(status))
1473 return status;
1474
Jeff Johnson36583f02019-02-26 08:02:11 -08001475 session = CSR_GET_SESSION(mac, req->vdev_id);
1476 if (!session) {
1477 sme_err("session %d not found", req->vdev_id);
Jeff Johnson01f2c232018-11-21 19:17:44 -08001478 sme_release_global_lock(&mac->sme);
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001479 return QDF_STATUS_E_FAILURE;
1480 }
1481
Jeff Johnson36583f02019-02-26 08:02:11 -08001482 if (!session->sessionActive) {
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001483 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
1484 FL("Invalid Sessionid"));
Jeff Johnson01f2c232018-11-21 19:17:44 -08001485 sme_release_global_lock(&mac->sme);
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001486 return QDF_STATUS_E_FAILURE;
1487 }
1488
Jeff Johnson36583f02019-02-26 08:02:11 -08001489 /* per contract must make a copy of the params when messaging */
1490 body = qdf_mem_malloc(sizeof(*body));
1491 if (!req)
1492 return QDF_STATUS_E_NOMEM;
1493 *body = *req;
1494
1495 if (!body->enable)
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001496 goto send_plm_start;
1497 /* validating channel numbers */
Jeff Johnson36583f02019-02-26 08:02:11 -08001498 for (count = 0; count < body->plm_num_ch; count++) {
1499 uint8_t ch = body->plm_ch_list[count];
1500
1501 ret = csr_is_supported_channel(mac, ch);
1502 if (!ret) {
1503 /* Not supported, ignore the channel */
1504 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
1505 FL("Unsupported channel %d ignored for PLM"),
1506 ch);
1507 continue;
1508 }
1509
1510 if (ch > 14) {
1511 enum channel_state state =
1512 wlan_reg_get_channel_state(mac->pdev, ch);
1513
1514 if (state == CHANNEL_STATE_DFS) {
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001515 /* DFS channel is provided, no PLM bursts can be
1516 * transmitted. Ignoring these channels.
1517 */
1518 QDF_TRACE(QDF_MODULE_ID_SME,
Abhishek Singhe4a1f882017-08-10 17:59:44 +05301519 QDF_TRACE_LEVEL_DEBUG,
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001520 FL("DFS channel %d ignored for PLM"),
Jeff Johnson36583f02019-02-26 08:02:11 -08001521 ch);
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001522 continue;
1523 }
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001524 }
Jeff Johnson36583f02019-02-26 08:02:11 -08001525 ch_list[valid_count++] = ch;
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001526 } /* End of for () */
1527
1528 /* Copying back the valid channel list to plm struct */
Jeff Johnson36583f02019-02-26 08:02:11 -08001529 qdf_mem_zero(body->plm_ch_list, body->plm_num_ch);
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001530 if (valid_count)
Jeff Johnson36583f02019-02-26 08:02:11 -08001531 qdf_mem_copy(body->plm_ch_list, ch_list, valid_count);
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001532 /* All are invalid channels, FW need to send the PLM
1533 * report with "incapable" bit set.
1534 */
Jeff Johnson36583f02019-02-26 08:02:11 -08001535 body->plm_num_ch = valid_count;
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001536
1537send_plm_start:
1538 /* PLM START */
1539 msg.type = WMA_SET_PLM_REQ;
1540 msg.reserved = 0;
Jeff Johnson36583f02019-02-26 08:02:11 -08001541 msg.bodyptr = body;
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001542
gaurank kathpalia36b0c582018-08-28 17:45:43 +05301543 if (!QDF_IS_STATUS_SUCCESS(scheduler_post_message(QDF_MODULE_ID_SME,
1544 QDF_MODULE_ID_WMA,
1545 QDF_MODULE_ID_WMA,
1546 &msg))) {
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001547 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
1548 FL("Not able to post WMA_SET_PLM_REQ to WMA"));
Jeff Johnson01f2c232018-11-21 19:17:44 -08001549 sme_release_global_lock(&mac->sme);
Jeff Johnson36583f02019-02-26 08:02:11 -08001550 qdf_mem_free(body);
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001551 return QDF_STATUS_E_FAILURE;
1552 }
1553
Jeff Johnson01f2c232018-11-21 19:17:44 -08001554 sme_release_global_lock(&mac->sme);
Jeff Johnson36583f02019-02-26 08:02:11 -08001555 return QDF_STATUS_SUCCESS;
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001556}
1557
1558/**
1559 * sme_tsm_ie_ind() - sme tsm ie indication
Jeff Johnson24e65b52018-06-10 08:45:26 -07001560 * @mac: Global mac context
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001561 * @pSmeTsmIeInd: Pointer to tsm ie indication
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001562 *
1563 * Handle the tsm ie indication from LIM and forward it to HDD.
1564 *
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001565 * Return: QDF_STATUS enumeration
1566 */
Jeff Johnson0a8786a2018-12-02 10:49:01 -08001567static QDF_STATUS sme_tsm_ie_ind(struct mac_context *mac,
Jeff Johnsone21b0eb2019-02-02 19:31:54 -08001568 struct tsm_ie_ind *pSmeTsmIeInd)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001569{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301570 QDF_STATUS status = QDF_STATUS_SUCCESS;
Min Liu3621ede2018-11-07 18:36:00 +08001571 struct csr_roam_info *roam_info;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001572 uint32_t SessionId = pSmeTsmIeInd->sessionId;
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05301573
Min Liu3621ede2018-11-07 18:36:00 +08001574 roam_info = qdf_mem_malloc(sizeof(*roam_info));
1575 if (!roam_info)
1576 return QDF_STATUS_E_NOMEM;
1577
1578 roam_info->tsm_ie.tsid = pSmeTsmIeInd->tsm_ie.tsid;
1579 roam_info->tsm_ie.state = pSmeTsmIeInd->tsm_ie.state;
1580 roam_info->tsm_ie.msmt_interval = pSmeTsmIeInd->tsm_ie.msmt_interval;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001581 /* forward the tsm ie information to HDD */
Min Liu3621ede2018-11-07 18:36:00 +08001582 csr_roam_call_callback(mac, SessionId, roam_info, 0,
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05301583 eCSR_ROAM_TSM_IE_IND, 0);
Min Liu3621ede2018-11-07 18:36:00 +08001584 qdf_mem_free(roam_info);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001585 return status;
1586}
1587
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001588/**
1589 * sme_set_cckm_ie() - set cckm ie
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -08001590 * @mac_handle: Opaque handle to the global MAC context
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001591 * @sessionId: session id
1592 * @pCckmIe: Pointer to CCKM Ie
1593 * @cckmIeLen: Length of @pCckmIe
1594 *
1595 * Function to store the CCKM IE passed from supplicant and use
1596 * it while packing reassociation request.
1597 *
1598 * Return: QDF_STATUS enumeration
1599 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08001600QDF_STATUS sme_set_cckm_ie(mac_handle_t mac_handle, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001601 uint8_t *pCckmIe, uint8_t cckmIeLen)
1602{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08001603 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301604 QDF_STATUS status = QDF_STATUS_SUCCESS;
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05301605
Jeff Johnson01f2c232018-11-21 19:17:44 -08001606 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301607 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08001608 csr_set_cckm_ie(mac, sessionId, pCckmIe, cckmIeLen);
1609 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001610 }
1611 return status;
1612}
1613
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001614/**
1615 * sme_set_ese_beacon_request() - set ese beacon request
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -08001616 * @mac_handle: Opaque handle to the global MAC context
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001617 * @sessionId: session id
Jeff Johnsonb2c3d042019-02-26 12:23:26 -08001618 * @in_req: Ese beacon report request
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001619 *
1620 * function to set ESE beacon request parameters
1621 *
1622 * Return: QDF_STATUS enumeration
1623 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08001624QDF_STATUS sme_set_ese_beacon_request(mac_handle_t mac_handle,
Jeff Johnson1f2dabc2018-11-07 15:33:01 -08001625 const uint8_t sessionId,
Jeff Johnsonb2c3d042019-02-26 12:23:26 -08001626 const tCsrEseBeaconReq *in_req)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001627{
Varun Reddy Yeturu7b2a6572017-06-15 11:07:28 -07001628 QDF_STATUS status;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08001629 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001630 tpSirBeaconReportReqInd pSmeBcnReportReq = NULL;
Jeff Johnsonb2c3d042019-02-26 12:23:26 -08001631 const tCsrEseBeaconReqParams *pBeaconReq = NULL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001632 uint8_t counter = 0;
Jeff Johnson01f2c232018-11-21 19:17:44 -08001633 struct csr_roam_session *pSession = CSR_GET_SESSION(mac, sessionId);
1634 tpRrmSMEContext pSmeRrmContext = &mac->rrm.rrmSmeContext;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001635
1636 if (pSmeRrmContext->eseBcnReqInProgress == true) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07001637 sme_err("A Beacon Report Req is already in progress");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301638 return QDF_STATUS_E_RESOURCES;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001639 }
1640
1641 /* Store the info in RRM context */
Jeff Johnsonb2c3d042019-02-26 12:23:26 -08001642 qdf_mem_copy(&pSmeRrmContext->eseBcnReqInfo, in_req,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001643 sizeof(tCsrEseBeaconReq));
1644
1645 /* Prepare the request to send to SME. */
Anurag Chouhan600c3a02016-03-01 10:33:54 +05301646 pSmeBcnReportReq = qdf_mem_malloc(sizeof(tSirBeaconReportReqInd));
Arif Hussain0ef77082018-10-10 16:42:53 -07001647 if (!pSmeBcnReportReq)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301648 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001649
1650 pSmeRrmContext->eseBcnReqInProgress = true;
1651
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07001652 sme_debug("Sending Beacon Report Req to SME");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001653
1654 pSmeBcnReportReq->messageType = eWNI_SME_BEACON_REPORT_REQ_IND;
1655 pSmeBcnReportReq->length = sizeof(tSirBeaconReportReqInd);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05301656 qdf_mem_copy(pSmeBcnReportReq->bssId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001657 pSession->connectedProfile.bssid.bytes,
1658 sizeof(tSirMacAddr));
1659 pSmeBcnReportReq->channelInfo.channelNum = 255;
Jeff Johnsonb2c3d042019-02-26 12:23:26 -08001660 pSmeBcnReportReq->channelList.numChannels = in_req->numBcnReqIe;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001661 pSmeBcnReportReq->msgSource = eRRM_MSG_SOURCE_ESE_UPLOAD;
1662
Jeff Johnsonb2c3d042019-02-26 12:23:26 -08001663 for (counter = 0; counter < in_req->numBcnReqIe; counter++) {
1664 pBeaconReq = &in_req->bcnReq[counter];
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001665 pSmeBcnReportReq->fMeasurementtype[counter] =
1666 pBeaconReq->scanMode;
1667 pSmeBcnReportReq->measurementDuration[counter] =
1668 SYS_TU_TO_MS(pBeaconReq->measurementDuration);
1669 pSmeBcnReportReq->channelList.channelNumber[counter] =
1670 pBeaconReq->channel;
1671 }
1672
Jeff Johnson01f2c232018-11-21 19:17:44 -08001673 status = sme_rrm_process_beacon_report_req_ind(mac, pSmeBcnReportReq);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001674
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301675 if (status != QDF_STATUS_SUCCESS)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001676 pSmeRrmContext->eseBcnReqInProgress = false;
1677
Hanumanth Reddy Pothula7f7a2712016-09-07 18:44:47 +05301678 qdf_mem_free(pSmeBcnReportReq);
1679
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001680 return status;
1681}
1682
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001683/**
1684 * sme_get_tsm_stats() - SME get tsm stats
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -08001685 * @mac_handle: Opaque handle to the global MAC context
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001686 * @callback: SME sends back the requested stats using the callback
1687 * @staId: The station ID for which the stats is requested for
1688 * @bssId: bssid
1689 * @pContext: user context to be passed back along with the callback
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001690 * @tid: Traffic id
1691 *
1692 * API register a callback to get TSM Stats.
1693 *
1694 * Return: QDF_STATUS enumeration
1695 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08001696QDF_STATUS sme_get_tsm_stats(mac_handle_t mac_handle,
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001697 tCsrTsmStatsCallback callback,
1698 uint8_t staId, struct qdf_mac_addr bssId,
Jeff Johnson30f84552017-09-13 14:55:25 -07001699 void *pContext, uint8_t tid)
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001700{
1701 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08001702 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001703
Jeff Johnson01f2c232018-11-21 19:17:44 -08001704 status = sme_acquire_global_lock(&mac->sme);
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001705 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08001706 status = csr_get_tsm_stats(mac, callback,
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001707 staId, bssId, pContext,
Jeff Johnson30f84552017-09-13 14:55:25 -07001708 tid);
Jeff Johnson01f2c232018-11-21 19:17:44 -08001709 sme_release_global_lock(&mac->sme);
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001710 }
1711 return status;
1712}
1713
1714/**
1715 * sme_set_ese_roam_scan_channel_list() - To set ese roam scan channel list
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -08001716 * @mac_handle: Opaque handle to the global MAC context
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001717 * @sessionId: sme session id
1718 * @pChannelList: Output channel list
1719 * @numChannels: Output number of channels
1720 *
1721 * This routine is called to set ese roam scan channel list.
1722 * This is a synchronous call
1723 *
1724 * Return: QDF_STATUS
1725 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08001726QDF_STATUS sme_set_ese_roam_scan_channel_list(mac_handle_t mac_handle,
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001727 uint8_t sessionId,
1728 uint8_t *pChannelList,
1729 uint8_t numChannels)
1730{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08001731 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001732 QDF_STATUS status = QDF_STATUS_SUCCESS;
Naveen Rawatc36f7eb2016-11-10 20:01:03 -08001733 tpCsrNeighborRoamControlInfo pNeighborRoamInfo = NULL;
1734 tpCsrChannelInfo curchnl_list_info = NULL;
Wu Gao0821b0d2019-01-11 17:31:11 +08001735 uint8_t oldChannelList[CFG_VALID_CHANNEL_LIST_LEN * 2] = { 0 };
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001736 uint8_t newChannelList[128] = { 0 };
1737 uint8_t i = 0, j = 0;
Harprit Chhabada5dff30e2019-03-12 17:56:45 -07001738 enum band_info band = -1;
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001739
Dustin Brownad06be62019-02-04 14:52:56 -08001740 if (sessionId >= WLAN_MAX_VDEVS) {
Naveen Rawatc36f7eb2016-11-10 20:01:03 -08001741 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
1742 FL("Invalid sme session id: %d"), sessionId);
1743 return QDF_STATUS_E_INVAL;
1744 }
1745
Jeff Johnson01f2c232018-11-21 19:17:44 -08001746 pNeighborRoamInfo = &mac->roam.neighborRoamInfo[sessionId];
Naveen Rawatc36f7eb2016-11-10 20:01:03 -08001747 curchnl_list_info =
1748 &pNeighborRoamInfo->roamChannelInfo.currentChannelListInfo;
1749
Jeff Johnson01f2c232018-11-21 19:17:44 -08001750 status = sme_acquire_global_lock(&mac->sme);
Madhvapathi Sriram3e6627a2018-12-19 12:54:49 +05301751 if (!QDF_IS_STATUS_SUCCESS(status))
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001752 return status;
Madhvapathi Sriram3e6627a2018-12-19 12:54:49 +05301753
Jeff Johnson038efe72019-03-18 13:39:31 -07001754 if (curchnl_list_info->ChannelList) {
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001755 for (i = 0; i < curchnl_list_info->numOfChannels; i++) {
1756 j += snprintf(oldChannelList + j,
1757 sizeof(oldChannelList) - j, "%d",
1758 curchnl_list_info->ChannelList[i]);
1759 }
1760 }
Harprit Chhabada5dff30e2019-03-12 17:56:45 -07001761 ucfg_reg_get_band(mac->pdev, &band);
Jeff Johnson01f2c232018-11-21 19:17:44 -08001762 status = csr_create_roam_scan_channel_list(mac, sessionId,
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001763 pChannelList, numChannels,
Harprit Chhabada5dff30e2019-03-12 17:56:45 -07001764 band);
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001765 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson038efe72019-03-18 13:39:31 -07001766 if (curchnl_list_info->ChannelList) {
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001767 j = 0;
1768 for (i = 0; i < curchnl_list_info->numOfChannels; i++) {
1769 j += snprintf(newChannelList + j,
1770 sizeof(newChannelList) - j, "%d",
1771 curchnl_list_info->ChannelList[i]);
1772 }
1773 }
1774 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
1775 "ESE roam scan chnl list successfully set to %s-old value is %s-roam state is %d",
1776 newChannelList, oldChannelList,
1777 pNeighborRoamInfo->neighborRoamState);
1778 }
Vignesh Viswanathan4e65e8e2018-05-01 12:04:16 +05301779
Wu Gao51a63562018-11-08 16:29:10 +08001780 if (mac->mlme_cfg->lfr.roam_scan_offload_enabled)
Jeff Johnson01f2c232018-11-21 19:17:44 -08001781 csr_roam_offload_scan(mac, sessionId,
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001782 ROAM_SCAN_OFFLOAD_UPDATE_CFG,
1783 REASON_CHANNEL_LIST_CHANGED);
Vignesh Viswanathan4e65e8e2018-05-01 12:04:16 +05301784
Jeff Johnson01f2c232018-11-21 19:17:44 -08001785 sme_release_global_lock(&mac->sme);
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08001786 return status;
1787}
1788
1789#endif /* FEATURE_WLAN_ESE */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001790
Jeff Johnson49c02f92016-10-07 10:29:09 -07001791static
Jeff Johnson0a8786a2018-12-02 10:49:01 -08001792QDF_STATUS sme_ibss_peer_info_response_handler(struct mac_context *mac,
Jeff Johnson49c02f92016-10-07 10:29:09 -07001793 tpSirIbssGetPeerInfoRspParams
1794 pIbssPeerInfoParams)
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08001795{
Jeff Johnson56ba88a2019-02-17 17:18:43 -08001796 struct ibss_peer_info_cb_info *cb_info;
1797
1798 if (!mac) {
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08001799 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_FATAL,
Jeff Johnson01f2c232018-11-21 19:17:44 -08001800 "%s: mac is null", __func__);
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08001801 return QDF_STATUS_E_FAILURE;
1802 }
Jeff Johnsone7aa5cd2019-02-17 19:36:01 -08001803 cb_info = &mac->sme.peer_info_cb_info;
Jeff Johnson56ba88a2019-02-17 17:18:43 -08001804 if (!cb_info->peer_info_cb) {
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08001805 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
1806 "%s: HDD callback is null", __func__);
1807 return QDF_STATUS_E_FAILURE;
1808 }
Jeff Johnson56ba88a2019-02-17 17:18:43 -08001809 cb_info->peer_info_cb(cb_info->peer_info_cb_context,
1810 &pIbssPeerInfoParams->ibssPeerInfoRspParams);
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08001811 return QDF_STATUS_SUCCESS;
1812}
1813
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001814/**
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001815 * sme_process_dual_mac_config_resp() - Process set Dual mac config response
1816 * @mac: Global MAC pointer
1817 * @msg: Dual mac config response
1818 *
1819 * Processes the dual mac configuration response and invokes the HDD callback
1820 * to process further
1821 */
Jeff Johnson0a8786a2018-12-02 10:49:01 -08001822static QDF_STATUS sme_process_dual_mac_config_resp(struct mac_context *mac,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001823 uint8_t *msg)
1824{
1825 tListElem *entry = NULL;
1826 tSmeCmd *command = NULL;
1827 bool found;
1828 dual_mac_cb callback = NULL;
1829 struct sir_dual_mac_config_resp *param;
1830
1831 param = (struct sir_dual_mac_config_resp *)msg;
1832 if (!param) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07001833 sme_err("Dual mac config resp param is NULL");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001834 /* Not returning. Need to check if active command list
1835 * needs to be freed
1836 */
1837 }
1838
Krunal Sonia8270f52017-02-23 19:51:25 -08001839 entry = csr_nonscan_active_ll_peek_head(mac, LL_ACCESS_LOCK);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001840 if (!entry) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07001841 sme_err("No cmd found in active list");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301842 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001843 }
1844
1845 command = GET_BASE_ADDR(entry, tSmeCmd, Link);
1846 if (!command) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07001847 sme_err("Base address is NULL");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301848 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001849 }
1850
1851 if (e_sme_command_set_dual_mac_config != command->command) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07001852 sme_err("Command mismatch!");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301853 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001854 }
1855
1856 callback = command->u.set_dual_mac_cmd.set_dual_mac_cb;
1857 if (callback) {
1858 if (!param) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07001859 sme_err("Callback failed-Dual mac config is NULL");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001860 } else {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07001861 sme_debug("Calling HDD callback for Dual mac config");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001862 callback(param->status,
1863 command->u.set_dual_mac_cmd.scan_config,
1864 command->u.set_dual_mac_cmd.fw_mode_config);
1865 }
1866 } else {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07001867 sme_err("Callback does not exist");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001868 }
1869
Krunal Soni72dba662017-02-15 20:13:17 -08001870 found = csr_nonscan_active_ll_remove_entry(mac, entry, LL_ACCESS_LOCK);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001871 if (found)
1872 /* Now put this command back on the available command list */
Krunal Soni78618d92017-02-14 21:46:31 -08001873 csr_release_command(mac, command);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001874
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301875 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001876}
1877
Archana Ramachandrana20ef812015-11-13 16:12:13 -08001878/**
1879 * sme_process_antenna_mode_resp() - Process set antenna mode
1880 * response
1881 * @mac: Global MAC pointer
1882 * @msg: antenna mode response
1883 *
1884 * Processes the antenna mode response and invokes the HDD
1885 * callback to process further
1886 */
Jeff Johnson0a8786a2018-12-02 10:49:01 -08001887static QDF_STATUS sme_process_antenna_mode_resp(struct mac_context *mac,
Archana Ramachandrana20ef812015-11-13 16:12:13 -08001888 uint8_t *msg)
1889{
1890 tListElem *entry;
1891 tSmeCmd *command;
1892 bool found;
Dundi Raviteja6bb9e322018-05-16 17:04:41 +05301893 void *context = NULL;
Archana Ramachandrana20ef812015-11-13 16:12:13 -08001894 antenna_mode_cb callback;
1895 struct sir_antenna_mode_resp *param;
1896
1897 param = (struct sir_antenna_mode_resp *)msg;
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05301898 if (!param)
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07001899 sme_err("set antenna mode resp is NULL");
Archana Ramachandrana20ef812015-11-13 16:12:13 -08001900 /* Not returning. Need to check if active command list
1901 * needs to be freed
1902 */
Archana Ramachandrana20ef812015-11-13 16:12:13 -08001903
Krunal Sonia8270f52017-02-23 19:51:25 -08001904 entry = csr_nonscan_active_ll_peek_head(mac, LL_ACCESS_LOCK);
Archana Ramachandrana20ef812015-11-13 16:12:13 -08001905 if (!entry) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07001906 sme_err("No cmd found in active list");
Archana Ramachandrana20ef812015-11-13 16:12:13 -08001907 return QDF_STATUS_E_FAILURE;
1908 }
1909
1910 command = GET_BASE_ADDR(entry, tSmeCmd, Link);
1911 if (!command) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07001912 sme_err("Base address is NULL");
Archana Ramachandrana20ef812015-11-13 16:12:13 -08001913 return QDF_STATUS_E_FAILURE;
1914 }
1915
1916 if (e_sme_command_set_antenna_mode != command->command) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07001917 sme_err("Command mismatch!");
Archana Ramachandrana20ef812015-11-13 16:12:13 -08001918 return QDF_STATUS_E_FAILURE;
1919 }
1920
Dundi Raviteja6bb9e322018-05-16 17:04:41 +05301921 context = command->u.set_antenna_mode_cmd.set_antenna_mode_ctx;
1922 callback = command->u.set_antenna_mode_cmd.set_antenna_mode_resp;
Archana Ramachandrana20ef812015-11-13 16:12:13 -08001923 if (callback) {
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05301924 if (!param)
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07001925 sme_err("Set antenna mode call back is NULL");
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05301926 else
Dundi Raviteja6bb9e322018-05-16 17:04:41 +05301927 callback(param->status, context);
Archana Ramachandrana20ef812015-11-13 16:12:13 -08001928 } else {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07001929 sme_err("Callback does not exist");
Archana Ramachandrana20ef812015-11-13 16:12:13 -08001930 }
1931
Krunal Soni72dba662017-02-15 20:13:17 -08001932 found = csr_nonscan_active_ll_remove_entry(mac, entry, LL_ACCESS_LOCK);
Archana Ramachandrana20ef812015-11-13 16:12:13 -08001933 if (found)
1934 /* Now put this command back on the available command list */
Krunal Soni78618d92017-02-14 21:46:31 -08001935 csr_release_command(mac, command);
Archana Ramachandrana20ef812015-11-13 16:12:13 -08001936
Archana Ramachandrana20ef812015-11-13 16:12:13 -08001937 return QDF_STATUS_SUCCESS;
1938}
1939
Jeff Johnson0a8786a2018-12-02 10:49:01 -08001940QDF_STATUS sme_process_msg(struct mac_context *mac, struct scheduler_msg *pMsg)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001941{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301942 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Ashish Kumar Dhanotiya443d31f2017-10-13 12:41:19 +05301943 struct sir_peer_info *peer_stats;
1944 struct sir_peer_info_resp *peer_info_rsp;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001945
Jeff Johnson038efe72019-03-18 13:39:31 -07001946 if (!pMsg) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07001947 sme_err("Empty message for SME");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001948 return status;
1949 }
Jeff Johnson01f2c232018-11-21 19:17:44 -08001950 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301951 if (!QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001952 if (pMsg->bodyptr)
Anurag Chouhan600c3a02016-03-01 10:33:54 +05301953 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001954 return status;
1955 }
Jeff Johnson01f2c232018-11-21 19:17:44 -08001956 if (!SME_IS_START(mac)) {
Rajeev Kumar3887f9b2018-01-10 11:24:01 -08001957 sme_debug("message type %d in stop state ignored", pMsg->type);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001958 if (pMsg->bodyptr)
Anurag Chouhan600c3a02016-03-01 10:33:54 +05301959 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001960 goto release_lock;
1961 }
1962 switch (pMsg->type) {
1963#ifdef WLAN_FEATURE_ROAM_OFFLOAD
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001964 case eWNI_SME_HO_FAIL_IND:
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301965 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001966 FL("LFR3: Rcvd eWNI_SME_HO_FAIL_IND"));
Jeff Johnson01f2c232018-11-21 19:17:44 -08001967 csr_process_ho_fail_ind(mac, pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05301968 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001969 break;
1970#endif
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001971 case eWNI_SME_ADDTS_RSP:
1972 case eWNI_SME_DELTS_RSP:
1973 case eWNI_SME_DELTS_IND:
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001974 case eWNI_SME_FT_AGGR_QOS_RSP:
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001975 /* QoS */
1976 if (pMsg->bodyptr) {
1977#ifndef WLAN_MDM_CODE_REDUCTION_OPT
Jeff Johnson01f2c232018-11-21 19:17:44 -08001978 status = sme_qos_msg_processor(mac, pMsg->type,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001979 pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05301980 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001981#endif
1982 } else {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07001983 sme_err("Empty message for: %d", pMsg->type);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001984 }
1985 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001986 case eWNI_SME_NEIGHBOR_REPORT_IND:
1987 case eWNI_SME_BEACON_REPORT_REQ_IND:
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001988 if (pMsg->bodyptr) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08001989 status = sme_rrm_msg_processor(mac, pMsg->type,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001990 pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05301991 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001992 } else {
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05301993 sme_err("Empty message for: %d", pMsg->type);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001994 }
1995 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001996 case eWNI_SME_ADD_STA_SELF_RSP:
1997 if (pMsg->bodyptr) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08001998 status = csr_process_add_sta_session_rsp(mac,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001999 pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302000 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002001 } else {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002002 sme_err("Empty message for: %d", pMsg->type);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002003 }
2004 break;
2005 case eWNI_SME_DEL_STA_SELF_RSP:
2006 if (pMsg->bodyptr) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08002007 status = csr_process_del_sta_session_rsp(mac,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002008 pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302009 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002010 } else {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002011 sme_err("Empty message for: %d", pMsg->type);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002012 }
2013 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002014 case eWNI_SME_GENERIC_CHANGE_COUNTRY_CODE:
2015 if (pMsg->bodyptr) {
2016 status = sme_handle_generic_change_country_code(
Jeff Johnson01f2c232018-11-21 19:17:44 -08002017 (void *)mac, pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302018 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002019 } else {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002020 sme_err("Empty message for: %d", pMsg->type);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002021 }
2022 break;
Sandeep Puligilla8d6011b2017-11-08 00:06:18 -08002023
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002024#ifdef WLAN_FEATURE_11W
2025 case eWNI_SME_UNPROT_MGMT_FRM_IND:
2026 if (pMsg->bodyptr) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08002027 sme_unprotected_mgmt_frm_ind(mac, pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302028 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002029 } else {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002030 sme_err("Empty message for: %d", pMsg->type);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002031 }
2032 break;
2033#endif
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08002034#ifdef FEATURE_WLAN_ESE
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002035 case eWNI_SME_TSM_IE_IND:
2036 if (pMsg->bodyptr) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08002037 sme_tsm_ie_ind(mac, pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302038 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002039 } else {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002040 sme_err("Empty message for: %d", pMsg->type);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002041 }
2042 break;
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08002043#endif /* FEATURE_WLAN_ESE */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002044 case eWNI_SME_ROAM_SCAN_OFFLOAD_RSP:
Jeff Johnson01f2c232018-11-21 19:17:44 -08002045 status = csr_roam_offload_scan_rsp_hdlr((void *)mac,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002046 pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302047 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002048 break;
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08002049 case eWNI_SME_IBSS_PEER_INFO_RSP:
2050 if (pMsg->bodyptr) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08002051 sme_ibss_peer_info_response_handler(mac,
Jeff Johnson49c02f92016-10-07 10:29:09 -07002052 pMsg->bodyptr);
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08002053 qdf_mem_free(pMsg->bodyptr);
2054 } else {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002055 sme_err("Empty message for: %d", pMsg->type);
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08002056 }
2057 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002058#ifdef WLAN_FEATURE_EXTWOW_SUPPORT
2059 case eWNI_SME_READY_TO_EXTWOW_IND:
2060 if (pMsg->bodyptr) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08002061 sme_process_ready_to_ext_wow(mac, pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302062 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002063 } else {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002064 sme_err("Empty message for: %d", pMsg->type);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002065 }
2066 break;
2067#endif
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002068#ifdef FEATURE_WLAN_AUTO_SHUTDOWN
2069 case eWNI_SME_AUTO_SHUTDOWN_IND:
Jeff Johnsoneb7bbed2019-02-17 10:34:24 -08002070 if (mac->sme.auto_shutdown_cb) {
Abhishek Singhe4a1f882017-08-10 17:59:44 +05302071 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002072 FL("Auto shutdown notification"));
Jeff Johnsoneb7bbed2019-02-17 10:34:24 -08002073 mac->sme.auto_shutdown_cb();
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002074 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002075 break;
2076#endif
2077 case eWNI_SME_DFS_RADAR_FOUND:
Arif Hussaincd151632017-02-11 16:57:19 -08002078 case eWNI_SME_DFS_CAC_COMPLETE:
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002079 case eWNI_SME_DFS_CSAIE_TX_COMPLETE_IND:
Abhishek Singh20a8e442018-09-12 15:50:44 +05302080 case eWNI_SME_CSA_RESTART_RSP:
Jeff Johnson01f2c232018-11-21 19:17:44 -08002081 status = dfs_msg_processor(mac, pMsg);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302082 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002083 break;
2084 case eWNI_SME_CHANNEL_CHANGE_RSP:
2085 if (pMsg->bodyptr) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08002086 status = sme_process_channel_change_resp(mac,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002087 pMsg->type,
2088 pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302089 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002090 } else {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002091 sme_err("Empty message for: %d", pMsg->type);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002092 }
2093 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002094 case eWNI_SME_STATS_EXT_EVENT:
Jeff Johnson01f2c232018-11-21 19:17:44 -08002095 status = sme_stats_ext_event(mac, pMsg->bodyptr);
Jeff Johnsonfdecd512018-06-10 09:18:32 -07002096 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002097 break;
Will Huang558f8082017-05-31 16:22:24 +08002098 case eWNI_SME_GET_PEER_INFO_IND:
Jeff Johnson01f2c232018-11-21 19:17:44 -08002099 if (mac->sme.pget_peer_info_ind_cb)
2100 mac->sme.pget_peer_info_ind_cb(pMsg->bodyptr,
2101 mac->sme.pget_peer_info_cb_context);
Ashish Kumar Dhanotiya443d31f2017-10-13 12:41:19 +05302102 if (pMsg->bodyptr) {
2103 peer_info_rsp = (struct sir_peer_info_resp *)
2104 (pMsg->bodyptr);
2105 peer_stats = (struct sir_peer_info *)
2106 (peer_info_rsp->info);
2107 if (peer_stats) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08002108 mac->peer_rssi = peer_stats[0].rssi;
2109 mac->peer_txrate = peer_stats[0].tx_rate;
2110 mac->peer_rxrate = peer_stats[0].rx_rate;
Ashish Kumar Dhanotiya443d31f2017-10-13 12:41:19 +05302111 }
2112 }
Will Huang558f8082017-05-31 16:22:24 +08002113 qdf_mem_free(pMsg->bodyptr);
2114 break;
2115 case eWNI_SME_GET_PEER_INFO_EXT_IND:
Jeff Johnson01f2c232018-11-21 19:17:44 -08002116 if (mac->sme.pget_peer_info_ext_ind_cb)
2117 mac->sme.pget_peer_info_ext_ind_cb(pMsg->bodyptr,
2118 mac->sme.pget_peer_info_ext_cb_context);
Will Huang558f8082017-05-31 16:22:24 +08002119 qdf_mem_free(pMsg->bodyptr);
2120 break;
Qun Zhangef655622019-02-25 10:48:10 +08002121 case eWNI_SME_FW_STATUS_IND:
2122 status = sme_fw_state_resp(mac);
2123 break;
Manikandan Mohandcc21ba2016-03-15 14:31:56 -07002124 case eWNI_SME_TSF_EVENT:
Jeff Johnson01f2c232018-11-21 19:17:44 -08002125 if (mac->sme.get_tsf_cb) {
2126 mac->sme.get_tsf_cb(mac->sme.get_tsf_cxt,
Manikandan Mohandcc21ba2016-03-15 14:31:56 -07002127 (struct stsf *)pMsg->bodyptr);
2128 }
2129 if (pMsg->bodyptr)
2130 qdf_mem_free(pMsg->bodyptr);
2131 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002132 case eWNI_SME_LINK_STATUS_IND:
2133 {
2134 tAniGetLinkStatus *pLinkStatus =
2135 (tAniGetLinkStatus *) pMsg->bodyptr;
2136 if (pLinkStatus) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08002137 if (mac->sme.link_status_callback)
2138 mac->sme.link_status_callback(
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002139 pLinkStatus->linkStatus,
Jeff Johnson01f2c232018-11-21 19:17:44 -08002140 mac->sme.link_status_context);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302141
Jeff Johnson01f2c232018-11-21 19:17:44 -08002142 mac->sme.link_status_callback = NULL;
2143 mac->sme.link_status_context = NULL;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302144 qdf_mem_free(pLinkStatus);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002145 }
2146 break;
2147 }
2148 case eWNI_SME_MSG_GET_TEMPERATURE_IND:
Jeff Johnson3f3ad252019-02-17 20:44:11 -08002149 if (mac->sme.temperature_cb)
2150 mac->sme.temperature_cb(pMsg->bodyval,
2151 mac->sme.temperature_cb_context);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002152 break;
2153 case eWNI_SME_SNR_IND:
2154 {
2155 tAniGetSnrReq *pSnrReq = (tAniGetSnrReq *) pMsg->bodyptr;
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302156
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002157 if (pSnrReq) {
2158 if (pSnrReq->snrCallback) {
2159 ((tCsrSnrCallback)
2160 (pSnrReq->snrCallback))
2161 (pSnrReq->snr, pSnrReq->staId,
2162 pSnrReq->pDevContext);
2163 }
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302164 qdf_mem_free(pSnrReq);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002165 }
2166 break;
2167 }
2168#ifdef FEATURE_WLAN_EXTSCAN
2169 case eWNI_SME_EXTSCAN_FULL_SCAN_RESULT_IND:
Jeff Johnson01f2c232018-11-21 19:17:44 -08002170 if (mac->sme.ext_scan_ind_cb)
2171 mac->sme.ext_scan_ind_cb(mac->hdd_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002172 eSIR_EXTSCAN_FULL_SCAN_RESULT_IND,
2173 pMsg->bodyptr);
2174 else
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002175 sme_err("callback not registered to process: %d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002176 pMsg->type);
2177
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302178 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002179 break;
2180 case eWNI_SME_EPNO_NETWORK_FOUND_IND:
Jeff Johnson01f2c232018-11-21 19:17:44 -08002181 if (mac->sme.ext_scan_ind_cb)
2182 mac->sme.ext_scan_ind_cb(mac->hdd_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002183 eSIR_EPNO_NETWORK_FOUND_IND,
2184 pMsg->bodyptr);
2185 else
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002186 sme_err("callback not registered to process: %d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002187 pMsg->type);
2188
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302189 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002190 break;
2191#endif
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002192 case eWNI_SME_SET_HW_MODE_RESP:
2193 if (pMsg->bodyptr) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08002194 status = sme_process_set_hw_mode_resp(mac,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002195 pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302196 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002197 } else {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002198 sme_err("Empty message for: %d", pMsg->type);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002199 }
2200 break;
2201 case eWNI_SME_HW_MODE_TRANS_IND:
2202 if (pMsg->bodyptr) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08002203 status = sme_process_hw_mode_trans_ind(mac,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002204 pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302205 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002206 } else {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002207 sme_err("Empty message for: %d", pMsg->type);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002208 }
2209 break;
2210 case eWNI_SME_NSS_UPDATE_RSP:
2211 if (pMsg->bodyptr) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08002212 status = sme_process_nss_update_resp(mac,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002213 pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302214 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002215 } else {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002216 sme_err("Empty message for: %d", pMsg->type);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002217 }
2218 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002219 case eWNI_SME_SET_DUAL_MAC_CFG_RESP:
2220 if (pMsg->bodyptr) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08002221 status = sme_process_dual_mac_config_resp(mac,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002222 pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302223 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002224 } else {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002225 sme_err("Empty message for: %d", pMsg->type);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002226 }
gaurank kathpaliaebe3fc82018-05-07 09:39:46 +05302227 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002228 case eWNI_SME_SET_THERMAL_LEVEL_IND:
Jeff Johnson01f2c232018-11-21 19:17:44 -08002229 if (mac->sme.set_thermal_level_cb)
2230 mac->sme.set_thermal_level_cb(mac->hdd_handle,
Jeff Johnson6aaaa992018-06-30 10:43:04 -07002231 pMsg->bodyval);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002232 break;
Abhishek Singh518323d2015-10-19 17:42:01 +05302233 case eWNI_SME_EXT_CHANGE_CHANNEL_IND:
Jeff Johnson01f2c232018-11-21 19:17:44 -08002234 status = sme_extended_change_channel_ind(mac, pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302235 qdf_mem_free(pMsg->bodyptr);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302236 break;
Archana Ramachandrana20ef812015-11-13 16:12:13 -08002237 case eWNI_SME_SET_ANTENNA_MODE_RESP:
2238 if (pMsg->bodyptr) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08002239 status = sme_process_antenna_mode_resp(mac,
Archana Ramachandrana20ef812015-11-13 16:12:13 -08002240 pMsg->bodyptr);
2241 qdf_mem_free(pMsg->bodyptr);
2242 } else {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002243 sme_err("Empty message for: %d", pMsg->type);
Archana Ramachandrana20ef812015-11-13 16:12:13 -08002244 }
2245 break;
Sreelakshmi Konamki58c72432016-11-09 17:06:44 +05302246 case eWNI_SME_LOST_LINK_INFO_IND:
Jeff Johnson01f2c232018-11-21 19:17:44 -08002247 if (mac->sme.lost_link_info_cb)
2248 mac->sme.lost_link_info_cb(mac->hdd_handle,
Sreelakshmi Konamki58c72432016-11-09 17:06:44 +05302249 (struct sir_lost_link_info *)pMsg->bodyptr);
2250 qdf_mem_free(pMsg->bodyptr);
2251 break;
Sreelakshmi Konamki88a2a412017-04-14 15:11:55 +05302252 case eWNI_SME_RSO_CMD_STATUS_IND:
Jeff Johnson01f2c232018-11-21 19:17:44 -08002253 if (mac->sme.rso_cmd_status_cb)
2254 mac->sme.rso_cmd_status_cb(mac->hdd_handle,
Jeff Johnson6aaaa992018-06-30 10:43:04 -07002255 pMsg->bodyptr);
lifeng66831662017-05-19 16:01:35 +08002256 qdf_mem_free(pMsg->bodyptr);
2257 break;
Zhang Qiana6e9c102016-12-22 16:47:24 +08002258 case eWMI_SME_LL_STATS_IND:
Jeff Johnson01f2c232018-11-21 19:17:44 -08002259 if (mac->sme.link_layer_stats_ext_cb)
2260 mac->sme.link_layer_stats_ext_cb(mac->hdd_handle,
Zhang Qiana6e9c102016-12-22 16:47:24 +08002261 pMsg->bodyptr);
Sreelakshmi Konamki88a2a412017-04-14 15:11:55 +05302262 qdf_mem_free(pMsg->bodyptr);
2263 break;
Vidyullatha Kanchanapallybe0ebb32017-03-23 14:36:21 +05302264 case eWNI_SME_BT_ACTIVITY_INFO_IND:
Jeff Johnson01f2c232018-11-21 19:17:44 -08002265 if (mac->sme.bt_activity_info_cb)
2266 mac->sme.bt_activity_info_cb(mac->hdd_handle,
Vidyullatha Kanchanapallybe0ebb32017-03-23 14:36:21 +05302267 pMsg->bodyval);
2268 break;
Abhinav Kumar338e57d2019-02-04 17:30:10 +05302269 case eWNI_SME_HIDDEN_SSID_RESTART_RSP:
2270 if (mac->sme.hidden_ssid_cb)
2271 mac->sme.hidden_ssid_cb(mac->hdd_handle, pMsg->bodyval);
2272 else
2273 sme_err("callback is NULL");
2274 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002275 default:
2276
2277 if ((pMsg->type >= eWNI_SME_MSG_TYPES_BEGIN)
2278 && (pMsg->type <= eWNI_SME_MSG_TYPES_END)) {
2279 /* CSR */
2280 if (pMsg->bodyptr) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08002281 status = csr_msg_processor(mac, pMsg->bodyptr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302282 qdf_mem_free(pMsg->bodyptr);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302283 } else
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002284 sme_err("Empty message for: %d", pMsg->type);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002285 } else {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002286 sme_warn("Unknown message type: %d", pMsg->type);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002287 if (pMsg->bodyptr)
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302288 qdf_mem_free(pMsg->bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002289 }
2290 } /* switch */
2291release_lock:
Jeff Johnson01f2c232018-11-21 19:17:44 -08002292 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002293 return status;
2294}
2295
Krunal Sonid32c6bc2016-10-18 18:00:21 -07002296QDF_STATUS sme_mc_process_handler(struct scheduler_msg *msg)
2297{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08002298 struct mac_context *mac_ctx = cds_get_context(QDF_MODULE_ID_SME);
Krunal Sonid32c6bc2016-10-18 18:00:21 -07002299
Jeff Johnson038efe72019-03-18 13:39:31 -07002300 if (!mac_ctx) {
Krunal Sonid32c6bc2016-10-18 18:00:21 -07002301 QDF_ASSERT(0);
2302 return QDF_STATUS_E_FAILURE;
2303 }
2304
Jeff Johnson5f9ce2d2018-06-09 21:20:45 -07002305 return sme_process_msg(mac_ctx, msg);
Krunal Sonid32c6bc2016-10-18 18:00:21 -07002306}
Krunal Sonid32c6bc2016-10-18 18:00:21 -07002307
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002308/**
2309 * sme_process_nss_update_resp() - Process nss update response
2310 * @mac: Global MAC pointer
2311 * @msg: nss update response
2312 *
2313 * Processes the nss update response and invokes the HDD
2314 * callback to process further
2315 */
Jeff Johnson0a8786a2018-12-02 10:49:01 -08002316static QDF_STATUS sme_process_nss_update_resp(struct mac_context *mac, uint8_t *msg)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002317{
2318 tListElem *entry = NULL;
2319 tSmeCmd *command = NULL;
2320 bool found;
Tushnim Bhattacharyyaeab33dd2017-11-15 15:20:02 -08002321 policy_mgr_nss_update_cback callback = NULL;
Abhishek Singhfc740be2018-10-12 11:34:26 +05302322 struct sir_bcn_update_rsp *param;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002323
Abhishek Singhfc740be2018-10-12 11:34:26 +05302324 param = (struct sir_bcn_update_rsp *)msg;
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302325 if (!param)
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002326 sme_err("nss update resp param is NULL");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002327 /* Not returning. Need to check if active command list
2328 * needs to be freed
2329 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002330
Abhishek Singhfc740be2018-10-12 11:34:26 +05302331 if (param && param->reason != REASON_NSS_UPDATE) {
2332 sme_err("reason not NSS update");
2333 return QDF_STATUS_E_INVAL;
2334 }
Krunal Sonia8270f52017-02-23 19:51:25 -08002335 entry = csr_nonscan_active_ll_peek_head(mac, LL_ACCESS_LOCK);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002336 if (!entry) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002337 sme_err("No cmd found in active list");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302338 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002339 }
2340
2341 command = GET_BASE_ADDR(entry, tSmeCmd, Link);
2342 if (!command) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002343 sme_err("Base address is NULL");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302344 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002345 }
2346
2347 if (e_sme_command_nss_update != command->command) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002348 sme_err("Command mismatch!");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302349 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002350 }
2351
2352 callback = command->u.nss_update_cmd.nss_update_cb;
2353 if (callback) {
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302354 if (!param)
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002355 sme_err("Callback failed since nss update params is NULL");
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302356 else
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002357 callback(command->u.nss_update_cmd.context,
Abhishek Singhfc740be2018-10-12 11:34:26 +05302358 param->status,
2359 param->vdev_id,
Chandrasekaran, Manishekarce2172e2016-02-18 16:12:43 +05302360 command->u.nss_update_cmd.next_action,
Liangwei Dong1ba99482018-10-19 02:57:29 -04002361 command->u.nss_update_cmd.reason,
2362 command->u.nss_update_cmd.original_vdev_id);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002363 } else {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002364 sme_err("Callback does not exisit");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002365 }
2366
Krunal Soni72dba662017-02-15 20:13:17 -08002367 found = csr_nonscan_active_ll_remove_entry(mac, entry, LL_ACCESS_LOCK);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002368 if (found) {
2369 /* Now put this command back on the avilable command list */
Krunal Soni78618d92017-02-14 21:46:31 -08002370 csr_release_command(mac, command);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002371 }
Krunal Sonia8270f52017-02-23 19:51:25 -08002372
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302373 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002374}
2375
Jeff Johnson62cd6802018-07-20 12:38:25 -07002376QDF_STATUS sme_stop(mac_handle_t mac_handle)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002377{
Jeff Johnson62cd6802018-07-20 12:38:25 -07002378 QDF_STATUS status;
2379 QDF_STATUS ret_status = QDF_STATUS_SUCCESS;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08002380 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002381
Jeff Johnson62cd6802018-07-20 12:38:25 -07002382 status = rrm_stop(mac);
2383 if (QDF_IS_STATUS_ERROR(status)) {
2384 ret_status = status;
Sandeep Puligilla66d09c42017-09-06 17:10:27 -07002385 sme_err("rrm_stop failed with status: %d", status);
2386 }
2387
Jeff Johnson62cd6802018-07-20 12:38:25 -07002388 status = csr_stop(mac);
2389 if (QDF_IS_STATUS_ERROR(status)) {
2390 ret_status = status;
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002391 sme_err("csr_stop failed with status: %d", status);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002392 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002393
Jeff Johnson62cd6802018-07-20 12:38:25 -07002394 mac->sme.state = SME_STATE_STOP;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002395
Jeff Johnson62cd6802018-07-20 12:38:25 -07002396 return ret_status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002397}
2398
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302399/*
2400 * sme_close() - Release all SME modules and their resources.
2401 * The function release each module in SME, PMC, CSR, etc. . Upon
2402 * return, all modules are at closed state.
2403 *
2404 * No SME APIs can be involved after smeClose except smeOpen.
2405 * smeClose must be called before mac_close.
2406 * This is a synchronous call
2407 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08002408 * mac_handle - The handle returned by mac_open
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302409 * Return QDF_STATUS_SUCCESS - SME is successfully close.
2410 *
2411 * Other status means SME is failed to be closed but caller still cannot
2412 * call any other SME functions except smeOpen.
2413 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08002414QDF_STATUS sme_close(mac_handle_t mac_handle)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002415{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302416 QDF_STATUS status = QDF_STATUS_E_FAILURE;
2417 QDF_STATUS fail_status = QDF_STATUS_SUCCESS;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08002418 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002419
Jeff Johnson01f2c232018-11-21 19:17:44 -08002420 if (!mac)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302421 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002422
Jeff Johnson01f2c232018-11-21 19:17:44 -08002423 status = csr_close(mac);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302424 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002425 sme_err("csr_close failed with status: %d", status);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002426 fail_status = status;
2427 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002428#ifndef WLAN_MDM_CODE_REDUCTION_OPT
Jeff Johnson01f2c232018-11-21 19:17:44 -08002429 status = sme_qos_close(mac);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302430 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002431 sme_err("Qos close failed with status: %d", status);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002432 fail_status = status;
2433 }
2434#endif
Jeff Johnsonb460dd72018-11-08 10:26:51 -08002435 status = sme_ps_close(mac_handle);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302436 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002437 sme_err("sme_ps_close failed status: %d", status);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002438 fail_status = status;
2439 }
2440
Jeff Johnson01f2c232018-11-21 19:17:44 -08002441 status = rrm_close(mac);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302442 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002443 sme_err("RRM close failed with status: %d", status);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002444 fail_status = status;
2445 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002446
Jeff Johnson01f2c232018-11-21 19:17:44 -08002447 free_sme_cmd_list(mac);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002448
Jeff Johnson3e7a4932019-02-17 12:11:36 -08002449 status = qdf_mutex_destroy(&mac->sme.sme_global_lock);
2450 if (!QDF_IS_STATUS_SUCCESS(status))
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302451 fail_status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002452
Jeff Johnson01f2c232018-11-21 19:17:44 -08002453 mac->sme.state = SME_STATE_STOP;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002454
Jeff Johnson3e7a4932019-02-17 12:11:36 -08002455 return fail_status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002456}
2457
2458/**
Abhishek Singhc9941602016-08-09 16:06:22 +05302459 * sme_remove_bssid_from_scan_list() - wrapper to remove the bssid from
2460 * scan list
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -08002461 * @mac_handle: Opaque handle to the global MAC context.
Abhishek Singhc9941602016-08-09 16:06:22 +05302462 * @bssid: bssid to be removed
2463 *
2464 * This function remove the given bssid from scan list.
2465 *
2466 * Return: QDF status.
2467 */
Jeff Johnsonc7309062018-11-09 20:59:42 -08002468QDF_STATUS sme_remove_bssid_from_scan_list(mac_handle_t mac_handle,
2469 tSirMacAddr bssid)
Abhishek Singhc9941602016-08-09 16:06:22 +05302470{
2471 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08002472 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Abhishek Singhc9941602016-08-09 16:06:22 +05302473
2474 status = sme_acquire_global_lock(&mac_ctx->sme);
2475 if (QDF_IS_STATUS_SUCCESS(status)) {
2476 csr_remove_bssid_from_scan_list(mac_ctx, bssid);
2477 sme_release_global_lock(&mac_ctx->sme);
2478 }
2479
2480 return status;
2481}
2482
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002483
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302484/*
2485 * sme_scan_get_result
2486 * A wrapper function to request scan results from CSR.
2487 * This is a synchronous call
2488 *
2489 * pFilter - If pFilter is NULL, all cached results are returned
2490 * phResult - an object for the result.
2491 * Return QDF_STATUS
2492 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08002493QDF_STATUS sme_scan_get_result(mac_handle_t mac_handle, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002494 tCsrScanResultFilter *pFilter,
2495 tScanResultHandle *phResult)
2496{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302497 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08002498 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002499
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302500 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002501 TRACE_CODE_SME_RX_HDD_MSG_SCAN_GET_RESULTS, sessionId,
2502 0));
Jeff Johnson01f2c232018-11-21 19:17:44 -08002503 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302504 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08002505 status = csr_scan_get_result(mac, pFilter, phResult);
2506 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002507 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002508
2509 return status;
2510}
2511
Jeff Johnsonb460dd72018-11-08 10:26:51 -08002512QDF_STATUS sme_scan_get_result_for_bssid(mac_handle_t mac_handle,
Vignesh Viswanathan9dd88d32017-11-22 14:22:03 +05302513 struct qdf_mac_addr *bssid,
2514 tCsrScanResultInfo *res)
2515{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08002516 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Vignesh Viswanathan9dd88d32017-11-22 14:22:03 +05302517 QDF_STATUS status;
2518
2519 status = sme_acquire_global_lock(&mac_ctx->sme);
2520 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson1b56f6b2018-06-10 18:17:10 -07002521 status = csr_scan_get_result_for_bssid(mac_ctx, bssid, res);
Vignesh Viswanathan9dd88d32017-11-22 14:22:03 +05302522 sme_release_global_lock(&mac_ctx->sme);
2523 }
2524
2525 return status;
2526}
2527
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002528/**
Archana Ramachandran2eb7a612017-03-23 22:58:42 -07002529 * sme_get_ap_channel_from_scan() - a wrapper function to get
Srinivas Girigowda828ef232017-10-13 22:31:27 -07002530 * AP's channel id from
2531 * CSR by filtering the
2532 * result which matches
2533 * our roam profile.
Archana Ramachandran2eb7a612017-03-23 22:58:42 -07002534 * @profile: SAP profile
2535 * @ap_chnl_id: pointer to channel id of SAP. Fill the value after finding the
2536 * best ap from scan cache.
2537 *
2538 * This function is written to get AP's channel id from CSR by filtering
2539 * the result which matches our roam profile. This is a synchronous call.
2540 *
2541 * Return: QDF_STATUS.
2542 */
2543QDF_STATUS sme_get_ap_channel_from_scan(void *profile,
2544 tScanResultHandle *scan_cache,
2545 uint8_t *ap_chnl_id)
2546{
Jeff Johnson66ee8a92018-03-17 15:24:26 -07002547 return sme_get_ap_channel_from_scan_cache((struct csr_roam_profile *)
Archana Ramachandran2eb7a612017-03-23 22:58:42 -07002548 profile,
2549 scan_cache,
2550 ap_chnl_id);
2551}
2552
2553/**
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002554 * sme_get_ap_channel_from_scan_cache() - a wrapper function to get AP's
2555 * channel id from CSR by filtering the
2556 * result which matches our roam profile.
2557 * @profile: SAP adapter
2558 * @ap_chnl_id: pointer to channel id of SAP. Fill the value after finding the
2559 * best ap from scan cache.
2560 *
2561 * This function is written to get AP's channel id from CSR by filtering
2562 * the result which matches our roam profile. This is a synchronous call.
2563 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302564 * Return: QDF_STATUS.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002565 */
Archana Ramachandran2eb7a612017-03-23 22:58:42 -07002566QDF_STATUS sme_get_ap_channel_from_scan_cache(
Jeff Johnson66ee8a92018-03-17 15:24:26 -07002567 struct csr_roam_profile *profile, tScanResultHandle *scan_cache,
Archana Ramachandran2eb7a612017-03-23 22:58:42 -07002568 uint8_t *ap_chnl_id)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002569{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302570 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08002571 struct mac_context *mac_ctx = sme_get_mac_context();
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002572 tCsrScanResultFilter *scan_filter = NULL;
2573 tScanResultHandle filtered_scan_result = NULL;
2574 tSirBssDescription first_ap_profile;
2575
Jeff Johnson038efe72019-03-18 13:39:31 -07002576 if (!mac_ctx) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302577 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002578 FL("mac_ctx is NULL"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302579 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002580 }
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302581 scan_filter = qdf_mem_malloc(sizeof(tCsrScanResultFilter));
Arif Hussain0ef77082018-10-10 16:42:53 -07002582 if (!scan_filter)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302583 return QDF_STATUS_E_FAILURE;
Arif Hussain0ef77082018-10-10 16:42:53 -07002584
hangtian127c9532019-01-12 13:29:07 +08002585 qdf_mem_zero(&first_ap_profile, sizeof(tSirBssDescription));
Jeff Johnson038efe72019-03-18 13:39:31 -07002586 if (!profile) {
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302587 scan_filter->EncryptionType.numEntries = 1;
2588 scan_filter->EncryptionType.encryptionType[0]
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002589 = eCSR_ENCRYPT_TYPE_NONE;
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302590 } else {
2591 /* Here is the profile we need to connect to */
2592 status = csr_roam_prepare_filter_from_profile(mac_ctx,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002593 profile,
2594 scan_filter);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302595 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002596
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302597 if (QDF_STATUS_SUCCESS == status) {
2598 /* Save the WPS info */
Jeff Johnson038efe72019-03-18 13:39:31 -07002599 if (profile) {
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302600 scan_filter->bWPSAssociation =
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002601 profile->bWPSAssociation;
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302602 scan_filter->bOSENAssociation =
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002603 profile->bOSENAssociation;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002604 } else {
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302605 scan_filter->bWPSAssociation = 0;
2606 scan_filter->bOSENAssociation = 0;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002607 }
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302608 } else {
2609 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
2610 FL("Preparing the profile filter failed"));
2611 qdf_mem_free(scan_filter);
2612 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002613 }
2614 status = sme_acquire_global_lock(&mac_ctx->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302615 if (QDF_STATUS_SUCCESS == status) {
Archana Ramachandran2eb7a612017-03-23 22:58:42 -07002616 status = csr_scan_get_result(mac_ctx, scan_filter,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002617 &filtered_scan_result);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302618 if (QDF_STATUS_SUCCESS == status) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002619 csr_get_bssdescr_from_scan_handle(filtered_scan_result,
2620 &first_ap_profile);
2621 *scan_cache = filtered_scan_result;
2622 if (0 != first_ap_profile.channelId) {
2623 *ap_chnl_id = first_ap_profile.channelId;
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302624 QDF_TRACE(QDF_MODULE_ID_SME,
Abhishek Singh5d8d7332017-08-10 15:15:24 +05302625 QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002626 FL("Found best AP & its on chnl[%d]"),
2627 first_ap_profile.channelId);
2628 } else {
2629 /*
2630 * This means scan result is empty
2631 * so set the channel to zero, caller should
2632 * take of zero channel id case.
2633 */
2634 *ap_chnl_id = 0;
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302635 QDF_TRACE(QDF_MODULE_ID_SME,
2636 QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002637 FL("Scan is empty, set chnl to 0"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302638 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002639 }
2640 } else {
Sandeep Puligilla1f1e4002018-08-18 12:15:01 -07002641 sme_err("Failed to get scan get result");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302642 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002643 }
2644 csr_free_scan_filter(mac_ctx, scan_filter);
2645 sme_release_global_lock(&mac_ctx->sme);
2646 } else {
Krunal Sonif9882222016-01-22 17:16:50 -08002647 csr_free_scan_filter(mac_ctx, scan_filter);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302648 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002649 }
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302650 qdf_mem_free(scan_filter);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002651 return status;
2652}
2653
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302654/*
2655 * sme_scan_flush_result() -
2656 * A wrapper function to request CSR to clear scan results.
2657 * This is a synchronous call
2658 *
2659 * Return QDF_STATUS
2660 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08002661QDF_STATUS sme_scan_flush_result(mac_handle_t mac_handle)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002662{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302663 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08002664 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002665
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302666 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002667 TRACE_CODE_SME_RX_HDD_MSG_SCAN_FLUSH_RESULTS,
2668 0, 0));
Jeff Johnson01f2c232018-11-21 19:17:44 -08002669 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302670 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08002671 status = csr_scan_flush_result(mac);
2672 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002673 }
2674
2675 return status;
2676}
2677
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302678/*
2679 * sme_scan_result_get_first() -
2680 * A wrapper function to request CSR to returns the first element of
2681 * scan result.
2682 * This is a synchronous call
2683 *
2684 * hScanResult - returned from csr_scan_get_result
2685 * Return tCsrScanResultInfo * - NULL if no result
2686 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08002687tCsrScanResultInfo *sme_scan_result_get_first(mac_handle_t mac_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002688 tScanResultHandle hScanResult)
2689{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302690 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08002691 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002692 tCsrScanResultInfo *pRet = NULL;
2693
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302694 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002695 TRACE_CODE_SME_RX_HDD_MSG_SCAN_RESULT_GETFIRST,
2696 NO_SESSION, 0));
Jeff Johnson01f2c232018-11-21 19:17:44 -08002697 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302698 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08002699 pRet = csr_scan_result_get_first(mac, hScanResult);
2700 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002701 }
2702
2703 return pRet;
2704}
2705
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302706/*
2707 * sme_scan_result_get_next() -
2708 * A wrapper function to request CSR to returns the next element of
2709 * scan result. It can be called without calling csr_scan_result_get_first first
2710 * This is a synchronous call
2711 *
2712 * hScanResult - returned from csr_scan_get_result
2713 * Return Null if no result or reach the end
2714 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08002715tCsrScanResultInfo *sme_scan_result_get_next(mac_handle_t mac_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002716 tScanResultHandle hScanResult)
2717{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302718 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08002719 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002720 tCsrScanResultInfo *pRet = NULL;
2721
Jeff Johnson01f2c232018-11-21 19:17:44 -08002722 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302723 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08002724 pRet = csr_scan_result_get_next(mac, hScanResult);
2725 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002726 }
2727
2728 return pRet;
2729}
2730
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302731/*
2732 * sme_scan_result_purge() -
2733 * A wrapper function to request CSR to remove all items(tCsrScanResult)
2734 * in the list and free memory for each item
2735 * This is a synchronous call
2736 *
2737 * hScanResult - returned from csr_scan_get_result. hScanResult is
2738 * considered gone by
2739 * calling this function and even before this function reutrns.
2740 * Return QDF_STATUS
2741 */
Archana Ramachandran2eb7a612017-03-23 22:58:42 -07002742QDF_STATUS sme_scan_result_purge(tScanResultHandle hScanResult)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002743{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302744 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08002745 struct mac_context *mac_ctx = sme_get_mac_context();
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002746
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302747 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002748 TRACE_CODE_SME_RX_HDD_MSG_SCAN_RESULT_PURGE,
2749 NO_SESSION, 0));
Archana Ramachandran2eb7a612017-03-23 22:58:42 -07002750 status = sme_acquire_global_lock(&mac_ctx->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302751 if (QDF_IS_STATUS_SUCCESS(status)) {
Archana Ramachandran2eb7a612017-03-23 22:58:42 -07002752 status = csr_scan_result_purge(mac_ctx, hScanResult);
2753 sme_release_global_lock(&mac_ctx->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002754 }
2755
2756 return status;
2757}
2758
Jeff Johnsonb460dd72018-11-08 10:26:51 -08002759eCsrPhyMode sme_get_phy_mode(mac_handle_t mac_handle)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002760{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08002761 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302762
Jeff Johnson01f2c232018-11-21 19:17:44 -08002763 return mac->roam.configParam.phyMode;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002764}
2765
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302766/*
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302767 * sme_roam_connect() -
2768 * A wrapper function to request CSR to inititiate an association
2769 * This is an asynchronous call.
2770 *
2771 * sessionId - the sessionId returned by sme_open_session.
2772 * pProfile - description of the network to which to connect
2773 * hBssListIn - a list of BSS descriptor to roam to. It is returned
2774 * from csr_scan_get_result
2775 * pRoamId - to get back the request ID
2776 * Return QDF_STATUS
2777 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08002778QDF_STATUS sme_roam_connect(mac_handle_t mac_handle, uint8_t sessionId,
Jeff Johnson66ee8a92018-03-17 15:24:26 -07002779 struct csr_roam_profile *pProfile,
2780 uint32_t *pRoamId)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002781{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302782 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08002783 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002784
Jeff Johnson01f2c232018-11-21 19:17:44 -08002785 if (!mac)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302786 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002787
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302788 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002789 TRACE_CODE_SME_RX_HDD_MSG_CONNECT, sessionId, 0));
Jeff Johnson01f2c232018-11-21 19:17:44 -08002790 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302791 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08002792 if (CSR_IS_SESSION_VALID(mac, sessionId)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002793 status =
Jeff Johnson01f2c232018-11-21 19:17:44 -08002794 csr_roam_connect(mac, sessionId, pProfile,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002795 pRoamId);
2796 } else {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002797 sme_err("Invalid sessionID: %d", sessionId);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302798 status = QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002799 }
Jeff Johnson01f2c232018-11-21 19:17:44 -08002800 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002801 }
2802
2803 return status;
2804}
2805
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302806/*
2807 * sme_set_phy_mode() -
2808 * Changes the PhyMode.
2809 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08002810 * mac_handle - The handle returned by mac_open.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302811 * phyMode new phyMode which is to set
2812 * Return QDF_STATUS SUCCESS.
2813 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08002814QDF_STATUS sme_set_phy_mode(mac_handle_t mac_handle, eCsrPhyMode phyMode)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002815{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08002816 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002817
Jeff Johnson01f2c232018-11-21 19:17:44 -08002818 mac->roam.configParam.phyMode = phyMode;
2819 mac->roam.configParam.uCfgDot11Mode =
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002820 csr_get_cfg_dot11_mode_from_csr_phy_mode(NULL,
Jeff Johnson01f2c232018-11-21 19:17:44 -08002821 mac->roam.configParam.phyMode,
2822 mac->roam.configParam.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302823 ProprietaryRatesEnabled);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002824
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302825 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002826}
2827
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302828/*
2829 * sme_roam_reassoc() -
2830 * A wrapper function to request CSR to inititiate a re-association
2831 *
2832 * pProfile - can be NULL to join the currently connected AP. In that
2833 * case modProfileFields should carry the modified field(s) which could trigger
2834 * reassoc
2835 * modProfileFields - fields which are part of tCsrRoamConnectedProfile
2836 * that might need modification dynamically once STA is up & running and this
2837 * could trigger a reassoc
2838 * pRoamId - to get back the request ID
2839 * Return QDF_STATUS
2840 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08002841QDF_STATUS sme_roam_reassoc(mac_handle_t mac_handle, uint8_t sessionId,
Jeff Johnson66ee8a92018-03-17 15:24:26 -07002842 struct csr_roam_profile *pProfile,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002843 tCsrRoamModifyProfileFields modProfileFields,
2844 uint32_t *pRoamId, bool fForce)
2845{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302846 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08002847 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002848
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302849 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002850 TRACE_CODE_SME_RX_HDD_ROAM_REASSOC, sessionId, 0));
Jeff Johnson01f2c232018-11-21 19:17:44 -08002851 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302852 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08002853 if (CSR_IS_SESSION_VALID(mac, sessionId)) {
Jeff Johnson038efe72019-03-18 13:39:31 -07002854 if ((!pProfile) && (fForce == 1))
Jeff Johnson01f2c232018-11-21 19:17:44 -08002855 status = csr_reassoc(mac, sessionId,
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302856 &modProfileFields, pRoamId,
2857 fForce);
2858 else
Jeff Johnson01f2c232018-11-21 19:17:44 -08002859 status = csr_roam_reassoc(mac, sessionId,
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302860 pProfile,
2861 modProfileFields, pRoamId);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002862 } else {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302863 status = QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002864 }
Jeff Johnson01f2c232018-11-21 19:17:44 -08002865 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002866 }
2867
2868 return status;
2869}
2870
Jeff Johnsonc7309062018-11-09 20:59:42 -08002871QDF_STATUS sme_roam_disconnect(mac_handle_t mac_handle, uint8_t session_id,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002872 eCsrRoamDisconnectReason reason)
2873{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302874 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08002875 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002876
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302877 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Varun Reddy Yeturu363809c2018-06-27 14:12:52 -07002878 TRACE_CODE_SME_RX_HDD_ROAM_DISCONNECT, session_id,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002879 reason));
Varun Reddy Yeturu363809c2018-06-27 14:12:52 -07002880 status = sme_acquire_global_lock(&mac_ctx->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302881 if (QDF_IS_STATUS_SUCCESS(status)) {
Varun Reddy Yeturu363809c2018-06-27 14:12:52 -07002882 if (CSR_IS_SESSION_VALID(mac_ctx, session_id))
2883 status = csr_roam_disconnect(mac_ctx, session_id,
2884 reason);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302885 else
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302886 status = QDF_STATUS_E_INVAL;
Varun Reddy Yeturu363809c2018-06-27 14:12:52 -07002887 sme_release_global_lock(&mac_ctx->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002888 }
2889
2890 return status;
2891}
2892
Abhishek Singhca408032016-09-13 15:26:12 +05302893/* sme_dhcp_done_ind() - send dhcp done ind
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -08002894 * @mac_handle: Opaque handle to the global MAC context
Abhishek Singhca408032016-09-13 15:26:12 +05302895 * @session_id: session id
2896 *
2897 * Return: void.
2898 */
Jeff Johnsonc7309062018-11-09 20:59:42 -08002899void sme_dhcp_done_ind(mac_handle_t mac_handle, uint8_t session_id)
Abhishek Singhca408032016-09-13 15:26:12 +05302900{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08002901 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
gaurank kathpalia14e2f912017-08-31 14:51:45 +05302902 struct csr_roam_session *session;
Abhishek Singhca408032016-09-13 15:26:12 +05302903
2904 if (!mac_ctx)
2905 return;
2906
2907 session = CSR_GET_SESSION(mac_ctx, session_id);
2908 if (!session) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07002909 sme_err("Session: %d not found", session_id);
Abhishek Singhca408032016-09-13 15:26:12 +05302910 return;
2911 }
2912 session->dhcp_done = true;
2913}
2914
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302915/*
2916 * sme_roam_stop_bss() -
2917 * To stop BSS for Soft AP. This is an asynchronous API.
2918 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08002919 * mac_handle - Global structure
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302920 * sessionId - sessionId of SoftAP
2921 * Return QDF_STATUS SUCCESS Roam callback will be called to indicate
2922 * actual results
2923 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08002924QDF_STATUS sme_roam_stop_bss(mac_handle_t mac_handle, uint8_t sessionId)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002925{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302926 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08002927 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002928
Jeff Johnson01f2c232018-11-21 19:17:44 -08002929 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302930 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08002931 if (CSR_IS_SESSION_VALID(mac, sessionId))
2932 status = csr_roam_issue_stop_bss_cmd(mac, sessionId,
Himanshu Agarwal75c8d792017-12-19 18:31:04 +05302933 false);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302934 else
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302935 status = QDF_STATUS_E_INVAL;
Jeff Johnson01f2c232018-11-21 19:17:44 -08002936 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002937 }
2938
2939 return status;
2940}
2941
Deepthi Gowrib3bfefd2016-09-13 15:14:34 +05302942/**
2943 * sme_roam_disconnect_sta() - disassociate a station
Jeff Johnsonb460dd72018-11-08 10:26:51 -08002944 * @mac_handle: Global structure
Deepthi Gowrib3bfefd2016-09-13 15:14:34 +05302945 * @sessionId: SessionId of SoftAP
2946 * @p_del_sta_params: Pointer to parameters of the station to disassoc
2947 *
2948 * To disassociate a station. This is an asynchronous API.
2949 *
2950 * Return: QDF_STATUS_SUCCESS on success.Roam callback will
2951 * be called to indicate actual result.
2952 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08002953QDF_STATUS sme_roam_disconnect_sta(mac_handle_t mac_handle, uint8_t sessionId,
Jeff Johnsone6bf7192017-11-07 15:16:09 -08002954 struct csr_del_sta_params *p_del_sta_params)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002955{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302956 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08002957 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002958
Jeff Johnson038efe72019-03-18 13:39:31 -07002959 if (!mac) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302960 QDF_ASSERT(0);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002961 return status;
2962 }
2963
Jeff Johnson01f2c232018-11-21 19:17:44 -08002964 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302965 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08002966 if (CSR_IS_SESSION_VALID(mac, sessionId))
2967 status = csr_roam_issue_disassociate_sta_cmd(mac,
Deepthi Gowrib3bfefd2016-09-13 15:14:34 +05302968 sessionId, p_del_sta_params);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05302969 else
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302970 status = QDF_STATUS_E_INVAL;
Jeff Johnson01f2c232018-11-21 19:17:44 -08002971 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002972 }
2973
2974 return status;
2975}
2976
2977/**
2978 * sme_roam_deauth_sta() - deauthenticate a station
Jeff Johnsonb460dd72018-11-08 10:26:51 -08002979 * @mac_handle: Global structure
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002980 * @sessionId: SessionId of SoftAP
2981 * @pDelStaParams: Pointer to parameters of the station to deauthenticate
2982 *
2983 * To disassociate a station. This is an asynchronous API.
2984 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302985 * Return: QDF_STATUS_SUCCESS on success or another QDF_STATUS error
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002986 * code on error. Roam callback will be called to indicate actual
2987 * result
2988 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08002989QDF_STATUS sme_roam_deauth_sta(mac_handle_t mac_handle, uint8_t sessionId,
Jeff Johnsone6bf7192017-11-07 15:16:09 -08002990 struct csr_del_sta_params *pDelStaParams)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002991{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302992 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08002993 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002994
Jeff Johnson038efe72019-03-18 13:39:31 -07002995 if (!mac) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302996 QDF_ASSERT(0);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002997 return status;
2998 }
2999
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303000 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Sreelakshmi Konamki6744cff2015-09-07 12:10:39 +05303001 TRACE_CODE_SME_RX_HDD_MSG_DEAUTH_STA,
3002 sessionId, pDelStaParams->reason_code));
Jeff Johnson01f2c232018-11-21 19:17:44 -08003003 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303004 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08003005 if (CSR_IS_SESSION_VALID(mac, sessionId))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003006 status =
Jeff Johnson01f2c232018-11-21 19:17:44 -08003007 csr_roam_issue_deauth_sta_cmd(mac, sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003008 pDelStaParams);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303009 else
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303010 status = QDF_STATUS_E_INVAL;
Jeff Johnson01f2c232018-11-21 19:17:44 -08003011 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003012 }
3013
3014 return status;
3015}
3016
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303017/*
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303018 * sme_roam_get_connect_profile() -
3019 * A wrapper function to request CSR to return the current connect
3020 * profile. Caller must call csr_roam_free_connect_profile after it is done
3021 * and before reuse for another csr_roam_get_connect_profile call.
3022 * This is a synchronous call.
3023 *
3024 * pProfile - pointer to a caller allocated structure
3025 * tCsrRoamConnectedProfile
3026 * eturn QDF_STATUS. Failure if not connected
3027 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08003028QDF_STATUS sme_roam_get_connect_profile(mac_handle_t mac_handle,
3029 uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003030 tCsrRoamConnectedProfile *pProfile)
3031{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303032 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08003033 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003034
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303035 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003036 TRACE_CODE_SME_RX_HDD_ROAM_GET_CONNECTPROFILE,
3037 sessionId, 0));
Jeff Johnson01f2c232018-11-21 19:17:44 -08003038 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303039 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08003040 if (CSR_IS_SESSION_VALID(mac, sessionId))
3041 status = csr_roam_get_connect_profile(mac, sessionId,
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303042 pProfile);
3043 else
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303044 status = QDF_STATUS_E_INVAL;
Jeff Johnson01f2c232018-11-21 19:17:44 -08003045 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003046 }
3047
3048 return status;
3049}
3050
Naveen Rawatdf0a7e72016-01-06 18:35:53 -08003051/**
3052 * sme_roam_free_connect_profile - a wrapper function to request CSR to free and
3053 * reinitialize the profile returned previously by csr_roam_get_connect_profile.
3054 *
3055 * @profile - pointer to a caller allocated structure tCsrRoamConnectedProfile
3056 *
3057 * Return: none
3058 */
3059void sme_roam_free_connect_profile(tCsrRoamConnectedProfile *profile)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003060{
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303061 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003062 TRACE_CODE_SME_RX_HDD_ROAM_FREE_CONNECTPROFILE,
3063 NO_SESSION, 0));
Naveen Rawatdf0a7e72016-01-06 18:35:53 -08003064 csr_roam_free_connect_profile(profile);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003065}
3066
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303067/*
3068 * sme_roam_set_pmkid_cache() -
3069 * A wrapper function to request CSR to return the PMKID candidate list
3070 * This is a synchronous call.
3071
3072 * pPMKIDCache - caller allocated buffer point to an array of
3073 * tPmkidCacheInfo
3074 * numItems - a variable that has the number of tPmkidCacheInfo
3075 * allocated when retruning, this is either the number needed
3076 * or number of items put into pPMKIDCache
3077 * update_entire_cache - this bool value specifies if the entire pmkid
3078 * cache should be overwritten or should it be
3079 * updated entry by entry.
3080 * Return QDF_STATUS - when fail, it usually means the buffer allocated is not
3081 * big enough and pNumItems has the number of
3082 * tPmkidCacheInfo.
3083 * \Note: pNumItems is a number of tPmkidCacheInfo,
3084 * not sizeof(tPmkidCacheInfo) * something
3085 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08003086QDF_STATUS sme_roam_set_pmkid_cache(mac_handle_t mac_handle, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003087 tPmkidCacheInfo *pPMKIDCache,
3088 uint32_t numItems, bool update_entire_cache)
3089{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303090 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08003091 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003092
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303093 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003094 TRACE_CODE_SME_RX_HDD_ROAM_SET_PMKIDCACHE, sessionId,
3095 numItems));
Jeff Johnson01f2c232018-11-21 19:17:44 -08003096 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303097 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08003098 if (CSR_IS_SESSION_VALID(mac, sessionId))
3099 status = csr_roam_set_pmkid_cache(mac, sessionId,
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303100 pPMKIDCache,
3101 numItems, update_entire_cache);
3102 else
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303103 status = QDF_STATUS_E_INVAL;
Jeff Johnson01f2c232018-11-21 19:17:44 -08003104 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003105 }
3106
3107 return status;
3108}
3109
Jeff Johnsonb460dd72018-11-08 10:26:51 -08003110QDF_STATUS sme_roam_del_pmkid_from_cache(mac_handle_t mac_handle,
3111 uint8_t sessionId,
Sridhar Selvarajc3684c72017-08-21 14:32:47 +05303112 tPmkidCacheInfo *pmksa,
3113 bool flush_cache)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003114{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303115 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08003116 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Sreelakshmi Konamki6744cff2015-09-07 12:10:39 +05303117
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303118 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Sreelakshmi Konamki6744cff2015-09-07 12:10:39 +05303119 TRACE_CODE_SME_RX_HDD_ROAM_DEL_PMKIDCACHE,
3120 sessionId, flush_cache));
Jeff Johnson01f2c232018-11-21 19:17:44 -08003121 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303122 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08003123 if (CSR_IS_SESSION_VALID(mac, sessionId))
3124 status = csr_roam_del_pmkid_from_cache(mac, sessionId,
Sridhar Selvarajc3684c72017-08-21 14:32:47 +05303125 pmksa, flush_cache);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303126 else
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303127 status = QDF_STATUS_E_INVAL;
Jeff Johnson01f2c232018-11-21 19:17:44 -08003128 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003129 }
3130 return status;
3131}
3132
Abhinav Kumar7830d9c2018-06-27 17:57:48 +05303133#ifdef WLAN_FEATURE_ROAM_OFFLOAD
Jeff Johnsonc7309062018-11-09 20:59:42 -08003134void sme_get_pmk_info(mac_handle_t mac_handle, uint8_t session_id,
3135 tPmkidCacheInfo *pmk_cache)
gaurank kathpalia99d06c12018-05-16 16:28:35 +05303136{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08003137 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
gaurank kathpalia99d06c12018-05-16 16:28:35 +05303138 QDF_STATUS status = sme_acquire_global_lock(&mac_ctx->sme);
3139
3140 if (QDF_IS_STATUS_SUCCESS(status)) {
3141 if (CSR_IS_SESSION_VALID(mac_ctx, session_id))
3142 csr_get_pmk_info(mac_ctx, session_id, pmk_cache);
3143 sme_release_global_lock(&mac_ctx->sme);
3144 }
3145}
Abhinav Kumar7830d9c2018-06-27 17:57:48 +05303146#endif
3147
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003148#ifdef WLAN_FEATURE_ROAM_OFFLOAD
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303149/*
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003150 * \fn sme_roam_set_psk_pmk
3151 * \brief a wrapper function to request CSR to save PSK/PMK
3152 * This is a synchronous call.
Jeff Johnsonb460dd72018-11-08 10:26:51 -08003153 * \param mac_handle - Global structure
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003154 * \param sessionId - SME sessionId
3155 * \param pPSK_PMK - pointer to an array of Psk[]/Pmk
3156 * \param pmk_len - Length could be only 16 bytes in case if LEAP
3157 * connections. Need to pass this information to
3158 * firmware.
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303159 * \return QDF_STATUS -status whether PSK/PMK is set or not
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003160 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08003161QDF_STATUS sme_roam_set_psk_pmk(mac_handle_t mac_handle, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003162 uint8_t *pPSK_PMK, size_t pmk_len)
3163{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303164 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08003165 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303166
Jeff Johnson01f2c232018-11-21 19:17:44 -08003167 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303168 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08003169 if (CSR_IS_SESSION_VALID(mac, sessionId))
3170 status = csr_roam_set_psk_pmk(mac, sessionId, pPSK_PMK,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003171 pmk_len);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303172 else
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303173 status = QDF_STATUS_E_INVAL;
Jeff Johnson01f2c232018-11-21 19:17:44 -08003174 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003175 }
3176 return status;
3177}
3178#endif
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003179
Jeff Johnsonc7309062018-11-09 20:59:42 -08003180QDF_STATUS sme_roam_get_wpa_rsn_req_ie(mac_handle_t mac_handle,
3181 uint8_t session_id,
Jeff Johnson0a078b52018-06-01 16:15:54 -07003182 uint32_t *len, uint8_t *buf)
3183{
3184 QDF_STATUS status;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08003185 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Jeff Johnson0a078b52018-06-01 16:15:54 -07003186
3187 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303188 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson0a078b52018-06-01 16:15:54 -07003189 if (CSR_IS_SESSION_VALID(mac, session_id))
3190 status = csr_roam_get_wpa_rsn_req_ie(mac, session_id,
3191 len, buf);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303192 else
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303193 status = QDF_STATUS_E_INVAL;
Jeff Johnson0a078b52018-06-01 16:15:54 -07003194 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003195 }
3196
3197 return status;
3198}
3199
Jeff Johnsonc7309062018-11-09 20:59:42 -08003200QDF_STATUS sme_roam_get_wpa_rsn_rsp_ie(mac_handle_t mac_handle,
3201 uint8_t session_id,
Jeff Johnson0a078b52018-06-01 16:15:54 -07003202 uint32_t *len, uint8_t *buf)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003203{
Jeff Johnson0a078b52018-06-01 16:15:54 -07003204 QDF_STATUS status;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08003205 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003206
Jeff Johnson0a078b52018-06-01 16:15:54 -07003207 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303208 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson0a078b52018-06-01 16:15:54 -07003209 if (CSR_IS_SESSION_VALID(mac, session_id))
3210 status = csr_roam_get_wpa_rsn_rsp_ie(mac, session_id,
3211 len, buf);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303212 else
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303213 status = QDF_STATUS_E_INVAL;
Jeff Johnson0a078b52018-06-01 16:15:54 -07003214 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003215 }
3216
3217 return status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003218}
3219
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303220/*
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303221 * sme_get_config_param() -
3222 * A wrapper function that HDD calls to get the global settings
3223 * currently maintained by CSR.
3224 * This is a synchronous call.
3225 *
3226 * pParam - caller allocated memory
3227 * Return QDF_STATUS
3228 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08003229QDF_STATUS sme_get_config_param(mac_handle_t mac_handle,
Jeff Johnson46b4f0e2019-03-08 10:48:35 -08003230 struct sme_config_params *pParam)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003231{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303232 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08003233 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003234
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303235 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003236 TRACE_CODE_SME_RX_HDD_GET_CONFIGPARAM, NO_SESSION, 0));
Jeff Johnson01f2c232018-11-21 19:17:44 -08003237 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303238 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08003239 status = csr_get_config_param(mac, &pParam->csrConfig);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303240 if (status != QDF_STATUS_SUCCESS) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07003241 sme_err("csr_get_config_param failed");
Jeff Johnson01f2c232018-11-21 19:17:44 -08003242 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003243 return status;
3244 }
Jeff Johnson01f2c232018-11-21 19:17:44 -08003245 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003246 }
3247
3248 return status;
3249}
3250
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303251/*
3252 * sme_get_modify_profile_fields() -
3253 * HDD or SME - QOS calls this function to get the current values of
3254 * connected profile fields, changing which can cause reassoc.
3255 * This function must be called after CFG is downloaded and STA is in connected
3256 * state. Also, make sure to call this function to get the current profile
3257 * fields before calling the reassoc. So that pModifyProfileFields will have
3258 * all the latest values plus the one(s) has been updated as part of reassoc
3259 * request.
3260 *
3261 * pModifyProfileFields - pointer to the connected profile fields
3262 * changing which can cause reassoc
3263 * Return QDF_STATUS
3264 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08003265QDF_STATUS sme_get_modify_profile_fields(mac_handle_t mac_handle,
3266 uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003267 tCsrRoamModifyProfileFields *
3268 pModifyProfileFields)
3269{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303270 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08003271 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003272
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303273 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003274 TRACE_CODE_SME_RX_HDD_GET_MODPROFFIELDS, sessionId,
3275 0));
Jeff Johnson01f2c232018-11-21 19:17:44 -08003276 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303277 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08003278 if (CSR_IS_SESSION_VALID(mac, sessionId))
3279 status = csr_get_modify_profile_fields(mac, sessionId,
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303280 pModifyProfileFields);
3281 else
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303282 status = QDF_STATUS_E_INVAL;
Jeff Johnson01f2c232018-11-21 19:17:44 -08003283 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003284 }
3285
3286 return status;
3287}
3288
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003289#ifdef FEATURE_OEM_DATA_SUPPORT
3290/**
3291 * sme_register_oem_data_rsp_callback() - Register a routine of
3292 * type send_oem_data_rsp_msg
Jeff Johnsonb460dd72018-11-08 10:26:51 -08003293 * @mac_handle: Handle returned by mac_open.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003294 * @callback: Callback to send response
3295 * to oem application.
3296 *
3297 * sme_oem_data_rsp_callback is used to register sme_send_oem_data_rsp_msg
3298 * callback function.
3299 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303300 * Return: QDF_STATUS.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003301 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08003302QDF_STATUS sme_register_oem_data_rsp_callback(mac_handle_t mac_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003303 sme_send_oem_data_rsp_msg callback)
3304{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303305 QDF_STATUS status = QDF_STATUS_SUCCESS;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08003306 struct mac_context *pmac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003307
Krishna Kumaar Natarajanbbbf2ef2016-08-03 14:06:26 -07003308 pmac->sme.oem_data_rsp_callback = callback;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003309
3310 return status;
3311
3312}
Arun Khandavalli4b55da72016-07-19 19:55:01 +05303313
3314/**
3315 * sme_deregister_oem_data_rsp_callback() - De-register OEM datarsp callback
Jeff Johnsonb460dd72018-11-08 10:26:51 -08003316 * @mac_handle: Handler return by mac_open
Arun Khandavalli4b55da72016-07-19 19:55:01 +05303317 * This function De-registers the OEM data response callback to SME
3318 *
3319 * Return: None
3320 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08003321void sme_deregister_oem_data_rsp_callback(mac_handle_t mac_handle)
Arun Khandavalli4b55da72016-07-19 19:55:01 +05303322{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08003323 struct mac_context *pmac;
Arun Khandavalli4b55da72016-07-19 19:55:01 +05303324
Jeff Johnsonb460dd72018-11-08 10:26:51 -08003325 if (!mac_handle) {
Arun Khandavalli4b55da72016-07-19 19:55:01 +05303326 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Jeff Johnsonb460dd72018-11-08 10:26:51 -08003327 FL("mac_handle is not valid"));
Arun Khandavalli4b55da72016-07-19 19:55:01 +05303328 return;
3329 }
Jeff Johnsona0619e42018-11-28 17:43:00 -08003330 pmac = MAC_CONTEXT(mac_handle);
Arun Khandavalli4b55da72016-07-19 19:55:01 +05303331
Krishna Kumaar Natarajanbbbf2ef2016-08-03 14:06:26 -07003332 pmac->sme.oem_data_rsp_callback = NULL;
Arun Khandavalli4b55da72016-07-19 19:55:01 +05303333}
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003334
3335/**
Krishna Kumaar Natarajan53ca2902015-12-04 14:01:46 -08003336 * sme_oem_update_capability() - update UMAC's oem related capability.
Jeff Johnsonc7309062018-11-09 20:59:42 -08003337 * @mac_handle: Handle returned by mac_open
Krishna Kumaar Natarajan53ca2902015-12-04 14:01:46 -08003338 * @oem_cap: pointer to oem_capability
3339 *
3340 * This function updates OEM capability to UMAC. Currently RTT
3341 * related capabilities are updated. More capabilities can be
3342 * added in future.
3343 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303344 * Return: QDF_STATUS
Krishna Kumaar Natarajan53ca2902015-12-04 14:01:46 -08003345 */
Jeff Johnsonc7309062018-11-09 20:59:42 -08003346QDF_STATUS sme_oem_update_capability(mac_handle_t mac_handle,
Krishna Kumaar Natarajan53ca2902015-12-04 14:01:46 -08003347 struct sme_oem_capability *cap)
3348{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303349 QDF_STATUS status = QDF_STATUS_SUCCESS;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08003350 struct mac_context *pmac = MAC_CONTEXT(mac_handle);
Krishna Kumaar Natarajan53ca2902015-12-04 14:01:46 -08003351 uint8_t *bytes;
3352
3353 bytes = pmac->rrm.rrmSmeContext.rrmConfig.rm_capability;
3354
3355 if (cap->ftm_rr)
3356 bytes[4] |= RM_CAP_FTM_RANGE_REPORT;
3357 if (cap->lci_capability)
3358 bytes[4] |= RM_CAP_CIVIC_LOC_MEASUREMENT;
3359
3360 return status;
3361}
3362
3363/**
3364 * sme_oem_get_capability() - get oem capability
Jeff Johnsonc7309062018-11-09 20:59:42 -08003365 * @mac_handle: Handle returned by mac_open
Krishna Kumaar Natarajan53ca2902015-12-04 14:01:46 -08003366 * @oem_cap: pointer to oem_capability
3367 *
3368 * This function is used to get the OEM capability from UMAC.
3369 * Currently RTT related capabilities are received. More
3370 * capabilities can be added in future.
3371 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303372 * Return: QDF_STATUS
Krishna Kumaar Natarajan53ca2902015-12-04 14:01:46 -08003373 */
Jeff Johnsonc7309062018-11-09 20:59:42 -08003374QDF_STATUS sme_oem_get_capability(mac_handle_t mac_handle,
Krishna Kumaar Natarajan53ca2902015-12-04 14:01:46 -08003375 struct sme_oem_capability *cap)
3376{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303377 QDF_STATUS status = QDF_STATUS_SUCCESS;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08003378 struct mac_context *pmac = MAC_CONTEXT(mac_handle);
Krishna Kumaar Natarajan53ca2902015-12-04 14:01:46 -08003379 uint8_t *bytes;
3380
3381 bytes = pmac->rrm.rrmSmeContext.rrmConfig.rm_capability;
3382
3383 cap->ftm_rr = bytes[4] & RM_CAP_FTM_RANGE_REPORT;
3384 cap->lci_capability = bytes[4] & RM_CAP_CIVIC_LOC_MEASUREMENT;
3385
3386 return status;
3387}
Naveen Rawat910726a2017-03-06 11:42:51 -08003388#endif
Krishna Kumaar Natarajan53ca2902015-12-04 14:01:46 -08003389
3390/**
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003391 * sme_roam_set_key() - To set encryption key.
Jeff Johnsonc7309062018-11-09 20:59:42 -08003392 * @mac_handle: mac_handle global context
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003393 * @session_id: session id
3394 * @set_key: pointer to a caller allocated object of tCsrSetContextInfo
3395 * @ptr_roam_id: Upon success return, this is the id caller can use to
3396 * identify the request in roamcallback
3397 *
3398 * This function should be called only when connected. This is an asynchronous
3399 * API.
3400 *
3401 * Return: Status of operation
3402 */
Jeff Johnsonc7309062018-11-09 20:59:42 -08003403QDF_STATUS sme_roam_set_key(mac_handle_t mac_handle, uint8_t session_id,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003404 tCsrRoamSetKey *set_key, uint32_t *ptr_roam_id)
3405{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303406 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08003407 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003408 uint32_t roam_id;
gaurank kathpalia14e2f912017-08-31 14:51:45 +05303409 struct csr_roam_session *session = NULL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003410 struct ps_global_info *ps_global_info = &mac_ctx->sme.ps_global_info;
3411
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303412 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_RX_HDD_SET_KEY,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003413 session_id, 0));
3414 if (set_key->keyLength > CSR_MAX_KEY_LEN) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07003415 sme_err("Invalid key length: %d", set_key->keyLength);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303416 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003417 }
3418 /*Once Setkey is done, we can go in BMPS */
3419 if (set_key->keyLength)
3420 ps_global_info->remain_in_power_active_till_dhcp = false;
3421
3422 status = sme_acquire_global_lock(&mac_ctx->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303423 if (!QDF_IS_STATUS_SUCCESS(status))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003424 return status;
3425
3426 roam_id = GET_NEXT_ROAM_ID(&mac_ctx->roam);
3427 if (ptr_roam_id)
3428 *ptr_roam_id = roam_id;
3429
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07003430 sme_debug("keyLength: %d", set_key->keyLength);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003431
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07003432 sme_debug("Session_id: %d roam_id: %d", session_id, roam_id);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003433 session = CSR_GET_SESSION(mac_ctx, session_id);
3434 if (!session) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07003435 sme_err("session %d not found", session_id);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003436 sme_release_global_lock(&mac_ctx->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303437 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003438 }
3439 if (CSR_IS_INFRA_AP(&session->connectedProfile)
3440 && set_key->keyDirection == eSIR_TX_DEFAULT) {
3441 if ((eCSR_ENCRYPT_TYPE_WEP40 == set_key->encType)
3442 || (eCSR_ENCRYPT_TYPE_WEP40_STATICKEY ==
3443 set_key->encType)) {
3444 session->pCurRoamProfile->negotiatedUCEncryptionType =
3445 eCSR_ENCRYPT_TYPE_WEP40_STATICKEY;
3446 }
3447 if ((eCSR_ENCRYPT_TYPE_WEP104 == set_key->encType)
3448 || (eCSR_ENCRYPT_TYPE_WEP104_STATICKEY ==
3449 set_key->encType)) {
3450 session->pCurRoamProfile->negotiatedUCEncryptionType =
3451 eCSR_ENCRYPT_TYPE_WEP104_STATICKEY;
3452 }
3453 }
3454 status = csr_roam_set_key(mac_ctx, session_id, set_key, roam_id);
3455 sme_release_global_lock(&mac_ctx->sme);
3456 return status;
3457}
3458
Masti, Narayanraddiab712a72016-08-04 11:59:11 +05303459/**
3460 * sme_roam_set_default_key_index - To set default wep key idx
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -08003461 * @mac_handle: Opaque handle to the global MAC context
Masti, Narayanraddiab712a72016-08-04 11:59:11 +05303462 * @session_id: session id
3463 * @default_idx: default wep key index
3464 *
3465 * This function prepares a message and post to WMA to set wep default
3466 * key index
3467 *
3468 * Return: Success:QDF_STATUS_SUCCESS Failure: Error value
3469 */
Jeff Johnsonc7309062018-11-09 20:59:42 -08003470QDF_STATUS sme_roam_set_default_key_index(mac_handle_t mac_handle,
3471 uint8_t session_id,
Masti, Narayanraddiab712a72016-08-04 11:59:11 +05303472 uint8_t default_idx)
3473{
Rajeev Kumar37d478b2017-04-17 16:59:28 -07003474 struct scheduler_msg msg = {0};
Masti, Narayanraddiab712a72016-08-04 11:59:11 +05303475 struct wep_update_default_key_idx *update_key;
3476
3477 update_key = qdf_mem_malloc(sizeof(*update_key));
Arif Hussain0ef77082018-10-10 16:42:53 -07003478 if (!update_key)
Masti, Narayanraddiab712a72016-08-04 11:59:11 +05303479 return QDF_STATUS_E_NOMEM;
Masti, Narayanraddiab712a72016-08-04 11:59:11 +05303480
3481 update_key->session_id = session_id;
3482 update_key->default_idx = default_idx;
3483
3484 msg.type = WMA_UPDATE_WEP_DEFAULT_KEY;
3485 msg.reserved = 0;
3486 msg.bodyptr = (void *)update_key;
3487
3488 if (QDF_STATUS_SUCCESS !=
gaurank kathpalia36b0c582018-08-28 17:45:43 +05303489 scheduler_post_message(QDF_MODULE_ID_SME,
3490 QDF_MODULE_ID_WMA,
3491 QDF_MODULE_ID_WMA, &msg)) {
Masti, Narayanraddiab712a72016-08-04 11:59:11 +05303492 qdf_mem_free(update_key);
3493 return QDF_STATUS_E_FAILURE;
3494 }
3495
3496 return QDF_STATUS_SUCCESS;
3497}
3498
3499
Jeff Johnson8bd23352017-09-26 11:39:24 -07003500/**
3501 * sme_get_rssi() - API to retrieve current RSSI
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -08003502 * @mac_handle: Opaque handle to the global MAC context
Jeff Johnson8bd23352017-09-26 11:39:24 -07003503 * @callback: SME sends back the requested stats using the callback
3504 * @staId: The station ID for which the RSSI is requested for
3505 * @bssid: The bssid of the connected session
3506 * @lastRSSI: RSSI value at time of request. In case fw cannot provide
3507 * RSSI, do not hold up but return this value.
3508 * @pContext: user context to be passed back along with the callback
3509 *
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303510 * A wrapper function that client calls to register a callback to get RSSI
3511 *
Jeff Johnson8bd23352017-09-26 11:39:24 -07003512 * Return: QDF_STATUS
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303513 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08003514QDF_STATUS sme_get_rssi(mac_handle_t mac_handle,
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303515 tCsrRssiCallback callback, uint8_t staId,
3516 struct qdf_mac_addr bssId, int8_t lastRSSI,
Jeff Johnson8bd23352017-09-26 11:39:24 -07003517 void *pContext)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003518{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303519 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08003520 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003521
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303522 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003523 TRACE_CODE_SME_RX_HDD_GET_RSSI, NO_SESSION, 0));
Jeff Johnson01f2c232018-11-21 19:17:44 -08003524 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303525 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08003526 status = csr_get_rssi(mac, callback,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003527 staId, bssId, lastRSSI,
Jeff Johnson8bd23352017-09-26 11:39:24 -07003528 pContext);
Jeff Johnson01f2c232018-11-21 19:17:44 -08003529 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003530 }
3531 return status;
3532}
3533
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303534/*
3535 * sme_get_snr() -
3536 * A wrapper function that client calls to register a callback to get SNR
3537 *
3538 * callback - SME sends back the requested stats using the callback
3539 * staId - The station ID for which the stats is requested for
3540 * pContext - user context to be passed back along with the callback
3541 * p_cds_context - cds context
3542 * \return QDF_STATUS
3543 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08003544QDF_STATUS sme_get_snr(mac_handle_t mac_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003545 tCsrSnrCallback callback,
Anurag Chouhan6d760662016-02-20 16:05:43 +05303546 uint8_t staId, struct qdf_mac_addr bssId, void *pContext)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003547{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303548 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08003549 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003550
Jeff Johnson01f2c232018-11-21 19:17:44 -08003551 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303552 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08003553 status = csr_get_snr(mac, callback, staId, bssId, pContext);
3554 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003555 }
3556 return status;
3557}
3558
Naveen Rawatfa2a1002018-05-17 16:06:37 -07003559#ifndef QCA_SUPPORT_CP_STATS
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303560/*
3561 * sme_get_statistics() -
3562 * A wrapper function that client calls to register a callback to get
3563 * different PHY level statistics from CSR.
3564 *
3565 * requesterId - different client requesting for statistics,
3566 * HDD, UMA/GAN etc
3567 * statsMask - The different category/categories of stats requester
3568 * is looking for
3569 * callback - SME sends back the requested stats using the callback
3570 * periodicity - If requester needs periodic update in millisec, 0 means
3571 * it's an one time request
3572 * cache - If requester is happy with cached stats
3573 * staId - The station ID for which the stats is requested for
3574 * pContext - user context to be passed back along with the callback
3575 * sessionId - sme session interface
3576 * Return QDF_STATUS
3577 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08003578QDF_STATUS sme_get_statistics(mac_handle_t mac_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003579 eCsrStatsRequesterType requesterId,
3580 uint32_t statsMask, tCsrStatsCallback callback,
Naveen Rawatd0ca4412017-06-16 14:19:19 -07003581 uint8_t staId, void *pContext, uint8_t sessionId)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003582{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303583 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08003584 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003585
Jeff Johnson01f2c232018-11-21 19:17:44 -08003586 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303587 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08003588 status = csr_get_statistics(mac, requesterId, statsMask,
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303589 callback, staId, pContext,
3590 sessionId);
Jeff Johnson01f2c232018-11-21 19:17:44 -08003591 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003592 }
3593
3594 return status;
3595
3596}
Naveen Rawatfa2a1002018-05-17 16:06:37 -07003597#endif
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003598
Jeff Johnsonca7a7162018-07-07 12:56:54 -07003599QDF_STATUS sme_get_link_status(mac_handle_t mac_handle,
3600 csr_link_status_callback callback,
3601 void *context, uint8_t session_id)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003602{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303603 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08003604 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Jeff Johnsonca7a7162018-07-07 12:56:54 -07003605 tAniGetLinkStatus *msg;
Rajeev Kumar37d478b2017-04-17 16:59:28 -07003606 struct scheduler_msg message = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003607
Jeff Johnsonca7a7162018-07-07 12:56:54 -07003608 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303609 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnsonca7a7162018-07-07 12:56:54 -07003610 msg = qdf_mem_malloc(sizeof(*msg));
3611 if (!msg) {
Jeff Johnsonca7a7162018-07-07 12:56:54 -07003612 sme_release_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303613 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003614 }
3615
Jeff Johnsonca7a7162018-07-07 12:56:54 -07003616 msg->msgType = WMA_LINK_STATUS_GET_REQ;
3617 msg->msgLen = sizeof(*msg);
3618 msg->sessionId = session_id;
3619 mac->sme.link_status_context = context;
3620 mac->sme.link_status_callback = callback;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003621
Rajeev Kumar8eaedf62017-01-21 11:03:13 -08003622 message.type = WMA_LINK_STATUS_GET_REQ;
Jeff Johnsonca7a7162018-07-07 12:56:54 -07003623 message.bodyptr = msg;
Rajeev Kumar8eaedf62017-01-21 11:03:13 -08003624 message.reserved = 0;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003625
gaurank kathpalia36b0c582018-08-28 17:45:43 +05303626 status = scheduler_post_message(QDF_MODULE_ID_SME,
3627 QDF_MODULE_ID_WMA,
3628 QDF_MODULE_ID_WMA, &message);
Jeff Johnsonca7a7162018-07-07 12:56:54 -07003629 if (QDF_IS_STATUS_ERROR(status)) {
3630 sme_err("post msg failed, %d", status);
3631 qdf_mem_free(msg);
3632 mac->sme.link_status_context = NULL;
3633 mac->sme.link_status_callback = NULL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003634 }
3635
Jeff Johnsonca7a7162018-07-07 12:56:54 -07003636 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003637 }
3638
3639 return status;
3640}
3641
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303642/*
3643 * sme_get_country_code() -
3644 * To return the current country code. If no country code is applied,
3645 * default country code is used to fill the buffer.
3646 * If 11d supported is turned off, an error is return and the last
3647 * applied/default country code is used.
3648 * This is a synchronous API.
3649 *
3650 * pBuf - pointer to a caller allocated buffer for returned country code.
3651 * pbLen For input, this parameter indicates how big is the buffer.
3652 * Upon return, this parameter has the number of bytes for
3653 * country. If pBuf doesn't have enough space, this function
3654 * returns fail status and this parameter contains the number
3655 * that is needed.
3656 *
3657 * Return QDF_STATUS SUCCESS.
3658 *
3659 * FAILURE or RESOURCES The API finished and failed.
3660 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08003661QDF_STATUS sme_get_country_code(mac_handle_t mac_handle, uint8_t *pBuf,
Jeff Johnson1f2dabc2018-11-07 15:33:01 -08003662 uint8_t *pbLen)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003663{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08003664 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003665
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303666 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003667 TRACE_CODE_SME_RX_HDD_GET_CNTRYCODE, NO_SESSION, 0));
3668
Jeff Johnson01f2c232018-11-21 19:17:44 -08003669 return csr_get_country_code(mac, pBuf, pbLen);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003670}
3671
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303672/*
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303673 * sme_generic_change_country_code() -
3674 * Change Country code from upperlayer during WLAN driver operation.
3675 * This is a synchronous API.
3676 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08003677 * mac_handle - The handle returned by mac_open.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303678 * pCountry New Country Code String
3679 * reg_domain regulatory domain
3680 * Return QDF_STATUS SUCCESS.
3681 * FAILURE or RESOURCES The API finished and failed.
3682 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08003683QDF_STATUS sme_generic_change_country_code(mac_handle_t mac_handle,
Amar Singhal7f1f3ec2015-10-13 17:14:08 -07003684 uint8_t *pCountry)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003685{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303686 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08003687 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Rajeev Kumar37d478b2017-04-17 16:59:28 -07003688 struct scheduler_msg msg = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003689 tAniGenericChangeCountryCodeReq *pMsg;
3690
Jeff Johnson038efe72019-03-18 13:39:31 -07003691 if (!mac) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303692 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_FATAL,
Jeff Johnson01f2c232018-11-21 19:17:44 -08003693 "%s: mac is null", __func__);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003694 return status;
3695 }
3696
Jeff Johnson01f2c232018-11-21 19:17:44 -08003697 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303698 if (QDF_IS_STATUS_SUCCESS(status)) {
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303699 pMsg = qdf_mem_malloc(sizeof(tAniGenericChangeCountryCodeReq));
Arif Hussain0ef77082018-10-10 16:42:53 -07003700 if (!pMsg) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08003701 sme_release_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303702 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003703 }
3704
3705 pMsg->msgType = eWNI_SME_GENERIC_CHANGE_COUNTRY_CODE;
3706 pMsg->msgLen =
3707 (uint16_t) sizeof(tAniGenericChangeCountryCodeReq);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303708 qdf_mem_copy(pMsg->countryCode, pCountry, 2);
Amar Singhal7f1f3ec2015-10-13 17:14:08 -07003709 pMsg->countryCode[2] = ' ';
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003710
3711 msg.type = eWNI_SME_GENERIC_CHANGE_COUNTRY_CODE;
3712 msg.bodyptr = pMsg;
3713 msg.reserved = 0;
3714
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303715 if (QDF_STATUS_SUCCESS !=
gaurank kathpalia36b0c582018-08-28 17:45:43 +05303716 scheduler_post_message(QDF_MODULE_ID_SME,
3717 QDF_MODULE_ID_SME,
3718 QDF_MODULE_ID_SME, &msg)) {
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303719 qdf_mem_free(pMsg);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303720 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003721 }
Jeff Johnson01f2c232018-11-21 19:17:44 -08003722 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003723 }
3724
3725 return status;
3726}
3727
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303728/*
3729 * sme_dhcp_start_ind() -
3730 * API to signal the FW about the DHCP Start event.
3731 *
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -08003732 * mac_handle: Opaque handle to the global MAC context.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303733 * device_mode - mode(AP,SAP etc) of the device.
3734 * macAddr - MAC address of the adapter.
3735 * sessionId - session ID.
3736 * Return QDF_STATUS SUCCESS.
3737 * FAILURE or RESOURCES The API finished and failed.
3738 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08003739QDF_STATUS sme_dhcp_start_ind(mac_handle_t mac_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003740 uint8_t device_mode,
3741 uint8_t *macAddr, uint8_t sessionId)
3742{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303743 QDF_STATUS status;
3744 QDF_STATUS qdf_status;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08003745 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Rajeev Kumar37d478b2017-04-17 16:59:28 -07003746 struct scheduler_msg message = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003747 tAniDHCPInd *pMsg;
gaurank kathpalia14e2f912017-08-31 14:51:45 +05303748 struct csr_roam_session *pSession;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003749
Jeff Johnson01f2c232018-11-21 19:17:44 -08003750 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303751 if (QDF_STATUS_SUCCESS == status) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08003752 pSession = CSR_GET_SESSION(mac, sessionId);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003753
3754 if (!pSession) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07003755 sme_err("Session: %d not found", sessionId);
Jeff Johnson01f2c232018-11-21 19:17:44 -08003756 sme_release_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303757 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003758 }
Arif Hussain3316f402016-11-10 13:08:03 -08003759 pSession->dhcp_done = false;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003760
Arif Hussain0ef77082018-10-10 16:42:53 -07003761 pMsg = qdf_mem_malloc(sizeof(tAniDHCPInd));
3762 if (!pMsg) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08003763 sme_release_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303764 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003765 }
3766 pMsg->msgType = WMA_DHCP_START_IND;
3767 pMsg->msgLen = (uint16_t) sizeof(tAniDHCPInd);
3768 pMsg->device_mode = device_mode;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303769 qdf_mem_copy(pMsg->adapterMacAddr.bytes, macAddr,
Anurag Chouhan6d760662016-02-20 16:05:43 +05303770 QDF_MAC_ADDR_SIZE);
Anurag Chouhanc5548422016-02-24 18:33:27 +05303771 qdf_copy_macaddr(&pMsg->peerMacAddr,
Srinivas Girigowda296105a2015-09-24 16:31:16 -07003772 &pSession->connectedProfile.bssid);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003773
Rajeev Kumar8eaedf62017-01-21 11:03:13 -08003774 message.type = WMA_DHCP_START_IND;
3775 message.bodyptr = pMsg;
3776 message.reserved = 0;
Sreelakshmi Konamki6a065362016-05-31 16:05:01 +05303777 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
Rajeev Kumar8eaedf62017-01-21 11:03:13 -08003778 sessionId, message.type));
gaurank kathpalia36b0c582018-08-28 17:45:43 +05303779 qdf_status = scheduler_post_message(QDF_MODULE_ID_SME,
3780 QDF_MODULE_ID_WMA,
3781 QDF_MODULE_ID_WMA,
3782 &message);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303783 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303784 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003785 "%s: Post DHCP Start MSG fail", __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303786 qdf_mem_free(pMsg);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303787 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003788 }
Jeff Johnson01f2c232018-11-21 19:17:44 -08003789 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003790 }
3791 return status;
3792}
3793
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303794/*
3795 * sme_dhcp_stop_ind() -
3796 * API to signal the FW about the DHCP complete event.
3797 *
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -08003798 * mac_handle: Opaque handle to the global MAC context.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303799 * device_mode - mode(AP, SAP etc) of the device.
3800 * macAddr - MAC address of the adapter.
3801 * sessionId - session ID.
3802 * Return QDF_STATUS SUCCESS.
3803 * FAILURE or RESOURCES The API finished and failed.
3804 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08003805QDF_STATUS sme_dhcp_stop_ind(mac_handle_t mac_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003806 uint8_t device_mode,
3807 uint8_t *macAddr, uint8_t sessionId)
3808{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303809 QDF_STATUS status;
3810 QDF_STATUS qdf_status;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08003811 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Rajeev Kumar37d478b2017-04-17 16:59:28 -07003812 struct scheduler_msg message = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003813 tAniDHCPInd *pMsg;
gaurank kathpalia14e2f912017-08-31 14:51:45 +05303814 struct csr_roam_session *pSession;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003815
Jeff Johnson01f2c232018-11-21 19:17:44 -08003816 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303817 if (QDF_STATUS_SUCCESS == status) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08003818 pSession = CSR_GET_SESSION(mac, sessionId);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003819
3820 if (!pSession) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07003821 sme_err("Session: %d not found", sessionId);
Jeff Johnson01f2c232018-11-21 19:17:44 -08003822 sme_release_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303823 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003824 }
Arif Hussain3316f402016-11-10 13:08:03 -08003825 pSession->dhcp_done = true;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003826
Arif Hussain0ef77082018-10-10 16:42:53 -07003827 pMsg = qdf_mem_malloc(sizeof(tAniDHCPInd));
3828 if (!pMsg) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08003829 sme_release_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303830 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003831 }
3832
3833 pMsg->msgType = WMA_DHCP_STOP_IND;
3834 pMsg->msgLen = (uint16_t) sizeof(tAniDHCPInd);
3835 pMsg->device_mode = device_mode;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303836 qdf_mem_copy(pMsg->adapterMacAddr.bytes, macAddr,
Anurag Chouhan6d760662016-02-20 16:05:43 +05303837 QDF_MAC_ADDR_SIZE);
Anurag Chouhanc5548422016-02-24 18:33:27 +05303838 qdf_copy_macaddr(&pMsg->peerMacAddr,
Srinivas Girigowda296105a2015-09-24 16:31:16 -07003839 &pSession->connectedProfile.bssid);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003840
Rajeev Kumar8eaedf62017-01-21 11:03:13 -08003841 message.type = WMA_DHCP_STOP_IND;
3842 message.bodyptr = pMsg;
3843 message.reserved = 0;
Sreelakshmi Konamki6a065362016-05-31 16:05:01 +05303844 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
Rajeev Kumar8eaedf62017-01-21 11:03:13 -08003845 sessionId, message.type));
gaurank kathpalia36b0c582018-08-28 17:45:43 +05303846 qdf_status = scheduler_post_message(QDF_MODULE_ID_SME,
3847 QDF_MODULE_ID_WMA,
3848 QDF_MODULE_ID_WMA,
3849 &message);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303850 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303851 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003852 "%s: Post DHCP Stop MSG fail", __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303853 qdf_mem_free(pMsg);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303854 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003855 }
3856
Jeff Johnson01f2c232018-11-21 19:17:44 -08003857 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003858 }
3859 return status;
3860}
3861
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303862/*
3863 * sme_TXFailMonitorStopInd() -
3864 * API to signal the FW to start monitoring TX failures
3865 *
3866 * Return QDF_STATUS SUCCESS.
3867 * FAILURE or RESOURCES The API finished and failed.
3868 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08003869QDF_STATUS sme_tx_fail_monitor_start_stop_ind(mac_handle_t mac_handle,
3870 uint8_t tx_fail_count,
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08003871 void *txFailIndCallback)
3872{
3873 QDF_STATUS status;
3874 QDF_STATUS qdf_status;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08003875 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Rajeev Kumar37d478b2017-04-17 16:59:28 -07003876 struct scheduler_msg message = {0};
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08003877 tAniTXFailMonitorInd *pMsg;
3878
Jeff Johnson01f2c232018-11-21 19:17:44 -08003879 status = sme_acquire_global_lock(&mac->sme);
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08003880 if (QDF_STATUS_SUCCESS == status) {
Arif Hussain0ef77082018-10-10 16:42:53 -07003881 pMsg = qdf_mem_malloc(sizeof(tAniTXFailMonitorInd));
3882 if (!pMsg) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08003883 sme_release_global_lock(&mac->sme);
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08003884 return QDF_STATUS_E_NOMEM;
3885 }
3886
3887 pMsg->msgType = WMA_TX_FAIL_MONITOR_IND;
3888 pMsg->msgLen = (uint16_t) sizeof(tAniTXFailMonitorInd);
3889
3890 /* tx_fail_count = 0 should disable the Monitoring in FW */
3891 pMsg->tx_fail_count = tx_fail_count;
3892 pMsg->txFailIndCallback = txFailIndCallback;
3893
Rajeev Kumar8eaedf62017-01-21 11:03:13 -08003894 message.type = WMA_TX_FAIL_MONITOR_IND;
3895 message.bodyptr = pMsg;
3896 message.reserved = 0;
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08003897
gaurank kathpalia36b0c582018-08-28 17:45:43 +05303898 qdf_status = scheduler_post_message(QDF_MODULE_ID_SME,
3899 QDF_MODULE_ID_WMA,
3900 QDF_MODULE_ID_WMA,
3901 &message);
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08003902 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
3903 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
3904 "%s: Post TX Fail monitor Start MSG fail",
3905 __func__);
3906 qdf_mem_free(pMsg);
3907 status = QDF_STATUS_E_FAILURE;
3908 }
Jeff Johnson01f2c232018-11-21 19:17:44 -08003909 sme_release_global_lock(&mac->sme);
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08003910 }
3911 return status;
3912}
3913
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303914/*
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303915 * sme_neighbor_report_request() -
3916 * API to request neighbor report.
3917 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08003918 * mac_handle - The handle returned by mac_open.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303919 * pRrmNeighborReq - Pointer to a caller allocated object of type
3920 * tRrmNeighborReq. Caller owns the memory and is
3921 * responsible for freeing it.
3922 * Return QDF_STATUS
3923 * QDF_STATUS_E_FAILURE - failure
3924 * QDF_STATUS_SUCCESS success
3925 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08003926QDF_STATUS sme_neighbor_report_request(
3927 mac_handle_t mac_handle,
3928 uint8_t sessionId,
3929 tpRrmNeighborReq pRrmNeighborReq,
3930 tpRrmNeighborRspCallbackInfo callbackInfo)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003931{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303932 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08003933 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303934
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303935 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003936 TRACE_CODE_SME_RX_HDD_NEIGHBOR_REPORTREQ, NO_SESSION,
3937 0));
3938
Vignesh Viswanathan694e28e2018-01-18 20:53:57 +05303939 if (pRrmNeighborReq->neighbor_report_offload) {
3940 status = csr_invoke_neighbor_report_request(sessionId,
3941 pRrmNeighborReq,
3942 false);
3943 return status;
3944 }
3945
Jeff Johnson01f2c232018-11-21 19:17:44 -08003946 if (QDF_STATUS_SUCCESS == sme_acquire_global_lock(&mac->sme)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003947 status =
Jeff Johnson01f2c232018-11-21 19:17:44 -08003948 sme_rrm_neighbor_report_request(mac, sessionId,
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303949 pRrmNeighborReq, callbackInfo);
Jeff Johnson01f2c232018-11-21 19:17:44 -08003950 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003951 }
3952
3953 return status;
3954}
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003955
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003956#ifdef FEATURE_OEM_DATA_SUPPORT
Krishna Kumaar Natarajanc5e06ac2016-06-30 16:49:19 -07003957/**
3958 * sme_oem_data_req() - send oem data request to WMA
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -08003959 * @mac_handle: Opaque handle to the global MAC context
Krishna Kumaar Natarajanc5e06ac2016-06-30 16:49:19 -07003960 * @hdd_oem_req: OEM data request from HDD
3961 *
3962 * Return: QDF_STATUS
3963 */
Jeff Johnsonc7309062018-11-09 20:59:42 -08003964QDF_STATUS sme_oem_data_req(mac_handle_t mac_handle,
3965 struct oem_data_req *hdd_oem_req)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003966{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303967 QDF_STATUS status = QDF_STATUS_SUCCESS;
Krishna Kumaar Natarajanc1fa17d2016-08-03 14:19:20 -07003968 struct oem_data_req *oem_data_req;
Krishna Kumaar Natarajanc5e06ac2016-06-30 16:49:19 -07003969 void *wma_handle;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003970
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07003971 SME_ENTER();
Krishna Kumaar Natarajanc5e06ac2016-06-30 16:49:19 -07003972 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
3973 if (!wma_handle) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07003974 sme_err("wma_handle is NULL");
Krishna Kumaar Natarajanc5e06ac2016-06-30 16:49:19 -07003975 return QDF_STATUS_E_FAILURE;
3976 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003977
Krishna Kumaar Natarajanc5e06ac2016-06-30 16:49:19 -07003978 oem_data_req = qdf_mem_malloc(sizeof(*oem_data_req));
Arif Hussain0ef77082018-10-10 16:42:53 -07003979 if (!oem_data_req)
Krishna Kumaar Natarajanc5e06ac2016-06-30 16:49:19 -07003980 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003981
Krishna Kumaar Natarajanc5e06ac2016-06-30 16:49:19 -07003982 oem_data_req->data_len = hdd_oem_req->data_len;
3983 oem_data_req->data = qdf_mem_malloc(oem_data_req->data_len);
Arif Hussain0ef77082018-10-10 16:42:53 -07003984 if (!oem_data_req->data)
Krishna Kumaar Natarajanc5e06ac2016-06-30 16:49:19 -07003985 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003986
Krishna Kumaar Natarajanc5e06ac2016-06-30 16:49:19 -07003987 qdf_mem_copy(oem_data_req->data, hdd_oem_req->data,
3988 oem_data_req->data_len);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003989
Krishna Kumaar Natarajanc5e06ac2016-06-30 16:49:19 -07003990 status = wma_start_oem_data_req(wma_handle, oem_data_req);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003991
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303992 if (!QDF_IS_STATUS_SUCCESS(status))
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07003993 sme_err("Post oem data request msg fail");
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05303994 else
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07003995 sme_debug("OEM request(length: %d) sent to WMA",
3996 oem_data_req->data_len);
Krishna Kumaar Natarajanc5e06ac2016-06-30 16:49:19 -07003997
3998 if (oem_data_req->data_len)
3999 qdf_mem_free(oem_data_req->data);
4000 qdf_mem_free(oem_data_req);
4001
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07004002 SME_EXIT();
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004003 return status;
4004}
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004005#endif /*FEATURE_OEM_DATA_SUPPORT */
4006
gaurank kathpalia78af1932018-10-27 20:33:10 +05304007#define STA_NSS_CHAINS_SHIFT 0
4008#define SAP_NSS_CHAINS_SHIFT 3
4009#define P2P_GO_NSS_CHAINS_SHIFT 6
4010#define P2P_CLI_CHAINS_SHIFT 9
gaurank kathpalia651abcd2018-11-12 22:41:23 +05304011#define TDLS_NSS_CHAINS_SHIFT 12
gaurank kathpalia78af1932018-10-27 20:33:10 +05304012#define IBSS_NSS_CHAINS_SHIFT 15
4013#define P2P_DEV_NSS_CHAINS_SHIFT 18
4014#define OCB_NSS_CHAINS_SHIFT 21
4015#define NAN_NSS_CHAIN_SHIFT 24
4016#define NSS_CHAIN_MASK 0x7
4017#define GET_VDEV_NSS_CHAIN(x, y) (((x) >> (y)) & NSS_CHAIN_MASK)
4018
4019static uint8_t sme_get_nss_chain_shift(enum QDF_OPMODE device_mode)
4020{
4021 switch (device_mode) {
4022 case QDF_STA_MODE:
4023 return STA_NSS_CHAINS_SHIFT;
4024 case QDF_SAP_MODE:
4025 return SAP_NSS_CHAINS_SHIFT;
4026 case QDF_P2P_GO_MODE:
4027 return P2P_GO_NSS_CHAINS_SHIFT;
4028 case QDF_P2P_CLIENT_MODE:
4029 return P2P_CLI_CHAINS_SHIFT;
4030 case QDF_IBSS_MODE:
4031 return IBSS_NSS_CHAINS_SHIFT;
4032 case QDF_P2P_DEVICE_MODE:
4033 return P2P_DEV_NSS_CHAINS_SHIFT;
4034 case QDF_OCB_MODE:
4035 return OCB_NSS_CHAINS_SHIFT;
gaurank kathpalia651abcd2018-11-12 22:41:23 +05304036 case QDF_TDLS_MODE:
4037 return TDLS_NSS_CHAINS_SHIFT;
gaurank kathpalia78af1932018-10-27 20:33:10 +05304038
4039 default:
4040 sme_err("Device mode %d invalid", device_mode);
4041 return STA_NSS_CHAINS_SHIFT;
4042 }
4043}
4044
4045static void
gaurank kathpaliacbf12122018-11-18 14:52:11 +05304046sme_check_nss_chain_ini_param(struct wlan_mlme_nss_chains *vdev_ini_cfg,
4047 uint8_t rf_chains_supported,
4048 enum nss_chains_band_info band)
4049{
4050 vdev_ini_cfg->rx_nss[band] = QDF_MIN(vdev_ini_cfg->rx_nss[band],
4051 rf_chains_supported);
4052 vdev_ini_cfg->tx_nss[band] = QDF_MIN(vdev_ini_cfg->tx_nss[band],
4053 rf_chains_supported);
4054}
4055
4056static void
gaurank kathpalia24ed0f42018-11-13 15:37:49 +05304057sme_fill_nss_chain_params(struct mac_context *mac_ctx,
gaurank kathpalia78af1932018-10-27 20:33:10 +05304058 struct wlan_mlme_nss_chains *vdev_ini_cfg,
4059 enum QDF_OPMODE device_mode,
4060 enum nss_chains_band_info band,
4061 uint8_t rf_chains_supported)
4062{
4063 uint8_t nss_chain_shift;
4064 uint8_t max_supported_nss;
4065 struct wlan_mlme_nss_chains *nss_chains_ini_cfg =
4066 &mac_ctx->mlme_cfg->nss_chains_ini_cfg;
4067
4068 nss_chain_shift = sme_get_nss_chain_shift(device_mode);
4069 max_supported_nss = mac_ctx->mlme_cfg->vht_caps.vht_cap_info.enable2x2 ?
4070 MAX_VDEV_NSS : 1;
4071
Nachiket Kukaded4d40bc2019-01-21 17:54:12 +05304072 /*
4073 * If target supports Antenna sharing, set NSS to 1 for 2.4GHz band for
4074 * NDI vdev.
4075 */
4076 if (device_mode == QDF_NDI_MODE && mac_ctx->lteCoexAntShare &&
4077 band == NSS_CHAINS_BAND_2GHZ)
4078 max_supported_nss = NSS_1x1_MODE;
4079
gaurank kathpalia78af1932018-10-27 20:33:10 +05304080 /* If the fw doesn't support two chains, num rf chains can max be 1 */
4081 vdev_ini_cfg->num_rx_chains[band] =
4082 QDF_MIN(GET_VDEV_NSS_CHAIN(
4083 nss_chains_ini_cfg->num_rx_chains[band],
4084 nss_chain_shift), rf_chains_supported);
4085
4086 vdev_ini_cfg->num_tx_chains[band] =
4087 QDF_MIN(GET_VDEV_NSS_CHAIN(
4088 nss_chains_ini_cfg->num_tx_chains[band],
4089 nss_chain_shift), rf_chains_supported);
4090
4091 /* If 2x2 mode is disabled, then max rx, tx nss can be 1 */
4092 vdev_ini_cfg->rx_nss[band] =
4093 QDF_MIN(GET_VDEV_NSS_CHAIN(
4094 nss_chains_ini_cfg->rx_nss[band],
4095 nss_chain_shift), max_supported_nss);
4096
4097 vdev_ini_cfg->tx_nss[band] =
4098 QDF_MIN(GET_VDEV_NSS_CHAIN(
4099 nss_chains_ini_cfg->tx_nss[band],
4100 nss_chain_shift), max_supported_nss);
4101
4102 vdev_ini_cfg->num_tx_chains_11a =
4103 QDF_MIN(GET_VDEV_NSS_CHAIN(
4104 nss_chains_ini_cfg->num_tx_chains_11a,
4105 nss_chain_shift), rf_chains_supported);
4106
4107 /* If the fw doesn't support two chains, num rf chains can max be 1 */
4108 vdev_ini_cfg->num_tx_chains_11b =
4109 QDF_MIN(GET_VDEV_NSS_CHAIN(
4110 nss_chains_ini_cfg->num_tx_chains_11b,
4111 nss_chain_shift), rf_chains_supported);
4112
4113 vdev_ini_cfg->num_tx_chains_11g =
4114 QDF_MIN(GET_VDEV_NSS_CHAIN(
4115 nss_chains_ini_cfg->num_tx_chains_11g,
4116 nss_chain_shift), rf_chains_supported);
4117
4118 vdev_ini_cfg->disable_rx_mrc[band] =
4119 nss_chains_ini_cfg->disable_rx_mrc[band];
4120
4121 vdev_ini_cfg->disable_tx_mrc[band] =
4122 nss_chains_ini_cfg->disable_tx_mrc[band];
gaurank kathpaliacbf12122018-11-18 14:52:11 +05304123 /*
4124 * Check whether the rx/tx nss is greater than the number of rf chains
4125 * supported by FW, if so downgrade the nss to the number of chains
4126 * supported, as higher nss cannot be supported with less chains.
4127 */
4128 sme_check_nss_chain_ini_param(vdev_ini_cfg, rf_chains_supported,
4129 band);
4130
gaurank kathpalia78af1932018-10-27 20:33:10 +05304131}
4132
4133void sme_populate_nss_chain_params(mac_handle_t mac_handle,
4134 struct wlan_mlme_nss_chains *vdev_ini_cfg,
4135 enum QDF_OPMODE device_mode,
4136 uint8_t rf_chains_supported)
4137{
gaurank kathpalia24ed0f42018-11-13 15:37:49 +05304138 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
gaurank kathpalia78af1932018-10-27 20:33:10 +05304139 enum nss_chains_band_info band;
4140
gaurank kathpaliab414bce2018-11-09 18:44:46 +05304141 for (band = NSS_CHAINS_BAND_2GHZ; band < NSS_CHAINS_BAND_MAX; band++)
gaurank kathpalia78af1932018-10-27 20:33:10 +05304142 sme_fill_nss_chain_params(mac_ctx, vdev_ini_cfg,
4143 device_mode, band,
4144 rf_chains_supported);
4145}
4146
gaurank kathpaliab414bce2018-11-09 18:44:46 +05304147void
4148sme_store_nss_chains_cfg_in_vdev(struct wlan_objmgr_vdev *vdev,
4149 struct wlan_mlme_nss_chains *vdev_ini_cfg)
4150{
4151 struct wlan_mlme_nss_chains *ini_cfg;
4152 struct wlan_mlme_nss_chains *dynamic_cfg;
4153
4154 ini_cfg = mlme_get_ini_vdev_config(vdev);
4155 dynamic_cfg = mlme_get_dynamic_vdev_config(vdev);
4156
4157 if (!ini_cfg || !dynamic_cfg) {
4158 sme_err("Nss chains ini/dynamic config NULL vdev_id %d",
4159 vdev->vdev_objmgr.vdev_id);
4160 return;
4161 }
4162
4163 *ini_cfg = *vdev_ini_cfg;
4164 *dynamic_cfg = *vdev_ini_cfg;
4165}
4166
gaurank kathpalia2b32de02018-10-24 18:31:14 +05304167static void
4168sme_populate_user_config(struct wlan_mlme_nss_chains *dynamic_cfg,
4169 struct wlan_mlme_nss_chains *user_cfg,
4170 enum nss_chains_band_info band)
4171{
4172 if (!user_cfg->num_rx_chains[band])
4173 user_cfg->num_rx_chains[band] =
4174 dynamic_cfg->num_rx_chains[band];
4175
4176 if (!user_cfg->num_tx_chains[band])
4177 user_cfg->num_tx_chains[band] =
4178 dynamic_cfg->num_tx_chains[band];
4179
4180 if (!user_cfg->rx_nss[band])
4181 user_cfg->rx_nss[band] =
4182 dynamic_cfg->rx_nss[band];
4183
4184 if (!user_cfg->tx_nss[band])
4185 user_cfg->tx_nss[band] =
4186 dynamic_cfg->tx_nss[band];
4187
4188 if (!user_cfg->num_tx_chains_11a)
4189 user_cfg->num_tx_chains_11a =
4190 dynamic_cfg->num_tx_chains_11a;
4191
4192 if (!user_cfg->num_tx_chains_11b)
4193 user_cfg->num_tx_chains_11b =
4194 dynamic_cfg->num_tx_chains_11b;
4195
4196 if (!user_cfg->num_tx_chains_11g)
4197 user_cfg->num_tx_chains_11g =
4198 dynamic_cfg->num_tx_chains_11g;
4199
4200 if (!user_cfg->disable_rx_mrc[band])
4201 user_cfg->disable_rx_mrc[band] =
4202 dynamic_cfg->disable_rx_mrc[band];
4203
4204 if (!user_cfg->disable_tx_mrc[band])
4205 user_cfg->disable_tx_mrc[band] =
4206 dynamic_cfg->disable_tx_mrc[band];
4207}
4208
4209static QDF_STATUS
4210sme_validate_from_ini_config(struct wlan_mlme_nss_chains *user_cfg,
4211 struct wlan_mlme_nss_chains *ini_cfg,
4212 enum nss_chains_band_info band)
4213{
4214 if (user_cfg->num_rx_chains[band] >
4215 ini_cfg->num_rx_chains[band])
4216 return QDF_STATUS_E_FAILURE;
4217
4218 if (user_cfg->num_tx_chains[band] >
4219 ini_cfg->num_tx_chains[band])
4220 return QDF_STATUS_E_FAILURE;
4221
4222 if (user_cfg->rx_nss[band] >
4223 ini_cfg->rx_nss[band])
4224 return QDF_STATUS_E_FAILURE;
4225
4226 if (user_cfg->tx_nss[band] >
4227 ini_cfg->tx_nss[band])
4228 return QDF_STATUS_E_FAILURE;
4229
4230 if (user_cfg->num_tx_chains_11a >
4231 ini_cfg->num_tx_chains_11a)
4232 return QDF_STATUS_E_FAILURE;
4233
4234 if (user_cfg->num_tx_chains_11b >
4235 ini_cfg->num_tx_chains_11b)
4236 return QDF_STATUS_E_FAILURE;
4237
4238 if (user_cfg->num_tx_chains_11g >
4239 ini_cfg->num_tx_chains_11g)
4240 return QDF_STATUS_E_FAILURE;
4241
4242 return QDF_STATUS_SUCCESS;
4243}
4244
4245static QDF_STATUS
4246sme_validate_user_nss_chain_params(
4247 struct wlan_mlme_nss_chains *user_cfg,
4248 enum nss_chains_band_info band)
4249{
4250 /* Reject as 2x1 modes are not supported in chains yet */
4251
4252 if (user_cfg->num_tx_chains[band] >
4253 user_cfg->num_rx_chains[band])
4254 return QDF_STATUS_E_FAILURE;
4255
4256 /* Also if mode is 2x2, we cant have chains as 1x1, or 1x2, or 2x1 */
4257
4258 if (user_cfg->tx_nss[band] >
4259 user_cfg->num_tx_chains[band])
4260 user_cfg->num_tx_chains[band] =
4261 user_cfg->tx_nss[band];
4262
4263 if (user_cfg->rx_nss[band] >
4264 user_cfg->num_rx_chains[band])
4265 user_cfg->num_rx_chains[band] =
4266 user_cfg->rx_nss[band];
4267
4268 /*
4269 * It may happen that already chains are in 1x1 mode and nss too
4270 * is in 1x1 mode, but the tx 11a/b/g chains in user config comes
4271 * as 2x1, or 1x2 which cannot support respective mode, as tx chains
4272 * for respective band have max of 1x1 only, so these cannot exceed
4273 * respective band num tx chains.
4274 */
4275
4276 if (user_cfg->num_tx_chains_11a >
gaurank kathpaliab414bce2018-11-09 18:44:46 +05304277 user_cfg->num_tx_chains[NSS_CHAINS_BAND_5GHZ])
gaurank kathpalia2b32de02018-10-24 18:31:14 +05304278 user_cfg->num_tx_chains_11a =
gaurank kathpaliab414bce2018-11-09 18:44:46 +05304279 user_cfg->num_tx_chains[NSS_CHAINS_BAND_5GHZ];
gaurank kathpalia2b32de02018-10-24 18:31:14 +05304280
4281 if (user_cfg->num_tx_chains_11b >
gaurank kathpaliab414bce2018-11-09 18:44:46 +05304282 user_cfg->num_tx_chains[NSS_CHAINS_BAND_2GHZ])
gaurank kathpalia2b32de02018-10-24 18:31:14 +05304283 user_cfg->num_tx_chains_11b =
gaurank kathpaliab414bce2018-11-09 18:44:46 +05304284 user_cfg->num_tx_chains[NSS_CHAINS_BAND_2GHZ];
gaurank kathpalia2b32de02018-10-24 18:31:14 +05304285
4286 if (user_cfg->num_tx_chains_11g >
gaurank kathpaliab414bce2018-11-09 18:44:46 +05304287 user_cfg->num_tx_chains[NSS_CHAINS_BAND_2GHZ])
gaurank kathpalia2b32de02018-10-24 18:31:14 +05304288 user_cfg->num_tx_chains_11g =
gaurank kathpaliab414bce2018-11-09 18:44:46 +05304289 user_cfg->num_tx_chains[NSS_CHAINS_BAND_2GHZ];
gaurank kathpalia2b32de02018-10-24 18:31:14 +05304290
4291 return QDF_STATUS_SUCCESS;
4292}
4293
4294static QDF_STATUS
4295sme_validate_nss_chains_config(struct wlan_objmgr_vdev *vdev,
gaurank kathpaliadb87c0d2018-10-31 16:44:00 +05304296 struct wlan_mlme_nss_chains *user_cfg,
4297 struct wlan_mlme_nss_chains *dynamic_cfg)
gaurank kathpalia2b32de02018-10-24 18:31:14 +05304298{
4299 enum nss_chains_band_info band;
4300 struct wlan_mlme_nss_chains *ini_cfg;
gaurank kathpalia2b32de02018-10-24 18:31:14 +05304301 QDF_STATUS status;
4302
4303 ini_cfg = mlme_get_ini_vdev_config(vdev);
4304 if (!ini_cfg) {
4305 sme_err("nss chain ini config NULL");
4306 return QDF_STATUS_E_FAILURE;
4307 }
gaurank kathpalia2b32de02018-10-24 18:31:14 +05304308
gaurank kathpaliab414bce2018-11-09 18:44:46 +05304309 for (band = NSS_CHAINS_BAND_2GHZ; band < NSS_CHAINS_BAND_MAX; band++) {
gaurank kathpalia2b32de02018-10-24 18:31:14 +05304310 sme_populate_user_config(dynamic_cfg,
4311 user_cfg, band);
4312 status = sme_validate_from_ini_config(user_cfg,
4313 ini_cfg,
4314 band);
4315 if (QDF_IS_STATUS_ERROR(status)) {
4316 sme_err("Validation from ini config failed");
4317 return QDF_STATUS_E_FAILURE;
4318 }
4319 status = sme_validate_user_nss_chain_params(user_cfg,
4320 band);
4321 if (QDF_IS_STATUS_ERROR(status)) {
4322 sme_err("User cfg validation failed");
4323 return QDF_STATUS_E_FAILURE;
4324 }
4325 }
4326
4327 return QDF_STATUS_SUCCESS;
4328}
4329
gaurank kathpaliafa7ad0a2019-03-12 19:17:56 +05304330static bool
4331sme_is_nss_update_allowed(struct wlan_mlme_chain_cfg chain_cfg,
4332 uint8_t rx_nss, uint8_t tx_nss,
4333 enum nss_chains_band_info band)
4334{
4335 switch (band) {
4336 case NSS_CHAINS_BAND_2GHZ:
4337 if (rx_nss > chain_cfg.max_rx_chains_2g)
4338 return false;
4339 if (tx_nss > chain_cfg.max_tx_chains_2g)
4340 return false;
4341 break;
4342 case NSS_CHAINS_BAND_5GHZ:
4343 if (rx_nss > chain_cfg.max_rx_chains_5g)
4344 return false;
4345 if (tx_nss > chain_cfg.max_tx_chains_5g)
4346 return false;
4347 break;
4348 default:
4349 sme_err("Unknown Band nss change not allowed");
4350 return false;
4351 }
4352 return true;
4353}
4354
4355static void sme_modify_chains_in_mlme_cfg(mac_handle_t mac_handle,
4356 uint8_t rx_chains,
4357 uint8_t tx_chains,
4358 enum QDF_OPMODE vdev_op_mode,
4359 enum nss_chains_band_info band)
gaurank kathpalia6c4b50c2019-02-28 14:07:48 +05304360{
4361 uint8_t nss_shift;
4362 uint32_t nss_mask = 0x7;
4363 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
4364
4365 nss_shift = sme_get_nss_chain_shift(vdev_op_mode);
4366
gaurank kathpaliafa7ad0a2019-03-12 19:17:56 +05304367 mac_ctx->mlme_cfg->nss_chains_ini_cfg.num_rx_chains[band] &=
4368 ~(nss_mask << nss_shift);
4369 mac_ctx->mlme_cfg->nss_chains_ini_cfg.num_rx_chains[band] |=
4370 (rx_chains << nss_shift);
4371 mac_ctx->mlme_cfg->nss_chains_ini_cfg.num_tx_chains[band] &=
4372 ~(nss_mask << nss_shift);
4373 mac_ctx->mlme_cfg->nss_chains_ini_cfg.num_tx_chains[band] |=
4374 (tx_chains << nss_shift);
4375 sme_debug("rx chains %d tx chains %d changed for vdev mode %d for band %d",
4376 rx_chains, tx_chains, vdev_op_mode, band);
4377}
4378
4379static void
4380sme_modify_nss_in_mlme_cfg(mac_handle_t mac_handle,
4381 uint8_t rx_nss, uint8_t tx_nss,
4382 enum QDF_OPMODE vdev_op_mode,
4383 enum nss_chains_band_info band)
4384{
4385 uint8_t nss_shift;
4386 uint32_t nss_mask = 0x7;
4387 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
4388
4389 if (!sme_is_nss_update_allowed(mac_ctx->fw_chain_cfg, rx_nss, tx_nss,
4390 band)) {
4391 sme_debug("Nss modification failed, fw doesn't support this nss %d",
4392 rx_nss);
4393 return;
4394 }
4395
4396 nss_shift = sme_get_nss_chain_shift(vdev_op_mode);
4397
gaurank kathpalia6c4b50c2019-02-28 14:07:48 +05304398 mac_ctx->mlme_cfg->nss_chains_ini_cfg.rx_nss[band] &=
4399 ~(nss_mask << nss_shift);
4400 mac_ctx->mlme_cfg->nss_chains_ini_cfg.rx_nss[band] |=
4401 (rx_nss << nss_shift);
4402 mac_ctx->mlme_cfg->nss_chains_ini_cfg.tx_nss[band] &=
4403 ~(nss_mask << nss_shift);
4404 mac_ctx->mlme_cfg->nss_chains_ini_cfg.tx_nss[band] |=
4405 (tx_nss << nss_shift);
4406 sme_debug("rx nss %d tx nss %d changed for vdev mode %d for band %d",
4407 rx_nss, tx_nss, vdev_op_mode, band);
4408}
4409
4410void
gaurank kathpaliafa7ad0a2019-03-12 19:17:56 +05304411sme_modify_nss_chains_tgt_cfg(mac_handle_t mac_handle,
4412 enum QDF_OPMODE vdev_op_mode,
4413 enum nss_chains_band_info band)
4414{
4415 uint8_t ini_rx_nss;
4416 uint8_t ini_tx_nss;
4417 uint8_t max_supported_rx_nss = MAX_VDEV_NSS;
4418 uint8_t max_supported_tx_nss = MAX_VDEV_NSS;
4419 uint8_t ini_rx_chains;
4420 uint8_t ini_tx_chains;
4421 uint8_t max_supported_rx_chains = MAX_VDEV_CHAINS;
4422 uint8_t max_supported_tx_chains = MAX_VDEV_CHAINS;
4423
4424 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
4425 struct wlan_mlme_nss_chains *nss_chains_ini_cfg =
4426 &mac_ctx->mlme_cfg->nss_chains_ini_cfg;
4427 uint8_t nss_shift = sme_get_nss_chain_shift(vdev_op_mode);
4428 struct wlan_mlme_chain_cfg chain_cfg = mac_ctx->fw_chain_cfg;
4429
4430 ini_rx_nss = GET_VDEV_NSS_CHAIN(nss_chains_ini_cfg->rx_nss[band],
4431 nss_shift);
4432 ini_tx_nss = GET_VDEV_NSS_CHAIN(nss_chains_ini_cfg->tx_nss[band],
4433 nss_shift);
4434
4435 if (band == NSS_CHAINS_BAND_2GHZ) {
4436 max_supported_rx_nss = chain_cfg.max_rx_chains_2g;
4437 max_supported_tx_nss = chain_cfg.max_tx_chains_2g;
4438 } else if (band == NSS_CHAINS_BAND_5GHZ) {
4439 max_supported_rx_nss = chain_cfg.max_rx_chains_5g;
4440 max_supported_tx_nss = chain_cfg.max_tx_chains_5g;
4441 }
4442
4443 max_supported_rx_nss = QDF_MIN(ini_rx_nss, max_supported_rx_nss);
4444 max_supported_tx_nss = QDF_MIN(ini_tx_nss, max_supported_tx_nss);
4445
4446 ini_rx_chains = GET_VDEV_NSS_CHAIN(nss_chains_ini_cfg->
4447 num_rx_chains[band],
4448 nss_shift);
4449 ini_tx_chains = GET_VDEV_NSS_CHAIN(nss_chains_ini_cfg->
4450 num_tx_chains[band],
4451 nss_shift);
4452
4453 if (band == NSS_CHAINS_BAND_2GHZ) {
4454 max_supported_rx_chains = chain_cfg.max_rx_chains_2g;
4455 max_supported_tx_chains = chain_cfg.max_tx_chains_2g;
4456 } else if (band == NSS_CHAINS_BAND_5GHZ) {
4457 max_supported_rx_chains = chain_cfg.max_rx_chains_5g;
4458 max_supported_tx_chains = chain_cfg.max_tx_chains_5g;
4459 }
4460
4461 max_supported_rx_chains = QDF_MIN(ini_rx_chains,
4462 max_supported_rx_chains);
4463 max_supported_tx_chains = QDF_MIN(ini_tx_chains,
4464 max_supported_tx_chains);
4465
4466 sme_modify_chains_in_mlme_cfg(mac_handle, max_supported_rx_chains,
4467 max_supported_tx_chains, vdev_op_mode,
4468 band);
4469 sme_modify_nss_in_mlme_cfg(mac_handle, max_supported_rx_nss,
4470 max_supported_tx_nss, vdev_op_mode, band);
4471}
4472
4473void
4474sme_update_nss_in_mlme_cfg(mac_handle_t mac_handle,
4475 uint8_t rx_nss, uint8_t tx_nss,
4476 enum QDF_OPMODE vdev_op_mode,
4477 enum nss_chains_band_info band)
gaurank kathpalia6c4b50c2019-02-28 14:07:48 +05304478{
4479 /*
4480 * If device mode is P2P-DEVICE, then we want P2P to come in that
4481 * particular nss, then we should change the nss of P@P-CLI, and GO
4482 * and we are unaware that for what will be the device mode after
4483 * negotiation yet.
4484 */
4485
4486 if (vdev_op_mode == QDF_P2P_DEVICE_MODE ||
4487 vdev_op_mode == QDF_P2P_CLIENT_MODE ||
4488 vdev_op_mode == QDF_P2P_GO_MODE) {
gaurank kathpaliafa7ad0a2019-03-12 19:17:56 +05304489 sme_modify_nss_in_mlme_cfg(mac_handle, rx_nss, tx_nss,
4490 QDF_P2P_CLIENT_MODE, band);
4491 sme_modify_nss_in_mlme_cfg(mac_handle, rx_nss, tx_nss,
4492 QDF_P2P_GO_MODE, band);
4493 sme_modify_nss_in_mlme_cfg(mac_handle, rx_nss, tx_nss,
4494 QDF_P2P_DEVICE_MODE, band);
gaurank kathpalia6c4b50c2019-02-28 14:07:48 +05304495 } else
gaurank kathpaliafa7ad0a2019-03-12 19:17:56 +05304496 sme_modify_nss_in_mlme_cfg(mac_handle, rx_nss, tx_nss,
4497 vdev_op_mode, band);
gaurank kathpalia6c4b50c2019-02-28 14:07:48 +05304498}
4499
gaurank kathpalia2b32de02018-10-24 18:31:14 +05304500QDF_STATUS
4501sme_nss_chains_update(mac_handle_t mac_handle,
4502 struct wlan_mlme_nss_chains *user_cfg,
4503 uint8_t vdev_id)
4504{
gaurank kathpalia24ed0f42018-11-13 15:37:49 +05304505 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
gaurank kathpalia2b32de02018-10-24 18:31:14 +05304506 QDF_STATUS status;
gaurank kathpaliadb87c0d2018-10-31 16:44:00 +05304507 struct wlan_mlme_nss_chains *dynamic_cfg;
gaurank kathpalia2b32de02018-10-24 18:31:14 +05304508 struct wlan_objmgr_vdev *vdev =
4509 wlan_objmgr_get_vdev_by_id_from_psoc(mac_ctx->psoc,
4510 vdev_id,
4511 WLAN_LEGACY_SME_ID);
4512 if (!vdev) {
4513 sme_err("Got NULL vdev obj, returning");
4514 return QDF_STATUS_E_FAILURE;
4515 }
gaurank kathpaliadb87c0d2018-10-31 16:44:00 +05304516
gaurank kathpalia748c7272018-10-24 22:05:15 +05304517 status = sme_acquire_global_lock(&mac_ctx->sme);
4518 if (QDF_IS_STATUS_ERROR(status))
4519 goto release_ref;
4520
gaurank kathpaliadb87c0d2018-10-31 16:44:00 +05304521 dynamic_cfg = mlme_get_dynamic_vdev_config(vdev);
4522 if (!dynamic_cfg) {
4523 sme_err("nss chain dynamic config NULL");
4524 status = QDF_STATUS_E_FAILURE;
4525 goto release_lock;
4526 }
4527
4528 status = sme_validate_nss_chains_config(vdev, user_cfg,
4529 dynamic_cfg);
gaurank kathpalia2b32de02018-10-24 18:31:14 +05304530 if (QDF_IS_STATUS_ERROR(status))
gaurank kathpalia748c7272018-10-24 22:05:15 +05304531 goto release_lock;
gaurank kathpaliadb87c0d2018-10-31 16:44:00 +05304532
4533 if (!qdf_mem_cmp(dynamic_cfg, user_cfg,
4534 sizeof(struct wlan_mlme_nss_chains))) {
4535 sme_debug("current config same as user config");
4536 status = QDF_STATUS_SUCCESS;
4537 goto release_lock;
4538 }
gaurank kathpalia748c7272018-10-24 22:05:15 +05304539 sme_debug("User params verified, sending to fw vdev id %d", vdev_id);
gaurank kathpalia2b32de02018-10-24 18:31:14 +05304540
gaurank kathpalia748c7272018-10-24 22:05:15 +05304541 status = wma_vdev_nss_chain_params_send(vdev->vdev_objmgr.vdev_id,
4542 user_cfg);
4543 if (QDF_IS_STATUS_ERROR(status)) {
4544 sme_err("params sent failed to fw vdev id %d", vdev_id);
4545 goto release_lock;
4546 }
4547
gaurank kathpaliab414bce2018-11-09 18:44:46 +05304548 *dynamic_cfg = *user_cfg;
gaurank kathpaliadb87c0d2018-10-31 16:44:00 +05304549
gaurank kathpalia748c7272018-10-24 22:05:15 +05304550release_lock:
4551 sme_release_global_lock(&mac_ctx->sme);
4552
4553release_ref:
gaurank kathpalia2b32de02018-10-24 18:31:14 +05304554 wlan_objmgr_vdev_release_ref(vdev, WLAN_LEGACY_SME_ID);
4555 return status;
4556}
4557
Jeff Johnsonc7309062018-11-09 20:59:42 -08004558QDF_STATUS sme_open_session(mac_handle_t mac_handle,
4559 struct sme_session_params *params)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004560{
Arif Hussainee677012017-01-26 17:50:13 -08004561 QDF_STATUS status = QDF_STATUS_E_INVAL;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08004562 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Arif Hussainee677012017-01-26 17:50:13 -08004563 struct cdp_pdev *pdev;
4564 ol_txrx_peer_handle peer;
4565 uint8_t peer_id;
Krishna Kumaar Natarajanb9e1d712017-06-20 17:14:37 -07004566 void *soc = cds_get_context(QDF_MODULE_ID_SOC);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004567
Abhishek Singhe4a1f882017-08-10 17:59:44 +05304568 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_DEBUG,
Rajeev Kumar7414c8c2017-04-06 15:42:52 -07004569 "%s: type=%d, session_id %d subType=%d addr:%pM",
Krunal Soni8d184fa2017-11-20 21:52:05 -08004570 __func__, params->type_of_persona,
4571 params->sme_session_id, params->subtype_of_persona,
4572 params->self_mac_addr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004573
Arif Hussainee677012017-01-26 17:50:13 -08004574 pdev = cds_get_context(QDF_MODULE_ID_TXRX);
4575
Jeff Johnson038efe72019-03-18 13:39:31 -07004576 if (!pdev) {
Arif Hussainee677012017-01-26 17:50:13 -08004577 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
4578 "%s: Failed to get pdev handler", __func__);
4579 return status;
4580 }
4581
Krunal Soni8d184fa2017-11-20 21:52:05 -08004582 status = sme_acquire_global_lock(&mac_ctx->sme);
Dustin Brownd28772b2017-03-17 14:16:07 -07004583 if (QDF_IS_STATUS_ERROR(status))
4584 return status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004585
Krunal Soni8d184fa2017-11-20 21:52:05 -08004586 peer = cdp_peer_find_by_addr(soc, pdev, params->self_mac_addr,
4587 &peer_id);
Arif Hussainee677012017-01-26 17:50:13 -08004588 if (peer) {
4589 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
4590 "%s: Peer=%d exist with same MAC",
4591 __func__, peer_id);
4592 status = QDF_STATUS_E_INVAL;
4593 } else {
Krunal Soni8d184fa2017-11-20 21:52:05 -08004594 status = csr_roam_open_session(mac_ctx, params);
Arif Hussainee677012017-01-26 17:50:13 -08004595 }
Krunal Soni8d184fa2017-11-20 21:52:05 -08004596 sme_release_global_lock(&mac_ctx->sme);
Dustin Brownd28772b2017-03-17 14:16:07 -07004597
4598 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_RX_HDD_OPEN_SESSION,
Krunal Soni8d184fa2017-11-20 21:52:05 -08004599 params->sme_session_id, 0));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004600
4601 return status;
4602}
4603
Jeff Johnsonc7309062018-11-09 20:59:42 -08004604QDF_STATUS sme_close_session(mac_handle_t mac_handle, uint8_t session_id)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004605{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304606 QDF_STATUS status;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08004607 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004608
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05304609 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Krunal Soni8d184fa2017-11-20 21:52:05 -08004610 TRACE_CODE_SME_RX_HDD_CLOSE_SESSION, session_id, 0));
Jeff Johnson01f2c232018-11-21 19:17:44 -08004611 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304612 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08004613 status = csr_roam_close_session(mac, session_id, false);
4614 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004615 }
4616
4617 return status;
4618}
4619
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05304620/*
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05304621 * sme_change_mcc_beacon_interval() -
4622 * To update P2P-GO beaconInterval. This function should be called after
4623 * disassociating all the station is done
4624 * This is an asynchronous API.
4625 *
4626 * @sessionId: Session Identifier
4627 * Return QDF_STATUS SUCCESS
4628 * FAILURE or RESOURCES
4629 * The API finished and failed.
4630 */
Archana Ramachandran2eb7a612017-03-23 22:58:42 -07004631QDF_STATUS sme_change_mcc_beacon_interval(uint8_t sessionId)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004632{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304633 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08004634 struct mac_context *mac_ctx = sme_get_mac_context();
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004635
Krunal Soni3fa80e22018-01-09 14:16:02 -08004636 if (!mac_ctx) {
4637 sme_err("mac_ctx is NULL");
4638 return status;
4639 }
Archana Ramachandran2eb7a612017-03-23 22:58:42 -07004640 status = sme_acquire_global_lock(&mac_ctx->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304641 if (QDF_IS_STATUS_SUCCESS(status)) {
Archana Ramachandran2eb7a612017-03-23 22:58:42 -07004642 status = csr_send_chng_mcc_beacon_interval(mac_ctx,
4643 sessionId);
4644 sme_release_global_lock(&mac_ctx->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004645 }
4646 return status;
4647}
4648
4649/**
4650 * sme_set_host_offload(): API to set the host offload feature.
Jeff Johnsonb460dd72018-11-08 10:26:51 -08004651 * @mac_handle: The handle returned by mac_open.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004652 * @sessionId: Session Identifier
4653 * @request: Pointer to the offload request.
4654 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304655 * Return QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004656 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08004657QDF_STATUS sme_set_host_offload(mac_handle_t mac_handle, uint8_t sessionId,
Jeff Johnsond6fda812019-02-06 21:54:23 -08004658 struct sir_host_offload_req *request)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004659{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08004660 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304661 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004662
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05304663 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004664 TRACE_CODE_SME_RX_HDD_SET_HOSTOFFLOAD, sessionId, 0));
Jeff Johnson01f2c232018-11-21 19:17:44 -08004665 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304666 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004667#ifdef WLAN_NS_OFFLOAD
4668 if (SIR_IPV6_NS_OFFLOAD == request->offloadType) {
Jeff Johnsonb460dd72018-11-08 10:26:51 -08004669 status = sme_set_ps_ns_offload(mac_handle, request,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004670 sessionId);
4671 } else
4672#endif /* WLAN_NS_OFFLOAD */
4673 {
Jeff Johnsonb460dd72018-11-08 10:26:51 -08004674 status = sme_set_ps_host_offload(mac_handle, request,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004675 sessionId);
4676 }
Jeff Johnson01f2c232018-11-21 19:17:44 -08004677 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004678 }
4679
4680 return status;
4681}
4682
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05304683/*
4684 * sme_set_keep_alive() -
4685 * API to set the Keep Alive feature.
4686 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08004687 * mac_handle - The handle returned by mac_open.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05304688 * request - Pointer to the Keep Alive request.
4689 * Return QDF_STATUS
4690 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08004691QDF_STATUS sme_set_keep_alive(mac_handle_t mac_handle, uint8_t session_id,
Jeff Johnson562ccad2019-02-06 22:10:24 -08004692 struct keep_alive_req *request)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004693{
Jeff Johnson562ccad2019-02-06 22:10:24 -08004694 struct keep_alive_req *request_buf;
Rajeev Kumar37d478b2017-04-17 16:59:28 -07004695 struct scheduler_msg msg = {0};
Jeff Johnson0a8786a2018-12-02 10:49:01 -08004696 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Jeff Johnson01f2c232018-11-21 19:17:44 -08004697 struct csr_roam_session *pSession = CSR_GET_SESSION(mac, session_id);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004698
Abhishek Singhe4a1f882017-08-10 17:59:44 +05304699 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004700 FL("WMA_SET_KEEP_ALIVE message"));
4701
Jeff Johnson038efe72019-03-18 13:39:31 -07004702 if (!pSession) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05304703 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004704 FL("Session not Found"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304705 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004706 }
Jeff Johnson562ccad2019-02-06 22:10:24 -08004707 request_buf = qdf_mem_malloc(sizeof(*request_buf));
Arif Hussain0ef77082018-10-10 16:42:53 -07004708 if (!request_buf)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304709 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004710
Anurag Chouhanc5548422016-02-24 18:33:27 +05304711 qdf_copy_macaddr(&request->bssid, &pSession->connectedProfile.bssid);
Jeff Johnson562ccad2019-02-06 22:10:24 -08004712 qdf_mem_copy(request_buf, request, sizeof(*request_buf));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004713
Abhishek Singhe4a1f882017-08-10 17:59:44 +05304714 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004715 "buff TP %d input TP %d ", request_buf->timePeriod,
4716 request->timePeriod);
4717 request_buf->sessionId = session_id;
4718
4719 msg.type = WMA_SET_KEEP_ALIVE;
4720 msg.reserved = 0;
4721 msg.bodyptr = request_buf;
Sreelakshmi Konamki6a065362016-05-31 16:05:01 +05304722 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
4723 session_id, msg.type));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304724 if (QDF_STATUS_SUCCESS !=
gaurank kathpalia36b0c582018-08-28 17:45:43 +05304725 scheduler_post_message(QDF_MODULE_ID_SME,
4726 QDF_MODULE_ID_WMA,
4727 QDF_MODULE_ID_WMA, &msg)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05304728 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05304729 "Not able to post WMA_SET_KEEP_ALIVE message to WMA");
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304730 qdf_mem_free(request_buf);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304731 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004732 }
4733
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304734 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004735}
4736
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05304737/*
4738 * sme_get_operation_channel() -
4739 * API to get current channel on which STA is parked his function gives
4740 * channel information only of infra station or IBSS station
4741 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08004742 * mac_handle, pointer to memory location and sessionId
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05304743 * Returns QDF_STATUS_SUCCESS
4744 * QDF_STATUS_E_FAILURE
4745 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08004746QDF_STATUS sme_get_operation_channel(mac_handle_t mac_handle,
4747 uint32_t *pChannel,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004748 uint8_t sessionId)
4749{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08004750 struct mac_context *mac = MAC_CONTEXT(mac_handle);
gaurank kathpalia14e2f912017-08-31 14:51:45 +05304751 struct csr_roam_session *pSession;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004752
Jeff Johnson01f2c232018-11-21 19:17:44 -08004753 if (CSR_IS_SESSION_VALID(mac, sessionId)) {
4754 pSession = CSR_GET_SESSION(mac, sessionId);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004755
4756 if ((pSession->connectedProfile.BSSType ==
4757 eCSR_BSS_TYPE_INFRASTRUCTURE)
4758 || (pSession->connectedProfile.BSSType ==
4759 eCSR_BSS_TYPE_IBSS)
4760 || (pSession->connectedProfile.BSSType ==
4761 eCSR_BSS_TYPE_INFRA_AP)
4762 || (pSession->connectedProfile.BSSType ==
4763 eCSR_BSS_TYPE_START_IBSS)) {
4764 *pChannel = pSession->connectedProfile.operationChannel;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304765 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004766 }
4767 }
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304768 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004769} /* sme_get_operation_channel ends here */
4770
Abhishek Singh7996eb72015-12-30 17:24:02 +05304771/**
4772 * sme_register_mgmt_frame_ind_callback() - Register a callback for
4773 * management frame indication to PE.
4774 *
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -08004775 * @mac_handle: Opaque handle to the global MAC context
Abhishek Singh7996eb72015-12-30 17:24:02 +05304776 * @callback: callback pointer to be registered
4777 *
4778 * This function is used to register a callback for management
4779 * frame indication to PE.
4780 *
4781 * Return: Success if msg is posted to PE else Failure.
4782 */
Jeff Johnsonc7309062018-11-09 20:59:42 -08004783QDF_STATUS sme_register_mgmt_frame_ind_callback(mac_handle_t mac_handle,
Abhishek Singh7996eb72015-12-30 17:24:02 +05304784 sir_mgmt_frame_ind_callback callback)
4785{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08004786 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Abhishek Singh7996eb72015-12-30 17:24:02 +05304787 struct sir_sme_mgmt_frame_cb_req *msg;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304788 QDF_STATUS status = QDF_STATUS_SUCCESS;
Abhishek Singh7996eb72015-12-30 17:24:02 +05304789
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304790 if (QDF_STATUS_SUCCESS ==
Abhishek Singh7996eb72015-12-30 17:24:02 +05304791 sme_acquire_global_lock(&mac_ctx->sme)) {
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304792 msg = qdf_mem_malloc(sizeof(*msg));
Arif Hussain0ef77082018-10-10 16:42:53 -07004793 if (!msg) {
Abhishek Singh7996eb72015-12-30 17:24:02 +05304794 sme_release_global_lock(&mac_ctx->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304795 return QDF_STATUS_E_NOMEM;
Abhishek Singh7996eb72015-12-30 17:24:02 +05304796 }
Abhishek Singh7996eb72015-12-30 17:24:02 +05304797 msg->message_type = eWNI_SME_REGISTER_MGMT_FRAME_CB;
4798 msg->length = sizeof(*msg);
4799
4800 msg->callback = callback;
Rajeev Kumard138ac52017-01-30 18:38:37 -08004801 status = umac_send_mb_message_to_mac(msg);
Abhishek Singh7996eb72015-12-30 17:24:02 +05304802 sme_release_global_lock(&mac_ctx->sme);
4803 return status;
4804 }
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304805 return QDF_STATUS_E_FAILURE;
Abhishek Singh7996eb72015-12-30 17:24:02 +05304806}
4807
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05304808/*
4809 * sme_RegisterMgtFrame() -
Jeff Johnson698eacd2018-05-12 17:00:03 -07004810 * To register management frame of specified type and subtype.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05304811 *
4812 * frameType - type of the frame that needs to be passed to HDD.
4813 * matchData - data which needs to be matched before passing frame
4814 * to HDD.
4815 * matchDataLen - Length of matched data.
4816 * Return QDF_STATUS
4817 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08004818QDF_STATUS sme_register_mgmt_frame(mac_handle_t mac_handle, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004819 uint16_t frameType, uint8_t *matchData,
4820 uint16_t matchLen)
4821{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304822 QDF_STATUS status = QDF_STATUS_SUCCESS;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08004823 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004824
Jeff Johnson01f2c232018-11-21 19:17:44 -08004825 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304826 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson78f7a182019-02-01 22:45:41 -08004827 struct register_mgmt_frame *pMsg;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004828 uint16_t len;
Jeff Johnson01f2c232018-11-21 19:17:44 -08004829 struct csr_roam_session *pSession = CSR_GET_SESSION(mac,
gaurank kathpalia14e2f912017-08-31 14:51:45 +05304830 sessionId);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004831
4832 if (!CSR_IS_SESSION_ANY(sessionId) && !pSession) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07004833 sme_err("Session %d not found", sessionId);
Jeff Johnson01f2c232018-11-21 19:17:44 -08004834 sme_release_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304835 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004836 }
4837
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05304838 if (!CSR_IS_SESSION_ANY(sessionId) &&
4839 !pSession->sessionActive) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05304840 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004841 "%s Invalid Sessionid", __func__);
Jeff Johnson01f2c232018-11-21 19:17:44 -08004842 sme_release_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304843 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004844 }
4845
Jeff Johnson78f7a182019-02-01 22:45:41 -08004846 len = sizeof(*pMsg) + matchLen;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004847
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304848 pMsg = qdf_mem_malloc(len);
Jeff Johnson038efe72019-03-18 13:39:31 -07004849 if (!pMsg)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304850 status = QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004851 else {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004852 pMsg->messageType = eWNI_SME_REGISTER_MGMT_FRAME_REQ;
4853 pMsg->length = len;
4854 pMsg->sessionId = sessionId;
4855 pMsg->registerFrame = true;
4856 pMsg->frameType = frameType;
4857 pMsg->matchLen = matchLen;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304858 qdf_mem_copy(pMsg->matchData, matchData, matchLen);
Rajeev Kumard138ac52017-01-30 18:38:37 -08004859 status = umac_send_mb_message_to_mac(pMsg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004860 }
Jeff Johnson01f2c232018-11-21 19:17:44 -08004861 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004862 }
4863 return status;
4864}
4865
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05304866/*
4867 * sme_DeregisterMgtFrame() -
Jeff Johnson698eacd2018-05-12 17:00:03 -07004868 * To De-register management frame of specified type and subtype.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05304869 *
4870 * frameType - type of the frame that needs to be passed to HDD.
4871 * matchData - data which needs to be matched before passing frame
4872 * to HDD.
4873 * matchDataLen - Length of matched data.
4874 * Return QDF_STATUS
4875 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08004876QDF_STATUS sme_deregister_mgmt_frame(mac_handle_t mac_handle, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004877 uint16_t frameType, uint8_t *matchData,
4878 uint16_t matchLen)
4879{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304880 QDF_STATUS status = QDF_STATUS_SUCCESS;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08004881 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004882
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05304883 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004884 TRACE_CODE_SME_RX_HDD_DEREGISTER_MGMTFR, sessionId,
4885 0));
Jeff Johnson01f2c232018-11-21 19:17:44 -08004886 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304887 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson78f7a182019-02-01 22:45:41 -08004888 struct register_mgmt_frame *pMsg;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004889 uint16_t len;
Jeff Johnson01f2c232018-11-21 19:17:44 -08004890 struct csr_roam_session *pSession = CSR_GET_SESSION(mac,
gaurank kathpalia14e2f912017-08-31 14:51:45 +05304891 sessionId);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004892
4893 if (!CSR_IS_SESSION_ANY(sessionId) && !pSession) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07004894 sme_err("Session %d not found", sessionId);
Jeff Johnson01f2c232018-11-21 19:17:44 -08004895 sme_release_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304896 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004897 }
4898
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05304899 if (!CSR_IS_SESSION_ANY(sessionId) &&
4900 !pSession->sessionActive) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05304901 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004902 "%s Invalid Sessionid", __func__);
Jeff Johnson01f2c232018-11-21 19:17:44 -08004903 sme_release_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304904 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004905 }
4906
Jeff Johnson78f7a182019-02-01 22:45:41 -08004907 len = sizeof(*pMsg) + matchLen;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004908
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304909 pMsg = qdf_mem_malloc(len);
Jeff Johnson038efe72019-03-18 13:39:31 -07004910 if (!pMsg)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304911 status = QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004912 else {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004913 pMsg->messageType = eWNI_SME_REGISTER_MGMT_FRAME_REQ;
4914 pMsg->length = len;
4915 pMsg->registerFrame = false;
4916 pMsg->frameType = frameType;
4917 pMsg->matchLen = matchLen;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304918 qdf_mem_copy(pMsg->matchData, matchData, matchLen);
Rajeev Kumard138ac52017-01-30 18:38:37 -08004919 status = umac_send_mb_message_to_mac(pMsg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004920 }
Jeff Johnson01f2c232018-11-21 19:17:44 -08004921 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004922 }
4923 return status;
4924}
4925
Padma, Santhosh Kumar22c462c2018-01-16 17:56:44 +05304926/**
4927 * sme_prepare_mgmt_tx() - Prepares mgmt frame
Jeff Johnsonc7309062018-11-09 20:59:42 -08004928 * @mac_handle: The handle returned by mac_open
Padma, Santhosh Kumar22c462c2018-01-16 17:56:44 +05304929 * @session_id: session id
4930 * @buf: pointer to frame
4931 * @len: frame length
4932 *
4933 * Return: QDF_STATUS
4934 */
Jeff Johnsonc7309062018-11-09 20:59:42 -08004935static QDF_STATUS sme_prepare_mgmt_tx(mac_handle_t mac_handle,
4936 uint8_t session_id,
4937 const uint8_t *buf, uint32_t len)
Padma, Santhosh Kumar22c462c2018-01-16 17:56:44 +05304938{
4939 QDF_STATUS status = QDF_STATUS_SUCCESS;
4940 struct sir_mgmt_msg *msg;
4941 uint16_t msg_len;
4942 struct scheduler_msg sch_msg = {0};
4943
4944 sme_debug("prepares auth frame");
4945
4946 msg_len = sizeof(*msg) + len;
4947 msg = qdf_mem_malloc(msg_len);
Jeff Johnson038efe72019-03-18 13:39:31 -07004948 if (!msg) {
Padma, Santhosh Kumar22c462c2018-01-16 17:56:44 +05304949 status = QDF_STATUS_E_NOMEM;
4950 } else {
4951 msg->type = eWNI_SME_SEND_MGMT_FRAME_TX;
4952 msg->msg_len = msg_len;
4953 msg->session_id = session_id;
4954 msg->data = (uint8_t *)msg + sizeof(*msg);
4955 qdf_mem_copy(msg->data, buf, len);
4956
4957 sch_msg.type = eWNI_SME_SEND_MGMT_FRAME_TX;
4958 sch_msg.bodyptr = msg;
gaurank kathpalia36b0c582018-08-28 17:45:43 +05304959 status = scheduler_post_message(QDF_MODULE_ID_SME,
4960 QDF_MODULE_ID_PE,
4961 QDF_MODULE_ID_PE, &sch_msg);
Padma, Santhosh Kumar22c462c2018-01-16 17:56:44 +05304962 }
4963 return status;
4964}
4965
Jeff Johnsonc7309062018-11-09 20:59:42 -08004966QDF_STATUS sme_send_mgmt_tx(mac_handle_t mac_handle, uint8_t session_id,
4967 const uint8_t *buf, uint32_t len)
Padma, Santhosh Kumar22c462c2018-01-16 17:56:44 +05304968{
4969 QDF_STATUS status = QDF_STATUS_SUCCESS;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08004970 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Padma, Santhosh Kumar22c462c2018-01-16 17:56:44 +05304971
Padma, Santhosh Kumar22c462c2018-01-16 17:56:44 +05304972 status = sme_acquire_global_lock(&mac->sme);
4973 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnsonc7309062018-11-09 20:59:42 -08004974 status = sme_prepare_mgmt_tx(mac_handle, session_id, buf, len);
Padma, Santhosh Kumar22c462c2018-01-16 17:56:44 +05304975 sme_release_global_lock(&mac->sme);
4976 }
4977
4978 return status;
4979}
4980
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004981#ifdef WLAN_FEATURE_EXTWOW_SUPPORT
Krishna Kumaar Natarajand9131902015-10-19 11:52:47 -07004982/**
4983 * sme_configure_ext_wow() - configure Extr WoW
Jeff Johnsonb460dd72018-11-08 10:26:51 -08004984 * @mac_handle - The handle returned by mac_open.
Krishna Kumaar Natarajand9131902015-10-19 11:52:47 -07004985 * @wlanExtParams - Depicts the wlan Ext params.
4986 * @callback - ext_wow callback to be registered.
4987 * @callback_context - ext_wow callback context
4988 *
4989 * SME will pass this request to lower mac to configure Extr WoW
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304990 * Return: QDF_STATUS
Krishna Kumaar Natarajand9131902015-10-19 11:52:47 -07004991 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08004992QDF_STATUS sme_configure_ext_wow(mac_handle_t mac_handle,
4993 tpSirExtWoWParams wlanExtParams,
4994 csr_readyToExtWoWCallback callback,
4995 void *callback_context)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004996{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304997 QDF_STATUS status = QDF_STATUS_SUCCESS;
4998 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08004999 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Rajeev Kumar37d478b2017-04-17 16:59:28 -07005000 struct scheduler_msg message = {0};
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305001 tpSirExtWoWParams MsgPtr = qdf_mem_malloc(sizeof(*MsgPtr));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005002
5003 if (!MsgPtr)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305004 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005005
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05305006 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005007 TRACE_CODE_SME_RX_HDD_CONFIG_EXTWOW, NO_SESSION, 0));
5008
Jeff Johnson01f2c232018-11-21 19:17:44 -08005009 mac->readyToExtWoWCallback = callback;
5010 mac->readyToExtWoWContext = callback_context;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005011
Jeff Johnson01f2c232018-11-21 19:17:44 -08005012 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305013 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005014
5015 /* serialize the req through MC thread */
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305016 qdf_mem_copy(MsgPtr, wlanExtParams, sizeof(*MsgPtr));
Rajeev Kumar8eaedf62017-01-21 11:03:13 -08005017 message.bodyptr = MsgPtr;
5018 message.type = WMA_WLAN_EXT_WOW;
gaurank kathpalia36b0c582018-08-28 17:45:43 +05305019 qdf_status = scheduler_post_message(QDF_MODULE_ID_SME,
5020 QDF_MODULE_ID_WMA,
5021 QDF_MODULE_ID_WMA,
5022 &message);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305023 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08005024 mac->readyToExtWoWCallback = NULL;
5025 mac->readyToExtWoWContext = NULL;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305026 qdf_mem_free(MsgPtr);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305027 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005028 }
Jeff Johnson01f2c232018-11-21 19:17:44 -08005029 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005030 } else {
Jeff Johnson01f2c232018-11-21 19:17:44 -08005031 mac->readyToExtWoWCallback = NULL;
5032 mac->readyToExtWoWContext = NULL;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305033 qdf_mem_free(MsgPtr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005034 }
5035
5036 return status;
5037}
5038
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05305039/*
5040 * sme_configure_app_type1_params() -
5041 * SME will pass this request to lower mac to configure Indoor WoW parameters.
5042 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08005043 * mac_handle - The handle returned by mac_open.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05305044 * wlanAppType1Params- Depicts the wlan App Type 1(Indoor) params
5045 * Return QDF_STATUS
5046 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08005047QDF_STATUS sme_configure_app_type1_params(mac_handle_t mac_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005048 tpSirAppType1Params wlanAppType1Params)
5049{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305050 QDF_STATUS status = QDF_STATUS_SUCCESS;
5051 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08005052 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Rajeev Kumar37d478b2017-04-17 16:59:28 -07005053 struct scheduler_msg message = {0};
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305054 tpSirAppType1Params MsgPtr = qdf_mem_malloc(sizeof(*MsgPtr));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005055
5056 if (!MsgPtr)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305057 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005058
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05305059 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005060 TRACE_CODE_SME_RX_HDD_CONFIG_APP_TYPE1, NO_SESSION,
5061 0));
5062
Jeff Johnson01f2c232018-11-21 19:17:44 -08005063 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305064 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005065 /* serialize the req through MC thread */
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305066 qdf_mem_copy(MsgPtr, wlanAppType1Params, sizeof(*MsgPtr));
Rajeev Kumar8eaedf62017-01-21 11:03:13 -08005067 message.bodyptr = MsgPtr;
5068 message.type = WMA_WLAN_SET_APP_TYPE1_PARAMS;
gaurank kathpalia36b0c582018-08-28 17:45:43 +05305069 qdf_status = scheduler_post_message(QDF_MODULE_ID_SME,
5070 QDF_MODULE_ID_WMA,
5071 QDF_MODULE_ID_WMA,
5072 &message);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305073 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305074 qdf_mem_free(MsgPtr);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305075 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005076 }
Jeff Johnson01f2c232018-11-21 19:17:44 -08005077 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005078 } else {
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305079 qdf_mem_free(MsgPtr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005080 }
5081
5082 return status;
5083}
5084
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05305085/*
5086 * sme_configure_app_type2_params() -
5087 * SME will pass this request to lower mac to configure Indoor WoW parameters.
5088 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08005089 * mac_handle - The handle returned by mac_open.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05305090 * wlanAppType2Params- Depicts the wlan App Type 2 (Outdoor) params
5091 * Return QDF_STATUS
5092 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08005093QDF_STATUS sme_configure_app_type2_params(mac_handle_t mac_handle,
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05305094 tpSirAppType2Params wlanAppType2Params)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005095{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305096 QDF_STATUS status = QDF_STATUS_SUCCESS;
5097 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08005098 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Rajeev Kumar37d478b2017-04-17 16:59:28 -07005099 struct scheduler_msg message = {0};
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305100 tpSirAppType2Params MsgPtr = qdf_mem_malloc(sizeof(*MsgPtr));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005101
5102 if (!MsgPtr)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305103 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005104
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05305105 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005106 TRACE_CODE_SME_RX_HDD_CONFIG_APP_TYPE2, NO_SESSION,
5107 0));
5108
Jeff Johnson01f2c232018-11-21 19:17:44 -08005109 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305110 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005111 /* serialize the req through MC thread */
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305112 qdf_mem_copy(MsgPtr, wlanAppType2Params, sizeof(*MsgPtr));
Rajeev Kumar8eaedf62017-01-21 11:03:13 -08005113 message.bodyptr = MsgPtr;
5114 message.type = WMA_WLAN_SET_APP_TYPE2_PARAMS;
gaurank kathpalia36b0c582018-08-28 17:45:43 +05305115 qdf_status = scheduler_post_message(QDF_MODULE_ID_SME,
5116 QDF_MODULE_ID_WMA,
5117 QDF_MODULE_ID_WMA,
5118 &message);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305119 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305120 qdf_mem_free(MsgPtr);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305121 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005122 }
Jeff Johnson01f2c232018-11-21 19:17:44 -08005123 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005124 } else {
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305125 qdf_mem_free(MsgPtr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005126 }
5127
5128 return status;
5129}
5130#endif
5131
Abhishek Singhb1954c62019-02-14 10:18:28 +05305132uint8_t sme_get_beaconing_concurrent_operation_channel(mac_handle_t mac_handle,
5133 uint8_t vdev_id_to_skip)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005134{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305135 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08005136 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005137 uint8_t channel = 0;
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05305138
Jeff Johnson01f2c232018-11-21 19:17:44 -08005139 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305140 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005141
Abhishek Singhb1954c62019-02-14 10:18:28 +05305142 channel = csr_get_beaconing_concurrent_channel(mac,
5143 vdev_id_to_skip);
5144 sme_info("Other Concurrent Channel: %d skipped vdev_id %d",
5145 channel, vdev_id_to_skip);
Jeff Johnson01f2c232018-11-21 19:17:44 -08005146 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005147 }
5148
5149 return channel;
5150}
5151
5152#ifdef FEATURE_WLAN_MCC_TO_SCC_SWITCH
Jeff Johnsonb460dd72018-11-08 10:26:51 -08005153uint16_t sme_check_concurrent_channel_overlap(mac_handle_t mac_handle,
Jeff Johnson1f2dabc2018-11-07 15:33:01 -08005154 uint16_t sap_ch,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005155 eCsrPhyMode sapPhyMode,
5156 uint8_t cc_switch_mode)
5157{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305158 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08005159 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005160 uint16_t channel = 0;
5161
Jeff Johnson01f2c232018-11-21 19:17:44 -08005162 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305163 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005164 channel =
Jeff Johnson01f2c232018-11-21 19:17:44 -08005165 csr_check_concurrent_channel_overlap(mac, sap_ch,
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05305166 sapPhyMode,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005167 cc_switch_mode);
Jeff Johnson01f2c232018-11-21 19:17:44 -08005168 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005169 }
5170
5171 return channel;
5172}
5173#endif
5174
Arun Khandavalli4b55da72016-07-19 19:55:01 +05305175/**
Manikandan Mohandcc21ba2016-03-15 14:31:56 -07005176 * sme_set_tsfcb() - Set callback for TSF capture
Jeff Johnsonb460dd72018-11-08 10:26:51 -08005177 * @mac_handle: Handler return by mac_open
Manikandan Mohandcc21ba2016-03-15 14:31:56 -07005178 * @cb_fn: Callback function pointer
5179 * @db_ctx: Callback data
5180 *
5181 * Return: QDF_STATUS
5182 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08005183QDF_STATUS sme_set_tsfcb(mac_handle_t mac_handle,
Manikandan Mohandcc21ba2016-03-15 14:31:56 -07005184 int (*cb_fn)(void *cb_ctx, struct stsf *ptsf), void *cb_ctx)
5185{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08005186 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Manikandan Mohandcc21ba2016-03-15 14:31:56 -07005187 QDF_STATUS status;
5188
Manikandan Mohan976e7562016-03-15 16:33:31 -07005189 status = sme_acquire_global_lock(&mac->sme);
Manikandan Mohandcc21ba2016-03-15 14:31:56 -07005190 if (QDF_IS_STATUS_SUCCESS(status)) {
Manikandan Mohan976e7562016-03-15 16:33:31 -07005191 mac->sme.get_tsf_cb = cb_fn;
5192 mac->sme.get_tsf_cxt = cb_ctx;
5193 sme_release_global_lock(&mac->sme);
Manikandan Mohandcc21ba2016-03-15 14:31:56 -07005194 }
5195 return status;
5196}
5197
Arun Khandavalli4b55da72016-07-19 19:55:01 +05305198/**
5199 * sme_reset_tsfcb() - Reset callback for TSF capture
Jeff Johnsonb460dd72018-11-08 10:26:51 -08005200 * @mac_handle: Handler return by mac_open
Arun Khandavalli4b55da72016-07-19 19:55:01 +05305201 *
5202 * This function reset the tsf capture callback to SME
5203 *
5204 * Return: QDF_STATUS
5205 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08005206QDF_STATUS sme_reset_tsfcb(mac_handle_t mac_handle)
Arun Khandavalli4b55da72016-07-19 19:55:01 +05305207{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08005208 struct mac_context *mac;
Arun Khandavalli4b55da72016-07-19 19:55:01 +05305209 QDF_STATUS status;
5210
Jeff Johnsonb460dd72018-11-08 10:26:51 -08005211 if (!mac_handle) {
Arun Khandavalli4b55da72016-07-19 19:55:01 +05305212 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Jeff Johnsonb460dd72018-11-08 10:26:51 -08005213 FL("mac_handle is not valid"));
Arun Khandavalli4b55da72016-07-19 19:55:01 +05305214 return QDF_STATUS_E_INVAL;
5215 }
Jeff Johnsona0619e42018-11-28 17:43:00 -08005216 mac = MAC_CONTEXT(mac_handle);
Arun Khandavalli4b55da72016-07-19 19:55:01 +05305217
5218 status = sme_acquire_global_lock(&mac->sme);
5219 if (QDF_IS_STATUS_SUCCESS(status)) {
5220 mac->sme.get_tsf_cb = NULL;
5221 mac->sme.get_tsf_cxt = NULL;
5222 sme_release_global_lock(&mac->sme);
5223 }
5224 return status;
5225}
5226
yuanl2746f072018-09-21 19:19:16 +08005227#if defined(WLAN_FEATURE_TSF) && !defined(WLAN_FEATURE_TSF_PLUS_NOIRQ)
Manikandan Mohan976e7562016-03-15 16:33:31 -07005228/*
yuanl2746f072018-09-21 19:19:16 +08005229 * sme_set_tsf_gpio() - set gpio pin that be toggled when capture tsf
Jeff Johnsonb460dd72018-11-08 10:26:51 -08005230 * @mac_handle: Handler return by mac_open
Manikandan Mohan976e7562016-03-15 16:33:31 -07005231 * @pinvalue: gpio pin id
5232 *
5233 * Return: QDF_STATUS
5234 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08005235QDF_STATUS sme_set_tsf_gpio(mac_handle_t mac_handle, uint32_t pinvalue)
Manikandan Mohan976e7562016-03-15 16:33:31 -07005236{
5237 QDF_STATUS status;
Rajeev Kumar8eaedf62017-01-21 11:03:13 -08005238 struct scheduler_msg tsf_msg = {0};
Jeff Johnson0a8786a2018-12-02 10:49:01 -08005239 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Manikandan Mohan976e7562016-03-15 16:33:31 -07005240
5241 status = sme_acquire_global_lock(&mac->sme);
5242 if (QDF_IS_STATUS_SUCCESS(status)) {
5243 tsf_msg.type = WMA_TSF_GPIO_PIN;
5244 tsf_msg.reserved = 0;
5245 tsf_msg.bodyval = pinvalue;
5246
gaurank kathpalia36b0c582018-08-28 17:45:43 +05305247 status = scheduler_post_message(QDF_MODULE_ID_SME,
5248 QDF_MODULE_ID_WMA,
5249 QDF_MODULE_ID_WMA, &tsf_msg);
Manikandan Mohan976e7562016-03-15 16:33:31 -07005250 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07005251 sme_err("Unable to post WMA_TSF_GPIO_PIN");
Manikandan Mohan976e7562016-03-15 16:33:31 -07005252 status = QDF_STATUS_E_FAILURE;
5253 }
5254 sme_release_global_lock(&mac->sme);
5255 }
5256 return status;
5257}
5258#endif
5259
Tushnim Bhattacharyya0c4ad2d2017-03-09 15:59:03 -08005260QDF_STATUS sme_get_cfg_valid_channels(uint8_t *aValidChannels,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005261 uint32_t *len)
5262{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305263 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08005264 struct mac_context *mac_ctx = sme_get_mac_context();
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005265
Jeff Johnson038efe72019-03-18 13:39:31 -07005266 if (!mac_ctx) {
Tushnim Bhattacharyya0c4ad2d2017-03-09 15:59:03 -08005267 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
5268 FL("Invalid MAC context"));
5269 return QDF_STATUS_E_FAILURE;
5270 }
5271
5272 status = sme_acquire_global_lock(&mac_ctx->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305273 if (QDF_IS_STATUS_SUCCESS(status)) {
Tushnim Bhattacharyya0c4ad2d2017-03-09 15:59:03 -08005274 status = csr_get_cfg_valid_channels(mac_ctx,
5275 aValidChannels, len);
5276 sme_release_global_lock(&mac_ctx->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005277 }
5278
5279 return status;
5280}
5281
Amar Singhalf0a94ad2017-11-27 15:20:00 -08005282static uint8_t *sme_reg_hint_to_str(const enum country_src src)
5283{
5284 switch (src) {
5285 case SOURCE_CORE:
5286 return "WORLD MODE";
5287
5288 case SOURCE_DRIVER:
5289 return "BDF file";
5290
5291 case SOURCE_USERSPACE:
5292 return "user-space";
5293
5294 case SOURCE_11D:
5295 return "802.11D IEs in beacons";
5296
5297 default:
5298 return "unknown";
5299 }
5300}
5301
Jeff Johnsonb460dd72018-11-08 10:26:51 -08005302void sme_set_cc_src(mac_handle_t mac_handle, enum country_src cc_src)
Amar Singhal6edf9732016-11-20 21:43:40 -08005303{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08005304 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Amar Singhal6edf9732016-11-20 21:43:40 -08005305
5306 mac_ctx->reg_hint_src = cc_src;
Amar Singhalf0a94ad2017-11-27 15:20:00 -08005307
5308 sme_debug("Country source is %s",
5309 sme_reg_hint_to_str(cc_src));
Amar Singhal6edf9732016-11-20 21:43:40 -08005310}
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005311
5312/**
Amar Singhal7f1f3ec2015-10-13 17:14:08 -07005313 * sme_handle_generic_change_country_code() - handles country ch req
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005314 * @mac_ctx: mac global context
5315 * @msg: request msg packet
5316 *
5317 * If Supplicant country code is priority than 11d is disabled.
5318 * If 11D is enabled, we update the country code after every scan.
5319 * Hence when Supplicant country code is priority, we don't need 11D info.
5320 * Country code from Supplicant is set as current country code.
5321 *
5322 * Return: status of operation
5323 */
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05305324static QDF_STATUS
Jeff Johnson0a8786a2018-12-02 10:49:01 -08005325sme_handle_generic_change_country_code(struct mac_context *mac_ctx,
Amar Singhal7f1f3ec2015-10-13 17:14:08 -07005326 void *pMsgBuf)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005327{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305328 QDF_STATUS status = QDF_STATUS_SUCCESS;
Amar Singhal7f1f3ec2015-10-13 17:14:08 -07005329 v_REGDOMAIN_t reg_domain_id = 0;
Amar Singhalb6d0dc42016-10-19 09:45:05 -07005330 bool user_ctry_priority =
Bala Venkatesh46e29032018-11-14 18:24:55 +05305331 mac_ctx->mlme_cfg->sap_cfg.country_code_priority;
Amar Singhal7f1f3ec2015-10-13 17:14:08 -07005332 tAniGenericChangeCountryCodeReq *msg = pMsgBuf;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005333
Amar Singhal6edf9732016-11-20 21:43:40 -08005334 if (SOURCE_11D != mac_ctx->reg_hint_src) {
5335 if (SOURCE_DRIVER != mac_ctx->reg_hint_src) {
5336 if (user_ctry_priority)
Abhinav Kumard4d6eb72018-12-04 20:30:37 +05305337 mac_ctx->mlme_cfg->gen.enabled_11d = false;
Amar Singhal6edf9732016-11-20 21:43:40 -08005338 else {
Abhinav Kumard4d6eb72018-12-04 20:30:37 +05305339 if (mac_ctx->mlme_cfg->gen.enabled_11d &&
5340 mac_ctx->scan.countryCode11d[0] != 0) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005341
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07005342 sme_debug("restore 11d");
Amar Singhalb6d0dc42016-10-19 09:45:05 -07005343
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05305344 status =
5345 csr_get_regulatory_domain_for_country(
Amar Singhal6edf9732016-11-20 21:43:40 -08005346 mac_ctx,
5347 mac_ctx->scan.countryCode11d,
5348 &reg_domain_id,
5349 SOURCE_11D);
5350 return QDF_STATUS_E_FAILURE;
5351 }
Amar Singhalb6d0dc42016-10-19 09:45:05 -07005352 }
5353 }
5354 } else {
5355 /* if kernel gets invalid country code; it
5356 * resets the country code to world
5357 */
5358 if (('0' != msg->countryCode[0]) ||
5359 ('0' != msg->countryCode[1]))
5360 qdf_mem_copy(mac_ctx->scan.countryCode11d,
5361 msg->countryCode,
Wu Gaoaa155142019-01-14 15:09:26 +08005362 CFG_COUNTRY_CODE_LEN);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005363 }
Amar Singhal7f1f3ec2015-10-13 17:14:08 -07005364
Amar Singhalb6d0dc42016-10-19 09:45:05 -07005365 qdf_mem_copy(mac_ctx->scan.countryCodeCurrent,
5366 msg->countryCode,
Wu Gaoaa155142019-01-14 15:09:26 +08005367 CFG_COUNTRY_CODE_LEN);
Amar Singhal9d5b1fe2016-10-16 20:16:05 -07005368
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005369 /* get the channels based on new cc */
5370 status = csr_get_channel_and_power_list(mac_ctx);
5371
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305372 if (status != QDF_STATUS_SUCCESS) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07005373 sme_err("fail to get Channels");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005374 return status;
5375 }
Amar Singhalb6d0dc42016-10-19 09:45:05 -07005376
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005377 /* reset info based on new cc, and we are done */
5378 csr_apply_channel_power_info_wrapper(mac_ctx);
5379
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005380 csr_scan_filter_results(mac_ctx);
Amar Singhalb6d0dc42016-10-19 09:45:05 -07005381
5382 /* scans after the country is set by User hints or
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005383 * Country IE
5384 */
5385 mac_ctx->scan.curScanType = eSIR_ACTIVE_SCAN;
Amar Singhal9d5b1fe2016-10-16 20:16:05 -07005386
Amar Singhal6edf9732016-11-20 21:43:40 -08005387 mac_ctx->reg_hint_src = SOURCE_UNKNOWN;
5388
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005389 sme_disconnect_connected_sessions(mac_ctx);
Amar Singhalb6d0dc42016-10-19 09:45:05 -07005390
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305391 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005392}
5393
Jeff Johnsonc7309062018-11-09 20:59:42 -08005394QDF_STATUS sme_update_channel_list(mac_handle_t mac_handle)
Mukul Sharmaecf8e092017-12-19 22:36:31 +05305395{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08005396 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Jeff Johnson330c0bf2018-06-01 15:13:12 -07005397 QDF_STATUS status;
Mukul Sharmaecf8e092017-12-19 22:36:31 +05305398
5399 status = sme_acquire_global_lock(&mac_ctx->sme);
5400 if (QDF_IS_STATUS_SUCCESS(status)) {
5401 /* Update umac channel (enable/disable) from cds channels */
5402 status = csr_get_channel_and_power_list(mac_ctx);
5403 if (status != QDF_STATUS_SUCCESS) {
5404 sme_err("fail to get Channels");
5405 sme_release_global_lock(&mac_ctx->sme);
5406 return status;
5407 }
5408
5409 csr_apply_channel_power_info_wrapper(mac_ctx);
5410 csr_scan_filter_results(mac_ctx);
5411 sme_disconnect_connected_sessions(mac_ctx);
5412 sme_release_global_lock(&mac_ctx->sme);
5413 }
5414
5415 return status;
5416}
5417
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005418static bool
Jeff Johnson0a8786a2018-12-02 10:49:01 -08005419sme_search_in_base_ch_lst(struct mac_context *mac_ctx, uint8_t curr_ch)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005420{
5421 uint8_t i;
gaurank kathpalia14e2f912017-08-31 14:51:45 +05305422 struct csr_channel *ch_lst_info;
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05305423
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005424 ch_lst_info = &mac_ctx->scan.base_channels;
5425 for (i = 0; i < ch_lst_info->numChannels; i++) {
5426 if (ch_lst_info->channelList[i] == curr_ch)
5427 return true;
5428 }
5429
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005430 return false;
5431}
5432/**
5433 * sme_disconnect_connected_sessions() - Disconnect STA and P2P client session
5434 * if channel is not supported
5435 * @mac_ctx: mac global context
5436 *
5437 * If new country code does not support the channel on which STA/P2P client
5438 * is connetced, it sends the disconnect to the AP/P2P GO
5439 *
5440 * Return: void
5441 */
Jeff Johnson0a8786a2018-12-02 10:49:01 -08005442static void sme_disconnect_connected_sessions(struct mac_context *mac_ctx)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005443{
5444 uint8_t session_id, found = false;
5445 uint8_t curr_ch;
5446
Dustin Brownad06be62019-02-04 14:52:56 -08005447 for (session_id = 0; session_id < WLAN_MAX_VDEVS; session_id++) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005448 if (!csr_is_session_client_and_connected(mac_ctx, session_id))
5449 continue;
5450 found = false;
5451 /* Session is connected.Check the channel */
5452 curr_ch = csr_get_infra_operation_channel(mac_ctx,
5453 session_id);
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07005454 sme_debug("Current Operating channel : %d, session :%d",
5455 curr_ch, session_id);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005456 found = sme_search_in_base_ch_lst(mac_ctx, curr_ch);
5457 if (!found) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07005458 sme_debug("Disconnect Session: %d", session_id);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005459 csr_roam_disconnect(mac_ctx, session_id,
5460 eCSR_DISCONNECT_REASON_UNSPECIFIED);
5461 }
5462 }
5463}
5464
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005465#ifdef WLAN_FEATURE_PACKET_FILTERING
Jeff Johnsonb460dd72018-11-08 10:26:51 -08005466QDF_STATUS sme_8023_multicast_list(mac_handle_t mac_handle, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005467 tpSirRcvFltMcAddrList pMulticastAddrs)
5468{
5469 tpSirRcvFltMcAddrList request_buf;
Rajeev Kumar37d478b2017-04-17 16:59:28 -07005470 struct scheduler_msg msg = {0};
Jeff Johnson0a8786a2018-12-02 10:49:01 -08005471 struct mac_context *mac = MAC_CONTEXT(mac_handle);
gaurank kathpalia14e2f912017-08-31 14:51:45 +05305472 struct csr_roam_session *pSession = NULL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005473
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05305474 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
5475 "%s: ulMulticastAddrCnt: %d, multicastAddr[0]: %pK", __func__,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005476 pMulticastAddrs->ulMulticastAddrCnt,
Srinivas Girigowda98530492015-11-20 17:39:24 -08005477 pMulticastAddrs->multicastAddr[0].bytes);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005478
Ravi Joshi4f447cb2016-07-19 13:42:01 -07005479 /* Find the connected Infra / P2P_client connected session */
Jeff Johnson01f2c232018-11-21 19:17:44 -08005480 pSession = CSR_GET_SESSION(mac, sessionId);
5481 if (!CSR_IS_SESSION_VALID(mac, sessionId) ||
5482 (!csr_is_conn_state_infra(mac, sessionId) &&
5483 !csr_is_ndi_started(mac, sessionId))) {
Abhishek Singh5d8d7332017-08-10 15:15:24 +05305484 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Srinivas Girigowdaf2599dd2015-11-16 18:20:46 -08005485 "%s: Unable to find the session Id: %d", __func__,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005486 sessionId);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305487 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005488 }
5489
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305490 request_buf = qdf_mem_malloc(sizeof(tSirRcvFltMcAddrList));
Arif Hussain0ef77082018-10-10 16:42:53 -07005491 if (!request_buf)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305492 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005493
Jeff Johnson01f2c232018-11-21 19:17:44 -08005494 if (!csr_is_conn_state_connected_infra(mac, sessionId) &&
5495 !csr_is_ndi_started(mac, sessionId)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05305496 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Ravi Joshi4f447cb2016-07-19 13:42:01 -07005497 "%s: Request ignored, session %d is not connected or started",
5498 __func__, sessionId);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305499 qdf_mem_free(request_buf);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305500 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005501 }
5502
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305503 qdf_mem_copy(request_buf, pMulticastAddrs,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005504 sizeof(tSirRcvFltMcAddrList));
5505
Anurag Chouhanc5548422016-02-24 18:33:27 +05305506 qdf_copy_macaddr(&request_buf->self_macaddr, &pSession->selfMacAddr);
5507 qdf_copy_macaddr(&request_buf->bssid,
Srinivas Girigowda98530492015-11-20 17:39:24 -08005508 &pSession->connectedProfile.bssid);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005509
5510 msg.type = WMA_8023_MULTICAST_LIST_REQ;
5511 msg.reserved = 0;
5512 msg.bodyptr = request_buf;
Sreelakshmi Konamki6a065362016-05-31 16:05:01 +05305513 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
5514 sessionId, msg.type));
gaurank kathpalia36b0c582018-08-28 17:45:43 +05305515 if (QDF_STATUS_SUCCESS != scheduler_post_message(QDF_MODULE_ID_SME,
5516 QDF_MODULE_ID_WMA,
5517 QDF_MODULE_ID_WMA,
5518 &msg)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05305519 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05305520 "%s: Not able to post WMA_8023_MULTICAST_LIST message to WMA",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005521 __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305522 qdf_mem_free(request_buf);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305523 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005524 }
5525
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305526 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005527}
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005528#endif /* WLAN_FEATURE_PACKET_FILTERING */
5529
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05305530/*
5531 * sme_is_channel_valid() -
5532 * To check if the channel is valid for currently established domain
5533 * This is a synchronous API.
5534 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08005535 * mac_handle - The handle returned by mac_open.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05305536 * channel - channel to verify
5537 * Return true/false, true if channel is valid
5538 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08005539bool sme_is_channel_valid(mac_handle_t mac_handle, uint8_t channel)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005540{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305541 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005542 bool valid = false;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08005543 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005544
Jeff Johnson01f2c232018-11-21 19:17:44 -08005545 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305546 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005547
Jeff Johnson01f2c232018-11-21 19:17:44 -08005548 valid = csr_roam_is_channel_valid(mac, channel);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005549
Jeff Johnson01f2c232018-11-21 19:17:44 -08005550 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005551 }
5552
5553 return valid;
5554}
5555
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05305556/*
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05305557 * sme_set_max_tx_power_per_band() -
5558 * Set the Maximum Transmit Power specific to band dynamically.
5559 * Note: this setting will not persist over reboots.
5560 *
5561 * band
5562 * power to set in dB
5563 * Return QDF_STATUS
5564 */
Varun Reddy Yeturua48bc412017-11-17 15:33:35 -08005565QDF_STATUS sme_set_max_tx_power_per_band(enum band_info band, int8_t dB)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005566{
Rajeev Kumar37d478b2017-04-17 16:59:28 -07005567 struct scheduler_msg msg = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005568 tpMaxTxPowerPerBandParams pMaxTxPowerPerBandParams = NULL;
5569
5570 pMaxTxPowerPerBandParams =
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305571 qdf_mem_malloc(sizeof(tMaxTxPowerPerBandParams));
Arif Hussain0ef77082018-10-10 16:42:53 -07005572 if (!pMaxTxPowerPerBandParams)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305573 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005574
5575 pMaxTxPowerPerBandParams->power = dB;
5576 pMaxTxPowerPerBandParams->bandInfo = band;
5577
5578 msg.type = WMA_SET_MAX_TX_POWER_PER_BAND_REQ;
5579 msg.reserved = 0;
5580 msg.bodyptr = pMaxTxPowerPerBandParams;
Sreelakshmi Konamki6a065362016-05-31 16:05:01 +05305581 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
5582 NO_SESSION, msg.type));
gaurank kathpalia36b0c582018-08-28 17:45:43 +05305583 if (QDF_STATUS_SUCCESS != scheduler_post_message(QDF_MODULE_ID_SME,
5584 QDF_MODULE_ID_WMA,
5585 QDF_MODULE_ID_WMA,
5586 &msg)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05305587 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005588 "%s:Not able to post WMA_SET_MAX_TX_POWER_PER_BAND_REQ",
5589 __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305590 qdf_mem_free(pMaxTxPowerPerBandParams);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305591 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005592 }
5593
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305594 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005595}
5596
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05305597/*
5598 * sme_set_max_tx_power() -
5599 * Set the Maximum Transmit Power dynamically. Note: this setting will
5600 * not persist over reboots.
5601 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08005602 * mac_handle
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05305603 * pBssid BSSID to set the power cap for
5604 * pBssid pSelfMacAddress self MAC Address
5605 * pBssid power to set in dB
5606 * Return QDF_STATUS
5607 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08005608QDF_STATUS sme_set_max_tx_power(mac_handle_t mac_handle,
5609 struct qdf_mac_addr pBssid,
Anurag Chouhan6d760662016-02-20 16:05:43 +05305610 struct qdf_mac_addr pSelfMacAddress, int8_t dB)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005611{
Rajeev Kumar37d478b2017-04-17 16:59:28 -07005612 struct scheduler_msg msg = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005613 tpMaxTxPowerParams pMaxTxParams = NULL;
5614
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05305615 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005616 TRACE_CODE_SME_RX_HDD_SET_MAXTXPOW, NO_SESSION, 0));
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305617 pMaxTxParams = qdf_mem_malloc(sizeof(tMaxTxPowerParams));
Arif Hussain0ef77082018-10-10 16:42:53 -07005618 if (!pMaxTxParams)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305619 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005620
Anurag Chouhanc5548422016-02-24 18:33:27 +05305621 qdf_copy_macaddr(&pMaxTxParams->bssId, &pBssid);
5622 qdf_copy_macaddr(&pMaxTxParams->selfStaMacAddr, &pSelfMacAddress);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005623 pMaxTxParams->power = dB;
5624
5625 msg.type = WMA_SET_MAX_TX_POWER_REQ;
5626 msg.reserved = 0;
5627 msg.bodyptr = pMaxTxParams;
5628
gaurank kathpalia36b0c582018-08-28 17:45:43 +05305629 if (QDF_STATUS_SUCCESS != scheduler_post_message(QDF_MODULE_ID_SME,
5630 QDF_MODULE_ID_WMA,
5631 QDF_MODULE_ID_WMA,
5632 &msg)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05305633 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005634 "%s: Not able to post WMA_SET_MAX_TX_POWER_REQ message to WMA",
5635 __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305636 qdf_mem_free(pMaxTxParams);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305637 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005638 }
5639
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305640 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005641}
5642
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05305643/*
5644 * sme_set_custom_mac_addr() -
5645 * Set the customer Mac Address.
5646 *
5647 * customMacAddr customer MAC Address
5648 * Return QDF_STATUS
5649 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305650QDF_STATUS sme_set_custom_mac_addr(tSirMacAddr customMacAddr)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005651{
Rajeev Kumar37d478b2017-04-17 16:59:28 -07005652 struct scheduler_msg msg = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005653 tSirMacAddr *pBaseMacAddr;
5654
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305655 pBaseMacAddr = qdf_mem_malloc(sizeof(tSirMacAddr));
Arif Hussain0ef77082018-10-10 16:42:53 -07005656 if (!pBaseMacAddr)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305657 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005658
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305659 qdf_mem_copy(*pBaseMacAddr, customMacAddr, sizeof(tSirMacAddr));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005660
5661 msg.type = SIR_HAL_SET_BASE_MACADDR_IND;
5662 msg.reserved = 0;
5663 msg.bodyptr = pBaseMacAddr;
5664
gaurank kathpalia36b0c582018-08-28 17:45:43 +05305665 if (QDF_STATUS_SUCCESS != scheduler_post_message(QDF_MODULE_ID_SME,
5666 QDF_MODULE_ID_WMA,
5667 QDF_MODULE_ID_WMA,
5668 &msg)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05305669 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05305670 "Not able to post SIR_HAL_SET_BASE_MACADDR_IND message to WMA");
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305671 qdf_mem_free(pBaseMacAddr);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305672 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005673 }
5674
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305675 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005676}
5677
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05305678/*
5679 * sme_set_tx_power() -
5680 * Set Transmit Power dynamically.
5681 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08005682 * mac_handle
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05305683 * sessionId Target Session ID
5684 * BSSID
5685 * dev_mode dev_mode such as station, P2PGO, SAP
5686 * dBm power to set
5687 * Return QDF_STATUS
5688 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08005689QDF_STATUS sme_set_tx_power(mac_handle_t mac_handle, uint8_t sessionId,
Anurag Chouhan6d760662016-02-20 16:05:43 +05305690 struct qdf_mac_addr pBSSId,
Jeff Johnsonc1e62782017-11-09 09:50:17 -08005691 enum QDF_OPMODE dev_mode, int dBm)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005692{
Rajeev Kumar37d478b2017-04-17 16:59:28 -07005693 struct scheduler_msg msg = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005694 tpMaxTxPowerParams pTxParams = NULL;
5695 int8_t power = (int8_t) dBm;
5696
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05305697 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005698 TRACE_CODE_SME_RX_HDD_SET_TXPOW, sessionId, 0));
5699
5700 /* make sure there is no overflow */
5701 if ((int)power != dBm) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05305702 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005703 "%s: error, invalid power = %d", __func__, dBm);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305704 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005705 }
5706
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305707 pTxParams = qdf_mem_malloc(sizeof(tMaxTxPowerParams));
Arif Hussain0ef77082018-10-10 16:42:53 -07005708 if (!pTxParams)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305709 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005710
Anurag Chouhanc5548422016-02-24 18:33:27 +05305711 qdf_copy_macaddr(&pTxParams->bssId, &pBSSId);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005712 pTxParams->power = power; /* unit is dBm */
5713 pTxParams->dev_mode = dev_mode;
5714 msg.type = WMA_SET_TX_POWER_REQ;
5715 msg.reserved = 0;
5716 msg.bodyptr = pTxParams;
5717
gaurank kathpalia36b0c582018-08-28 17:45:43 +05305718 if (QDF_STATUS_SUCCESS != scheduler_post_message(QDF_MODULE_ID_SME,
5719 QDF_MODULE_ID_WMA,
5720 QDF_MODULE_ID_WMA,
5721 &msg)) {
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305722 qdf_mem_free(pTxParams);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305723 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005724 }
5725
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305726 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005727}
5728
Jeff Johnsonc7309062018-11-09 20:59:42 -08005729QDF_STATUS sme_update_session_param(mac_handle_t mac_handle, uint8_t session_id,
5730 uint32_t param_type, uint32_t param_val)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005731{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305732 QDF_STATUS status = QDF_STATUS_SUCCESS;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08005733 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005734 uint16_t len;
5735
Selvaraj, Sridhar7231c5f2016-09-28 12:42:33 +05305736 status = sme_acquire_global_lock(&mac_ctx->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305737 if (QDF_IS_STATUS_SUCCESS(status)) {
Selvaraj, Sridhar7231c5f2016-09-28 12:42:33 +05305738 struct sir_update_session_param *msg;
gaurank kathpalia14e2f912017-08-31 14:51:45 +05305739 struct csr_roam_session *session = CSR_GET_SESSION(mac_ctx,
5740 session_id);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005741
Selvaraj, Sridhar7231c5f2016-09-28 12:42:33 +05305742 if (!session) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07005743 sme_err("Session: %d not found", session_id);
Selvaraj, Sridhar7231c5f2016-09-28 12:42:33 +05305744 sme_release_global_lock(&mac_ctx->sme);
5745 return status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005746 }
5747
Selvaraj, Sridhar5b5a0652017-05-04 11:23:07 +05305748 if (param_type == SIR_PARAM_IGNORE_ASSOC_DISALLOWED)
5749 mac_ctx->ignore_assoc_disallowed = param_val;
5750
Selvaraj, Sridhar7231c5f2016-09-28 12:42:33 +05305751 if (!session->sessionActive)
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05305752 QDF_ASSERT(0);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005753
Selvaraj, Sridhar7231c5f2016-09-28 12:42:33 +05305754 len = sizeof(*msg);
5755 msg = qdf_mem_malloc(len);
5756 if (!msg)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305757 status = QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005758 else {
Selvaraj, Sridhar7231c5f2016-09-28 12:42:33 +05305759 msg->message_type = eWNI_SME_SESSION_UPDATE_PARAM;
5760 msg->length = len;
5761 msg->session_id = session_id;
5762 msg->param_type = param_type;
5763 msg->param_val = param_val;
Rajeev Kumard138ac52017-01-30 18:38:37 -08005764 status = umac_send_mb_message_to_mac(msg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005765 }
Selvaraj, Sridhar7231c5f2016-09-28 12:42:33 +05305766 sme_release_global_lock(&mac_ctx->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005767 }
5768 return status;
5769}
5770
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05305771/*
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05305772 * sme_update_roam_scan_n_probes() -
5773 * Function to update roam scan N probes
5774 * This function is called through dynamic setConfig callback function
5775 * to update roam scan N probes
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -08005776 * mac_handle: Opaque handle to the global MAC context
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05305777 * sessionId - Session Identifier
5778 * nProbes number of probe requests to be sent out
5779 * Return Success or failure
5780 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08005781QDF_STATUS sme_update_roam_scan_n_probes(mac_handle_t mac_handle,
5782 uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005783 const uint8_t nProbes)
5784{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08005785 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305786 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005787
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05305788 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005789 TRACE_CODE_SME_RX_HDD_UPDATE_ROAM_SCAN_N_PROBES,
5790 NO_SESSION, 0));
Jeff Johnson01f2c232018-11-21 19:17:44 -08005791 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305792 if (QDF_IS_STATUS_SUCCESS(status)) {
Abhishek Singhe4a1f882017-08-10 17:59:44 +05305793 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005794 "%s: gRoamScanNProbes is changed from %d to %d",
Wu Gao51a63562018-11-08 16:29:10 +08005795 __func__, mac->mlme_cfg->lfr.roam_scan_n_probes,
5796 nProbes);
5797 mac->mlme_cfg->lfr.roam_scan_n_probes = nProbes;
Vignesh Viswanathan4e65e8e2018-05-01 12:04:16 +05305798
Wu Gao51a63562018-11-08 16:29:10 +08005799 if (mac->mlme_cfg->lfr.roam_scan_offload_enabled) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08005800 csr_roam_offload_scan(mac, sessionId,
Vignesh Viswanathan4e65e8e2018-05-01 12:04:16 +05305801 ROAM_SCAN_OFFLOAD_UPDATE_CFG,
5802 REASON_NPROBES_CHANGED);
5803 }
Jeff Johnson01f2c232018-11-21 19:17:44 -08005804 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005805 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005806 return status;
5807}
5808
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05305809/*
5810 * sme_update_roam_scan_home_away_time() -
5811 * Function to update roam scan Home away time
5812 * This function is called through dynamic setConfig callback function
5813 * to update roam scan home away time
5814 *
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -08005815 * mac_handle: Opaque handle to the global MAC context
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05305816 * sessionId - Session Identifier
5817 * nRoamScanAwayTime Scan home away time
5818 * bSendOffloadCmd If true then send offload command to firmware
5819 * If false then command is not sent to firmware
5820 * Return Success or failure
5821 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08005822QDF_STATUS sme_update_roam_scan_home_away_time(
5823 mac_handle_t mac_handle,
5824 uint8_t sessionId,
5825 const uint16_t nRoamScanHomeAwayTime,
5826 const bool bSendOffloadCmd)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005827{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08005828 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305829 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005830
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05305831 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005832 TRACE_CODE_SME_RX_HDD_UPDATE_ROAM_SCAN_HOME_AWAY_TIME,
5833 NO_SESSION, 0));
Jeff Johnson01f2c232018-11-21 19:17:44 -08005834 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305835 if (QDF_IS_STATUS_SUCCESS(status)) {
Abhishek Singhe4a1f882017-08-10 17:59:44 +05305836 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005837 "%s: gRoamScanHomeAwayTime is changed from %d to %d",
5838 __func__,
Wu Gao51a63562018-11-08 16:29:10 +08005839 mac->mlme_cfg->lfr.roam_scan_home_away_time,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005840 nRoamScanHomeAwayTime);
Wu Gao51a63562018-11-08 16:29:10 +08005841 mac->mlme_cfg->lfr.roam_scan_home_away_time =
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005842 nRoamScanHomeAwayTime;
Vignesh Viswanathan4e65e8e2018-05-01 12:04:16 +05305843
Wu Gao51a63562018-11-08 16:29:10 +08005844 if (mac->mlme_cfg->lfr.roam_scan_offload_enabled &&
5845 bSendOffloadCmd) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08005846 csr_roam_offload_scan(mac, sessionId,
Vignesh Viswanathan4e65e8e2018-05-01 12:04:16 +05305847 ROAM_SCAN_OFFLOAD_UPDATE_CFG,
5848 REASON_HOME_AWAY_TIME_CHANGED);
5849 }
Jeff Johnson01f2c232018-11-21 19:17:44 -08005850 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005851 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005852 return status;
5853}
5854
Abhishek Singh518323d2015-10-19 17:42:01 +05305855/**
5856 * sme_ext_change_channel()- function to post send ECSA
5857 * action frame to csr.
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -08005858 * @mac_handle: Opaque handle to the global MAC context
Abhishek Singh518323d2015-10-19 17:42:01 +05305859 * @channel: new channel to switch
5860 * @session_id: senssion it should be sent on.
5861 *
5862 * This function is called to post ECSA frame to csr.
5863 *
5864 * Return: success if msg is sent else return failure
5865 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08005866QDF_STATUS sme_ext_change_channel(mac_handle_t mac_handle, uint32_t channel,
Abhishek Singh518323d2015-10-19 17:42:01 +05305867 uint8_t session_id)
5868{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305869 QDF_STATUS status = QDF_STATUS_SUCCESS;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08005870 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Abhishek Singh518323d2015-10-19 17:42:01 +05305871 uint8_t channel_state;
5872
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07005873 sme_err("Set Channel: %d", channel);
Abhishek Singh518323d2015-10-19 17:42:01 +05305874 channel_state =
Kiran Kumar Lokerea3de2262017-04-12 12:15:04 -07005875 wlan_reg_get_channel_state(mac_ctx->pdev, channel);
Abhishek Singh518323d2015-10-19 17:42:01 +05305876
5877 if (CHANNEL_STATE_DISABLE == channel_state) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07005878 sme_err("Invalid channel: %d", channel);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305879 return QDF_STATUS_E_INVAL;
Abhishek Singh518323d2015-10-19 17:42:01 +05305880 }
5881
5882 status = sme_acquire_global_lock(&mac_ctx->sme);
5883
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305884 if (QDF_STATUS_SUCCESS == status) {
Abhishek Singh518323d2015-10-19 17:42:01 +05305885 /* update the channel list to the firmware */
5886 status = csr_send_ext_change_channel(mac_ctx,
5887 channel, session_id);
5888 sme_release_global_lock(&mac_ctx->sme);
5889 }
5890
5891 return status;
5892}
5893
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05305894/*
5895 * sme_get_roam_intra_band() -
5896 * get Intra band roaming
5897 *
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -08005898 * mac_handle: Opaque handle to the global MAC context
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05305899 * Return Success or failure
5900 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08005901bool sme_get_roam_intra_band(mac_handle_t mac_handle)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005902{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08005903 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05305904
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05305905 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005906 TRACE_CODE_SME_RX_HDD_GET_ROAMIBAND, NO_SESSION, 0));
Wu Gao51a63562018-11-08 16:29:10 +08005907
5908 return mac->mlme_cfg->lfr.roam_intra_band;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005909}
5910
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05305911/*
5912 * sme_get_roam_scan_n_probes() -
5913 * get N Probes
5914 *
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -08005915 * mac_handle: Opaque handle to the global MAC context
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05305916 * Return Success or failure
5917 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08005918uint8_t sme_get_roam_scan_n_probes(mac_handle_t mac_handle)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005919{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08005920 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05305921
Wu Gao51a63562018-11-08 16:29:10 +08005922 return mac->mlme_cfg->lfr.roam_scan_n_probes;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005923}
5924
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05305925/*
5926 * sme_get_roam_scan_home_away_time() -
5927 * get Roam scan home away time
5928 *
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -08005929 * mac_handle: Opaque handle to the global MAC context
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05305930 * Return Success or failure
5931 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08005932uint16_t sme_get_roam_scan_home_away_time(mac_handle_t mac_handle)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005933{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08005934 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05305935
Wu Gao51a63562018-11-08 16:29:10 +08005936 return mac->mlme_cfg->lfr.roam_scan_home_away_time;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005937}
5938
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05305939/*
5940 * sme_update_roam_rssi_diff() -
5941 * Update RoamRssiDiff
5942 * This function is called through dynamic setConfig callback function
5943 * to configure RoamRssiDiff
5944 * Usage: adb shell iwpriv wlan0 setConfig RoamRssiDiff=[0 .. 125]
5945 *
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -08005946 * mac_handle: Opaque handle to the global MAC context
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05305947 * sessionId - Session Identifier
5948 * RoamRssiDiff - minimum rssi difference between potential
5949 * candidate and current AP.
5950 * Return Success or failure
5951 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005952
Jeff Johnsonb460dd72018-11-08 10:26:51 -08005953QDF_STATUS sme_update_roam_rssi_diff(mac_handle_t mac_handle, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005954 uint8_t RoamRssiDiff)
5955{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08005956 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305957 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005958
Dustin Brownad06be62019-02-04 14:52:56 -08005959 if (sessionId >= WLAN_MAX_VDEVS) {
Naveen Rawatc36f7eb2016-11-10 20:01:03 -08005960 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
5961 FL("Invalid sme session id: %d"), sessionId);
5962 return QDF_STATUS_E_INVAL;
5963 }
5964
Jeff Johnson01f2c232018-11-21 19:17:44 -08005965 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305966 if (QDF_IS_STATUS_SUCCESS(status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05305967 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005968 "LFR runtime successfully set roam rssi diff to %d - old value is %d - roam state is %s",
5969 RoamRssiDiff,
Wu Gao51a63562018-11-08 16:29:10 +08005970 mac->mlme_cfg->lfr.roam_rssi_diff,
Jeff Johnson01f2c232018-11-21 19:17:44 -08005971 mac_trace_get_neighbour_roam_state(mac->roam.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005972 neighborRoamInfo
5973 [sessionId].
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05305974 neighborRoamState));
Wu Gao51a63562018-11-08 16:29:10 +08005975 mac->mlme_cfg->lfr.roam_rssi_diff = RoamRssiDiff;
Vignesh Viswanathan4e65e8e2018-05-01 12:04:16 +05305976
Wu Gao51a63562018-11-08 16:29:10 +08005977 if (mac->mlme_cfg->lfr.roam_scan_offload_enabled)
Jeff Johnson01f2c232018-11-21 19:17:44 -08005978 csr_roam_offload_scan(mac, sessionId,
Vignesh Viswanathan4e65e8e2018-05-01 12:04:16 +05305979 ROAM_SCAN_OFFLOAD_UPDATE_CFG,
5980 REASON_RSSI_DIFF_CHANGED);
5981
Jeff Johnson01f2c232018-11-21 19:17:44 -08005982 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005983 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005984 return status;
5985}
5986
Vignesh Viswanathanc6d1e1c2017-09-18 12:32:49 +05305987#ifdef WLAN_FEATURE_FILS_SK
Jeff Johnsonc7309062018-11-09 20:59:42 -08005988QDF_STATUS sme_update_fils_config(mac_handle_t mac_handle, uint8_t session_id,
Jeff Johnson66ee8a92018-03-17 15:24:26 -07005989 struct csr_roam_profile *src_profile)
Vignesh Viswanathanc6d1e1c2017-09-18 12:32:49 +05305990{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08005991 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Vignesh Viswanathanc6d1e1c2017-09-18 12:32:49 +05305992 QDF_STATUS status = QDF_STATUS_SUCCESS;
5993 tpCsrNeighborRoamControlInfo neighbor_roam_info =
5994 &mac->roam.neighborRoamInfo[session_id];
5995
Dustin Brownad06be62019-02-04 14:52:56 -08005996 if (session_id >= WLAN_MAX_VDEVS) {
Vignesh Viswanathanc6d1e1c2017-09-18 12:32:49 +05305997 sme_err("Invalid sme session id: %d", session_id);
5998 return QDF_STATUS_E_INVAL;
5999 }
6000
6001 if (!src_profile) {
6002 sme_err("src roam profile NULL");
6003 return QDF_STATUS_E_INVAL;
6004 }
6005
Wu Gao51a63562018-11-08 16:29:10 +08006006 if (!mac->mlme_cfg->lfr.lfr_enabled ||
Vignesh Viswanathanc6d1e1c2017-09-18 12:32:49 +05306007 (neighbor_roam_info->neighborRoamState !=
6008 eCSR_NEIGHBOR_ROAM_STATE_CONNECTED)) {
6009 sme_info("Fast roam is disabled or not connected(%d)",
6010 neighbor_roam_info->neighborRoamState);
6011 return QDF_STATUS_E_PERM;
6012 }
6013
6014 csr_update_fils_config(mac, session_id, src_profile);
Jianmin Zhubf845932018-12-17 11:52:50 +08006015 if (csr_is_roam_offload_enabled(mac)) {
Vignesh Viswanathan4e65e8e2018-05-01 12:04:16 +05306016 status = sme_acquire_global_lock(&mac->sme);
6017 if (QDF_IS_STATUS_SUCCESS(status)) {
6018 sme_debug("Updating fils config to fw");
6019 csr_roam_offload_scan(mac, session_id,
6020 ROAM_SCAN_OFFLOAD_UPDATE_CFG,
6021 REASON_FILS_PARAMS_CHANGED);
6022 sme_release_global_lock(&mac->sme);
6023 } else {
6024 sme_err("Failed to acquire SME lock");
6025 }
Vignesh Viswanathanc6d1e1c2017-09-18 12:32:49 +05306026 } else {
6027 sme_info("LFR3 not enabled");
6028 return QDF_STATUS_E_INVAL;
6029 }
6030
6031 return status;
6032}
6033
Jeff Johnsonc7309062018-11-09 20:59:42 -08006034void sme_send_hlp_ie_info(mac_handle_t mac_handle, uint8_t session_id,
Jeff Johnson66ee8a92018-03-17 15:24:26 -07006035 struct csr_roam_profile *profile, uint32_t if_addr)
Vignesh Viswanathanc6d1e1c2017-09-18 12:32:49 +05306036{
6037 int i;
6038 struct scheduler_msg msg;
6039 QDF_STATUS status;
6040 struct hlp_params *params;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08006041 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Vignesh Viswanathanc6d1e1c2017-09-18 12:32:49 +05306042 struct csr_roam_session *session = CSR_GET_SESSION(mac, session_id);
6043 tpCsrNeighborRoamControlInfo neighbor_roam_info =
6044 &mac->roam.neighborRoamInfo[session_id];
6045
6046 if (!session) {
6047 sme_err("session NULL");
6048 return;
6049 }
6050
Wu Gao51a63562018-11-08 16:29:10 +08006051 if (!mac->mlme_cfg->lfr.lfr_enabled ||
Vignesh Viswanathanc6d1e1c2017-09-18 12:32:49 +05306052 (neighbor_roam_info->neighborRoamState !=
6053 eCSR_NEIGHBOR_ROAM_STATE_CONNECTED)) {
6054 sme_debug("Fast roam is disabled or not connected(%d)",
6055 neighbor_roam_info->neighborRoamState);
6056 return;
6057 }
6058
6059 params = qdf_mem_malloc(sizeof(*params));
Arif Hussain0ef77082018-10-10 16:42:53 -07006060 if (!params)
Vignesh Viswanathanc6d1e1c2017-09-18 12:32:49 +05306061 return;
Arif Hussain0ef77082018-10-10 16:42:53 -07006062
Vignesh Viswanathanc6d1e1c2017-09-18 12:32:49 +05306063 if ((profile->hlp_ie_len +
6064 SIR_IPV4_ADDR_LEN) > FILS_MAX_HLP_DATA_LEN) {
6065 sme_err("HLP IE len exceeds %d",
6066 profile->hlp_ie_len);
6067 qdf_mem_free(params);
6068 return;
6069 }
6070
6071 params->vdev_id = session_id;
6072 params->hlp_ie_len = profile->hlp_ie_len + SIR_IPV4_ADDR_LEN;
6073
6074 for (i = 0; i < SIR_IPV4_ADDR_LEN; i++)
6075 params->hlp_ie[i] = (if_addr >> (i * 8)) & 0xFF;
6076
6077 qdf_mem_copy(params->hlp_ie + SIR_IPV4_ADDR_LEN,
6078 profile->hlp_ie, profile->hlp_ie_len);
6079
6080 msg.type = SIR_HAL_HLP_IE_INFO;
6081 msg.reserved = 0;
6082 msg.bodyptr = params;
6083 status = sme_acquire_global_lock(&mac->sme);
6084 if (status != QDF_STATUS_SUCCESS) {
6085 sme_err("sme lock acquire fails");
6086 qdf_mem_free(params);
6087 return;
6088 }
6089
6090 if (!QDF_IS_STATUS_SUCCESS
gaurank kathpalia36b0c582018-08-28 17:45:43 +05306091 (scheduler_post_message(QDF_MODULE_ID_SME,
6092 QDF_MODULE_ID_WMA,
6093 QDF_MODULE_ID_WMA, &msg))) {
Vignesh Viswanathanc6d1e1c2017-09-18 12:32:49 +05306094 sme_err("Not able to post WMA_HLP_IE_INFO message to HAL");
6095 sme_release_global_lock(&mac->sme);
6096 qdf_mem_free(params);
6097 return;
6098 }
6099
6100 sme_release_global_lock(&mac->sme);
6101}
6102
Jeff Johnson172237b2017-11-07 15:32:59 -08006103void sme_free_join_rsp_fils_params(struct csr_roam_info *roam_info)
Vignesh Viswanathanc6d1e1c2017-09-18 12:32:49 +05306104{
6105 struct fils_join_rsp_params *roam_fils_params;
6106
6107 if (!roam_info) {
6108 sme_err("FILS Roam Info NULL");
6109 return;
6110 }
6111
6112 roam_fils_params = roam_info->fils_join_rsp;
6113 if (!roam_fils_params) {
6114 sme_err("FILS Roam Param NULL");
6115 return;
6116 }
6117
6118 if (roam_fils_params->fils_pmk)
6119 qdf_mem_free(roam_fils_params->fils_pmk);
6120
6121 qdf_mem_free(roam_fils_params);
6122
6123 roam_info->fils_join_rsp = NULL;
6124}
6125
6126#else
Jeff Johnsonc7309062018-11-09 20:59:42 -08006127inline void sme_send_hlp_ie_info(mac_handle_t mac_handle, uint8_t session_id,
Jeff Johnson66ee8a92018-03-17 15:24:26 -07006128 struct csr_roam_profile *profile, uint32_t if_addr)
Vignesh Viswanathanc6d1e1c2017-09-18 12:32:49 +05306129{}
6130#endif
6131
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306132/*
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306133 * sme_update_wes_mode() -
6134 * Update WES Mode
6135 * This function is called through dynamic setConfig callback function
6136 * to configure isWESModeEnabled
6137 *
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -08006138 * mac_handle: Opaque handle to the global MAC context
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306139 * isWESModeEnabled - WES mode
6140 * sessionId - Session Identifier
6141 * Return QDF_STATUS_SUCCESS - SME update isWESModeEnabled config successfully.
6142 * Other status means SME is failed to update isWESModeEnabled.
6143 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006144
Jeff Johnsonb460dd72018-11-08 10:26:51 -08006145QDF_STATUS sme_update_wes_mode(mac_handle_t mac_handle, bool isWESModeEnabled,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006146 uint8_t sessionId)
6147{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08006148 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306149 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006150
Dustin Brownad06be62019-02-04 14:52:56 -08006151 if (sessionId >= WLAN_MAX_VDEVS) {
Naveen Rawatc36f7eb2016-11-10 20:01:03 -08006152 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
6153 FL("Invalid sme session id: %d"), sessionId);
6154 return QDF_STATUS_E_INVAL;
6155 }
6156
Jeff Johnson01f2c232018-11-21 19:17:44 -08006157 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306158 if (QDF_IS_STATUS_SUCCESS(status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05306159 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006160 "LFR runtime successfully set WES Mode to %d - old value is %d - roam state is %s",
6161 isWESModeEnabled,
Wu Gao51a63562018-11-08 16:29:10 +08006162 mac->mlme_cfg->lfr.wes_mode_enabled,
Jeff Johnson01f2c232018-11-21 19:17:44 -08006163 mac_trace_get_neighbour_roam_state(mac->roam.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006164 neighborRoamInfo
6165 [sessionId].
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306166 neighborRoamState));
Wu Gao51a63562018-11-08 16:29:10 +08006167 mac->mlme_cfg->lfr.wes_mode_enabled = isWESModeEnabled;
Jeff Johnson01f2c232018-11-21 19:17:44 -08006168 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006169 }
6170
6171 return status;
6172}
6173
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306174/*
6175 * sme_set_roam_scan_control() -
6176 * Set roam scan control
6177 * This function is called to set roam scan control
6178 * if roam scan control is set to 0, roaming scan cache is cleared
6179 * any value other than 0 is treated as invalid value
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -08006180 * mac_handle: Opaque handle to the global MAC context
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306181 * sessionId - Session Identifier
6182 * Return QDF_STATUS_SUCCESS - SME update config successfully.
6183 * Other status means SME failure to update
6184 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08006185QDF_STATUS sme_set_roam_scan_control(mac_handle_t mac_handle, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006186 bool roamScanControl)
6187{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08006188 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306189 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006190
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05306191 MTRACE(qdf_trace(QDF_MODULE_ID_SME,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006192 TRACE_CODE_SME_RX_HDD_SET_SCANCTRL, NO_SESSION, 0));
Naveen Rawatc36f7eb2016-11-10 20:01:03 -08006193
Dustin Brownad06be62019-02-04 14:52:56 -08006194 if (sessionId >= WLAN_MAX_VDEVS) {
Naveen Rawatc36f7eb2016-11-10 20:01:03 -08006195 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
6196 FL("Invalid sme session id: %d"), sessionId);
6197 return QDF_STATUS_E_INVAL;
6198 }
6199
Jeff Johnson01f2c232018-11-21 19:17:44 -08006200 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306201 if (QDF_IS_STATUS_SUCCESS(status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05306202 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006203 "LFR runtime successfully set roam scan control to %d - old value is %d - roam state is %s",
6204 roamScanControl,
Jeff Johnson01f2c232018-11-21 19:17:44 -08006205 mac->roam.configParam.nRoamScanControl,
6206 mac_trace_get_neighbour_roam_state(mac->roam.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006207 neighborRoamInfo
6208 [sessionId].
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306209 neighborRoamState));
Jeff Johnson01f2c232018-11-21 19:17:44 -08006210 mac->roam.configParam.nRoamScanControl = roamScanControl;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006211 if (0 == roamScanControl) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05306212 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006213 "LFR runtime successfully cleared roam scan cache");
Jeff Johnson01f2c232018-11-21 19:17:44 -08006214 csr_flush_cfg_bg_scan_roam_channel_list(mac,
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306215 sessionId);
Wu Gao51a63562018-11-08 16:29:10 +08006216 if (mac->mlme_cfg->lfr.roam_scan_offload_enabled) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08006217 csr_roam_offload_scan(mac, sessionId,
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306218 ROAM_SCAN_OFFLOAD_UPDATE_CFG,
6219 REASON_FLUSH_CHANNEL_LIST);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006220 }
6221 }
Jeff Johnson01f2c232018-11-21 19:17:44 -08006222 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006223 }
6224 return status;
6225}
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006226
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306227/*
6228 * sme_update_is_fast_roam_ini_feature_enabled() - enable/disable LFR
6229 * support at runtime
6230 * It is used at in the REG_DYNAMIC_VARIABLE macro definition of
6231 * isFastRoamIniFeatureEnabled.
6232 * This is a synchronous call
6233 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08006234 * mac_handle - The handle returned by mac_open.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306235 * sessionId - Session Identifier
6236 * Return QDF_STATUS_SUCCESS - SME update isFastRoamIniFeatureEnabled config
6237 * successfully.
6238 * Other status means SME is failed to update isFastRoamIniFeatureEnabled.
6239 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08006240QDF_STATUS sme_update_is_fast_roam_ini_feature_enabled(mac_handle_t mac_handle,
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306241 uint8_t sessionId, const bool isFastRoamIniFeatureEnabled)
6242{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08006243 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006244
Wu Gao51a63562018-11-08 16:29:10 +08006245 if (mac->mlme_cfg->lfr.lfr_enabled ==
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006246 isFastRoamIniFeatureEnabled) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05306247 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006248 "%s: FastRoam is already enabled or disabled, nothing to do (returning) old(%d) new(%d)",
6249 __func__,
Wu Gao51a63562018-11-08 16:29:10 +08006250 mac->mlme_cfg->lfr.lfr_enabled,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006251 isFastRoamIniFeatureEnabled);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306252 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006253 }
6254
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05306255 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006256 "%s: FastRoamEnabled is changed from %d to %d", __func__,
Wu Gao51a63562018-11-08 16:29:10 +08006257 mac->mlme_cfg->lfr.lfr_enabled,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006258 isFastRoamIniFeatureEnabled);
Wu Gao51a63562018-11-08 16:29:10 +08006259 mac->mlme_cfg->lfr.lfr_enabled = isFastRoamIniFeatureEnabled;
Jeff Johnson01f2c232018-11-21 19:17:44 -08006260 csr_neighbor_roam_update_fast_roaming_enabled(mac, sessionId,
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306261 isFastRoamIniFeatureEnabled);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006262
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306263 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006264}
6265
Mukul Sharma69c44cd2016-09-12 18:33:57 +05306266/**
6267 * sme_config_fast_roaming() - enable/disable LFR support at runtime
Jeff Johnsonc7309062018-11-09 20:59:42 -08006268 * @mac_handle - The handle returned by macOpen.
Mukul Sharma69c44cd2016-09-12 18:33:57 +05306269 * @session_id - Session Identifier
6270 * @is_fast_roam_enabled - flag to enable/disable roaming
6271 *
6272 * When Supplicant issues enabled/disable fast roaming on the basis
6273 * of the Bssid modification in network block (e.g. AutoJoin mode N/W block)
6274 *
6275 * Return: QDF_STATUS
6276 */
6277
Jeff Johnsonc7309062018-11-09 20:59:42 -08006278QDF_STATUS sme_config_fast_roaming(mac_handle_t mac_handle, uint8_t session_id,
Mukul Sharma69c44cd2016-09-12 18:33:57 +05306279 const bool is_fast_roam_enabled)
6280{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08006281 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
gaurank kathpalia14e2f912017-08-31 14:51:45 +05306282 struct csr_roam_session *session = CSR_GET_SESSION(mac_ctx, session_id);
Mukul Sharma69c44cd2016-09-12 18:33:57 +05306283 QDF_STATUS status;
6284
Varun Reddy Yeturue5a35d12017-10-20 11:26:57 -07006285 /*
6286 * supplicant_disabled_roaming flag is set to true in
6287 * wlan_hdd_cfg80211_connect_start when supplicant initiate connect
6288 * request with BSSID. This flag is reset when supplicant sends
6289 * vendor command to enable roaming after association.
Arif Hussaina48a9c02017-01-31 14:37:45 -08006290 *
6291 * This request from wpa_supplicant will be skipped in this function
Varun Reddy Yeturue5a35d12017-10-20 11:26:57 -07006292 * if roaming is disabled using driver command or INI and
6293 * supplicant_disabled_roaming flag remains set. So make sure to set
6294 * supplicant_disabled_roaming flag as per wpa_supplicant even if roam
6295 * request from wpa_supplicant ignored.
Arif Hussaina48a9c02017-01-31 14:37:45 -08006296 */
6297 if (session && session->pCurRoamProfile)
Varun Reddy Yeturue5a35d12017-10-20 11:26:57 -07006298 session->pCurRoamProfile->supplicant_disabled_roaming =
6299 !is_fast_roam_enabled;
Arif Hussaina48a9c02017-01-31 14:37:45 -08006300
Wu Gao51a63562018-11-08 16:29:10 +08006301 if (!mac_ctx->mlme_cfg->lfr.lfr_enabled) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07006302 sme_debug("Fast roam is disabled through ini");
Mukul Sharma69c44cd2016-09-12 18:33:57 +05306303 if (!is_fast_roam_enabled)
6304 return QDF_STATUS_SUCCESS;
6305 return QDF_STATUS_E_FAILURE;
6306 }
Sreelakshmi Konamkibda5bbf2016-09-12 18:38:10 +05306307
Mukul Sharma69c44cd2016-09-12 18:33:57 +05306308 status = csr_neighbor_roam_update_fast_roaming_enabled(mac_ctx,
6309 session_id, is_fast_roam_enabled);
6310 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07006311 sme_err("update fast roaming failed. status: %d", status);
Mukul Sharma69c44cd2016-09-12 18:33:57 +05306312 return QDF_STATUS_E_FAILURE;
6313 }
6314
6315 return QDF_STATUS_SUCCESS;
6316}
6317
Kiran Kumar Lokere7d6e4c92018-09-19 13:45:47 -07006318#ifdef FEATURE_WLAN_ESE
6319int sme_add_key_krk(mac_handle_t mac_handle, uint8_t session_id,
6320 const uint8_t *key, const int key_len)
6321{
6322 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
6323 struct csr_roam_session *session;
6324
6325 if (key_len < SIR_KRK_KEY_LEN) {
6326 sme_warn("Invalid KRK keylength [= %d]", key_len);
6327 return -EINVAL;
6328 }
6329
6330 if (!CSR_IS_SESSION_VALID(mac_ctx, session_id)) {
6331 sme_err("incorrect session/vdev ID");
6332 return -EINVAL;
6333 }
6334
6335 session = CSR_GET_SESSION(mac_ctx, session_id);
6336
6337 qdf_mem_copy(session->eseCckmInfo.krk, key, SIR_KRK_KEY_LEN);
6338 session->eseCckmInfo.reassoc_req_num = 1;
6339 session->eseCckmInfo.krk_plumbed = true;
6340
6341 return 0;
6342}
Pragaspathi Thilagaraj974c27e2019-03-02 22:26:05 +05306343#endif
Kiran Kumar Lokere7d6e4c92018-09-19 13:45:47 -07006344
Pragaspathi Thilagaraj974c27e2019-03-02 22:26:05 +05306345#if defined(FEATURE_WLAN_ESE) && defined(WLAN_FEATURE_ROAM_OFFLOAD)
Kiran Kumar Lokere7d6e4c92018-09-19 13:45:47 -07006346int sme_add_key_btk(mac_handle_t mac_handle, uint8_t session_id,
6347 const uint8_t *key, const int key_len)
6348{
6349 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
6350 struct csr_roam_session *session;
6351
6352 if (key_len < SIR_BTK_KEY_LEN) {
6353 sme_warn("Invalid BTK keylength [= %d]", key_len);
6354 return -EINVAL;
6355 }
6356
6357 if (!CSR_IS_SESSION_VALID(mac_ctx, session_id)) {
6358 sme_err("incorrect session/vdev ID");
6359 return -EINVAL;
6360 }
6361
6362 session = CSR_GET_SESSION(mac_ctx, session_id);
6363
6364 qdf_mem_copy(session->eseCckmInfo.btk, key, SIR_BTK_KEY_LEN);
6365 /*
6366 * KRK and BTK are updated by upper layer back to back. Send
6367 * updated KRK and BTK together to FW here.
6368 */
6369 csr_roam_offload_scan(mac_ctx, session_id,
6370 ROAM_SCAN_OFFLOAD_UPDATE_CFG,
6371 REASON_ROAM_PSK_PMK_CHANGED);
6372
6373 return 0;
6374}
6375#endif
6376
Varun Reddy Yeturu66899fe2017-07-11 14:00:12 -07006377/**
6378 * sme_stop_roaming() - Stop roaming for a given sessionId
6379 * This is a synchronous call
6380 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08006381 * @mac_handle - The handle returned by mac_open
Varun Reddy Yeturu66899fe2017-07-11 14:00:12 -07006382 * @sessionId - Session Identifier
6383 *
6384 * Return QDF_STATUS_SUCCESS on success
6385 * Other status on failure
6386 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08006387QDF_STATUS sme_stop_roaming(mac_handle_t mac_handle, uint8_t session_id,
Jeff Johnson1f2dabc2018-11-07 15:33:01 -08006388 uint8_t reason)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006389{
Naveen Rawat5c35ae42017-04-18 15:35:07 -07006390 struct scheduler_msg wma_msg = {0};
Jeff Johnsonc09caa42018-06-07 22:58:55 -07006391 QDF_STATUS status;
Jeff Johnsone6da4b02019-02-06 22:22:04 -08006392 struct roam_offload_scan_req *req;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08006393 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Varun Reddy Yeturu66899fe2017-07-11 14:00:12 -07006394 tpCsrNeighborRoamControlInfo roam_info;
Varun Reddy Yeturue5a35d12017-10-20 11:26:57 -07006395 struct csr_roam_session *session;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006396
Varun Reddy Yeturu66899fe2017-07-11 14:00:12 -07006397 if (!CSR_IS_SESSION_VALID(mac_ctx, session_id)) {
Naveen Rawat5c35ae42017-04-18 15:35:07 -07006398 sme_err("incorrect session/vdev ID");
6399 return QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006400 }
Varun Reddy Yeturue5a35d12017-10-20 11:26:57 -07006401
6402 session = CSR_GET_SESSION(mac_ctx, session_id);
Abhishek Singh1f217ec2017-12-22 11:48:27 +05306403
Padma, Santhosh Kumar86747ec2018-05-29 18:28:29 +05306404 /*
6405 * set the driver_disabled_roaming flag to true even if roaming
6406 * is not enabled on this session so that roam start requests for
6407 * this session can be blocked until driver enables roaming
6408 */
Vignesh Viswanathan3d478032018-08-02 20:18:53 +05306409 if (reason == ecsr_driver_disabled && session->pCurRoamProfile &&
6410 session->pCurRoamProfile->csrPersona == QDF_STA_MODE) {
Padma, Santhosh Kumar86747ec2018-05-29 18:28:29 +05306411 session->pCurRoamProfile->driver_disabled_roaming = true;
6412 sme_debug("driver_disabled_roaming set for session %d",
6413 session_id);
6414 }
6415
Abhishek Singh1f217ec2017-12-22 11:48:27 +05306416 roam_info = &mac_ctx->roam.neighborRoamInfo[session_id];
6417 if (!roam_info->b_roam_scan_offload_started) {
6418 sme_debug("Roaming already disabled for session %d", session_id);
Varun Reddy Yeturue5a35d12017-10-20 11:26:57 -07006419 return QDF_STATUS_SUCCESS;
6420 }
Naveen Rawat5c35ae42017-04-18 15:35:07 -07006421 req = qdf_mem_malloc(sizeof(*req));
Arif Hussain0ef77082018-10-10 16:42:53 -07006422 if (!req)
Naveen Rawat5c35ae42017-04-18 15:35:07 -07006423 return QDF_STATUS_E_NOMEM;
Naveen Rawat5c35ae42017-04-18 15:35:07 -07006424
6425 req->Command = ROAM_SCAN_OFFLOAD_STOP;
Padma, Santhosh Kumar86747ec2018-05-29 18:28:29 +05306426 if ((reason == eCsrForcedDisassoc) || reason == ecsr_driver_disabled)
Abhishek Singh533c9da2017-05-04 10:23:34 +05306427 req->reason = REASON_ROAM_STOP_ALL;
6428 else
Varun Reddy Yeturubc1bea02018-02-01 18:12:34 -08006429 req->reason = REASON_SME_ISSUED;
Varun Reddy Yeturu66899fe2017-07-11 14:00:12 -07006430 req->sessionId = session_id;
6431 if (csr_neighbor_middle_of_roaming(mac_ctx, session_id))
Naveen Rawat5c35ae42017-04-18 15:35:07 -07006432 req->middle_of_roaming = 1;
6433 else
6434 csr_roam_reset_roam_params(mac_ctx);
6435
6436 wma_msg.type = WMA_ROAM_SCAN_OFFLOAD_REQ;
6437 wma_msg.bodyptr = req;
6438
6439 status = wma_post_ctrl_msg(mac_ctx, &wma_msg);
Jeff Johnsonc09caa42018-06-07 22:58:55 -07006440 if (QDF_STATUS_SUCCESS != status) {
Naveen Rawat5c35ae42017-04-18 15:35:07 -07006441 sme_err("WMA_ROAM_SCAN_OFFLOAD_REQ failed, session_id: %d",
Varun Reddy Yeturu66899fe2017-07-11 14:00:12 -07006442 session_id);
Naveen Rawat5c35ae42017-04-18 15:35:07 -07006443 qdf_mem_free(req);
6444 return QDF_STATUS_E_FAULT;
6445 }
Varun Reddy Yeturu66899fe2017-07-11 14:00:12 -07006446 roam_info->b_roam_scan_offload_started = false;
6447 roam_info->last_sent_cmd = ROAM_SCAN_OFFLOAD_STOP;
Naveen Rawat5c35ae42017-04-18 15:35:07 -07006448
6449 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006450}
6451
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306452/*
6453 * sme_start_roaming() - Start roaming for a given sessionId
6454 * This is a synchronous call
6455 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08006456 * mac_handle - The handle returned by mac_open
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306457 * sessionId - Session Identifier
6458 * Return QDF_STATUS_SUCCESS on success
6459 * Other status on failure
6460 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08006461QDF_STATUS sme_start_roaming(mac_handle_t mac_handle, uint8_t sessionId,
Jeff Johnson1f2dabc2018-11-07 15:33:01 -08006462 uint8_t reason)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006463{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08006464 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306465 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006466
Jeff Johnson01f2c232018-11-21 19:17:44 -08006467 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306468 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08006469 csr_roam_offload_scan(mac, sessionId, ROAM_SCAN_OFFLOAD_START,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006470 reason);
Jeff Johnson01f2c232018-11-21 19:17:44 -08006471 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006472 }
6473
6474 return status;
6475}
6476
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306477/*
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306478 * sme_set_roam_opportunistic_scan_threshold_diff() -
6479 * Update Opportunistic Scan threshold diff
6480 * This function is called through dynamic setConfig callback function
6481 * to configure nOpportunisticThresholdDiff
6482 *
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -08006483 * mac_handle: Opaque handle to the global MAC context
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306484 * sessionId - Session Identifier
6485 * nOpportunisticThresholdDiff - Opportunistic Scan threshold diff
6486 * Return QDF_STATUS_SUCCESS - SME update nOpportunisticThresholdDiff config
6487 * successfully.
6488 * else SME is failed to update nOpportunisticThresholdDiff.
6489 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08006490QDF_STATUS sme_set_roam_opportunistic_scan_threshold_diff(
6491 mac_handle_t mac_handle,
6492 uint8_t sessionId,
6493 const uint8_t nOpportunisticThresholdDiff)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006494{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08006495 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306496 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006497
Jeff Johnson01f2c232018-11-21 19:17:44 -08006498 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306499 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08006500 status = csr_neighbor_roam_update_config(mac, sessionId,
Varun Reddy Yeturuff4feb02016-04-20 12:26:11 -07006501 nOpportunisticThresholdDiff,
6502 REASON_OPPORTUNISTIC_THRESH_DIFF_CHANGED);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306503 if (QDF_IS_STATUS_SUCCESS(status)) {
Wu Gao51a63562018-11-08 16:29:10 +08006504 mac->mlme_cfg->lfr.opportunistic_scan_threshold_diff =
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006505 nOpportunisticThresholdDiff;
6506 }
Jeff Johnson01f2c232018-11-21 19:17:44 -08006507 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006508 }
6509 return status;
6510}
6511
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306512/*
6513 * sme_get_roam_opportunistic_scan_threshold_diff()
6514 * gets Opportunistic Scan threshold diff
6515 * This is a synchronous call
6516 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08006517 * mac_handle - The handle returned by mac_open
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306518 * Return uint8_t - nOpportunisticThresholdDiff
6519 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08006520uint8_t sme_get_roam_opportunistic_scan_threshold_diff(mac_handle_t mac_handle)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006521{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08006522 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306523
Wu Gao51a63562018-11-08 16:29:10 +08006524 return mac->mlme_cfg->lfr.opportunistic_scan_threshold_diff;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006525}
6526
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306527/*
6528 * sme_set_roam_rescan_rssi_diff() - Update roam rescan rssi diff
6529 * This function is called through dynamic setConfig callback function
6530 * to configure nRoamRescanRssiDiff
6531 *
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -08006532 * mac_handle: Opaque handle to the global MAC context
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306533 * sessionId - Session Identifier
6534 * nRoamRescanRssiDiff - roam rescan rssi diff
6535 * Return QDF_STATUS_SUCCESS - SME update nRoamRescanRssiDiff config
6536 * successfully.
6537 * else SME is failed to update nRoamRescanRssiDiff.
6538 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08006539QDF_STATUS sme_set_roam_rescan_rssi_diff(mac_handle_t mac_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006540 uint8_t sessionId,
6541 const uint8_t nRoamRescanRssiDiff)
6542{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08006543 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306544 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006545
Jeff Johnson01f2c232018-11-21 19:17:44 -08006546 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306547 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08006548 status = csr_neighbor_roam_update_config(mac, sessionId,
Varun Reddy Yeturuff4feb02016-04-20 12:26:11 -07006549 nRoamRescanRssiDiff,
6550 REASON_ROAM_RESCAN_RSSI_DIFF_CHANGED);
Wu Gao51a63562018-11-08 16:29:10 +08006551 if (QDF_IS_STATUS_SUCCESS(status))
6552 mac->mlme_cfg->lfr.roam_rescan_rssi_diff =
6553 nRoamRescanRssiDiff;
6554
Jeff Johnson01f2c232018-11-21 19:17:44 -08006555 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006556 }
6557 return status;
6558}
6559
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306560/*
6561 * sme_get_roam_rescan_rssi_diff()
6562 * gets roam rescan rssi diff
6563 * This is a synchronous call
6564 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08006565 * mac_handle - The handle returned by mac_open
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306566 * Return int8_t - nRoamRescanRssiDiff
6567 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08006568uint8_t sme_get_roam_rescan_rssi_diff(mac_handle_t mac_handle)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006569{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08006570 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306571
Wu Gao51a63562018-11-08 16:29:10 +08006572 return mac->mlme_cfg->lfr.roam_rescan_rssi_diff;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006573}
6574
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306575/*
6576 * sme_set_roam_bmiss_first_bcnt() -
6577 * Update Roam count for first beacon miss
6578 * This function is called through dynamic setConfig callback function
6579 * to configure nRoamBmissFirstBcnt
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -08006580 * mac_handle: Opaque handle to the global MAC context
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306581 * sessionId - Session Identifier
6582 * nRoamBmissFirstBcnt - Roam first bmiss count
6583 * Return QDF_STATUS_SUCCESS - SME update nRoamBmissFirstBcnt
6584 * successfully.
6585 * else SME is failed to update nRoamBmissFirstBcnt
6586 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08006587QDF_STATUS sme_set_roam_bmiss_first_bcnt(mac_handle_t mac_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006588 uint8_t sessionId,
6589 const uint8_t nRoamBmissFirstBcnt)
6590{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08006591 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306592 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006593
Jeff Johnson01f2c232018-11-21 19:17:44 -08006594 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306595 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08006596 status = csr_neighbor_roam_update_config(mac, sessionId,
Varun Reddy Yeturuff4feb02016-04-20 12:26:11 -07006597 nRoamBmissFirstBcnt,
6598 REASON_ROAM_BMISS_FIRST_BCNT_CHANGED);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306599 if (QDF_IS_STATUS_SUCCESS(status)) {
Wu Gao51a63562018-11-08 16:29:10 +08006600 mac->mlme_cfg->lfr.roam_bmiss_first_bcnt =
6601 nRoamBmissFirstBcnt;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006602 }
Jeff Johnson01f2c232018-11-21 19:17:44 -08006603 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006604 }
6605 return status;
6606}
6607
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306608/*
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306609 * sme_set_roam_bmiss_final_bcnt() -
6610 * Update Roam count for final beacon miss
6611 * This function is called through dynamic setConfig callback function
6612 * to configure nRoamBmissFinalBcnt
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -08006613 * mac_handle: Opaque handle to the global MAC context
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306614 * sessionId - Session Identifier
6615 * nRoamBmissFinalBcnt - Roam final bmiss count
6616 * Return QDF_STATUS_SUCCESS - SME update nRoamBmissFinalBcnt
6617 * successfully.
6618 * else SME is failed to update nRoamBmissFinalBcnt
6619 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08006620QDF_STATUS sme_set_roam_bmiss_final_bcnt(mac_handle_t mac_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006621 uint8_t sessionId,
6622 const uint8_t nRoamBmissFinalBcnt)
6623{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08006624 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306625 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006626
Jeff Johnson01f2c232018-11-21 19:17:44 -08006627 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306628 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08006629 status = csr_neighbor_roam_update_config(mac, sessionId,
Varun Reddy Yeturuff4feb02016-04-20 12:26:11 -07006630 nRoamBmissFinalBcnt,
6631 REASON_ROAM_BMISS_FINAL_BCNT_CHANGED);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306632 if (QDF_IS_STATUS_SUCCESS(status)) {
Wu Gao51a63562018-11-08 16:29:10 +08006633 mac->mlme_cfg->lfr.roam_bmiss_final_bcnt =
6634 nRoamBmissFinalBcnt;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006635 }
Jeff Johnson01f2c232018-11-21 19:17:44 -08006636 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006637 }
6638 return status;
6639}
6640
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306641/*
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306642 * sme_set_neighbor_lookup_rssi_threshold() - update neighbor lookup
6643 * rssi threshold
6644 * This is a synchronous call
6645 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08006646 * mac_handle - The handle returned by mac_open.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306647 * sessionId - Session Identifier
6648 * Return QDF_STATUS_SUCCESS - SME update config successful.
6649 * Other status means SME is failed to update
6650 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08006651QDF_STATUS sme_set_neighbor_lookup_rssi_threshold(mac_handle_t mac_handle,
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306652 uint8_t sessionId, uint8_t neighborLookupRssiThreshold)
6653{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08006654 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306655 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006656
Jeff Johnson01f2c232018-11-21 19:17:44 -08006657 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306658 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08006659 status = csr_neighbor_roam_update_config(mac,
Varun Reddy Yeturuff4feb02016-04-20 12:26:11 -07006660 sessionId, neighborLookupRssiThreshold,
6661 REASON_LOOKUP_THRESH_CHANGED);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306662 if (QDF_IS_STATUS_SUCCESS(status)) {
Wu Gao51a63562018-11-08 16:29:10 +08006663 mac->mlme_cfg->lfr.neighbor_lookup_rssi_threshold =
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006664 neighborLookupRssiThreshold;
6665 }
Jeff Johnson01f2c232018-11-21 19:17:44 -08006666 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006667 }
6668 return status;
6669}
6670
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306671/*
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306672 * sme_get_neighbor_lookup_rssi_threshold() - get neighbor lookup
6673 * rssi threshold
6674 * This is a synchronous call
6675 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08006676 * mac_handle - The handle returned by mac_open.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306677 * Return QDF_STATUS_SUCCESS - SME update config successful.
6678 * Other status means SME is failed to update
6679 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08006680uint8_t sme_get_neighbor_lookup_rssi_threshold(mac_handle_t mac_handle)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006681{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08006682 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306683
Wu Gao51a63562018-11-08 16:29:10 +08006684 return mac->mlme_cfg->lfr.neighbor_lookup_rssi_threshold;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006685}
6686
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306687/*
6688 * sme_set_neighbor_scan_refresh_period() - set neighbor scan results
6689 * refresh period
6690 * This is a synchronous call
6691 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08006692 * mac_handle - The handle returned by mac_open.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306693 * sessionId - Session Identifier
6694 * Return QDF_STATUS_SUCCESS - SME update config successful.
6695 * Other status means SME is failed to update
6696 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08006697QDF_STATUS sme_set_neighbor_scan_refresh_period(mac_handle_t mac_handle,
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306698 uint8_t sessionId, uint16_t neighborScanResultsRefreshPeriod)
6699{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08006700 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306701 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006702 tpCsrNeighborRoamControlInfo pNeighborRoamInfo = NULL;
6703
Dustin Brownad06be62019-02-04 14:52:56 -08006704 if (sessionId >= WLAN_MAX_VDEVS) {
Naveen Rawatc36f7eb2016-11-10 20:01:03 -08006705 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
6706 FL("Invalid sme session id: %d"), sessionId);
6707 return QDF_STATUS_E_INVAL;
6708 }
6709
Jeff Johnson01f2c232018-11-21 19:17:44 -08006710 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306711 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08006712 pNeighborRoamInfo = &mac->roam.neighborRoamInfo[sessionId];
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05306713 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006714 "LFR runtime successfully set roam scan refresh period to %d- old value is %d - roam state is %s",
6715 neighborScanResultsRefreshPeriod,
Wu Gao51a63562018-11-08 16:29:10 +08006716 mac->mlme_cfg->lfr.
6717 neighbor_scan_results_refresh_period,
Jeff Johnson01f2c232018-11-21 19:17:44 -08006718 mac_trace_get_neighbour_roam_state(mac->roam.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006719 neighborRoamInfo
6720 [sessionId].
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306721 neighborRoamState));
Wu Gao51a63562018-11-08 16:29:10 +08006722 mac->mlme_cfg->lfr.neighbor_scan_results_refresh_period =
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006723 neighborScanResultsRefreshPeriod;
6724 pNeighborRoamInfo->cfgParams.neighborResultsRefreshPeriod =
6725 neighborScanResultsRefreshPeriod;
6726
Wu Gao51a63562018-11-08 16:29:10 +08006727 if (mac->mlme_cfg->lfr.roam_scan_offload_enabled) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08006728 csr_roam_offload_scan(mac, sessionId,
Vignesh Viswanathan4e65e8e2018-05-01 12:04:16 +05306729 ROAM_SCAN_OFFLOAD_UPDATE_CFG,
6730 REASON_NEIGHBOR_SCAN_REFRESH_PERIOD_CHANGED);
6731 }
Jeff Johnson01f2c232018-11-21 19:17:44 -08006732 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006733 }
Vignesh Viswanathan4e65e8e2018-05-01 12:04:16 +05306734
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006735 return status;
6736}
6737
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306738/*
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306739 * sme_get_neighbor_scan_refresh_period() - get neighbor scan results
6740 * refresh period
6741 * This is a synchronous call
6742 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08006743 * \param mac_handle - The handle returned by mac_open.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306744 * \return uint16_t - Neighbor scan results refresh period value
6745 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08006746uint16_t sme_get_neighbor_scan_refresh_period(mac_handle_t mac_handle)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006747{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08006748 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306749
Wu Gao51a63562018-11-08 16:29:10 +08006750 return mac->mlme_cfg->lfr.neighbor_scan_results_refresh_period;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006751}
6752
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306753/*
6754 * sme_get_empty_scan_refresh_period() - get empty scan refresh period
6755 * This is a synchronuous call
6756 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08006757 * mac_handle - The handle returned by mac_open.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306758 * Return QDF_STATUS_SUCCESS - SME update config successful.
6759 * Other status means SME is failed to update
6760 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08006761uint16_t sme_get_empty_scan_refresh_period(mac_handle_t mac_handle)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006762{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08006763 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306764
Wu Gao51a63562018-11-08 16:29:10 +08006765 return mac->mlme_cfg->lfr.empty_scan_refresh_period;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006766}
6767
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306768/*
6769 * sme_update_empty_scan_refresh_period
Jeff Johnson96259452019-02-26 20:38:17 -08006770 * Update empty_scan_refresh_period
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306771 * This function is called through dynamic setConfig callback function
Jeff Johnson96259452019-02-26 20:38:17 -08006772 * to configure empty_scan_refresh_period
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306773 * Usage: adb shell iwpriv wlan0 setConfig
Jeff Johnson96259452019-02-26 20:38:17 -08006774 * empty_scan_refresh_period=[0 .. 60]
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306775 *
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -08006776 * mac_handle: Opaque handle to the global MAC context
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306777 * sessionId - Session Identifier
Jeff Johnson96259452019-02-26 20:38:17 -08006778 * empty_scan_refresh_period - scan period following empty scan results.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306779 * Return Success or failure
6780 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006781
Jeff Johnsonb460dd72018-11-08 10:26:51 -08006782QDF_STATUS sme_update_empty_scan_refresh_period(mac_handle_t mac_handle,
6783 uint8_t sessionId, uint16_t
Jeff Johnson96259452019-02-26 20:38:17 -08006784 empty_scan_refresh_period)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006785{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08006786 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306787 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006788 tpCsrNeighborRoamControlInfo pNeighborRoamInfo = NULL;
6789
Dustin Brownad06be62019-02-04 14:52:56 -08006790 if (sessionId >= WLAN_MAX_VDEVS) {
Naveen Rawatc36f7eb2016-11-10 20:01:03 -08006791 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
6792 FL("Invalid sme session id: %d"), sessionId);
6793 return QDF_STATUS_E_INVAL;
6794 }
6795
Jeff Johnson01f2c232018-11-21 19:17:44 -08006796 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306797 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08006798 pNeighborRoamInfo = &mac->roam.neighborRoamInfo[sessionId];
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05306799 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006800 "LFR runtime successfully set roam scan period to %d -old value is %d - roam state is %s",
Jeff Johnson96259452019-02-26 20:38:17 -08006801 empty_scan_refresh_period,
Wu Gao51a63562018-11-08 16:29:10 +08006802 mac->mlme_cfg->lfr.empty_scan_refresh_period,
Jeff Johnson01f2c232018-11-21 19:17:44 -08006803 mac_trace_get_neighbour_roam_state(mac->roam.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006804 neighborRoamInfo
6805 [sessionId].
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306806 neighborRoamState));
Wu Gao51a63562018-11-08 16:29:10 +08006807 mac->mlme_cfg->lfr.empty_scan_refresh_period =
Jeff Johnson96259452019-02-26 20:38:17 -08006808 empty_scan_refresh_period;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006809 pNeighborRoamInfo->cfgParams.emptyScanRefreshPeriod =
Jeff Johnson96259452019-02-26 20:38:17 -08006810 empty_scan_refresh_period;
Vignesh Viswanathan4e65e8e2018-05-01 12:04:16 +05306811
Wu Gao51a63562018-11-08 16:29:10 +08006812 if (mac->mlme_cfg->lfr.roam_scan_offload_enabled) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08006813 csr_roam_offload_scan(mac, sessionId,
Vignesh Viswanathan4e65e8e2018-05-01 12:04:16 +05306814 ROAM_SCAN_OFFLOAD_UPDATE_CFG,
6815 REASON_EMPTY_SCAN_REF_PERIOD_CHANGED);
6816 }
Jeff Johnson01f2c232018-11-21 19:17:44 -08006817 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006818 }
Vignesh Viswanathan4e65e8e2018-05-01 12:04:16 +05306819
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006820 return status;
6821}
6822
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306823/*
6824 * sme_set_neighbor_scan_min_chan_time() -
6825 * Update nNeighborScanMinChanTime
6826 * This function is called through dynamic setConfig callback function
6827 * to configure gNeighborScanChannelMinTime
6828 * Usage: adb shell iwpriv wlan0 setConfig
6829 * gNeighborScanChannelMinTime=[0 .. 60]
6830 *
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -08006831 * mac_handle: Opaque handle to the global MAC context
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306832 * nNeighborScanMinChanTime - Channel minimum dwell time
6833 * sessionId - Session Identifier
6834 * Return Success or failure
6835 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08006836QDF_STATUS sme_set_neighbor_scan_min_chan_time(mac_handle_t mac_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006837 const uint16_t
6838 nNeighborScanMinChanTime,
6839 uint8_t sessionId)
6840{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08006841 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306842 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006843
Dustin Brownad06be62019-02-04 14:52:56 -08006844 if (sessionId >= WLAN_MAX_VDEVS) {
Naveen Rawatc36f7eb2016-11-10 20:01:03 -08006845 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
6846 FL("Invalid sme session id: %d"), sessionId);
6847 return QDF_STATUS_E_INVAL;
6848 }
6849
Jeff Johnson01f2c232018-11-21 19:17:44 -08006850 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306851 if (QDF_IS_STATUS_SUCCESS(status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05306852 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006853 "LFR runtime successfully set channel min dwell time to %d - old value is %d - roam state is %s",
6854 nNeighborScanMinChanTime,
Wu Gao51a63562018-11-08 16:29:10 +08006855 mac->mlme_cfg->lfr.neighbor_scan_min_chan_time,
Jeff Johnson01f2c232018-11-21 19:17:44 -08006856 mac_trace_get_neighbour_roam_state(mac->roam.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006857 neighborRoamInfo
6858 [sessionId].
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306859 neighborRoamState));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006860
Wu Gao51a63562018-11-08 16:29:10 +08006861 mac->mlme_cfg->lfr.neighbor_scan_min_chan_time =
6862 nNeighborScanMinChanTime;
Jeff Johnson01f2c232018-11-21 19:17:44 -08006863 mac->roam.neighborRoamInfo[sessionId].cfgParams.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006864 minChannelScanTime = nNeighborScanMinChanTime;
Jeff Johnson01f2c232018-11-21 19:17:44 -08006865 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006866 }
6867
6868 return status;
6869}
6870
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306871/*
6872 * sme_set_neighbor_scan_max_chan_time() -
6873 * Update nNeighborScanMaxChanTime
6874 * This function is called through dynamic setConfig callback function
6875 * to configure gNeighborScanChannelMaxTime
6876 * Usage: adb shell iwpriv wlan0 setConfig
6877 * gNeighborScanChannelMaxTime=[0 .. 60]
6878 *
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -08006879 * mac_handle: Opaque handle to the global MAC context
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306880 * sessionId - Session Identifier
6881 * nNeighborScanMinChanTime - Channel maximum dwell time
6882 * Return Success or failure
6883 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08006884QDF_STATUS sme_set_neighbor_scan_max_chan_time(mac_handle_t mac_handle,
6885 uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006886 const uint16_t
6887 nNeighborScanMaxChanTime)
6888{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08006889 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306890 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006891 tpCsrNeighborRoamControlInfo pNeighborRoamInfo = NULL;
6892
Dustin Brownad06be62019-02-04 14:52:56 -08006893 if (sessionId >= WLAN_MAX_VDEVS) {
Naveen Rawatc36f7eb2016-11-10 20:01:03 -08006894 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
6895 FL("Invalid sme session id: %d"), sessionId);
6896 return QDF_STATUS_E_INVAL;
6897 }
6898
Jeff Johnson01f2c232018-11-21 19:17:44 -08006899 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306900 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08006901 pNeighborRoamInfo = &mac->roam.neighborRoamInfo[sessionId];
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05306902 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006903 "LFR runtime successfully set channel max dwell time to %d - old value is %d - roam state is %s",
6904 nNeighborScanMaxChanTime,
Wu Gao51a63562018-11-08 16:29:10 +08006905 mac->mlme_cfg->lfr.neighbor_scan_max_chan_time,
Jeff Johnson01f2c232018-11-21 19:17:44 -08006906 mac_trace_get_neighbour_roam_state(mac->roam.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006907 neighborRoamInfo
6908 [sessionId].
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306909 neighborRoamState));
Wu Gao51a63562018-11-08 16:29:10 +08006910 mac->mlme_cfg->lfr.neighbor_scan_max_chan_time =
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006911 nNeighborScanMaxChanTime;
6912 pNeighborRoamInfo->cfgParams.maxChannelScanTime =
6913 nNeighborScanMaxChanTime;
Wu Gao51a63562018-11-08 16:29:10 +08006914 if (mac->mlme_cfg->lfr.roam_scan_offload_enabled) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08006915 csr_roam_offload_scan(mac, sessionId,
Vignesh Viswanathan4e65e8e2018-05-01 12:04:16 +05306916 ROAM_SCAN_OFFLOAD_UPDATE_CFG,
6917 REASON_SCAN_CH_TIME_CHANGED);
6918 }
Jeff Johnson01f2c232018-11-21 19:17:44 -08006919 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006920 }
Vignesh Viswanathan4e65e8e2018-05-01 12:04:16 +05306921
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006922 return status;
6923}
6924
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306925/*
6926 * sme_get_neighbor_scan_min_chan_time() -
6927 * get neighbor scan min channel time
6928 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08006929 * mac_handle - The handle returned by mac_open.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306930 * sessionId - Session Identifier
6931 * Return uint16_t - channel min time value
6932 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08006933uint16_t sme_get_neighbor_scan_min_chan_time(mac_handle_t mac_handle,
Jeff Johnson1f2dabc2018-11-07 15:33:01 -08006934 uint8_t sessionId)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006935{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08006936 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Naveen Rawatc36f7eb2016-11-10 20:01:03 -08006937
Dustin Brownad06be62019-02-04 14:52:56 -08006938 if (sessionId >= WLAN_MAX_VDEVS) {
Naveen Rawatc36f7eb2016-11-10 20:01:03 -08006939 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
6940 FL("Invalid sme session id: %d"), sessionId);
6941 return 0;
6942 }
6943
Jeff Johnson01f2c232018-11-21 19:17:44 -08006944 return mac->roam.neighborRoamInfo[sessionId].cfgParams.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006945 minChannelScanTime;
6946}
6947
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306948/*
6949 * sme_get_neighbor_roam_state() -
6950 * get neighbor roam state
6951 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08006952 * mac_handle - The handle returned by mac_open.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306953 * sessionId - Session Identifier
6954 * Return uint32_t - neighbor roam state
6955 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08006956uint32_t sme_get_neighbor_roam_state(mac_handle_t mac_handle, uint8_t sessionId)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006957{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08006958 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Naveen Rawatc36f7eb2016-11-10 20:01:03 -08006959
Dustin Brownad06be62019-02-04 14:52:56 -08006960 if (sessionId >= WLAN_MAX_VDEVS) {
Naveen Rawatc36f7eb2016-11-10 20:01:03 -08006961 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
6962 FL("Invalid sme session id: %d"), sessionId);
6963 return 0;
6964 }
6965
Jeff Johnson01f2c232018-11-21 19:17:44 -08006966 return mac->roam.neighborRoamInfo[sessionId].neighborRoamState;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006967}
6968
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306969/*
6970 * sme_get_current_roam_state() -
6971 * get current roam state
6972 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08006973 * mac_handle - The handle returned by mac_open.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306974 * sessionId - Session Identifier
6975 * Return uint32_t - current roam state
6976 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08006977uint32_t sme_get_current_roam_state(mac_handle_t mac_handle, uint8_t sessionId)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006978{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08006979 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306980
Jeff Johnson01f2c232018-11-21 19:17:44 -08006981 return mac->roam.curState[sessionId];
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006982}
6983
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306984/*
6985 * sme_get_current_roam_sub_state() -
6986 * \brief get neighbor roam sub state
6987 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08006988 * mac_handle - The handle returned by mac_open.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306989 * sessionId - Session Identifier
6990 * Return uint32_t - current roam sub state
6991 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08006992uint32_t sme_get_current_roam_sub_state(mac_handle_t mac_handle,
6993 uint8_t sessionId)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006994{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08006995 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05306996
Jeff Johnson01f2c232018-11-21 19:17:44 -08006997 return mac->roam.curSubState[sessionId];
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006998}
6999
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307000/*
7001 * sme_get_lim_sme_state() -
7002 * get Lim Sme state
7003 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007004 * mac_handle - The handle returned by mac_open.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307005 * Return uint32_t - Lim Sme state
7006 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007007uint32_t sme_get_lim_sme_state(mac_handle_t mac_handle)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007008{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08007009 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307010
Jeff Johnson01f2c232018-11-21 19:17:44 -08007011 return mac->lim.gLimSmeState;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007012}
7013
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307014/*
7015 * sme_get_lim_mlm_state() -
7016 * get Lim Mlm state
7017 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007018 * mac_handle - The handle returned by mac_open.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307019 * Return uint32_t - Lim Mlm state
7020 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007021uint32_t sme_get_lim_mlm_state(mac_handle_t mac_handle)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007022{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08007023 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307024
Jeff Johnson01f2c232018-11-21 19:17:44 -08007025 return mac->lim.gLimMlmState;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007026}
7027
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307028/*
7029 * sme_is_lim_session_valid() -
7030 * is Lim session valid
7031 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007032 * mac_handle - The handle returned by mac_open.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307033 * sessionId - Session Identifier
7034 * Return bool - true or false
7035 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007036bool sme_is_lim_session_valid(mac_handle_t mac_handle, uint8_t sessionId)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007037{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08007038 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Hanumantha Reddy Pothula589fd702015-11-17 15:25:16 +05307039
Jeff Johnson01f2c232018-11-21 19:17:44 -08007040 if (sessionId > mac->lim.maxBssId)
Hanumantha Reddy Pothula589fd702015-11-17 15:25:16 +05307041 return false;
7042
Jeff Johnson01f2c232018-11-21 19:17:44 -08007043 return mac->lim.gpSession[sessionId].valid;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007044}
7045
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307046/*
7047 * sme_get_lim_sme_session_state() -
7048 * get Lim Sme session 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 - Lim Sme session state
7053 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007054uint32_t sme_get_lim_sme_session_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->lim.gpSession[sessionId].limSmeState;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007060}
7061
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307062/*
7063 * sme_get_lim_mlm_session_state() -
7064 * \brief get Lim Mlm session 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 * sessionId - Session Identifier
7068 * Return uint32_t - Lim Mlm session state
7069 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007070uint32_t sme_get_lim_mlm_session_state(mac_handle_t mac_handle,
7071 uint8_t sessionId)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007072{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08007073 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307074
Jeff Johnson01f2c232018-11-21 19:17:44 -08007075 return mac->lim.gpSession[sessionId].limMlmState;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007076}
7077
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307078/*
7079 * sme_get_neighbor_scan_max_chan_time() -
7080 * get neighbor scan max channel time
7081 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007082 * mac_handle - The handle returned by mac_open.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307083 * sessionId - Session Identifier
7084 * Return uint16_t - channel max time value
7085 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007086uint16_t sme_get_neighbor_scan_max_chan_time(mac_handle_t mac_handle,
Jeff Johnson1f2dabc2018-11-07 15:33:01 -08007087 uint8_t sessionId)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007088{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08007089 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Naveen Rawatc36f7eb2016-11-10 20:01:03 -08007090
Dustin Brownad06be62019-02-04 14:52:56 -08007091 if (sessionId >= WLAN_MAX_VDEVS) {
Naveen Rawatc36f7eb2016-11-10 20:01:03 -08007092 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
7093 FL("Invalid sme session id: %d"), sessionId);
7094 return 0;
7095 }
7096
Jeff Johnson01f2c232018-11-21 19:17:44 -08007097 return mac->roam.neighborRoamInfo[sessionId].cfgParams.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007098 maxChannelScanTime;
7099}
7100
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307101/*
7102 * sme_set_neighbor_scan_period() -
7103 * Update nNeighborScanPeriod
7104 * This function is called through dynamic setConfig callback function
7105 * to configure nNeighborScanPeriod
7106 * Usage: adb shell iwpriv wlan0 setConfig
7107 * nNeighborScanPeriod=[0 .. 1000]
7108 *
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -08007109 * mac_handle: Opaque handle to the global MAC context
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307110 * sessionId - Session Identifier
7111 * nNeighborScanPeriod - neighbor scan period
7112 * Return Success or failure
7113 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007114QDF_STATUS sme_set_neighbor_scan_period(mac_handle_t mac_handle,
7115 uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007116 const uint16_t nNeighborScanPeriod)
7117{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08007118 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307119 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007120 tpCsrNeighborRoamControlInfo pNeighborRoamInfo = NULL;
7121
Dustin Brownad06be62019-02-04 14:52:56 -08007122 if (sessionId >= WLAN_MAX_VDEVS) {
Naveen Rawatc36f7eb2016-11-10 20:01:03 -08007123 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
7124 FL("Invalid sme session id: %d"), sessionId);
7125 return QDF_STATUS_E_INVAL;
7126 }
7127
Jeff Johnson01f2c232018-11-21 19:17:44 -08007128 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307129 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08007130 pNeighborRoamInfo = &mac->roam.neighborRoamInfo[sessionId];
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05307131 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307132 "LFR runtime successfully set neighbor scan period to %d - old value is %d - roam state is %s",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007133 nNeighborScanPeriod,
Wu Gao51a63562018-11-08 16:29:10 +08007134 mac->mlme_cfg->lfr.neighbor_scan_timer_period,
Jeff Johnson01f2c232018-11-21 19:17:44 -08007135 mac_trace_get_neighbour_roam_state(mac->roam.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007136 neighborRoamInfo
7137 [sessionId].
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307138 neighborRoamState));
Wu Gao51a63562018-11-08 16:29:10 +08007139 mac->mlme_cfg->lfr.neighbor_scan_timer_period =
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007140 nNeighborScanPeriod;
7141 pNeighborRoamInfo->cfgParams.neighborScanPeriod =
7142 nNeighborScanPeriod;
Vignesh Viswanathan4e65e8e2018-05-01 12:04:16 +05307143
Wu Gao51a63562018-11-08 16:29:10 +08007144 if (mac->mlme_cfg->lfr.roam_scan_offload_enabled) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08007145 csr_roam_offload_scan(mac, sessionId,
Vignesh Viswanathan4e65e8e2018-05-01 12:04:16 +05307146 ROAM_SCAN_OFFLOAD_UPDATE_CFG,
7147 REASON_SCAN_HOME_TIME_CHANGED);
7148 }
Jeff Johnson01f2c232018-11-21 19:17:44 -08007149 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007150 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007151
7152 return status;
7153}
7154
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307155/*
7156 * sme_get_neighbor_scan_period() -
7157 * get neighbor scan period
7158 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007159 * mac_handle - The handle returned by mac_open.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307160 * sessionId - Session Identifier
7161 * Return uint16_t - neighbor scan period
7162 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007163uint16_t sme_get_neighbor_scan_period(mac_handle_t mac_handle,
7164 uint8_t sessionId)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007165{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08007166 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Naveen Rawatc36f7eb2016-11-10 20:01:03 -08007167
Dustin Brownad06be62019-02-04 14:52:56 -08007168 if (sessionId >= WLAN_MAX_VDEVS) {
Naveen Rawatc36f7eb2016-11-10 20:01:03 -08007169 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
7170 FL("Invalid sme session id: %d"), sessionId);
7171 return 0;
7172 }
7173
Jeff Johnson01f2c232018-11-21 19:17:44 -08007174 return mac->roam.neighborRoamInfo[sessionId].cfgParams.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007175 neighborScanPeriod;
7176}
7177
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307178/*
7179 * sme_get_roam_rssi_diff() - get Roam rssi diff
7180 * This is a synchronous call
7181 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007182 * mac_handle - The handle returned by mac_open.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307183 * Return uint16_t - Rssi diff value
7184 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007185uint8_t sme_get_roam_rssi_diff(mac_handle_t mac_handle)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007186{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08007187 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307188
Wu Gao51a63562018-11-08 16:29:10 +08007189 return mac->mlme_cfg->lfr.roam_rssi_diff;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007190}
7191
7192/**
7193 * sme_change_roam_scan_channel_list() - to change scan channel list
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -08007194 * @mac_handle: Opaque handle to the global MAC context
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007195 * @sessionId: sme session id
7196 * @pChannelList: Output channel list
7197 * @numChannels: Output number of channels
7198 *
7199 * This routine is called to Change roam scan channel list.
7200 * This is a synchronous call
7201 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307202 * Return: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007203 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007204QDF_STATUS sme_change_roam_scan_channel_list(mac_handle_t mac_handle,
Jeff Johnson1f2dabc2018-11-07 15:33:01 -08007205 uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007206 uint8_t *pChannelList,
7207 uint8_t numChannels)
7208{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08007209 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307210 QDF_STATUS status = QDF_STATUS_SUCCESS;
Naveen Rawatc36f7eb2016-11-10 20:01:03 -08007211 tpCsrNeighborRoamControlInfo pNeighborRoamInfo = NULL;
Wu Gao0821b0d2019-01-11 17:31:11 +08007212 uint8_t oldChannelList[CFG_VALID_CHANNEL_LIST_LEN * 2] = { 0 };
7213 uint8_t newChannelList[CFG_VALID_CHANNEL_LIST_LEN * 2] = { 0 };
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007214 uint8_t i = 0, j = 0;
7215 tCsrChannelInfo *chan_info;
7216
Dustin Brownad06be62019-02-04 14:52:56 -08007217 if (sessionId >= WLAN_MAX_VDEVS) {
Naveen Rawatc36f7eb2016-11-10 20:01:03 -08007218 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
7219 FL("Invalid sme session id: %d"), sessionId);
7220 return QDF_STATUS_E_INVAL;
7221 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007222
Jeff Johnson01f2c232018-11-21 19:17:44 -08007223 pNeighborRoamInfo = &mac->roam.neighborRoamInfo[sessionId];
7224 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307225 if (!QDF_IS_STATUS_SUCCESS(status)) {
Vignesh Viswanathan4e65e8e2018-05-01 12:04:16 +05307226 sme_err("Failed to acquire SME lock");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007227 return status;
7228 }
7229 chan_info = &pNeighborRoamInfo->cfgParams.channelInfo;
7230
Jeff Johnson038efe72019-03-18 13:39:31 -07007231 if (chan_info->ChannelList) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007232 for (i = 0; i < chan_info->numOfChannels; i++) {
7233 if (j < sizeof(oldChannelList))
7234 j += snprintf(oldChannelList + j,
7235 sizeof(oldChannelList) -
7236 j, "%d",
7237 chan_info->ChannelList[i]);
7238 else
7239 break;
7240 }
7241 }
Jeff Johnson01f2c232018-11-21 19:17:44 -08007242 csr_flush_cfg_bg_scan_roam_channel_list(mac, sessionId);
7243 csr_create_bg_scan_roam_channel_list(mac, sessionId, pChannelList,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007244 numChannels);
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007245 sme_set_roam_scan_control(mac_handle, sessionId, 1);
Jeff Johnson038efe72019-03-18 13:39:31 -07007246 if (chan_info->ChannelList) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007247 j = 0;
7248 for (i = 0; i < chan_info->numOfChannels; i++) {
7249 if (j < sizeof(newChannelList))
7250 j += snprintf(newChannelList + j,
7251 sizeof(newChannelList) -
7252 j, " %d",
7253 chan_info->ChannelList[i]);
7254 else
7255 break;
7256 }
7257 }
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05307258 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307259 "LFR runtime successfully set roam scan channels to %s - old value is %s - roam state is %d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007260 newChannelList, oldChannelList,
Jeff Johnson01f2c232018-11-21 19:17:44 -08007261 mac->roam.neighborRoamInfo[sessionId].neighborRoamState);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007262
Wu Gao51a63562018-11-08 16:29:10 +08007263 if (mac->mlme_cfg->lfr.roam_scan_offload_enabled)
Jeff Johnson01f2c232018-11-21 19:17:44 -08007264 csr_roam_offload_scan(mac, sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007265 ROAM_SCAN_OFFLOAD_UPDATE_CFG,
7266 REASON_CHANNEL_LIST_CHANGED);
Vignesh Viswanathan4e65e8e2018-05-01 12:04:16 +05307267
Jeff Johnson01f2c232018-11-21 19:17:44 -08007268 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007269 return status;
7270}
7271
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007272/**
7273 * sme_get_roam_scan_channel_list() - To get roam scan channel list
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -08007274 * @mac_handle: Opaque handle to the global MAC context
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007275 * @pChannelList: Output channel list
7276 * @pNumChannels: Output number of channels
7277 * @sessionId: Session Identifier
7278 *
7279 * To get roam scan channel list This is a synchronous call
7280 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307281 * Return: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007282 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007283QDF_STATUS sme_get_roam_scan_channel_list(mac_handle_t mac_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007284 uint8_t *pChannelList, uint8_t *pNumChannels,
7285 uint8_t sessionId)
7286{
7287 int i = 0;
7288 uint8_t *pOutPtr = pChannelList;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08007289 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Naveen Rawatc36f7eb2016-11-10 20:01:03 -08007290 tpCsrNeighborRoamControlInfo pNeighborRoamInfo = NULL;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307291 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007292
Dustin Brownad06be62019-02-04 14:52:56 -08007293 if (sessionId >= WLAN_MAX_VDEVS) {
Naveen Rawatc36f7eb2016-11-10 20:01:03 -08007294 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
7295 FL("Invalid sme session id: %d"), sessionId);
7296 return QDF_STATUS_E_INVAL;
7297 }
7298
Jeff Johnson01f2c232018-11-21 19:17:44 -08007299 pNeighborRoamInfo = &mac->roam.neighborRoamInfo[sessionId];
7300 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307301 if (!QDF_IS_STATUS_SUCCESS(status))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007302 return status;
Jeff Johnson038efe72019-03-18 13:39:31 -07007303 if (!pNeighborRoamInfo->cfgParams.channelInfo.ChannelList) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05307304 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_WARN,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007305 FL("Roam Scan channel list is NOT yet initialized"));
7306 *pNumChannels = 0;
Jeff Johnson01f2c232018-11-21 19:17:44 -08007307 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007308 return status;
7309 }
7310
7311 *pNumChannels = pNeighborRoamInfo->cfgParams.channelInfo.numOfChannels;
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307312 for (i = 0; i < (*pNumChannels); i++)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007313 pOutPtr[i] =
7314 pNeighborRoamInfo->cfgParams.channelInfo.ChannelList[i];
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307315
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007316 pOutPtr[i] = '\0';
Jeff Johnson01f2c232018-11-21 19:17:44 -08007317 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007318 return status;
7319}
7320
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307321/*
7322 * sme_get_is_ese_feature_enabled() - get ESE feature enabled or not
7323 * This is a synchronuous call
7324 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007325 * mac_handle - The handle returned by mac_open.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307326 * Return true (1) - if the ESE feature is enabled
7327 * false (0) - if feature is disabled (compile or runtime)
7328 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007329bool sme_get_is_ese_feature_enabled(mac_handle_t mac_handle)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007330{
7331#ifdef FEATURE_WLAN_ESE
Jeff Johnson0a8786a2018-12-02 10:49:01 -08007332 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307333
Jeff Johnson01f2c232018-11-21 19:17:44 -08007334 return csr_roam_is_ese_ini_feature_enabled(mac);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007335#else
7336 return false;
7337#endif
7338}
7339
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307340/*
7341 * sme_get_wes_mode() - get WES Mode
7342 * This is a synchronous call
7343 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007344 * mac_handle - The handle returned by mac_open
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307345 * Return uint8_t - WES Mode Enabled(1)/Disabled(0)
7346 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007347bool sme_get_wes_mode(mac_handle_t mac_handle)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007348{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08007349 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307350
Wu Gao51a63562018-11-08 16:29:10 +08007351 return mac->mlme_cfg->lfr.wes_mode_enabled;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007352}
7353
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307354/*
7355 * sme_get_roam_scan_control() - get scan control
7356 * This is a synchronous call
7357 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007358 * mac_handle - The handle returned by mac_open.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307359 * Return bool - Enabled(1)/Disabled(0)
7360 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007361bool sme_get_roam_scan_control(mac_handle_t mac_handle)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007362{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08007363 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307364
Jeff Johnson01f2c232018-11-21 19:17:44 -08007365 return mac->roam.configParam.nRoamScanControl;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007366}
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007367
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307368/*
7369 * sme_get_is_lfr_feature_enabled() - get LFR feature enabled or not
7370 * This is a synchronuous call
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007371 * mac_handle - The handle returned by mac_open.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307372 * Return true (1) - if the feature is enabled
7373 * false (0) - if feature is disabled (compile or runtime)
7374 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007375bool sme_get_is_lfr_feature_enabled(mac_handle_t mac_handle)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007376{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08007377 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307378
Wu Gao51a63562018-11-08 16:29:10 +08007379 return mac->mlme_cfg->lfr.lfr_enabled;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007380}
7381
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307382/*
7383 * sme_get_is_ft_feature_enabled() - get FT feature enabled or not
7384 * This is a synchronuous call
7385 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007386 * mac_handle - The handle returned by mac_open.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307387 * Return true (1) - if the feature is enabled
7388 * false (0) - if feature is disabled (compile or runtime)
7389 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007390bool sme_get_is_ft_feature_enabled(mac_handle_t mac_handle)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007391{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08007392 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307393
Wu Gao51a63562018-11-08 16:29:10 +08007394 return mac->mlme_cfg->lfr.fast_transition_enabled;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007395}
7396
Krishna Kumaar Natarajand0bbb3c2017-03-13 17:04:58 -07007397/**
7398 * sme_is_feature_supported_by_fw() - check if feature is supported by FW
7399 * @feature: enum value of requested feature.
7400 *
7401 * Retrun: 1 if supported; 0 otherwise
7402 */
7403bool sme_is_feature_supported_by_fw(enum cap_bitmap feature)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007404{
Krishna Kumaar Natarajand0bbb3c2017-03-13 17:04:58 -07007405 return IS_FEATURE_SUPPORTED_BY_FW(feature);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007406}
7407
Jeff Johnsone943bca2019-02-08 22:45:17 -08007408QDF_STATUS sme_get_link_speed(mac_handle_t mac_handle,
7409 struct link_speed_info *req,
7410 void *context,
7411 sme_link_speed_cb cb)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007412{
Jeff Johnsone943bca2019-02-08 22:45:17 -08007413 QDF_STATUS status;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08007414 struct mac_context *mac;
Mukul Sharmac3886aa2017-05-04 17:53:22 +05307415 void *wma_handle;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007416
Jeff Johnsone943bca2019-02-08 22:45:17 -08007417 if (!mac_handle || !cb || !req) {
Jeff Johnsona5317a62017-01-26 08:51:25 -08007418 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
7419 FL("Invalid parameter"));
7420 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007421 }
Jeff Johnsona5317a62017-01-26 08:51:25 -08007422
Mukul Sharmac3886aa2017-05-04 17:53:22 +05307423 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
7424 if (!wma_handle) {
7425 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
7426 "wma handle is NULL");
7427 return QDF_STATUS_E_FAILURE;
7428 }
7429
Jeff Johnsona0619e42018-11-28 17:43:00 -08007430 mac = MAC_CONTEXT(mac_handle);
Jeff Johnson01f2c232018-11-21 19:17:44 -08007431 status = sme_acquire_global_lock(&mac->sme);
Jeff Johnsona5317a62017-01-26 08:51:25 -08007432 if (QDF_STATUS_SUCCESS != status) {
Srinivas Girigowda2c263352017-03-17 17:49:53 -07007433 sme_err("Failed to acquire global lock");
Jeff Johnsona5317a62017-01-26 08:51:25 -08007434 return QDF_STATUS_E_FAILURE;
7435 }
7436
Jeff Johnsone943bca2019-02-08 22:45:17 -08007437 mac->sme.link_speed_context = context;
7438 mac->sme.link_speed_cb = cb;
7439 status = wma_get_link_speed(wma_handle, req);
Jeff Johnson01f2c232018-11-21 19:17:44 -08007440 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007441 return status;
7442}
7443
Jeff Johnson0a8786a2018-12-02 10:49:01 -08007444QDF_STATUS sme_get_peer_stats(struct mac_context *mac,
Ashish Kumar Dhanotiya443d31f2017-10-13 12:41:19 +05307445 struct sir_peer_info_req req)
7446{
7447 QDF_STATUS qdf_status;
7448 struct scheduler_msg message = {0};
7449
7450 qdf_status = sme_acquire_global_lock(&mac->sme);
7451 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
7452 sme_debug("Failed to get Lock");
7453 return qdf_status;
7454 }
7455 /* serialize the req through MC thread */
7456 message.bodyptr = qdf_mem_malloc(sizeof(req));
Arif Hussain0ef77082018-10-10 16:42:53 -07007457 if (!message.bodyptr) {
Ashish Kumar Dhanotiya443d31f2017-10-13 12:41:19 +05307458 sme_release_global_lock(&mac->sme);
7459 return QDF_STATUS_E_NOMEM;
7460 }
7461 qdf_mem_copy(message.bodyptr, &req, sizeof(req));
7462 message.type = WMA_GET_PEER_INFO;
7463 message.reserved = 0;
gaurank kathpalia36b0c582018-08-28 17:45:43 +05307464 qdf_status = scheduler_post_message(QDF_MODULE_ID_SME,
7465 QDF_MODULE_ID_WMA,
7466 QDF_MODULE_ID_WMA, &message);
Ashish Kumar Dhanotiya443d31f2017-10-13 12:41:19 +05307467 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
7468 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
7469 "%s: Post get peer info msg fail", __func__);
7470 qdf_mem_free(message.bodyptr);
7471 qdf_status = QDF_STATUS_E_FAILURE;
7472 }
7473 sme_release_global_lock(&mac->sme);
7474 return qdf_status;
7475}
7476
Jeff Johnsonc7309062018-11-09 20:59:42 -08007477QDF_STATUS
7478sme_get_peer_info(mac_handle_t mac_handle,
7479 struct sir_peer_info_req req,
7480 void *context,
7481 void (*callbackfn)(struct sir_peer_info_resp *param,
7482 void *pcontext))
Will Huang558f8082017-05-31 16:22:24 +08007483{
7484
7485 QDF_STATUS status;
7486 QDF_STATUS qdf_status;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08007487 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Rajeev Kumar658e8492017-12-13 11:35:41 -08007488 struct scheduler_msg message = {0};
Will Huang558f8082017-05-31 16:22:24 +08007489
7490 status = sme_acquire_global_lock(&mac->sme);
7491 if (QDF_STATUS_SUCCESS == status) {
Jeff Johnson038efe72019-03-18 13:39:31 -07007492 if (!callbackfn) {
Will Huang558f8082017-05-31 16:22:24 +08007493 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
7494 "%s: Indication Call back is NULL",
7495 __func__);
7496 sme_release_global_lock(&mac->sme);
7497 return QDF_STATUS_E_FAILURE;
7498 }
7499
7500 mac->sme.pget_peer_info_ind_cb = callbackfn;
7501 mac->sme.pget_peer_info_cb_context = context;
7502
7503 /* serialize the req through MC thread */
7504 message.bodyptr = qdf_mem_malloc(sizeof(req));
Arif Hussain0ef77082018-10-10 16:42:53 -07007505 if (!message.bodyptr) {
Will Huang558f8082017-05-31 16:22:24 +08007506 sme_release_global_lock(&mac->sme);
7507 return QDF_STATUS_E_NOMEM;
7508 }
7509 qdf_mem_copy(message.bodyptr, &req, sizeof(req));
7510 message.type = WMA_GET_PEER_INFO;
Ashish Kumar Dhanotiya443d31f2017-10-13 12:41:19 +05307511 message.reserved = 0;
gaurank kathpalia36b0c582018-08-28 17:45:43 +05307512 qdf_status = scheduler_post_message(QDF_MODULE_ID_SME,
7513 QDF_MODULE_ID_WMA,
7514 QDF_MODULE_ID_WMA,
7515 &message);
Will Huang558f8082017-05-31 16:22:24 +08007516 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
7517 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
7518 "%s: Post get peer info msg fail", __func__);
7519 qdf_mem_free(message.bodyptr);
7520 status = QDF_STATUS_E_FAILURE;
7521 }
7522 sme_release_global_lock(&mac->sme);
7523 }
7524 return status;
7525}
7526
Jeff Johnsonc7309062018-11-09 20:59:42 -08007527QDF_STATUS sme_get_peer_info_ext(mac_handle_t mac_handle,
Will Huang558f8082017-05-31 16:22:24 +08007528 struct sir_peer_info_ext_req *req,
7529 void *context,
7530 void (*callbackfn)(struct sir_peer_info_ext_resp *param,
7531 void *pcontext))
7532{
7533 QDF_STATUS status;
7534 QDF_STATUS qdf_status;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08007535 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Rajeev Kumar658e8492017-12-13 11:35:41 -08007536 struct scheduler_msg message = {0};
Will Huang558f8082017-05-31 16:22:24 +08007537
7538 status = sme_acquire_global_lock(&mac->sme);
7539 if (QDF_STATUS_SUCCESS == status) {
Jeff Johnson038efe72019-03-18 13:39:31 -07007540 if (!callbackfn) {
Will Huang558f8082017-05-31 16:22:24 +08007541 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
7542 "%s: Indication Call back is NULL",
7543 __func__);
7544 sme_release_global_lock(&mac->sme);
7545 return QDF_STATUS_E_FAILURE;
7546 }
7547
7548 mac->sme.pget_peer_info_ext_ind_cb = callbackfn;
7549 mac->sme.pget_peer_info_ext_cb_context = context;
7550
7551 /* serialize the req through MC thread */
7552 message.bodyptr =
7553 qdf_mem_malloc(sizeof(struct sir_peer_info_ext_req));
Arif Hussain0ef77082018-10-10 16:42:53 -07007554 if (!message.bodyptr) {
Will Huang558f8082017-05-31 16:22:24 +08007555 sme_release_global_lock(&mac->sme);
7556 return QDF_STATUS_E_NOMEM;
7557 }
7558 qdf_mem_copy(message.bodyptr,
7559 req,
7560 sizeof(struct sir_peer_info_ext_req));
7561 message.type = WMA_GET_PEER_INFO_EXT;
gaurank kathpalia36b0c582018-08-28 17:45:43 +05307562 qdf_status = scheduler_post_message(QDF_MODULE_ID_SME,
7563 QDF_MODULE_ID_WMA,
7564 QDF_MODULE_ID_WMA,
7565 &message);
Will Huang558f8082017-05-31 16:22:24 +08007566 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
7567 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
7568 "%s: Post get rssi msg fail", __func__);
7569 qdf_mem_free(message.bodyptr);
7570 status = QDF_STATUS_E_FAILURE;
7571 }
7572 sme_release_global_lock(&mac->sme);
7573 }
7574 return status;
7575}
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007576
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007577/*convert the ini value to the ENUM used in csr and MAC for CB state*/
7578ePhyChanBondState sme_get_cb_phy_state_from_cb_ini_value(uint32_t cb_ini_value)
7579{
7580 return csr_convert_cb_ini_value_to_phy_cb_state(cb_ini_value);
7581}
7582
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007583void sme_set_curr_device_mode(mac_handle_t mac_handle,
Jeff Johnson5a6a0c92019-02-17 16:12:02 -08007584 enum QDF_OPMODE curr_device_mode)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007585{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08007586 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307587
Jeff Johnson5a6a0c92019-02-17 16:12:02 -08007588 mac->sme.curr_device_mode = curr_device_mode;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007589}
7590
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307591/*
7592 * sme_handoff_request() - a wrapper function to Request a handoff from CSR.
7593 * This is a synchronous call
7594 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007595 * mac_handle - The handle returned by mac_open
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307596 * sessionId - Session Identifier
7597 * pHandoffInfo - info provided by HDD with the handoff request (namely:
7598 * BSSID, channel etc.)
7599 * Return QDF_STATUS_SUCCESS - SME passed the request to CSR successfully.
7600 * Other status means SME is failed to send the request.
7601 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007602
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007603QDF_STATUS sme_handoff_request(mac_handle_t mac_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007604 uint8_t sessionId,
7605 tCsrHandoffRequest *pHandoffInfo)
7606{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08007607 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307608 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007609
Jeff Johnson01f2c232018-11-21 19:17:44 -08007610 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307611 if (QDF_IS_STATUS_SUCCESS(status)) {
Abhishek Singhe4a1f882017-08-10 17:59:44 +05307612 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007613 "%s: invoked", __func__);
Jeff Johnson01f2c232018-11-21 19:17:44 -08007614 status = csr_handoff_request(mac, sessionId, pHandoffInfo);
7615 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007616 }
7617
7618 return status;
7619}
7620
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007621/**
7622 * sme_add_periodic_tx_ptrn() - Add Periodic TX Pattern
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -08007623 * @mac_handle: Opaque handle to the global MAC context
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007624 * @addPeriodicTxPtrnParams: request message
7625 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307626 * Return: QDF_STATUS enumeration
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007627 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307628QDF_STATUS
Jeff Johnsonc7309062018-11-09 20:59:42 -08007629sme_add_periodic_tx_ptrn(mac_handle_t mac_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007630 struct sSirAddPeriodicTxPtrn *addPeriodicTxPtrnParams)
7631{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307632 QDF_STATUS status = QDF_STATUS_SUCCESS;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08007633 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007634 struct sSirAddPeriodicTxPtrn *req_msg;
Rajeev Kumar37d478b2017-04-17 16:59:28 -07007635 struct scheduler_msg msg = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007636
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07007637 SME_ENTER();
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007638
Anurag Chouhan600c3a02016-03-01 10:33:54 +05307639 req_msg = qdf_mem_malloc(sizeof(*req_msg));
Arif Hussain0ef77082018-10-10 16:42:53 -07007640 if (!req_msg)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307641 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007642
7643 *req_msg = *addPeriodicTxPtrnParams;
7644
7645 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307646 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07007647 sme_err("sme_acquire_global_lock failed!(status=%d)",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007648 status);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05307649 qdf_mem_free(req_msg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007650 return status;
7651 }
7652
7653 /* Serialize the req through MC thread */
7654 msg.bodyptr = req_msg;
7655 msg.type = WMA_ADD_PERIODIC_TX_PTRN_IND;
Sreelakshmi Konamki6a065362016-05-31 16:05:01 +05307656 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
7657 NO_SESSION, msg.type));
gaurank kathpalia36b0c582018-08-28 17:45:43 +05307658 status = scheduler_post_message(QDF_MODULE_ID_SME,
7659 QDF_MODULE_ID_WMA,
7660 QDF_MODULE_ID_WMA, &msg);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307661 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07007662 sme_err("scheduler_post_msg failed!(err=%d)",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007663 status);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05307664 qdf_mem_free(req_msg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007665 }
7666 sme_release_global_lock(&mac->sme);
7667 return status;
7668}
7669
7670/**
7671 * sme_del_periodic_tx_ptrn() - Delete Periodic TX Pattern
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -08007672 * @mac_handle: Opaque handle to the global MAC context
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007673 * @delPeriodicTxPtrnParams: request message
7674 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307675 * Return: QDF_STATUS enumeration
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007676 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307677QDF_STATUS
Jeff Johnsonc7309062018-11-09 20:59:42 -08007678sme_del_periodic_tx_ptrn(mac_handle_t mac_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007679 struct sSirDelPeriodicTxPtrn *delPeriodicTxPtrnParams)
7680{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307681 QDF_STATUS status = QDF_STATUS_SUCCESS;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08007682 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007683 struct sSirDelPeriodicTxPtrn *req_msg;
Rajeev Kumar37d478b2017-04-17 16:59:28 -07007684 struct scheduler_msg msg = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007685
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07007686 SME_ENTER();
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007687
Anurag Chouhan600c3a02016-03-01 10:33:54 +05307688 req_msg = qdf_mem_malloc(sizeof(*req_msg));
Arif Hussain0ef77082018-10-10 16:42:53 -07007689 if (!req_msg)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307690 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007691
7692 *req_msg = *delPeriodicTxPtrnParams;
7693
7694 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307695 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07007696 sme_err("sme_acquire_global_lock failed!(status=%d)",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007697 status);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05307698 qdf_mem_free(req_msg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007699 return status;
7700 }
7701
7702 /* Serialize the req through MC thread */
7703 msg.bodyptr = req_msg;
7704 msg.type = WMA_DEL_PERIODIC_TX_PTRN_IND;
Sreelakshmi Konamki6a065362016-05-31 16:05:01 +05307705 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
7706 NO_SESSION, msg.type));
gaurank kathpalia36b0c582018-08-28 17:45:43 +05307707 status = scheduler_post_message(QDF_MODULE_ID_SME,
7708 QDF_MODULE_ID_WMA,
7709 QDF_MODULE_ID_WMA, &msg);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307710 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07007711 sme_err("scheduler_post_msg failed!(err=%d)",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007712 status);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05307713 qdf_mem_free(req_msg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007714 }
7715 sme_release_global_lock(&mac->sme);
7716 return status;
7717}
7718
Rachit Kankaneee1735c2018-08-02 13:19:34 +05307719#ifdef FEATURE_WLAN_RMC
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307720/*
7721 * sme_enable_rmc() - enables RMC
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -08007722 * @mac_handle: Opaque handle to the global MAC context
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307723 * @sessionId : Session ID
7724 *
7725 * Return: QDF_STATUS
7726 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007727QDF_STATUS sme_enable_rmc(mac_handle_t mac_handle, uint32_t sessionId)
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08007728{
7729 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08007730 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Rajeev Kumar37d478b2017-04-17 16:59:28 -07007731 struct scheduler_msg message = {0};
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08007732 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
7733
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07007734 SME_ENTER();
7735
Jeff Johnson01f2c232018-11-21 19:17:44 -08007736 status = sme_acquire_global_lock(&mac->sme);
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08007737 if (QDF_IS_STATUS_SUCCESS(status)) {
Rajeev Kumar8eaedf62017-01-21 11:03:13 -08007738 message.bodyptr = NULL;
7739 message.type = WMA_RMC_ENABLE_IND;
gaurank kathpalia36b0c582018-08-28 17:45:43 +05307740 qdf_status = scheduler_post_message(QDF_MODULE_ID_SME,
7741 QDF_MODULE_ID_WMA,
7742 QDF_MODULE_ID_WMA,
7743 &message);
Madhvapathi Sriram3e6627a2018-12-19 12:54:49 +05307744 if (!QDF_IS_STATUS_SUCCESS(qdf_status))
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08007745 status = QDF_STATUS_E_FAILURE;
Madhvapathi Sriram3e6627a2018-12-19 12:54:49 +05307746
Jeff Johnson01f2c232018-11-21 19:17:44 -08007747 sme_release_global_lock(&mac->sme);
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08007748 }
7749 return status;
7750}
7751
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307752/*
7753 * sme_disable_rmc() - disables RMC
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -08007754 * @mac_handle: Opaque handle to the global MAC context
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307755 * @sessionId : Session ID
7756 *
7757 * Return: QDF_STATUS
7758 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007759QDF_STATUS sme_disable_rmc(mac_handle_t mac_handle, uint32_t sessionId)
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08007760{
7761 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08007762 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Rajeev Kumar37d478b2017-04-17 16:59:28 -07007763 struct scheduler_msg message = {0};
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08007764 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
7765
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07007766 SME_ENTER();
7767
Jeff Johnson01f2c232018-11-21 19:17:44 -08007768 status = sme_acquire_global_lock(&mac->sme);
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08007769 if (QDF_IS_STATUS_SUCCESS(status)) {
Rajeev Kumar8eaedf62017-01-21 11:03:13 -08007770 message.bodyptr = NULL;
7771 message.type = WMA_RMC_DISABLE_IND;
gaurank kathpalia36b0c582018-08-28 17:45:43 +05307772 qdf_status = scheduler_post_message(QDF_MODULE_ID_SME,
7773 QDF_MODULE_ID_WMA,
7774 QDF_MODULE_ID_WMA,
7775 &message);
Madhvapathi Sriram3e6627a2018-12-19 12:54:49 +05307776 if (!QDF_IS_STATUS_SUCCESS(qdf_status))
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08007777 status = QDF_STATUS_E_FAILURE;
Madhvapathi Sriram3e6627a2018-12-19 12:54:49 +05307778
Jeff Johnson01f2c232018-11-21 19:17:44 -08007779 sme_release_global_lock(&mac->sme);
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08007780 }
7781 return status;
7782}
7783
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307784/*
7785 * sme_send_rmc_action_period() - sends RMC action period param to target
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -08007786 * @mac_handle: Opaque handle to the global MAC context
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307787 * @sessionId : Session ID
7788 *
7789 * Return: QDF_STATUS
7790 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007791QDF_STATUS sme_send_rmc_action_period(mac_handle_t mac_handle,
7792 uint32_t sessionId)
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08007793{
7794 QDF_STATUS status = QDF_STATUS_SUCCESS;
7795 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08007796 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Rajeev Kumar37d478b2017-04-17 16:59:28 -07007797 struct scheduler_msg message = {0};
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08007798
Jeff Johnson01f2c232018-11-21 19:17:44 -08007799 status = sme_acquire_global_lock(&mac->sme);
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08007800 if (QDF_STATUS_SUCCESS == status) {
Rajeev Kumar8eaedf62017-01-21 11:03:13 -08007801 message.bodyptr = NULL;
7802 message.type = WMA_RMC_ACTION_PERIOD_IND;
gaurank kathpalia36b0c582018-08-28 17:45:43 +05307803 qdf_status = scheduler_post_message(QDF_MODULE_ID_SME,
7804 QDF_MODULE_ID_WMA,
7805 QDF_MODULE_ID_WMA,
7806 &message);
Madhvapathi Sriram3e6627a2018-12-19 12:54:49 +05307807 if (!QDF_IS_STATUS_SUCCESS(qdf_status))
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08007808 status = QDF_STATUS_E_FAILURE;
Madhvapathi Sriram3e6627a2018-12-19 12:54:49 +05307809
Jeff Johnson01f2c232018-11-21 19:17:44 -08007810 sme_release_global_lock(&mac->sme);
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08007811 }
7812
7813 return status;
7814}
Rachit Kankaneee1735c2018-08-02 13:19:34 +05307815#endif /* FEATURE_WLAN_RMC */
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08007816
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307817/*
7818 * sme_request_ibss_peer_info() - request ibss peer info
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -08007819 * @mac_handle: Opaque handle to the global MAC context
Jeff Johnson56ba88a2019-02-17 17:18:43 -08007820 * @cb_context: Pointer to user data
Jeff Johnsond6a23162019-02-17 16:46:37 -08007821 * @peer_info_cb: Peer info callback
7822 * @allPeerInfoReqd: All peer info required or not
7823 * @staIdx: sta index
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307824 *
7825 * Return: QDF_STATUS
7826 */
Jeff Johnson56ba88a2019-02-17 17:18:43 -08007827QDF_STATUS sme_request_ibss_peer_info(mac_handle_t mac_handle, void *cb_context,
Jeff Johnsond6a23162019-02-17 16:46:37 -08007828 ibss_peer_info_cb peer_info_cb,
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08007829 bool allPeerInfoReqd, uint8_t staIdx)
7830{
7831 QDF_STATUS status = QDF_STATUS_E_FAILURE;
7832 QDF_STATUS qdf_status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08007833 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Rajeev Kumar37d478b2017-04-17 16:59:28 -07007834 struct scheduler_msg message = {0};
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08007835 tSirIbssGetPeerInfoReqParams *pIbssInfoReqParams;
Jeff Johnsone7aa5cd2019-02-17 19:36:01 -08007836 struct ibss_peer_info_cb_info *cb_info;
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08007837
Jeff Johnson01f2c232018-11-21 19:17:44 -08007838 status = sme_acquire_global_lock(&mac->sme);
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08007839 if (QDF_STATUS_SUCCESS == status) {
Jeff Johnsone7aa5cd2019-02-17 19:36:01 -08007840 cb_info = &mac->sme.peer_info_cb_info;
7841 cb_info->peer_info_cb = peer_info_cb;
7842 cb_info->peer_info_cb_context = cb_context;
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08007843
7844 pIbssInfoReqParams = (tSirIbssGetPeerInfoReqParams *)
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307845 qdf_mem_malloc(sizeof(tSirIbssGetPeerInfoReqParams));
Arif Hussain0ef77082018-10-10 16:42:53 -07007846 if (!pIbssInfoReqParams) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08007847 sme_release_global_lock(&mac->sme);
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08007848 return QDF_STATUS_E_NOMEM;
7849 }
7850 pIbssInfoReqParams->allPeerInfoReqd = allPeerInfoReqd;
7851 pIbssInfoReqParams->staIdx = staIdx;
7852
Rajeev Kumar8eaedf62017-01-21 11:03:13 -08007853 message.type = WMA_GET_IBSS_PEER_INFO_REQ;
7854 message.bodyptr = pIbssInfoReqParams;
7855 message.reserved = 0;
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08007856
gaurank kathpalia36b0c582018-08-28 17:45:43 +05307857 qdf_status = scheduler_post_message(QDF_MODULE_ID_SME,
7858 QDF_MODULE_ID_WMA,
7859 QDF_MODULE_ID_WMA,
7860 &message);
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08007861 if (QDF_STATUS_SUCCESS != qdf_status) {
7862 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
7863 "%s: Post WMA_GET_IBSS_PEER_INFO_REQ MSG failed",
7864 __func__);
7865 qdf_mem_free(pIbssInfoReqParams);
7866 qdf_status = QDF_STATUS_E_FAILURE;
7867 }
Jeff Johnson01f2c232018-11-21 19:17:44 -08007868 sme_release_global_lock(&mac->sme);
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08007869 }
7870
7871 return qdf_status;
7872}
7873
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307874/*
7875 * sme_send_cesium_enable_ind() -
7876 * Used to send proprietary cesium enable indication to fw
7877 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007878 * mac_handle
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307879 * sessionId
7880 * Return QDF_STATUS
7881 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007882QDF_STATUS sme_send_cesium_enable_ind(mac_handle_t mac_handle,
7883 uint32_t sessionId)
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08007884{
7885 QDF_STATUS status = QDF_STATUS_SUCCESS;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08007886 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Rajeev Kumar37d478b2017-04-17 16:59:28 -07007887 struct scheduler_msg message = {0};
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08007888
Jeff Johnson01f2c232018-11-21 19:17:44 -08007889 status = sme_acquire_global_lock(&mac->sme);
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08007890 if (QDF_STATUS_SUCCESS == status) {
Rajeev Kumar8eaedf62017-01-21 11:03:13 -08007891 message.bodyptr = NULL;
7892 message.type = WMA_IBSS_CESIUM_ENABLE_IND;
Madhvapathi Sriram3e6627a2018-12-19 12:54:49 +05307893 status = scheduler_post_message(QDF_MODULE_ID_SME,
7894 QDF_MODULE_ID_WMA,
7895 QDF_MODULE_ID_WMA,
7896 &message);
Jeff Johnson01f2c232018-11-21 19:17:44 -08007897 sme_release_global_lock(&mac->sme);
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08007898 }
7899
7900 return status;
7901}
7902
Jeff Johnsonc7309062018-11-09 20:59:42 -08007903QDF_STATUS sme_set_wlm_latency_level(mac_handle_t mac_handle,
7904 uint16_t session_id,
Paul Zhang99fe8842017-12-08 14:43:46 +08007905 uint16_t latency_level)
7906{
7907 QDF_STATUS status;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08007908 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Paul Zhang99fe8842017-12-08 14:43:46 +08007909 struct wlm_latency_level_param params;
7910 void *wma = cds_get_context(QDF_MODULE_ID_WMA);
7911
Bala Venkatesh7cf5b662018-05-10 15:18:53 +05307912 if (!wma)
7913 return QDF_STATUS_E_FAILURE;
7914
Yeshwanth Sriram Guntuka334aa8d2018-08-20 16:49:15 +05307915 if (!mac_ctx->mlme_cfg->wlm_config.latency_enable) {
Paul Zhang99fe8842017-12-08 14:43:46 +08007916 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
7917 "%s: WLM latency level setting is disabled",
7918 __func__);
7919 return QDF_STATUS_E_FAILURE;
7920 }
Krunal Soni3fa80e22018-01-09 14:16:02 -08007921 if (!wma) {
7922 sme_err("wma is NULL");
7923 return QDF_STATUS_E_FAILURE;
7924 }
Paul Zhang99fe8842017-12-08 14:43:46 +08007925
7926 params.wlm_latency_level = latency_level;
7927 params.wlm_latency_flags =
Yeshwanth Sriram Guntuka334aa8d2018-08-20 16:49:15 +05307928 mac_ctx->mlme_cfg->wlm_config.latency_flags[latency_level];
Paul Zhang99fe8842017-12-08 14:43:46 +08007929 params.vdev_id = session_id;
7930
7931 status = wma_set_wlm_latency_level(wma, &params);
Paul Zhang99fe8842017-12-08 14:43:46 +08007932
7933 return status;
7934}
7935
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007936void sme_get_command_q_status(mac_handle_t mac_handle)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007937{
7938 tSmeCmd *pTempCmd = NULL;
7939 tListElem *pEntry;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08007940 struct mac_context *mac;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007941
Madhvapathi Sriram3e6627a2018-12-19 12:54:49 +05307942 if (!mac_handle)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007943 return;
Madhvapathi Sriram3e6627a2018-12-19 12:54:49 +05307944
7945 mac = MAC_CONTEXT(mac_handle);
7946
Jeff Johnson01f2c232018-11-21 19:17:44 -08007947 pEntry = csr_nonscan_active_ll_peek_head(mac, LL_ACCESS_LOCK);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307948 if (pEntry)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007949 pTempCmd = GET_BASE_ADDR(pEntry, tSmeCmd, Link);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307950
Kabilan Kannan33fcd682018-03-08 14:29:46 -08007951 sme_err("WLAN_BUG_RCA: Currently smeCmdActiveList has command (0x%X)",
Madhvapathi Sriram3e6627a2018-12-19 12:54:49 +05307952 (pTempCmd) ? pTempCmd->command : eSmeNoCommand);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007953 if (pTempCmd) {
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05307954 if (eSmeCsrCommandMask & pTempCmd->command)
7955 /* CSR command is stuck. See what the reason code is
7956 * for that command
7957 */
Jeff Johnson01f2c232018-11-21 19:17:44 -08007958 dump_csr_command_info(mac, pTempCmd);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007959 } /* if(pTempCmd) */
7960
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07007961 sme_err("Currently smeCmdPendingList has %d commands",
Madhvapathi Sriram3e6627a2018-12-19 12:54:49 +05307962 csr_nonscan_pending_ll_count(mac));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007963
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007964}
Kiran Kumar Lokere1aa9c9a2016-10-05 18:50:59 -07007965
Agrawal Ashishb141b092016-09-02 19:59:26 +05307966#ifdef WLAN_FEATURE_DSRC
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007967/**
Naveen Rawatb4d37622015-11-13 16:15:25 -08007968 * sme_ocb_gen_timing_advert_frame() - generate TA frame and populate the buffer
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -08007969 * @mac_handle: Opaque handle to the global MAC context
Naveen Rawatb4d37622015-11-13 16:15:25 -08007970 * @self_addr: the self MAC address
7971 * @buf: the buffer that will contain the frame
7972 * @timestamp_offset: return for the offset of the timestamp field
7973 * @time_value_offset: return for the time_value field in the TA IE
7974 *
7975 * Return: the length of the buffer.
7976 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007977int sme_ocb_gen_timing_advert_frame(mac_handle_t mac_handle,
Naveen Rawatb4d37622015-11-13 16:15:25 -08007978 tSirMacAddr self_addr, uint8_t **buf,
7979 uint32_t *timestamp_offset,
7980 uint32_t *time_value_offset)
7981{
7982 int template_length;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08007983 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Naveen Rawatb4d37622015-11-13 16:15:25 -08007984
7985 template_length = sch_gen_timing_advert_frame(mac_ctx, self_addr, buf,
7986 timestamp_offset,
7987 time_value_offset);
7988 return template_length;
7989}
Agrawal Ashishb141b092016-09-02 19:59:26 +05307990#endif
Arun Khandavalli4b55da72016-07-19 19:55:01 +05307991
Jeff Johnsonb460dd72018-11-08 10:26:51 -08007992QDF_STATUS sme_notify_modem_power_state(mac_handle_t mac_handle, uint32_t value)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007993{
Rajeev Kumar37d478b2017-04-17 16:59:28 -07007994 struct scheduler_msg msg = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007995 tpSirModemPowerStateInd request_buf;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08007996 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007997
Jeff Johnson038efe72019-03-18 13:39:31 -07007998 if (!mac)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307999 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008000
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308001 request_buf = qdf_mem_malloc(sizeof(tSirModemPowerStateInd));
Arif Hussain0ef77082018-10-10 16:42:53 -07008002 if (!request_buf)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308003 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008004
8005 request_buf->param = value;
8006
8007 msg.type = WMA_MODEM_POWER_STATE_IND;
8008 msg.reserved = 0;
8009 msg.bodyptr = request_buf;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308010 if (!QDF_IS_STATUS_SUCCESS
gaurank kathpalia36b0c582018-08-28 17:45:43 +05308011 (scheduler_post_message(QDF_MODULE_ID_SME,
8012 QDF_MODULE_ID_WMA,
8013 QDF_MODULE_ID_WMA, &msg))) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308014 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05308015 "%s: Not able to post WMA_MODEM_POWER_STATE_IND message to WMA",
8016 __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308017 qdf_mem_free(request_buf);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308018 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008019 }
8020
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308021 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008022}
8023
8024#ifdef QCA_HT_2040_COEX
Jeff Johnsonb460dd72018-11-08 10:26:51 -08008025QDF_STATUS sme_notify_ht2040_mode(mac_handle_t mac_handle, uint16_t staId,
Anurag Chouhan6d760662016-02-20 16:05:43 +05308026 struct qdf_mac_addr macAddrSTA,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008027 uint8_t sessionId,
8028 uint8_t channel_type)
8029{
Rajeev Kumar37d478b2017-04-17 16:59:28 -07008030 struct scheduler_msg msg = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008031 tUpdateVHTOpMode *pHtOpMode = NULL;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08008032 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008033
Jeff Johnson038efe72019-03-18 13:39:31 -07008034 if (!mac)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308035 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008036
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308037 pHtOpMode = qdf_mem_malloc(sizeof(tUpdateVHTOpMode));
Arif Hussain0ef77082018-10-10 16:42:53 -07008038 if (!pHtOpMode)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308039 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008040
8041 switch (channel_type) {
8042 case eHT_CHAN_HT20:
8043 pHtOpMode->opMode = eHT_CHANNEL_WIDTH_20MHZ;
8044 break;
8045
8046 case eHT_CHAN_HT40MINUS:
8047 case eHT_CHAN_HT40PLUS:
8048 pHtOpMode->opMode = eHT_CHANNEL_WIDTH_40MHZ;
8049 break;
8050
8051 default:
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308052 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008053 "%s: Invalid OP mode", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308054 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008055 }
8056
8057 pHtOpMode->staId = staId,
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308058 qdf_mem_copy(pHtOpMode->peer_mac, macAddrSTA.bytes,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008059 sizeof(tSirMacAddr));
8060 pHtOpMode->smesessionId = sessionId;
8061
8062 msg.type = WMA_UPDATE_OP_MODE;
8063 msg.reserved = 0;
8064 msg.bodyptr = pHtOpMode;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308065 if (!QDF_IS_STATUS_SUCCESS
gaurank kathpalia36b0c582018-08-28 17:45:43 +05308066 (scheduler_post_message(QDF_MODULE_ID_SME,
8067 QDF_MODULE_ID_WMA,
8068 QDF_MODULE_ID_WMA, &msg))) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308069 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05308070 "%s: Not able to post WMA_UPDATE_OP_MODE message to WMA",
8071 __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308072 qdf_mem_free(pHtOpMode);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308073 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008074 }
8075
Abhishek Singhe4a1f882017-08-10 17:59:44 +05308076 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Jeff Johnson698eacd2018-05-12 17:00:03 -07008077 "%s: Notified FW about OP mode: %d for staId=%d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008078 __func__, pHtOpMode->opMode, staId);
8079
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308080 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008081}
8082
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05308083/*
8084 * sme_set_ht2040_mode() -
8085 * To update HT Operation beacon IE.
8086 *
8087 * Return QDF_STATUS SUCCESS
8088 * FAILURE or RESOURCES
8089 * The API finished and failed.
8090 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08008091QDF_STATUS sme_set_ht2040_mode(mac_handle_t mac_handle, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008092 uint8_t channel_type, bool obssEnabled)
8093{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308094 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08008095 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008096 ePhyChanBondState cbMode;
Jeff Johnson01f2c232018-11-21 19:17:44 -08008097 struct csr_roam_session *session = CSR_GET_SESSION(mac, sessionId);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008098
Jeff Johnson01f2c232018-11-21 19:17:44 -08008099 if (!CSR_IS_SESSION_VALID(mac, sessionId)) {
Abhishek Singh9d5f4582017-10-11 17:59:48 +05308100 sme_err("Session not valid for session id %d", sessionId);
8101 return QDF_STATUS_E_INVAL;
8102 }
Jeff Johnson01f2c232018-11-21 19:17:44 -08008103 session = CSR_GET_SESSION(mac, sessionId);
Abhishek Singh9d5f4582017-10-11 17:59:48 +05308104 sme_debug("Update HT operation beacon IE, channel_type=%d cur cbmode %d",
8105 channel_type, session->bssParams.cbMode);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008106
8107 switch (channel_type) {
8108 case eHT_CHAN_HT20:
Abhishek Singh9d5f4582017-10-11 17:59:48 +05308109 if (!session->bssParams.cbMode)
8110 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008111 cbMode = PHY_SINGLE_CHANNEL_CENTERED;
8112 break;
8113 case eHT_CHAN_HT40MINUS:
Abhishek Singh9d5f4582017-10-11 17:59:48 +05308114 if (session->bssParams.cbMode)
8115 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008116 cbMode = PHY_DOUBLE_CHANNEL_HIGH_PRIMARY;
8117 break;
8118 case eHT_CHAN_HT40PLUS:
Abhishek Singh9d5f4582017-10-11 17:59:48 +05308119 if (session->bssParams.cbMode)
8120 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008121 cbMode = PHY_DOUBLE_CHANNEL_LOW_PRIMARY;
8122 break;
8123 default:
Abhishek Singh9d5f4582017-10-11 17:59:48 +05308124 sme_err("Error!!! Invalid HT20/40 mode !");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308125 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008126 }
Abhishek Singh9d5f4582017-10-11 17:59:48 +05308127 session->bssParams.cbMode = cbMode;
Jeff Johnson01f2c232018-11-21 19:17:44 -08008128 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308129 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08008130 status = csr_set_ht2040_mode(mac, sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008131 cbMode, obssEnabled);
Jeff Johnson01f2c232018-11-21 19:17:44 -08008132 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008133 }
8134 return status;
8135}
8136
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008137#endif
8138
8139/*
8140 * SME API to enable/disable idle mode powersave
8141 * This should be called only if powersave offload
8142 * is enabled
8143 */
Arunk Khandavalli847969d2017-09-25 15:15:36 +05308144QDF_STATUS sme_set_idle_powersave_config(bool value)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008145{
Anurag Chouhan6d760662016-02-20 16:05:43 +05308146 void *wmaContext = cds_get_context(QDF_MODULE_ID_WMA);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008147
Jeff Johnson038efe72019-03-18 13:39:31 -07008148 if (!wmaContext) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308149 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008150 "%s: wmaContext is NULL", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308151 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008152 }
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308153 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008154 " Idle Ps Set Value %d", value);
8155
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308156 if (QDF_STATUS_SUCCESS != wma_set_idle_ps_config(wmaContext, value)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308157 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008158 " Failed to Set Idle Ps Value %d", value);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308159 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008160 }
Arunk Khandavalli847969d2017-09-25 15:15:36 +05308161
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308162 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008163}
8164
Jeff Johnsonb460dd72018-11-08 10:26:51 -08008165int16_t sme_get_ht_config(mac_handle_t mac_handle, uint8_t session_id,
8166 uint16_t ht_capab)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008167{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08008168 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Jeff Johnson01f2c232018-11-21 19:17:44 -08008169 struct csr_roam_session *pSession = CSR_GET_SESSION(mac, session_id);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008170
Jeff Johnson038efe72019-03-18 13:39:31 -07008171 if (!pSession) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308172 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008173 "%s: pSession is NULL", __func__);
8174 return -EIO;
8175 }
8176 switch (ht_capab) {
8177 case WNI_CFG_HT_CAP_INFO_ADVANCE_CODING:
Jeff Johnsonbe119e62019-02-02 12:30:26 -08008178 return pSession->ht_config.ht_rx_ldpc;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008179 case WNI_CFG_HT_CAP_INFO_TX_STBC:
Jeff Johnsonbe119e62019-02-02 12:30:26 -08008180 return pSession->ht_config.ht_tx_stbc;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008181 case WNI_CFG_HT_CAP_INFO_RX_STBC:
Jeff Johnsonbe119e62019-02-02 12:30:26 -08008182 return pSession->ht_config.ht_rx_stbc;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008183 case WNI_CFG_HT_CAP_INFO_SHORT_GI_20MHZ:
Jeff Johnsonbe119e62019-02-02 12:30:26 -08008184 return pSession->ht_config.ht_sgi20;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008185 case WNI_CFG_HT_CAP_INFO_SHORT_GI_40MHZ:
Jeff Johnsonbe119e62019-02-02 12:30:26 -08008186 return pSession->ht_config.ht_sgi40;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008187 default:
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308188 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008189 "invalid ht capability");
8190 return -EIO;
8191 }
8192}
8193
Jeff Johnsonb460dd72018-11-08 10:26:51 -08008194int sme_update_ht_config(mac_handle_t mac_handle, uint8_t sessionId,
8195 uint16_t htCapab, int value)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008196{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08008197 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Jeff Johnson01f2c232018-11-21 19:17:44 -08008198 struct csr_roam_session *pSession = CSR_GET_SESSION(mac, sessionId);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008199
Jeff Johnson038efe72019-03-18 13:39:31 -07008200 if (!pSession) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308201 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008202 "%s: pSession is NULL", __func__);
8203 return -EIO;
8204 }
8205
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308206 if (QDF_STATUS_SUCCESS != wma_set_htconfig(sessionId, htCapab, value)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308207 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008208 "Failed to set ht capability in target");
8209 return -EIO;
8210 }
8211
8212 switch (htCapab) {
8213 case WNI_CFG_HT_CAP_INFO_ADVANCE_CODING:
Jeff Johnsonbe119e62019-02-02 12:30:26 -08008214 pSession->ht_config.ht_rx_ldpc = value;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008215 break;
8216 case WNI_CFG_HT_CAP_INFO_TX_STBC:
Jeff Johnsonbe119e62019-02-02 12:30:26 -08008217 pSession->ht_config.ht_tx_stbc = value;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008218 break;
8219 case WNI_CFG_HT_CAP_INFO_RX_STBC:
Jeff Johnsonbe119e62019-02-02 12:30:26 -08008220 pSession->ht_config.ht_rx_stbc = value;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008221 break;
8222 case WNI_CFG_HT_CAP_INFO_SHORT_GI_20MHZ:
Krishna Kumaar Natarajana5c5aad2016-12-05 14:12:13 -08008223 value = value ? 1 : 0; /* HT SGI can be only 1 or 0 */
Jeff Johnsonbe119e62019-02-02 12:30:26 -08008224 pSession->ht_config.ht_sgi20 = value;
Sandeep Puligilla607f34a2016-05-25 14:37:47 -07008225 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008226 case WNI_CFG_HT_CAP_INFO_SHORT_GI_40MHZ:
Krishna Kumaar Natarajana5c5aad2016-12-05 14:12:13 -08008227 value = value ? 1 : 0; /* HT SGI can be only 1 or 0 */
Jeff Johnsonbe119e62019-02-02 12:30:26 -08008228 pSession->ht_config.ht_sgi40 = value;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008229 break;
8230 }
8231
Jeff Johnson01f2c232018-11-21 19:17:44 -08008232 csr_roam_update_config(mac, sessionId, htCapab, value);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008233 return 0;
8234}
8235
Jeff Johnsonc7309062018-11-09 20:59:42 -08008236int sme_set_addba_accept(mac_handle_t mac_handle, uint8_t session_id, int value)
Kiran Kumar Lokere08195ef2018-01-17 19:25:15 -08008237{
8238 struct sme_addba_accept *addba_accept;
8239 struct scheduler_msg msg = {0};
8240 QDF_STATUS status;
8241
8242 addba_accept = qdf_mem_malloc(sizeof(*addba_accept));
Arif Hussain0ef77082018-10-10 16:42:53 -07008243 if (!addba_accept)
Kiran Kumar Lokere08195ef2018-01-17 19:25:15 -08008244 return -EIO;
Arif Hussain0ef77082018-10-10 16:42:53 -07008245
Kiran Kumar Lokere08195ef2018-01-17 19:25:15 -08008246 addba_accept->session_id = session_id;
8247 addba_accept->addba_accept = value;
8248 qdf_mem_zero(&msg, sizeof(msg));
8249 msg.type = eWNI_SME_SET_ADDBA_ACCEPT;
8250 msg.reserved = 0;
8251 msg.bodyptr = addba_accept;
gaurank kathpalia36b0c582018-08-28 17:45:43 +05308252 status = scheduler_post_message(QDF_MODULE_ID_SME,
8253 QDF_MODULE_ID_PE,
8254 QDF_MODULE_ID_PE, &msg);
Kiran Kumar Lokere08195ef2018-01-17 19:25:15 -08008255 if (status != QDF_STATUS_SUCCESS) {
8256 sme_err("Not able to post addba reject");
8257 qdf_mem_free(addba_accept);
8258 return -EIO;
8259 }
8260 return 0;
8261}
Kiran Kumar Lokerebc87bec2018-02-27 20:06:42 -08008262
Jeff Johnsonc7309062018-11-09 20:59:42 -08008263int sme_set_ba_buff_size(mac_handle_t mac_handle, uint8_t session_id,
8264 uint16_t buff_size)
Kiran Kumar Lokerebc87bec2018-02-27 20:06:42 -08008265{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08008266 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Kiran Kumar Lokerebc87bec2018-02-27 20:06:42 -08008267 if (!buff_size) {
8268 sme_err("invalid buff size %d", buff_size);
8269 return -EINVAL;
8270 }
8271 mac_ctx->usr_cfg_ba_buff_size = buff_size;
8272 sme_debug("addba buff size is set to %d",
8273 mac_ctx->usr_cfg_ba_buff_size);
8274
8275 return 0;
8276}
8277
8278#define DEFAULT_BA_BUFF_SIZE 64
Jeff Johnsonc7309062018-11-09 20:59:42 -08008279int sme_send_addba_req(mac_handle_t mac_handle, uint8_t session_id, uint8_t tid,
8280 uint16_t buff_size)
Kiran Kumar Lokerebc87bec2018-02-27 20:06:42 -08008281{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08008282 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Kiran Kumar Lokerebc87bec2018-02-27 20:06:42 -08008283 uint16_t ba_buff = 0;
8284 QDF_STATUS status;
8285 struct scheduler_msg msg = {0};
8286 struct send_add_ba_req *send_ba_req;
8287 struct csr_roam_session *csr_session = NULL;
8288
8289 if (!csr_is_conn_state_connected_infra(mac_ctx, session_id)) {
8290 sme_err("STA not infra/connected state session_id: %d",
8291 session_id);
8292 return -EINVAL;
8293 }
8294 csr_session = CSR_GET_SESSION(mac_ctx, session_id);
8295 if (!csr_session) {
8296 sme_err("CSR session is NULL");
8297 return -EINVAL;
8298 }
8299 send_ba_req = qdf_mem_malloc(sizeof(*send_ba_req));
Arif Hussain0ef77082018-10-10 16:42:53 -07008300 if (!send_ba_req)
Kiran Kumar Lokerebc87bec2018-02-27 20:06:42 -08008301 return -EIO;
Arif Hussain0ef77082018-10-10 16:42:53 -07008302
Kiran Kumar Lokerebc87bec2018-02-27 20:06:42 -08008303 qdf_mem_copy(send_ba_req->mac_addr,
8304 csr_session->connectedProfile.bssid.bytes,
8305 QDF_MAC_ADDR_SIZE);
8306 ba_buff = buff_size;
8307 if (!buff_size) {
8308 if (mac_ctx->usr_cfg_ba_buff_size)
8309 ba_buff = mac_ctx->usr_cfg_ba_buff_size;
8310 else
8311 ba_buff = DEFAULT_BA_BUFF_SIZE;
8312 }
8313 send_ba_req->param.vdev_id = session_id;
8314 send_ba_req->param.tidno = tid;
8315 send_ba_req->param.buffersize = ba_buff;
8316 msg.type = WMA_SEND_ADDBA_REQ;
8317 msg.bodyptr = send_ba_req;
gaurank kathpalia36b0c582018-08-28 17:45:43 +05308318 status = scheduler_post_message(QDF_MODULE_ID_SME,
8319 QDF_MODULE_ID_WMA,
8320 QDF_MODULE_ID_WMA, &msg);
Kiran Kumar Lokerebc87bec2018-02-27 20:06:42 -08008321 if (QDF_STATUS_SUCCESS != status) {
Kiran Kumar Lokerebc87bec2018-02-27 20:06:42 -08008322 qdf_mem_free(send_ba_req);
8323 return -EIO;
8324 }
8325 sme_debug("ADDBA_REQ sent to FW: tid %d buff_size %d", tid, ba_buff);
8326
8327 return 0;
8328}
8329
Jeff Johnsonc7309062018-11-09 20:59:42 -08008330int sme_set_no_ack_policy(mac_handle_t mac_handle, uint8_t session_id,
8331 uint8_t val, uint8_t ac)
Kiran Kumar Lokere3324f632018-03-01 21:43:21 -08008332{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08008333 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Kiran Kumar Lokere3324f632018-03-01 21:43:21 -08008334 uint8_t i, set_val;
Arif Hussaineb8ba362018-03-07 19:15:13 -08008335 struct scheduler_msg msg = {0};
8336 QDF_STATUS status;
Kiran Kumar Lokere3324f632018-03-01 21:43:21 -08008337
Srinivas Girigowda5b86fbd2019-03-21 14:54:14 -07008338 if (ac > QCA_WLAN_AC_ALL) {
Kiran Kumar Lokere3324f632018-03-01 21:43:21 -08008339 sme_err("invalid ac val %d", ac);
8340 return -EINVAL;
8341 }
8342 if (val)
8343 set_val = 1;
8344 else
8345 set_val = 0;
Srinivas Girigowda5b86fbd2019-03-21 14:54:14 -07008346 if (ac == QCA_WLAN_AC_ALL) {
Kiran Kumar Lokere3324f632018-03-01 21:43:21 -08008347 for (i = 0; i < ac; i++)
8348 mac_ctx->no_ack_policy_cfg[i] = set_val;
8349 } else {
8350 mac_ctx->no_ack_policy_cfg[ac] = set_val;
8351 }
8352 sme_debug("no ack is set to %d for ac %d", set_val, ac);
Arif Hussaineb8ba362018-03-07 19:15:13 -08008353 qdf_mem_zero(&msg, sizeof(msg));
8354 msg.type = eWNI_SME_UPDATE_EDCA_PROFILE;
8355 msg.reserved = 0;
8356 msg.bodyval = session_id;
gaurank kathpalia36b0c582018-08-28 17:45:43 +05308357 status = scheduler_post_message(QDF_MODULE_ID_SME,
8358 QDF_MODULE_ID_PE,
8359 QDF_MODULE_ID_PE, &msg);
Arif Hussaineb8ba362018-03-07 19:15:13 -08008360 if (status != QDF_STATUS_SUCCESS) {
8361 sme_err("Not able to post update edca profile");
8362 return -EIO;
8363 }
Kiran Kumar Lokere3324f632018-03-01 21:43:21 -08008364
8365 return 0;
8366}
8367
Jeff Johnsonc7309062018-11-09 20:59:42 -08008368int sme_set_auto_rate_he_ltf(mac_handle_t mac_handle, uint8_t session_id,
8369 uint8_t cfg_val)
Kiran Kumar Lokerea006a302018-03-07 20:58:13 -08008370{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08008371 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Kiran Kumar Lokerea006a302018-03-07 20:58:13 -08008372 uint32_t set_val;
8373 uint32_t bit_mask = 0;
8374 int status;
8375
8376 if (cfg_val > QCA_WLAN_HE_LTF_4X) {
8377 sme_err("invalid HE LTF cfg %d", cfg_val);
8378 return -EINVAL;
8379 }
8380
8381 /*set the corresponding HE LTF cfg BIT*/
8382 if (cfg_val == QCA_WLAN_HE_LTF_AUTO)
8383 bit_mask = HE_LTF_ALL;
8384 else
8385 bit_mask = (1 << (cfg_val - 1));
8386
8387 set_val = mac_ctx->he_sgi_ltf_cfg_bit_mask;
8388
8389 SET_AUTO_RATE_HE_LTF_VAL(set_val, bit_mask);
8390
8391 mac_ctx->he_sgi_ltf_cfg_bit_mask = set_val;
8392 status = wma_cli_set_command(session_id,
8393 WMI_VDEV_PARAM_AUTORATE_MISC_CFG,
8394 set_val, VDEV_CMD);
8395 if (status) {
8396 sme_err("failed to set he_ltf_sgi");
8397 return status;
8398 }
8399
8400 sme_debug("HE SGI_LTF is set to 0x%08X",
8401 mac_ctx->he_sgi_ltf_cfg_bit_mask);
8402
8403 return 0;
8404}
8405
Jeff Johnsonc7309062018-11-09 20:59:42 -08008406int sme_set_auto_rate_he_sgi(mac_handle_t mac_handle, uint8_t session_id,
8407 uint8_t cfg_val)
Kiran Kumar Lokerea006a302018-03-07 20:58:13 -08008408{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08008409 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Kiran Kumar Lokerea006a302018-03-07 20:58:13 -08008410 uint32_t set_val;
8411 uint32_t sgi_bit_mask = 0;
8412 int status;
8413
8414 if ((cfg_val > AUTO_RATE_GI_3200NS) ||
8415 (cfg_val < AUTO_RATE_GI_400NS)) {
8416 sme_err("invalid auto rate GI cfg %d", cfg_val);
8417 return -EINVAL;
8418 }
8419
8420 sgi_bit_mask = (1 << cfg_val);
8421
8422 set_val = mac_ctx->he_sgi_ltf_cfg_bit_mask;
8423 SET_AUTO_RATE_SGI_VAL(set_val, sgi_bit_mask);
8424
8425 mac_ctx->he_sgi_ltf_cfg_bit_mask = set_val;
8426 status = wma_cli_set_command(session_id,
8427 WMI_VDEV_PARAM_AUTORATE_MISC_CFG,
8428 set_val, VDEV_CMD);
8429 if (status) {
8430 sme_err("failed to set he_ltf_sgi");
8431 return status;
8432 }
8433
8434 sme_debug("auto rate HE SGI_LTF is set to 0x%08X",
8435 mac_ctx->he_sgi_ltf_cfg_bit_mask);
8436
8437 return 0;
8438}
8439
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008440#define HT20_SHORT_GI_MCS7_RATE 722
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05308441/*
8442 * sme_send_rate_update_ind() -
8443 * API to Update rate
8444 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08008445 * mac_handle - The handle returned by mac_open
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05308446 * rateUpdateParams - Pointer to rate update params
8447 * Return QDF_STATUS
8448 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08008449QDF_STATUS sme_send_rate_update_ind(mac_handle_t mac_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008450 tSirRateUpdateInd *rateUpdateParams)
8451{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08008452 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308453 QDF_STATUS status;
Rajeev Kumar37d478b2017-04-17 16:59:28 -07008454 struct scheduler_msg msg = {0};
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308455 tSirRateUpdateInd *rate_upd = qdf_mem_malloc(sizeof(tSirRateUpdateInd));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008456
Arif Hussain0ef77082018-10-10 16:42:53 -07008457 if (!rate_upd)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308458 return QDF_STATUS_E_FAILURE;
Arif Hussain0ef77082018-10-10 16:42:53 -07008459
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008460 *rate_upd = *rateUpdateParams;
8461
8462 if (rate_upd->mcastDataRate24GHz == HT20_SHORT_GI_MCS7_RATE)
8463 rate_upd->mcastDataRate24GHzTxFlag =
Naveen Rawatea1564b2018-05-17 15:56:11 -07008464 TX_RATE_HT20 | TX_RATE_SGI;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008465 else if (rate_upd->reliableMcastDataRate ==
8466 HT20_SHORT_GI_MCS7_RATE)
8467 rate_upd->reliableMcastDataRateTxFlag =
Naveen Rawatea1564b2018-05-17 15:56:11 -07008468 TX_RATE_HT20 | TX_RATE_SGI;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008469
Jeff Johnson01f2c232018-11-21 19:17:44 -08008470 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308471 if (QDF_STATUS_SUCCESS == status) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008472 msg.type = WMA_RATE_UPDATE_IND;
8473 msg.bodyptr = rate_upd;
Sreelakshmi Konamki6a065362016-05-31 16:05:01 +05308474 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
8475 NO_SESSION, msg.type));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308476 if (!QDF_IS_STATUS_SUCCESS
gaurank kathpalia36b0c582018-08-28 17:45:43 +05308477 (scheduler_post_message(QDF_MODULE_ID_SME,
8478 QDF_MODULE_ID_WMA,
8479 QDF_MODULE_ID_WMA,
8480 &msg))) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308481 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Rachit Kankaneee1735c2018-08-02 13:19:34 +05308482 "%s: Not able to post WMA_RATE_UPDATE_IND to WMA!",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008483 __func__);
8484
Jeff Johnson01f2c232018-11-21 19:17:44 -08008485 sme_release_global_lock(&mac->sme);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308486 qdf_mem_free(rate_upd);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308487 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008488 }
8489
Jeff Johnson01f2c232018-11-21 19:17:44 -08008490 sme_release_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308491 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008492 }
8493
8494 return status;
8495}
8496
8497/**
Kondabattini, Ganeshe4f18e02016-09-13 13:01:22 +05308498 * sme_update_access_policy_vendor_ie() - update vendor ie and access policy.
Jeff Johnsonc7309062018-11-09 20:59:42 -08008499 * @mac_handle: Pointer to the mac context
Kondabattini, Ganeshe4f18e02016-09-13 13:01:22 +05308500 * @session_id: sme session id
8501 * @vendor_ie: vendor ie
8502 * @access_policy: vendor ie access policy
8503 *
8504 * This function updates the vendor ie and access policy to lim.
8505 *
8506 * Return: success or failure.
8507 */
Jeff Johnsonc7309062018-11-09 20:59:42 -08008508QDF_STATUS sme_update_access_policy_vendor_ie(mac_handle_t mac_handle,
8509 uint8_t session_id,
8510 uint8_t *vendor_ie,
8511 int access_policy)
Kondabattini, Ganeshe4f18e02016-09-13 13:01:22 +05308512{
8513 struct sme_update_access_policy_vendor_ie *msg;
8514 uint16_t msg_len;
8515 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Kondabattini, Ganeshe4f18e02016-09-13 13:01:22 +05308516
8517 msg_len = sizeof(*msg);
8518
8519 msg = qdf_mem_malloc(msg_len);
8520 if (!msg) {
Srinivas Girigowda09625b02018-09-10 15:28:09 -07008521 return QDF_STATUS_E_NOMEM;
Kondabattini, Ganeshe4f18e02016-09-13 13:01:22 +05308522 }
8523
Kondabattini, Ganeshe4f18e02016-09-13 13:01:22 +05308524 msg->msg_type = (uint16_t)eWNI_SME_UPDATE_ACCESS_POLICY_VENDOR_IE;
8525 msg->length = (uint16_t)msg_len;
8526
8527 qdf_mem_copy(&msg->ie[0], vendor_ie, sizeof(msg->ie));
8528
8529 msg->sme_session_id = session_id;
8530 msg->access_policy = access_policy;
8531
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07008532 sme_debug("sme_session_id: %hu, access_policy: %d", session_id,
8533 access_policy);
Kondabattini, Ganeshe4f18e02016-09-13 13:01:22 +05308534
Rajeev Kumard138ac52017-01-30 18:38:37 -08008535 status = umac_send_mb_message_to_mac(msg);
Kondabattini, Ganeshe4f18e02016-09-13 13:01:22 +05308536
8537 return status;
8538}
8539
8540/**
Agrawal, Ashish4e5fa1c2016-09-21 19:03:43 +05308541 * sme_update_sta_inactivity_timeout(): Update sta_inactivity_timeout to FW
Jeff Johnsonc7309062018-11-09 20:59:42 -08008542 * @mac_handle: Handle returned by mac_open
Agrawal, Ashish4e5fa1c2016-09-21 19:03:43 +05308543 * @session_id: Session ID on which sta_inactivity_timeout needs
8544 * to be updated to FW
8545 * @sta_inactivity_timeout: sta inactivity timeout.
8546 *
8547 * If a station does not send anything in sta_inactivity_timeout seconds, an
8548 * empty data frame is sent to it in order to verify whether it is
8549 * still in range. If this frame is not ACKed, the station will be
8550 * disassociated and then deauthenticated.
8551 *
8552 * Return: QDF_STATUS_SUCCESS or non-zero on failure.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05308553 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08008554QDF_STATUS sme_update_sta_inactivity_timeout(mac_handle_t mac_handle,
Agrawal, Ashish4e5fa1c2016-09-21 19:03:43 +05308555 struct sme_sta_inactivity_timeout *sta_inactivity_timer)
8556{
8557 struct sme_sta_inactivity_timeout *inactivity_time;
8558 void *wma_handle;
8559
8560 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
8561 inactivity_time = qdf_mem_malloc(sizeof(*inactivity_time));
Arif Hussain0ef77082018-10-10 16:42:53 -07008562 if (!inactivity_time)
Agrawal, Ashish4e5fa1c2016-09-21 19:03:43 +05308563 return QDF_STATUS_E_FAILURE;
Arif Hussain0ef77082018-10-10 16:42:53 -07008564
Abhishek Singhe4a1f882017-08-10 17:59:44 +05308565 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Agrawal, Ashish4e5fa1c2016-09-21 19:03:43 +05308566 FL("sta_inactivity_timeout: %d"),
8567 sta_inactivity_timer->sta_inactivity_timeout);
8568 inactivity_time->session_id = sta_inactivity_timer->session_id;
8569 inactivity_time->sta_inactivity_timeout =
8570 sta_inactivity_timer->sta_inactivity_timeout;
8571
8572 wma_update_sta_inactivity_timeout(wma_handle,
8573 inactivity_time);
8574 return QDF_STATUS_SUCCESS;
8575}
8576
8577/**
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008578 * sme_get_reg_info() - To get registration info
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -08008579 * @mac_handle: Opaque handle to the global MAC context
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008580 * @chanId: channel id
8581 * @regInfo1: first reg info to fill
8582 * @regInfo2: second reg info to fill
8583 *
8584 * This routine will give you reg info
8585 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308586 * Return: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008587 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08008588QDF_STATUS sme_get_reg_info(mac_handle_t mac_handle, uint8_t chanId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008589 uint32_t *regInfo1, uint32_t *regInfo2)
8590{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08008591 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308592 QDF_STATUS status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008593 uint8_t i;
8594 bool found = false;
8595
Jeff Johnson01f2c232018-11-21 19:17:44 -08008596 status = sme_acquire_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008597 *regInfo1 = 0;
8598 *regInfo2 = 0;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308599 if (!QDF_IS_STATUS_SUCCESS(status))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008600 return status;
8601
Wu Gao0821b0d2019-01-11 17:31:11 +08008602 for (i = 0; i < CFG_VALID_CHANNEL_LIST_LEN; i++) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08008603 if (mac->scan.defaultPowerTable[i].chan_num == chanId) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008604 SME_SET_CHANNEL_REG_POWER(*regInfo1,
Jeff Johnson01f2c232018-11-21 19:17:44 -08008605 mac->scan.defaultPowerTable[i].tx_power);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008606
8607 SME_SET_CHANNEL_MAX_TX_POWER(*regInfo2,
Jeff Johnson01f2c232018-11-21 19:17:44 -08008608 mac->scan.defaultPowerTable[i].tx_power);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008609 found = true;
8610 break;
8611 }
8612 }
8613 if (!found)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308614 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008615
Jeff Johnson01f2c232018-11-21 19:17:44 -08008616 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008617 return status;
8618}
8619
8620#ifdef FEATURE_WLAN_AUTO_SHUTDOWN
Jeff Johnsonb460dd72018-11-08 10:26:51 -08008621QDF_STATUS sme_set_auto_shutdown_cb(mac_handle_t mac_handle,
Jeff Johnsoneb7bbed2019-02-17 10:34:24 -08008622 void (*callback_fn)(void))
Jeff Johnsonb460dd72018-11-08 10:26:51 -08008623{
Jeff Johnsoneb7bbed2019-02-17 10:34:24 -08008624 QDF_STATUS status;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08008625 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008626
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308627 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008628 "%s: Plug in Auto shutdown event callback", __func__);
8629
Jeff Johnson01f2c232018-11-21 19:17:44 -08008630 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308631 if (QDF_STATUS_SUCCESS == status) {
Jeff Johnson038efe72019-03-18 13:39:31 -07008632 if (callback_fn)
Jeff Johnsoneb7bbed2019-02-17 10:34:24 -08008633 mac->sme.auto_shutdown_cb = callback_fn;
Jeff Johnson01f2c232018-11-21 19:17:44 -08008634 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008635 }
8636
8637 return status;
8638}
8639
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05308640/*
8641 * sme_set_auto_shutdown_timer() -
8642 * API to set auto shutdown timer value in FW.
8643 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08008644 * mac_handle - The handle returned by mac_open
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05308645 * timer_val - The auto shutdown timer value to be set
8646 * Return Configuration message posting status, SUCCESS or Fail
8647 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08008648QDF_STATUS sme_set_auto_shutdown_timer(mac_handle_t mac_handle,
8649 uint32_t timer_val)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008650{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308651 QDF_STATUS status = QDF_STATUS_SUCCESS;
8652 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08008653 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Jeff Johnsona9ade7d2019-02-17 10:08:17 -08008654 struct auto_shutdown_cmd *auto_sh_cmd;
Rajeev Kumar37d478b2017-04-17 16:59:28 -07008655 struct scheduler_msg message = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008656
Jeff Johnson01f2c232018-11-21 19:17:44 -08008657 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308658 if (QDF_STATUS_SUCCESS == status) {
Jeff Johnsona9ade7d2019-02-17 10:08:17 -08008659 auto_sh_cmd = qdf_mem_malloc(sizeof(*auto_sh_cmd));
Arif Hussain0ef77082018-10-10 16:42:53 -07008660 if (!auto_sh_cmd) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08008661 sme_release_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308662 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008663 }
8664
8665 auto_sh_cmd->timer_val = timer_val;
8666
8667 /* serialize the req through MC thread */
Rajeev Kumar8eaedf62017-01-21 11:03:13 -08008668 message.bodyptr = auto_sh_cmd;
8669 message.type = WMA_SET_AUTO_SHUTDOWN_TIMER_REQ;
gaurank kathpalia36b0c582018-08-28 17:45:43 +05308670 qdf_status = scheduler_post_message(QDF_MODULE_ID_SME,
8671 QDF_MODULE_ID_WMA,
8672 QDF_MODULE_ID_WMA,
8673 &message);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308674 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308675 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008676 "%s: Post Auto shutdown MSG fail", __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308677 qdf_mem_free(auto_sh_cmd);
Jeff Johnson01f2c232018-11-21 19:17:44 -08008678 sme_release_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308679 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008680 }
Abhishek Singhe4a1f882017-08-10 17:59:44 +05308681 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008682 "%s: Posted Auto shutdown MSG", __func__);
Jeff Johnson01f2c232018-11-21 19:17:44 -08008683 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008684 }
8685
8686 return status;
8687}
8688#endif
8689
Nirav Shaheb017be2018-02-15 11:20:58 +05308690#ifdef FEATURE_WLAN_CH_AVOID
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05308691/*
8692 * sme_ch_avoid_update_req() -
8693 * API to request channel avoidance update from FW.
8694 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08008695 * mac_handle - The handle returned by mac_open
Jeff Johnsonc5927de2018-05-11 09:12:53 -07008696 * update_type - The update_type parameter of this request call
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05308697 * Return Configuration message posting status, SUCCESS or Fail
8698 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08008699QDF_STATUS sme_ch_avoid_update_req(mac_handle_t mac_handle)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008700{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308701 QDF_STATUS status = QDF_STATUS_SUCCESS;
8702 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08008703 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008704 tSirChAvoidUpdateReq *cauReq;
Rajeev Kumar37d478b2017-04-17 16:59:28 -07008705 struct scheduler_msg message = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008706
Jeff Johnson01f2c232018-11-21 19:17:44 -08008707 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308708 if (QDF_STATUS_SUCCESS == status) {
Arif Hussain0ef77082018-10-10 16:42:53 -07008709 cauReq = qdf_mem_malloc(sizeof(tSirChAvoidUpdateReq));
8710 if (!cauReq) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08008711 sme_release_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308712 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008713 }
8714
8715 cauReq->reserved_param = 0;
8716
8717 /* serialize the req through MC thread */
Rajeev Kumar8eaedf62017-01-21 11:03:13 -08008718 message.bodyptr = cauReq;
8719 message.type = WMA_CH_AVOID_UPDATE_REQ;
gaurank kathpalia36b0c582018-08-28 17:45:43 +05308720 qdf_status = scheduler_post_message(QDF_MODULE_ID_SME,
8721 QDF_MODULE_ID_WMA,
8722 QDF_MODULE_ID_WMA,
8723 &message);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308724 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308725 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008726 "%s: Post Ch Avoid Update MSG fail",
8727 __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308728 qdf_mem_free(cauReq);
Jeff Johnson01f2c232018-11-21 19:17:44 -08008729 sme_release_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308730 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008731 }
Abhishek Singhe4a1f882017-08-10 17:59:44 +05308732 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008733 "%s: Posted Ch Avoid Update MSG", __func__);
Jeff Johnson01f2c232018-11-21 19:17:44 -08008734 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008735 }
8736
8737 return status;
8738}
Nirav Shaheb017be2018-02-15 11:20:58 +05308739#endif
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008740
8741/**
8742 * sme_set_miracast() - Function to set miracast value to UMAC
Jeff Johnsonc7309062018-11-09 20:59:42 -08008743 * @mac_handle: Handle returned by macOpen
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008744 * @filter_type: 0-Disabled, 1-Source, 2-sink
8745 *
8746 * This function passes down the value of miracast set by
8747 * framework to UMAC
8748 *
8749 * Return: Configuration message posting status, SUCCESS or Fail
8750 *
8751 */
Jeff Johnsonc7309062018-11-09 20:59:42 -08008752QDF_STATUS sme_set_miracast(mac_handle_t mac_handle, uint8_t filter_type)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008753{
Rajeev Kumar37d478b2017-04-17 16:59:28 -07008754 struct scheduler_msg msg = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008755 uint32_t *val;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08008756 struct mac_context *mac_ptr = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008757
Arif Hussain0ef77082018-10-10 16:42:53 -07008758 if (!mac_ptr) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308759 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008760 "%s: Invalid pointer", __func__);
Arif Hussain0ef77082018-10-10 16:42:53 -07008761 return QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008762 }
8763
Arif Hussain0ef77082018-10-10 16:42:53 -07008764 val = qdf_mem_malloc(sizeof(*val));
8765 if (!val)
8766 return QDF_STATUS_E_NOMEM;
8767
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008768 *val = filter_type;
8769
8770 msg.type = SIR_HAL_SET_MIRACAST;
8771 msg.reserved = 0;
8772 msg.bodyptr = val;
8773
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308774 if (!QDF_IS_STATUS_SUCCESS(
gaurank kathpalia36b0c582018-08-28 17:45:43 +05308775 scheduler_post_message(QDF_MODULE_ID_SME,
8776 QDF_MODULE_ID_WMA,
8777 QDF_MODULE_ID_WMA,
8778 &msg))) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308779 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008780 "%s: Not able to post WDA_SET_MAS_ENABLE_DISABLE to WMA!",
8781 __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308782 qdf_mem_free(val);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308783 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008784 }
8785
8786 mac_ptr->sme.miracast_value = filter_type;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308787 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008788}
8789
8790/**
8791 * sme_set_mas() - Function to set MAS value to UMAC
8792 * @val: 1-Enable, 0-Disable
8793 *
8794 * This function passes down the value of MAS to the UMAC. A
8795 * value of 1 will enable MAS and a value of 0 will disable MAS
8796 *
8797 * Return: Configuration message posting status, SUCCESS or Fail
8798 *
8799 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308800QDF_STATUS sme_set_mas(uint32_t val)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008801{
Rajeev Kumar37d478b2017-04-17 16:59:28 -07008802 struct scheduler_msg msg = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008803 uint32_t *ptr_val;
8804
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308805 ptr_val = qdf_mem_malloc(sizeof(*ptr_val));
Arif Hussain0ef77082018-10-10 16:42:53 -07008806 if (!ptr_val)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308807 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008808
8809 *ptr_val = val;
8810
8811 msg.type = SIR_HAL_SET_MAS;
8812 msg.reserved = 0;
8813 msg.bodyptr = ptr_val;
8814
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308815 if (!QDF_IS_STATUS_SUCCESS(
gaurank kathpalia36b0c582018-08-28 17:45:43 +05308816 scheduler_post_message(QDF_MODULE_ID_SME,
8817 QDF_MODULE_ID_WMA,
8818 QDF_MODULE_ID_WMA,
8819 &msg))) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05308820 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008821 "%s: Not able to post WDA_SET_MAS_ENABLE_DISABLE to WMA!",
8822 __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308823 qdf_mem_free(ptr_val);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308824 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008825 }
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308826 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008827}
8828
Kiran Kumar Lokere999e58c2016-01-07 02:18:39 -08008829/**
8830 * sme_roam_channel_change_req() - Channel change to new target channel
Jeff Johnsonb460dd72018-11-08 10:26:51 -08008831 * @mac_handle: handle returned by mac_open
Kiran Kumar Lokere999e58c2016-01-07 02:18:39 -08008832 * @bssid: mac address of BSS
8833 * @ch_params: target channel information
8834 * @profile: CSR profile
8835 *
8836 * API to Indicate Channel change to new target channel
8837 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308838 * Return: QDF_STATUS
Kiran Kumar Lokere999e58c2016-01-07 02:18:39 -08008839 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08008840QDF_STATUS sme_roam_channel_change_req(mac_handle_t mac_handle,
Amar Singhale4f28ee2015-10-21 14:36:56 -07008841 struct qdf_mac_addr bssid,
Amar Singhal5cccafe2017-02-15 12:42:58 -08008842 struct ch_params *ch_params,
Jeff Johnson66ee8a92018-03-17 15:24:26 -07008843 struct csr_roam_profile *profile)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008844{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308845 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08008846 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008847
Jeff Johnson01f2c232018-11-21 19:17:44 -08008848 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308849 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008850
Jeff Johnson01f2c232018-11-21 19:17:44 -08008851 status = csr_roam_channel_change_req(mac, bssid, ch_params,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008852 profile);
Jeff Johnson01f2c232018-11-21 19:17:44 -08008853 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008854 }
8855 return status;
8856}
8857
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05308858/*
8859 * sme_process_channel_change_resp() -
8860 * API to Indicate Channel change response message to SAP.
8861 *
8862 * Return QDF_STATUS
8863 */
Jeff Johnson0a8786a2018-12-02 10:49:01 -08008864static QDF_STATUS sme_process_channel_change_resp(struct mac_context *mac,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008865 uint16_t msg_type, void *pMsgBuf)
8866{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308867 QDF_STATUS status = QDF_STATUS_SUCCESS;
Min Liu3621ede2018-11-07 18:36:00 +08008868 struct csr_roam_info *roam_info;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008869 eCsrRoamResult roamResult;
8870 tpSwitchChannelParams pChnlParams = (tpSwitchChannelParams) pMsgBuf;
8871 uint32_t SessionId = pChnlParams->peSessionId;
8872
Min Liu3621ede2018-11-07 18:36:00 +08008873 roam_info = qdf_mem_malloc(sizeof(*roam_info));
8874 if (!roam_info)
8875 return QDF_STATUS_E_NOMEM;
8876
8877 roam_info->channelChangeRespEvent =
Anurag Chouhan600c3a02016-03-01 10:33:54 +05308878 qdf_mem_malloc(sizeof(tSirChanChangeResponse));
Min Liu3621ede2018-11-07 18:36:00 +08008879 if (!roam_info->channelChangeRespEvent) {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308880 status = QDF_STATUS_E_NOMEM;
Min Liu3621ede2018-11-07 18:36:00 +08008881 qdf_mem_free(roam_info);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008882 return status;
8883 }
8884 if (msg_type == eWNI_SME_CHANNEL_CHANGE_RSP) {
Min Liu3621ede2018-11-07 18:36:00 +08008885 roam_info->channelChangeRespEvent->sessionId = SessionId;
8886 roam_info->channelChangeRespEvent->newChannelNumber =
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008887 pChnlParams->channelNumber;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008888
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308889 if (pChnlParams->status == QDF_STATUS_SUCCESS) {
Abhishek Singhe4a1f882017-08-10 17:59:44 +05308890 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008891 "sapdfs: Received success eWNI_SME_CHANNEL_CHANGE_RSP for sessionId[%d]",
8892 SessionId);
Min Liu3621ede2018-11-07 18:36:00 +08008893 roam_info->channelChangeRespEvent->channelChangeStatus =
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008894 1;
8895 roamResult = eCSR_ROAM_RESULT_CHANNEL_CHANGE_SUCCESS;
8896 } else {
Abhishek Singhe4a1f882017-08-10 17:59:44 +05308897 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008898 "sapdfs: Received failure eWNI_SME_CHANNEL_CHANGE_RSP for sessionId[%d]",
8899 SessionId);
Min Liu3621ede2018-11-07 18:36:00 +08008900 roam_info->channelChangeRespEvent->channelChangeStatus =
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008901 0;
8902 roamResult = eCSR_ROAM_RESULT_CHANNEL_CHANGE_FAILURE;
8903 }
8904
Min Liu3621ede2018-11-07 18:36:00 +08008905 csr_roam_call_callback(mac, SessionId, roam_info, 0,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008906 eCSR_ROAM_SET_CHANNEL_RSP, roamResult);
8907
8908 } else {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308909 status = QDF_STATUS_E_FAILURE;
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07008910 sme_err("Invalid Channel Change Resp Message: %d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008911 status);
8912 }
Min Liu3621ede2018-11-07 18:36:00 +08008913 qdf_mem_free(roam_info->channelChangeRespEvent);
8914 qdf_mem_free(roam_info);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008915
8916 return status;
8917}
8918
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05308919/*
8920 * sme_roam_start_beacon_req() -
8921 * API to Indicate LIM to start Beacon Tx after SAP CAC Wait is completed.
8922 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08008923 * mac_handle - The handle returned by mac_open
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05308924 * sessionId - session ID
8925 * dfsCacWaitStatus - CAC WAIT status flag
8926 * Return QDF_STATUS
8927 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08008928QDF_STATUS sme_roam_start_beacon_req(mac_handle_t mac_handle,
Jeff Johnson1f2dabc2018-11-07 15:33:01 -08008929 struct qdf_mac_addr bssid,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008930 uint8_t dfsCacWaitStatus)
8931{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308932 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08008933 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05308934
Jeff Johnson01f2c232018-11-21 19:17:44 -08008935 status = sme_acquire_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008936
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308937 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08008938 status = csr_roam_start_beacon_req(mac, bssid,
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05308939 dfsCacWaitStatus);
Jeff Johnson01f2c232018-11-21 19:17:44 -08008940 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008941 }
8942 return status;
8943}
8944
Abhishek Singh20a8e442018-09-12 15:50:44 +05308945#ifdef CONFIG_VDEV_SM
Jeff Johnson0a8786a2018-12-02 10:49:01 -08008946QDF_STATUS sme_csa_restart(struct mac_context *mac_ctx, uint8_t session_id)
Abhishek Singh20a8e442018-09-12 15:50:44 +05308947{
8948 QDF_STATUS status = QDF_STATUS_E_FAILURE;
8949
8950 status = sme_acquire_global_lock(&mac_ctx->sme);
8951 if (QDF_IS_STATUS_SUCCESS(status)) {
8952 status = csr_csa_restart(mac_ctx, session_id);
8953 sme_release_global_lock(&mac_ctx->sme);
8954 }
8955
8956 return status;
8957}
8958#endif
8959
Kiran Kumar Lokere999e58c2016-01-07 02:18:39 -08008960/**
8961 * sme_roam_csa_ie_request() - request CSA IE transmission from PE
Jeff Johnsonb460dd72018-11-08 10:26:51 -08008962 * @mac_handle: handle returned by mac_open
Kiran Kumar Lokere999e58c2016-01-07 02:18:39 -08008963 * @bssid: SAP bssid
8964 * @targetChannel: target channel information
8965 * @csaIeReqd: CSA IE Request
8966 * @ch_params: channel information
8967 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308968 * Return: QDF_STATUS
Kiran Kumar Lokere999e58c2016-01-07 02:18:39 -08008969 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08008970QDF_STATUS sme_roam_csa_ie_request(mac_handle_t mac_handle,
8971 struct qdf_mac_addr bssid,
8972 uint8_t targetChannel, uint8_t csaIeReqd,
8973 struct ch_params *ch_params)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008974{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308975 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08008976 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05308977
Jeff Johnson01f2c232018-11-21 19:17:44 -08008978 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308979 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08008980 status = csr_roam_send_chan_sw_ie_request(mac, bssid,
Kiran Kumar Lokere999e58c2016-01-07 02:18:39 -08008981 targetChannel, csaIeReqd, ch_params);
Jeff Johnson01f2c232018-11-21 19:17:44 -08008982 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008983 }
8984 return status;
8985}
8986
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05308987/*
8988 * sme_init_thermal_info() -
8989 * SME API to initialize the thermal mitigation parameters
8990 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08008991 * mac_handle
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05308992 * thermalParam : thermal mitigation parameters
8993 * Return QDF_STATUS
8994 */
Manikandan Mohan9045e2e2018-11-26 16:44:19 -08008995QDF_STATUS sme_init_thermal_info(mac_handle_t mac_handle)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008996{
8997 t_thermal_mgmt *pWmaParam;
Rajeev Kumar37d478b2017-04-17 16:59:28 -07008998 struct scheduler_msg msg = {0};
Jeff Johnson0a8786a2018-12-02 10:49:01 -08008999 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Manikandan Mohan9045e2e2018-11-26 16:44:19 -08009000 struct wlan_fwol_thermal_temp thermal_temp = {0};
9001 QDF_STATUS status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009002
Arif Hussain0ef77082018-10-10 16:42:53 -07009003 pWmaParam = qdf_mem_malloc(sizeof(t_thermal_mgmt));
9004 if (!pWmaParam)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309005 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009006
Manikandan Mohan9045e2e2018-11-26 16:44:19 -08009007 status = ucfg_fwol_get_thermal_temp(mac->psoc, &thermal_temp);
9008 if (QDF_IS_STATUS_ERROR(status))
9009 return qdf_status_to_os_return(status);
9010
9011 pWmaParam->thermalMgmtEnabled = thermal_temp.thermal_mitigation_enable;
9012 pWmaParam->throttlePeriod = thermal_temp.throttle_period;
Poddar, Siddarth83905022016-04-16 17:56:08 -07009013
9014 pWmaParam->throttle_duty_cycle_tbl[0] =
Manikandan Mohan9045e2e2018-11-26 16:44:19 -08009015 thermal_temp.throttle_dutycycle_level[0];
Poddar, Siddarth83905022016-04-16 17:56:08 -07009016 pWmaParam->throttle_duty_cycle_tbl[1] =
Manikandan Mohan9045e2e2018-11-26 16:44:19 -08009017 thermal_temp.throttle_dutycycle_level[1];
Poddar, Siddarth83905022016-04-16 17:56:08 -07009018 pWmaParam->throttle_duty_cycle_tbl[2] =
Manikandan Mohan9045e2e2018-11-26 16:44:19 -08009019 thermal_temp.throttle_dutycycle_level[2];
Poddar, Siddarth83905022016-04-16 17:56:08 -07009020 pWmaParam->throttle_duty_cycle_tbl[3] =
Manikandan Mohan9045e2e2018-11-26 16:44:19 -08009021 thermal_temp.throttle_dutycycle_level[3];
Poddar, Siddarth83905022016-04-16 17:56:08 -07009022
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009023 pWmaParam->thermalLevels[0].minTempThreshold =
Manikandan Mohan9045e2e2018-11-26 16:44:19 -08009024 thermal_temp.thermal_temp_min_level[0];
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009025 pWmaParam->thermalLevels[0].maxTempThreshold =
Manikandan Mohan9045e2e2018-11-26 16:44:19 -08009026 thermal_temp.thermal_temp_max_level[0];
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009027 pWmaParam->thermalLevels[1].minTempThreshold =
Manikandan Mohan9045e2e2018-11-26 16:44:19 -08009028 thermal_temp.thermal_temp_min_level[1];
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009029 pWmaParam->thermalLevels[1].maxTempThreshold =
Manikandan Mohan9045e2e2018-11-26 16:44:19 -08009030 thermal_temp.thermal_temp_max_level[1];
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009031 pWmaParam->thermalLevels[2].minTempThreshold =
Manikandan Mohan9045e2e2018-11-26 16:44:19 -08009032 thermal_temp.thermal_temp_min_level[2];
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009033 pWmaParam->thermalLevels[2].maxTempThreshold =
Manikandan Mohan9045e2e2018-11-26 16:44:19 -08009034 thermal_temp.thermal_temp_max_level[2];
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009035 pWmaParam->thermalLevels[3].minTempThreshold =
Manikandan Mohan9045e2e2018-11-26 16:44:19 -08009036 thermal_temp.thermal_temp_min_level[3];
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009037 pWmaParam->thermalLevels[3].maxTempThreshold =
Manikandan Mohan9045e2e2018-11-26 16:44:19 -08009038 thermal_temp.thermal_temp_max_level[3];
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009039
Jeff Johnson01f2c232018-11-21 19:17:44 -08009040 if (QDF_STATUS_SUCCESS == sme_acquire_global_lock(&mac->sme)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009041 msg.type = WMA_INIT_THERMAL_INFO_CMD;
9042 msg.bodyptr = pWmaParam;
9043
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309044 if (!QDF_IS_STATUS_SUCCESS
gaurank kathpalia36b0c582018-08-28 17:45:43 +05309045 (scheduler_post_message(QDF_MODULE_ID_SME,
9046 QDF_MODULE_ID_WMA,
9047 QDF_MODULE_ID_WMA,
9048 &msg))) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05309049 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009050 "%s: Not able to post WMA_SET_THERMAL_INFO_CMD to WMA!",
9051 __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05309052 qdf_mem_free(pWmaParam);
Jeff Johnson01f2c232018-11-21 19:17:44 -08009053 sme_release_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309054 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009055 }
Jeff Johnson01f2c232018-11-21 19:17:44 -08009056 sme_release_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309057 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009058 }
Anurag Chouhan600c3a02016-03-01 10:33:54 +05309059 qdf_mem_free(pWmaParam);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309060 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009061}
9062
9063/**
9064 * sme_add_set_thermal_level_callback() - Plug in set thermal level callback
Jeff Johnsonc7309062018-11-09 20:59:42 -08009065 * @mac_handle: Handle returned by macOpen
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009066 * @callback: sme_set_thermal_level_callback
9067 *
9068 * Plug in set thermal level callback
9069 *
9070 * Return: none
9071 */
Jeff Johnsonc7309062018-11-09 20:59:42 -08009072void sme_add_set_thermal_level_callback(mac_handle_t mac_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009073 sme_set_thermal_level_callback callback)
9074{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08009075 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009076
Jeff Johnson01f2c232018-11-21 19:17:44 -08009077 mac->sme.set_thermal_level_cb = callback;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009078}
9079
9080/**
9081 * sme_set_thermal_level() - SME API to set the thermal mitigation level
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -08009082 * @mac_handle: Opaque handle to the global MAC context
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009083 * @level: Thermal mitigation level
9084 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309085 * Return: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009086 */
Jeff Johnsonc7309062018-11-09 20:59:42 -08009087QDF_STATUS sme_set_thermal_level(mac_handle_t mac_handle, uint8_t level)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009088{
Rajeev Kumar37d478b2017-04-17 16:59:28 -07009089 struct scheduler_msg msg = {0};
Jeff Johnson0a8786a2018-12-02 10:49:01 -08009090 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309091 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009092
Jeff Johnson01f2c232018-11-21 19:17:44 -08009093 if (QDF_STATUS_SUCCESS == sme_acquire_global_lock(&mac->sme)) {
hangtian127c9532019-01-12 13:29:07 +08009094 qdf_mem_zero(&msg, sizeof(msg));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009095 msg.type = WMA_SET_THERMAL_LEVEL;
9096 msg.bodyval = level;
9097
gaurank kathpalia36b0c582018-08-28 17:45:43 +05309098 qdf_status = scheduler_post_message(QDF_MODULE_ID_SME,
9099 QDF_MODULE_ID_WMA,
9100 QDF_MODULE_ID_WMA, &msg);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309101 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05309102 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009103 "%s: Not able to post WMA_SET_THERMAL_LEVEL to WMA!",
9104 __func__);
Jeff Johnson01f2c232018-11-21 19:17:44 -08009105 sme_release_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309106 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009107 }
Jeff Johnson01f2c232018-11-21 19:17:44 -08009108 sme_release_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309109 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009110 }
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309111 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009112}
9113
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05309114/*
9115 * sme_txpower_limit() -
9116 * SME API to set txpower limits
9117 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08009118 * mac_handle
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05309119 * psmetx : power limits for 2g/5g
9120 * Return QDF_STATUS
9121 */
Jeff Johnson19ce8d02019-02-08 22:56:23 -08009122QDF_STATUS sme_txpower_limit(mac_handle_t mac_handle,
9123 struct tx_power_limit *psmetx)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009124{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309125 QDF_STATUS status = QDF_STATUS_SUCCESS;
9126 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Rajeev Kumar37d478b2017-04-17 16:59:28 -07009127 struct scheduler_msg message = {0};
Jeff Johnson0a8786a2018-12-02 10:49:01 -08009128 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Jeff Johnson19ce8d02019-02-08 22:56:23 -08009129 struct tx_power_limit *tx_power_limit;
Prashanth Bhatta75fa9a12016-01-11 18:30:08 -08009130
Anurag Chouhan600c3a02016-03-01 10:33:54 +05309131 tx_power_limit = qdf_mem_malloc(sizeof(*tx_power_limit));
Arif Hussain0ef77082018-10-10 16:42:53 -07009132 if (!tx_power_limit)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309133 return QDF_STATUS_E_FAILURE;
Prashanth Bhatta75fa9a12016-01-11 18:30:08 -08009134
9135 *tx_power_limit = *psmetx;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009136
Jeff Johnson01f2c232018-11-21 19:17:44 -08009137 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309138 if (QDF_IS_STATUS_SUCCESS(status)) {
Rajeev Kumar8eaedf62017-01-21 11:03:13 -08009139 message.type = WMA_TX_POWER_LIMIT;
9140 message.reserved = 0;
9141 message.bodyptr = tx_power_limit;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009142
gaurank kathpalia36b0c582018-08-28 17:45:43 +05309143 qdf_status = scheduler_post_message(QDF_MODULE_ID_SME,
9144 QDF_MODULE_ID_WMA,
9145 QDF_MODULE_ID_WMA,
9146 &message);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309147 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05309148 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009149 "%s: not able to post WMA_TX_POWER_LIMIT",
9150 __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309151 status = QDF_STATUS_E_FAILURE;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05309152 qdf_mem_free(tx_power_limit);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009153 }
Jeff Johnson01f2c232018-11-21 19:17:44 -08009154 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009155 }
9156 return status;
9157}
9158
Jeff Johnsonb460dd72018-11-08 10:26:51 -08009159QDF_STATUS sme_update_connect_debug(mac_handle_t mac_handle, uint32_t set_value)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009160{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309161 QDF_STATUS status = QDF_STATUS_SUCCESS;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08009162 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05309163
Jeff Johnson01f2c232018-11-21 19:17:44 -08009164 mac->mlme_cfg->gen.debug_packet_log = set_value;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009165 return status;
9166}
9167
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05309168/*
9169 * sme_ap_disable_intra_bss_fwd() -
9170 * SME will send message to WMA to set Intra BSS in txrx
9171 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08009172 * mac_handle - The handle returned by mac_open
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05309173 * sessionId - session id ( vdev id)
9174 * disablefwd - bool value that indicate disable intrabss fwd disable
9175 * Return QDF_STATUS
9176 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08009177QDF_STATUS sme_ap_disable_intra_bss_fwd(mac_handle_t mac_handle,
9178 uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009179 bool disablefwd)
9180{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08009181 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309182 int status = QDF_STATUS_SUCCESS;
9183 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Rajeev Kumar37d478b2017-04-17 16:59:28 -07009184 struct scheduler_msg message = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009185 tpDisableIntraBssFwd pSapDisableIntraFwd = NULL;
9186
9187 /* Prepare the request to send to SME. */
Anurag Chouhan600c3a02016-03-01 10:33:54 +05309188 pSapDisableIntraFwd = qdf_mem_malloc(sizeof(tDisableIntraBssFwd));
Jeff Johnson038efe72019-03-18 13:39:31 -07009189 if (!pSapDisableIntraFwd) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07009190 sme_err("Memory Allocation Failure!!!");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309191 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009192 }
9193
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009194 pSapDisableIntraFwd->sessionId = sessionId;
9195 pSapDisableIntraFwd->disableintrabssfwd = disablefwd;
9196
Jeff Johnson01f2c232018-11-21 19:17:44 -08009197 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309198 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009199 /* serialize the req through MC thread */
Rajeev Kumar8eaedf62017-01-21 11:03:13 -08009200 message.bodyptr = pSapDisableIntraFwd;
9201 message.type = WMA_SET_SAP_INTRABSS_DIS;
gaurank kathpalia36b0c582018-08-28 17:45:43 +05309202 qdf_status = scheduler_post_message(QDF_MODULE_ID_SME,
9203 QDF_MODULE_ID_WMA,
9204 QDF_MODULE_ID_WMA,
9205 &message);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309206 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
9207 status = QDF_STATUS_E_FAILURE;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05309208 qdf_mem_free(pSapDisableIntraFwd);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009209 }
Jeff Johnson01f2c232018-11-21 19:17:44 -08009210 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009211 }
9212 return status;
9213}
9214
9215#ifdef WLAN_FEATURE_STATS_EXT
9216
Jeff Johnson45843652018-07-04 12:47:34 -07009217void sme_stats_ext_register_callback(mac_handle_t mac_handle,
9218 stats_ext_cb callback)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009219{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08009220 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009221
Jeff Johnson45843652018-07-04 12:47:34 -07009222 if (!mac) {
9223 sme_err("Invalid mac context");
Arun Khandavalli4b55da72016-07-19 19:55:01 +05309224 return;
9225 }
9226
Jeff Johnson45843652018-07-04 12:47:34 -07009227 mac->sme.stats_ext_cb = callback;
Arun Khandavalli4b55da72016-07-19 19:55:01 +05309228}
9229
Jeff Johnson45843652018-07-04 12:47:34 -07009230void sme_stats_ext_deregister_callback(mac_handle_t mac_handle)
9231{
9232 sme_stats_ext_register_callback(mac_handle, NULL);
9233}
9234
9235void sme_stats_ext2_register_callback(mac_handle_t mac_handle,
9236 stats_ext2_cb callback)
9237{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08009238 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Jeff Johnson45843652018-07-04 12:47:34 -07009239
9240 if (!mac) {
9241 sme_err("Invalid mac context");
9242 return;
9243 }
9244
9245 mac->sme.stats_ext2_cb = callback;
9246}
Arun Khandavalli4b55da72016-07-19 19:55:01 +05309247
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05309248/*
9249 * sme_stats_ext_request() -
9250 * Function called when HDD receives STATS EXT vendor command from userspace
9251 *
9252 * sessionID - vdevID for the stats ext request
9253 * input - Stats Ext Request structure ptr
9254 * Return QDF_STATUS
9255 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309256QDF_STATUS sme_stats_ext_request(uint8_t session_id, tpStatsExtRequestReq input)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009257{
Rajeev Kumar37d478b2017-04-17 16:59:28 -07009258 struct scheduler_msg msg = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009259 tpStatsExtRequest data;
9260 size_t data_len;
9261
9262 data_len = sizeof(tStatsExtRequest) + input->request_data_len;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05309263 data = qdf_mem_malloc(data_len);
Arif Hussain0ef77082018-10-10 16:42:53 -07009264 if (!data)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309265 return QDF_STATUS_E_NOMEM;
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05309266
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009267 data->vdev_id = session_id;
9268 data->request_data_len = input->request_data_len;
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05309269 if (input->request_data_len)
Anurag Chouhan600c3a02016-03-01 10:33:54 +05309270 qdf_mem_copy(data->request_data,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009271 input->request_data, input->request_data_len);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009272
9273 msg.type = WMA_STATS_EXT_REQUEST;
9274 msg.reserved = 0;
9275 msg.bodyptr = data;
9276
gaurank kathpalia36b0c582018-08-28 17:45:43 +05309277 if (QDF_STATUS_SUCCESS != scheduler_post_message(QDF_MODULE_ID_SME,
9278 QDF_MODULE_ID_WMA,
9279 QDF_MODULE_ID_WMA,
9280 &msg)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05309281 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009282 "%s: Not able to post WMA_STATS_EXT_REQUEST message to WMA",
9283 __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05309284 qdf_mem_free(data);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309285 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009286 }
9287
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309288 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009289}
9290
Jeff Johnsonfdecd512018-06-10 09:18:32 -07009291/**
9292 * sme_stats_ext_event() - eWNI_SME_STATS_EXT_EVENT processor
9293 * @mac: Global MAC context
9294 * @msg: "stats ext" message
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009295
Jeff Johnsonfdecd512018-06-10 09:18:32 -07009296 * This callback function called when SME received eWNI_SME_STATS_EXT_EVENT
9297 * response from WMA
9298 *
9299 * Return: QDF_STATUS
9300 */
Jeff Johnson0a8786a2018-12-02 10:49:01 -08009301static QDF_STATUS sme_stats_ext_event(struct mac_context *mac,
Jeff Johnson45843652018-07-04 12:47:34 -07009302 struct stats_ext_event *msg)
Jeff Johnsonfdecd512018-06-10 09:18:32 -07009303{
9304 if (!msg) {
9305 sme_err("Null msg");
9306 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009307 }
9308
Jeff Johnson45843652018-07-04 12:47:34 -07009309 if (mac->sme.stats_ext_cb)
9310 mac->sme.stats_ext_cb(mac->hdd_handle, msg);
Jeff Johnsonfdecd512018-06-10 09:18:32 -07009311
9312 return QDF_STATUS_SUCCESS;
9313}
9314
9315#else
9316
Jeff Johnson0a8786a2018-12-02 10:49:01 -08009317static QDF_STATUS sme_stats_ext_event(struct mac_context *mac,
Jeff Johnson45843652018-07-04 12:47:34 -07009318 struct stats_ext_event *msg)
Jeff Johnsonfdecd512018-06-10 09:18:32 -07009319{
9320 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009321}
9322
9323#endif
9324
Qun Zhangef655622019-02-25 10:48:10 +08009325#ifdef FEATURE_FW_STATE
9326QDF_STATUS sme_get_fw_state(mac_handle_t mac_handle,
9327 fw_state_callback callback,
9328 void *context)
9329{
9330 QDF_STATUS status;
9331 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
9332 tp_wma_handle wma_handle;
9333
9334 SME_ENTER();
9335
9336 mac_ctx->sme.fw_state_cb = callback;
9337 mac_ctx->sme.fw_state_context = context;
9338 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
9339 status = wma_get_fw_state(wma_handle);
9340
9341 SME_EXIT();
9342 return status;
9343}
9344
9345/**
9346 * sme_fw_state_resp() - eWNI_SME_FW_STATUS_IND processor
9347 * @mac: Global MAC context
9348
9349 * This callback function called when SME received eWNI_SME_FW_STATUS_IND
9350 * response from WMA
9351 *
9352 * Return: QDF_STATUS
9353 */
9354static QDF_STATUS sme_fw_state_resp(struct mac_context *mac)
9355{
9356 if (mac->sme.fw_state_cb)
9357 mac->sme.fw_state_cb(mac->sme.fw_state_context);
9358 mac->sme.fw_state_cb = NULL;
9359 mac->sme.fw_state_context = NULL;
9360
9361 return QDF_STATUS_SUCCESS;
9362}
9363
9364#else /* FEATURE_FW_STATE */
9365static QDF_STATUS sme_fw_state_resp(struct mac_context *mac)
9366{
9367 return QDF_STATUS_SUCCESS;
9368}
9369
9370#endif /* FEATURE_FW_STATE */
9371
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05309372/*
9373 * sme_update_dfs_scan_mode() -
9374 * Update DFS roam scan mode
9375 * This function is called through dynamic setConfig callback function
9376 * to configure allowDFSChannelRoam.
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -08009377 * mac_handle: Opaque handle to the global MAC context
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05309378 * sessionId - Session Identifier
9379 * allowDFSChannelRoam - DFS roaming scan mode 0 (disable),
9380 * 1 (passive), 2 (active)
9381 * Return QDF_STATUS_SUCCESS - SME update DFS roaming scan config
9382 * successfully.
9383 * Other status means SME failed to update DFS roaming scan config.
9384 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08009385QDF_STATUS sme_update_dfs_scan_mode(mac_handle_t mac_handle, uint8_t sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009386 uint8_t allowDFSChannelRoam)
9387{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08009388 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309389 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009390
Dustin Brownad06be62019-02-04 14:52:56 -08009391 if (sessionId >= WLAN_MAX_VDEVS) {
Naveen Rawatc36f7eb2016-11-10 20:01:03 -08009392 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
9393 FL("Invalid sme session id: %d"), sessionId);
9394 return QDF_STATUS_E_INVAL;
9395 }
9396
Jeff Johnson01f2c232018-11-21 19:17:44 -08009397 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309398 if (QDF_IS_STATUS_SUCCESS(status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05309399 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05309400 "LFR runtime successfully set AllowDFSChannelRoam Mode to %d - old value is %d - roam state is %s",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009401 allowDFSChannelRoam,
Wu Gao51a63562018-11-08 16:29:10 +08009402 mac->mlme_cfg->lfr.roaming_dfs_channel,
Jeff Johnson01f2c232018-11-21 19:17:44 -08009403 mac_trace_get_neighbour_roam_state(mac->roam.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009404 neighborRoamInfo
9405 [sessionId].
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05309406 neighborRoamState));
Wu Gao51a63562018-11-08 16:29:10 +08009407 mac->mlme_cfg->lfr.roaming_dfs_channel =
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009408 allowDFSChannelRoam;
Wu Gao51a63562018-11-08 16:29:10 +08009409 if (mac->mlme_cfg->lfr.roam_scan_offload_enabled) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08009410 csr_roam_offload_scan(mac, sessionId,
Vignesh Viswanathan4e65e8e2018-05-01 12:04:16 +05309411 ROAM_SCAN_OFFLOAD_UPDATE_CFG,
9412 REASON_ROAM_DFS_SCAN_MODE_CHANGED);
9413 }
Jeff Johnson01f2c232018-11-21 19:17:44 -08009414 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009415 }
Vignesh Viswanathan4e65e8e2018-05-01 12:04:16 +05309416
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009417
9418 return status;
9419}
9420
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05309421/*
9422 * sme_get_dfs_scan_mode() - get DFS roam scan mode
9423 * This is a synchronous call
9424 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08009425 * mac_handle - The handle returned by mac_open.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05309426 * Return DFS roaming scan mode 0 (disable), 1 (passive), 2 (active)
9427 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08009428uint8_t sme_get_dfs_scan_mode(mac_handle_t mac_handle)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009429{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08009430 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05309431
Wu Gao51a63562018-11-08 16:29:10 +08009432 return mac->mlme_cfg->lfr.roaming_dfs_channel;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009433}
9434
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05309435/*
9436 * sme_modify_add_ie() -
9437 * This function sends msg to updates the additional IE buffers in PE
9438 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08009439 * mac_handle - global structure
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05309440 * pModifyIE - pointer to tModifyIE structure
9441 * updateType - type of buffer
9442 * Return Success or failure
9443 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08009444QDF_STATUS sme_modify_add_ie(mac_handle_t mac_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009445 tSirModifyIE *pModifyIE, eUpdateIEsType updateType)
9446{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309447 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08009448 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05309449
Jeff Johnson01f2c232018-11-21 19:17:44 -08009450 status = sme_acquire_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009451
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309452 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08009453 status = csr_roam_modify_add_ies(mac, pModifyIE, updateType);
9454 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009455 }
9456 return status;
9457}
9458
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05309459/*
9460 * sme_update_add_ie() -
9461 * This function sends msg to updates the additional IE buffers in PE
9462 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08009463 * mac_handle - global structure
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05309464 * pUpdateIE - pointer to structure tUpdateIE
9465 * updateType - type of buffer
9466 * Return Success or failure
9467 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08009468QDF_STATUS sme_update_add_ie(mac_handle_t mac_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009469 tSirUpdateIE *pUpdateIE, eUpdateIEsType updateType)
9470{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309471 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08009472 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05309473
Jeff Johnson01f2c232018-11-21 19:17:44 -08009474 status = sme_acquire_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009475
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309476 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08009477 status = csr_roam_update_add_ies(mac, pUpdateIE, updateType);
9478 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009479 }
9480 return status;
9481}
9482
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009483/**
9484 * sme_update_dsc_pto_up_mapping()
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -08009485 * @mac_handle: Opaque handle to the global MAC context
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009486 * @dscpmapping: pointer to DSCP mapping structure
9487 * @sessionId: SME session id
9488 *
9489 * This routine is called to update dscp mapping
9490 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309491 * Return: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009492 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08009493QDF_STATUS sme_update_dsc_pto_up_mapping(mac_handle_t mac_handle,
Abhishek Singh12be60f2017-08-11 13:52:42 +05309494 enum sme_qos_wmmuptype *dscpmapping,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009495 uint8_t sessionId)
9496{
Jeff Johnson0a8786a2018-12-02 10:49:01 -08009497 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309498 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009499 uint8_t i, j, peSessionId;
gaurank kathpalia14e2f912017-08-31 14:51:45 +05309500 struct csr_roam_session *pCsrSession = NULL;
Jeff Johnson59104482018-11-18 21:30:19 -08009501 struct pe_session *pSession = NULL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009502
Jeff Johnson01f2c232018-11-21 19:17:44 -08009503 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309504 if (!QDF_IS_STATUS_SUCCESS(status))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009505 return status;
Jeff Johnson01f2c232018-11-21 19:17:44 -08009506 pCsrSession = CSR_GET_SESSION(mac, sessionId);
Jeff Johnson038efe72019-03-18 13:39:31 -07009507 if (!pCsrSession) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05309508 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009509 FL("Session lookup fails for CSR session"));
Jeff Johnson01f2c232018-11-21 19:17:44 -08009510 sme_release_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309511 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009512 }
Jeff Johnson01f2c232018-11-21 19:17:44 -08009513 if (!CSR_IS_SESSION_VALID(mac, sessionId)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05309514 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009515 FL("Invalid session Id %u"), sessionId);
Jeff Johnson01f2c232018-11-21 19:17:44 -08009516 sme_release_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309517 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009518 }
9519
Jeff Johnson01f2c232018-11-21 19:17:44 -08009520 pSession = pe_find_session_by_bssid(mac,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009521 pCsrSession->connectedProfile.bssid.bytes,
9522 &peSessionId);
9523
Jeff Johnson038efe72019-03-18 13:39:31 -07009524 if (!pSession) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05309525 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009526 FL(" Session lookup fails for BSSID"));
Jeff Johnson01f2c232018-11-21 19:17:44 -08009527 sme_release_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309528 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009529 }
9530
9531 if (!pSession->QosMapSet.present) {
Srinivas Girigowda2b5d47c2017-03-29 00:28:46 -07009532 sme_debug("QOS Mapping IE not present");
Jeff Johnson01f2c232018-11-21 19:17:44 -08009533 sme_release_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309534 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009535 }
9536 for (i = 0; i < SME_QOS_WMM_UP_MAX; i++) {
9537 for (j = pSession->QosMapSet.dscp_range[i][0];
9538 j <= pSession->QosMapSet.dscp_range[i][1];
9539 j++) {
9540 if ((pSession->QosMapSet.dscp_range[i][0] == 255)
9541 && (pSession->QosMapSet.dscp_range[i][1] ==
9542 255)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05309543 QDF_TRACE(QDF_MODULE_ID_SME,
Kiran Kumar Lokere1d411bb2017-11-29 15:24:05 -08009544 QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009545 FL("User Priority %d isn't used"), i);
9546 break;
9547 } else {
9548 dscpmapping[j] = i;
9549 }
9550 }
9551 }
9552 for (i = 0; i < pSession->QosMapSet.num_dscp_exceptions; i++)
9553 if (pSession->QosMapSet.dscp_exceptions[i][0] != 255)
9554 dscpmapping[pSession->QosMapSet.dscp_exceptions[i][0]] =
9555 pSession->QosMapSet.dscp_exceptions[i][1];
9556
Jeff Johnson01f2c232018-11-21 19:17:44 -08009557 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009558 return status;
9559}
9560
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05309561/*
9562 * sme_abort_roam_scan() -
9563 * API to abort current roam scan cycle by roam scan offload module.
9564 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -08009565 * mac_handle - The handle returned by mac_open.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05309566 * sessionId - Session Identifier
9567 * Return QDF_STATUS
9568 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009569
Jeff Johnsonb460dd72018-11-08 10:26:51 -08009570QDF_STATUS sme_abort_roam_scan(mac_handle_t mac_handle, uint8_t sessionId)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009571{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309572 QDF_STATUS status = QDF_STATUS_SUCCESS;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08009573 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009574
Wu Gao51a63562018-11-08 16:29:10 +08009575 if (mac->mlme_cfg->lfr.roam_scan_offload_enabled) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009576 /* acquire the lock for the sme object */
Jeff Johnson01f2c232018-11-21 19:17:44 -08009577 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309578 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson01f2c232018-11-21 19:17:44 -08009579 csr_roam_offload_scan(mac, sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009580 ROAM_SCAN_OFFLOAD_ABORT_SCAN,
9581 REASON_ROAM_ABORT_ROAM_SCAN);
9582 /* release the lock for the sme object */
Jeff Johnson01f2c232018-11-21 19:17:44 -08009583 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009584 }
9585 }
9586
9587 return status;
9588}
9589
9590#ifdef FEATURE_WLAN_EXTSCAN
9591/**
9592 * sme_get_valid_channels_by_band() - to fetch valid channels filtered by band
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -08009593 * @mac_handle: Opaque handle to the global MAC context
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009594 * @wifiBand: RF band information
9595 * @aValidChannels: output array to store channel info
9596 * @pNumChannels: output number of channels
9597 *
9598 * SME API to fetch all valid channels filtered by band
9599 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309600 * Return: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009601 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -08009602QDF_STATUS sme_get_valid_channels_by_band(mac_handle_t mac_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009603 uint8_t wifiBand,
9604 uint32_t *aValidChannels,
9605 uint8_t *pNumChannels)
9606{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309607 QDF_STATUS status = QDF_STATUS_SUCCESS;
Wu Gao0821b0d2019-01-11 17:31:11 +08009608 uint8_t chanList[CFG_VALID_CHANNEL_LIST_LEN] = { 0 };
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009609 uint8_t numChannels = 0;
9610 uint8_t i = 0;
Wu Gao0821b0d2019-01-11 17:31:11 +08009611 uint32_t totValidChannels = CFG_VALID_CHANNEL_LIST_LEN;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08009612 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009613
9614 if (!aValidChannels || !pNumChannels) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07009615 sme_err("Output channel list/NumChannels is NULL");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309616 return QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009617 }
9618
Sreelakshmi Konamki0d17c6a2017-06-08 12:58:54 +05309619 if (wifiBand >= WIFI_BAND_MAX) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07009620 sme_err("Invalid wifiBand: %d", wifiBand);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309621 return QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009622 }
9623
Tushnim Bhattacharyya0c4ad2d2017-03-09 15:59:03 -08009624 status = sme_get_cfg_valid_channels(&chanList[0],
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009625 &totValidChannels);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309626 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07009627 sme_err("Fail to get valid channel list (err=%d)", status);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009628 return status;
9629 }
9630
9631 switch (wifiBand) {
9632 case WIFI_BAND_UNSPECIFIED:
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07009633 sme_debug("Unspec Band, return all %d valid channels",
9634 totValidChannels);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009635 numChannels = totValidChannels;
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05309636 for (i = 0; i < totValidChannels; i++)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009637 aValidChannels[i] = cds_chan_to_freq(chanList[i]);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009638 break;
9639
9640 case WIFI_BAND_BG:
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07009641 sme_debug("WIFI_BAND_BG (2.4 GHz)");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009642 for (i = 0; i < totValidChannels; i++) {
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05309643 if (WLAN_REG_IS_24GHZ_CH(chanList[i]))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009644 aValidChannels[numChannels++] =
9645 cds_chan_to_freq(chanList[i]);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009646 }
9647 break;
9648
9649 case WIFI_BAND_A:
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07009650 sme_debug("WIFI_BAND_A (5 GHz without DFS)");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009651 for (i = 0; i < totValidChannels; i++) {
Kiran Kumar Lokerea3de2262017-04-12 12:15:04 -07009652 if (WLAN_REG_IS_5GHZ_CH(chanList[i]) &&
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05309653 !wlan_reg_is_dfs_ch(mac_ctx->pdev, chanList[i]))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009654 aValidChannels[numChannels++] =
9655 cds_chan_to_freq(chanList[i]);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009656 }
9657 break;
9658
9659 case WIFI_BAND_ABG:
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07009660 sme_debug("WIFI_BAND_ABG (2.4 GHz + 5 GHz; no DFS)");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009661 for (i = 0; i < totValidChannels; i++) {
Kiran Kumar Lokerea3de2262017-04-12 12:15:04 -07009662 if ((WLAN_REG_IS_24GHZ_CH(chanList[i]) ||
9663 WLAN_REG_IS_5GHZ_CH(chanList[i])) &&
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05309664 !wlan_reg_is_dfs_ch(mac_ctx->pdev, chanList[i]))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009665 aValidChannels[numChannels++] =
9666 cds_chan_to_freq(chanList[i]);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009667 }
9668 break;
9669
9670 case WIFI_BAND_A_DFS_ONLY:
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07009671 sme_debug("WIFI_BAND_A_DFS (5 GHz DFS only)");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009672 for (i = 0; i < totValidChannels; i++) {
Kiran Kumar Lokerea3de2262017-04-12 12:15:04 -07009673 if (WLAN_REG_IS_5GHZ_CH(chanList[i]) &&
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05309674 wlan_reg_is_dfs_ch(mac_ctx->pdev, chanList[i]))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009675 aValidChannels[numChannels++] =
9676 cds_chan_to_freq(chanList[i]);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009677 }
9678 break;
9679
9680 case WIFI_BAND_A_WITH_DFS:
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07009681 sme_debug("WIFI_BAND_A_WITH_DFS (5 GHz with DFS)");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009682 for (i = 0; i < totValidChannels; i++) {
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05309683 if (WLAN_REG_IS_5GHZ_CH(chanList[i]))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009684 aValidChannels[numChannels++] =
9685 cds_chan_to_freq(chanList[i]);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009686 }
9687 break;
9688
9689 case WIFI_BAND_ABG_WITH_DFS:
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07009690 sme_debug("WIFI_BAND_ABG_WITH_DFS (2.4 GHz+5 GHz with DFS)");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009691 for (i = 0; i < totValidChannels; i++) {
Kiran Kumar Lokerea3de2262017-04-12 12:15:04 -07009692 if (WLAN_REG_IS_24GHZ_CH(chanList[i]) ||
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +05309693 WLAN_REG_IS_5GHZ_CH(chanList[i]))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009694 aValidChannels[numChannels++] =
9695 cds_chan_to_freq(chanList[i]);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009696 }
9697 break;
9698
9699 default:
Srinivas Girigowda2da81e22017-03-16 21:22:19 -07009700 sme_err("Unknown wifiBand: %d", wifiBand);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309701 return QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009702 }
9703 *pNumChannels = numChannels;
9704
9705 return status;
9706}
9707
Jeff Johnsonfed9a732018-07-18 12:18:03 -07009708QDF_STATUS
9709sme_ext_scan_get_capabilities(mac_handle_t mac_handle,
9710 struct extscan_capabilities_params *params)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009711{
Jeff Johnsonfed9a732018-07-18 12:18:03 -07009712 QDF_STATUS status;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08009713 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Rajeev Kumar37d478b2017-04-17 16:59:28 -07009714 struct scheduler_msg message = {0};
Jeff Johnsonfed9a732018-07-18 12:18:03 -07009715 struct extscan_capabilities_params *bodyptr;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009716
Jeff Johnsonfed9a732018-07-18 12:18:03 -07009717 /* per contract must make a copy of the params when messaging */
9718 bodyptr = qdf_mem_malloc(sizeof(*bodyptr));
9719 if (!bodyptr)
9720 return QDF_STATUS_E_NOMEM;
9721 *bodyptr = *params;
9722
9723 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309724 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009725 /* Serialize the req through MC thread */
Jeff Johnsonfed9a732018-07-18 12:18:03 -07009726 message.bodyptr = bodyptr;
Rajeev Kumar8eaedf62017-01-21 11:03:13 -08009727 message.type = WMA_EXTSCAN_GET_CAPABILITIES_REQ;
Jeff Johnsonfed9a732018-07-18 12:18:03 -07009728 qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
9729 NO_SESSION, message.type);
9730 status = scheduler_post_message(QDF_MODULE_ID_SME,
9731 QDF_MODULE_ID_WMA,
9732 QDF_MODULE_ID_WMA,
9733 &message);
9734 sme_release_global_lock(&mac->sme);
9735 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009736
Jeff Johnsonfed9a732018-07-18 12:18:03 -07009737 if (QDF_IS_STATUS_ERROR(status)) {
9738 sme_err("failure: %d", status);
9739 qdf_mem_free(bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009740 }
9741 return status;
9742}
9743
Jeff Johnsondab58602018-07-14 15:30:24 -07009744QDF_STATUS
9745sme_ext_scan_start(mac_handle_t mac_handle,
9746 struct wifi_scan_cmd_req_params *params)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009747{
Jeff Johnsondab58602018-07-14 15:30:24 -07009748 QDF_STATUS status;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08009749 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Rajeev Kumar37d478b2017-04-17 16:59:28 -07009750 struct scheduler_msg message = {0};
Jeff Johnsondab58602018-07-14 15:30:24 -07009751 struct wifi_scan_cmd_req_params *bodyptr;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009752
Jeff Johnsondab58602018-07-14 15:30:24 -07009753 /* per contract must make a copy of the params when messaging */
9754 bodyptr = qdf_mem_malloc(sizeof(*bodyptr));
9755 if (!bodyptr)
9756 return QDF_STATUS_E_NOMEM;
9757 *bodyptr = *params;
9758
9759 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309760 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009761 /* Serialize the req through MC thread */
Jeff Johnsondab58602018-07-14 15:30:24 -07009762 message.bodyptr = bodyptr;
Rajeev Kumar8eaedf62017-01-21 11:03:13 -08009763 message.type = WMA_EXTSCAN_START_REQ;
Jeff Johnsondab58602018-07-14 15:30:24 -07009764 qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
9765 NO_SESSION, message.type);
9766 status = scheduler_post_message(QDF_MODULE_ID_SME,
9767 QDF_MODULE_ID_WMA,
9768 QDF_MODULE_ID_WMA,
9769 &message);
9770 sme_release_global_lock(&mac->sme);
9771 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009772
Jeff Johnsondab58602018-07-14 15:30:24 -07009773 if (QDF_IS_STATUS_ERROR(status)) {
9774 sme_err("failure: %d", status);
9775 qdf_mem_free(bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009776 }
9777 return status;
9778}
9779
Jeff Johnson7272ea72018-07-15 17:22:27 -07009780QDF_STATUS sme_ext_scan_stop(mac_handle_t mac_handle,
9781 struct extscan_stop_req_params *params)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009782{
Jeff Johnson7272ea72018-07-15 17:22:27 -07009783 QDF_STATUS status;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08009784 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Rajeev Kumar37d478b2017-04-17 16:59:28 -07009785 struct scheduler_msg message = {0};
Jeff Johnson7272ea72018-07-15 17:22:27 -07009786 struct extscan_stop_req_params *bodyptr;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009787
Jeff Johnson7272ea72018-07-15 17:22:27 -07009788 /* per contract must make a copy of the params when messaging */
9789 bodyptr = qdf_mem_malloc(sizeof(*bodyptr));
9790 if (!bodyptr)
9791 return QDF_STATUS_E_NOMEM;
9792 *bodyptr = *params;
9793
9794 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309795 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009796 /* Serialize the req through MC thread */
Jeff Johnson7272ea72018-07-15 17:22:27 -07009797 message.bodyptr = bodyptr;
Rajeev Kumar8eaedf62017-01-21 11:03:13 -08009798 message.type = WMA_EXTSCAN_STOP_REQ;
Jeff Johnson7272ea72018-07-15 17:22:27 -07009799 qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
9800 NO_SESSION, message.type);
9801 status = scheduler_post_message(QDF_MODULE_ID_SME,
9802 QDF_MODULE_ID_WMA,
9803 QDF_MODULE_ID_WMA,
9804 &message);
9805 sme_release_global_lock(&mac->sme);
9806 }
9807
9808 if (QDF_IS_STATUS_ERROR(status)) {
9809 sme_err("failure: %d", status);
9810 qdf_mem_free(bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009811 }
9812 return status;
9813}
9814
Jeff Johnson1148cb02018-07-13 23:14:32 -07009815QDF_STATUS
9816sme_set_bss_hotlist(mac_handle_t mac_handle,
9817 struct extscan_bssid_hotlist_set_params *params)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009818{
Jeff Johnson1148cb02018-07-13 23:14:32 -07009819 QDF_STATUS status;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08009820 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Rajeev Kumar37d478b2017-04-17 16:59:28 -07009821 struct scheduler_msg message = {0};
Jeff Johnson1148cb02018-07-13 23:14:32 -07009822 struct extscan_bssid_hotlist_set_params *bodyptr;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009823
Jeff Johnson1148cb02018-07-13 23:14:32 -07009824 /* per contract must make a copy of the params when messaging */
9825 bodyptr = qdf_mem_malloc(sizeof(*bodyptr));
Arif Hussain0ef77082018-10-10 16:42:53 -07009826 if (!bodyptr)
Jeff Johnson1148cb02018-07-13 23:14:32 -07009827 return QDF_STATUS_E_NOMEM;
Arif Hussain0ef77082018-10-10 16:42:53 -07009828
Jeff Johnson1148cb02018-07-13 23:14:32 -07009829 *bodyptr = *params;
9830
9831 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309832 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009833 /* Serialize the req through MC thread */
Jeff Johnson1148cb02018-07-13 23:14:32 -07009834 message.bodyptr = bodyptr;
Rajeev Kumar8eaedf62017-01-21 11:03:13 -08009835 message.type = WMA_EXTSCAN_SET_BSSID_HOTLIST_REQ;
Jeff Johnson1148cb02018-07-13 23:14:32 -07009836 qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
9837 NO_SESSION, message.type);
gaurank kathpalia36b0c582018-08-28 17:45:43 +05309838 status = scheduler_post_message(QDF_MODULE_ID_SME,
9839 QDF_MODULE_ID_WMA,
9840 QDF_MODULE_ID_WMA, &message);
Jeff Johnson1148cb02018-07-13 23:14:32 -07009841 sme_release_global_lock(&mac->sme);
9842 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009843
Jeff Johnson1148cb02018-07-13 23:14:32 -07009844 if (QDF_IS_STATUS_ERROR(status)) {
9845 sme_err("failure: %d", status);
9846 qdf_mem_free(bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009847 }
9848 return status;
9849}
9850
Jeff Johnson9743eb72018-07-14 10:30:04 -07009851QDF_STATUS
9852sme_reset_bss_hotlist(mac_handle_t mac_handle,
9853 struct extscan_bssid_hotlist_reset_params *params)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009854{
Jeff Johnson9743eb72018-07-14 10:30:04 -07009855 QDF_STATUS status;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08009856 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Rajeev Kumar37d478b2017-04-17 16:59:28 -07009857 struct scheduler_msg message = {0};
Jeff Johnson9743eb72018-07-14 10:30:04 -07009858 struct extscan_bssid_hotlist_reset_params *bodyptr;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009859
Jeff Johnson9743eb72018-07-14 10:30:04 -07009860 /* per contract must make a copy of the params when messaging */
9861 bodyptr = qdf_mem_malloc(sizeof(*bodyptr));
Arif Hussain0ef77082018-10-10 16:42:53 -07009862 if (!bodyptr)
Jeff Johnson9743eb72018-07-14 10:30:04 -07009863 return QDF_STATUS_E_NOMEM;
Arif Hussain0ef77082018-10-10 16:42:53 -07009864
Jeff Johnson9743eb72018-07-14 10:30:04 -07009865 *bodyptr = *params;
9866
9867 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309868 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009869 /* Serialize the req through MC thread */
Jeff Johnson9743eb72018-07-14 10:30:04 -07009870 message.bodyptr = bodyptr;
Rajeev Kumar8eaedf62017-01-21 11:03:13 -08009871 message.type = WMA_EXTSCAN_RESET_BSSID_HOTLIST_REQ;
Sreelakshmi Konamki6a065362016-05-31 16:05:01 +05309872 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
Rajeev Kumar8eaedf62017-01-21 11:03:13 -08009873 NO_SESSION, message.type));
gaurank kathpalia36b0c582018-08-28 17:45:43 +05309874 status = scheduler_post_message(QDF_MODULE_ID_SME,
9875 QDF_MODULE_ID_WMA,
9876 QDF_MODULE_ID_WMA, &message);
Jeff Johnson9743eb72018-07-14 10:30:04 -07009877 sme_release_global_lock(&mac->sme);
9878 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009879
Jeff Johnson9743eb72018-07-14 10:30:04 -07009880 if (QDF_IS_STATUS_ERROR(status)) {
9881 sme_err("failure: %d", status);
9882 qdf_mem_free(bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009883 }
9884 return status;
9885}
9886
Jeff Johnsonb43ed032018-07-16 06:59:21 -07009887QDF_STATUS
9888sme_set_significant_change(mac_handle_t mac_handle,
9889 struct extscan_set_sig_changereq_params *params)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009890{
Jeff Johnsonb43ed032018-07-16 06:59:21 -07009891 QDF_STATUS status;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08009892 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Rajeev Kumar37d478b2017-04-17 16:59:28 -07009893 struct scheduler_msg message = {0};
Jeff Johnsonb43ed032018-07-16 06:59:21 -07009894 struct extscan_set_sig_changereq_params *bodyptr;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009895
Jeff Johnsonb43ed032018-07-16 06:59:21 -07009896 /* per contract must make a copy of the params when messaging */
9897 bodyptr = qdf_mem_malloc(sizeof(*bodyptr));
Arif Hussain0ef77082018-10-10 16:42:53 -07009898 if (!bodyptr)
Jeff Johnsonb43ed032018-07-16 06:59:21 -07009899 return QDF_STATUS_E_NOMEM;
Arif Hussain0ef77082018-10-10 16:42:53 -07009900
Jeff Johnsonb43ed032018-07-16 06:59:21 -07009901 *bodyptr = *params;
9902
9903 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309904 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009905 /* Serialize the req through MC thread */
Jeff Johnsonb43ed032018-07-16 06:59:21 -07009906 message.bodyptr = bodyptr;
Rajeev Kumar8eaedf62017-01-21 11:03:13 -08009907 message.type = WMA_EXTSCAN_SET_SIGNF_CHANGE_REQ;
gaurank kathpalia36b0c582018-08-28 17:45:43 +05309908 status = scheduler_post_message(QDF_MODULE_ID_SME,
9909 QDF_MODULE_ID_WMA,
9910 QDF_MODULE_ID_WMA,
9911 &message);
Jeff Johnsonb43ed032018-07-16 06:59:21 -07009912 sme_release_global_lock(&mac->sme);
9913 }
Jeff Johnsonb43ed032018-07-16 06:59:21 -07009914 if (QDF_IS_STATUS_ERROR(status)) {
9915 sme_err("failure: %d", status);
9916 qdf_mem_free(bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009917 }
9918 return status;
9919}
9920
Jeff Johnson0c8dbc32018-07-16 22:10:48 -07009921QDF_STATUS
9922sme_reset_significant_change(mac_handle_t mac_handle,
9923 struct extscan_capabilities_reset_params *params)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009924{
Jeff Johnson0c8dbc32018-07-16 22:10:48 -07009925 QDF_STATUS status;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08009926 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Rajeev Kumar37d478b2017-04-17 16:59:28 -07009927 struct scheduler_msg message = {0};
Jeff Johnson0c8dbc32018-07-16 22:10:48 -07009928 struct extscan_capabilities_reset_params *bodyptr;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009929
Jeff Johnson0c8dbc32018-07-16 22:10:48 -07009930 /* per contract must make a copy of the params when messaging */
9931 bodyptr = qdf_mem_malloc(sizeof(*bodyptr));
Arif Hussain0ef77082018-10-10 16:42:53 -07009932 if (!bodyptr)
Jeff Johnson0c8dbc32018-07-16 22:10:48 -07009933 return QDF_STATUS_E_NOMEM;
Arif Hussain0ef77082018-10-10 16:42:53 -07009934
Jeff Johnson0c8dbc32018-07-16 22:10:48 -07009935 *bodyptr = *params;
9936
9937 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309938 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009939 /* Serialize the req through MC thread */
Jeff Johnson0c8dbc32018-07-16 22:10:48 -07009940 message.bodyptr = bodyptr;
Rajeev Kumar8eaedf62017-01-21 11:03:13 -08009941 message.type = WMA_EXTSCAN_RESET_SIGNF_CHANGE_REQ;
Sreelakshmi Konamki6a065362016-05-31 16:05:01 +05309942 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
Rajeev Kumar8eaedf62017-01-21 11:03:13 -08009943 NO_SESSION, message.type));
gaurank kathpalia36b0c582018-08-28 17:45:43 +05309944 status = scheduler_post_message(QDF_MODULE_ID_SME,
9945 QDF_MODULE_ID_WMA,
9946 QDF_MODULE_ID_WMA,
9947 &message);
Jeff Johnson0c8dbc32018-07-16 22:10:48 -07009948 sme_release_global_lock(&mac->sme);
9949 }
Jeff Johnson0c8dbc32018-07-16 22:10:48 -07009950 if (QDF_IS_STATUS_ERROR(status)) {
9951 sme_err("failure: %d", status);
9952 qdf_mem_free(bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009953 }
gaurank kathpalia36b0c582018-08-28 17:45:43 +05309954
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009955 return status;
9956}
9957
Jeff Johnson2ba60092018-07-17 08:19:37 -07009958QDF_STATUS
9959sme_get_cached_results(mac_handle_t mac_handle,
9960 struct extscan_cached_result_params *params)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009961{
Jeff Johnson2ba60092018-07-17 08:19:37 -07009962 QDF_STATUS status;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08009963 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Rajeev Kumar37d478b2017-04-17 16:59:28 -07009964 struct scheduler_msg message = {0};
Jeff Johnson2ba60092018-07-17 08:19:37 -07009965 struct extscan_cached_result_params *bodyptr;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009966
Jeff Johnson2ba60092018-07-17 08:19:37 -07009967 /* per contract must make a copy of the params when messaging */
9968 bodyptr = qdf_mem_malloc(sizeof(*bodyptr));
9969 if (!bodyptr)
9970 return QDF_STATUS_E_NOMEM;
9971 *bodyptr = *params;
9972
9973 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309974 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009975 /* Serialize the req through MC thread */
Jeff Johnson2ba60092018-07-17 08:19:37 -07009976 message.bodyptr = bodyptr;
Rajeev Kumar8eaedf62017-01-21 11:03:13 -08009977 message.type = WMA_EXTSCAN_GET_CACHED_RESULTS_REQ;
Jeff Johnson2ba60092018-07-17 08:19:37 -07009978 qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
9979 NO_SESSION, message.type);
9980 status = scheduler_post_message(QDF_MODULE_ID_SME,
9981 QDF_MODULE_ID_WMA,
9982 QDF_MODULE_ID_WMA,
9983 &message);
9984 sme_release_global_lock(&mac->sme);
9985 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009986
Jeff Johnson2ba60092018-07-17 08:19:37 -07009987 if (QDF_IS_STATUS_ERROR(status)) {
9988 sme_err("failure: %d", status);
9989 qdf_mem_free(bodyptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009990 }
9991 return status;
9992}
9993
Jeff Johnson360135b2018-07-18 20:51:47 -07009994QDF_STATUS sme_set_epno_list(mac_handle_t mac_handle,
9995 struct wifi_enhanced_pno_params *params)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009996{
Jeff Johnson360135b2018-07-18 20:51:47 -07009997 QDF_STATUS status;
Jeff Johnson0a8786a2018-12-02 10:49:01 -08009998 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Rajeev Kumar37d478b2017-04-17 16:59:28 -07009999 struct scheduler_msg message = {0};
Jeff Johnson360135b2018-07-18 20:51:47 -070010000 struct wifi_enhanced_pno_params *req_msg;
10001 int len;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010002
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070010003 SME_ENTER();
Jeff Johnson360135b2018-07-18 20:51:47 -070010004
10005 /* per contract must make a copy of the params when messaging */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010006 len = sizeof(*req_msg) +
Jeff Johnson360135b2018-07-18 20:51:47 -070010007 (params->num_networks * sizeof(req_msg->networks[0]));
Mukul Sharmae8c919f2016-10-02 20:35:15 +053010008
Anurag Chouhan600c3a02016-03-01 10:33:54 +053010009 req_msg = qdf_mem_malloc(len);
Arif Hussain0ef77082018-10-10 16:42:53 -070010010 if (!req_msg)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010011 return QDF_STATUS_E_NOMEM;
Jeff Johnson360135b2018-07-18 20:51:47 -070010012 qdf_mem_copy(req_msg, params, len);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010013
10014 status = sme_acquire_global_lock(&mac->sme);
Vignesh Viswanathancbb5b952017-08-02 14:32:49 +053010015 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070010016 sme_err("sme_acquire_global_lock failed!(status=%d)",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010017 status);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053010018 qdf_mem_free(req_msg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010019 return status;
10020 }
10021
10022 /* Serialize the req through MC thread */
Rajeev Kumar8eaedf62017-01-21 11:03:13 -080010023 message.bodyptr = req_msg;
10024 message.type = WMA_SET_EPNO_LIST_REQ;
gaurank kathpalia36b0c582018-08-28 17:45:43 +053010025 status = scheduler_post_message(QDF_MODULE_ID_SME,
10026 QDF_MODULE_ID_WMA,
10027 QDF_MODULE_ID_WMA, &message);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010028 if (!QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson360135b2018-07-18 20:51:47 -070010029 sme_err("scheduler_post_msg failed!(err=%d)", status);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053010030 qdf_mem_free(req_msg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010031 }
10032 sme_release_global_lock(&mac->sme);
Jeff Johnson360135b2018-07-18 20:51:47 -070010033
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010034 return status;
10035}
10036
Jeff Johnson2a7f1012018-07-19 07:21:06 -070010037QDF_STATUS sme_set_passpoint_list(mac_handle_t mac_handle,
10038 struct wifi_passpoint_req_param *params)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010039{
Jeff Johnson2a7f1012018-07-19 07:21:06 -070010040 QDF_STATUS status;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080010041 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Rajeev Kumar37d478b2017-04-17 16:59:28 -070010042 struct scheduler_msg message = {0};
Jeff Johnson2a7f1012018-07-19 07:21:06 -070010043 struct wifi_passpoint_req_param *req_msg;
10044 int len;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010045
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070010046 SME_ENTER();
Jeff Johnson2a7f1012018-07-19 07:21:06 -070010047
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010048 len = sizeof(*req_msg) +
Jeff Johnson2a7f1012018-07-19 07:21:06 -070010049 (params->num_networks * sizeof(params->networks[0]));
Anurag Chouhan600c3a02016-03-01 10:33:54 +053010050 req_msg = qdf_mem_malloc(len);
Arif Hussain0ef77082018-10-10 16:42:53 -070010051 if (!req_msg)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010052 return QDF_STATUS_E_NOMEM;
Jeff Johnson2a7f1012018-07-19 07:21:06 -070010053 qdf_mem_copy(req_msg, params, len);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010054
10055 status = sme_acquire_global_lock(&mac->sme);
Vignesh Viswanathancbb5b952017-08-02 14:32:49 +053010056 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070010057 sme_err("sme_acquire_global_lock failed!(status=%d)",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010058 status);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053010059 qdf_mem_free(req_msg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010060 return status;
10061 }
10062
10063 /* Serialize the req through MC thread */
Rajeev Kumar8eaedf62017-01-21 11:03:13 -080010064 message.bodyptr = req_msg;
10065 message.type = WMA_SET_PASSPOINT_LIST_REQ;
gaurank kathpalia36b0c582018-08-28 17:45:43 +053010066 status = scheduler_post_message(QDF_MODULE_ID_SME,
10067 QDF_MODULE_ID_WMA,
10068 QDF_MODULE_ID_WMA, &message);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010069 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070010070 sme_err("scheduler_post_msg failed!(err=%d)",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010071 status);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053010072 qdf_mem_free(req_msg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010073 }
10074 sme_release_global_lock(&mac->sme);
10075 return status;
10076}
10077
Jeff Johnson2a7f1012018-07-19 07:21:06 -070010078QDF_STATUS sme_reset_passpoint_list(mac_handle_t mac_handle,
10079 struct wifi_passpoint_req_param *params)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010080{
Jeff Johnson2a7f1012018-07-19 07:21:06 -070010081 QDF_STATUS status;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080010082 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Rajeev Kumar37d478b2017-04-17 16:59:28 -070010083 struct scheduler_msg message = {0};
Jeff Johnson2a7f1012018-07-19 07:21:06 -070010084 struct wifi_passpoint_req_param *req_msg;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010085
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070010086 SME_ENTER();
Jeff Johnson2a7f1012018-07-19 07:21:06 -070010087
Anurag Chouhan600c3a02016-03-01 10:33:54 +053010088 req_msg = qdf_mem_malloc(sizeof(*req_msg));
Arif Hussain0ef77082018-10-10 16:42:53 -070010089 if (!req_msg)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010090 return QDF_STATUS_E_NOMEM;
Jeff Johnson2a7f1012018-07-19 07:21:06 -070010091 *req_msg = *params;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010092
10093 status = sme_acquire_global_lock(&mac->sme);
Vignesh Viswanathancbb5b952017-08-02 14:32:49 +053010094 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070010095 sme_err("sme_acquire_global_lock failed!(status=%d)",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010096 status);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053010097 qdf_mem_free(req_msg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010098 return status;
10099 }
10100
10101 /* Serialize the req through MC thread */
Rajeev Kumar8eaedf62017-01-21 11:03:13 -080010102 message.bodyptr = req_msg;
10103 message.type = WMA_RESET_PASSPOINT_LIST_REQ;
gaurank kathpalia36b0c582018-08-28 17:45:43 +053010104 status = scheduler_post_message(QDF_MODULE_ID_SME,
10105 QDF_MODULE_ID_WMA,
10106 QDF_MODULE_ID_WMA, &message);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010107 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070010108 sme_err("scheduler_post_msg failed!(err=%d)",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010109 status);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053010110 qdf_mem_free(req_msg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010111 }
10112 sme_release_global_lock(&mac->sme);
10113 return status;
10114}
10115
Jeff Johnson17b12392018-07-03 22:21:15 -070010116QDF_STATUS sme_ext_scan_register_callback(mac_handle_t mac_handle,
10117 ext_scan_ind_cb ext_scan_ind_cb)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010118{
Jeff Johnson17b12392018-07-03 22:21:15 -070010119 QDF_STATUS status;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080010120 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010121
Jeff Johnson17b12392018-07-03 22:21:15 -070010122 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010123 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson17b12392018-07-03 22:21:15 -070010124 mac->sme.ext_scan_ind_cb = ext_scan_ind_cb;
10125 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010126 }
10127 return status;
10128}
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010129#endif /* FEATURE_WLAN_EXTSCAN */
10130
Wen Gong7952fbd2018-04-18 11:27:23 +080010131/**
10132 * sme_send_wisa_params(): Pass WISA mode to WMA
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -080010133 * @mac_handle: Opaque handle to the global MAC context
Wen Gong7952fbd2018-04-18 11:27:23 +080010134 * @wisa_params: pointer to WISA params struct
10135 * @sessionId: SME session id
10136 *
10137 * Pass WISA params to WMA
10138 *
10139 * Return: QDF_STATUS
10140 */
Jeff Johnsonc7309062018-11-09 20:59:42 -080010141QDF_STATUS sme_set_wisa_params(mac_handle_t mac_handle,
10142 struct sir_wisa_params *wisa_params)
Wen Gong7952fbd2018-04-18 11:27:23 +080010143{
10144 QDF_STATUS status = QDF_STATUS_SUCCESS;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080010145 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Wen Gong7952fbd2018-04-18 11:27:23 +080010146 struct scheduler_msg message = {0};
10147 struct sir_wisa_params *cds_msg_wisa_params;
10148
10149 cds_msg_wisa_params = qdf_mem_malloc(sizeof(struct sir_wisa_params));
10150 if (!cds_msg_wisa_params)
10151 return QDF_STATUS_E_NOMEM;
10152
10153 *cds_msg_wisa_params = *wisa_params;
10154 status = sme_acquire_global_lock(&mac->sme);
10155 if (QDF_IS_STATUS_SUCCESS(status)) {
10156 message.bodyptr = cds_msg_wisa_params;
10157 message.type = WMA_SET_WISA_PARAMS;
gaurank kathpalia36b0c582018-08-28 17:45:43 +053010158 status = scheduler_post_message(QDF_MODULE_ID_SME,
10159 QDF_MODULE_ID_WMA,
10160 QDF_MODULE_ID_WMA, &message);
Wen Gong7952fbd2018-04-18 11:27:23 +080010161 sme_release_global_lock(&mac->sme);
10162 }
10163 return status;
10164}
10165
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010166#ifdef WLAN_FEATURE_LINK_LAYER_STATS
10167
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053010168/*
10169 * sme_ll_stats_clear_req() -
10170 * SME API to clear Link Layer Statistics
10171 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -080010172 * mac_handle
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053010173 * pclearStatsReq: Link Layer clear stats request params structure
10174 * Return QDF_STATUS
10175 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -080010176QDF_STATUS sme_ll_stats_clear_req(mac_handle_t mac_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010177 tSirLLStatsClearReq *pclearStatsReq)
10178{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010179 QDF_STATUS status = QDF_STATUS_SUCCESS;
10180 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080010181 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Rajeev Kumar37d478b2017-04-17 16:59:28 -070010182 struct scheduler_msg message = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010183 tSirLLStatsClearReq *clear_stats_req;
10184
Abhishek Singhe4a1f882017-08-10 17:59:44 +053010185 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010186 "staId = %u", pclearStatsReq->staId);
Abhishek Singhe4a1f882017-08-10 17:59:44 +053010187 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010188 "statsClearReqMask = 0x%X",
10189 pclearStatsReq->statsClearReqMask);
Abhishek Singhe4a1f882017-08-10 17:59:44 +053010190 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010191 "stopReq = %u", pclearStatsReq->stopReq);
Jeff Johnsonb460dd72018-11-08 10:26:51 -080010192 if (!sme_is_session_id_valid(mac_handle, pclearStatsReq->staId)) {
Deepak Dhamdhere6adc08e2017-07-27 09:33:22 -070010193 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
10194 "%s: invalid staId %d",
10195 __func__, pclearStatsReq->staId);
10196 return QDF_STATUS_E_INVAL;
10197 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010198
Anurag Chouhan600c3a02016-03-01 10:33:54 +053010199 clear_stats_req = qdf_mem_malloc(sizeof(*clear_stats_req));
Arif Hussain0ef77082018-10-10 16:42:53 -070010200 if (!clear_stats_req)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010201 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010202
10203 *clear_stats_req = *pclearStatsReq;
10204
Jeff Johnson01f2c232018-11-21 19:17:44 -080010205 if (QDF_STATUS_SUCCESS == sme_acquire_global_lock(&mac->sme)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010206 /* Serialize the req through MC thread */
Rajeev Kumar8eaedf62017-01-21 11:03:13 -080010207 message.bodyptr = clear_stats_req;
10208 message.type = WMA_LINK_LAYER_STATS_CLEAR_REQ;
Sreelakshmi Konamki6a065362016-05-31 16:05:01 +053010209 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
Rajeev Kumar8eaedf62017-01-21 11:03:13 -080010210 NO_SESSION, message.type));
gaurank kathpalia36b0c582018-08-28 17:45:43 +053010211 qdf_status = scheduler_post_message(QDF_MODULE_ID_SME,
10212 QDF_MODULE_ID_WMA,
10213 QDF_MODULE_ID_WMA,
10214 &message);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010215 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053010216 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010217 "%s: not able to post WMA_LL_STATS_CLEAR_REQ",
10218 __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053010219 qdf_mem_free(clear_stats_req);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010220 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010221 }
Jeff Johnson01f2c232018-11-21 19:17:44 -080010222 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010223 } else {
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053010224 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
10225 "%s: sme_acquire_global_lock error", __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053010226 qdf_mem_free(clear_stats_req);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010227 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010228 }
10229
10230 return status;
10231}
10232
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053010233/*
10234 * sme_ll_stats_set_req() -
10235 * SME API to set the Link Layer Statistics
10236 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -080010237 * mac_handle
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053010238 * psetStatsReq: Link Layer set stats request params structure
10239 * Return QDF_STATUS
10240 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -080010241QDF_STATUS sme_ll_stats_set_req(mac_handle_t mac_handle, tSirLLStatsSetReq
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053010242 *psetStatsReq)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010243{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010244 QDF_STATUS status = QDF_STATUS_SUCCESS;
10245 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080010246 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Rajeev Kumar37d478b2017-04-17 16:59:28 -070010247 struct scheduler_msg message = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010248 tSirLLStatsSetReq *set_stats_req;
10249
Abhishek Singhe4a1f882017-08-10 17:59:44 +053010250 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010251 "%s: MPDU Size = %u", __func__,
10252 psetStatsReq->mpduSizeThreshold);
Abhishek Singhe4a1f882017-08-10 17:59:44 +053010253 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010254 " Aggressive Stats Collections = %u",
10255 psetStatsReq->aggressiveStatisticsGathering);
10256
Anurag Chouhan600c3a02016-03-01 10:33:54 +053010257 set_stats_req = qdf_mem_malloc(sizeof(*set_stats_req));
Arif Hussain0ef77082018-10-10 16:42:53 -070010258 if (!set_stats_req)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010259 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010260
10261 *set_stats_req = *psetStatsReq;
10262
Jeff Johnson01f2c232018-11-21 19:17:44 -080010263 if (QDF_STATUS_SUCCESS == sme_acquire_global_lock(&mac->sme)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010264 /* Serialize the req through MC thread */
Rajeev Kumar8eaedf62017-01-21 11:03:13 -080010265 message.bodyptr = set_stats_req;
10266 message.type = WMA_LINK_LAYER_STATS_SET_REQ;
Sreelakshmi Konamki6a065362016-05-31 16:05:01 +053010267 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
Rajeev Kumar8eaedf62017-01-21 11:03:13 -080010268 NO_SESSION, message.type));
gaurank kathpalia36b0c582018-08-28 17:45:43 +053010269 qdf_status = scheduler_post_message(QDF_MODULE_ID_SME,
10270 QDF_MODULE_ID_WMA,
10271 QDF_MODULE_ID_WMA,
10272 &message);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010273 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053010274 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010275 "%s: not able to post WMA_LL_STATS_SET_REQ",
10276 __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053010277 qdf_mem_free(set_stats_req);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010278 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010279 }
Jeff Johnson01f2c232018-11-21 19:17:44 -080010280 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010281 } else {
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053010282 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
10283 "%s: sme_acquire_global_lock error", __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053010284 qdf_mem_free(set_stats_req);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010285 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010286 }
10287
10288 return status;
10289}
10290
Dundi Ravitejae232cf12018-05-16 18:34:34 +053010291QDF_STATUS sme_ll_stats_get_req(mac_handle_t mac_handle,
10292 tSirLLStatsGetReq *get_stats_req,
10293 void *context)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010294{
Dundi Ravitejae232cf12018-05-16 18:34:34 +053010295 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080010296 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Rajeev Kumar37d478b2017-04-17 16:59:28 -070010297 struct scheduler_msg message = {0};
Dundi Ravitejae232cf12018-05-16 18:34:34 +053010298 tSirLLStatsGetReq *ll_stats_get_req;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010299
Dundi Ravitejae232cf12018-05-16 18:34:34 +053010300 ll_stats_get_req = qdf_mem_malloc(sizeof(*ll_stats_get_req));
Arif Hussain0ef77082018-10-10 16:42:53 -070010301 if (!ll_stats_get_req)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010302 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010303
Dundi Ravitejae232cf12018-05-16 18:34:34 +053010304 *ll_stats_get_req = *get_stats_req;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010305
Dundi Ravitejae232cf12018-05-16 18:34:34 +053010306 mac->sme.ll_stats_context = context;
10307 if (sme_acquire_global_lock(&mac->sme) == QDF_STATUS_SUCCESS) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010308 /* Serialize the req through MC thread */
Dundi Ravitejae232cf12018-05-16 18:34:34 +053010309 message.bodyptr = ll_stats_get_req;
Rajeev Kumar8eaedf62017-01-21 11:03:13 -080010310 message.type = WMA_LINK_LAYER_STATS_GET_REQ;
Dundi Ravitejae232cf12018-05-16 18:34:34 +053010311 qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
10312 NO_SESSION, message.type);
gaurank kathpalia36b0c582018-08-28 17:45:43 +053010313 status = scheduler_post_message(QDF_MODULE_ID_SME,
10314 QDF_MODULE_ID_WMA,
10315 QDF_MODULE_ID_WMA, &message);
Dundi Ravitejae232cf12018-05-16 18:34:34 +053010316 if (!QDF_IS_STATUS_SUCCESS(status)) {
10317 sme_err("Not able to post WMA_LL_STATS_GET_REQ");
10318 qdf_mem_free(ll_stats_get_req);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010319 }
Dundi Ravitejae232cf12018-05-16 18:34:34 +053010320 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010321 } else {
Dundi Ravitejae232cf12018-05-16 18:34:34 +053010322 sme_err("sme_acquire_global_lock error");
10323 qdf_mem_free(ll_stats_get_req);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010324 }
10325
10326 return status;
10327}
10328
Jeff Johnson959f3692018-07-03 17:30:40 -070010329QDF_STATUS sme_set_link_layer_stats_ind_cb(mac_handle_t mac_handle,
10330 link_layer_stats_cb callback)
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053010331{
Jeff Johnson959f3692018-07-03 17:30:40 -070010332 QDF_STATUS status;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080010333 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010334
Jeff Johnson959f3692018-07-03 17:30:40 -070010335 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010336 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson959f3692018-07-03 17:30:40 -070010337 mac->sme.link_layer_stats_cb = callback;
10338 sme_release_global_lock(&mac->sme);
10339 } else {
10340 sme_err("sme_acquire_global_lock error");
10341 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010342
10343 return status;
10344}
10345
Arun Khandavalli4b55da72016-07-19 19:55:01 +053010346/**
Zhang Qiana6e9c102016-12-22 16:47:24 +080010347 * sme_set_link_layer_ext_cb() - Register callback for link layer statistics
Jeff Johnsonc7309062018-11-09 20:59:42 -080010348 * @mac_handle: Mac global handle
Zhang Qiana6e9c102016-12-22 16:47:24 +080010349 * @ll_stats_ext_cb: HDD callback which needs to be invoked after getting
10350 * status notification from FW
10351 *
Jeff Johnsonc7309062018-11-09 20:59:42 -080010352 * Return: QDF_STATUS
Zhang Qiana6e9c102016-12-22 16:47:24 +080010353 */
Jeff Johnsonc7309062018-11-09 20:59:42 -080010354QDF_STATUS
10355sme_set_link_layer_ext_cb(mac_handle_t mac_handle,
10356 void (*ll_stats_ext_cb)(hdd_handle_t callback_ctx,
10357 tSirLLStatsResults *rsp))
Zhang Qiana6e9c102016-12-22 16:47:24 +080010358{
10359 QDF_STATUS status;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080010360 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Zhang Qiana6e9c102016-12-22 16:47:24 +080010361
10362 status = sme_acquire_global_lock(&mac->sme);
10363 if (status == QDF_STATUS_SUCCESS) {
10364 mac->sme.link_layer_stats_ext_cb = ll_stats_ext_cb;
10365 sme_release_global_lock(&mac->sme);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053010366 } else
Zhang Qiana6e9c102016-12-22 16:47:24 +080010367 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
10368 "%s: sme_qcquire_global_lock error", __func__);
Zhang Qiana6e9c102016-12-22 16:47:24 +080010369 return status;
10370}
10371
10372/**
Arun Khandavalli4b55da72016-07-19 19:55:01 +053010373 * sme_reset_link_layer_stats_ind_cb() - SME API to reset link layer stats
10374 * indication
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -080010375 * @mac_handle: Opaque handle to the global MAC context
Arun Khandavalli4b55da72016-07-19 19:55:01 +053010376 *
10377 * This function reset's the link layer stats indication
10378 *
10379 * Return: QDF_STATUS Enumeration
10380 */
10381
Jeff Johnsonb460dd72018-11-08 10:26:51 -080010382QDF_STATUS sme_reset_link_layer_stats_ind_cb(mac_handle_t mac_handle)
Arun Khandavalli4b55da72016-07-19 19:55:01 +053010383{
10384 QDF_STATUS status;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080010385 struct mac_context *pmac;
Arun Khandavalli4b55da72016-07-19 19:55:01 +053010386
Jeff Johnsonb460dd72018-11-08 10:26:51 -080010387 if (!mac_handle) {
Arun Khandavalli4b55da72016-07-19 19:55:01 +053010388 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Jeff Johnsonb460dd72018-11-08 10:26:51 -080010389 FL("mac_handle is not valid"));
Arun Khandavalli4b55da72016-07-19 19:55:01 +053010390 return QDF_STATUS_E_INVAL;
10391 }
Jeff Johnsona0619e42018-11-28 17:43:00 -080010392 pmac = MAC_CONTEXT(mac_handle);
Arun Khandavalli4b55da72016-07-19 19:55:01 +053010393
10394 status = sme_acquire_global_lock(&pmac->sme);
10395 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson959f3692018-07-03 17:30:40 -070010396 pmac->sme.link_layer_stats_cb = NULL;
Arun Khandavalli4b55da72016-07-19 19:55:01 +053010397 sme_release_global_lock(&pmac->sme);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053010398 } else
10399 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
10400 "%s: sme_acquire_global_lock error", __func__);
Arun Khandavalli4b55da72016-07-19 19:55:01 +053010401
10402 return status;
10403}
10404
Zhang Qian73c348a2017-03-13 16:15:55 +080010405/**
10406 * sme_ll_stats_set_thresh - set threshold for mac counters
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -080010407 * @mac_handle: Opaque handle to the global MAC context
Zhang Qian73c348a2017-03-13 16:15:55 +080010408 * @threshold, threshold for mac counters
10409 *
10410 * Return: QDF_STATUS Enumeration
10411 */
Jeff Johnsonc7309062018-11-09 20:59:42 -080010412QDF_STATUS sme_ll_stats_set_thresh(mac_handle_t mac_handle,
Zhang Qian73c348a2017-03-13 16:15:55 +080010413 struct sir_ll_ext_stats_threshold *threshold)
10414{
10415 QDF_STATUS status;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080010416 struct mac_context *mac;
Rajeev Kumar658e8492017-12-13 11:35:41 -080010417 struct scheduler_msg message = {0};
Zhang Qian73c348a2017-03-13 16:15:55 +080010418 struct sir_ll_ext_stats_threshold *thresh;
10419
10420 if (!threshold) {
10421 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
10422 FL("threshold is not valid"));
10423 return QDF_STATUS_E_INVAL;
10424 }
10425
Jeff Johnsonc7309062018-11-09 20:59:42 -080010426 if (!mac_handle) {
Zhang Qian73c348a2017-03-13 16:15:55 +080010427 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Jeff Johnsonc7309062018-11-09 20:59:42 -080010428 FL("mac_handle is not valid"));
Zhang Qian73c348a2017-03-13 16:15:55 +080010429 return QDF_STATUS_E_INVAL;
10430 }
Jeff Johnsona0619e42018-11-28 17:43:00 -080010431 mac = MAC_CONTEXT(mac_handle);
Zhang Qian73c348a2017-03-13 16:15:55 +080010432
10433 thresh = qdf_mem_malloc(sizeof(*thresh));
Arif Hussain0ef77082018-10-10 16:42:53 -070010434 if (!thresh)
Zhang Qian73c348a2017-03-13 16:15:55 +080010435 return QDF_STATUS_E_NOMEM;
Arif Hussain0ef77082018-10-10 16:42:53 -070010436
Zhang Qian73c348a2017-03-13 16:15:55 +080010437 *thresh = *threshold;
10438
10439 status = sme_acquire_global_lock(&mac->sme);
10440 if (QDF_IS_STATUS_SUCCESS(status)) {
10441 /* Serialize the req through MC thread */
10442 message.bodyptr = thresh;
10443 message.type = WDA_LINK_LAYER_STATS_SET_THRESHOLD;
10444 MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
10445 NO_SESSION, message.type));
gaurank kathpalia36b0c582018-08-28 17:45:43 +053010446 status = scheduler_post_message(QDF_MODULE_ID_SME,
10447 QDF_MODULE_ID_WMA,
10448 QDF_MODULE_ID_WMA, &message);
Zhang Qian73c348a2017-03-13 16:15:55 +080010449 if (!QDF_IS_STATUS_SUCCESS(status)) {
10450 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
10451 "%s: not able to post WDA_LL_STATS_GET_REQ",
10452 __func__);
10453 qdf_mem_free(thresh);
10454 }
10455 sme_release_global_lock(&mac->sme);
10456 } else {
10457 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
10458 FL("sme_acquire_global_lock error"));
10459 qdf_mem_free(thresh);
10460 }
10461 return status;
10462}
Arun Khandavalli4b55da72016-07-19 19:55:01 +053010463
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010464#endif /* WLAN_FEATURE_LINK_LAYER_STATS */
10465
Sridhar Selvarajdc400d22016-10-18 17:18:03 +053010466#ifdef WLAN_POWER_DEBUGFS
10467/**
10468 * sme_power_debug_stats_req() - SME API to collect Power debug stats
10469 * @callback_fn: Pointer to the callback function for Power stats event
10470 * @power_stats_context: Pointer to context
10471 *
10472 * Return: QDF_STATUS
10473 */
Jeff Johnsonc7309062018-11-09 20:59:42 -080010474QDF_STATUS sme_power_debug_stats_req(
10475 mac_handle_t mac_handle,
10476 void (*callback_fn)(struct power_stats_response *response,
10477 void *context),
10478 void *power_stats_context)
Sridhar Selvarajdc400d22016-10-18 17:18:03 +053010479{
10480 QDF_STATUS status = QDF_STATUS_SUCCESS;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080010481 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Rajeev Kumar37d478b2017-04-17 16:59:28 -070010482 struct scheduler_msg msg = {0};
Sridhar Selvarajdc400d22016-10-18 17:18:03 +053010483
10484 status = sme_acquire_global_lock(&mac_ctx->sme);
10485 if (QDF_IS_STATUS_SUCCESS(status)) {
10486 if (!callback_fn) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070010487 sme_err("Indication callback did not registered");
Sridhar Selvarajdc400d22016-10-18 17:18:03 +053010488 sme_release_global_lock(&mac_ctx->sme);
10489 return QDF_STATUS_E_FAILURE;
10490 }
10491
10492 mac_ctx->sme.power_debug_stats_context = power_stats_context;
10493 mac_ctx->sme.power_stats_resp_callback = callback_fn;
10494 msg.bodyptr = NULL;
10495 msg.type = WMA_POWER_DEBUG_STATS_REQ;
gaurank kathpalia36b0c582018-08-28 17:45:43 +053010496 status = scheduler_post_message(QDF_MODULE_ID_SME,
10497 QDF_MODULE_ID_WMA,
10498 QDF_MODULE_ID_WMA, &msg);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053010499 if (!QDF_IS_STATUS_SUCCESS(status))
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070010500 sme_err("not able to post WDA_POWER_DEBUG_STATS_REQ");
Sridhar Selvarajdc400d22016-10-18 17:18:03 +053010501 sme_release_global_lock(&mac_ctx->sme);
10502 }
10503 return status;
10504}
10505#endif
10506
Arunk Khandavallica56d4b2018-11-29 15:46:00 +053010507#ifdef WLAN_FEATURE_BEACON_RECEPTION_STATS
10508QDF_STATUS sme_beacon_debug_stats_req(
10509 mac_handle_t mac_handle, uint32_t vdev_id,
10510 void (*callback_fn)(struct bcn_reception_stats_rsp
10511 *response, void *context),
10512 void *beacon_stats_context)
10513{
10514 QDF_STATUS status;
10515 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
10516 uint32_t *val;
10517 struct scheduler_msg msg = {0};
10518
10519 status = sme_acquire_global_lock(&mac_ctx->sme);
10520 if (QDF_IS_STATUS_SUCCESS(status)) {
10521 if (!callback_fn) {
10522 sme_err("Indication callback did not registered");
10523 sme_release_global_lock(&mac_ctx->sme);
10524 return QDF_STATUS_E_FAILURE;
10525 }
10526
Sourav Mohapatrac55bdf32018-12-13 16:16:50 +053010527 if (!mac_ctx->bcn_reception_stats &&
10528 !mac_ctx->mlme_cfg->gen.enable_beacon_reception_stats) {
10529 sme_err("Beacon Reception stats not supported");
Arunk Khandavallica56d4b2018-11-29 15:46:00 +053010530 sme_release_global_lock(&mac_ctx->sme);
10531 return QDF_STATUS_E_NOSUPPORT;
10532 }
10533
10534 val = qdf_mem_malloc(sizeof(*val));
10535 if (!val) {
10536 sme_release_global_lock(&mac_ctx->sme);
10537 return QDF_STATUS_E_NOMEM;
10538 }
10539
10540 *val = vdev_id;
10541 mac_ctx->sme.beacon_stats_context = beacon_stats_context;
10542 mac_ctx->sme.beacon_stats_resp_callback = callback_fn;
10543 msg.bodyptr = val;
10544 msg.type = WMA_BEACON_DEBUG_STATS_REQ;
10545 status = scheduler_post_message(QDF_MODULE_ID_SME,
10546 QDF_MODULE_ID_WMA,
10547 QDF_MODULE_ID_WMA, &msg);
10548 if (!QDF_IS_STATUS_SUCCESS(status)) {
10549 sme_err("not able to post WMA_BEACON_DEBUG_STATS_REQ");
10550 qdf_mem_free(val);
10551 }
10552 sme_release_global_lock(&mac_ctx->sme);
10553 }
10554 return status;
10555}
10556#endif
10557
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010558#ifdef WLAN_FEATURE_ROAM_OFFLOAD
Deepak Dhamdheref2a7d8b2016-08-19 16:17:38 -070010559/**
10560 * sme_update_roam_key_mgmt_offload_enabled() - enable/disable key mgmt offload
10561 * This is a synchronous call
Jeff Johnsond5fb2db2018-11-08 14:20:28 -080010562 * @mac_handle: The handle returned by mac_open.
Deepak Dhamdheref2a7d8b2016-08-19 16:17:38 -070010563 * @session_id: Session Identifier
10564 * @key_mgmt_offload_enabled: key mgmt enable/disable flag
Deepak Dhamdhere828f1892017-02-09 11:51:19 -080010565 * @pmkid_modes: PMKID modes of PMKSA caching and OKC
Deepak Dhamdheref2a7d8b2016-08-19 16:17:38 -070010566 * Return: QDF_STATUS_SUCCESS - SME updated config successfully.
10567 * Other status means SME is failed to update.
10568 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010569
Jeff Johnsond5fb2db2018-11-08 14:20:28 -080010570QDF_STATUS sme_update_roam_key_mgmt_offload_enabled(mac_handle_t mac_handle,
Deepak Dhamdhere828f1892017-02-09 11:51:19 -080010571 uint8_t session_id,
10572 bool key_mgmt_offload_enabled,
10573 struct pmkid_mode_bits *pmkid_modes)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010574{
Jeff Johnson0a8786a2018-12-02 10:49:01 -080010575 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010576 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010577
Deepak Dhamdheref2a7d8b2016-08-19 16:17:38 -070010578 status = sme_acquire_global_lock(&mac_ctx->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010579 if (QDF_IS_STATUS_SUCCESS(status)) {
Deepak Dhamdheref2a7d8b2016-08-19 16:17:38 -070010580 if (CSR_IS_SESSION_VALID(mac_ctx, session_id)) {
Abhishek Singhe4a1f882017-08-10 17:59:44 +053010581 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Deepak Dhamdheref2a7d8b2016-08-19 16:17:38 -070010582 "%s: LFR3: key_mgmt_offload_enabled changed to %d",
10583 __func__, key_mgmt_offload_enabled);
10584 status = csr_roam_set_key_mgmt_offload(mac_ctx,
10585 session_id,
10586 key_mgmt_offload_enabled,
Deepak Dhamdhere828f1892017-02-09 11:51:19 -080010587 pmkid_modes);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053010588 } else
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010589 status = QDF_STATUS_E_INVAL;
Deepak Dhamdheref2a7d8b2016-08-19 16:17:38 -070010590 sme_release_global_lock(&mac_ctx->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010591 }
10592
10593 return status;
10594}
Prashanth Bhattabfc25292015-11-05 11:16:21 -080010595#endif
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010596
Jeff Johnson3f3ad252019-02-17 20:44:11 -080010597/**
10598 * sme_get_temperature() - SME API to get the pdev temperature
10599 * @mac_handle: Handle to global MAC context
10600 * @cb_context: temperature callback context
10601 * @cb: callback function with response (temperature)
10602 * Return: QDF_STATUS
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053010603 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -080010604QDF_STATUS sme_get_temperature(mac_handle_t mac_handle,
Jeff Johnson3f3ad252019-02-17 20:44:11 -080010605 void *cb_context,
10606 void (*cb)(int temperature,
10607 void *context))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010608{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010609 QDF_STATUS status = QDF_STATUS_SUCCESS;
10610 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080010611 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Rajeev Kumar37d478b2017-04-17 16:59:28 -070010612 struct scheduler_msg message = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010613
Jeff Johnson01f2c232018-11-21 19:17:44 -080010614 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010615 if (QDF_STATUS_SUCCESS == status) {
Jeff Johnson3f3ad252019-02-17 20:44:11 -080010616 if ((!cb) &&
10617 (!mac->sme.temperature_cb)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053010618 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053010619 "Indication Call back did not registered");
Jeff Johnson01f2c232018-11-21 19:17:44 -080010620 sme_release_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010621 return QDF_STATUS_E_FAILURE;
Jeff Johnson3f3ad252019-02-17 20:44:11 -080010622 } else if (cb) {
10623 mac->sme.temperature_cb_context = cb_context;
10624 mac->sme.temperature_cb = cb;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010625 }
10626 /* serialize the req through MC thread */
Rajeev Kumar8eaedf62017-01-21 11:03:13 -080010627 message.bodyptr = NULL;
10628 message.type = WMA_GET_TEMPERATURE_REQ;
gaurank kathpalia36b0c582018-08-28 17:45:43 +053010629 qdf_status = scheduler_post_message(QDF_MODULE_ID_SME,
10630 QDF_MODULE_ID_WMA,
10631 QDF_MODULE_ID_WMA,
10632 &message);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010633 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053010634 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010635 FL("Post Get Temperature msg fail"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010636 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010637 }
Jeff Johnson01f2c232018-11-21 19:17:44 -080010638 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010639 }
10640 return status;
10641}
10642
Jeff Johnsonc7309062018-11-09 20:59:42 -080010643QDF_STATUS sme_set_scanning_mac_oui(mac_handle_t mac_handle,
Jeff Johnson9d45f332019-01-29 08:42:00 -080010644 struct scan_mac_oui *scan_mac_oui)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010645{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010646 QDF_STATUS status = QDF_STATUS_SUCCESS;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080010647 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Rajeev Kumar37d478b2017-04-17 16:59:28 -070010648 struct scheduler_msg message = {0};
Jeff Johnson9d45f332019-01-29 08:42:00 -080010649 struct scan_mac_oui *bodyptr;
10650
10651 /* per contract must make a copy of the params when messaging */
10652 bodyptr = qdf_mem_malloc(sizeof(*bodyptr));
10653 if (!bodyptr)
10654 return QDF_STATUS_E_NOMEM;
10655 *bodyptr = *scan_mac_oui;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010656
Jeff Johnson01f2c232018-11-21 19:17:44 -080010657 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010658 if (QDF_STATUS_SUCCESS == status) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010659 /* Serialize the req through MC thread */
Jeff Johnson9d45f332019-01-29 08:42:00 -080010660 message.bodyptr = bodyptr;
Rajeev Kumar8eaedf62017-01-21 11:03:13 -080010661 message.type = WMA_SET_SCAN_MAC_OUI_REQ;
Jeff Johnson9d45f332019-01-29 08:42:00 -080010662 status = scheduler_post_message(QDF_MODULE_ID_SME,
10663 QDF_MODULE_ID_WMA,
10664 QDF_MODULE_ID_WMA,
10665 &message);
Jeff Johnson01f2c232018-11-21 19:17:44 -080010666 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010667 }
Jeff Johnson9d45f332019-01-29 08:42:00 -080010668
10669 if (QDF_IS_STATUS_ERROR(status)) {
10670 sme_err("failure: %d", status);
10671 qdf_mem_free(bodyptr);
10672 }
10673
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010674 return status;
10675}
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010676
10677#ifdef DHCP_SERVER_OFFLOAD
Jeff Johnson8bfc29e2019-02-15 07:58:15 -080010678QDF_STATUS
10679sme_set_dhcp_srv_offload(mac_handle_t mac_handle,
10680 struct dhcp_offload_info_params *dhcp_srv_info)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010681{
Rajeev Kumar37d478b2017-04-17 16:59:28 -070010682 struct scheduler_msg message = {0};
Jeff Johnson8bfc29e2019-02-15 07:58:15 -080010683 struct dhcp_offload_info_params *payload;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010684 QDF_STATUS status = QDF_STATUS_SUCCESS;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080010685 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010686
Jeff Johnson8bfc29e2019-02-15 07:58:15 -080010687 payload = qdf_mem_malloc(sizeof(*payload));
10688 if (!payload)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010689 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010690
Jeff Johnson8bfc29e2019-02-15 07:58:15 -080010691 *payload = *dhcp_srv_info;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010692
Jeff Johnson01f2c232018-11-21 19:17:44 -080010693 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010694 if (QDF_STATUS_SUCCESS == status) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010695 /* serialize the req through MC thread */
Rajeev Kumar8eaedf62017-01-21 11:03:13 -080010696 message.type = WMA_SET_DHCP_SERVER_OFFLOAD_CMD;
Jeff Johnson8bfc29e2019-02-15 07:58:15 -080010697 message.bodyptr = payload;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010698
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010699 if (!QDF_IS_STATUS_SUCCESS
gaurank kathpalia36b0c582018-08-28 17:45:43 +053010700 (scheduler_post_message(QDF_MODULE_ID_SME,
10701 QDF_MODULE_ID_WMA,
10702 QDF_MODULE_ID_WMA,
10703 &message))) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053010704 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Varun Reddy Yeturu7b2a6572017-06-15 11:07:28 -070010705 "%s:WMA_SET_DHCP_SERVER_OFFLOAD_CMD failed",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010706 __func__);
Jeff Johnson8bfc29e2019-02-15 07:58:15 -080010707 qdf_mem_free(payload);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010708 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010709 }
Jeff Johnson01f2c232018-11-21 19:17:44 -080010710 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010711 } else {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053010712 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010713 "%s: sme_acquire_global_lock error!", __func__);
Jeff Johnson8bfc29e2019-02-15 07:58:15 -080010714 qdf_mem_free(payload);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010715 }
10716
10717 return status;
10718}
10719#endif /* DHCP_SERVER_OFFLOAD */
10720
Krunal Soniaadaa272017-10-04 16:42:55 -070010721QDF_STATUS sme_send_unit_test_cmd(uint32_t vdev_id, uint32_t module_id,
10722 uint32_t arg_count, uint32_t *arg)
10723{
10724 return wma_form_unit_test_cmd_and_send(vdev_id, module_id,
10725 arg_count, arg);
10726}
10727
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010728#ifdef WLAN_FEATURE_GPIO_LED_FLASHING
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053010729/*
10730 * sme_set_led_flashing() -
10731 * API to set the Led flashing parameters.
10732 *
Jeff Johnsonb460dd72018-11-08 10:26:51 -080010733 * mac_handle - The handle returned by mac_open.
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053010734 * x0, x1 - led flashing parameters
10735 * Return QDF_STATUS
10736 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -080010737QDF_STATUS sme_set_led_flashing(mac_handle_t mac_handle, uint8_t type,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010738 uint32_t x0, uint32_t x1)
10739{
Jeff Johnson5a6b6602017-10-04 14:44:30 -070010740 QDF_STATUS status;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080010741 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Rajeev Kumar37d478b2017-04-17 16:59:28 -070010742 struct scheduler_msg message = {0};
Jeff Johnson5a6b6602017-10-04 14:44:30 -070010743 struct flashing_req_params *ledflashing;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010744
Anurag Chouhan600c3a02016-03-01 10:33:54 +053010745 ledflashing = qdf_mem_malloc(sizeof(*ledflashing));
Arif Hussain0ef77082018-10-10 16:42:53 -070010746 if (!ledflashing)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010747 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010748
Jeff Johnson5a6b6602017-10-04 14:44:30 -070010749 ledflashing->req_id = 0;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010750 ledflashing->pattern_id = type;
10751 ledflashing->led_x0 = x0;
10752 ledflashing->led_x1 = x1;
10753
Jeff Johnson01f2c232018-11-21 19:17:44 -080010754 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010755 if (QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010756 /* Serialize the req through MC thread */
Rajeev Kumar8eaedf62017-01-21 11:03:13 -080010757 message.bodyptr = ledflashing;
10758 message.type = WMA_LED_FLASHING_REQ;
gaurank kathpalia36b0c582018-08-28 17:45:43 +053010759 status = scheduler_post_message(QDF_MODULE_ID_SME,
10760 QDF_MODULE_ID_WMA,
10761 QDF_MODULE_ID_WMA, &message);
Jeff Johnson01f2c232018-11-21 19:17:44 -080010762 sme_release_global_lock(&mac->sme);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010763 }
Jeff Johnson5a6b6602017-10-04 14:44:30 -070010764 if (!QDF_IS_STATUS_SUCCESS(status))
10765 qdf_mem_free(ledflashing);
10766
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010767 return status;
10768}
10769#endif
10770
10771/**
Min Liu5eaf7242018-03-13 17:32:15 +080010772 * sme_enable_dfS_chan_scan() - set DFS channel scan enable/disable
Jeff Johnsonb460dd72018-11-08 10:26:51 -080010773 * @mac_handle: corestack handler
Min Liu5eaf7242018-03-13 17:32:15 +080010774 * @dfs_flag: flag indicating dfs channel enable/disable
10775 * Return: QDF_STATUS
10776 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -080010777QDF_STATUS sme_enable_dfs_chan_scan(mac_handle_t mac_handle, uint8_t dfs_flag)
Min Liu5eaf7242018-03-13 17:32:15 +080010778{
10779 QDF_STATUS status = QDF_STATUS_SUCCESS;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080010780 struct mac_context *mac;
Min Liu5eaf7242018-03-13 17:32:15 +080010781
Jeff Johnsonb460dd72018-11-08 10:26:51 -080010782 if (!mac_handle) {
Jeff Johnsonc7309062018-11-09 20:59:42 -080010783 sme_err("mac_handle is NULL");
Min Liu5eaf7242018-03-13 17:32:15 +080010784 return QDF_STATUS_E_INVAL;
10785 }
10786
Jeff Johnsona0619e42018-11-28 17:43:00 -080010787 mac = MAC_CONTEXT(mac_handle);
Min Liu5eaf7242018-03-13 17:32:15 +080010788
10789 mac->scan.fEnableDFSChnlScan = dfs_flag;
10790
10791 return status;
10792}
10793
Edhar, Mahesh Kumardf2ec122015-11-16 11:33:16 +053010794#ifdef FEATURE_WLAN_MCC_TO_SCC_SWITCH
10795/**
10796 * sme_validate_sap_channel_switch() - validate target channel switch w.r.t
10797 * concurreny rules set to avoid channel interference.
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -080010798 * @mac_handle: Opaque handle to the global MAC context
Edhar, Mahesh Kumardf2ec122015-11-16 11:33:16 +053010799 * @sap_ch - channel to switch
10800 * @sap_phy_mode - phy mode of SAP
10801 * @cc_switch_mode - concurreny switch mode
10802 * @session_id - sme session id.
10803 *
10804 * Return: true if there is no channel interference else return false
10805 */
Jeff Johnsonc7309062018-11-09 20:59:42 -080010806bool sme_validate_sap_channel_switch(mac_handle_t mac_handle,
10807 uint16_t sap_ch,
10808 eCsrPhyMode sap_phy_mode,
10809 uint8_t cc_switch_mode,
10810 uint8_t session_id)
Edhar, Mahesh Kumardf2ec122015-11-16 11:33:16 +053010811{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010812 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080010813 struct mac_context *mac = MAC_CONTEXT(mac_handle);
gaurank kathpalia14e2f912017-08-31 14:51:45 +053010814 struct csr_roam_session *session = CSR_GET_SESSION(mac, session_id);
Edhar, Mahesh Kumardf2ec122015-11-16 11:33:16 +053010815 uint16_t intf_channel = 0;
10816
10817 if (!session)
10818 return false;
10819
10820 session->ch_switch_in_progress = true;
10821 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010822 if (QDF_IS_STATUS_SUCCESS(status)) {
Edhar, Mahesh Kumardf2ec122015-11-16 11:33:16 +053010823 intf_channel = csr_check_concurrent_channel_overlap(mac, sap_ch,
10824 sap_phy_mode,
10825 cc_switch_mode);
10826 sme_release_global_lock(&mac->sme);
10827 } else {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053010828 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Edhar, Mahesh Kumardf2ec122015-11-16 11:33:16 +053010829 FL("sme_acquire_global_lock error!"));
10830 session->ch_switch_in_progress = false;
10831 return false;
10832 }
10833
10834 session->ch_switch_in_progress = false;
10835 return (intf_channel == 0) ? true : false;
10836}
10837#endif
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010838
10839/**
10840 * sme_configure_stats_avg_factor() - function to config avg. stats factor
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -080010841 * @mac_handle: Opaque handle to the global MAC context
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010842 * @session_id: session ID
10843 * @stats_avg_factor: average stats factor
10844 *
10845 * This function configures the stats avg factor in firmware
10846 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010847 * Return: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010848 */
Jeff Johnsonc7309062018-11-09 20:59:42 -080010849QDF_STATUS sme_configure_stats_avg_factor(mac_handle_t mac_handle,
10850 uint8_t session_id,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010851 uint16_t stats_avg_factor)
10852{
Rajeev Kumar37d478b2017-04-17 16:59:28 -070010853 struct scheduler_msg msg = {0};
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010854 QDF_STATUS status = QDF_STATUS_SUCCESS;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080010855 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010856 struct sir_stats_avg_factor *stats_factor;
10857
Anurag Chouhan600c3a02016-03-01 10:33:54 +053010858 stats_factor = qdf_mem_malloc(sizeof(*stats_factor));
Arif Hussain0ef77082018-10-10 16:42:53 -070010859 if (!stats_factor)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010860 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010861
10862 status = sme_acquire_global_lock(&mac->sme);
10863
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010864 if (QDF_STATUS_SUCCESS == status) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010865
10866 stats_factor->vdev_id = session_id;
10867 stats_factor->stats_avg_factor = stats_avg_factor;
10868
10869 /* serialize the req through MC thread */
10870 msg.type = SIR_HAL_CONFIG_STATS_FACTOR;
10871 msg.bodyptr = stats_factor;
10872
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010873 if (!QDF_IS_STATUS_SUCCESS(
gaurank kathpalia36b0c582018-08-28 17:45:43 +053010874 scheduler_post_message(QDF_MODULE_ID_SME,
10875 QDF_MODULE_ID_WMA,
10876 QDF_MODULE_ID_WMA, &msg))) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053010877 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010878 "%s: Not able to post SIR_HAL_CONFIG_STATS_FACTOR to WMA!",
10879 __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053010880 qdf_mem_free(stats_factor);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010881 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010882 }
10883 sme_release_global_lock(&mac->sme);
10884 } else {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053010885 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010886 "%s: sme_acquire_global_lock error!",
10887 __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053010888 qdf_mem_free(stats_factor);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010889 }
10890
10891 return status;
10892}
10893
10894/**
10895 * sme_configure_guard_time() - function to configure guard time
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -080010896 * @mac_handle: Opaque handle to the global MAC context
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010897 * @session_id: session id
10898 * @guard_time: guard time
10899 *
10900 * This function configures the guard time in firmware
10901 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010902 * Return: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010903 */
Jeff Johnsonc7309062018-11-09 20:59:42 -080010904QDF_STATUS sme_configure_guard_time(mac_handle_t mac_handle, uint8_t session_id,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010905 uint32_t guard_time)
10906{
Rajeev Kumar37d478b2017-04-17 16:59:28 -070010907 struct scheduler_msg msg = {0};
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010908 QDF_STATUS status = QDF_STATUS_SUCCESS;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080010909 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010910 struct sir_guard_time_request *g_time;
10911
Anurag Chouhan600c3a02016-03-01 10:33:54 +053010912 g_time = qdf_mem_malloc(sizeof(*g_time));
Arif Hussain0ef77082018-10-10 16:42:53 -070010913 if (!g_time)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010914 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010915
10916 status = sme_acquire_global_lock(&mac->sme);
10917
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010918 if (QDF_STATUS_SUCCESS == status) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010919
10920 g_time->vdev_id = session_id;
10921 g_time->guard_time = guard_time;
10922
10923 /* serialize the req through MC thread */
10924 msg.type = SIR_HAL_CONFIG_GUARD_TIME;
10925 msg.bodyptr = g_time;
10926
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010927 if (!QDF_IS_STATUS_SUCCESS(
gaurank kathpalia36b0c582018-08-28 17:45:43 +053010928 scheduler_post_message(QDF_MODULE_ID_SME,
10929 QDF_MODULE_ID_WMA,
10930 QDF_MODULE_ID_WMA, &msg))) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053010931 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010932 "%s: Not able to post SIR_HAL_CONFIG_GUARD_TIME to WMA!",
10933 __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053010934 qdf_mem_free(g_time);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010935 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010936 }
10937 sme_release_global_lock(&mac->sme);
10938 } else {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053010939 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010940 "%s: sme_acquire_global_lock error!",
10941 __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053010942 qdf_mem_free(g_time);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010943 }
10944
10945 return status;
10946}
10947
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010948/*
10949 * sme_wifi_start_logger() - Send the start/stop logging command to WMA
10950 * to either start/stop logging
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -080010951 * @mac_handle: Opaque handle to the global MAC context
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010952 * @start_log: Structure containing the wifi start logger params
10953 *
10954 * This function sends the start/stop logging command to WMA
10955 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010956 * Return: QDF_STATUS_SUCCESS on successful posting
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010957 */
Jeff Johnsonc7309062018-11-09 20:59:42 -080010958QDF_STATUS sme_wifi_start_logger(mac_handle_t mac_handle,
10959 struct sir_wifi_start_log start_log)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010960{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010961 QDF_STATUS status = QDF_STATUS_SUCCESS;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080010962 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Rajeev Kumar37d478b2017-04-17 16:59:28 -070010963 struct scheduler_msg message = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010964 struct sir_wifi_start_log *req_msg;
10965 uint32_t len;
10966
10967 len = sizeof(*req_msg);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053010968 req_msg = qdf_mem_malloc(len);
Arif Hussain0ef77082018-10-10 16:42:53 -070010969 if (!req_msg)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010970 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010971
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010972 req_msg->verbose_level = start_log.verbose_level;
Poddar, Siddartheefe3482016-09-21 18:12:59 +053010973 req_msg->is_iwpriv_command = start_log.is_iwpriv_command;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010974 req_msg->ring_id = start_log.ring_id;
Srinivas Girigowdac34f11d2016-02-25 16:02:42 -080010975 req_msg->ini_triggered = start_log.ini_triggered;
10976 req_msg->user_triggered = start_log.user_triggered;
Poddar, Siddarth176c4362016-10-03 12:25:00 +053010977 req_msg->size = start_log.size;
Poddar, Siddarthab99a272017-04-10 12:53:26 +053010978 req_msg->is_pktlog_buff_clear = start_log.is_pktlog_buff_clear;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010979
10980 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010981 if (status != QDF_STATUS_SUCCESS) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070010982 sme_err("sme_acquire_global_lock failed(status=%d)", status);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053010983 qdf_mem_free(req_msg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010984 return status;
10985 }
10986
10987 /* Serialize the req through MC thread */
Rajeev Kumar8eaedf62017-01-21 11:03:13 -080010988 message.bodyptr = req_msg;
10989 message.type = SIR_HAL_START_STOP_LOGGING;
gaurank kathpalia36b0c582018-08-28 17:45:43 +053010990 status = scheduler_post_message(QDF_MODULE_ID_SME,
10991 QDF_MODULE_ID_WMA,
10992 QDF_MODULE_ID_WMA, &message);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010993 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070010994 sme_err("scheduler_post_msg failed!(err=%d)", status);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053010995 qdf_mem_free(req_msg);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010996 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010997 }
10998 sme_release_global_lock(&mac->sme);
10999
11000 return status;
11001}
11002
11003/**
11004 * sme_neighbor_middle_of_roaming() - Function to know if
11005 * STA is in the middle of roaming states
Jeff Johnsonc7309062018-11-09 20:59:42 -080011006 * @mac_handle: Handle returned by macOpen
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011007 * @sessionId: sessionId of the STA session
11008 *
11009 * This function is a wrapper to call
11010 * csr_neighbor_middle_of_roaming to know STA is in the
11011 * middle of roaming states
11012 *
11013 * Return: True or False
11014 *
11015 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -080011016bool sme_neighbor_middle_of_roaming(mac_handle_t mac_handle, uint8_t sessionId)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011017{
Jeff Johnson0a8786a2018-12-02 10:49:01 -080011018 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Sandeep Puligillaca631612016-11-08 11:53:52 -080011019 bool val = false;
11020
11021 if (CSR_IS_SESSION_VALID(mac_ctx, sessionId))
11022 val = csr_neighbor_middle_of_roaming(mac_ctx, sessionId);
11023 else
Rajeev Kumar9176ca42018-05-03 09:20:40 -070011024 sme_debug("Invalid Session: %d", sessionId);
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070011025
Sandeep Puligillaca631612016-11-08 11:53:52 -080011026 return val;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011027}
11028
Jeff Johnsonc7309062018-11-09 20:59:42 -080011029bool sme_is_any_session_in_middle_of_roaming(mac_handle_t mac_handle)
Padma, Santhosh Kumar86747ec2018-05-29 18:28:29 +053011030{
Jeff Johnson0a8786a2018-12-02 10:49:01 -080011031 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Padma, Santhosh Kumar86747ec2018-05-29 18:28:29 +053011032 uint8_t session_id;
11033
Dustin Brownad06be62019-02-04 14:52:56 -080011034 for (session_id = 0; session_id < WLAN_MAX_VDEVS; session_id++) {
Padma, Santhosh Kumar86747ec2018-05-29 18:28:29 +053011035 if (CSR_IS_SESSION_VALID(mac_ctx, session_id) &&
11036 csr_neighbor_middle_of_roaming(mac_ctx, session_id))
11037 return true;
11038 }
11039
11040 return false;
11041}
11042
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011043/*
11044 * sme_send_flush_logs_cmd_to_fw() - Flush FW logs
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011045 *
11046 * This function is used to send the command that will
11047 * be used to flush the logs in the firmware
11048 *
Deepak Dhamdhere0f076bd2016-06-02 11:29:21 -070011049 * Return: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011050 */
Jeff Johnson40894142018-11-17 12:05:54 -080011051QDF_STATUS sme_send_flush_logs_cmd_to_fw(void)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011052{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011053 QDF_STATUS status;
Rajeev Kumar37d478b2017-04-17 16:59:28 -070011054 struct scheduler_msg message = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011055
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011056 /* Serialize the req through MC thread */
11057 message.bodyptr = NULL;
11058 message.type = SIR_HAL_FLUSH_LOG_TO_FW;
gaurank kathpalia36b0c582018-08-28 17:45:43 +053011059 status = scheduler_post_message(QDF_MODULE_ID_SME,
11060 QDF_MODULE_ID_WMA,
11061 QDF_MODULE_ID_WMA, &message);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011062 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070011063 sme_err("scheduler_post_msg failed!(err=%d)", status);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011064 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011065 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011066 return status;
11067}
11068
Jeff Johnsona1e92612017-09-24 15:33:44 -070011069QDF_STATUS sme_enable_uapsd_for_ac(uint8_t sta_id,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011070 sme_ac_enum_type ac, uint8_t tid,
11071 uint8_t pri, uint32_t srvc_int,
11072 uint32_t sus_int,
Abhishek Singh12be60f2017-08-11 13:52:42 +053011073 enum sme_qos_wmm_dir_type dir,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011074 uint8_t psb, uint32_t sessionId,
11075 uint32_t delay_interval)
11076{
11077 void *wma_handle;
11078 t_wma_trigger_uapsd_params uapsd_params;
11079 enum uapsd_ac access_category;
11080
11081 if (!psb) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053011082 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011083 "No need to configure auto trigger:psb is 0");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011084 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011085 }
11086
Anurag Chouhan6d760662016-02-20 16:05:43 +053011087 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011088 if (!wma_handle) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053011089 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011090 "wma_handle is NULL");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011091 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011092 }
11093
11094 switch (ac) {
11095 case SME_AC_BK:
11096 access_category = UAPSD_BK;
11097 break;
11098 case SME_AC_BE:
11099 access_category = UAPSD_BE;
11100 break;
11101 case SME_AC_VI:
11102 access_category = UAPSD_VI;
11103 break;
11104 case SME_AC_VO:
11105 access_category = UAPSD_VO;
11106 break;
11107 default:
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011108 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011109 }
11110
11111 uapsd_params.wmm_ac = access_category;
11112 uapsd_params.user_priority = pri;
11113 uapsd_params.service_interval = srvc_int;
11114 uapsd_params.delay_interval = delay_interval;
11115 uapsd_params.suspend_interval = sus_int;
11116
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011117 if (QDF_STATUS_SUCCESS !=
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011118 wma_trigger_uapsd_params(wma_handle, sessionId, &uapsd_params)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053011119 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011120 "Failed to Trigger Uapsd params for sessionId %d",
11121 sessionId);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011122 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011123 }
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011124 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011125}
11126
Jeff Johnsona1e92612017-09-24 15:33:44 -070011127QDF_STATUS sme_disable_uapsd_for_ac(uint8_t sta_id,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011128 sme_ac_enum_type ac,
11129 uint32_t sessionId)
11130{
11131 void *wma_handle;
11132 enum uapsd_ac access_category;
11133
11134 switch (ac) {
11135 case SME_AC_BK:
11136 access_category = UAPSD_BK;
11137 break;
11138 case SME_AC_BE:
11139 access_category = UAPSD_BE;
11140 break;
11141 case SME_AC_VI:
11142 access_category = UAPSD_VI;
11143 break;
11144 case SME_AC_VO:
11145 access_category = UAPSD_VO;
11146 break;
11147 default:
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011148 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011149 }
11150
Anurag Chouhan6d760662016-02-20 16:05:43 +053011151 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011152 if (!wma_handle) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053011153 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011154 "wma handle is NULL");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011155 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011156 }
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011157 if (QDF_STATUS_SUCCESS !=
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011158 wma_disable_uapsd_per_ac(wma_handle, sessionId, access_category)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053011159 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011160 "Failed to disable uapsd for ac %d for sessionId %d",
11161 ac, sessionId);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011162 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011163 }
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011164 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011165}
11166
11167/**
11168 * sme_update_nss() - SME API to change the number for spatial streams
11169 * (1 or 2)
Jeff Johnsonc7309062018-11-09 20:59:42 -080011170 * @mac_handle: Handle returned by mac open
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011171 * @nss: Number of spatial streams
11172 *
11173 * This function is used to update the number of spatial streams supported.
11174 *
11175 * Return: Success upon successfully changing nss else failure
11176 *
11177 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -080011178QDF_STATUS sme_update_nss(mac_handle_t mac_handle, uint8_t nss)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011179{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011180 QDF_STATUS status;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080011181 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Vignesh Viswanathan21c58cb2018-05-24 15:53:58 +053011182 uint32_t i;
11183 struct mlme_ht_capabilities_info *ht_cap_info;
gaurank kathpalia14e2f912017-08-31 14:51:45 +053011184 struct csr_roam_session *csr_session;
Abhinav Kumard4d6eb72018-12-04 20:30:37 +053011185 struct mlme_vht_capabilities_info *vht_cap_info;
Abhinav Kumarb074f2f2018-09-15 15:32:11 +053011186
Abhinav Kumard4d6eb72018-12-04 20:30:37 +053011187 vht_cap_info = &mac_ctx->mlme_cfg->vht_caps.vht_cap_info;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011188
11189 status = sme_acquire_global_lock(&mac_ctx->sme);
11190
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011191 if (QDF_STATUS_SUCCESS == status) {
Abhinav Kumard4d6eb72018-12-04 20:30:37 +053011192 vht_cap_info->enable2x2 = (nss == 1) ? 0 : 1;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011193
11194 /* get the HT capability info*/
Vignesh Viswanathan21c58cb2018-05-24 15:53:58 +053011195 ht_cap_info = &mac_ctx->mlme_cfg->ht_caps.ht_cap_info;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011196
Dustin Brownad06be62019-02-04 14:52:56 -080011197 for (i = 0; i < WLAN_MAX_VDEVS; i++) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011198 if (CSR_IS_SESSION_VALID(mac_ctx, i)) {
11199 csr_session = &mac_ctx->roam.roamSession[i];
Jeff Johnsonbe119e62019-02-02 12:30:26 -080011200 csr_session->ht_config.ht_tx_stbc =
Vignesh Viswanathan78182502018-08-06 15:13:30 +053011201 ht_cap_info->tx_stbc;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011202 }
11203 }
11204
11205 sme_release_global_lock(&mac_ctx->sme);
11206 }
11207 return status;
11208}
11209
11210/**
Archana Ramachandran5041b252016-04-25 14:29:25 -070011211 * sme_update_user_configured_nss() - sets the nss based on user request
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -080011212 * @mac_handle: Opaque handle to the global MAC context
Archana Ramachandran5041b252016-04-25 14:29:25 -070011213 * @nss: number of streams
11214 *
11215 * Return: None
11216 */
Jeff Johnsonc7309062018-11-09 20:59:42 -080011217void sme_update_user_configured_nss(mac_handle_t mac_handle, uint8_t nss)
Archana Ramachandran5041b252016-04-25 14:29:25 -070011218{
Jeff Johnson0a8786a2018-12-02 10:49:01 -080011219 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Archana Ramachandran5041b252016-04-25 14:29:25 -070011220
11221 mac_ctx->user_configured_nss = nss;
11222}
11223
Jeff Johnsonc7309062018-11-09 20:59:42 -080011224int sme_update_tx_bfee_supp(mac_handle_t mac_handle, uint8_t session_id,
Kiran Kumar Lokere6c7f3fa2018-05-14 18:12:27 -070011225 uint8_t cfg_val)
11226{
Jeff Johnson0a8786a2018-12-02 10:49:01 -080011227 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Jeff Johnsonc18469b2018-06-11 06:48:59 -070011228
Abhinav Kumarb074f2f2018-09-15 15:32:11 +053011229 mac_ctx->mlme_cfg->vht_caps.vht_cap_info.su_bformee = cfg_val;
Kiran Kumar Lokere6c7f3fa2018-05-14 18:12:27 -070011230
Jeff Johnsonc7309062018-11-09 20:59:42 -080011231 return sme_update_he_tx_bfee_supp(mac_handle, session_id, cfg_val);
Kiran Kumar Lokere6c7f3fa2018-05-14 18:12:27 -070011232}
Kiran Kumar Lokeref3044852018-06-27 14:14:24 -070011233
Jeff Johnsonc7309062018-11-09 20:59:42 -080011234int sme_update_tx_bfee_nsts(mac_handle_t mac_handle, uint8_t session_id,
Kiran Kumar Lokeref3044852018-06-27 14:14:24 -070011235 uint8_t usr_cfg_val, uint8_t nsts_val)
11236{
Jeff Johnson0a8786a2018-12-02 10:49:01 -080011237 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Kiran Kumar Lokeref3044852018-06-27 14:14:24 -070011238 uint8_t nsts_set_val;
Abhinav Kumard4d6eb72018-12-04 20:30:37 +053011239 struct mlme_vht_capabilities_info *vht_cap_info;
Kiran Kumar Lokeref3044852018-06-27 14:14:24 -070011240
Abhinav Kumard4d6eb72018-12-04 20:30:37 +053011241 vht_cap_info = &mac_ctx->mlme_cfg->vht_caps.vht_cap_info;
Kiran Kumar Lokeref3044852018-06-27 14:14:24 -070011242 mac_ctx->usr_cfg_tx_bfee_nsts = usr_cfg_val;
11243 if (usr_cfg_val)
11244 nsts_set_val = usr_cfg_val;
11245 else
11246 nsts_set_val = nsts_val;
Dustin Brown48f27fe2018-10-09 12:47:57 -070011247
Abhinav Kumard4d6eb72018-12-04 20:30:37 +053011248 vht_cap_info->tx_bfee_ant_supp = nsts_set_val;
Kiran Kumar Lokeref3044852018-06-27 14:14:24 -070011249
Kiran Kumar Lokere86e85592018-07-18 15:34:24 -070011250 if (usr_cfg_val)
11251 sme_set_he_tx_bf_cbf_rates(session_id);
11252
Jeff Johnsonc7309062018-11-09 20:59:42 -080011253 return sme_update_he_tx_bfee_nsts(mac_handle, session_id, nsts_set_val);
Kiran Kumar Lokeref3044852018-06-27 14:14:24 -070011254}
Kiran Kumar Lokere44a29432018-01-24 16:10:30 -080011255#ifdef WLAN_FEATURE_11AX
Jinwei Chenffaa4672018-08-30 16:55:09 +080011256void sme_update_tgt_he_cap(mac_handle_t mac_handle,
11257 struct wma_tgt_cfg *cfg,
11258 tDot11fIEhe_cap *he_cap_ini)
Jinwei Chen998a1a02018-06-20 17:20:34 +080011259{
Jeff Johnson0a8786a2018-12-02 10:49:01 -080011260 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Jinwei Chen998a1a02018-06-20 17:20:34 +080011261
11262 qdf_mem_copy(&mac_ctx->he_cap_2g,
Jinwei Chenef742dc2018-06-27 12:57:50 +080011263 &cfg->he_cap_2g,
11264 sizeof(tDot11fIEhe_cap));
Jinwei Chen998a1a02018-06-20 17:20:34 +080011265
11266 qdf_mem_copy(&mac_ctx->he_cap_5g,
Jinwei Chenef742dc2018-06-27 12:57:50 +080011267 &cfg->he_cap_5g,
11268 sizeof(tDot11fIEhe_cap));
Jinwei Chenffaa4672018-08-30 16:55:09 +080011269
11270 /* modify HE Caps field according to INI setting */
11271 mac_ctx->he_cap_2g.bfee_sts_lt_80 =
11272 QDF_MIN(cfg->he_cap_2g.bfee_sts_lt_80,
11273 he_cap_ini->bfee_sts_lt_80);
11274
11275 mac_ctx->he_cap_5g.bfee_sts_lt_80 =
11276 QDF_MIN(cfg->he_cap_5g.bfee_sts_lt_80,
11277 he_cap_ini->bfee_sts_lt_80);
Jinwei Chen998a1a02018-06-20 17:20:34 +080011278}
11279
Jeff Johnsonc7309062018-11-09 20:59:42 -080011280void sme_update_he_cap_nss(mac_handle_t mac_handle, uint8_t session_id,
11281 uint8_t nss)
Kiran Kumar Lokere44a29432018-01-24 16:10:30 -080011282{
Jeff Johnson0a8786a2018-12-02 10:49:01 -080011283 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Kiran Kumar Lokere44a29432018-01-24 16:10:30 -080011284 struct csr_roam_session *csr_session;
11285 uint32_t tx_mcs_map = 0;
11286 uint32_t rx_mcs_map = 0;
Kiran Kumar Lokere8dba1892018-07-24 17:09:52 -070011287 uint32_t mcs_map = 0;
Kiran Kumar Lokere44a29432018-01-24 16:10:30 -080011288
11289 if (!nss || (nss > 2)) {
11290 sme_err("invalid Nss value %d", nss);
11291 }
11292 csr_session = CSR_GET_SESSION(mac_ctx, session_id);
Bala Venkatesh6d537092018-09-25 10:38:36 +053011293 rx_mcs_map =
11294 mac_ctx->mlme_cfg->he_caps.dot11_he_cap.rx_he_mcs_map_lt_80;
11295 tx_mcs_map =
11296 mac_ctx->mlme_cfg->he_caps.dot11_he_cap.tx_he_mcs_map_lt_80;
Kiran Kumar Lokere8dba1892018-07-24 17:09:52 -070011297 mcs_map = rx_mcs_map & 0x3;
Bala Venkatesh6d537092018-09-25 10:38:36 +053011298
Kiran Kumar Lokere44a29432018-01-24 16:10:30 -080011299 if (nss == 1) {
11300 tx_mcs_map = HE_SET_MCS_4_NSS(tx_mcs_map, HE_MCS_DISABLE, 2);
11301 rx_mcs_map = HE_SET_MCS_4_NSS(rx_mcs_map, HE_MCS_DISABLE, 2);
11302 } else {
Kiran Kumar Lokere8dba1892018-07-24 17:09:52 -070011303 tx_mcs_map = HE_SET_MCS_4_NSS(tx_mcs_map, mcs_map, 2);
11304 rx_mcs_map = HE_SET_MCS_4_NSS(rx_mcs_map, mcs_map, 2);
Kiran Kumar Lokere44a29432018-01-24 16:10:30 -080011305 }
11306 sme_info("new HE Nss MCS MAP: Rx 0x%0X, Tx: 0x%0X",
11307 rx_mcs_map, tx_mcs_map);
Bala Venkatesh6d537092018-09-25 10:38:36 +053011308 if (cfg_in_range(CFG_HE_RX_MCS_MAP_LT_80, rx_mcs_map))
11309 mac_ctx->mlme_cfg->he_caps.dot11_he_cap.rx_he_mcs_map_lt_80 =
11310 rx_mcs_map;
11311 if (cfg_in_range(CFG_HE_TX_MCS_MAP_LT_80, tx_mcs_map))
11312 mac_ctx->mlme_cfg->he_caps.dot11_he_cap.tx_he_mcs_map_lt_80 =
11313 tx_mcs_map;
Kiran Kumar Lokere44a29432018-01-24 16:10:30 -080011314 csr_update_session_he_cap(mac_ctx, csr_session);
11315
11316}
Kiran Kumar Lokere96246e52018-01-24 16:44:35 -080011317
Jeff Johnsonc7309062018-11-09 20:59:42 -080011318int sme_update_he_mcs(mac_handle_t mac_handle, uint8_t session_id,
11319 uint16_t he_mcs)
Kiran Kumar Lokere96246e52018-01-24 16:44:35 -080011320{
Jeff Johnson0a8786a2018-12-02 10:49:01 -080011321 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Kiran Kumar Lokere96246e52018-01-24 16:44:35 -080011322 struct csr_roam_session *csr_session;
11323 uint16_t mcs_val = 0;
11324 uint16_t mcs_map = HE_MCS_ALL_DISABLED;
Kiran Kumar Lokere96246e52018-01-24 16:44:35 -080011325
11326 csr_session = CSR_GET_SESSION(mac_ctx, session_id);
11327 if (!csr_session) {
11328 sme_err("No session for id %d", session_id);
11329 return -EINVAL;
11330 }
11331 if ((he_mcs & 0x3) == HE_MCS_DISABLE) {
11332 sme_err("Invalid HE MCS 0x%0x, can't disable 0-7 for 1ss",
11333 he_mcs);
11334 return -EINVAL;
11335 }
11336 mcs_val = he_mcs & 0x3;
11337 switch (he_mcs) {
11338 case HE_80_MCS0_7:
11339 case HE_80_MCS0_9:
11340 case HE_80_MCS0_11:
Abhinav Kumarb074f2f2018-09-15 15:32:11 +053011341 if (mac_ctx->mlme_cfg->vht_caps.vht_cap_info.enable2x2) {
Kiran Kumar Lokere96246e52018-01-24 16:44:35 -080011342 mcs_map = HE_SET_MCS_4_NSS(mcs_map, mcs_val, 1);
11343 mcs_map = HE_SET_MCS_4_NSS(mcs_map, mcs_val, 2);
11344 } else {
11345 mcs_map = HE_SET_MCS_4_NSS(mcs_map, mcs_val, 1);
11346 }
Bala Venkatesh6d537092018-09-25 10:38:36 +053011347 if (cfg_in_range(CFG_HE_TX_MCS_MAP_LT_80, mcs_map))
11348 mac_ctx->mlme_cfg->he_caps.dot11_he_cap.
11349 tx_he_mcs_map_lt_80 = mcs_map;
11350 if (cfg_in_range(CFG_HE_RX_MCS_MAP_LT_80, mcs_map))
11351 mac_ctx->mlme_cfg->he_caps.dot11_he_cap.
11352 rx_he_mcs_map_lt_80 = mcs_map;
Kiran Kumar Lokere96246e52018-01-24 16:44:35 -080011353 break;
11354
11355 case HE_160_MCS0_7:
11356 case HE_160_MCS0_9:
11357 case HE_160_MCS0_11:
11358 mcs_map = HE_SET_MCS_4_NSS(mcs_map, mcs_val, 1);
Bala Venkatesh6d537092018-09-25 10:38:36 +053011359 if (cfg_in_range(CFG_HE_TX_MCS_MAP_160, mcs_map))
11360 qdf_mem_copy(mac_ctx->mlme_cfg->he_caps.dot11_he_cap.
11361 tx_he_mcs_map_160, &mcs_map,
11362 sizeof(uint16_t));
11363 if (cfg_in_range(CFG_HE_RX_MCS_MAP_160, mcs_map))
11364 qdf_mem_copy(mac_ctx->mlme_cfg->he_caps.dot11_he_cap.
11365 rx_he_mcs_map_160, &mcs_map,
11366 sizeof(uint16_t));
Kiran Kumar Lokere96246e52018-01-24 16:44:35 -080011367 break;
11368
11369 case HE_80p80_MCS0_7:
11370 case HE_80p80_MCS0_9:
11371 case HE_80p80_MCS0_11:
11372 mcs_map = HE_SET_MCS_4_NSS(mcs_map, mcs_val, 1);
Bala Venkatesh6d537092018-09-25 10:38:36 +053011373 if (cfg_in_range(CFG_HE_TX_MCS_MAP_80_80, mcs_map))
11374 qdf_mem_copy(mac_ctx->mlme_cfg->he_caps.dot11_he_cap.
11375 tx_he_mcs_map_80_80, &mcs_map,
11376 sizeof(uint16_t));
11377 if (cfg_in_range(CFG_HE_RX_MCS_MAP_80_80, mcs_map))
11378 qdf_mem_copy(mac_ctx->mlme_cfg->he_caps.dot11_he_cap.
11379 rx_he_mcs_map_80_80, &mcs_map,
11380 sizeof(uint16_t));
Kiran Kumar Lokere96246e52018-01-24 16:44:35 -080011381 break;
11382
11383 default:
11384 sme_err("Invalid HE MCS 0x%0x", he_mcs);
11385 return -EINVAL;
11386 }
11387 sme_info("new HE MCS 0x%0x", mcs_map);
Kiran Kumar Lokere96246e52018-01-24 16:44:35 -080011388 csr_update_session_he_cap(mac_ctx, csr_session);
11389
11390 return 0;
11391}
Kiran Kumar Lokere13dedac2018-02-05 19:51:59 -080011392
Jeff Johnsonc7309062018-11-09 20:59:42 -080011393void sme_set_usr_cfg_mu_edca(mac_handle_t mac_handle, bool val)
Kiran Kumar Lokeref54b8552018-07-10 00:53:38 -070011394{
Jeff Johnson0a8786a2018-12-02 10:49:01 -080011395 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Kiran Kumar Lokeref54b8552018-07-10 00:53:38 -070011396
11397 mac_ctx->usr_cfg_mu_edca_params = val;
11398}
11399
Jeff Johnsonc7309062018-11-09 20:59:42 -080011400int sme_update_mu_edca_params(mac_handle_t mac_handle, uint8_t session_id)
Kiran Kumar Lokerefba20632018-07-05 16:51:27 -070011401{
11402 struct scheduler_msg msg = {0};
11403 QDF_STATUS status;
11404
11405 qdf_mem_zero(&msg, sizeof(msg));
11406 msg.type = WNI_SME_UPDATE_MU_EDCA_PARAMS;
11407 msg.reserved = 0;
11408 msg.bodyval = session_id;
gaurank kathpalia36b0c582018-08-28 17:45:43 +053011409 status = scheduler_post_message(QDF_MODULE_ID_SME,
11410 QDF_MODULE_ID_PE,
11411 QDF_MODULE_ID_PE, &msg);
Kiran Kumar Lokerefba20632018-07-05 16:51:27 -070011412 if (status != QDF_STATUS_SUCCESS) {
11413 sme_err("Not able to post update edca profile");
11414 return -EIO;
11415 }
11416
11417 return 0;
11418}
Jeff Johnsonc7309062018-11-09 20:59:42 -080011419
11420void sme_set_he_mu_edca_def_cfg(mac_handle_t mac_handle)
Kiran Kumar Lokerefba20632018-07-05 16:51:27 -070011421{
Jeff Johnson0a8786a2018-12-02 10:49:01 -080011422 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Kiran Kumar Lokerefba20632018-07-05 16:51:27 -070011423 uint8_t i;
11424
Kiran Kumar Lokere8dba1892018-07-24 17:09:52 -070011425 sme_debug("Set MU EDCA params to default");
Srinivas Girigowda5b86fbd2019-03-21 14:54:14 -070011426 for (i = 0; i < QCA_WLAN_AC_ALL; i++) {
Kiran Kumar Lokerefba20632018-07-05 16:51:27 -070011427 mac_ctx->usr_mu_edca_params[i].aci.aifsn = MU_EDCA_DEF_AIFSN;
11428 mac_ctx->usr_mu_edca_params[i].aci.aci = i;
11429 mac_ctx->usr_mu_edca_params[i].cw.max = MU_EDCA_DEF_CW_MAX;
11430 mac_ctx->usr_mu_edca_params[i].cw.min = MU_EDCA_DEF_CW_MIN;
11431 mac_ctx->usr_mu_edca_params[i].mu_edca_timer =
11432 MU_EDCA_DEF_TIMER;
11433 }
11434}
11435
Jeff Johnsonc7309062018-11-09 20:59:42 -080011436int sme_update_he_tx_bfee_supp(mac_handle_t mac_handle, uint8_t session_id,
Kiran Kumar Lokere6c7f3fa2018-05-14 18:12:27 -070011437 uint8_t cfg_val)
11438{
Jeff Johnson0a8786a2018-12-02 10:49:01 -080011439 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Bala Venkatesh6d537092018-09-25 10:38:36 +053011440 struct csr_roam_session *session;
11441
11442 session = CSR_GET_SESSION(mac_ctx, session_id);
11443
11444 if (!session) {
11445 sme_err("No session for id %d", session_id);
11446 return -EINVAL;
11447 }
11448 if (cfg_val <= 1)
11449 mac_ctx->mlme_cfg->he_caps.dot11_he_cap.su_beamformee = cfg_val;
11450 else
11451 return -EINVAL;
11452
11453 csr_update_session_he_cap(mac_ctx, session);
11454 return 0;
Kiran Kumar Lokere6c7f3fa2018-05-14 18:12:27 -070011455}
11456
Jeff Johnsonc7309062018-11-09 20:59:42 -080011457int sme_update_he_trigger_frm_mac_pad(mac_handle_t mac_handle,
11458 uint8_t session_id,
Kiran Kumar Lokeref54b8552018-07-10 00:53:38 -070011459 uint8_t cfg_val)
11460{
Jeff Johnson0a8786a2018-12-02 10:49:01 -080011461 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Bala Venkatesh6d537092018-09-25 10:38:36 +053011462 struct csr_roam_session *session;
11463
11464 session = CSR_GET_SESSION(mac_ctx, session_id);
11465
11466 if (!session) {
11467 sme_err("No session for id %d", session_id);
11468 return -EINVAL;
11469 }
11470 if (cfg_in_range(CFG_HE_TRIG_PAD, cfg_val))
11471 mac_ctx->mlme_cfg->he_caps.dot11_he_cap.trigger_frm_mac_pad =
11472 cfg_val;
11473 else
11474 return -EINVAL;
11475
11476 csr_update_session_he_cap(mac_ctx, session);
11477 return 0;
11478
Kiran Kumar Lokeref54b8552018-07-10 00:53:38 -070011479}
11480
Jeff Johnsonc7309062018-11-09 20:59:42 -080011481int sme_update_he_om_ctrl_supp(mac_handle_t mac_handle, uint8_t session_id,
Kiran Kumar Lokeref1a96f42018-08-29 18:53:47 -070011482 uint8_t cfg_val)
11483{
Bala Venkatesh2fae18a2018-11-14 12:32:45 +053011484
Jeff Johnson0a8786a2018-12-02 10:49:01 -080011485 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Bala Venkatesh2fae18a2018-11-14 12:32:45 +053011486 struct csr_roam_session *session;
11487
11488 session = CSR_GET_SESSION(mac_ctx, session_id);
11489
11490 if (!session) {
11491 sme_err("No session for id %d", session_id);
11492 return -EINVAL;
11493 }
Harprit Chhabada89780bf2019-03-06 14:01:38 -080011494 mac_ctx->mlme_cfg->he_caps.dot11_he_cap.omi_a_ctrl = cfg_val;
Bala Venkatesh2fae18a2018-11-14 12:32:45 +053011495
11496 csr_update_session_he_cap(mac_ctx, session);
11497 return 0;
Kiran Kumar Lokeref1a96f42018-08-29 18:53:47 -070011498}
11499
Kiran Kumar Lokereacd107d2019-01-09 15:02:11 -080011500int sme_update_he_htc_he_supp(mac_handle_t mac_handle, uint8_t session_id,
11501 bool cfg_val)
Kiran Kumar Lokere94634152018-09-24 19:08:35 -070011502{
Kiran Kumar Lokereacd107d2019-01-09 15:02:11 -080011503
Jeff Johnson0a8786a2018-12-02 10:49:01 -080011504 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Kiran Kumar Lokereacd107d2019-01-09 15:02:11 -080011505 struct csr_roam_session *session;
11506
11507 session = CSR_GET_SESSION(mac_ctx, session_id);
Kiran Kumar Lokere94634152018-09-24 19:08:35 -070011508
11509 if (!session) {
Kiran Kumar Lokereacd107d2019-01-09 15:02:11 -080011510 sme_err("No session for id %d", session_id);
Kiran Kumar Lokere94634152018-09-24 19:08:35 -070011511 return -EINVAL;
11512 }
Kiran Kumar Lokereacd107d2019-01-09 15:02:11 -080011513
11514 mac_ctx->mlme_cfg->he_caps.dot11_he_cap.htc_he = cfg_val;
11515 csr_update_session_he_cap(mac_ctx, session);
11516
11517 return 0;
11518}
11519
11520static QDF_STATUS
11521sme_validate_session_for_cap_update(struct mac_context *mac_ctx,
11522 uint8_t session_id,
11523 struct csr_roam_session *session)
11524{
11525 if (!session) {
11526 sme_err("Session does not exist, Session_id: %d", session_id);
11527 return QDF_STATUS_E_INVAL;
11528 }
Kiran Kumar Lokere94634152018-09-24 19:08:35 -070011529 if (!csr_is_conn_state_connected_infra(mac_ctx, session_id)) {
11530 sme_info("STA is not connected, Session_id: %d", session_id);
Kiran Kumar Lokereacd107d2019-01-09 15:02:11 -080011531 return QDF_STATUS_E_INVAL;
11532 }
11533
11534 return QDF_STATUS_SUCCESS;
11535}
11536
11537int sme_send_he_om_ctrl_update(mac_handle_t mac_handle, uint8_t session_id)
11538{
11539 QDF_STATUS status = QDF_STATUS_SUCCESS;
11540 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
11541 struct omi_ctrl_tx omi_data = {0};
11542 void *wma_handle;
11543 struct csr_roam_session *session = CSR_GET_SESSION(mac_ctx, session_id);
11544 uint32_t param_val = 0;
11545
11546 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
11547 if (!wma_handle) {
11548 sme_err("wma handle is NULL");
11549 return -EIO;
11550 }
11551
11552 status = sme_validate_session_for_cap_update(mac_ctx, session_id,
11553 session);
11554 if (QDF_IS_STATUS_ERROR(status))
Kiran Kumar Lokere94634152018-09-24 19:08:35 -070011555 return -EINVAL;
Kiran Kumar Lokereacd107d2019-01-09 15:02:11 -080011556
11557 omi_data.a_ctrl_id = A_CTRL_ID_OMI;
11558
11559 if (mac_ctx->he_om_ctrl_cfg_nss_set)
11560 omi_data.rx_nss = mac_ctx->he_om_ctrl_cfg_nss;
11561 else
11562 omi_data.rx_nss = session->nss - 1;
11563
11564 if (mac_ctx->he_om_ctrl_cfg_tx_nsts_set)
11565 omi_data.tx_nsts = mac_ctx->he_om_ctrl_cfg_tx_nsts;
11566 else
11567 omi_data.tx_nsts = session->nss - 1;
11568
11569 if (mac_ctx->he_om_ctrl_cfg_bw_set)
11570 omi_data.ch_bw = mac_ctx->he_om_ctrl_cfg_bw;
11571 else
11572 omi_data.ch_bw = session->connectedProfile.vht_channel_width;
11573
11574 omi_data.ul_mu_dis = mac_ctx->he_om_ctrl_cfg_ul_mu_dis;
Kiran Kumar Lokere49e3aff2019-02-06 17:00:48 -080011575 omi_data.ul_mu_data_dis = mac_ctx->he_om_ctrl_ul_mu_data_dis;
Kiran Kumar Lokereacd107d2019-01-09 15:02:11 -080011576 omi_data.omi_in_vht = 0x1;
11577 omi_data.omi_in_he = 0x1;
11578
11579 sme_info("OMI: BW %d TxNSTS %d RxNSS %d ULMU %d, OMI_VHT %d, OMI_HE %d",
11580 omi_data.ch_bw, omi_data.tx_nsts, omi_data.rx_nss,
11581 omi_data.ul_mu_dis, omi_data.omi_in_vht, omi_data.omi_in_he);
11582 qdf_mem_copy(&param_val, &omi_data, sizeof(omi_data));
11583 sme_debug("param val %08X, bssid:"MAC_ADDRESS_STR, param_val,
11584 MAC_ADDR_ARRAY(session->connectedProfile.bssid.bytes));
11585 status = wma_set_peer_param(wma_handle,
11586 session->connectedProfile.bssid.bytes,
11587 WMI_PEER_PARAM_XMIT_OMI,
11588 param_val, session_id);
Kiran Kumar Lokere94634152018-09-24 19:08:35 -070011589 if (QDF_STATUS_SUCCESS != status) {
Kiran Kumar Lokereacd107d2019-01-09 15:02:11 -080011590 sme_err("set_peer_param_cmd returned %d", status);
Kiran Kumar Lokere94634152018-09-24 19:08:35 -070011591 return -EIO;
11592 }
11593
11594 return 0;
11595}
11596
Kiran Kumar Lokereacd107d2019-01-09 15:02:11 -080011597int sme_set_he_om_ctrl_param(mac_handle_t mac_handle, uint8_t session_id,
11598 enum qca_wlan_vendor_attr_he_omi_tx param,
11599 uint8_t cfg_val)
Kiran Kumar Lokere94634152018-09-24 19:08:35 -070011600{
Kiran Kumar Lokere94634152018-09-24 19:08:35 -070011601 QDF_STATUS status;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080011602 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Kiran Kumar Lokere94634152018-09-24 19:08:35 -070011603 struct csr_roam_session *session = CSR_GET_SESSION(mac_ctx, session_id);
11604
Kiran Kumar Lokereacd107d2019-01-09 15:02:11 -080011605 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 Lokere94634152018-09-24 19:08:35 -070011609
Kiran Kumar Lokereacd107d2019-01-09 15:02:11 -080011610 switch(param) {
11611 case QCA_WLAN_VENDOR_ATTR_HE_OMI_ULMU_DISABLE:
11612 sme_debug("Set OM ctrl UL MU dis to %d", cfg_val);
11613 mac_ctx->he_om_ctrl_cfg_ul_mu_dis = cfg_val;
11614 break;
11615 case QCA_WLAN_VENDOR_ATTR_HE_OMI_RX_NSS:
11616 if ((cfg_val + 1) > session->nss) {
11617 sme_debug("OMI Nss %d is > connected Nss %d",
11618 cfg_val, session->nss);
11619 mac_ctx->he_om_ctrl_cfg_nss_set = false;
11620 return 0;
11621 }
11622 sme_debug("Set OM ctrl Rx Nss cfg to %d", cfg_val);
11623 mac_ctx->he_om_ctrl_cfg_nss_set = true;
11624 mac_ctx->he_om_ctrl_cfg_nss = cfg_val;
11625 break;
11626 case QCA_WLAN_VENDOR_ATTR_HE_OMI_CH_BW:
11627 if (cfg_val >
11628 session->connectedProfile.vht_channel_width) {
11629 sme_info("OMI BW %d is > connected BW %d",
11630 cfg_val,
11631 session->connectedProfile.
11632 vht_channel_width);
11633 mac_ctx->he_om_ctrl_cfg_bw_set = false;
11634 return 0;
11635 }
11636 sme_debug("Set OM ctrl BW cfg to %d", cfg_val);
11637 mac_ctx->he_om_ctrl_cfg_bw_set = true;
11638 mac_ctx->he_om_ctrl_cfg_bw = cfg_val;
11639 break;
11640 case QCA_WLAN_VENDOR_ATTR_HE_OMI_TX_NSTS:
11641 if ((cfg_val + 1) > session->nss) {
11642 sme_debug("OMI NSTS %d is > connected Nss %d",
11643 cfg_val, session->nss);
11644 mac_ctx->he_om_ctrl_cfg_tx_nsts_set = false;
11645 return 0;
11646 }
11647 sme_debug("Set OM ctrl tx nsts cfg to %d", cfg_val);
11648 mac_ctx->he_om_ctrl_cfg_tx_nsts_set = true;
11649 mac_ctx->he_om_ctrl_cfg_tx_nsts = cfg_val;
11650 break;
Kiran Kumar Lokere49e3aff2019-02-06 17:00:48 -080011651 case QCA_WLAN_VENDOR_ATTR_HE_OMI_ULMU_DATA_DISABLE:
11652 sme_debug("Set OM ctrl UL MU data dis to %d", cfg_val);
11653 mac_ctx->he_om_ctrl_ul_mu_data_dis = cfg_val;
11654 break;
Kiran Kumar Lokereacd107d2019-01-09 15:02:11 -080011655 default:
11656 sme_debug("Invalid OMI param %d", param);
11657 return -EINVAL;
Kiran Kumar Lokere94634152018-09-24 19:08:35 -070011658 }
11659
11660 return 0;
11661}
11662
Jeff Johnsonc7309062018-11-09 20:59:42 -080011663void sme_reset_he_om_ctrl(mac_handle_t mac_handle)
Kiran Kumar Lokere94634152018-09-24 19:08:35 -070011664{
Jeff Johnson0a8786a2018-12-02 10:49:01 -080011665 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Kiran Kumar Lokere94634152018-09-24 19:08:35 -070011666
11667 mac_ctx->he_om_ctrl_cfg_bw_set = false;
11668 mac_ctx->he_om_ctrl_cfg_nss_set = false;
11669 mac_ctx->he_om_ctrl_cfg_bw = 0;
11670 mac_ctx->he_om_ctrl_cfg_nss = 0;
Kiran Kumar Lokereacd107d2019-01-09 15:02:11 -080011671 mac_ctx->he_om_ctrl_cfg_ul_mu_dis = false;
11672 mac_ctx->he_om_ctrl_cfg_tx_nsts_set = false;
11673 mac_ctx->he_om_ctrl_cfg_tx_nsts = 0;
Kiran Kumar Lokere49e3aff2019-02-06 17:00:48 -080011674 mac_ctx->he_om_ctrl_ul_mu_data_dis = false;
Kiran Kumar Lokere94634152018-09-24 19:08:35 -070011675}
11676
Kiran Kumar Lokereee205772018-09-27 00:27:27 -070011677int sme_config_action_tx_in_tb_ppdu(mac_handle_t mac_handle, uint8_t session_id,
11678 uint8_t cfg_val)
11679{
11680 QDF_STATUS status;
11681 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
11682 struct scheduler_msg msg = {0};
11683 struct sir_cfg_action_frm_tb_ppdu *cfg_msg;
11684
11685 if (!csr_is_conn_state_connected_infra(mac_ctx, session_id)) {
11686 sme_info("STA not in connected state Session_id: %d",
11687 session_id);
11688 return -EINVAL;
11689 }
11690
11691 cfg_msg = qdf_mem_malloc(sizeof(*cfg_msg));
11692
11693 if (!cfg_msg)
11694 return -EIO;
11695
11696 cfg_msg->type = WNI_SME_CFG_ACTION_FRM_HE_TB_PPDU;
11697 cfg_msg->session_id = session_id;
11698 cfg_msg->cfg = cfg_val;
11699
11700 msg.bodyptr = cfg_msg;
11701 msg.type = WNI_SME_CFG_ACTION_FRM_HE_TB_PPDU;
11702 status = scheduler_post_message(QDF_MODULE_ID_SME, QDF_MODULE_ID_PE,
11703 QDF_MODULE_ID_PE, &msg);
11704 if (QDF_STATUS_SUCCESS != status) {
11705 sme_err("Failed to send CFG_ACTION_FRAME_IN_TB_PPDU to PE %d",
11706 status);
11707 qdf_mem_free(cfg_msg);
11708 return -EIO;
11709 }
11710
11711 return 0;
11712}
11713
Jeff Johnsonc7309062018-11-09 20:59:42 -080011714int sme_update_he_tx_bfee_nsts(mac_handle_t mac_handle, uint8_t session_id,
Kiran Kumar Lokeref3044852018-06-27 14:14:24 -070011715 uint8_t cfg_val)
11716{
Jeff Johnson0a8786a2018-12-02 10:49:01 -080011717 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Bala Venkatesh6d537092018-09-25 10:38:36 +053011718 struct csr_roam_session *session;
11719
11720 session = CSR_GET_SESSION(mac_ctx, session_id);
11721
11722 if (!session) {
11723 sme_err("No session for id %d", session_id);
11724 return -EINVAL;
11725 }
11726 if (cfg_in_range(CFG_HE_BFEE_STS_LT80, cfg_val))
11727 mac_ctx->mlme_cfg->he_caps.dot11_he_cap.bfee_sts_lt_80 =
11728 cfg_val;
11729 else
11730 return -EINVAL;
11731
11732 csr_update_session_he_cap(mac_ctx, session);
11733 return 0;
Kiran Kumar Lokeref3044852018-06-27 14:14:24 -070011734}
11735
Kiran Kumar Lokere86e85592018-07-18 15:34:24 -070011736void sme_set_he_tx_bf_cbf_rates(uint8_t session_id)
11737{
11738 uint32_t tx_bf_cbf_rates_5g[] = {91, 1, 0, 3, 2, 4, 0};
11739 uint32_t tx_bf_cbf_rates_2g[] = {91, 1, 1, 3, 1, 3, 0};
11740 QDF_STATUS status;
11741
11742 status = wma_form_unit_test_cmd_and_send(session_id, 0x48, 7,
11743 tx_bf_cbf_rates_5g);
11744 if (QDF_STATUS_SUCCESS != status)
11745 sme_err("send_unit_test_cmd returned %d", status);
11746
11747 status = wma_form_unit_test_cmd_and_send(session_id, 0x48, 7,
11748 tx_bf_cbf_rates_2g);
11749 if (QDF_STATUS_SUCCESS != status)
11750 sme_err("send_unit_test_cmd returned %d", status);
11751}
11752
Kiran Kumar Lokereefdbd0b2018-09-25 18:53:46 -070011753void sme_config_su_ppdu_queue(uint8_t session_id, bool enable)
11754{
11755 uint32_t su_ppdu_enable[] = {69, 1, 1, 1};
11756 uint32_t su_ppdu_disable[] = {69, 1, 1, 0};
11757 QDF_STATUS status;
11758
11759 if (enable) {
11760 sme_debug("Send Tx SU PPDU queue ENABLE cmd to FW");
11761 status = wma_form_unit_test_cmd_and_send(session_id, 0x48, 4,
11762 su_ppdu_enable);
11763 } else {
11764 sme_debug("Send Tx SU PPDU queue DISABLE cmd to FW");
11765 status = wma_form_unit_test_cmd_and_send(session_id, 0x48, 4,
11766 su_ppdu_disable);
11767 }
11768 if (QDF_STATUS_SUCCESS != status)
11769 sme_err("send_unit_test_cmd returned %d", status);
11770}
11771
Jeff Johnsonc7309062018-11-09 20:59:42 -080011772int sme_update_he_tx_stbc_cap(mac_handle_t mac_handle, uint8_t session_id,
11773 int value)
Kiran Kumar Lokere13dedac2018-02-05 19:51:59 -080011774{
Jeff Johnson0a8786a2018-12-02 10:49:01 -080011775 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Bala Venkatesh6d537092018-09-25 10:38:36 +053011776 struct csr_roam_session *session;
Kiran Kumar Lokere5cc2f0d2018-02-08 17:10:05 -080011777 uint32_t he_cap_val = 0;
11778
11779 he_cap_val = value ? 1 : 0;
Bala Venkatesh6d537092018-09-25 10:38:36 +053011780 session = CSR_GET_SESSION(mac_ctx, session_id);
Kiran Kumar Lokere13dedac2018-02-05 19:51:59 -080011781
Bala Venkatesh6d537092018-09-25 10:38:36 +053011782 if (!session) {
11783 sme_err("No session for id %d", session_id);
11784 return -EINVAL;
11785 }
11786 if (he_cap_val <= 1)
Kiran Kumar Lokere9cab5252019-02-04 14:38:08 -080011787 mac_ctx->mlme_cfg->he_caps.dot11_he_cap.tb_ppdu_tx_stbc_lt_80mhz
11788 = he_cap_val;
Bala Venkatesh6d537092018-09-25 10:38:36 +053011789 else
11790 return -EINVAL;
11791 if (he_cap_val <= 1)
Kiran Kumar Lokere9cab5252019-02-04 14:38:08 -080011792 mac_ctx->mlme_cfg->he_caps.dot11_he_cap.tb_ppdu_tx_stbc_gt_80mhz
11793 = he_cap_val;
Bala Venkatesh6d537092018-09-25 10:38:36 +053011794 else
11795 return -EINVAL;
11796 csr_update_session_he_cap(mac_ctx, session);
11797 return 0;
Kiran Kumar Lokere13dedac2018-02-05 19:51:59 -080011798}
11799
Jeff Johnsonc7309062018-11-09 20:59:42 -080011800int sme_update_he_rx_stbc_cap(mac_handle_t mac_handle, uint8_t session_id,
11801 int value)
Kiran Kumar Lokere13dedac2018-02-05 19:51:59 -080011802{
Jeff Johnson0a8786a2018-12-02 10:49:01 -080011803 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Bala Venkatesh6d537092018-09-25 10:38:36 +053011804 struct csr_roam_session *session;
Kiran Kumar Lokere5cc2f0d2018-02-08 17:10:05 -080011805 uint32_t he_cap_val = 0;
11806
11807 he_cap_val = value ? 1 : 0;
Bala Venkatesh6d537092018-09-25 10:38:36 +053011808 session = CSR_GET_SESSION(mac_ctx, session_id);
Kiran Kumar Lokere13dedac2018-02-05 19:51:59 -080011809
Bala Venkatesh6d537092018-09-25 10:38:36 +053011810 if (!session) {
11811 sme_err("No session for id %d", session_id);
11812 return -EINVAL;
11813 }
11814 if (he_cap_val <= 1)
11815 mac_ctx->mlme_cfg->he_caps.dot11_he_cap.rx_stbc_lt_80mhz =
11816 he_cap_val;
11817 else
11818 return -EINVAL;
11819 if (he_cap_val <= 1)
11820 mac_ctx->mlme_cfg->he_caps.dot11_he_cap.rx_stbc_gt_80mhz =
11821 he_cap_val;
11822 else
11823 return -EINVAL;
11824 csr_update_session_he_cap(mac_ctx, session);
11825 return 0;
Kiran Kumar Lokere5cc2f0d2018-02-08 17:10:05 -080011826}
11827
Jeff Johnsonc7309062018-11-09 20:59:42 -080011828int sme_update_he_frag_supp(mac_handle_t mac_handle, uint8_t session_id,
11829 uint16_t he_frag)
Kiran Kumar Lokere5cc2f0d2018-02-08 17:10:05 -080011830{
Jeff Johnson0a8786a2018-12-02 10:49:01 -080011831 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Bala Venkatesh6d537092018-09-25 10:38:36 +053011832 struct csr_roam_session *session;
11833
11834 session = CSR_GET_SESSION(mac_ctx, session_id);
11835
11836 if (!session) {
11837 sme_err("No session for id %d", session_id);
11838 return -EINVAL;
11839 }
11840 if (cfg_in_range(CFG_HE_FRAGMENTATION, he_frag))
11841 mac_ctx->mlme_cfg->he_caps.dot11_he_cap.fragmentation = he_frag;
11842 else
11843 return -EINVAL;
11844
11845 csr_update_session_he_cap(mac_ctx, session);
11846 return 0;
11847
Kiran Kumar Lokere13dedac2018-02-05 19:51:59 -080011848}
Kiran Kumar Lokeree43a4582018-05-08 19:54:03 -070011849
Jeff Johnsonc7309062018-11-09 20:59:42 -080011850int sme_update_he_ldpc_supp(mac_handle_t mac_handle, uint8_t session_id,
Kiran Kumar Lokeree43a4582018-05-08 19:54:03 -070011851 uint16_t he_ldpc)
11852{
Jeff Johnson0a8786a2018-12-02 10:49:01 -080011853 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Bala Venkatesh6d537092018-09-25 10:38:36 +053011854 struct csr_roam_session *session;
11855
11856 session = CSR_GET_SESSION(mac_ctx, session_id);
11857
11858 if (!session) {
11859 sme_err("No session for id %d", session_id);
11860 return -EINVAL;
11861 }
11862 if (he_ldpc <= 1)
11863 mac_ctx->mlme_cfg->he_caps.dot11_he_cap.ldpc_coding = he_ldpc;
11864 else
11865 return -EINVAL;
11866
11867 csr_update_session_he_cap(mac_ctx, session);
11868 return 0;
11869
Kiran Kumar Lokeree43a4582018-05-08 19:54:03 -070011870}
Arif Hussain1f58cbb2019-03-14 17:06:56 -070011871
11872int sme_update_he_twt_req_support(mac_handle_t mac_handle, uint8_t session_id,
11873 uint8_t cfg_val)
11874{
11875 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
11876 struct csr_roam_session *session;
11877
11878 session = CSR_GET_SESSION(mac_ctx, session_id);
11879
11880 if (!session) {
11881 sme_err("No session for id %d", session_id);
11882 return -EINVAL;
11883 }
11884 mac_ctx->mlme_cfg->he_caps.dot11_he_cap.twt_request = cfg_val;
11885
11886 csr_update_session_he_cap(mac_ctx, session);
11887
11888 return 0;
11889}
Kiran Kumar Lokere44a29432018-01-24 16:10:30 -080011890#endif
11891
Archana Ramachandran5041b252016-04-25 14:29:25 -070011892/**
Anurag Chouhan3920c0f2017-09-11 17:10:56 +053011893 * sme_set_nud_debug_stats_cb() - set nud debug stats callback
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -080011894 * @mac_handle: Opaque handle to the global MAC context
Anurag Chouhan3920c0f2017-09-11 17:10:56 +053011895 * @cb: callback function pointer
Dundi Raviteja3bcf3a82018-05-22 13:24:18 +053011896 * @context: callback context
Anurag Chouhan3920c0f2017-09-11 17:10:56 +053011897 *
11898 * This function stores nud debug stats callback function.
11899 *
11900 * Return: QDF_STATUS enumeration.
11901 */
Jeff Johnsonc7309062018-11-09 20:59:42 -080011902QDF_STATUS sme_set_nud_debug_stats_cb(mac_handle_t mac_handle,
Dundi Raviteja3bcf3a82018-05-22 13:24:18 +053011903 void (*cb)(void *, struct rsp_stats *, void *),
11904 void *context)
Anurag Chouhan3920c0f2017-09-11 17:10:56 +053011905{
11906 QDF_STATUS status = QDF_STATUS_SUCCESS;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080011907 struct mac_context *mac;
Anurag Chouhan3920c0f2017-09-11 17:10:56 +053011908
Jeff Johnsonc7309062018-11-09 20:59:42 -080011909 if (!mac_handle) {
Anurag Chouhan3920c0f2017-09-11 17:10:56 +053011910 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Jeff Johnsonc7309062018-11-09 20:59:42 -080011911 FL("mac_handle is not valid"));
Anurag Chouhan3920c0f2017-09-11 17:10:56 +053011912 return QDF_STATUS_E_INVAL;
11913 }
Jeff Johnsona0619e42018-11-28 17:43:00 -080011914 mac = MAC_CONTEXT(mac_handle);
Anurag Chouhan3920c0f2017-09-11 17:10:56 +053011915
11916 status = sme_acquire_global_lock(&mac->sme);
11917 if (!QDF_IS_STATUS_SUCCESS(status)) {
11918 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
11919 FL("sme_acquire_global_lock failed!(status=%d)"),
11920 status);
11921 return status;
11922 }
11923
11924 mac->sme.get_arp_stats_cb = cb;
Dundi Raviteja3bcf3a82018-05-22 13:24:18 +053011925 mac->sme.get_arp_stats_context = context;
Anurag Chouhan3920c0f2017-09-11 17:10:56 +053011926 sme_release_global_lock(&mac->sme);
11927 return status;
11928}
11929
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011930/**
11931 * sme_is_any_session_in_connected_state() - SME wrapper API to
11932 * check if any session is in connected state or not.
11933 *
Jeff Johnsonc7309062018-11-09 20:59:42 -080011934 * @mac_handle: Handle returned by mac open
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011935 *
11936 * This function is used to check if any valid sme session is in
11937 * connected state or not.
11938 *
11939 * Return: true if any session is connected, else false.
11940 *
11941 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -080011942bool sme_is_any_session_in_connected_state(mac_handle_t mac_handle)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011943{
Jeff Johnson0a8786a2018-12-02 10:49:01 -080011944 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011945 QDF_STATUS status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011946 bool ret = false;
11947
11948 status = sme_acquire_global_lock(&mac_ctx->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011949 if (QDF_STATUS_SUCCESS == status) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011950 ret = csr_is_any_session_in_connect_state(mac_ctx);
11951 sme_release_global_lock(&mac_ctx->sme);
11952 }
11953 return ret;
11954}
11955
Jeff Johnsonb7fa2562018-07-02 08:36:17 -070011956QDF_STATUS sme_set_chip_pwr_save_fail_cb(mac_handle_t mac_handle,
11957 pwr_save_fail_cb cb)
11958{
11959 QDF_STATUS status;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080011960 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Ravi Kumar Bokka05c14e52017-03-27 14:48:23 +053011961
11962 status = sme_acquire_global_lock(&mac->sme);
11963 if (status != QDF_STATUS_SUCCESS) {
11964 sme_err("sme_AcquireGlobalLock failed!(status=%d)", status);
11965 return status;
11966 }
11967 mac->sme.chip_power_save_fail_cb = cb;
11968 sme_release_global_lock(&mac->sme);
11969 return status;
11970}
11971
Qiwei Caie689a262018-07-26 15:50:22 +080011972#ifdef FEATURE_RSSI_MONITOR
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011973/**
11974 * sme_set_rssi_monitoring() - set rssi monitoring
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -080011975 * @mac_handle: Opaque handle to the global MAC context
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011976 * @input: request message
11977 *
11978 * This function constructs the vos message and fill in message type,
11979 * bodyptr with @input and posts it to WDA queue.
11980 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011981 * Return: QDF_STATUS enumeration
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011982 */
Jeff Johnsonc7309062018-11-09 20:59:42 -080011983QDF_STATUS sme_set_rssi_monitoring(mac_handle_t mac_handle,
Jeff Johnson4c6d40f2019-02-22 20:49:56 -080011984 struct rssi_monitor_param *input)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011985{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011986 QDF_STATUS status = QDF_STATUS_SUCCESS;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080011987 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Rajeev Kumar37d478b2017-04-17 16:59:28 -070011988 struct scheduler_msg message = {0};
Jeff Johnson4c6d40f2019-02-22 20:49:56 -080011989 struct rssi_monitor_param *req_msg;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011990
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070011991 SME_ENTER();
Anurag Chouhan600c3a02016-03-01 10:33:54 +053011992 req_msg = qdf_mem_malloc(sizeof(*req_msg));
Arif Hussain0ef77082018-10-10 16:42:53 -070011993 if (!req_msg)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011994 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011995
11996 *req_msg = *input;
11997
11998 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011999 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070012000 sme_err("sme_acquire_global_lock failed!(status=%d)", status);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053012001 qdf_mem_free(req_msg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012002 return status;
12003 }
12004
12005 /* Serialize the req through MC thread */
Rajeev Kumar8eaedf62017-01-21 11:03:13 -080012006 message.bodyptr = req_msg;
12007 message.type = WMA_SET_RSSI_MONITOR_REQ;
gaurank kathpalia36b0c582018-08-28 17:45:43 +053012008 status = scheduler_post_message(QDF_MODULE_ID_SME,
12009 QDF_MODULE_ID_WMA,
12010 QDF_MODULE_ID_WMA, &message);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012011 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070012012 sme_err("scheduler_post_msg failed!(err=%d)", status);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053012013 qdf_mem_free(req_msg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012014 }
12015 sme_release_global_lock(&mac->sme);
12016
12017 return status;
12018}
12019
Qiwei Caie689a262018-07-26 15:50:22 +080012020QDF_STATUS sme_set_rssi_threshold_breached_cb(mac_handle_t mac_handle,
12021 rssi_threshold_breached_cb cb)
12022{
12023 QDF_STATUS status;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080012024 struct mac_context *mac;
Qiwei Caie689a262018-07-26 15:50:22 +080012025
12026 mac = MAC_CONTEXT(mac_handle);
12027 if (!mac) {
12028 sme_err("Invalid mac context");
12029 return QDF_STATUS_E_INVAL;
12030 }
12031
12032 status = sme_acquire_global_lock(&mac->sme);
12033 if (!QDF_IS_STATUS_SUCCESS(status)) {
12034 sme_err("sme_acquire_global_lock failed!(status=%d)",
12035 status);
12036 return status;
12037 }
12038
12039 mac->sme.rssi_threshold_breached_cb = cb;
12040 sme_release_global_lock(&mac->sme);
12041 return status;
12042}
12043#endif /* FEATURE_RSSI_MONITOR */
12044
12045QDF_STATUS sme_reset_rssi_threshold_breached_cb(mac_handle_t mac_handle)
12046{
12047 return sme_set_rssi_threshold_breached_cb(mac_handle, NULL);
12048}
12049
Varun Reddy Yeturu951de5d2018-09-10 21:36:22 -070012050static enum band_info sme_get_connected_roaming_vdev_band(void)
12051{
12052 enum band_info band = BAND_ALL;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080012053 struct mac_context *mac = sme_get_mac_context();
Varun Reddy Yeturu951de5d2018-09-10 21:36:22 -070012054 struct csr_roam_session *session;
12055 uint8_t session_id, channel;
12056
12057 if (!mac) {
12058 sme_debug("MAC Context is NULL");
12059 return band;
12060 }
12061 session_id = csr_get_roam_enabled_sta_sessionid(mac);
Srinivas Girigowdad8697d42019-03-08 15:34:39 -080012062 if (session_id != WLAN_UMAC_VDEV_ID_MAX) {
Varun Reddy Yeturu951de5d2018-09-10 21:36:22 -070012063 session = CSR_GET_SESSION(mac, session_id);
12064 channel = session->connectedProfile.operationChannel;
12065 band = csr_get_rf_band(channel);
12066 return band;
12067 }
12068
12069 return band;
12070}
12071
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012072/*
Manishekar Chandrasekaran7009f252016-04-21 19:14:15 +053012073 * sme_pdev_set_pcl() - Send WMI_PDEV_SET_PCL_CMDID to the WMA
Jeff Johnsonc7309062018-11-09 20:59:42 -080012074 * @mac_handle: Handle returned by macOpen
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012075 * @msg: PCL channel list and length structure
12076 *
Manishekar Chandrasekaran7009f252016-04-21 19:14:15 +053012077 * Sends the command to WMA to send WMI_PDEV_SET_PCL_CMDID to FW
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012078 * Return: QDF_STATUS_SUCCESS on successful posting
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012079 */
Krunal Soni8a090df2018-05-03 15:02:54 -070012080QDF_STATUS sme_pdev_set_pcl(struct policy_mgr_pcl_list *msg)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012081{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012082 QDF_STATUS status = QDF_STATUS_SUCCESS;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080012083 struct mac_context *mac = sme_get_mac_context();
Rajeev Kumar37d478b2017-04-17 16:59:28 -070012084 struct scheduler_msg message = {0};
Varun Reddy Yeturu951de5d2018-09-10 21:36:22 -070012085 struct set_pcl_req *req_msg;
12086 uint32_t i;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012087
Krunal Soni3fa80e22018-01-09 14:16:02 -080012088 if (!mac) {
12089 sme_err("mac is NULL");
12090 return QDF_STATUS_E_FAILURE;
12091 }
Krunal Soni8a090df2018-05-03 15:02:54 -070012092
12093 if (!msg) {
12094 sme_err("msg is NULL");
12095 return QDF_STATUS_E_FAILURE;
12096 }
12097
Varun Reddy Yeturu951de5d2018-09-10 21:36:22 -070012098 req_msg = qdf_mem_malloc(sizeof(*req_msg));
Arif Hussain0ef77082018-10-10 16:42:53 -070012099 if (!req_msg)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012100 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012101
Varun Reddy Yeturu951de5d2018-09-10 21:36:22 -070012102 req_msg->band = BAND_ALL;
12103 if (CSR_IS_ROAM_INTRA_BAND_ENABLED(mac)) {
12104 req_msg->band = sme_get_connected_roaming_vdev_band();
12105 sme_debug("Connected STA band %d", req_msg->band);
12106 }
Krunal Soni8a090df2018-05-03 15:02:54 -070012107 for (i = 0; i < msg->pcl_len; i++) {
Varun Reddy Yeturu951de5d2018-09-10 21:36:22 -070012108 req_msg->chan_weights.pcl_list[i] = msg->pcl_list[i];
12109 req_msg->chan_weights.weight_list[i] = msg->weight_list[i];
Manishekar Chandrasekaran7009f252016-04-21 19:14:15 +053012110 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012111
Varun Reddy Yeturu951de5d2018-09-10 21:36:22 -070012112 req_msg->chan_weights.pcl_len = msg->pcl_len;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012113
12114 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012115 if (status != QDF_STATUS_SUCCESS) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070012116 sme_err("sme_acquire_global_lock failed!(status=%d)", status);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053012117 qdf_mem_free(req_msg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012118 return status;
12119 }
12120
12121 /* Serialize the req through MC thread */
Rajeev Kumar8eaedf62017-01-21 11:03:13 -080012122 message.bodyptr = req_msg;
12123 message.type = SIR_HAL_PDEV_SET_PCL_TO_FW;
gaurank kathpalia36b0c582018-08-28 17:45:43 +053012124 status = scheduler_post_message(QDF_MODULE_ID_SME,
12125 QDF_MODULE_ID_WMA,
12126 QDF_MODULE_ID_WMA, &message);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012127 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070012128 sme_err("scheduler_post_msg failed!(err=%d)", status);
Anurag Chouhan600c3a02016-03-01 10:33:54 +053012129 qdf_mem_free(req_msg);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012130 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012131 }
12132 sme_release_global_lock(&mac->sme);
12133
12134 return status;
12135}
12136
12137/*
Manishekar Chandrasekarand9640342016-04-27 12:28:26 +053012138 * sme_pdev_set_hw_mode() - Send WMI_PDEV_SET_HW_MODE_CMDID to the WMA
Jeff Johnsonc7309062018-11-09 20:59:42 -080012139 * @mac_handle: Handle returned by macOpen
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012140 * @msg: HW mode structure containing hw mode and callback details
12141 *
Manishekar Chandrasekarand9640342016-04-27 12:28:26 +053012142 * Sends the command to CSR to send WMI_PDEV_SET_HW_MODE_CMDID to FW
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012143 * Return: QDF_STATUS_SUCCESS on successful posting
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012144 */
Tushnim Bhattacharyya0c4ad2d2017-03-09 15:59:03 -080012145QDF_STATUS sme_pdev_set_hw_mode(struct policy_mgr_hw_mode msg)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012146{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012147 QDF_STATUS status = QDF_STATUS_SUCCESS;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080012148 struct mac_context *mac = sme_get_mac_context();
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012149 tSmeCmd *cmd = NULL;
12150
Krunal Soni3fa80e22018-01-09 14:16:02 -080012151 if (!mac) {
12152 sme_err("mac is NULL");
12153 return QDF_STATUS_E_FAILURE;
12154 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012155 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012156 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070012157 sme_err("Failed to acquire lock");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012158 return QDF_STATUS_E_RESOURCES;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012159 }
12160
Krunal Soni78618d92017-02-14 21:46:31 -080012161 cmd = csr_get_command_buffer(mac);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012162 if (!cmd) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070012163 sme_err("Get command buffer failed");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012164 sme_release_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012165 return QDF_STATUS_E_NULL_VALUE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012166 }
12167
12168 cmd->command = e_sme_command_set_hw_mode;
Ganesh Kondabattiniae1c6a22017-05-02 18:02:11 +053012169 cmd->sessionId = msg.session_id;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012170 cmd->u.set_hw_mode_cmd.hw_mode_index = msg.hw_mode_index;
12171 cmd->u.set_hw_mode_cmd.set_hw_mode_cb = msg.set_hw_mode_cb;
Chandrasekaran, Manishekaref70c0d2015-10-20 19:54:55 +053012172 cmd->u.set_hw_mode_cmd.reason = msg.reason;
12173 cmd->u.set_hw_mode_cmd.session_id = msg.session_id;
Tushnim Bhattacharyyaeab33dd2017-11-15 15:20:02 -080012174 cmd->u.set_hw_mode_cmd.next_action = msg.next_action;
Tushnim Bhattacharyya0c4ad2d2017-03-09 15:59:03 -080012175 cmd->u.set_hw_mode_cmd.context = msg.context;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012176
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070012177 sme_debug("Queuing set hw mode to CSR, session: %d reason: %d",
Chandrasekaran, Manishekarce2172e2016-02-18 16:12:43 +053012178 cmd->u.set_hw_mode_cmd.session_id,
12179 cmd->u.set_hw_mode_cmd.reason);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012180 csr_queue_sme_command(mac, cmd, false);
12181
12182 sme_release_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012183 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012184}
12185
12186/**
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012187 * sme_nss_update_request() - Send beacon templete update to FW with new
12188 * nss value
Jeff Johnsonc7309062018-11-09 20:59:42 -080012189 * @mac_handle: Handle returned by macOpen
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012190 * @vdev_id: the session id
12191 * @new_nss: the new nss value
12192 * @cback: hdd callback
12193 * @next_action: next action to happen at policy mgr after beacon update
Liangwei Dong1ba99482018-10-19 02:57:29 -040012194 * @original_vdev_id: original request hwmode change vdev id
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012195 *
12196 * Sends the command to CSR to send to PE
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012197 * Return: QDF_STATUS_SUCCESS on successful posting
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012198 */
Tushnim Bhattacharyya0c4ad2d2017-03-09 15:59:03 -080012199QDF_STATUS sme_nss_update_request(uint32_t vdev_id,
12200 uint8_t new_nss, policy_mgr_nss_update_cback cback,
12201 uint8_t next_action, struct wlan_objmgr_psoc *psoc,
Liangwei Dong1ba99482018-10-19 02:57:29 -040012202 enum policy_mgr_conn_update_reason reason,
12203 uint32_t original_vdev_id)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012204{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012205 QDF_STATUS status = QDF_STATUS_E_FAILURE;
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 status;
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)) {
Krunal Soni78618d92017-02-14 21:46:31 -080012215 cmd = csr_get_command_buffer(mac);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012216 if (!cmd) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070012217 sme_err("Get command buffer failed");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012218 sme_release_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012219 return QDF_STATUS_E_NULL_VALUE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012220 }
12221 cmd->command = e_sme_command_nss_update;
12222 /* Sessionized modules may require this info */
12223 cmd->sessionId = vdev_id;
12224 cmd->u.nss_update_cmd.new_nss = new_nss;
12225 cmd->u.nss_update_cmd.session_id = vdev_id;
12226 cmd->u.nss_update_cmd.nss_update_cb = cback;
Tushnim Bhattacharyya0c4ad2d2017-03-09 15:59:03 -080012227 cmd->u.nss_update_cmd.context = psoc;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012228 cmd->u.nss_update_cmd.next_action = next_action;
Chandrasekaran, Manishekarce2172e2016-02-18 16:12:43 +053012229 cmd->u.nss_update_cmd.reason = reason;
Liangwei Dong1ba99482018-10-19 02:57:29 -040012230 cmd->u.nss_update_cmd.original_vdev_id = original_vdev_id;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012231
Liangwei Dong1ba99482018-10-19 02:57:29 -040012232 sme_debug("Queuing e_sme_command_nss_update to CSR:vdev (%d %d) ss %d r %d",
12233 vdev_id, original_vdev_id, new_nss, reason);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012234 csr_queue_sme_command(mac, cmd, false);
12235 sme_release_global_lock(&mac->sme);
12236 }
12237 return status;
12238}
12239
12240/**
12241 * sme_soc_set_dual_mac_config() - Set dual mac configurations
Jeff Johnsonc7309062018-11-09 20:59:42 -080012242 * @mac_handle: Handle returned by macOpen
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012243 * @msg: Structure containing the dual mac config parameters
12244 *
12245 * Queues configuration information to CSR to configure
12246 * WLAN firmware for the dual MAC features
12247 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012248 * Return: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012249 */
Tushnim Bhattacharyya0c4ad2d2017-03-09 15:59:03 -080012250QDF_STATUS sme_soc_set_dual_mac_config(struct policy_mgr_dual_mac_config msg)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012251{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012252 QDF_STATUS status = QDF_STATUS_SUCCESS;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080012253 struct mac_context *mac = sme_get_mac_context();
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012254 tSmeCmd *cmd;
12255
Krunal Soni3fa80e22018-01-09 14:16:02 -080012256 if (!mac) {
12257 sme_err("mac is null");
12258 return QDF_STATUS_E_FAILURE;
12259 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012260 status = sme_acquire_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012261 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070012262 sme_err("Failed to acquire lock");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012263 return QDF_STATUS_E_RESOURCES;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012264 }
12265
Krunal Soni78618d92017-02-14 21:46:31 -080012266 cmd = csr_get_command_buffer(mac);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012267 if (!cmd) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070012268 sme_err("Get command buffer failed");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012269 sme_release_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012270 return QDF_STATUS_E_NULL_VALUE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012271 }
12272
12273 cmd->command = e_sme_command_set_dual_mac_config;
12274 cmd->u.set_dual_mac_cmd.scan_config = msg.scan_config;
12275 cmd->u.set_dual_mac_cmd.fw_mode_config = msg.fw_mode_config;
12276 cmd->u.set_dual_mac_cmd.set_dual_mac_cb = msg.set_dual_mac_cb;
12277
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070012278 sme_debug("set_dual_mac_config scan_config: %x fw_mode_config: %x",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012279 cmd->u.set_dual_mac_cmd.scan_config,
12280 cmd->u.set_dual_mac_cmd.fw_mode_config);
12281 csr_queue_sme_command(mac, cmd, false);
12282
12283 sme_release_global_lock(&mac->sme);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012284 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012285}
12286
Ravi Joshi9e891ba2015-11-09 19:03:46 -080012287#ifdef FEATURE_LFR_SUBNET_DETECTION
12288/**
12289 * sme_gateway_param_update() - to update gateway parameters with WMA
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -080012290 * @mac_handle: Opaque handle to the global MAC context
Ravi Joshi9e891ba2015-11-09 19:03:46 -080012291 * @gw_params: request parameters from HDD
12292 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012293 * Return: QDF_STATUS
Ravi Joshi9e891ba2015-11-09 19:03:46 -080012294 *
12295 * This routine will update gateway parameters to WMA
12296 */
Jeff Johnsonc7309062018-11-09 20:59:42 -080012297QDF_STATUS sme_gateway_param_update(mac_handle_t mac_handle,
Jeff Johnson38d0ce62019-02-22 17:05:14 -080012298 struct gateway_update_req_param *gw_params)
Ravi Joshi9e891ba2015-11-09 19:03:46 -080012299{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012300 QDF_STATUS qdf_status;
Rajeev Kumar37d478b2017-04-17 16:59:28 -070012301 struct scheduler_msg message = {0};
Jeff Johnson38d0ce62019-02-22 17:05:14 -080012302 struct gateway_update_req_param *request_buf;
Ravi Joshi9e891ba2015-11-09 19:03:46 -080012303
Anurag Chouhan600c3a02016-03-01 10:33:54 +053012304 request_buf = qdf_mem_malloc(sizeof(*request_buf));
Arif Hussain0ef77082018-10-10 16:42:53 -070012305 if (!request_buf)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012306 return QDF_STATUS_E_NOMEM;
Ravi Joshi9e891ba2015-11-09 19:03:46 -080012307
12308 *request_buf = *gw_params;
12309
Rajeev Kumar8eaedf62017-01-21 11:03:13 -080012310 message.type = WMA_GW_PARAM_UPDATE_REQ;
12311 message.reserved = 0;
12312 message.bodyptr = request_buf;
gaurank kathpalia36b0c582018-08-28 17:45:43 +053012313 qdf_status = scheduler_post_message(QDF_MODULE_ID_SME,
12314 QDF_MODULE_ID_WMA,
12315 QDF_MODULE_ID_WMA, &message);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012316 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053012317 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053012318 "Not able to post WMA_GW_PARAM_UPDATE_REQ message to HAL");
Anurag Chouhan600c3a02016-03-01 10:33:54 +053012319 qdf_mem_free(request_buf);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012320 return QDF_STATUS_E_FAILURE;
Ravi Joshi9e891ba2015-11-09 19:03:46 -080012321 }
12322
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012323 return QDF_STATUS_SUCCESS;
Ravi Joshi9e891ba2015-11-09 19:03:46 -080012324}
12325#endif /* FEATURE_LFR_SUBNET_DETECTION */
12326
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012327/**
Archana Ramachandrana20ef812015-11-13 16:12:13 -080012328 * sme_soc_set_antenna_mode() - set antenna mode
Jeff Johnsonc7309062018-11-09 20:59:42 -080012329 * @mac_handle: Handle returned by macOpen
Archana Ramachandrana20ef812015-11-13 16:12:13 -080012330 * @msg: Structure containing the antenna mode parameters
12331 *
12332 * Send the command to CSR to send
12333 * WMI_SOC_SET_ANTENNA_MODE_CMDID to FW
12334 *
12335 * Return: QDF_STATUS
12336 */
Jeff Johnsonc7309062018-11-09 20:59:42 -080012337QDF_STATUS sme_soc_set_antenna_mode(mac_handle_t mac_handle,
12338 struct sir_antenna_mode_param *msg)
Archana Ramachandrana20ef812015-11-13 16:12:13 -080012339{
12340 QDF_STATUS status = QDF_STATUS_SUCCESS;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080012341 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Archana Ramachandrana20ef812015-11-13 16:12:13 -080012342 tSmeCmd *cmd;
12343
Jeff Johnson038efe72019-03-18 13:39:31 -070012344 if (!msg) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070012345 sme_err("antenna mode mesg is NULL");
Archana Ramachandrana20ef812015-11-13 16:12:13 -080012346 return QDF_STATUS_E_FAILURE;
12347 }
12348
12349 status = sme_acquire_global_lock(&mac->sme);
12350 if (!QDF_IS_STATUS_SUCCESS(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070012351 sme_err("Failed to acquire lock");
Archana Ramachandrana20ef812015-11-13 16:12:13 -080012352 return QDF_STATUS_E_RESOURCES;
12353 }
12354
Krunal Soni78618d92017-02-14 21:46:31 -080012355 cmd = csr_get_command_buffer(mac);
Archana Ramachandrana20ef812015-11-13 16:12:13 -080012356 if (!cmd) {
12357 sme_release_global_lock(&mac->sme);
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070012358 sme_err("Get command buffer failed");
Archana Ramachandrana20ef812015-11-13 16:12:13 -080012359 return QDF_STATUS_E_NULL_VALUE;
12360 }
12361
12362 cmd->command = e_sme_command_set_antenna_mode;
12363 cmd->u.set_antenna_mode_cmd = *msg;
12364
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070012365 sme_debug("Antenna mode rx_chains: %d tx_chains: %d",
Archana Ramachandrana20ef812015-11-13 16:12:13 -080012366 cmd->u.set_antenna_mode_cmd.num_rx_chains,
12367 cmd->u.set_antenna_mode_cmd.num_tx_chains);
12368
12369 csr_queue_sme_command(mac, cmd, false);
12370 sme_release_global_lock(&mac->sme);
12371
12372 return QDF_STATUS_SUCCESS;
12373}
12374
12375/**
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012376 * sme_set_peer_authorized() - call peer authorized callback
12377 * @peer_addr: peer mac address
12378 * @auth_cb: auth callback
12379 * @vdev_id: vdev id
12380 *
Anurag Chouhanf04e84f2016-03-03 10:12:12 +053012381 * Return: QDF Status
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012382 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012383QDF_STATUS sme_set_peer_authorized(uint8_t *peer_addr,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012384 sme_peer_authorized_fp auth_cb,
12385 uint32_t vdev_id)
12386{
12387 void *wma_handle;
12388
Anurag Chouhan6d760662016-02-20 16:05:43 +053012389 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012390 if (!wma_handle) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053012391 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012392 "wma handle is NULL");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012393 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012394 }
12395
12396 wma_set_peer_authorized_cb(wma_handle, auth_cb);
12397 return wma_set_peer_param(wma_handle, peer_addr, WMI_PEER_AUTHORIZE,
12398 1, vdev_id);
12399}
12400
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012401/**
Jeff Johnson01f2c232018-11-21 19:17:44 -080012402 * sme_setdef_dot11mode() - Updates mac with default dot11mode
Jeff Johnsonc7309062018-11-09 20:59:42 -080012403 * @mac_handle: Global MAC pointer
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012404 *
12405 * Return: NULL.
12406 */
Jeff Johnsonc7309062018-11-09 20:59:42 -080012407void sme_setdef_dot11mode(mac_handle_t mac_handle)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012408{
Jeff Johnson0a8786a2018-12-02 10:49:01 -080012409 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053012410
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012411 csr_set_default_dot11_mode(mac_ctx);
12412}
12413
12414/**
Krishna Kumaar Natarajan052c6e62015-09-28 15:32:55 -070012415 * sme_update_tgt_services() - update the target services config.
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -080012416 * @mac_handle: Opaque handle to the global MAC context.
Krishna Kumaar Natarajan052c6e62015-09-28 15:32:55 -070012417 * @cfg: wma_tgt_services parameters.
12418 *
12419 * update the target services config.
12420 *
12421 * Return: None.
12422 */
Jeff Johnsonc7309062018-11-09 20:59:42 -080012423void sme_update_tgt_services(mac_handle_t mac_handle,
12424 struct wma_tgt_services *cfg)
Krishna Kumaar Natarajan052c6e62015-09-28 15:32:55 -070012425{
Jeff Johnson0a8786a2018-12-02 10:49:01 -080012426 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Krishna Kumaar Natarajan052c6e62015-09-28 15:32:55 -070012427
Liangwei Dong0da14262018-07-03 03:30:23 -040012428 mac_ctx->obss_scan_offload = cfg->obss_scan_offload;
12429 sme_debug("obss_scan_offload: %d", mac_ctx->obss_scan_offload);
Krunal Sonie6a1cda2017-09-27 15:23:02 -070012430 mac_ctx->lteCoexAntShare = cfg->lte_coex_ant_share;
Krishna Kumaar Natarajan052c6e62015-09-28 15:32:55 -070012431 mac_ctx->beacon_offload = cfg->beacon_offload;
mukul sharma72c8b222015-09-04 17:02:01 +053012432 mac_ctx->pmf_offload = cfg->pmf_offload;
Abhishek Singhe4a1f882017-08-10 17:59:44 +053012433 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
mukul sharma72c8b222015-09-04 17:02:01 +053012434 FL("mac_ctx->pmf_offload: %d"), mac_ctx->pmf_offload);
Vignesh Viswanathan731186f2017-09-18 13:47:37 +053012435 mac_ctx->is_fils_roaming_supported =
12436 cfg->is_fils_roaming_supported;
Vignesh Viswanathan694e28e2018-01-18 20:53:57 +053012437 mac_ctx->is_11k_offload_supported =
12438 cfg->is_11k_offload_supported;
12439 sme_debug("pmf_offload: %d fils_roam support %d 11k_offload %d",
12440 mac_ctx->pmf_offload, mac_ctx->is_fils_roaming_supported,
12441 mac_ctx->is_11k_offload_supported);
Arunk Khandavallica56d4b2018-11-29 15:46:00 +053012442 mac_ctx->bcn_reception_stats = cfg->bcn_reception_stats;
Krishna Kumaar Natarajan052c6e62015-09-28 15:32:55 -070012443}
Masti, Narayanraddic4a7ab82015-11-25 15:41:10 +053012444
Chandrasekaran, Manishekar2859de42016-02-11 16:17:38 +053012445/**
12446 * sme_is_session_id_valid() - Check if the session id is valid
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -080012447 * @mac_handle: Opaque handle to the global MAC context
Chandrasekaran, Manishekar2859de42016-02-11 16:17:38 +053012448 * @session_id: Session id
12449 *
12450 * Checks if the session id is valid or not
12451 *
12452 * Return: True is the session id is valid, false otherwise
12453 */
Jeff Johnsonc7309062018-11-09 20:59:42 -080012454bool sme_is_session_id_valid(mac_handle_t mac_handle, uint32_t session_id)
Chandrasekaran, Manishekar2859de42016-02-11 16:17:38 +053012455{
Jeff Johnson0a8786a2018-12-02 10:49:01 -080012456 struct mac_context *mac;
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053012457
Jeff Johnson038efe72019-03-18 13:39:31 -070012458 if (mac_handle) {
Jeff Johnsona0619e42018-11-28 17:43:00 -080012459 mac = MAC_CONTEXT(mac_handle);
Pragaspathi Thilagarajb11dbe42018-07-23 16:42:17 +053012460 } else {
Chandrasekaran, Manishekard3cb4772016-02-22 22:21:10 +053012461 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
12462 "%s: null mac pointer", __func__);
Chandrasekaran, Manishekar2859de42016-02-11 16:17:38 +053012463 return false;
12464 }
12465
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053012466 if (CSR_IS_SESSION_VALID(mac, session_id))
Chandrasekaran, Manishekar2859de42016-02-11 16:17:38 +053012467 return true;
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053012468
12469 return false;
Chandrasekaran, Manishekar2859de42016-02-11 16:17:38 +053012470}
12471
Masti, Narayanraddic4a7ab82015-11-25 15:41:10 +053012472#ifdef FEATURE_WLAN_TDLS
12473
12474/**
12475 * sme_get_opclass() - determine operating class
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -080012476 * @mac_handle: Opaque handle to the global MAC context
Masti, Narayanraddic4a7ab82015-11-25 15:41:10 +053012477 * @channel: channel id
12478 * @bw_offset: bandwidth offset
12479 * @opclass: pointer to operating class
12480 *
12481 * Function will determine operating class from regdm_get_opclass_from_channel
12482 *
12483 * Return: none
12484 */
Jeff Johnsonc7309062018-11-09 20:59:42 -080012485void sme_get_opclass(mac_handle_t mac_handle, uint8_t channel,
12486 uint8_t bw_offset, uint8_t *opclass)
Masti, Narayanraddic4a7ab82015-11-25 15:41:10 +053012487{
Jeff Johnson0a8786a2018-12-02 10:49:01 -080012488 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Masti, Narayanraddic4a7ab82015-11-25 15:41:10 +053012489
12490 /* redgm opclass table contains opclass for 40MHz low primary,
12491 * 40MHz high primary and 20MHz. No support for 80MHz yet. So
12492 * first we will check if bit for 40MHz is set and if so find
12493 * matching opclass either with low primary or high primary
12494 * (a channel would never be in both) and then search for opclass
12495 * matching 20MHz, else for any BW.
12496 */
12497 if (bw_offset & (1 << BW_40_OFFSET_BIT)) {
Kiran Kumar Lokerea3de2262017-04-12 12:15:04 -070012498 *opclass = wlan_reg_dmn_get_opclass_from_channel(
Masti, Narayanraddic4a7ab82015-11-25 15:41:10 +053012499 mac_ctx->scan.countryCodeCurrent,
12500 channel, BW40_LOW_PRIMARY);
12501 if (!(*opclass)) {
Kiran Kumar Lokerea3de2262017-04-12 12:15:04 -070012502 *opclass = wlan_reg_dmn_get_opclass_from_channel(
Masti, Narayanraddic4a7ab82015-11-25 15:41:10 +053012503 mac_ctx->scan.countryCodeCurrent,
12504 channel, BW40_HIGH_PRIMARY);
12505 }
12506 } else if (bw_offset & (1 << BW_20_OFFSET_BIT)) {
Kiran Kumar Lokerea3de2262017-04-12 12:15:04 -070012507 *opclass = wlan_reg_dmn_get_opclass_from_channel(
Masti, Narayanraddic4a7ab82015-11-25 15:41:10 +053012508 mac_ctx->scan.countryCodeCurrent,
12509 channel, BW20);
12510 } else {
Kiran Kumar Lokerea3de2262017-04-12 12:15:04 -070012511 *opclass = wlan_reg_dmn_get_opclass_from_channel(
Masti, Narayanraddic4a7ab82015-11-25 15:41:10 +053012512 mac_ctx->scan.countryCodeCurrent,
12513 channel, BWALL);
12514 }
12515}
12516#endif
Ryan Hsu3c8f79f2015-12-02 16:45:09 -080012517
Sandeep Puligillae0875662016-02-12 16:09:21 -080012518/**
Anurag Chouhanbf5e0e22016-09-12 12:54:09 +053012519 * sme_set_fw_test() - set fw test
12520 * @fw_test: fw test param
12521 *
12522 * Return: Return QDF_STATUS, otherwise appropriate failure code
12523 */
12524QDF_STATUS sme_set_fw_test(struct set_fwtest_params *fw_test)
12525{
12526 void *wma_handle;
12527
12528 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
12529 if (!wma_handle) {
12530 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
12531 "wma handle is NULL");
12532 return QDF_STATUS_E_FAILURE;
12533 }
12534 wma_process_fw_test_cmd(wma_handle, fw_test);
12535 return QDF_STATUS_SUCCESS;
12536}
12537
12538/**
Sandeep Puligillae0875662016-02-12 16:09:21 -080012539 * sme_ht40_stop_obss_scan() - ht40 obss stop scan
Jeff Johnsonc7309062018-11-09 20:59:42 -080012540 * @mac_handle: mac handel
Sandeep Puligillae0875662016-02-12 16:09:21 -080012541 * @vdev_id: vdev identifier
12542 *
12543 * Return: Return QDF_STATUS, otherwise appropriate failure code
12544 */
Jeff Johnsonc7309062018-11-09 20:59:42 -080012545QDF_STATUS sme_ht40_stop_obss_scan(mac_handle_t mac_handle, uint32_t vdev_id)
Sandeep Puligillae0875662016-02-12 16:09:21 -080012546{
12547 void *wma_handle;
12548
12549 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
12550 if (!wma_handle) {
12551 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
12552 "wma handle is NULL");
12553 return QDF_STATUS_E_FAILURE;
12554 }
12555 wma_ht40_stop_obss_scan(wma_handle, vdev_id);
12556 return QDF_STATUS_SUCCESS;
12557}
Archana Ramachandran20d2e232016-02-11 16:58:40 -080012558
12559/**
12560 * sme_update_mimo_power_save() - Update MIMO power save
12561 * configuration
Jeff Johnsonc7309062018-11-09 20:59:42 -080012562 * @mac_handle: The handle returned by macOpen
Archana Ramachandran20d2e232016-02-11 16:58:40 -080012563 * @is_ht_smps_enabled: enable/disable ht smps
12564 * @ht_smps_mode: smps mode disabled/static/dynamic
Archana Ramachandranfec24812016-02-16 16:31:56 -080012565 * @send_smps_action: flag to send smps force mode command
12566 * to FW
Archana Ramachandran20d2e232016-02-11 16:58:40 -080012567 *
12568 * Return: QDF_STATUS if SME update mimo power save
Jeff Johnson698eacd2018-05-12 17:00:03 -070012569 * configuration success else failure status
Archana Ramachandran20d2e232016-02-11 16:58:40 -080012570 */
Jeff Johnsonc7309062018-11-09 20:59:42 -080012571QDF_STATUS sme_update_mimo_power_save(mac_handle_t mac_handle,
Archana Ramachandran20d2e232016-02-11 16:58:40 -080012572 uint8_t is_ht_smps_enabled,
Archana Ramachandranfec24812016-02-16 16:31:56 -080012573 uint8_t ht_smps_mode,
12574 bool send_smps_action)
Archana Ramachandran20d2e232016-02-11 16:58:40 -080012575{
Jeff Johnson0a8786a2018-12-02 10:49:01 -080012576 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Archana Ramachandranfec24812016-02-16 16:31:56 -080012577
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070012578 sme_debug("SMPS enable: %d mode: %d send action: %d",
Archana Ramachandranfec24812016-02-16 16:31:56 -080012579 is_ht_smps_enabled, ht_smps_mode,
12580 send_smps_action);
Vignesh Viswanathanddc89e52018-11-02 18:43:42 +053012581 mac_ctx->mlme_cfg->ht_caps.enable_smps =
Archana Ramachandran20d2e232016-02-11 16:58:40 -080012582 is_ht_smps_enabled;
Vignesh Viswanathanddc89e52018-11-02 18:43:42 +053012583 mac_ctx->mlme_cfg->ht_caps.smps = ht_smps_mode;
Archana Ramachandranfec24812016-02-16 16:31:56 -080012584 mac_ctx->roam.configParam.send_smps_action =
12585 send_smps_action;
Archana Ramachandran20d2e232016-02-11 16:58:40 -080012586
12587 return QDF_STATUS_SUCCESS;
12588}
12589
12590/**
Gupta, Kapil4cb1d7d2016-04-16 18:16:25 -070012591 * sme_add_beacon_filter() - set the beacon filter configuration
Jeff Johnsonc7309062018-11-09 20:59:42 -080012592 * @mac_handle: The handle returned by macOpen
Gupta, Kapil4cb1d7d2016-04-16 18:16:25 -070012593 * @session_id: session id
12594 * @ie_map: bitwise array of IEs
12595 *
12596 * Return: Return QDF_STATUS, otherwise appropriate failure code
12597 */
Jeff Johnsonc7309062018-11-09 20:59:42 -080012598QDF_STATUS sme_add_beacon_filter(mac_handle_t mac_handle,
Gupta, Kapil4cb1d7d2016-04-16 18:16:25 -070012599 uint32_t session_id,
12600 uint32_t *ie_map)
12601{
Rajeev Kumar37d478b2017-04-17 16:59:28 -070012602 struct scheduler_msg message = {0};
Gupta, Kapil4cb1d7d2016-04-16 18:16:25 -070012603 QDF_STATUS qdf_status;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080012604 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Gupta, Kapil4cb1d7d2016-04-16 18:16:25 -070012605 struct beacon_filter_param *filter_param;
12606
12607 if (!CSR_IS_SESSION_VALID(mac_ctx, session_id)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070012608 sme_err("CSR session not valid: %d", session_id);
Gupta, Kapil4cb1d7d2016-04-16 18:16:25 -070012609 return QDF_STATUS_E_FAILURE;
12610 }
12611
12612 filter_param = qdf_mem_malloc(sizeof(*filter_param));
Arif Hussain0ef77082018-10-10 16:42:53 -070012613 if (!filter_param)
Gupta, Kapil4cb1d7d2016-04-16 18:16:25 -070012614 return QDF_STATUS_E_FAILURE;
Gupta, Kapil4cb1d7d2016-04-16 18:16:25 -070012615
12616 filter_param->vdev_id = session_id;
12617
12618 qdf_mem_copy(filter_param->ie_map, ie_map,
12619 BCN_FLT_MAX_ELEMS_IE_LIST * sizeof(uint32_t));
12620
12621 message.type = WMA_ADD_BCN_FILTER_CMDID;
12622 message.bodyptr = filter_param;
gaurank kathpalia36b0c582018-08-28 17:45:43 +053012623 qdf_status = scheduler_post_message(QDF_MODULE_ID_SME,
12624 QDF_MODULE_ID_WMA,
12625 QDF_MODULE_ID_WMA,
12626 &message);
Gupta, Kapil4cb1d7d2016-04-16 18:16:25 -070012627 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
12628 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
12629 "%s: Not able to post msg to WDA!",
12630 __func__);
12631
12632 qdf_mem_free(filter_param);
12633 }
12634 return qdf_status;
12635}
12636
12637/**
12638 * sme_remove_beacon_filter() - set the beacon filter configuration
Jeff Johnsonc7309062018-11-09 20:59:42 -080012639 * @mac_handle: The handle returned by macOpen
Gupta, Kapil4cb1d7d2016-04-16 18:16:25 -070012640 * @session_id: session id
12641 *
12642 * Return: Return QDF_STATUS, otherwise appropriate failure code
12643 */
Jeff Johnsonc7309062018-11-09 20:59:42 -080012644QDF_STATUS sme_remove_beacon_filter(mac_handle_t mac_handle,
12645 uint32_t session_id)
Gupta, Kapil4cb1d7d2016-04-16 18:16:25 -070012646{
Rajeev Kumar37d478b2017-04-17 16:59:28 -070012647 struct scheduler_msg message = {0};
Gupta, Kapil4cb1d7d2016-04-16 18:16:25 -070012648 QDF_STATUS qdf_status;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080012649 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Gupta, Kapil4cb1d7d2016-04-16 18:16:25 -070012650 struct beacon_filter_param *filter_param;
12651
12652 if (!CSR_IS_SESSION_VALID(mac_ctx, session_id)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070012653 sme_err("CSR session not valid: %d", session_id);
Gupta, Kapil4cb1d7d2016-04-16 18:16:25 -070012654 return QDF_STATUS_E_FAILURE;
12655 }
12656
12657 filter_param = qdf_mem_malloc(sizeof(*filter_param));
Arif Hussain0ef77082018-10-10 16:42:53 -070012658 if (!filter_param)
Gupta, Kapil4cb1d7d2016-04-16 18:16:25 -070012659 return QDF_STATUS_E_FAILURE;
Gupta, Kapil4cb1d7d2016-04-16 18:16:25 -070012660
12661 filter_param->vdev_id = session_id;
12662
12663 message.type = WMA_REMOVE_BCN_FILTER_CMDID;
12664 message.bodyptr = filter_param;
gaurank kathpalia36b0c582018-08-28 17:45:43 +053012665 qdf_status = scheduler_post_message(QDF_MODULE_ID_SME,
12666 QDF_MODULE_ID_WMA,
12667 QDF_MODULE_ID_WMA,
12668 &message);
Gupta, Kapil4cb1d7d2016-04-16 18:16:25 -070012669 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
12670 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
12671 "%s: Not able to post msg to WDA!",
12672 __func__);
12673
12674 qdf_mem_free(filter_param);
12675 }
12676 return qdf_status;
12677}
Arun Khandavalli2476ef52016-04-26 20:19:43 +053012678
Arun Khandavalli2476ef52016-04-26 20:19:43 +053012679/**
Kondabattini, Ganesh3f2d02c2016-09-13 12:23:47 +053012680 * sme_send_disassoc_req_frame - send disassoc req
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -080012681 * @mac_handle: Opaque handle to the global MAC context
Kondabattini, Ganesh3f2d02c2016-09-13 12:23:47 +053012682 * @session_id: session id
12683 * @peer_mac: peer mac address
12684 * @reason: reason for disassociation
12685 * wait_for_ack: wait for acknowledgment
12686 *
12687 * function to send disassoc request to lim
12688 *
12689 * return: none
12690 */
Jeff Johnsonc7309062018-11-09 20:59:42 -080012691void sme_send_disassoc_req_frame(mac_handle_t mac_handle, uint8_t session_id,
12692 uint8_t *peer_mac, uint16_t reason,
12693 uint8_t wait_for_ack)
Kondabattini, Ganesh3f2d02c2016-09-13 12:23:47 +053012694{
12695 struct sme_send_disassoc_frm_req *msg;
12696 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Kondabattini, Ganesh3f2d02c2016-09-13 12:23:47 +053012697
Jeff Johnson0e1e7682019-02-20 13:36:04 -080012698 msg = qdf_mem_malloc(sizeof(*msg));
Arif Hussain0ef77082018-10-10 16:42:53 -070012699 if (!msg)
Kondabattini, Ganesh3f2d02c2016-09-13 12:23:47 +053012700 return;
12701
Jeff Johnson0e1e7682019-02-20 13:36:04 -080012702 msg->msg_type = eWNI_SME_SEND_DISASSOC_FRAME;
12703 msg->length = sizeof(*msg);
12704 msg->session_id = session_id;
12705 qdf_mem_copy(msg->peer_mac, peer_mac, QDF_MAC_ADDR_SIZE);
12706 msg->reason = reason;
12707 msg->wait_for_ack = wait_for_ack;
Kondabattini, Ganesh3f2d02c2016-09-13 12:23:47 +053012708
Rajeev Kumard138ac52017-01-30 18:38:37 -080012709 qdf_status = umac_send_mb_message_to_mac(msg);
Jeff Johnson0e1e7682019-02-20 13:36:04 -080012710 if (QDF_IS_STATUS_ERROR(qdf_status))
12711 sme_err("umac_send_mb_message_to_mac failed, %d",
12712 qdf_status);
Kondabattini, Ganesh3f2d02c2016-09-13 12:23:47 +053012713}
12714
Nachiket Kukade177b5b02018-05-22 20:52:17 +053012715#ifdef FEATURE_WLAN_APF
Jeff Johnsonc7309062018-11-09 20:59:42 -080012716QDF_STATUS sme_get_apf_capabilities(mac_handle_t mac_handle,
Nachiket Kukade177b5b02018-05-22 20:52:17 +053012717 apf_get_offload_cb callback,
12718 void *context)
Arun Khandavalli2476ef52016-04-26 20:19:43 +053012719{
12720 QDF_STATUS status = QDF_STATUS_SUCCESS;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080012721 struct mac_context * mac_ctx = MAC_CONTEXT(mac_handle);
Rajeev Kumar37d478b2017-04-17 16:59:28 -070012722 struct scheduler_msg cds_msg = {0};
Arun Khandavalli2476ef52016-04-26 20:19:43 +053012723
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070012724 SME_ENTER();
Arun Khandavalli2476ef52016-04-26 20:19:43 +053012725
12726 status = sme_acquire_global_lock(&mac_ctx->sme);
12727 if (QDF_STATUS_SUCCESS == status) {
12728 /* Serialize the req through MC thread */
Nachiket Kukadee547a482018-05-22 16:43:30 +053012729 mac_ctx->sme.apf_get_offload_cb = callback;
12730 mac_ctx->sme.apf_get_offload_context = context;
Arun Khandavalli2476ef52016-04-26 20:19:43 +053012731 cds_msg.bodyptr = NULL;
Nachiket Kukadee547a482018-05-22 16:43:30 +053012732 cds_msg.type = WDA_APF_GET_CAPABILITIES_REQ;
gaurank kathpalia36b0c582018-08-28 17:45:43 +053012733 status = scheduler_post_message(QDF_MODULE_ID_SME,
12734 QDF_MODULE_ID_WMA,
12735 QDF_MODULE_ID_WMA, &cds_msg);
Arun Khandavalli2476ef52016-04-26 20:19:43 +053012736 if (!QDF_IS_STATUS_SUCCESS(status)) {
12737 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Nachiket Kukadee547a482018-05-22 16:43:30 +053012738 FL("Post apf get offload msg fail"));
Arun Khandavalli2476ef52016-04-26 20:19:43 +053012739 status = QDF_STATUS_E_FAILURE;
12740 }
12741 sme_release_global_lock(&mac_ctx->sme);
Arun Khandavalli2476ef52016-04-26 20:19:43 +053012742 }
Madhvapathi Sriram3e6627a2018-12-19 12:54:49 +053012743
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070012744 SME_EXIT();
Arun Khandavalli2476ef52016-04-26 20:19:43 +053012745 return status;
12746}
12747
Jeff Johnsonc7309062018-11-09 20:59:42 -080012748QDF_STATUS sme_set_apf_instructions(mac_handle_t mac_handle,
Nachiket Kukadee547a482018-05-22 16:43:30 +053012749 struct sir_apf_set_offload *req)
Arun Khandavalli2476ef52016-04-26 20:19:43 +053012750{
Nachiket Kukade4f686582018-11-19 19:18:27 +053012751 void *wma_handle;
Arun Khandavalli2476ef52016-04-26 20:19:43 +053012752
Nachiket Kukade4f686582018-11-19 19:18:27 +053012753 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
12754 if (!wma_handle) {
Arun Khandavalli2476ef52016-04-26 20:19:43 +053012755 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Nachiket Kukade4f686582018-11-19 19:18:27 +053012756 "wma handle is NULL");
12757 return QDF_STATUS_E_FAILURE;
Arun Khandavalli2476ef52016-04-26 20:19:43 +053012758 }
Nachiket Kukade4f686582018-11-19 19:18:27 +053012759
12760 return wma_set_apf_instructions(wma_handle, req);
Arun Khandavalli2476ef52016-04-26 20:19:43 +053012761}
12762
Jeff Johnsonc7309062018-11-09 20:59:42 -080012763QDF_STATUS sme_set_apf_enable_disable(mac_handle_t mac_handle, uint8_t vdev_id,
Nachiket Kukade177b5b02018-05-22 20:52:17 +053012764 bool apf_enable)
12765{
12766 void *wma_handle;
12767
12768 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
12769 if (!wma_handle) {
12770 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
12771 "wma handle is NULL");
12772 return QDF_STATUS_E_FAILURE;
12773 }
12774
12775 return wma_send_apf_enable_cmd(wma_handle, vdev_id, apf_enable);
12776}
12777
12778QDF_STATUS
Jeff Johnsonc7309062018-11-09 20:59:42 -080012779sme_apf_write_work_memory(mac_handle_t mac_handle,
Nachiket Kukade177b5b02018-05-22 20:52:17 +053012780 struct wmi_apf_write_memory_params *write_params)
12781{
12782 void *wma_handle;
12783
12784 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
12785 if (!wma_handle) {
12786 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
12787 "wma handle is NULL");
12788 return QDF_STATUS_E_FAILURE;
12789 }
12790
12791 return wma_send_apf_write_work_memory_cmd(wma_handle, write_params);
12792}
12793
12794QDF_STATUS
Jeff Johnsonc7309062018-11-09 20:59:42 -080012795sme_apf_read_work_memory(mac_handle_t mac_handle,
Nachiket Kukade177b5b02018-05-22 20:52:17 +053012796 struct wmi_apf_read_memory_params *read_params,
12797 apf_read_mem_cb callback)
12798{
12799 QDF_STATUS status = QDF_STATUS_SUCCESS;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080012800 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Nachiket Kukade177b5b02018-05-22 20:52:17 +053012801 void *wma_handle;
12802
12803 status = sme_acquire_global_lock(&mac->sme);
12804 if (QDF_IS_STATUS_SUCCESS(status)) {
12805 mac->sme.apf_read_mem_cb = callback;
12806 sme_release_global_lock(&mac->sme);
12807 } else {
12808 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
12809 FL("sme_acquire_global_lock failed"));
12810 }
12811
12812 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
12813 if (!wma_handle) {
12814 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
12815 "wma handle is NULL");
12816 return QDF_STATUS_E_FAILURE;
12817 }
12818
12819 return wma_send_apf_read_work_memory_cmd(wma_handle, read_params);
12820}
12821#endif /* FEATURE_WLAN_APF */
12822
Arun Khandavalli2476ef52016-04-26 20:19:43 +053012823/**
Abhishek Singh1c676222016-05-09 14:20:28 +053012824 * sme_get_wni_dot11_mode() - return configured wni dot11mode
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -080012825 * @mac_handle: Opaque handle to the global MAC context
Abhishek Singh1c676222016-05-09 14:20:28 +053012826 *
12827 * Return: wni dot11 mode.
12828 */
Jeff Johnsonc7309062018-11-09 20:59:42 -080012829uint32_t sme_get_wni_dot11_mode(mac_handle_t mac_handle)
Abhishek Singh1c676222016-05-09 14:20:28 +053012830{
Jeff Johnson0a8786a2018-12-02 10:49:01 -080012831 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Abhishek Singh1c676222016-05-09 14:20:28 +053012832
12833 return csr_translate_to_wni_cfg_dot11_mode(mac_ctx,
12834 mac_ctx->roam.configParam.uCfgDot11Mode);
12835}
12836
12837/**
Manjunathappa Prakash59f861d2016-04-21 10:33:31 -070012838 * sme_create_mon_session() - post message to create PE session for monitormode
12839 * operation
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -080012840 * @mac_handle: Opaque handle to the global MAC context
Manjunathappa Prakash59f861d2016-04-21 10:33:31 -070012841 * @bssid: pointer to bssid
Rajeev Kumar Sirasanagandlae3b59912018-08-24 15:53:31 +053012842 * @vdev_id: sme session id
Manjunathappa Prakash59f861d2016-04-21 10:33:31 -070012843 *
12844 * Return: QDF_STATUS_SUCCESS on success, non-zero error code on failure.
12845 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -080012846QDF_STATUS sme_create_mon_session(mac_handle_t mac_handle, tSirMacAddr bss_id,
Rajeev Kumar Sirasanagandlae3b59912018-08-24 15:53:31 +053012847 uint8_t vdev_id)
Manjunathappa Prakash59f861d2016-04-21 10:33:31 -070012848{
12849 QDF_STATUS status = QDF_STATUS_E_FAILURE;
12850 struct sir_create_session *msg;
12851
12852 msg = qdf_mem_malloc(sizeof(*msg));
chenguo92af4bf2018-10-25 13:54:58 +080012853 if (msg) {
Manjunathappa Prakash59f861d2016-04-21 10:33:31 -070012854 msg->type = eWNI_SME_MON_INIT_SESSION;
Rajeev Kumar Sirasanagandlae3b59912018-08-24 15:53:31 +053012855 msg->vdev_id = vdev_id;
Manjunathappa Prakash59f861d2016-04-21 10:33:31 -070012856 msg->msg_len = sizeof(*msg);
12857 qdf_mem_copy(msg->bss_id.bytes, bss_id, QDF_MAC_ADDR_SIZE);
Rajeev Kumard138ac52017-01-30 18:38:37 -080012858 status = umac_send_mb_message_to_mac(msg);
Manjunathappa Prakash59f861d2016-04-21 10:33:31 -070012859 }
12860 return status;
12861}
Gupta, Kapil96c7f2f2016-04-25 19:13:41 +053012862
Jeff Johnsonb460dd72018-11-08 10:26:51 -080012863void sme_set_chan_info_callback(mac_handle_t mac_handle,
Kapil Gupta4f0c0c12017-02-07 15:21:15 +053012864 void (*callback)(struct scan_chan_info *chan_info))
12865{
Jeff Johnson0a8786a2018-12-02 10:49:01 -080012866 struct mac_context *mac;
Kapil Gupta4f0c0c12017-02-07 15:21:15 +053012867
Jeff Johnson038efe72019-03-18 13:39:31 -070012868 if (!mac_handle) {
Kapil Gupta4f0c0c12017-02-07 15:21:15 +053012869 QDF_ASSERT(0);
12870 return;
12871 }
Jeff Johnsona0619e42018-11-28 17:43:00 -080012872 mac = MAC_CONTEXT(mac_handle);
Kapil Gupta4f0c0c12017-02-07 15:21:15 +053012873 mac->chan_info_cb = callback;
12874}
12875
Gupta, Kapil96c7f2f2016-04-25 19:13:41 +053012876/**
Naveen Rawata410c5a2016-09-19 14:22:33 -070012877 * sme_set_vdev_ies_per_band() - sends the per band IEs to vdev
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -080012878 * @mac_handle: Opaque handle to the global MAC context
Naveen Rawata410c5a2016-09-19 14:22:33 -070012879 * @vdev_id: vdev_id for which IE is targeted
12880 *
12881 * Return: None
12882 */
Jeff Johnsonc7309062018-11-09 20:59:42 -080012883void sme_set_vdev_ies_per_band(mac_handle_t mac_handle, uint8_t vdev_id)
Naveen Rawata410c5a2016-09-19 14:22:33 -070012884{
Naveen Rawata410c5a2016-09-19 14:22:33 -070012885 struct sir_set_vdev_ies_per_band *p_msg;
12886 QDF_STATUS status = QDF_STATUS_E_FAILURE;
12887
12888 p_msg = qdf_mem_malloc(sizeof(*p_msg));
Arif Hussain0ef77082018-10-10 16:42:53 -070012889 if (!p_msg)
Naveen Rawata410c5a2016-09-19 14:22:33 -070012890 return;
Naveen Rawata410c5a2016-09-19 14:22:33 -070012891
12892 p_msg->vdev_id = vdev_id;
12893 p_msg->msg_type = eWNI_SME_SET_VDEV_IES_PER_BAND;
12894 p_msg->len = sizeof(*p_msg);
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070012895 sme_debug("sending eWNI_SME_SET_VDEV_IES_PER_BAND: vdev_id: %d",
Naveen Rawata410c5a2016-09-19 14:22:33 -070012896 vdev_id);
Rajeev Kumard138ac52017-01-30 18:38:37 -080012897 status = umac_send_mb_message_to_mac(p_msg);
Naveen Rawata410c5a2016-09-19 14:22:33 -070012898 if (QDF_STATUS_SUCCESS != status)
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070012899 sme_err("Send eWNI_SME_SET_VDEV_IES_PER_BAND fail");
Naveen Rawata410c5a2016-09-19 14:22:33 -070012900}
12901
Kiran Kumar Lokere666bf852016-05-02 12:23:02 -070012902/**
12903 * sme_set_pdev_ht_vht_ies() - sends the set pdev IE req
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -080012904 * @mac_handle: Opaque handle to the global MAC context
Kiran Kumar Lokere666bf852016-05-02 12:23:02 -070012905 * @enable2x2: 1x1 or 2x2 mode.
12906 *
12907 * Sends the set pdev IE req with Nss value.
12908 *
12909 * Return: None
12910 */
Jeff Johnsonc7309062018-11-09 20:59:42 -080012911void sme_set_pdev_ht_vht_ies(mac_handle_t mac_handle, bool enable2x2)
Kiran Kumar Lokere666bf852016-05-02 12:23:02 -070012912{
Jeff Johnson0a8786a2018-12-02 10:49:01 -080012913 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Kiran Kumar Lokere666bf852016-05-02 12:23:02 -070012914 struct sir_set_ht_vht_cfg *ht_vht_cfg;
12915 QDF_STATUS status = QDF_STATUS_E_FAILURE;
12916
Kiran Kumar Lokere666bf852016-05-02 12:23:02 -070012917 if (!((mac_ctx->roam.configParam.uCfgDot11Mode ==
12918 eCSR_CFG_DOT11_MODE_AUTO) ||
12919 (mac_ctx->roam.configParam.uCfgDot11Mode ==
12920 eCSR_CFG_DOT11_MODE_11N) ||
12921 (mac_ctx->roam.configParam.uCfgDot11Mode ==
12922 eCSR_CFG_DOT11_MODE_11N_ONLY) ||
12923 (mac_ctx->roam.configParam.uCfgDot11Mode ==
12924 eCSR_CFG_DOT11_MODE_11AC) ||
12925 (mac_ctx->roam.configParam.uCfgDot11Mode ==
12926 eCSR_CFG_DOT11_MODE_11AC_ONLY)))
12927 return;
12928
12929 status = sme_acquire_global_lock(&mac_ctx->sme);
12930 if (QDF_STATUS_SUCCESS == status) {
12931 ht_vht_cfg = qdf_mem_malloc(sizeof(*ht_vht_cfg));
Arif Hussain0ef77082018-10-10 16:42:53 -070012932 if (!ht_vht_cfg) {
Kiran Kumar Lokere666bf852016-05-02 12:23:02 -070012933 sme_release_global_lock(&mac_ctx->sme);
12934 return;
12935 }
12936
12937 ht_vht_cfg->pdev_id = 0;
12938 if (enable2x2)
12939 ht_vht_cfg->nss = 2;
12940 else
12941 ht_vht_cfg->nss = 1;
12942 ht_vht_cfg->dot11mode =
12943 (uint8_t)csr_translate_to_wni_cfg_dot11_mode(mac_ctx,
12944 mac_ctx->roam.configParam.uCfgDot11Mode);
12945
12946 ht_vht_cfg->msg_type = eWNI_SME_PDEV_SET_HT_VHT_IE;
12947 ht_vht_cfg->len = sizeof(*ht_vht_cfg);
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070012948 sme_debug("SET_HT_VHT_IE with nss: %d, dot11mode: %d",
12949 ht_vht_cfg->nss,
12950 ht_vht_cfg->dot11mode);
Rajeev Kumard138ac52017-01-30 18:38:37 -080012951 status = umac_send_mb_message_to_mac(ht_vht_cfg);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053012952 if (QDF_STATUS_SUCCESS != status)
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070012953 sme_err("Send SME_PDEV_SET_HT_VHT_IE fail");
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053012954
Kiran Kumar Lokere666bf852016-05-02 12:23:02 -070012955 sme_release_global_lock(&mac_ctx->sme);
12956 }
Kiran Kumar Lokere666bf852016-05-02 12:23:02 -070012957}
12958
Jeff Johnsonc7309062018-11-09 20:59:42 -080012959void sme_update_vdev_type_nss(mac_handle_t mac_handle, uint8_t max_supp_nss,
gaurank kathpalia651abcd2018-11-12 22:41:23 +053012960 enum nss_chains_band_info band)
Kiran Kumar Lokere666bf852016-05-02 12:23:02 -070012961{
Jeff Johnson0a8786a2018-12-02 10:49:01 -080012962 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Kiran Kumar Lokere666bf852016-05-02 12:23:02 -070012963 struct vdev_type_nss *vdev_nss;
12964
gaurank kathpalia651abcd2018-11-12 22:41:23 +053012965 struct wlan_mlme_nss_chains *nss_chains_ini_cfg =
12966 &mac_ctx->mlme_cfg->nss_chains_ini_cfg;
12967
12968 if (band == NSS_CHAINS_BAND_5GHZ)
Kiran Kumar Lokere666bf852016-05-02 12:23:02 -070012969 vdev_nss = &mac_ctx->vdev_type_nss_5g;
12970 else
12971 vdev_nss = &mac_ctx->vdev_type_nss_2g;
12972
gaurank kathpalia651abcd2018-11-12 22:41:23 +053012973 vdev_nss->sta = QDF_MIN(max_supp_nss, GET_VDEV_NSS_CHAIN(
12974 nss_chains_ini_cfg->
gaurank kathpalia42911082019-01-22 17:39:49 +053012975 rx_nss[band],
gaurank kathpalia651abcd2018-11-12 22:41:23 +053012976 STA_NSS_CHAINS_SHIFT));
12977 vdev_nss->sap = QDF_MIN(max_supp_nss, GET_VDEV_NSS_CHAIN(
12978 nss_chains_ini_cfg->
gaurank kathpalia42911082019-01-22 17:39:49 +053012979 rx_nss[band],
gaurank kathpalia651abcd2018-11-12 22:41:23 +053012980 SAP_NSS_CHAINS_SHIFT));
12981 vdev_nss->p2p_go = QDF_MIN(max_supp_nss, GET_VDEV_NSS_CHAIN(
12982 nss_chains_ini_cfg->
gaurank kathpalia42911082019-01-22 17:39:49 +053012983 rx_nss[band],
gaurank kathpalia651abcd2018-11-12 22:41:23 +053012984 P2P_GO_NSS_CHAINS_SHIFT));
12985 vdev_nss->p2p_cli = QDF_MIN(max_supp_nss, GET_VDEV_NSS_CHAIN(
12986 nss_chains_ini_cfg->
gaurank kathpalia42911082019-01-22 17:39:49 +053012987 rx_nss[band],
gaurank kathpalia651abcd2018-11-12 22:41:23 +053012988 P2P_CLI_CHAINS_SHIFT));
12989 vdev_nss->p2p_dev = QDF_MIN(max_supp_nss, GET_VDEV_NSS_CHAIN(
12990 nss_chains_ini_cfg->
gaurank kathpalia42911082019-01-22 17:39:49 +053012991 rx_nss[band],
gaurank kathpalia651abcd2018-11-12 22:41:23 +053012992 P2P_DEV_NSS_CHAINS_SHIFT));
12993 vdev_nss->ibss = QDF_MIN(max_supp_nss, GET_VDEV_NSS_CHAIN(
12994 nss_chains_ini_cfg->
gaurank kathpalia42911082019-01-22 17:39:49 +053012995 rx_nss[band],
gaurank kathpalia651abcd2018-11-12 22:41:23 +053012996 IBSS_NSS_CHAINS_SHIFT));
12997 vdev_nss->tdls = QDF_MIN(max_supp_nss, GET_VDEV_NSS_CHAIN(
12998 nss_chains_ini_cfg->
gaurank kathpalia42911082019-01-22 17:39:49 +053012999 rx_nss[band],
gaurank kathpalia651abcd2018-11-12 22:41:23 +053013000 TDLS_NSS_CHAINS_SHIFT));
13001 vdev_nss->ocb = QDF_MIN(max_supp_nss, GET_VDEV_NSS_CHAIN(
13002 nss_chains_ini_cfg->
gaurank kathpalia42911082019-01-22 17:39:49 +053013003 rx_nss[band],
gaurank kathpalia651abcd2018-11-12 22:41:23 +053013004 OCB_NSS_CHAINS_SHIFT));
Nachiket Kukadecf941602018-12-12 14:32:35 +053013005 vdev_nss->nan = QDF_MIN(max_supp_nss, GET_VDEV_NSS_CHAIN(
13006 nss_chains_ini_cfg->
gaurank kathpalia42911082019-01-22 17:39:49 +053013007 rx_nss[band],
Nachiket Kukadecf941602018-12-12 14:32:35 +053013008 NAN_NSS_CHAIN_SHIFT));
Nachiket Kukade413c5fa2019-02-19 17:57:19 +053013009 vdev_nss->ndi = QDF_MIN(max_supp_nss, GET_VDEV_NSS_CHAIN(
13010 nss_chains_ini_cfg->
13011 rx_nss[band],
13012 NAN_NSS_CHAIN_SHIFT));
Kiran Kumar Lokere666bf852016-05-02 12:23:02 -070013013
Nachiket Kukadecf941602018-12-12 14:32:35 +053013014 sme_debug("band %d NSS:sta %d sap %d cli %d go %d dev %d ibss %d tdls %d ocb %d nan %d",
13015 band, vdev_nss->sta, vdev_nss->sap, vdev_nss->p2p_cli,
13016 vdev_nss->p2p_go, vdev_nss->p2p_dev, vdev_nss->ibss,
13017 vdev_nss->tdls, vdev_nss->ocb, vdev_nss->nan);
Kiran Kumar Lokere666bf852016-05-02 12:23:02 -070013018}
Peng Xu8fdaa492016-06-22 10:20:47 -070013019
Kiran Kumar Lokeree6476b22017-10-16 23:40:32 -070013020#ifdef WLAN_FEATURE_11AX_BSS_COLOR
13021#define MAX_BSS_COLOR_VAL 63
13022#define MIN_BSS_COLOR_VAL 1
13023
Jeff Johnsonc7309062018-11-09 20:59:42 -080013024QDF_STATUS sme_set_he_bss_color(mac_handle_t mac_handle, uint8_t session_id,
13025 uint8_t bss_color)
Kiran Kumar Lokeree6476b22017-10-16 23:40:32 -070013026
13027{
13028 struct sir_set_he_bss_color *bss_color_msg;
13029 uint8_t len;
13030
Jeff Johnsonc7309062018-11-09 20:59:42 -080013031 if (!mac_handle) {
13032 sme_err("Invalid mac_handle pointer");
Kiran Kumar Lokeree6476b22017-10-16 23:40:32 -070013033 return QDF_STATUS_E_FAULT;
13034 }
13035
13036 sme_debug("Set HE bss_color %d", bss_color);
13037
13038 if (bss_color < MIN_BSS_COLOR_VAL || bss_color > MAX_BSS_COLOR_VAL) {
13039 sme_debug("Invalid HE bss_color %d", bss_color);
13040 return QDF_STATUS_E_INVAL;
13041 }
13042 len = sizeof(*bss_color_msg);
13043 bss_color_msg = qdf_mem_malloc(len);
Arif Hussain0ef77082018-10-10 16:42:53 -070013044 if (!bss_color_msg)
Kiran Kumar Lokeree6476b22017-10-16 23:40:32 -070013045 return QDF_STATUS_E_NOMEM;
Arif Hussain0ef77082018-10-10 16:42:53 -070013046
Kiran Kumar Lokeree6476b22017-10-16 23:40:32 -070013047 bss_color_msg->message_type = eWNI_SME_SET_HE_BSS_COLOR;
13048 bss_color_msg->length = len;
13049 bss_color_msg->session_id = session_id;
13050 bss_color_msg->bss_color = bss_color;
13051 return umac_send_mb_message_to_mac(bss_color_msg);
13052}
13053#endif
13054
Rachit Kankane026e77a2018-07-31 16:21:09 +053013055#ifdef FEATURE_P2P_LISTEN_OFFLOAD
Nitesh Shahdb5ea0d2017-03-22 15:17:47 +053013056/**
Peng Xu8fdaa492016-06-22 10:20:47 -070013057 * sme_register_p2p_lo_event() - Register for the p2p lo event
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -080013058 * @mac_handle: Opaque handle to the global MAC context
Peng Xu8fdaa492016-06-22 10:20:47 -070013059 * @context: the context of the call
13060 * @callback: the callback to hdd
13061 *
13062 * This function registers the callback function for P2P listen
13063 * offload stop event.
13064 *
13065 * Return: none
13066 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -080013067void sme_register_p2p_lo_event(mac_handle_t mac_handle, void *context,
Jeff Johnsonf7e36d62018-07-04 21:14:02 -070013068 p2p_lo_callback callback)
Peng Xu8fdaa492016-06-22 10:20:47 -070013069{
Jeff Johnson0a8786a2018-12-02 10:49:01 -080013070 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Peng Xu8fdaa492016-06-22 10:20:47 -070013071 QDF_STATUS status = QDF_STATUS_E_FAILURE;
13072
Jeff Johnson01f2c232018-11-21 19:17:44 -080013073 status = sme_acquire_global_lock(&mac->sme);
13074 mac->sme.p2p_lo_event_callback = callback;
13075 mac->sme.p2p_lo_event_context = context;
13076 sme_release_global_lock(&mac->sme);
Peng Xu8fdaa492016-06-22 10:20:47 -070013077}
Rachit Kankane026e77a2018-07-31 16:21:09 +053013078#endif
Manjeet Singhf82ed072016-07-08 11:40:00 +053013079
13080/**
13081 * sme_process_mac_pwr_dbg_cmd() - enable mac pwr debugging
Jeff Johnsonc7309062018-11-09 20:59:42 -080013082 * @mac_handle: The handle returned by macOpen
Manjeet Singhf82ed072016-07-08 11:40:00 +053013083 * @session_id: session id
13084 * @dbg_args: args for mac pwr debug command
13085 * Return: Return QDF_STATUS, otherwise appropriate failure code
13086 */
Jeff Johnsonc7309062018-11-09 20:59:42 -080013087QDF_STATUS sme_process_mac_pwr_dbg_cmd(mac_handle_t mac_handle,
13088 uint32_t session_id,
13089 struct sir_mac_pwr_dbg_cmd *dbg_args)
Manjeet Singhf82ed072016-07-08 11:40:00 +053013090{
Rajeev Kumar37d478b2017-04-17 16:59:28 -070013091 struct scheduler_msg message = {0};
Jeff Johnson0a8786a2018-12-02 10:49:01 -080013092 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Manjeet Singhf82ed072016-07-08 11:40:00 +053013093 struct sir_mac_pwr_dbg_cmd *req;
13094 int i;
13095
13096 if (!CSR_IS_SESSION_VALID(mac_ctx, session_id)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070013097 sme_err("CSR session not valid: %d", session_id);
Manjeet Singhf82ed072016-07-08 11:40:00 +053013098 return QDF_STATUS_E_FAILURE;
13099 }
13100
13101 req = qdf_mem_malloc(sizeof(*req));
Arif Hussain0ef77082018-10-10 16:42:53 -070013102 if (!req)
Manjeet Singhf82ed072016-07-08 11:40:00 +053013103 return QDF_STATUS_E_FAILURE;
Arif Hussain0ef77082018-10-10 16:42:53 -070013104
Manjeet Singhf82ed072016-07-08 11:40:00 +053013105 req->module_id = dbg_args->module_id;
13106 req->pdev_id = dbg_args->pdev_id;
13107 req->num_args = dbg_args->num_args;
13108 for (i = 0; i < req->num_args; i++)
13109 req->args[i] = dbg_args->args[i];
13110
13111 message.type = SIR_HAL_POWER_DBG_CMD;
13112 message.bodyptr = req;
13113
gaurank kathpalia36b0c582018-08-28 17:45:43 +053013114 if (!QDF_IS_STATUS_SUCCESS(scheduler_post_message(QDF_MODULE_ID_SME,
13115 QDF_MODULE_ID_WMA,
13116 QDF_MODULE_ID_WMA,
13117 &message))) {
Manjeet Singhf82ed072016-07-08 11:40:00 +053013118 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
13119 "%s: Not able to post msg to WDA!",
13120 __func__);
13121 qdf_mem_free(req);
13122 }
13123 return QDF_STATUS_SUCCESS;
13124}
Tushnim Bhattacharyyaf44a9d82016-07-05 10:52:06 -070013125/**
13126 * sme_get_vdev_type_nss() - gets the nss per vdev type
Tushnim Bhattacharyyaf44a9d82016-07-05 10:52:06 -070013127 * @dev_mode: connection type.
13128 * @nss2g: Pointer to the 2G Nss parameter.
13129 * @nss5g: Pointer to the 5G Nss parameter.
13130 *
13131 * Fills the 2G and 5G Nss values based on connection type.
13132 *
13133 * Return: None
13134 */
Jeff Johnsonc1e62782017-11-09 09:50:17 -080013135void sme_get_vdev_type_nss(enum QDF_OPMODE dev_mode,
13136 uint8_t *nss_2g, uint8_t *nss_5g)
Tushnim Bhattacharyyaf44a9d82016-07-05 10:52:06 -070013137{
Jeff Johnson0a8786a2018-12-02 10:49:01 -080013138 struct mac_context *mac_ctx = sme_get_mac_context();
Tushnim Bhattacharyya0c4ad2d2017-03-09 15:59:03 -080013139
Jeff Johnson038efe72019-03-18 13:39:31 -070013140 if (!mac_ctx) {
Tushnim Bhattacharyya0c4ad2d2017-03-09 15:59:03 -080013141 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
13142 FL("Invalid MAC context"));
13143 return;
13144 }
Tushnim Bhattacharyyaf44a9d82016-07-05 10:52:06 -070013145 csr_get_vdev_type_nss(mac_ctx, dev_mode, nss_2g, nss_5g);
13146}
Agrawal Ashish21ba2572016-09-03 16:40:10 +053013147
13148/**
13149 * sme_update_sta_roam_policy() - update sta roam policy for
13150 * unsafe and DFS channels.
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -080013151 * @mac_handle: Opaque handle to the global MAC context
Agrawal Ashish21ba2572016-09-03 16:40:10 +053013152 * @dfs_mode: dfs mode which tell if dfs channel needs to be
13153 * skipped or not
13154 * @skip_unsafe_channels: Param to tell if driver needs to
13155 * skip unsafe channels or not.
13156 * @param session_id: sme_session_id
Agrawal, Ashish9f84c402016-11-30 16:19:44 +053013157 * @sap_operating_band: Band on which SAP is operating
Agrawal Ashish21ba2572016-09-03 16:40:10 +053013158 *
13159 * sme_update_sta_roam_policy update sta rome policies to csr
13160 * this function will call csrUpdateChannelList as well
13161 * to include/exclude DFS channels and unsafe channels.
13162 *
13163 * Return: eHAL_STATUS_SUCCESS or non-zero on failure.
13164 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -080013165QDF_STATUS sme_update_sta_roam_policy(mac_handle_t mac_handle,
Jeff Johnsonc7309062018-11-09 20:59:42 -080013166 enum sta_roam_policy_dfs_mode dfs_mode,
13167 bool skip_unsafe_channels,
13168 uint8_t session_id,
13169 uint8_t sap_operating_band)
Agrawal Ashish21ba2572016-09-03 16:40:10 +053013170{
Jeff Johnson0a8786a2018-12-02 10:49:01 -080013171 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Agrawal Ashish21ba2572016-09-03 16:40:10 +053013172 QDF_STATUS status = QDF_STATUS_SUCCESS;
Jeff Johnson46b4f0e2019-03-08 10:48:35 -080013173 struct sme_config_params *sme_config;
Agrawal Ashish21ba2572016-09-03 16:40:10 +053013174
13175 if (!mac_ctx) {
13176 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_FATAL,
13177 "%s: mac_ctx is null", __func__);
13178 return QDF_STATUS_E_FAILURE;
13179 }
Agrawal Ashish21ba2572016-09-03 16:40:10 +053013180
Sridhar Selvaraj48c47092017-07-31 18:18:14 +053013181 sme_config = qdf_mem_malloc(sizeof(*sme_config));
Arif Hussain0ef77082018-10-10 16:42:53 -070013182 if (!sme_config)
Sridhar Selvaraj48c47092017-07-31 18:18:14 +053013183 return QDF_STATUS_E_FAILURE;
Arif Hussain0ef77082018-10-10 16:42:53 -070013184
Sridhar Selvaraj48c47092017-07-31 18:18:14 +053013185 qdf_mem_zero(sme_config, sizeof(*sme_config));
Jeff Johnsonb460dd72018-11-08 10:26:51 -080013186 sme_get_config_param(mac_handle, sme_config);
Sridhar Selvaraj48c47092017-07-31 18:18:14 +053013187
13188 sme_config->csrConfig.sta_roam_policy_params.dfs_mode =
Agrawal Ashish21ba2572016-09-03 16:40:10 +053013189 dfs_mode;
Sridhar Selvaraj48c47092017-07-31 18:18:14 +053013190 sme_config->csrConfig.sta_roam_policy_params.skip_unsafe_channels =
Agrawal Ashish21ba2572016-09-03 16:40:10 +053013191 skip_unsafe_channels;
Sridhar Selvaraj48c47092017-07-31 18:18:14 +053013192 sme_config->csrConfig.sta_roam_policy_params.sap_operating_band =
Agrawal, Ashish9f84c402016-11-30 16:19:44 +053013193 sap_operating_band;
Agrawal Ashish21ba2572016-09-03 16:40:10 +053013194
Jeff Johnsonb460dd72018-11-08 10:26:51 -080013195 sme_update_config(mac_handle, sme_config);
Agrawal Ashish21ba2572016-09-03 16:40:10 +053013196
13197 status = csr_update_channel_list(mac_ctx);
13198 if (QDF_STATUS_SUCCESS != status) {
13199 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
13200 FL("failed to update the supported channel list"));
13201 }
Vignesh Viswanathan4e65e8e2018-05-01 12:04:16 +053013202
Wu Gao51a63562018-11-08 16:29:10 +080013203 if (mac_ctx->mlme_cfg->lfr.roam_scan_offload_enabled) {
Vignesh Viswanathan4e65e8e2018-05-01 12:04:16 +053013204 status = sme_acquire_global_lock(&mac_ctx->sme);
13205 if (QDF_IS_STATUS_SUCCESS(status)) {
13206 csr_roam_offload_scan(mac_ctx, session_id,
Agrawal Ashish21ba2572016-09-03 16:40:10 +053013207 ROAM_SCAN_OFFLOAD_UPDATE_CFG,
13208 REASON_ROAM_SCAN_STA_ROAM_POLICY_CHANGED);
Vignesh Viswanathan4e65e8e2018-05-01 12:04:16 +053013209 sme_release_global_lock(&mac_ctx->sme);
Vignesh Viswanathan4e65e8e2018-05-01 12:04:16 +053013210 }
13211 }
Sridhar Selvaraj48c47092017-07-31 18:18:14 +053013212 qdf_mem_free(sme_config);
Selvaraj, Sridharebda0f22016-08-29 16:05:23 +053013213 return status;
13214}
13215
13216/**
13217 * sme_enable_disable_chanavoidind_event - configure ca event ind
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -080013218 * @mac_handle: Opaque handle to the global MAC context
Selvaraj, Sridharebda0f22016-08-29 16:05:23 +053013219 * @set_value: enable/disable
13220 *
13221 * function to enable/disable chan avoidance indication
13222 *
13223 * Return: QDF_STATUS
13224 */
Jeff Johnsonc7309062018-11-09 20:59:42 -080013225QDF_STATUS sme_enable_disable_chanavoidind_event(mac_handle_t mac_handle,
13226 uint8_t set_value)
Selvaraj, Sridharebda0f22016-08-29 16:05:23 +053013227{
13228 QDF_STATUS status;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080013229 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Rajeev Kumar37d478b2017-04-17 16:59:28 -070013230 struct scheduler_msg msg = {0};
Selvaraj, Sridharebda0f22016-08-29 16:05:23 +053013231
Vignesh Viswanathana1f3a1a2018-10-04 13:10:46 +053013232 if (!mac_ctx->mlme_cfg->gen.optimize_ca_event) {
13233 sme_err("optimize_ca_event not enabled in ini");
13234 return QDF_STATUS_E_NOSUPPORT;
13235 }
13236
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070013237 sme_debug("set_value: %d", set_value);
Selvaraj, Sridharebda0f22016-08-29 16:05:23 +053013238 status = sme_acquire_global_lock(&mac_ctx->sme);
13239 if (QDF_STATUS_SUCCESS == status) {
Rajeev Kumar8eaedf62017-01-21 11:03:13 -080013240 qdf_mem_zero(&msg, sizeof(struct scheduler_msg));
Selvaraj, Sridharebda0f22016-08-29 16:05:23 +053013241 msg.type = WMA_SEND_FREQ_RANGE_CONTROL_IND;
13242 msg.bodyval = set_value;
gaurank kathpalia36b0c582018-08-28 17:45:43 +053013243 status = scheduler_post_message(QDF_MODULE_ID_SME,
13244 QDF_MODULE_ID_WMA,
13245 QDF_MODULE_ID_WMA, &msg);
Selvaraj, Sridharebda0f22016-08-29 16:05:23 +053013246 sme_release_global_lock(&mac_ctx->sme);
13247 return status;
13248 }
Deepak Dhamdhereb106ae52016-08-10 20:55:30 +053013249 return status;
13250}
Agrawal Ashish21ba2572016-09-03 16:40:10 +053013251
Deepak Dhamdhereb106ae52016-08-10 20:55:30 +053013252/*
13253 * sme_set_default_scan_ie() - API to send default scan IE to LIM
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -080013254 * @mac_handle: Opaque handle to the global MAC context
Deepak Dhamdhereb106ae52016-08-10 20:55:30 +053013255 * @session_id: current session ID
13256 * @ie_data: Pointer to Scan IE data
13257 * @ie_len: Length of @ie_data
13258 *
13259 * Return: QDF_STATUS
13260 */
Jeff Johnsonc7309062018-11-09 20:59:42 -080013261QDF_STATUS sme_set_default_scan_ie(mac_handle_t mac_handle, uint16_t session_id,
13262 uint8_t *ie_data, uint16_t ie_len)
Deepak Dhamdhereb106ae52016-08-10 20:55:30 +053013263{
13264 QDF_STATUS status;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080013265 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Deepak Dhamdhereb106ae52016-08-10 20:55:30 +053013266 struct hdd_default_scan_ie *set_ie_params;
13267
Rajeev Kumar5d17dd52017-12-19 16:17:42 -080013268 if (!ie_data)
13269 return QDF_STATUS_E_INVAL;
13270
Deepak Dhamdhereb106ae52016-08-10 20:55:30 +053013271 status = sme_acquire_global_lock(&mac_ctx->sme);
13272 if (QDF_IS_STATUS_SUCCESS(status)) {
13273 set_ie_params = qdf_mem_malloc(sizeof(*set_ie_params));
13274 if (!set_ie_params)
13275 status = QDF_STATUS_E_NOMEM;
13276 else {
13277 set_ie_params->message_type = eWNI_SME_DEFAULT_SCAN_IE;
13278 set_ie_params->length = sizeof(*set_ie_params);
13279 set_ie_params->session_id = session_id;
13280 set_ie_params->ie_len = ie_len;
13281 qdf_mem_copy(set_ie_params->ie_data, ie_data, ie_len);
Rajeev Kumard138ac52017-01-30 18:38:37 -080013282 status = umac_send_mb_message_to_mac(set_ie_params);
Deepak Dhamdhereb106ae52016-08-10 20:55:30 +053013283 }
13284 sme_release_global_lock(&mac_ctx->sme);
13285 }
Agrawal Ashish21ba2572016-09-03 16:40:10 +053013286 return status;
13287}
Padma, Santhosh Kumard7cc0792016-06-28 18:54:12 +053013288
Jeff Johnsonc7309062018-11-09 20:59:42 -080013289QDF_STATUS sme_get_sar_power_limits(mac_handle_t mac_handle,
Jeff Johnsonf0e54b02017-12-18 15:22:25 -080013290 wma_sar_cb callback, void *context)
13291{
13292 void *wma_handle;
13293
13294 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
13295 if (!wma_handle) {
13296 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
13297 "wma handle is NULL");
13298 return QDF_STATUS_E_FAILURE;
13299 }
13300
13301 return wma_get_sar_limit(wma_handle, callback, context);
13302}
13303
Jeff Johnsonc7309062018-11-09 20:59:42 -080013304QDF_STATUS sme_set_sar_power_limits(mac_handle_t mac_handle,
Kabilan Kannan3c0a7352016-12-02 18:49:38 -080013305 struct sar_limit_cmd_params *sar_limit_cmd)
13306{
13307 void *wma_handle;
13308
13309 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
13310 if (!wma_handle) {
13311 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
13312 "wma handle is NULL");
13313 return QDF_STATUS_E_FAILURE;
13314 }
13315
13316 return wma_set_sar_limit(wma_handle, sar_limit_cmd);
13317}
13318
Dundi Raviteja3b637092018-09-12 13:42:50 +053013319QDF_STATUS sme_send_coex_config_cmd(struct coex_config_params *coex_cfg_params)
13320{
13321 void *wma_handle;
13322
13323 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
13324 if (!wma_handle) {
13325 sme_err("wma handle is NULL");
13326 return QDF_STATUS_E_FAILURE;
13327 }
13328 return wma_send_coex_config_cmd(wma_handle, coex_cfg_params);
13329}
13330
Jeff Johnson6136fb92017-03-30 15:21:49 -070013331#ifdef WLAN_FEATURE_FIPS
Jeff Johnsonc7309062018-11-09 20:59:42 -080013332QDF_STATUS sme_fips_request(mac_handle_t mac_handle, struct fips_params *param,
Jeff Johnson6136fb92017-03-30 15:21:49 -070013333 wma_fips_cb callback, void *context)
13334{
13335 void *wma_handle;
13336
13337 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
13338 if (!wma_handle) {
13339 sme_err("wma handle is NULL");
13340 return QDF_STATUS_E_FAILURE;
13341 }
13342
13343 return wma_fips_request(wma_handle, param, callback, context);
13344}
13345#endif
13346
Jeff Johnsonb460dd72018-11-08 10:26:51 -080013347QDF_STATUS sme_set_cts2self_for_p2p_go(mac_handle_t mac_handle)
Agrawal Ashishb2d1a452016-05-05 12:23:58 +053013348{
Agrawal Ashishb2d1a452016-05-05 12:23:58 +053013349 void *wma_handle;
13350
13351 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
13352 if (!wma_handle) {
13353 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
13354 "wma_handle is NULL");
13355 return QDF_STATUS_E_FAILURE;
13356 }
Agrawal Ashishb2d1a452016-05-05 12:23:58 +053013357 if (QDF_STATUS_SUCCESS !=
13358 wma_set_cts2self_for_p2p_go(wma_handle, true)) {
13359 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
13360 "%s: Failed to set cts2self for p2p GO to firmware",
13361 __func__);
13362 return QDF_STATUS_E_FAILURE;
13363 }
13364 return QDF_STATUS_SUCCESS;
13365}
Yingying Tang95409972016-10-20 15:16:15 +080013366
Agrawal, Ashish35b251d2016-09-08 19:21:03 +053013367/**
13368 * sme_update_tx_fail_cnt_threshold() - update tx fail count Threshold
Jeff Johnsonb460dd72018-11-08 10:26:51 -080013369 * @mac_handle: Handle returned by mac_open
Agrawal, Ashish35b251d2016-09-08 19:21:03 +053013370 * @session_id: Session ID on which tx fail count needs to be updated to FW
13371 * @tx_fail_count: Count for tx fail threshold after which FW will disconnect
13372 *
13373 * This function is used to set tx fail count threshold to firmware.
13374 * firmware will issue disocnnect with peer device once this threshold is
13375 * reached.
13376 *
13377 * Return: Return QDF_STATUS, otherwise appropriate failure code
13378 */
Jeff Johnsonb460dd72018-11-08 10:26:51 -080013379QDF_STATUS sme_update_tx_fail_cnt_threshold(mac_handle_t mac_handle,
Jeff Johnsonc7309062018-11-09 20:59:42 -080013380 uint8_t session_id,
13381 uint32_t tx_fail_count)
Agrawal, Ashish35b251d2016-09-08 19:21:03 +053013382{
Agrawal, Ashish35b251d2016-09-08 19:21:03 +053013383 QDF_STATUS status = QDF_STATUS_E_FAILURE;
13384 struct sme_tx_fail_cnt_threshold *tx_fail_cnt;
Rajeev Kumar37d478b2017-04-17 16:59:28 -070013385 struct scheduler_msg msg = {0};
Agrawal, Ashish35b251d2016-09-08 19:21:03 +053013386
13387 tx_fail_cnt = qdf_mem_malloc(sizeof(*tx_fail_cnt));
Arif Hussain0ef77082018-10-10 16:42:53 -070013388 if (!tx_fail_cnt)
Agrawal, Ashish35b251d2016-09-08 19:21:03 +053013389 return QDF_STATUS_E_FAILURE;
Arif Hussain0ef77082018-10-10 16:42:53 -070013390
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070013391 sme_debug("session_id: %d tx_fail_count: %d",
13392 session_id, tx_fail_count);
Agrawal, Ashish35b251d2016-09-08 19:21:03 +053013393 tx_fail_cnt->session_id = session_id;
13394 tx_fail_cnt->tx_fail_cnt_threshold = tx_fail_count;
13395
Rajeev Kumar8eaedf62017-01-21 11:03:13 -080013396 qdf_mem_zero(&msg, sizeof(struct scheduler_msg));
Agrawal, Ashish35b251d2016-09-08 19:21:03 +053013397 msg.type = SIR_HAL_UPDATE_TX_FAIL_CNT_TH;
13398 msg.reserved = 0;
13399 msg.bodyptr = tx_fail_cnt;
gaurank kathpalia36b0c582018-08-28 17:45:43 +053013400 status = scheduler_post_message(QDF_MODULE_ID_SME,
13401 QDF_MODULE_ID_WMA,
13402 QDF_MODULE_ID_WMA, &msg);
Agrawal, Ashish35b251d2016-09-08 19:21:03 +053013403
13404 if (!QDF_IS_STATUS_SUCCESS(status)) {
13405 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053013406 FL("Not able to post Tx fail count message to WDA"));
Agrawal, Ashish35b251d2016-09-08 19:21:03 +053013407 qdf_mem_free(tx_fail_cnt);
13408 }
Sreelakshmi Konamki58c72432016-11-09 17:06:44 +053013409 return status;
13410}
Agrawal, Ashish35b251d2016-09-08 19:21:03 +053013411
Jeff Johnsondc198ec2018-07-04 17:39:53 -070013412QDF_STATUS sme_set_lost_link_info_cb(mac_handle_t mac_handle,
13413 lost_link_info_cb cb)
Sreelakshmi Konamki58c72432016-11-09 17:06:44 +053013414{
Jeff Johnsondc198ec2018-07-04 17:39:53 -070013415 QDF_STATUS status;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080013416 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Sreelakshmi Konamki58c72432016-11-09 17:06:44 +053013417
13418 status = sme_acquire_global_lock(&mac->sme);
13419 if (QDF_IS_STATUS_SUCCESS(status)) {
13420 mac->sme.lost_link_info_cb = cb;
13421 sme_release_global_lock(&mac->sme);
Sreelakshmi Konamki58c72432016-11-09 17:06:44 +053013422 }
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053013423
Agrawal, Ashish35b251d2016-09-08 19:21:03 +053013424 return status;
13425}
Yingying Tang95409972016-10-20 15:16:15 +080013426
yeshwanth sriram guntukaa1ba9a22017-02-28 16:17:32 +053013427#ifdef FEATURE_WLAN_ESE
Jeff Johnson172237b2017-11-07 15:32:59 -080013428bool sme_roam_is_ese_assoc(struct csr_roam_info *roam_info)
yeshwanth sriram guntukaa1ba9a22017-02-28 16:17:32 +053013429{
13430 return roam_info->isESEAssoc;
13431}
Manjeet Singh2f785062017-03-08 18:14:18 +053013432#endif
yeshwanth sriram guntukaa1ba9a22017-02-28 16:17:32 +053013433
Jeff Johnsond5fb2db2018-11-08 14:20:28 -080013434bool sme_neighbor_roam_is11r_assoc(mac_handle_t mac_handle, uint8_t session_id)
yeshwanth sriram guntukaa1ba9a22017-02-28 16:17:32 +053013435{
Jeff Johnson0a8786a2018-12-02 10:49:01 -080013436 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Yeshwanth Sriram Guntuka04b0bb22017-09-26 11:38:08 +053013437
yeshwanth sriram guntukaa1ba9a22017-02-28 16:17:32 +053013438 return csr_neighbor_roam_is11r_assoc(mac_ctx, session_id);
13439}
Yingying Tang95409972016-10-20 15:16:15 +080013440
13441#ifdef WLAN_FEATURE_WOW_PULSE
13442/**
13443 * sme_set_wow_pulse() - set wow pulse info
13444 * @wow_pulse_set_info: wow_pulse_mode structure pointer
13445 *
13446 * Return: QDF_STATUS
13447 */
13448QDF_STATUS sme_set_wow_pulse(struct wow_pulse_mode *wow_pulse_set_info)
13449{
Rajeev Kumar37d478b2017-04-17 16:59:28 -070013450 struct scheduler_msg message = {0};
Yingying Tang95409972016-10-20 15:16:15 +080013451 QDF_STATUS status;
13452 struct wow_pulse_mode *wow_pulse_set_cmd;
13453
13454 if (!wow_pulse_set_info) {
13455 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
13456 "%s: invalid wow_pulse_set_info pointer", __func__);
13457 return QDF_STATUS_E_FAILURE;
13458 }
13459
13460 wow_pulse_set_cmd = qdf_mem_malloc(sizeof(*wow_pulse_set_cmd));
Arif Hussain0ef77082018-10-10 16:42:53 -070013461 if (!wow_pulse_set_cmd)
Yingying Tang95409972016-10-20 15:16:15 +080013462 return QDF_STATUS_E_NOMEM;
Yingying Tang95409972016-10-20 15:16:15 +080013463
13464 *wow_pulse_set_cmd = *wow_pulse_set_info;
13465
13466 message.type = WMA_SET_WOW_PULSE_CMD;
13467 message.bodyptr = wow_pulse_set_cmd;
gaurank kathpalia36b0c582018-08-28 17:45:43 +053013468 status = scheduler_post_message(QDF_MODULE_ID_SME,
13469 QDF_MODULE_ID_WMA,
13470 QDF_MODULE_ID_WMA,
Yingying Tang95409972016-10-20 15:16:15 +080013471 &message);
13472 if (!QDF_IS_STATUS_SUCCESS(status)) {
13473 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
13474 "%s: Not able to post msg to WDA!",
13475 __func__);
13476 qdf_mem_free(wow_pulse_set_cmd);
13477 status = QDF_STATUS_E_FAILURE;
13478 }
13479
13480 return status;
13481}
13482#endif
Naveen Rawat664a7cb2017-01-19 17:58:14 -080013483
13484/**
13485 * sme_prepare_beacon_from_bss_descp() - prepares beacon frame by populating
13486 * different fields and IEs from bss descriptor.
13487 * @frame_buf: frame buffer to populate
13488 * @bss_descp: bss descriptor
13489 * @bssid: bssid of the beacon frame to populate
13490 * @ie_len: length of IE fields
13491 *
13492 * Return: None
13493 */
13494static void sme_prepare_beacon_from_bss_descp(uint8_t *frame_buf,
13495 tSirBssDescription *bss_descp,
13496 const tSirMacAddr bssid,
Naveen Rawat6dabf4e2017-02-08 15:55:49 -080013497 uint32_t ie_len)
Naveen Rawat664a7cb2017-01-19 17:58:14 -080013498{
13499 tDot11fBeacon1 *bcn_fixed;
13500 tpSirMacMgmtHdr mac_hdr = (tpSirMacMgmtHdr)frame_buf;
13501
13502 /* populate mac header first to indicate beacon */
13503 mac_hdr->fc.protVer = SIR_MAC_PROTOCOL_VERSION;
13504 mac_hdr->fc.type = SIR_MAC_MGMT_FRAME;
13505 mac_hdr->fc.subType = SIR_MAC_MGMT_BEACON;
13506 qdf_mem_copy((uint8_t *) mac_hdr->da,
13507 (uint8_t *) "\xFF\xFF\xFF\xFF\xFF\xFF",
13508 sizeof(struct qdf_mac_addr));
13509 qdf_mem_copy((uint8_t *) mac_hdr->sa, bssid,
13510 sizeof(struct qdf_mac_addr));
13511 qdf_mem_copy((uint8_t *) mac_hdr->bssId, bssid,
13512 sizeof(struct qdf_mac_addr));
13513
13514 /* now populate fixed params */
13515 bcn_fixed = (tDot11fBeacon1 *)(frame_buf + SIR_MAC_HDR_LEN_3A);
13516 /* populate timestamp */
13517 qdf_mem_copy(&bcn_fixed->TimeStamp.timestamp, &bss_descp->timeStamp,
13518 sizeof(bss_descp->timeStamp));
13519 /* populate beacon interval */
13520 bcn_fixed->BeaconInterval.interval = bss_descp->beaconInterval;
13521 /* populate capability */
13522 qdf_mem_copy(&bcn_fixed->Capabilities, &bss_descp->capabilityInfo,
13523 sizeof(bss_descp->capabilityInfo));
13524
13525 /* copy IEs now */
13526 qdf_mem_copy(frame_buf + SIR_MAC_HDR_LEN_3A
13527 + SIR_MAC_B_PR_SSID_OFFSET,
13528 &bss_descp->ieFields, ie_len);
13529}
13530
Jeff Johnsonc7309062018-11-09 20:59:42 -080013531QDF_STATUS sme_get_rssi_snr_by_bssid(mac_handle_t mac_handle,
13532 struct csr_roam_profile *profile,
13533 const uint8_t *bssid,
13534 int8_t *rssi, int8_t *snr)
Hanumanth Reddy Pothula90051782017-05-04 22:14:43 +053013535{
13536 tSirBssDescription *bss_descp;
13537 tCsrScanResultFilter *scan_filter;
13538 struct scan_result_list *bss_list;
13539 tScanResultHandle result_handle = NULL;
13540 QDF_STATUS status = QDF_STATUS_SUCCESS;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080013541 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Hanumanth Reddy Pothula90051782017-05-04 22:14:43 +053013542
13543 scan_filter = qdf_mem_malloc(sizeof(tCsrScanResultFilter));
Arif Hussain0ef77082018-10-10 16:42:53 -070013544 if (!scan_filter) {
Hanumanth Reddy Pothula90051782017-05-04 22:14:43 +053013545 status = QDF_STATUS_E_NOMEM;
13546 goto free_scan_flter;
13547 }
13548
13549 status = csr_roam_prepare_filter_from_profile(mac_ctx,
13550 profile, scan_filter);
13551 if (QDF_STATUS_SUCCESS != status) {
13552 sme_err("prepare_filter failed");
13553 goto free_scan_flter;
13554 }
13555
13556 /* update filter to get scan result with just target BSSID */
Jeff Johnson038efe72019-03-18 13:39:31 -070013557 if (!scan_filter->BSSIDs.bssid) {
Hanumanth Reddy Pothula90051782017-05-04 22:14:43 +053013558 scan_filter->BSSIDs.bssid =
13559 qdf_mem_malloc(sizeof(struct qdf_mac_addr));
Arif Hussain0ef77082018-10-10 16:42:53 -070013560 if (!scan_filter->BSSIDs.bssid) {
Hanumanth Reddy Pothula90051782017-05-04 22:14:43 +053013561 status = QDF_STATUS_E_NOMEM;
13562 goto free_scan_flter;
13563 }
13564 }
13565
13566 scan_filter->BSSIDs.numOfBSSIDs = 1;
13567 qdf_mem_copy(scan_filter->BSSIDs.bssid[0].bytes,
13568 bssid, sizeof(struct qdf_mac_addr));
13569
13570 status = csr_scan_get_result(mac_ctx, scan_filter, &result_handle);
13571 if (QDF_STATUS_SUCCESS != status) {
Jianmin Zhucc6b3d02019-03-07 14:19:34 +080013572 sme_debug("parse_scan_result failed");
Hanumanth Reddy Pothula90051782017-05-04 22:14:43 +053013573 goto free_scan_flter;
13574 }
13575
13576 bss_list = (struct scan_result_list *)result_handle;
13577 bss_descp = csr_get_fst_bssdescr_ptr(bss_list);
13578 if (!bss_descp) {
13579 sme_err("unable to fetch bss descriptor");
13580 status = QDF_STATUS_E_FAULT;
13581 goto free_scan_flter;
13582 }
13583
13584 sme_debug("snr: %d, rssi: %d, raw_rssi: %d",
13585 bss_descp->sinr, bss_descp->rssi, bss_descp->rssi_raw);
13586
13587 if (rssi)
13588 *rssi = bss_descp->rssi;
13589 if (snr)
13590 *snr = bss_descp->sinr;
13591
13592free_scan_flter:
13593 /* free scan filter and exit */
13594 if (scan_filter) {
13595 csr_free_scan_filter(mac_ctx, scan_filter);
13596 qdf_mem_free(scan_filter);
13597 }
13598
13599 if (result_handle)
13600 csr_scan_result_purge(mac_ctx, result_handle);
13601
13602 return status;
13603}
13604
Jeff Johnsonc7309062018-11-09 20:59:42 -080013605QDF_STATUS sme_get_beacon_frm(mac_handle_t mac_handle,
Jeff Johnson1f2dabc2018-11-07 15:33:01 -080013606 struct csr_roam_profile *profile,
Jeff Johnson66ee8a92018-03-17 15:24:26 -070013607 const tSirMacAddr bssid,
13608 uint8_t **frame_buf, uint32_t *frame_len,
13609 int *channel)
Naveen Rawat664a7cb2017-01-19 17:58:14 -080013610{
13611 QDF_STATUS status = QDF_STATUS_SUCCESS;
Naveen Rawat56b4de82017-02-17 14:38:49 -080013612 tScanResultHandle result_handle = NULL;
Naveen Rawat664a7cb2017-01-19 17:58:14 -080013613 tCsrScanResultFilter *scan_filter;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080013614 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Naveen Rawat664a7cb2017-01-19 17:58:14 -080013615 tSirBssDescription *bss_descp;
Yeshwanth Sriram Guntuka36c09902017-09-26 11:34:26 +053013616 struct scan_result_list *bss_list;
Naveen Rawat664a7cb2017-01-19 17:58:14 -080013617 uint32_t ie_len;
13618
13619 scan_filter = qdf_mem_malloc(sizeof(tCsrScanResultFilter));
Arif Hussain0ef77082018-10-10 16:42:53 -070013620 if (!scan_filter) {
Naveen Rawat664a7cb2017-01-19 17:58:14 -080013621 status = QDF_STATUS_E_NOMEM;
13622 goto free_scan_flter;
13623 }
13624 status = csr_roam_prepare_filter_from_profile(mac_ctx,
13625 profile, scan_filter);
13626 if (QDF_IS_STATUS_ERROR(status)) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070013627 sme_err("prepare_filter failed");
Selvaraj, Sridhar64b0a9c2017-05-11 16:50:15 +053013628 status = QDF_STATUS_E_FAULT;
Naveen Rawat664a7cb2017-01-19 17:58:14 -080013629 goto free_scan_flter;
13630 }
13631
13632 /* update filter to get scan result with just target BSSID */
Jeff Johnson038efe72019-03-18 13:39:31 -070013633 if (!scan_filter->BSSIDs.bssid) {
Naveen Rawat664a7cb2017-01-19 17:58:14 -080013634 scan_filter->BSSIDs.bssid =
13635 qdf_mem_malloc(sizeof(struct qdf_mac_addr));
Arif Hussain0ef77082018-10-10 16:42:53 -070013636 if (!scan_filter->BSSIDs.bssid) {
Naveen Rawat664a7cb2017-01-19 17:58:14 -080013637 status = QDF_STATUS_E_NOMEM;
13638 goto free_scan_flter;
13639 }
13640 }
13641 scan_filter->BSSIDs.numOfBSSIDs = 1;
13642 qdf_mem_copy(scan_filter->BSSIDs.bssid[0].bytes,
13643 bssid, sizeof(struct qdf_mac_addr));
13644
13645 status = csr_scan_get_result(mac_ctx, scan_filter, &result_handle);
13646 if (QDF_STATUS_SUCCESS != status) {
Srinivas Girigowda2da81e22017-03-16 21:22:19 -070013647 sme_err("parse_scan_result failed");
Selvaraj, Sridhar64b0a9c2017-05-11 16:50:15 +053013648 status = QDF_STATUS_E_FAULT;
Naveen Rawat664a7cb2017-01-19 17:58:14 -080013649 goto free_scan_flter;
13650 }
13651
Yeshwanth Sriram Guntuka36c09902017-09-26 11:34:26 +053013652 bss_list = (struct scan_result_list *)result_handle;
Naveen Rawat664a7cb2017-01-19 17:58:14 -080013653 bss_descp = csr_get_fst_bssdescr_ptr(bss_list);
Naveen Rawatae0aaa82017-02-17 14:41:19 -080013654 if (!bss_descp) {
Srinivas Girigowda2c263352017-03-17 17:49:53 -070013655 sme_err("unable to fetch bss descriptor");
Naveen Rawatae0aaa82017-02-17 14:41:19 -080013656 status = QDF_STATUS_E_FAULT;
13657 goto free_scan_flter;
13658 }
Naveen Rawat664a7cb2017-01-19 17:58:14 -080013659
Naveen Rawat81f058c2017-06-02 16:02:39 -070013660 /**
13661 * Length of BSS descriptor is without length of
13662 * length itself and length of pointer that holds ieFields.
13663 *
13664 * tSirBssDescription
13665 * +--------+---------------------------------+---------------+
13666 * | length | other fields | pointer to IEs|
13667 * +--------+---------------------------------+---------------+
13668 * ^
13669 * ieFields
Naveen Rawat664a7cb2017-01-19 17:58:14 -080013670 */
Naveen Rawat81f058c2017-06-02 16:02:39 -070013671 ie_len = bss_descp->length + sizeof(bss_descp->length)
13672 - (uint16_t)(offsetof(tSirBssDescription, ieFields[0]));
Selvaraj, Sridhar64b0a9c2017-05-11 16:50:15 +053013673 sme_debug("found bss_descriptor ie_len: %d channel %d",
13674 ie_len, bss_descp->channelId);
Naveen Rawat664a7cb2017-01-19 17:58:14 -080013675
13676 /* include mac header and fixed params along with IEs in frame */
13677 *frame_len = SIR_MAC_HDR_LEN_3A + SIR_MAC_B_PR_SSID_OFFSET + ie_len;
13678 *frame_buf = qdf_mem_malloc(*frame_len);
Arif Hussain0ef77082018-10-10 16:42:53 -070013679 if (!*frame_buf) {
Naveen Rawat664a7cb2017-01-19 17:58:14 -080013680 status = QDF_STATUS_E_NOMEM;
13681 goto free_scan_flter;
13682 }
13683
13684 sme_prepare_beacon_from_bss_descp(*frame_buf, bss_descp, bssid, ie_len);
13685
Selvaraj, Sridhar64b0a9c2017-05-11 16:50:15 +053013686 if (!*channel)
13687 *channel = bss_descp->channelId;
Naveen Rawat664a7cb2017-01-19 17:58:14 -080013688free_scan_flter:
13689 /* free scan filter and exit */
13690 if (scan_filter) {
13691 csr_free_scan_filter(mac_ctx, scan_filter);
13692 qdf_mem_free(scan_filter);
13693 }
Arif Hussainfdb25e22017-02-05 17:38:16 -080013694 if (result_handle)
13695 csr_scan_result_purge(mac_ctx, result_handle);
Naveen Rawat664a7cb2017-01-19 17:58:14 -080013696
Naveen Rawatae0aaa82017-02-17 14:41:19 -080013697 return status;
Naveen Rawat664a7cb2017-01-19 17:58:14 -080013698}
13699
Paul Zhangc3fc0a82018-01-09 16:38:20 +080013700#ifdef WLAN_FEATURE_ROAM_OFFLOAD
Jeff Johnsonc7309062018-11-09 20:59:42 -080013701QDF_STATUS sme_fast_reassoc(mac_handle_t mac_handle,
13702 struct csr_roam_profile *profile,
Naveen Rawat4195c5e2017-05-22 17:07:45 -070013703 const tSirMacAddr bssid, int channel,
Krunal Soni332f4af2017-06-01 14:36:17 -070013704 uint8_t vdev_id, const tSirMacAddr connected_bssid)
Naveen Rawat4195c5e2017-05-22 17:07:45 -070013705{
13706 QDF_STATUS status;
13707 struct wma_roam_invoke_cmd *fastreassoc;
13708 struct scheduler_msg msg = {0};
Jeff Johnson0a8786a2018-12-02 10:49:01 -080013709 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Abhinav Kumareab25932018-07-13 11:48:43 +053013710 struct csr_roam_session *session;
13711 struct csr_roam_profile *roam_profile;
Naveen Rawat4195c5e2017-05-22 17:07:45 -070013712
Abhinav Kumareab25932018-07-13 11:48:43 +053013713 session = CSR_GET_SESSION(mac_ctx, vdev_id);
13714 if (!session || !session->pCurRoamProfile) {
13715 sme_err("session %d not found", vdev_id);
13716 return QDF_STATUS_E_FAILURE;
13717 }
13718
13719 roam_profile = session->pCurRoamProfile;
Abhinav Kumarcd737de2019-03-05 17:01:24 +053013720 if (roam_profile->driver_disabled_roaming) {
13721 sme_debug("roaming status in driver %d",
Abhinav Kumareab25932018-07-13 11:48:43 +053013722 roam_profile->driver_disabled_roaming);
13723 return QDF_STATUS_E_FAILURE;
13724 }
Naveen Rawat4195c5e2017-05-22 17:07:45 -070013725 fastreassoc = qdf_mem_malloc(sizeof(*fastreassoc));
Arif Hussain0ef77082018-10-10 16:42:53 -070013726 if (!fastreassoc)
Naveen Rawat4195c5e2017-05-22 17:07:45 -070013727 return QDF_STATUS_E_NOMEM;
Arif Hussain0ef77082018-10-10 16:42:53 -070013728
Krunal Soni332f4af2017-06-01 14:36:17 -070013729 /* if both are same then set the flag */
13730 if (!qdf_mem_cmp(connected_bssid, bssid, ETH_ALEN)) {
13731 fastreassoc->is_same_bssid = true;
13732 sme_debug("bssid same, bssid[%pM]", bssid);
13733 }
Naveen Rawat4195c5e2017-05-22 17:07:45 -070013734 fastreassoc->vdev_id = vdev_id;
Naveen Rawat4195c5e2017-05-22 17:07:45 -070013735 fastreassoc->bssid[0] = bssid[0];
13736 fastreassoc->bssid[1] = bssid[1];
13737 fastreassoc->bssid[2] = bssid[2];
13738 fastreassoc->bssid[3] = bssid[3];
13739 fastreassoc->bssid[4] = bssid[4];
13740 fastreassoc->bssid[5] = bssid[5];
13741
Jeff Johnsonc7309062018-11-09 20:59:42 -080013742 status = sme_get_beacon_frm(mac_handle, profile, bssid,
Naveen Rawat4195c5e2017-05-22 17:07:45 -070013743 &fastreassoc->frame_buf,
Selvaraj, Sridhar64b0a9c2017-05-11 16:50:15 +053013744 &fastreassoc->frame_len,
13745 &channel);
Naveen Rawat4195c5e2017-05-22 17:07:45 -070013746
Selvaraj, Sridhar64b0a9c2017-05-11 16:50:15 +053013747 if (!channel) {
13748 sme_err("channel retrieval from BSS desc fails!");
13749 qdf_mem_free(fastreassoc);
13750 return QDF_STATUS_E_FAULT;
13751 }
13752
13753 fastreassoc->channel = channel;
Naveen Rawat4195c5e2017-05-22 17:07:45 -070013754 if (QDF_STATUS_SUCCESS != status) {
13755 sme_warn("sme_get_beacon_frm failed");
13756 fastreassoc->frame_buf = NULL;
13757 fastreassoc->frame_len = 0;
13758 }
13759
Padma, Santhosh Kumar5bc0c242017-11-29 15:44:27 +053013760 if (csr_is_auth_type_ese(mac_ctx->roam.roamSession[vdev_id].
13761 connectedProfile.AuthType)) {
13762 sme_debug("Beacon is not required for ESE");
13763 if (fastreassoc->frame_len) {
13764 qdf_mem_free(fastreassoc->frame_buf);
13765 fastreassoc->frame_buf = NULL;
13766 fastreassoc->frame_len = 0;
13767 }
13768 }
13769
Paul Zhang624f88d2018-11-07 15:29:45 +080013770 msg.type = eWNI_SME_ROAM_INVOKE;
Naveen Rawat4195c5e2017-05-22 17:07:45 -070013771 msg.reserved = 0;
13772 msg.bodyptr = fastreassoc;
gaurank kathpalia36b0c582018-08-28 17:45:43 +053013773 status = scheduler_post_message(QDF_MODULE_ID_SME,
Paul Zhang624f88d2018-11-07 15:29:45 +080013774 QDF_MODULE_ID_PE,
13775 QDF_MODULE_ID_PE, &msg);
Naveen Rawat4195c5e2017-05-22 17:07:45 -070013776 if (QDF_STATUS_SUCCESS != status) {
Paul Zhang624f88d2018-11-07 15:29:45 +080013777 sme_err("Not able to post ROAM_INVOKE_CMD message to PE");
Naveen Rawat4195c5e2017-05-22 17:07:45 -070013778 qdf_mem_free(fastreassoc);
13779 }
13780
13781 return status;
13782}
Paul Zhangc3fc0a82018-01-09 16:38:20 +080013783#endif
Naveen Rawat4195c5e2017-05-22 17:07:45 -070013784
Jeff Johnsonc7309062018-11-09 20:59:42 -080013785QDF_STATUS sme_set_del_pmkid_cache(mac_handle_t mac_handle, uint8_t session_id,
Vignesh Viswanathanc6d1e1c2017-09-18 12:32:49 +053013786 tPmkidCacheInfo *pmk_cache_info,
13787 bool is_add)
13788{
13789 struct wmi_unified_pmk_cache *pmk_cache;
13790 struct scheduler_msg msg;
13791
13792 pmk_cache = qdf_mem_malloc(sizeof(*pmk_cache));
Arif Hussain0ef77082018-10-10 16:42:53 -070013793 if (!pmk_cache)
Vignesh Viswanathanc6d1e1c2017-09-18 12:32:49 +053013794 return QDF_STATUS_E_NOMEM;
Vignesh Viswanathanc6d1e1c2017-09-18 12:32:49 +053013795
hangtian127c9532019-01-12 13:29:07 +080013796 qdf_mem_zero(pmk_cache, sizeof(*pmk_cache));
Vignesh Viswanathane8a26b22017-10-11 20:38:47 +053013797
Jeff Johnson622aad62018-12-07 15:05:37 -080013798 pmk_cache->vdev_id = session_id;
Vignesh Viswanathanc6d1e1c2017-09-18 12:32:49 +053013799
Vignesh Viswanathane8a26b22017-10-11 20:38:47 +053013800 if (!pmk_cache_info)
13801 goto send_flush_cmd;
13802
Vignesh Viswanathanc6d1e1c2017-09-18 12:32:49 +053013803 if (!pmk_cache_info->ssid_len) {
13804 pmk_cache->cat_flag = WMI_PMK_CACHE_CAT_FLAG_BSSID;
13805 WMI_CHAR_ARRAY_TO_MAC_ADDR(pmk_cache_info->BSSID.bytes,
13806 &pmk_cache->bssid);
13807 } else {
13808 pmk_cache->cat_flag = WMI_PMK_CACHE_CAT_FLAG_SSID_CACHE_ID;
13809 pmk_cache->ssid.length = pmk_cache_info->ssid_len;
13810 qdf_mem_copy(pmk_cache->ssid.mac_ssid,
13811 pmk_cache_info->ssid,
13812 pmk_cache->ssid.length);
13813 }
13814 pmk_cache->cache_id = (uint32_t) (pmk_cache_info->cache_id[0] << 8 |
13815 pmk_cache_info->cache_id[1]);
13816
13817 if (is_add)
13818 pmk_cache->action_flag = WMI_PMK_CACHE_ACTION_FLAG_ADD_ENTRY;
13819 else
13820 pmk_cache->action_flag = WMI_PMK_CACHE_ACTION_FLAG_DEL_ENTRY;
13821
Srinivas Girigowdaff8f5ef2019-03-26 17:20:55 -070013822 pmk_cache->pmkid_len = PMKID_LEN;
Vignesh Viswanathanc6d1e1c2017-09-18 12:32:49 +053013823 qdf_mem_copy(pmk_cache->pmkid, pmk_cache_info->PMKID,
Srinivas Girigowdaff8f5ef2019-03-26 17:20:55 -070013824 PMKID_LEN);
Vignesh Viswanathanc6d1e1c2017-09-18 12:32:49 +053013825
13826 pmk_cache->pmk_len = pmk_cache_info->pmk_len;
13827 qdf_mem_copy(pmk_cache->pmk, pmk_cache_info->pmk,
13828 pmk_cache->pmk_len);
13829
Vignesh Viswanathane8a26b22017-10-11 20:38:47 +053013830send_flush_cmd:
Vignesh Viswanathanc6d1e1c2017-09-18 12:32:49 +053013831 msg.type = SIR_HAL_SET_DEL_PMKID_CACHE;
13832 msg.reserved = 0;
13833 msg.bodyptr = pmk_cache;
13834 if (QDF_STATUS_SUCCESS !=
gaurank kathpalia36b0c582018-08-28 17:45:43 +053013835 scheduler_post_message(QDF_MODULE_ID_SME,
13836 QDF_MODULE_ID_WMA,
13837 QDF_MODULE_ID_WMA, &msg)) {
Vignesh Viswanathanc6d1e1c2017-09-18 12:32:49 +053013838 sme_err("Not able to post message to WDA");
Ashish Kumar Dhanotiya36510832019-02-20 22:13:25 +053013839 if (pmk_cache) {
13840 qdf_mem_zero(pmk_cache, sizeof(*pmk_cache));
13841 qdf_mem_free(pmk_cache);
13842 }
Vignesh Viswanathanc6d1e1c2017-09-18 12:32:49 +053013843 return QDF_STATUS_E_FAILURE;
13844 }
13845
13846 return QDF_STATUS_SUCCESS;
13847}
13848
Anurag Chouhan3920c0f2017-09-11 17:10:56 +053013849/* ARP DEBUG STATS */
13850
13851/**
13852 * sme_set_nud_debug_stats() - sme api to set nud debug stats
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -080013853 * @mac_handle: Opaque handle to the global MAC context
Anurag Chouhan3920c0f2017-09-11 17:10:56 +053013854 * @set_stats_param: pointer to set stats param
13855 *
13856 * Return: Return QDF_STATUS.
13857 */
Jeff Johnsonc7309062018-11-09 20:59:42 -080013858QDF_STATUS sme_set_nud_debug_stats(mac_handle_t mac_handle,
Anurag Chouhan3920c0f2017-09-11 17:10:56 +053013859 struct set_arp_stats_params
13860 *set_stats_param)
13861{
13862 struct set_arp_stats_params *arp_set_param;
13863 struct scheduler_msg msg;
13864
13865 arp_set_param = qdf_mem_malloc(sizeof(*arp_set_param));
Arif Hussain0ef77082018-10-10 16:42:53 -070013866 if (!arp_set_param)
Anurag Chouhan3920c0f2017-09-11 17:10:56 +053013867 return QDF_STATUS_E_NOMEM;
Anurag Chouhan3920c0f2017-09-11 17:10:56 +053013868
13869 qdf_mem_copy(arp_set_param, set_stats_param, sizeof(*arp_set_param));
13870
13871 msg.type = WMA_SET_ARP_STATS_REQ;
13872 msg.reserved = 0;
13873 msg.bodyptr = arp_set_param;
13874
13875 if (QDF_STATUS_SUCCESS !=
gaurank kathpalia36b0c582018-08-28 17:45:43 +053013876 scheduler_post_message(QDF_MODULE_ID_SME,
13877 QDF_MODULE_ID_WMA,
13878 QDF_MODULE_ID_WMA, &msg)) {
Anurag Chouhan3920c0f2017-09-11 17:10:56 +053013879 sme_err("Not able to post message to WDA");
13880 qdf_mem_free(arp_set_param);
13881 return QDF_STATUS_E_FAILURE;
13882 }
13883
13884 return QDF_STATUS_SUCCESS;
13885}
13886
13887/**
13888 * sme_get_nud_debug_stats() - sme api to get nud debug stats
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -080013889 * @mac_handle: Opaque handle to the global MAC context
Anurag Chouhan3920c0f2017-09-11 17:10:56 +053013890 * @get_stats_param: pointer to set stats param
13891 *
13892 * Return: Return QDF_STATUS.
13893 */
Jeff Johnsonc7309062018-11-09 20:59:42 -080013894QDF_STATUS sme_get_nud_debug_stats(mac_handle_t mac_handle,
Anurag Chouhan3920c0f2017-09-11 17:10:56 +053013895 struct get_arp_stats_params
13896 *get_stats_param)
13897{
13898 struct get_arp_stats_params *arp_get_param;
13899 struct scheduler_msg msg;
13900
13901 arp_get_param = qdf_mem_malloc(sizeof(*arp_get_param));
Arif Hussain0ef77082018-10-10 16:42:53 -070013902 if (!arp_get_param)
Anurag Chouhan3920c0f2017-09-11 17:10:56 +053013903 return QDF_STATUS_E_NOMEM;
Anurag Chouhan3920c0f2017-09-11 17:10:56 +053013904
13905 qdf_mem_copy(arp_get_param, get_stats_param, sizeof(*arp_get_param));
13906
13907 msg.type = WMA_GET_ARP_STATS_REQ;
13908 msg.reserved = 0;
13909 msg.bodyptr = arp_get_param;
13910
13911 if (QDF_STATUS_SUCCESS !=
gaurank kathpalia36b0c582018-08-28 17:45:43 +053013912 scheduler_post_message(QDF_MODULE_ID_SME,
13913 QDF_MODULE_ID_WMA,
13914 QDF_MODULE_ID_WMA, &msg)) {
Anurag Chouhan3920c0f2017-09-11 17:10:56 +053013915 sme_err("Not able to post message to WDA");
13916 qdf_mem_free(arp_get_param);
13917 return QDF_STATUS_E_FAILURE;
13918 }
13919
13920 return QDF_STATUS_SUCCESS;
13921}
13922
Krishna Kumaar Natarajanf1581df2017-02-21 13:42:08 -080013923QDF_STATUS sme_set_peer_param(uint8_t *peer_addr, uint32_t param_id,
13924 uint32_t param_value, uint32_t vdev_id)
13925{
13926 void *wma_handle;
13927
13928 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
13929 if (!wma_handle) {
Srinivas Girigowda2c263352017-03-17 17:49:53 -070013930 sme_err("wma handle is NULL");
Krishna Kumaar Natarajanf1581df2017-02-21 13:42:08 -080013931 return QDF_STATUS_E_FAILURE;
13932 }
13933
13934 return wma_set_peer_param(wma_handle, peer_addr, param_id,
13935 param_value, vdev_id);
13936}
Tushnim Bhattacharyya9e81b4c2017-02-15 17:11:14 -080013937
Jeff Johnsonb460dd72018-11-08 10:26:51 -080013938QDF_STATUS sme_register_set_connection_info_cb(mac_handle_t mac_handle,
Tushnim Bhattacharyya0c4ad2d2017-03-09 15:59:03 -080013939 bool (*set_connection_info_cb)(bool),
13940 bool (*get_connection_info_cb)(uint8_t *session_id,
13941 enum scan_reject_states *reason))
Tushnim Bhattacharyya9e81b4c2017-02-15 17:11:14 -080013942{
13943 QDF_STATUS status = QDF_STATUS_SUCCESS;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080013944 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Tushnim Bhattacharyya9e81b4c2017-02-15 17:11:14 -080013945
Jeff Johnson01f2c232018-11-21 19:17:44 -080013946 status = sme_acquire_global_lock(&mac->sme);
Tushnim Bhattacharyya9e81b4c2017-02-15 17:11:14 -080013947 if (QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson01f2c232018-11-21 19:17:44 -080013948 mac->sme.set_connection_info_cb = set_connection_info_cb;
13949 mac->sme.get_connection_info_cb = get_connection_info_cb;
13950 sme_release_global_lock(&mac->sme);
Tushnim Bhattacharyya9e81b4c2017-02-15 17:11:14 -080013951 }
13952 return status;
13953}
Sreelakshmi Konamki88a2a412017-04-14 15:11:55 +053013954
Jeff Johnson43975142018-07-04 15:33:47 -070013955QDF_STATUS sme_rso_cmd_status_cb(mac_handle_t mac_handle,
13956 rso_cmd_status_cb cb)
Sreelakshmi Konamki88a2a412017-04-14 15:11:55 +053013957{
13958 QDF_STATUS status = QDF_STATUS_SUCCESS;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080013959 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Sreelakshmi Konamki88a2a412017-04-14 15:11:55 +053013960
13961 mac->sme.rso_cmd_status_cb = cb;
Srinivas Girigowda2c263352017-03-17 17:49:53 -070013962 sme_debug("Registered RSO command status callback");
Sreelakshmi Konamki88a2a412017-04-14 15:11:55 +053013963 return status;
13964}
Kiran Kumar Lokerea3de2262017-04-12 12:15:04 -070013965
Jeff Johnsonc7309062018-11-09 20:59:42 -080013966QDF_STATUS sme_set_dbs_scan_selection_config(mac_handle_t mac_handle,
Nitesh Shahf9a09ff2017-05-22 15:46:25 +053013967 struct wmi_dbs_scan_sel_params *params)
13968{
13969 struct scheduler_msg message = {0};
13970 QDF_STATUS status;
13971 struct wmi_dbs_scan_sel_params *dbs_scan_params;
13972 uint32_t i;
13973
13974 if (0 == params->num_clients) {
13975 sme_err("Num of clients is 0");
13976 return QDF_STATUS_E_FAILURE;
13977 }
13978
13979 dbs_scan_params = qdf_mem_malloc(sizeof(*dbs_scan_params));
Arif Hussain0ef77082018-10-10 16:42:53 -070013980 if (!dbs_scan_params)
Nitesh Shahf9a09ff2017-05-22 15:46:25 +053013981 return QDF_STATUS_E_NOMEM;
Nitesh Shahf9a09ff2017-05-22 15:46:25 +053013982
13983 dbs_scan_params->num_clients = params->num_clients;
13984 dbs_scan_params->pdev_id = params->pdev_id;
13985 for (i = 0; i < params->num_clients; i++) {
13986 dbs_scan_params->module_id[i] = params->module_id[i];
13987 dbs_scan_params->num_dbs_scans[i] = params->num_dbs_scans[i];
13988 dbs_scan_params->num_non_dbs_scans[i] =
13989 params->num_non_dbs_scans[i];
13990 }
13991 message.type = WMA_SET_DBS_SCAN_SEL_CONF_PARAMS;
13992 message.bodyptr = dbs_scan_params;
gaurank kathpalia36b0c582018-08-28 17:45:43 +053013993 status = scheduler_post_message(QDF_MODULE_ID_SME,
13994 QDF_MODULE_ID_WMA,
13995 QDF_MODULE_ID_WMA, &message);
Nitesh Shahf9a09ff2017-05-22 15:46:25 +053013996 if (!QDF_IS_STATUS_SUCCESS(status)) {
13997 sme_err("Not able to post msg to WMA!");
13998 qdf_mem_free(dbs_scan_params);
13999 }
14000
14001 return status;
14002}
14003
Jeff Johnsonc7309062018-11-09 20:59:42 -080014004QDF_STATUS sme_get_rcpi(mac_handle_t mac_handle, struct sme_rcpi_req *rcpi)
Rajeev Kumar Sirasanagandla996e5292016-11-22 21:20:33 +053014005{
14006 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080014007 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Naveen Rawatb7be1ed2017-11-16 16:52:08 -080014008 struct scheduler_msg msg = {0};
Rajeev Kumar Sirasanagandla996e5292016-11-22 21:20:33 +053014009 struct sme_rcpi_req *rcpi_req;
14010
14011 rcpi_req = qdf_mem_malloc(sizeof(*rcpi_req));
Arif Hussain0ef77082018-10-10 16:42:53 -070014012 if (!rcpi_req)
Rajeev Kumar Sirasanagandla996e5292016-11-22 21:20:33 +053014013 return QDF_STATUS_E_NOMEM;
Arif Hussain0ef77082018-10-10 16:42:53 -070014014
Rajeev Kumar Sirasanagandla996e5292016-11-22 21:20:33 +053014015 qdf_mem_copy(rcpi_req, rcpi, sizeof(*rcpi_req));
14016
Jeff Johnson01f2c232018-11-21 19:17:44 -080014017 status = sme_acquire_global_lock(&mac->sme);
Rajeev Kumar Sirasanagandla996e5292016-11-22 21:20:33 +053014018 if (QDF_IS_STATUS_SUCCESS(status)) {
14019 msg.bodyptr = rcpi_req;
14020 msg.type = WMA_GET_RCPI_REQ;
gaurank kathpalia36b0c582018-08-28 17:45:43 +053014021 status = scheduler_post_message(QDF_MODULE_ID_SME,
14022 QDF_MODULE_ID_WMA,
14023 QDF_MODULE_ID_WMA, &msg);
Jeff Johnson01f2c232018-11-21 19:17:44 -080014024 sme_release_global_lock(&mac->sme);
Rajeev Kumar Sirasanagandla996e5292016-11-22 21:20:33 +053014025 if (!QDF_IS_STATUS_SUCCESS(status)) {
14026 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
14027 FL("post get rcpi req failed"));
14028 status = QDF_STATUS_E_FAILURE;
14029 qdf_mem_free(rcpi_req);
14030 }
14031 } else {
Rajeev Kumar Sirasanagandla996e5292016-11-22 21:20:33 +053014032 qdf_mem_free(rcpi_req);
14033 }
14034
14035 return status;
14036}
14037
Jeff Johnsonc7309062018-11-09 20:59:42 -080014038void sme_store_pdev(mac_handle_t mac_handle, struct wlan_objmgr_pdev *pdev)
Kiran Kumar Lokerea3de2262017-04-12 12:15:04 -070014039{
Jeff Johnson0a8786a2018-12-02 10:49:01 -080014040 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Kiran Kumar Lokerea3de2262017-04-12 12:15:04 -070014041 void *wma_handle;
14042 QDF_STATUS status;
14043
Kiran Kumar Lokeref089a3a2017-04-20 21:39:26 -070014044 status = wlan_objmgr_pdev_try_get_ref(pdev, WLAN_LEGACY_MAC_ID);
Kiran Kumar Lokerea3de2262017-04-12 12:15:04 -070014045 if (QDF_STATUS_SUCCESS != status) {
14046 mac_ctx->pdev = NULL;
14047 return;
14048 }
14049 mac_ctx->pdev = pdev;
14050 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
14051 if (!wma_handle) {
14052 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
Kiran Kumar Lokeref089a3a2017-04-20 21:39:26 -070014053 FL("wma handle is NULL"));
Kiran Kumar Lokerea3de2262017-04-12 12:15:04 -070014054 return;
14055 }
14056 wma_store_pdev(wma_handle, pdev);
Kiran Kumar Lokere4ce40482018-08-30 16:31:00 -070014057 pdev->pdev_nif.pdev_fw_caps |= SUPPORTED_CRYPTO_CAPS;
Kiran Kumar Lokerea3de2262017-04-12 12:15:04 -070014058}
14059
Jeff Johnsonc7309062018-11-09 20:59:42 -080014060QDF_STATUS sme_congestion_register_callback(mac_handle_t mac_handle,
Jeff Johnsonf6182e42018-07-03 14:46:17 -070014061 congestion_cb congestion_cb)
Padma, Santhosh Kumar16dacfb2017-03-21 19:05:40 +053014062{
14063 QDF_STATUS status;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080014064 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Padma, Santhosh Kumar16dacfb2017-03-21 19:05:40 +053014065
14066 status = sme_acquire_global_lock(&mac->sme);
14067 if (QDF_IS_STATUS_SUCCESS(status)) {
14068 mac->sme.congestion_cb = congestion_cb;
14069 sme_release_global_lock(&mac->sme);
Srinivas Girigowda2c263352017-03-17 17:49:53 -070014070 sme_debug("congestion callback set");
Padma, Santhosh Kumar16dacfb2017-03-21 19:05:40 +053014071 }
14072
14073 return status;
14074}
Sandeep Puligillaf587adf2017-04-27 19:53:21 -070014075
Jeff Johnsonda2afa42018-07-04 10:25:42 -070014076QDF_STATUS sme_register_tx_queue_cb(mac_handle_t mac_handle,
14077 tx_queue_cb tx_queue_cb)
Varun Reddy Yeturu076eaa82018-01-16 12:16:14 -080014078{
14079 QDF_STATUS status;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080014080 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Varun Reddy Yeturu076eaa82018-01-16 12:16:14 -080014081
14082 status = sme_acquire_global_lock(&mac->sme);
14083 if (QDF_IS_STATUS_SUCCESS(status)) {
14084 mac->sme.tx_queue_cb = tx_queue_cb;
14085 sme_release_global_lock(&mac->sme);
14086 sme_debug("Tx queue callback set");
Varun Reddy Yeturu076eaa82018-01-16 12:16:14 -080014087 }
14088
14089 return status;
14090}
14091
Jeff Johnsonda2afa42018-07-04 10:25:42 -070014092QDF_STATUS sme_deregister_tx_queue_cb(mac_handle_t mac_handle)
Varun Reddy Yeturu076eaa82018-01-16 12:16:14 -080014093{
Jeff Johnsonda2afa42018-07-04 10:25:42 -070014094 return sme_register_tx_queue_cb(mac_handle, NULL);
Varun Reddy Yeturu076eaa82018-01-16 12:16:14 -080014095}
14096
Varun Reddy Yeturud33033f2018-06-11 10:58:30 -070014097#ifdef WLAN_SUPPORT_TWT
Jeff Johnson3a08ff92018-07-03 19:40:44 -070014098QDF_STATUS sme_register_twt_enable_complete_cb(mac_handle_t mac_handle,
14099 twt_enable_cb twt_enable_cb)
Varun Reddy Yeturu3c9f89c2018-04-18 19:10:34 -070014100{
14101 QDF_STATUS status;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080014102 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Varun Reddy Yeturu3c9f89c2018-04-18 19:10:34 -070014103
14104 status = sme_acquire_global_lock(&mac->sme);
14105 if (QDF_IS_STATUS_SUCCESS(status)) {
14106 mac->sme.twt_enable_cb = twt_enable_cb;
14107 sme_release_global_lock(&mac->sme);
14108 sme_debug("TWT: enable callback set");
Varun Reddy Yeturu3c9f89c2018-04-18 19:10:34 -070014109 }
14110
14111 return status;
14112}
14113
Jeff Johnson3a08ff92018-07-03 19:40:44 -070014114QDF_STATUS sme_register_twt_disable_complete_cb(mac_handle_t mac_handle,
14115 twt_disable_cb twt_disable_cb)
Varun Reddy Yeturu3c9f89c2018-04-18 19:10:34 -070014116{
14117 QDF_STATUS status;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080014118 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Varun Reddy Yeturu3c9f89c2018-04-18 19:10:34 -070014119
14120 status = sme_acquire_global_lock(&mac->sme);
14121 if (QDF_IS_STATUS_SUCCESS(status)) {
14122 mac->sme.twt_disable_cb = twt_disable_cb;
14123 sme_release_global_lock(&mac->sme);
14124 sme_debug("TWT: disable callback set");
Varun Reddy Yeturu3c9f89c2018-04-18 19:10:34 -070014125 }
14126
14127 return status;
14128}
14129
Jeff Johnson3a08ff92018-07-03 19:40:44 -070014130QDF_STATUS sme_deregister_twt_enable_complete_cb(mac_handle_t mac_handle)
Varun Reddy Yeturu3c9f89c2018-04-18 19:10:34 -070014131{
Jeff Johnson3a08ff92018-07-03 19:40:44 -070014132 return sme_register_twt_enable_complete_cb(mac_handle, NULL);
Varun Reddy Yeturu3c9f89c2018-04-18 19:10:34 -070014133}
14134
Jeff Johnson3a08ff92018-07-03 19:40:44 -070014135QDF_STATUS sme_deregister_twt_disable_complete_cb(mac_handle_t mac_handle)
Varun Reddy Yeturu3c9f89c2018-04-18 19:10:34 -070014136{
Jeff Johnson3a08ff92018-07-03 19:40:44 -070014137 return sme_register_twt_disable_complete_cb(mac_handle, NULL);
Varun Reddy Yeturu3c9f89c2018-04-18 19:10:34 -070014138}
14139#endif
14140
Ashish Kumar Dhanotiyab28338c2017-07-21 20:12:34 +053014141QDF_STATUS sme_set_smps_cfg(uint32_t vdev_id, uint32_t param_id,
14142 uint32_t param_val)
14143{
14144 return wma_configure_smps_params(vdev_id, param_id, param_val);
14145}
14146
Jeff Johnsonc7309062018-11-09 20:59:42 -080014147QDF_STATUS sme_set_reorder_timeout(mac_handle_t mac_handle,
14148 struct sir_set_rx_reorder_timeout_val *req)
lifeng66831662017-05-19 16:01:35 +080014149{
14150 QDF_STATUS status;
Zhang Qian1e7649e2018-06-04 13:07:18 +080014151 tp_wma_handle wma_handle;
lifeng66831662017-05-19 16:01:35 +080014152
Zhang Qian1e7649e2018-06-04 13:07:18 +080014153 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
14154 status = wma_set_rx_reorder_timeout_val(wma_handle, req);
lifeng66831662017-05-19 16:01:35 +080014155
14156 return status;
14157}
14158
Jeff Johnsonc7309062018-11-09 20:59:42 -080014159QDF_STATUS sme_set_rx_set_blocksize(mac_handle_t mac_handle,
14160 struct sir_peer_set_rx_blocksize *req)
lifeng66831662017-05-19 16:01:35 +080014161{
14162 QDF_STATUS status;
Zhang Qian1e7649e2018-06-04 13:07:18 +080014163 tp_wma_handle wma_handle;
lifeng66831662017-05-19 16:01:35 +080014164
Zhang Qian1e7649e2018-06-04 13:07:18 +080014165 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
14166 status = wma_set_rx_blocksize(wma_handle, req);
lifeng66831662017-05-19 16:01:35 +080014167
14168 return status;
14169}
Naveen Rawat247a8682017-06-05 15:00:31 -070014170
14171int sme_cli_set_command(int vdev_id, int param_id, int sval, int vpdev)
14172{
14173 return wma_cli_set_command(vdev_id, param_id, sval, vpdev);
14174}
Vidyullatha Kanchanapallybe0ebb32017-03-23 14:36:21 +053014175
Vignesh Viswanathana851d752018-10-03 19:44:38 +053014176int sme_set_enable_mem_deep_sleep(mac_handle_t mac_handle, int vdev_id)
14177{
Jeff Johnson0a8786a2018-12-02 10:49:01 -080014178 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Vignesh Viswanathana851d752018-10-03 19:44:38 +053014179
14180 return wma_cli_set_command(vdev_id, WMI_PDEV_PARAM_HYST_EN,
14181 mac_ctx->mlme_cfg->gen.memory_deep_sleep,
14182 PDEV_CMD);
14183}
14184
14185int sme_set_cck_tx_fir_override(mac_handle_t mac_handle, int vdev_id)
14186{
Jeff Johnson0a8786a2018-12-02 10:49:01 -080014187 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Vignesh Viswanathana851d752018-10-03 19:44:38 +053014188
14189 return wma_cli_set_command(vdev_id,
14190 WMI_PDEV_PARAM_ENABLE_CCK_TXFIR_OVERRIDE,
14191 mac_ctx->mlme_cfg->gen.cck_tx_fir_override,
14192 PDEV_CMD);
14193}
14194
Jeff Johnsond0b6c7e2018-07-04 14:53:06 -070014195QDF_STATUS sme_set_bt_activity_info_cb(mac_handle_t mac_handle,
14196 bt_activity_info_cb cb)
Vidyullatha Kanchanapallybe0ebb32017-03-23 14:36:21 +053014197{
14198 QDF_STATUS status;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080014199 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Vidyullatha Kanchanapallybe0ebb32017-03-23 14:36:21 +053014200
14201 status = sme_acquire_global_lock(&mac->sme);
14202 if (QDF_IS_STATUS_SUCCESS(status)) {
14203 mac->sme.bt_activity_info_cb = cb;
14204 sme_release_global_lock(&mac->sme);
14205 sme_debug("bt activity info callback set");
Vidyullatha Kanchanapallybe0ebb32017-03-23 14:36:21 +053014206 }
14207
14208 return status;
14209}
lifengd217d192017-05-09 19:44:16 +080014210
Jeff Johnsonc7309062018-11-09 20:59:42 -080014211QDF_STATUS sme_get_chain_rssi(mac_handle_t mac_handle,
lifengd217d192017-05-09 19:44:16 +080014212 struct get_chain_rssi_req_params *input,
14213 get_chain_rssi_callback callback,
14214 void *context)
14215{
14216 QDF_STATUS status = QDF_STATUS_SUCCESS;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080014217 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Zhang Qian1e7649e2018-06-04 13:07:18 +080014218 tp_wma_handle wma_handle;
lifengd217d192017-05-09 19:44:16 +080014219
14220 SME_ENTER();
14221
Jeff Johnson038efe72019-03-18 13:39:31 -070014222 if (!input) {
lifengd217d192017-05-09 19:44:16 +080014223 sme_err("Invalid req params");
14224 return QDF_STATUS_E_INVAL;
14225 }
14226
14227 mac_ctx->sme.get_chain_rssi_cb = callback;
14228 mac_ctx->sme.get_chain_rssi_context = context;
Zhang Qian1e7649e2018-06-04 13:07:18 +080014229 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
14230 wma_get_chain_rssi(wma_handle, input);
lifengd217d192017-05-09 19:44:16 +080014231
14232 SME_EXIT();
14233 return status;
14234}
Vignesh Viswanathan66c951d2017-09-06 12:23:42 +053014235
Jeff Johnson0a8786a2018-12-02 10:49:01 -080014236QDF_STATUS sme_process_msg_callback(struct mac_context *mac,
Jeff Johnson5f9ce2d2018-06-09 21:20:45 -070014237 struct scheduler_msg *msg)
Sandeep Puligilla1426d612017-04-12 18:22:06 -070014238{
14239 QDF_STATUS status = QDF_STATUS_E_FAILURE;
14240
Jeff Johnson038efe72019-03-18 13:39:31 -070014241 if (!msg) {
Sandeep Puligilla1426d612017-04-12 18:22:06 -070014242 sme_err("Empty message for SME Msg callback");
14243 return status;
14244 }
Jeff Johnson5f9ce2d2018-06-09 21:20:45 -070014245 status = sme_process_msg(mac, msg);
Sandeep Puligilla1426d612017-04-12 18:22:06 -070014246 return status;
14247}
14248
Jeff Johnsonc7309062018-11-09 20:59:42 -080014249void sme_display_disconnect_stats(mac_handle_t mac_handle, uint8_t session_id)
Vignesh Viswanathan66c951d2017-09-06 12:23:42 +053014250{
14251 struct csr_roam_session *session;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080014252 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Vignesh Viswanathan66c951d2017-09-06 12:23:42 +053014253
14254 if (!CSR_IS_SESSION_VALID(mac_ctx, session_id)) {
14255 sme_err("%s Invalid session id: %d", __func__, session_id);
14256 return;
14257 }
14258
14259 session = CSR_GET_SESSION(mac_ctx, session_id);
14260 if (!session) {
14261 sme_err("%s Failed to get session for id: %d",
14262 __func__, session_id);
14263 return;
14264 }
14265
Nirav Shahe6194ac2018-07-13 11:04:41 +053014266 sme_nofl_info("Total No. of Disconnections: %d",
14267 session->disconnect_stats.disconnection_cnt);
Vignesh Viswanathan66c951d2017-09-06 12:23:42 +053014268
Nirav Shahe6194ac2018-07-13 11:04:41 +053014269 sme_nofl_info("No. of Diconnects Triggered by Application: %d",
14270 session->disconnect_stats.disconnection_by_app);
Vignesh Viswanathan66c951d2017-09-06 12:23:42 +053014271
Nirav Shahe6194ac2018-07-13 11:04:41 +053014272 sme_nofl_info("No. of Disassoc Sent by Peer: %d",
14273 session->disconnect_stats.disassoc_by_peer);
Vignesh Viswanathan66c951d2017-09-06 12:23:42 +053014274
Nirav Shahe6194ac2018-07-13 11:04:41 +053014275 sme_nofl_info("No. of Deauth Sent by Peer: %d",
14276 session->disconnect_stats.deauth_by_peer);
Vignesh Viswanathan66c951d2017-09-06 12:23:42 +053014277
Nirav Shahe6194ac2018-07-13 11:04:41 +053014278 sme_nofl_info("No. of Disconnections due to Beacon Miss: %d",
14279 session->disconnect_stats.bmiss);
Vignesh Viswanathan66c951d2017-09-06 12:23:42 +053014280
Nirav Shahe6194ac2018-07-13 11:04:41 +053014281 sme_nofl_info("No. of Disconnections due to Peer Kickout: %d",
14282 session->disconnect_stats.peer_kickout);
Vignesh Viswanathan66c951d2017-09-06 12:23:42 +053014283}
Nachiket Kukadeaaf8a712017-07-27 19:15:36 +053014284
Rachit Kankanef6834c42018-08-02 18:47:50 +053014285#ifdef FEATURE_WLAN_DYNAMIC_CVM
Nachiket Kukade8983cf62017-10-12 18:14:48 +053014286 /**
14287 * sme_set_vc_mode_config() - Set voltage corner config to FW
14288 * @bitmap: Bitmap that referes to voltage corner config with
14289 * different phymode and bw configuration
14290 *
14291 * Return: QDF_STATUS
14292 */
14293QDF_STATUS sme_set_vc_mode_config(uint32_t vc_bitmap)
14294{
14295 void *wma_handle;
14296
14297 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
14298 if (!wma_handle) {
14299 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
14300 "wma_handle is NULL");
14301 return QDF_STATUS_E_FAILURE;
14302 }
14303 if (QDF_STATUS_SUCCESS !=
14304 wma_set_vc_mode_config(wma_handle, vc_bitmap)) {
14305 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
14306 "%s: Failed to set Voltage Control config to FW",
14307 __func__);
14308 return QDF_STATUS_E_FAILURE;
14309 }
14310 return QDF_STATUS_SUCCESS;
14311}
Rachit Kankanef6834c42018-08-02 18:47:50 +053014312#endif
Nachiket Kukade8983cf62017-10-12 18:14:48 +053014313
Nachiket Kukadeaaf8a712017-07-27 19:15:36 +053014314/**
14315 * sme_set_bmiss_bcnt() - set bmiss config parameters
14316 * @vdev_id: virtual device for the command
14317 * @first_cnt: bmiss first value
14318 * @final_cnt: bmiss final value
14319 *
14320 * Return: QDF_STATUS_SUCCESS or non-zero on failure
14321 */
14322QDF_STATUS sme_set_bmiss_bcnt(uint32_t vdev_id, uint32_t first_cnt,
14323 uint32_t final_cnt)
14324{
14325 return wma_config_bmiss_bcnt_params(vdev_id, first_cnt, final_cnt);
14326}
Ganesh Kondabattini479a8ae2017-10-03 16:49:24 +053014327
Jeff Johnsonc7309062018-11-09 20:59:42 -080014328QDF_STATUS sme_send_limit_off_channel_params(mac_handle_t mac_handle,
14329 uint8_t vdev_id,
14330 bool is_tos_active,
14331 uint32_t max_off_chan_time,
14332 uint32_t rest_time,
14333 bool skip_dfs_chan)
Ganesh Kondabattini479a8ae2017-10-03 16:49:24 +053014334{
14335 struct sir_limit_off_chan *cmd;
14336 struct scheduler_msg msg = {0};
14337
14338 cmd = qdf_mem_malloc(sizeof(*cmd));
Arif Hussain0ef77082018-10-10 16:42:53 -070014339 if (!cmd)
Ganesh Kondabattini479a8ae2017-10-03 16:49:24 +053014340 return QDF_STATUS_E_NOMEM;
Ganesh Kondabattini479a8ae2017-10-03 16:49:24 +053014341
14342 cmd->vdev_id = vdev_id;
14343 cmd->is_tos_active = is_tos_active;
14344 cmd->max_off_chan_time = max_off_chan_time;
14345 cmd->rest_time = rest_time;
14346 cmd->skip_dfs_chans = skip_dfs_chan;
14347
14348 msg.type = WMA_SET_LIMIT_OFF_CHAN;
14349 msg.reserved = 0;
14350 msg.bodyptr = cmd;
14351
gaurank kathpalia36b0c582018-08-28 17:45:43 +053014352 if (!QDF_IS_STATUS_SUCCESS(scheduler_post_message(QDF_MODULE_ID_SME,
14353 QDF_MODULE_ID_WMA,
14354 QDF_MODULE_ID_WMA,
14355 &msg))) {
Ganesh Kondabattini479a8ae2017-10-03 16:49:24 +053014356 sme_err("Not able to post WMA_SET_LIMIT_OFF_CHAN to WMA");
14357 qdf_mem_free(cmd);
14358 return QDF_STATUS_E_FAILURE;
14359 }
14360
14361 return QDF_STATUS_SUCCESS;
14362}
Vignesh Viswanathan9dd88d32017-11-22 14:22:03 +053014363
Jeff Johnsonc7309062018-11-09 20:59:42 -080014364uint32_t sme_unpack_rsn_ie(mac_handle_t mac_handle, uint8_t *buf,
Qiwei Caie689a262018-07-26 15:50:22 +080014365 uint8_t buf_len, tDot11fIERSN *rsn_ie,
14366 bool append_ie)
14367{
Jeff Johnson0a8786a2018-12-02 10:49:01 -080014368 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Qiwei Caie689a262018-07-26 15:50:22 +080014369
14370 return dot11f_unpack_ie_rsn(mac_ctx, buf, buf_len, rsn_ie, append_ie);
14371}
14372
14373#ifdef FEATURE_BSS_TRANSITION
Vignesh Viswanathan9dd88d32017-11-22 14:22:03 +053014374/**
14375 * sme_get_status_for_candidate() - Get bss transition status for candidate
Jeff Johnsone0d1dbe2018-11-17 08:51:09 -080014376 * @mac_handle: Opaque handle to the global MAC context
Vignesh Viswanathan9dd88d32017-11-22 14:22:03 +053014377 * @conn_bss_desc: connected bss descriptor
14378 * @bss_desc: candidate bss descriptor
14379 * @info: candiadate bss information
14380 * @trans_reason: transition reason code
14381 * @is_bt_in_progress: bt activity indicator
14382 *
14383 * Return : true if candidate is rejected and reject reason is filled
14384 * @info->status. Otherwise returns false.
14385 */
Jeff Johnsonc7309062018-11-09 20:59:42 -080014386static bool sme_get_status_for_candidate(mac_handle_t mac_handle,
14387 tSirBssDescription *conn_bss_desc,
14388 tSirBssDescription *bss_desc,
14389 struct bss_candidate_info *info,
14390 uint8_t trans_reason,
14391 bool is_bt_in_progress)
Vignesh Viswanathan9dd88d32017-11-22 14:22:03 +053014392{
Jeff Johnson0a8786a2018-12-02 10:49:01 -080014393 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Pragaspathi Thilagarajcd6aef02018-09-11 20:30:23 +053014394 struct wlan_mlme_mbo *mbo_cfg;
14395 int8_t current_rssi_mcc_thres;
14396
14397 if (!(mac_ctx->mlme_cfg)) {
14398 pe_err("mlme cfg is NULL");
14399 return false;
14400 }
14401 mbo_cfg = &mac_ctx->mlme_cfg->mbo_cfg;
Vignesh Viswanathan9dd88d32017-11-22 14:22:03 +053014402
14403 /*
14404 * Low RSSI based rejection
14405 * If candidate rssi is less than mbo_candidate_rssi_thres and connected
14406 * bss rssi is greater than mbo_current_rssi_thres, then reject the
14407 * candidate with MBO reason code 4.
14408 */
Pragaspathi Thilagarajcd6aef02018-09-11 20:30:23 +053014409 if ((bss_desc->rssi < mbo_cfg->mbo_candidate_rssi_thres) &&
14410 (conn_bss_desc->rssi > mbo_cfg->mbo_current_rssi_thres)) {
Vignesh Viswanathan9dd88d32017-11-22 14:22:03 +053014411 sme_err("Candidate BSS "MAC_ADDRESS_STR" has LOW RSSI(%d), hence reject",
14412 MAC_ADDR_ARRAY(bss_desc->bssId), bss_desc->rssi);
14413 info->status = QCA_STATUS_REJECT_LOW_RSSI;
14414 return true;
14415 }
14416
14417 if (trans_reason == MBO_TRANSITION_REASON_LOAD_BALANCING ||
14418 trans_reason == MBO_TRANSITION_REASON_TRANSITIONING_TO_PREMIUM_AP) {
14419 /*
14420 * MCC rejection
14421 * If moving to candidate's channel will result in MCC scenario
14422 * and the rssi of connected bss is greater than
14423 * mbo_current_rssi_mss_thres, then reject the candidate with
14424 * MBO reason code 3.
14425 */
Pragaspathi Thilagarajcd6aef02018-09-11 20:30:23 +053014426 current_rssi_mcc_thres = mbo_cfg->mbo_current_rssi_mcc_thres;
14427 if ((conn_bss_desc->rssi > current_rssi_mcc_thres) &&
Jeff Johnson9d118852018-06-10 16:54:59 -070014428 csr_is_mcc_channel(mac_ctx, bss_desc->channelId)) {
Vignesh Viswanathan9dd88d32017-11-22 14:22:03 +053014429 sme_err("Candidate BSS "MAC_ADDRESS_STR" causes MCC, hence reject",
14430 MAC_ADDR_ARRAY(bss_desc->bssId));
14431 info->status =
14432 QCA_STATUS_REJECT_INSUFFICIENT_QOS_CAPACITY;
14433 return true;
14434 }
14435
14436 /*
14437 * BT coex rejection
14438 * If AP is trying to move the client from 5G to 2.4G and moving
14439 * to 2.4G will result in BT coex and candidate channel rssi is
14440 * less than mbo_candidate_rssi_btc_thres, then reject the
14441 * candidate with MBO reason code 2.
14442 */
14443 if (WLAN_REG_IS_5GHZ_CH(conn_bss_desc->channelId) &&
14444 WLAN_REG_IS_24GHZ_CH(bss_desc->channelId) &&
14445 is_bt_in_progress &&
Pragaspathi Thilagarajcd6aef02018-09-11 20:30:23 +053014446 (bss_desc->rssi < mbo_cfg->mbo_candidate_rssi_btc_thres)) {
Vignesh Viswanathan9dd88d32017-11-22 14:22:03 +053014447 sme_err("Candidate BSS "MAC_ADDRESS_STR" causes BT coex, hence reject",
14448 MAC_ADDR_ARRAY(bss_desc->bssId));
14449 info->status =
14450 QCA_STATUS_REJECT_EXCESSIVE_DELAY_EXPECTED;
14451 return true;
14452 }
14453
14454 /*
14455 * LTE coex rejection
14456 * If moving to candidate's channel can cause LTE coex, then
14457 * reject the candidate with MBO reason code 5.
14458 */
14459 if (policy_mgr_is_safe_channel(mac_ctx->psoc,
14460 conn_bss_desc->channelId) &&
14461 !(policy_mgr_is_safe_channel(mac_ctx->psoc,
14462 bss_desc->channelId))) {
14463 sme_err("High interference expected if transitioned to BSS "
14464 MAC_ADDRESS_STR" hence reject",
14465 MAC_ADDR_ARRAY(bss_desc->bssId));
14466 info->status =
14467 QCA_STATUS_REJECT_HIGH_INTERFERENCE;
14468 return true;
14469 }
14470 }
14471
14472 return false;
14473}
14474
Jeff Johnson62737252018-11-17 10:59:43 -080014475QDF_STATUS sme_get_bss_transition_status(mac_handle_t mac_handle,
14476 uint8_t transition_reason,
14477 struct qdf_mac_addr *bssid,
14478 struct bss_candidate_info *info,
14479 uint16_t n_candidates,
14480 bool is_bt_in_progress)
Vignesh Viswanathan9dd88d32017-11-22 14:22:03 +053014481{
14482 QDF_STATUS status = QDF_STATUS_SUCCESS;
14483 tSirBssDescription *bss_desc, *conn_bss_desc;
14484 tCsrScanResultInfo *res, *conn_res;
14485 uint16_t i;
14486
14487 if (!n_candidates || !info) {
14488 sme_err("No candidate info available");
14489 return QDF_STATUS_E_INVAL;
14490 }
14491
14492 conn_res = qdf_mem_malloc(sizeof(tCsrScanResultInfo));
Arif Hussain0ef77082018-10-10 16:42:53 -070014493 if (!conn_res)
Vignesh Viswanathan9dd88d32017-11-22 14:22:03 +053014494 return QDF_STATUS_E_NOMEM;
Vignesh Viswanathan9dd88d32017-11-22 14:22:03 +053014495
14496 res = qdf_mem_malloc(sizeof(tCsrScanResultInfo));
14497 if (!res) {
Vignesh Viswanathan9dd88d32017-11-22 14:22:03 +053014498 status = QDF_STATUS_E_NOMEM;
14499 goto free;
14500 }
14501
14502 /* Get the connected BSS descriptor */
Jeff Johnsonc7309062018-11-09 20:59:42 -080014503 status = sme_scan_get_result_for_bssid(mac_handle, bssid, conn_res);
Vignesh Viswanathan9dd88d32017-11-22 14:22:03 +053014504 if (!QDF_IS_STATUS_SUCCESS(status)) {
14505 sme_err("Failed to find connected BSS in scan list");
14506 goto free;
14507 }
14508 conn_bss_desc = &conn_res->BssDescriptor;
14509
14510 for (i = 0; i < n_candidates; i++) {
14511 /* Get candidate BSS descriptors */
Jeff Johnsonc7309062018-11-09 20:59:42 -080014512 status = sme_scan_get_result_for_bssid(mac_handle,
14513 &info[i].bssid,
Vignesh Viswanathan9dd88d32017-11-22 14:22:03 +053014514 res);
14515 if (!QDF_IS_STATUS_SUCCESS(status)) {
14516 sme_err("BSS "MAC_ADDRESS_STR" not present in scan list",
14517 MAC_ADDR_ARRAY(info[i].bssid.bytes));
14518 info[i].status = QCA_STATUS_REJECT_UNKNOWN;
14519 continue;
14520 }
14521
14522 bss_desc = &res->BssDescriptor;
Jeff Johnsonc7309062018-11-09 20:59:42 -080014523 if (!sme_get_status_for_candidate(mac_handle, conn_bss_desc,
14524 bss_desc, &info[i],
14525 transition_reason,
14526 is_bt_in_progress)) {
Vignesh Viswanathan9dd88d32017-11-22 14:22:03 +053014527 /*
14528 * If status is not over written, it means it is a
14529 * candidate for accept.
14530 */
14531 info[i].status = QCA_STATUS_ACCEPT;
14532 }
14533 }
14534
14535 /* success */
14536 status = QDF_STATUS_SUCCESS;
14537
14538free:
14539 /* free allocated memory */
14540 if (conn_res)
14541 qdf_mem_free(conn_res);
14542 if (res)
14543 qdf_mem_free(res);
14544
14545 return status;
14546}
Qiwei Caie689a262018-07-26 15:50:22 +080014547#endif /* FEATURE_BSS_TRANSITION */
Vignesh Viswanathan9dd88d32017-11-22 14:22:03 +053014548
Jeff Johnsonc7309062018-11-09 20:59:42 -080014549bool sme_is_conn_state_connected(mac_handle_t mac_handle, uint8_t session_id)
Vignesh Viswanathan79f7e3f2018-09-30 23:56:10 +053014550{
Jeff Johnson0a8786a2018-12-02 10:49:01 -080014551 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Vignesh Viswanathan79f7e3f2018-09-30 23:56:10 +053014552
14553 return csr_is_conn_state_connected(mac_ctx, session_id);
14554}
14555
Jeff Johnsonc7309062018-11-09 20:59:42 -080014556void sme_enable_roaming_on_connected_sta(mac_handle_t mac_handle)
Abhishek Singh1f217ec2017-12-22 11:48:27 +053014557{
14558 uint8_t session_id;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080014559 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Abhishek Singh1f217ec2017-12-22 11:48:27 +053014560 QDF_STATUS status;
14561
14562 session_id = csr_get_roam_enabled_sta_sessionid(mac_ctx);
Srinivas Girigowdad8697d42019-03-08 15:34:39 -080014563 if (session_id != WLAN_UMAC_VDEV_ID_MAX)
Abhishek Singh1f217ec2017-12-22 11:48:27 +053014564 return;
14565
14566 session_id = csr_get_connected_infra(mac_ctx);
Srinivas Girigowdad8697d42019-03-08 15:34:39 -080014567 if (session_id == WLAN_UMAC_VDEV_ID_MAX) {
Abhishek Singh1f217ec2017-12-22 11:48:27 +053014568 sme_debug("No STA in conencted state");
14569 return;
14570 }
14571
14572 sme_debug("Roaming not enabled on any STA, enable roaming on session %d",
14573 session_id);
14574 status = sme_acquire_global_lock(&mac_ctx->sme);
14575 if (QDF_IS_STATUS_SUCCESS(status)) {
14576 csr_roam_offload_scan(mac_ctx, session_id,
14577 ROAM_SCAN_OFFLOAD_START,
14578 REASON_CTX_INIT);
14579 sme_release_global_lock(&mac_ctx->sme);
14580 }
Sandeep Puligilla063a4342018-01-10 02:50:14 -080014581}
Abhishek Singh1f217ec2017-12-22 11:48:27 +053014582
Sandeep Puligilla063a4342018-01-10 02:50:14 -080014583int16_t sme_get_oper_chan_freq(struct wlan_objmgr_vdev *vdev)
14584{
14585 uint8_t vdev_id, chan;
14586 struct csr_roam_session *session;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080014587 struct mac_context *mac_ctx;
Jeff Johnsonb460dd72018-11-08 10:26:51 -080014588 mac_handle_t mac_handle;
Sandeep Puligilla063a4342018-01-10 02:50:14 -080014589 int16_t freq = 0;
14590
Jeff Johnson038efe72019-03-18 13:39:31 -070014591 if (!vdev) {
Sandeep Puligilla063a4342018-01-10 02:50:14 -080014592 sme_err("Invalid vdev id is passed");
14593 return 0;
14594 }
14595
Jeff Johnsonb460dd72018-11-08 10:26:51 -080014596 mac_handle = cds_get_context(QDF_MODULE_ID_SME);
14597 if (!mac_handle) {
14598 sme_err("mac_handle is null");
Arif Hussaind15902c2018-03-02 00:08:29 -080014599 return 0;
14600 }
Jeff Johnsona0619e42018-11-28 17:43:00 -080014601 mac_ctx = MAC_CONTEXT(mac_handle);
Sandeep Puligilla063a4342018-01-10 02:50:14 -080014602 vdev_id = wlan_vdev_get_id(vdev);
14603 if (!CSR_IS_SESSION_VALID(mac_ctx, vdev_id)) {
14604 sme_err("Invalid vdev id is passed");
14605 return 0;
14606 }
14607
14608 session = CSR_GET_SESSION(mac_ctx, vdev_id);
14609 chan = csr_get_infra_operation_channel(mac_ctx, vdev_id);
14610 if (chan)
14611 freq = cds_chan_to_freq(chan);
14612
14613 return freq;
14614}
14615
14616enum phy_ch_width sme_get_oper_ch_width(struct wlan_objmgr_vdev *vdev)
14617{
14618 uint8_t vdev_id;
14619 struct csr_roam_session *session;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080014620 struct mac_context *mac_ctx;
Jeff Johnsonb460dd72018-11-08 10:26:51 -080014621 mac_handle_t mac_handle;
Sandeep Puligilla063a4342018-01-10 02:50:14 -080014622 enum phy_ch_width ch_width = CH_WIDTH_20MHZ;
14623
Jeff Johnson038efe72019-03-18 13:39:31 -070014624 if (!vdev) {
Sandeep Puligilla063a4342018-01-10 02:50:14 -080014625 sme_err("Invalid vdev id is passed");
14626 return CH_WIDTH_INVALID;
14627 }
14628
Jeff Johnsonb460dd72018-11-08 10:26:51 -080014629 mac_handle = cds_get_context(QDF_MODULE_ID_SME);
14630 if (!mac_handle) {
14631 sme_err("mac_handle is null");
Arif Hussaind15902c2018-03-02 00:08:29 -080014632 return CH_WIDTH_INVALID;
14633 }
Jeff Johnsona0619e42018-11-28 17:43:00 -080014634 mac_ctx = MAC_CONTEXT(mac_handle);
Sandeep Puligilla063a4342018-01-10 02:50:14 -080014635 vdev_id = wlan_vdev_get_id(vdev);
14636 if (!CSR_IS_SESSION_VALID(mac_ctx, vdev_id)) {
14637 sme_err("Invalid vdev id is passed");
14638 return CH_WIDTH_INVALID;
14639 }
14640
14641 session = CSR_GET_SESSION(mac_ctx, vdev_id);
14642
14643 if (csr_is_conn_state_connected(mac_ctx, vdev_id))
14644 ch_width = session->connectedProfile.vht_channel_width;
14645
14646 return ch_width;
14647}
14648
14649int sme_get_sec20chan_freq_mhz(struct wlan_objmgr_vdev *vdev,
14650 uint16_t *sec20chan_freq)
14651{
14652 uint8_t vdev_id;
14653
14654 vdev_id = wlan_vdev_get_id(vdev);
14655 /* Need to extend */
14656 return 0;
Abhishek Singh1f217ec2017-12-22 11:48:27 +053014657}
14658
Padma, Santhosh Kumardd3f4852018-01-16 18:51:51 +053014659#ifdef WLAN_FEATURE_SAE
Srinivas Dasarie854ff02019-02-11 17:24:48 +053014660QDF_STATUS sme_handle_sae_msg(mac_handle_t mac_handle,
14661 uint8_t session_id,
14662 uint8_t sae_status,
14663 struct qdf_mac_addr peer_mac_addr)
Padma, Santhosh Kumardd3f4852018-01-16 18:51:51 +053014664{
14665 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080014666 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Padma, Santhosh Kumardd3f4852018-01-16 18:51:51 +053014667 struct sir_sae_msg *sae_msg;
14668 struct scheduler_msg sch_msg = {0};
14669
14670 qdf_status = sme_acquire_global_lock(&mac->sme);
14671 if (QDF_IS_STATUS_SUCCESS(qdf_status)) {
14672 sae_msg = qdf_mem_malloc(sizeof(*sae_msg));
14673 if (!sae_msg) {
14674 qdf_status = QDF_STATUS_E_NOMEM;
Padma, Santhosh Kumardd3f4852018-01-16 18:51:51 +053014675 } else {
14676 sae_msg->message_type = eWNI_SME_SEND_SAE_MSG;
14677 sae_msg->length = sizeof(*sae_msg);
14678 sae_msg->session_id = session_id;
14679 sae_msg->sae_status = sae_status;
Srinivas Dasarie854ff02019-02-11 17:24:48 +053014680 qdf_mem_copy(sae_msg->peer_mac_addr,
14681 peer_mac_addr.bytes,
14682 QDF_MAC_ADDR_SIZE);
14683 sme_debug("SAE: sae_status %d session_id %d Peer: "
14684 MAC_ADDRESS_STR, sae_msg->sae_status,
14685 sae_msg->session_id,
14686 MAC_ADDR_ARRAY(sae_msg->peer_mac_addr));
Padma, Santhosh Kumardd3f4852018-01-16 18:51:51 +053014687
14688 sch_msg.type = eWNI_SME_SEND_SAE_MSG;
14689 sch_msg.bodyptr = sae_msg;
14690
14691 qdf_status =
gaurank kathpalia36b0c582018-08-28 17:45:43 +053014692 scheduler_post_message(QDF_MODULE_ID_SME,
14693 QDF_MODULE_ID_PE,
14694 QDF_MODULE_ID_PE,
Jeff Johnsonc7309062018-11-09 20:59:42 -080014695 &sch_msg);
Padma, Santhosh Kumardd3f4852018-01-16 18:51:51 +053014696 }
14697 sme_release_global_lock(&mac->sme);
14698 }
14699
14700 return qdf_status;
14701}
14702#endif
Vignesh Viswanathan0a569292018-02-14 15:34:47 +053014703
Jeff Johnsonc7309062018-11-09 20:59:42 -080014704bool sme_is_sta_key_exchange_in_progress(mac_handle_t mac_handle,
14705 uint8_t session_id)
Vignesh Viswanathan0a569292018-02-14 15:34:47 +053014706{
Jeff Johnson0a8786a2018-12-02 10:49:01 -080014707 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Vignesh Viswanathan0a569292018-02-14 15:34:47 +053014708
14709 if (!CSR_IS_SESSION_VALID(mac_ctx, session_id)) {
14710 sme_err("Invalid session id: %d", session_id);
14711 return false;
14712 }
14713
14714 return CSR_IS_WAIT_FOR_KEY(mac_ctx, session_id);
14715}
Vignesh Viswanathana2f5ce582018-05-09 20:38:39 +053014716
Jeff Johnsonc7309062018-11-09 20:59:42 -080014717bool sme_validate_channel_list(mac_handle_t mac_handle,
14718 uint8_t *chan_list,
14719 uint8_t num_channels)
Vignesh Viswanathana2f5ce582018-05-09 20:38:39 +053014720{
Jeff Johnson0a8786a2018-12-02 10:49:01 -080014721 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Vignesh Viswanathana2f5ce582018-05-09 20:38:39 +053014722 uint8_t i = 0;
14723 uint8_t j;
14724 bool found;
14725 struct csr_channel *ch_lst_info = &mac_ctx->scan.base_channels;
14726
14727 if (!chan_list || !num_channels) {
14728 sme_err("Chan list empty %pK or num_channels is 0", chan_list);
14729 return false;
14730 }
14731
14732 while (i < num_channels) {
14733 found = false;
14734 for (j = 0; j < ch_lst_info->numChannels; j++) {
14735 if (ch_lst_info->channelList[j] == chan_list[i]) {
14736 found = true;
14737 break;
14738 }
14739 }
14740
14741 if (!found) {
14742 sme_debug("Invalid channel %d", chan_list[i]);
14743 return false;
14744 }
14745
14746 i++;
14747 }
Arif Hussain0e246802018-05-01 18:13:44 -070014748
Vignesh Viswanathana2f5ce582018-05-09 20:38:39 +053014749 return true;
14750}
Arif Hussain0e246802018-05-01 18:13:44 -070014751
Jeff Johnsonc7309062018-11-09 20:59:42 -080014752void sme_set_amsdu(mac_handle_t mac_handle, bool enable)
Arif Hussain0e246802018-05-01 18:13:44 -070014753{
Jeff Johnson0a8786a2018-12-02 10:49:01 -080014754 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Arif Hussain0e246802018-05-01 18:13:44 -070014755 mac_ctx->is_usr_cfg_amsdu_enabled = enable;
14756}
Naveen Rawatfa2a1002018-05-17 16:06:37 -070014757
Kiran Kumar Lokere921b5a52019-02-24 21:53:20 -080014758#ifdef WLAN_FEATURE_11AX
14759void sme_set_he_testbed_def(mac_handle_t mac_handle, uint8_t vdev_id)
14760{
14761 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
14762 struct csr_roam_session *session;
14763
14764 session = CSR_GET_SESSION(mac_ctx, vdev_id);
14765
14766 if (!session) {
14767 sme_debug("No session for id %d", vdev_id);
14768 return;
14769 }
14770 sme_debug("set HE testbed defaults");
14771 mac_ctx->mlme_cfg->he_caps.dot11_he_cap.amsdu_in_ampdu = 0;
14772 mac_ctx->mlme_cfg->he_caps.dot11_he_cap.twt_request = 0;
14773 mac_ctx->mlme_cfg->he_caps.dot11_he_cap.omi_a_ctrl = 0;
14774 mac_ctx->mlme_cfg->he_caps.dot11_he_cap.he_ppdu_20_in_160_80p80Mhz = 0;
14775 mac_ctx->mlme_cfg->he_caps.dot11_he_cap.he_ppdu_20_in_40Mhz_2G = 0;
14776 mac_ctx->mlme_cfg->he_caps.dot11_he_cap.he_ppdu_80_in_160_80p80Mhz = 0;
14777 mac_ctx->mlme_cfg->he_caps.dot11_he_cap.dcm_enc_tx = 0;
14778 mac_ctx->mlme_cfg->he_caps.dot11_he_cap.dcm_enc_rx = 0;
14779 mac_ctx->mlme_cfg->he_caps.dot11_he_cap.max_nc = 0;
14780 mac_ctx->mlme_cfg->he_caps.dot11_he_cap.trigger_frm_mac_pad =
14781 QCA_WLAN_HE_16US_OF_PROCESS_TIME;
14782 csr_update_session_he_cap(mac_ctx, session);
14783}
14784
14785void sme_reset_he_caps(mac_handle_t mac_handle, uint8_t vdev_id)
14786{
14787 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
14788 struct csr_roam_session *session;
14789
14790 session = CSR_GET_SESSION(mac_ctx, vdev_id);
14791
14792 if (!session) {
14793 sme_err("No session for id %d", vdev_id);
14794 return;
14795 }
14796 sme_debug("reset HE caps");
14797 mac_ctx->mlme_cfg->he_caps.dot11_he_cap =
14798 mac_ctx->mlme_cfg->he_caps.he_cap_orig;
14799 csr_update_session_he_cap(mac_ctx, session);
14800}
14801#endif
14802
Naveen Rawatfa2a1002018-05-17 16:06:37 -070014803uint8_t sme_get_mcs_idx(uint16_t max_rate, uint8_t rate_flags,
Hanumanth Reddy Pothula834f9432018-05-30 14:20:32 +053014804 uint8_t *nss, uint8_t *mcs_rate_flags)
Naveen Rawatfa2a1002018-05-17 16:06:37 -070014805{
14806 return wma_get_mcs_idx(max_rate, rate_flags, nss, mcs_rate_flags);
14807}
Chaoli Zhou75b062f2018-06-11 12:36:54 +080014808
Jeff Johnsonc7309062018-11-09 20:59:42 -080014809bool sme_find_session_by_bssid(mac_handle_t mac_handle, uint8_t *bssid)
Chaoli Zhou75b062f2018-06-11 12:36:54 +080014810{
Jeff Johnson0a8786a2018-12-02 10:49:01 -080014811 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Chaoli Zhou75b062f2018-06-11 12:36:54 +080014812 bool ret;
14813
14814 ret = csr_find_session_by_bssid(mac_ctx, bssid);
14815
14816 return ret;
14817}
Rajeev Kumar Sirasanagandla4f20b672018-03-12 13:52:50 +053014818
Krunal Soni5e483782018-10-25 15:42:44 -070014819#ifdef FEATURE_WLAN_DIAG_SUPPORT_CSR
14820QDF_STATUS sme_get_sta_cxn_info(mac_handle_t mac_handle, uint32_t session_id,
14821 char *buf, uint32_t buf_sz)
14822{
14823 QDF_STATUS status;
14824 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
14825 struct tagCsrRoamConnectedProfile *conn_profile;
14826 struct csr_roam_session *session = CSR_GET_SESSION(mac_ctx, session_id);
14827
14828 status = sme_acquire_global_lock(&mac_ctx->sme);
14829 if (!QDF_IS_STATUS_SUCCESS(status))
14830 return status;
14831 if (!session || !session->pCurRoamProfile) {
14832 status = QDF_STATUS_E_FAILURE;
14833 goto end;
14834 }
14835 conn_profile = &session->connectedProfile;
14836 if (!conn_profile) {
14837 status = QDF_STATUS_E_FAILURE;
14838 goto end;
14839 }
14840 csr_get_sta_cxn_info(mac_ctx, session, conn_profile, buf, buf_sz);
14841end:
14842 sme_release_global_lock(&mac_ctx->sme);
14843
14844 return status;
14845}
14846#endif
Rajeev Kumar Sirasanagandla4f20b672018-03-12 13:52:50 +053014847QDF_STATUS
Jeff Johnsonc7309062018-11-09 20:59:42 -080014848sme_get_roam_scan_stats(mac_handle_t mac_handle,
14849 roam_scan_stats_cb cb, void *context,
Rajeev Kumar Sirasanagandla4f20b672018-03-12 13:52:50 +053014850 uint32_t vdev_id)
14851{
14852 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Jeff Johnson0a8786a2018-12-02 10:49:01 -080014853 struct mac_context *mac = MAC_CONTEXT(mac_handle);
Rajeev Kumar Sirasanagandla4f20b672018-03-12 13:52:50 +053014854 struct scheduler_msg msg = {0};
14855 struct sir_roam_scan_stats *req;
14856
14857 req = qdf_mem_malloc(sizeof(*req));
Arif Hussain0ef77082018-10-10 16:42:53 -070014858 if (!req)
Rajeev Kumar Sirasanagandla4f20b672018-03-12 13:52:50 +053014859 return QDF_STATUS_E_NOMEM;
Rajeev Kumar Sirasanagandla4f20b672018-03-12 13:52:50 +053014860
14861 req->vdev_id = vdev_id;
14862 req->cb = cb;
14863 req->context = context;
14864
14865 status = sme_acquire_global_lock(&mac->sme);
14866 if (QDF_IS_STATUS_SUCCESS(status)) {
14867 msg.bodyptr = req;
14868 msg.type = WMA_GET_ROAM_SCAN_STATS;
14869 msg.reserved = 0;
gaurank kathpalia36b0c582018-08-28 17:45:43 +053014870 status = scheduler_post_message(QDF_MODULE_ID_SME,
14871 QDF_MODULE_ID_WMA,
14872 QDF_MODULE_ID_WMA,
14873 &msg);
Rajeev Kumar Sirasanagandla4f20b672018-03-12 13:52:50 +053014874 sme_release_global_lock(&mac->sme);
14875 if (!QDF_IS_STATUS_SUCCESS(status)) {
14876 QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
14877 FL("post roam scan stats req failed"));
14878 status = QDF_STATUS_E_FAILURE;
14879 qdf_mem_free(req);
14880 }
14881 } else {
Rajeev Kumar Sirasanagandla4f20b672018-03-12 13:52:50 +053014882 qdf_mem_free(req);
14883 }
14884
14885 return status;
14886}
Vignesh Viswanathan987f0bb2018-09-17 17:00:29 +053014887
Jeff Johnsonc7309062018-11-09 20:59:42 -080014888void sme_update_score_config(mac_handle_t mac_handle,
Vignesh Viswanathan987f0bb2018-09-17 17:00:29 +053014889 struct scoring_config *score_config)
14890{
Jeff Johnson0a8786a2018-12-02 10:49:01 -080014891 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
Vignesh Viswanathan987f0bb2018-09-17 17:00:29 +053014892 struct wlan_mlme_scoring_cfg *mlme_scoring_cfg;
14893
14894 mlme_scoring_cfg = &mac_ctx->mlme_cfg->scoring;
14895
14896 score_config->weight_cfg.rssi_weightage =
14897 mlme_scoring_cfg->weight_cfg.rssi_weightage;
14898 score_config->weight_cfg.ht_caps_weightage =
14899 mlme_scoring_cfg->weight_cfg.ht_caps_weightage;
14900 score_config->weight_cfg.vht_caps_weightage =
14901 mlme_scoring_cfg->weight_cfg.vht_caps_weightage;
14902 score_config->weight_cfg.he_caps_weightage =
14903 mlme_scoring_cfg->weight_cfg.he_caps_weightage;
14904 score_config->weight_cfg.chan_width_weightage =
14905 mlme_scoring_cfg->weight_cfg.chan_width_weightage;
14906 score_config->weight_cfg.chan_band_weightage =
14907 mlme_scoring_cfg->weight_cfg.chan_band_weightage;
14908 score_config->weight_cfg.nss_weightage =
14909 mlme_scoring_cfg->weight_cfg.nss_weightage;
14910 score_config->weight_cfg.beamforming_cap_weightage =
14911 mlme_scoring_cfg->weight_cfg.beamforming_cap_weightage;
14912 score_config->weight_cfg.pcl_weightage =
14913 mlme_scoring_cfg->weight_cfg.pcl_weightage;
14914 score_config->weight_cfg.channel_congestion_weightage =
14915 mlme_scoring_cfg->weight_cfg.channel_congestion_weightage;
14916 score_config->weight_cfg.oce_wan_weightage =
14917 mlme_scoring_cfg->weight_cfg.oce_wan_weightage;
14918
14919 score_config->bandwidth_weight_per_index =
14920 mlme_scoring_cfg->bandwidth_weight_per_index;
14921 score_config->nss_weight_per_index =
14922 mlme_scoring_cfg->nss_weight_per_index;
14923 score_config->band_weight_per_index =
14924 mlme_scoring_cfg->band_weight_per_index;
14925
14926 score_config->rssi_score.best_rssi_threshold =
14927 mlme_scoring_cfg->rssi_score.best_rssi_threshold;
14928 score_config->rssi_score.good_rssi_threshold =
14929 mlme_scoring_cfg->rssi_score.good_rssi_threshold;
14930 score_config->rssi_score.bad_rssi_threshold =
14931 mlme_scoring_cfg->rssi_score.bad_rssi_threshold;
14932 score_config->rssi_score.good_rssi_pcnt =
14933 mlme_scoring_cfg->rssi_score.good_rssi_pcnt;
14934 score_config->rssi_score.bad_rssi_pcnt =
14935 mlme_scoring_cfg->rssi_score.bad_rssi_pcnt;
14936 score_config->rssi_score.good_rssi_bucket_size =
14937 mlme_scoring_cfg->rssi_score.good_rssi_bucket_size;
14938 score_config->rssi_score.bad_rssi_bucket_size =
14939 mlme_scoring_cfg->rssi_score.bad_rssi_bucket_size;
14940 score_config->rssi_score.rssi_pref_5g_rssi_thresh =
14941 mlme_scoring_cfg->rssi_score.rssi_pref_5g_rssi_thresh;
14942
14943 score_config->esp_qbss_scoring.num_slot =
14944 mlme_scoring_cfg->esp_qbss_scoring.num_slot;
14945 score_config->esp_qbss_scoring.score_pcnt3_to_0 =
14946 mlme_scoring_cfg->esp_qbss_scoring.score_pcnt3_to_0;
14947 score_config->esp_qbss_scoring.score_pcnt7_to_4 =
14948 mlme_scoring_cfg->esp_qbss_scoring.score_pcnt7_to_4;
14949 score_config->esp_qbss_scoring.score_pcnt11_to_8 =
14950 mlme_scoring_cfg->esp_qbss_scoring.score_pcnt11_to_8;
14951 score_config->esp_qbss_scoring.score_pcnt15_to_12 =
14952 mlme_scoring_cfg->esp_qbss_scoring.score_pcnt15_to_12;
14953
14954 score_config->oce_wan_scoring.num_slot =
14955 mlme_scoring_cfg->oce_wan_scoring.num_slot;
14956 score_config->oce_wan_scoring.score_pcnt3_to_0 =
14957 mlme_scoring_cfg->oce_wan_scoring.score_pcnt3_to_0;
14958 score_config->oce_wan_scoring.score_pcnt7_to_4 =
14959 mlme_scoring_cfg->oce_wan_scoring.score_pcnt7_to_4;
14960 score_config->oce_wan_scoring.score_pcnt11_to_8 =
14961 mlme_scoring_cfg->oce_wan_scoring.score_pcnt11_to_8;
14962 score_config->oce_wan_scoring.score_pcnt15_to_12 =
14963 mlme_scoring_cfg->oce_wan_scoring.score_pcnt15_to_12;
14964}
lifengfaa83cb2018-11-24 01:53:56 +080014965
14966void sme_enable_fw_module_log_level(mac_handle_t mac_handle, int vdev_id)
14967{
14968 QDF_STATUS status;
14969 struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
14970 uint8_t *enable_fw_module_log_level;
14971 uint8_t enable_fw_module_log_level_num;
14972 uint8_t count = 0;
14973 uint32_t value = 0;
14974 int ret;
14975
14976 status = ucfg_fwol_get_enable_fw_module_log_level(
14977 mac_ctx->psoc, &enable_fw_module_log_level,
14978 &enable_fw_module_log_level_num);
14979 if (QDF_IS_STATUS_ERROR(status))
14980 return;
14981
14982 while (count < enable_fw_module_log_level_num) {
14983 /*
14984 * FW module log level input array looks like
14985 * below:
14986 * enable_fw_module_log_level = {<FW Module ID>,
14987 * <Log Level>,...}
14988 * For example:
14989 * enable_fw_module_log_level=
14990 * {1,0,2,1,3,2,4,3,5,4,6,5,7,6}
14991 * Above input array means :
14992 * For FW module ID 1 enable log level 0
14993 * For FW module ID 2 enable log level 1
14994 * For FW module ID 3 enable log level 2
14995 * For FW module ID 4 enable log level 3
14996 * For FW module ID 5 enable log level 4
14997 * For FW module ID 6 enable log level 5
14998 * For FW module ID 7 enable log level 6
14999 */
15000
15001 if ((enable_fw_module_log_level[count] > WLAN_MODULE_ID_MAX) ||
15002 (enable_fw_module_log_level[count + 1] > DBGLOG_LVL_MAX)) {
15003 sme_err("Module id %d or dbglog level %d input value is more than max",
15004 enable_fw_module_log_level[count],
15005 enable_fw_module_log_level[count + 1]);
wadesongeb865bb2019-01-09 19:01:06 +080015006 count += 2;
lifengfaa83cb2018-11-24 01:53:56 +080015007 continue;
15008 }
15009
15010 value = enable_fw_module_log_level[count] << 16;
15011 value |= enable_fw_module_log_level[count + 1];
15012 ret = sme_cli_set_command(vdev_id,
15013 WMI_DBGLOG_MOD_LOG_LEVEL,
15014 value, DBG_CMD);
15015 if (ret != 0)
15016 sme_err("Failed to enable FW module log level %d ret %d",
15017 value, ret);
15018
15019 count += 2;
15020 }
15021}
Visweswara Tanuku633976b2019-01-07 16:13:12 +053015022
15023#ifdef WLAN_FEATURE_MOTION_DETECTION
15024/**
15025 * sme_set_md_host_evt_cb - Register/set motion detection callback
15026 * @mac_handle: mac handle
15027 * @callback_fn: motion detection callback function pointer
15028 * @hdd_ctx: hdd context
15029 *
15030 * Return: QDF_STATUS_SUCCESS or non-zero on failure
15031 */
15032QDF_STATUS sme_set_md_host_evt_cb(
15033 mac_handle_t mac_handle,
15034 QDF_STATUS (*callback_fn)(void *ctx, struct sir_md_evt *event),
15035 void *hdd_ctx
15036)
15037{
15038 struct mac_context *mac = MAC_CONTEXT(mac_handle);
15039 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
15040
15041 qdf_status = sme_acquire_global_lock(&mac->sme);
15042 if (QDF_IS_STATUS_SUCCESS(qdf_status)) {
15043 mac->sme.md_host_evt_cb = callback_fn;
15044 mac->sme.md_ctx = hdd_ctx;
15045 sme_release_global_lock(&mac->sme);
15046 }
15047 return qdf_status;
15048}
15049
15050/**
15051 * sme_motion_det_config - Post motion detection configuration msg to scheduler
15052 * @mac_handle: mac handle
15053 * @motion_det_config: motion detection configuration
15054 *
15055 * Return: QDF_STATUS_SUCCESS or non-zero on failure
15056 */
15057QDF_STATUS sme_motion_det_config(mac_handle_t mac_handle,
15058 struct sme_motion_det_cfg *motion_det_config)
15059{
Visweswara Tanuku025f5862019-01-08 17:35:33 +053015060 struct scheduler_msg msg;
Visweswara Tanuku633976b2019-01-07 16:13:12 +053015061 struct sme_motion_det_cfg *motion_det_cfg;
15062 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
15063 struct mac_context *mac = MAC_CONTEXT(mac_handle);
15064
15065 qdf_status = sme_acquire_global_lock(&mac->sme);
15066 if (QDF_IS_STATUS_SUCCESS(qdf_status)) {
15067 motion_det_cfg =
15068 qdf_mem_malloc(sizeof(*motion_det_cfg));
15069 if (!motion_det_cfg) {
15070 sme_release_global_lock(&mac->sme);
15071 return QDF_STATUS_E_NOMEM;
15072 }
15073
15074 *motion_det_cfg = *motion_det_config;
15075
15076 qdf_mem_set(&msg, sizeof(msg), 0);
15077 msg.type = WMA_SET_MOTION_DET_CONFIG;
15078 msg.bodyptr = motion_det_cfg;
15079
15080 qdf_status = scheduler_post_message(QDF_MODULE_ID_SME,
15081 QDF_MODULE_ID_WMA,
15082 QDF_MODULE_ID_WMA,
15083 &msg);
15084 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
15085 qdf_mem_free(motion_det_cfg);
15086 qdf_status = QDF_STATUS_E_FAILURE;
15087 }
15088 sme_release_global_lock(&mac->sme);
15089 }
15090 return qdf_status;
15091}
15092
15093/**
15094 * sme_motion_det_enable - Post motion detection start/stop msg to scheduler
15095 * @mac_handle: mac handle
15096 * @motion_det_enable: motion detection start/stop
15097 *
15098 * Return: QDF_STATUS_SUCCESS or non-zero on failure
15099 */
15100QDF_STATUS sme_motion_det_enable(mac_handle_t mac_handle,
15101 struct sme_motion_det_en *motion_det_enable)
15102{
Visweswara Tanuku025f5862019-01-08 17:35:33 +053015103 struct scheduler_msg msg;
Visweswara Tanuku633976b2019-01-07 16:13:12 +053015104 struct sme_motion_det_en *motion_det_en;
15105 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
15106 struct mac_context *mac = MAC_CONTEXT(mac_handle);
15107
15108 qdf_status = sme_acquire_global_lock(&mac->sme);
15109 if (QDF_IS_STATUS_SUCCESS(qdf_status)) {
15110 motion_det_en = qdf_mem_malloc(sizeof(*motion_det_en));
15111 if (!motion_det_en) {
15112 sme_release_global_lock(&mac->sme);
15113 return QDF_STATUS_E_NOMEM;
15114 }
15115
15116 *motion_det_en = *motion_det_enable;
15117
15118 qdf_mem_set(&msg, sizeof(msg), 0);
15119 msg.type = WMA_SET_MOTION_DET_ENABLE;
15120 msg.bodyptr = motion_det_en;
15121
15122 qdf_status = scheduler_post_message(QDF_MODULE_ID_SME,
15123 QDF_MODULE_ID_WMA,
15124 QDF_MODULE_ID_WMA,
15125 &msg);
15126 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
15127 qdf_mem_free(motion_det_en);
15128 qdf_status = QDF_STATUS_E_FAILURE;
15129 }
15130 sme_release_global_lock(&mac->sme);
15131 }
15132 return qdf_status;
15133}
15134
15135/**
15136 * sme_motion_det_base_line_config - Post md baselining cfg msg to scheduler
15137 * @mac_handle: mac handle
15138 * @motion_det_base_line_config: motion detection baselining configuration
15139 *
15140 * Return: QDF_STATUS_SUCCESS or non-zero on failure
15141 */
15142QDF_STATUS sme_motion_det_base_line_config(
15143 mac_handle_t mac_handle,
15144 struct sme_motion_det_base_line_cfg *motion_det_base_line_config)
15145{
Visweswara Tanuku025f5862019-01-08 17:35:33 +053015146 struct scheduler_msg msg;
Visweswara Tanuku633976b2019-01-07 16:13:12 +053015147 struct sme_motion_det_base_line_cfg *motion_det_base_line_cfg;
15148 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
15149 struct mac_context *mac = MAC_CONTEXT(mac_handle);
15150
15151 qdf_status = sme_acquire_global_lock(&mac->sme);
15152 if (QDF_IS_STATUS_SUCCESS(qdf_status)) {
15153 motion_det_base_line_cfg =
15154 qdf_mem_malloc(sizeof(*motion_det_base_line_cfg));
15155
15156 if (!motion_det_base_line_cfg) {
15157 sme_release_global_lock(&mac->sme);
15158 return QDF_STATUS_E_NOMEM;
15159 }
15160
15161 *motion_det_base_line_cfg = *motion_det_base_line_config;
15162
Visweswara Tanuku025f5862019-01-08 17:35:33 +053015163 qdf_mem_set(&msg, sizeof(msg), 0);
Visweswara Tanuku633976b2019-01-07 16:13:12 +053015164 msg.type = WMA_SET_MOTION_DET_BASE_LINE_CONFIG;
15165 msg.bodyptr = motion_det_base_line_cfg;
15166
15167 qdf_status = scheduler_post_message(QDF_MODULE_ID_SME,
15168 QDF_MODULE_ID_WMA,
15169 QDF_MODULE_ID_WMA,
15170 &msg);
15171 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
15172 qdf_mem_free(motion_det_base_line_cfg);
15173 qdf_status = QDF_STATUS_E_FAILURE;
15174 }
15175 sme_release_global_lock(&mac->sme);
15176 }
15177 return qdf_status;
15178}
15179
15180/**
15181 * sme_motion_det_base_line_enable - Post md baselining enable msg to scheduler
15182 * @mac_handle: mac handle
15183 * @motion_det_base_line_enable: motion detection baselining start/stop
15184 *
15185 * Return: QDF_STATUS_SUCCESS or non-zero on failure
15186 */
15187QDF_STATUS sme_motion_det_base_line_enable(
15188 mac_handle_t mac_handle,
15189 struct sme_motion_det_base_line_en *motion_det_base_line_enable)
15190{
Visweswara Tanuku025f5862019-01-08 17:35:33 +053015191 struct scheduler_msg msg;
Visweswara Tanuku633976b2019-01-07 16:13:12 +053015192 struct sme_motion_det_base_line_en *motion_det_base_line_en;
15193 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
15194 struct mac_context *mac = MAC_CONTEXT(mac_handle);
15195
15196 qdf_status = sme_acquire_global_lock(&mac->sme);
15197 if (QDF_IS_STATUS_SUCCESS(qdf_status)) {
15198 motion_det_base_line_en =
15199 qdf_mem_malloc(sizeof(*motion_det_base_line_en));
15200
15201 if (!motion_det_base_line_en) {
15202 sme_release_global_lock(&mac->sme);
15203 return QDF_STATUS_E_NOMEM;
15204 }
15205
15206 *motion_det_base_line_en = *motion_det_base_line_enable;
15207
Visweswara Tanuku025f5862019-01-08 17:35:33 +053015208 qdf_mem_set(&msg, sizeof(msg), 0);
Visweswara Tanuku633976b2019-01-07 16:13:12 +053015209 msg.type = WMA_SET_MOTION_DET_BASE_LINE_ENABLE;
15210 msg.bodyptr = motion_det_base_line_en;
15211
15212 qdf_status = scheduler_post_message(QDF_MODULE_ID_SME,
15213 QDF_MODULE_ID_WMA,
15214 QDF_MODULE_ID_WMA,
15215 &msg);
15216 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
15217 qdf_mem_free(motion_det_base_line_en);
15218 qdf_status = QDF_STATUS_E_FAILURE;
15219 }
15220 sme_release_global_lock(&mac->sme);
15221 }
15222 return qdf_status;
15223}
15224#endif /* WLAN_FEATURE_MOTION_DETECTION */
Visweswara Tanuku025f5862019-01-08 17:35:33 +053015225#ifdef FW_THERMAL_THROTTLE_SUPPORT
15226/**
15227 * sme_set_thermal_throttle_cfg() - SME API to set the thermal throttle
15228 * configuration parameters
15229 * @mac_handle: Opaque handle to the global MAC context
15230 * @enable: Enable Throttle
15231 * @dc: duty cycle in msecs
15232 * @dc_off_percent: duty cycle off percentage
15233 * @prio: Disables the transmit queues in fw that have lower priority
15234 * than value defined by prio
15235 * @target_temp: Target temperature
15236 *
15237 * Return: QDF_STATUS
15238 */
15239QDF_STATUS sme_set_thermal_throttle_cfg(mac_handle_t mac_handle, bool enable,
15240 uint32_t dc, uint32_t dc_off_percent,
15241 uint32_t prio, uint32_t target_temp)
15242{
15243 struct scheduler_msg msg;
15244 struct mac_context *mac = MAC_CONTEXT(mac_handle);
15245 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
15246 struct thermal_mitigation_params *therm_cfg_params;
15247
15248 qdf_status = sme_acquire_global_lock(&mac->sme);
15249 if (QDF_STATUS_SUCCESS == qdf_status) {
15250 therm_cfg_params = qdf_mem_malloc(sizeof(*therm_cfg_params));
15251 if (!therm_cfg_params) {
15252 sme_release_global_lock(&mac->sme);
15253 return QDF_STATUS_E_NOMEM;
15254 }
15255
15256 therm_cfg_params->enable = enable;
15257 therm_cfg_params->dc = dc;
15258 therm_cfg_params->levelconf[0].dcoffpercent = dc_off_percent;
15259 therm_cfg_params->levelconf[0].priority = prio;
15260 therm_cfg_params->levelconf[0].tmplwm = target_temp;
15261
15262 qdf_mem_set(&msg, sizeof(msg), 0);
15263 msg.type = WMA_SET_THERMAL_THROTTLE_CFG;
15264 msg.reserved = 0;
15265 msg.bodyptr = therm_cfg_params;
15266
15267 qdf_status = scheduler_post_message(QDF_MODULE_ID_SME,
15268 QDF_MODULE_ID_WMA,
15269 QDF_MODULE_ID_WMA, &msg);
15270 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
15271 qdf_mem_free(therm_cfg_params);
15272 qdf_status = QDF_STATUS_E_FAILURE;
15273 }
15274 sme_release_global_lock(&mac->sme);
15275 }
15276 return qdf_status;
15277}
15278
15279/**
15280 * sme_set_thermal_mgmt() - SME API to set the thermal management params
15281 * @mac_handle: Opaque handle to the global MAC context
15282 * @lower_thresh_deg: Lower threshold value of Temperature
15283 * @higher_thresh_deg: Higher threshold value of Temperature
15284 *
15285 * Return: QDF_STATUS
15286 */
15287QDF_STATUS sme_set_thermal_mgmt(mac_handle_t mac_handle,
15288 uint16_t lower_thresh_deg,
15289 uint16_t higher_thresh_deg)
15290{
15291 struct scheduler_msg msg;
15292 struct mac_context *mac = MAC_CONTEXT(mac_handle);
15293 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
15294 t_thermal_cmd_params *therm_mgmt_cmd;
15295
15296 qdf_status = sme_acquire_global_lock(&mac->sme);
15297 if (QDF_STATUS_SUCCESS == qdf_status) {
15298 therm_mgmt_cmd = qdf_mem_malloc(sizeof(*therm_mgmt_cmd));
15299 if (!therm_mgmt_cmd) {
15300 sme_release_global_lock(&mac->sme);
15301 return QDF_STATUS_E_NOMEM;
15302 }
15303
15304 therm_mgmt_cmd->minTemp = lower_thresh_deg;
15305 therm_mgmt_cmd->maxTemp = higher_thresh_deg;
15306 therm_mgmt_cmd->thermalEnable = 1;
15307
15308 qdf_mem_set(&msg, sizeof(msg), 0);
15309 msg.type = WMA_SET_THERMAL_MGMT;
15310 msg.reserved = 0;
15311 msg.bodyptr = therm_mgmt_cmd;
15312
15313 qdf_status = scheduler_post_message(QDF_MODULE_ID_SME,
15314 QDF_MODULE_ID_WMA,
15315 QDF_MODULE_ID_WMA, &msg);
15316 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
15317 qdf_mem_free(therm_mgmt_cmd);
15318 qdf_status = QDF_STATUS_E_FAILURE;
15319 }
15320 sme_release_global_lock(&mac->sme);
15321 }
15322 return qdf_status;
15323}
15324#endif /* FW_THERMAL_THROTTLE_SUPPORT */
Abhinav Kumar338e57d2019-02-04 17:30:10 +053015325
15326QDF_STATUS sme_update_hidden_ssid_status_cb(mac_handle_t mac_handle,
15327 hidden_ssid_cb cb)
15328{
15329 QDF_STATUS status;
15330 struct mac_context *mac = MAC_CONTEXT(mac_handle);
15331
15332 status = sme_acquire_global_lock(&mac->sme);
15333 if (QDF_IS_STATUS_SUCCESS(status)) {
15334 mac->sme.hidden_ssid_cb = cb;
15335 sme_release_global_lock(&mac->sme);
15336 }
15337
15338 return status;
15339}
Min Liu0daa0982019-02-01 17:50:44 +080015340
15341QDF_STATUS sme_update_owe_info(struct mac_context *mac,
15342 struct assoc_ind *assoc_ind)
15343{
15344 QDF_STATUS status;
15345
15346 status = sme_acquire_global_lock(&mac->sme);
15347 if (QDF_IS_STATUS_SUCCESS(status)) {
15348 status = csr_update_owe_info(mac, assoc_ind);
15349 sme_release_global_lock(&mac->sme);
15350 }
15351
15352 return status;
15353}
Arun Kumar Khandavallideda5a82019-03-11 15:32:19 +053015354
15355#ifdef WLAN_MWS_INFO_DEBUGFS
15356QDF_STATUS
15357sme_get_mws_coex_info(mac_handle_t mac_handle, uint32_t vdev_id,
15358 uint32_t cmd_id, void (*callback_fn)(void *coex_info_data,
15359 void *context,
15360 wmi_mws_coex_cmd_id
15361 cmd_id),
15362 void *context)
15363{
15364 QDF_STATUS status = QDF_STATUS_E_FAILURE;
15365 struct mac_context *mac = MAC_CONTEXT(mac_handle);
15366 struct scheduler_msg msg = {0};
15367 struct sir_get_mws_coex_info *req;
15368
15369 req = qdf_mem_malloc(sizeof(*req));
15370 if (!req) {
15371 sme_err("Failed allocate memory for MWS coex info req");
15372 return QDF_STATUS_E_NOMEM;
15373 }
15374
15375 req->vdev_id = vdev_id;
15376 req->cmd_id = cmd_id;
15377 mac->sme.mws_coex_info_state_resp_callback = callback_fn;
15378 mac->sme.mws_coex_info_ctx = context;
15379 status = sme_acquire_global_lock(&mac->sme);
15380 if (QDF_IS_STATUS_SUCCESS(status)) {
15381 msg.bodyptr = req;
15382 msg.type = WMA_GET_MWS_COEX_INFO_REQ;
15383 status = scheduler_post_message(QDF_MODULE_ID_SME,
15384 QDF_MODULE_ID_WMA,
15385 QDF_MODULE_ID_WMA,
15386 &msg);
15387 sme_release_global_lock(&mac->sme);
15388 if (!QDF_IS_STATUS_SUCCESS(status)) {
15389 sme_err("post MWS coex info req failed");
15390 status = QDF_STATUS_E_FAILURE;
15391 qdf_mem_free(req);
15392 }
15393 } else {
15394 sme_err("sme_acquire_global_lock failed");
15395 qdf_mem_free(req);
15396 }
15397
15398 return status;
15399}
15400#endif /* WLAN_MWS_INFO_DEBUGFS */